Cppcheck在这样的代码中发现了一个潜在的问题:
float a, b, c;
int count = sscanf(data, "%f,%f,%f", &a, &b, &c);
Run Code Online (Sandbox Code Playgroud)
它说:"没有字段宽度限制的scanf可能会因大量数据而崩溃".怎么可能?这是某些sscanf实现中的已知错误吗?我知道数字可能会溢出(数字),但程序怎么会崩溃?这在cppcheck中是误报吗?
我发现了一个类似的问题:scanf Cppcheck警告,但答案并不完全令人满意.答案提到了类型安全,但这不应该是一个问题.
我是Cppcheck开发人员.
是的,这是一个奇怪的崩溃."巨大的数据"意味着数百万的数字.
如果你使用--verbose标志,那么cppcheck实际上会编写一个通常在linux计算机上崩溃的示例代码.
以下示例代码在我的Ubuntu 11.10计算机上崩溃并出现分段错误:
#include <stdio.h>
#define HUGE_SIZE 100000000
int main()
{
int i;
char *data = new char[HUGE_SIZE];
for (int i = 0; i < HUGE_SIZE; ++i)
data[i] = '1';
data[HUGE_SIZE-1] = 0;
sscanf(data, "%i", &i);
delete [] data;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于您的信息,当我在visual studio上尝试这个示例代码时,我不会崩溃.
我使用g ++版本4.6.1进行编译.