Cppcheck在这样的代码中发现了一个潜在的问题:
float a, b, c;
int count = sscanf(data, "%f,%f,%f", &a, &b, &c);
它说:“没有字段宽度限制的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;
}
对于您的信息,当我在visual studio上尝试这个示例代码时,我不会崩溃。
我使用g ++版本4.6.1进行编译。
分段错误似乎是glibc中的一个错误。
我刚用类似的程序对它进行了测试,该程序在ubuntu 10.04中崩溃,
但适用于ubuntu 12.04。
正如DanielMarjamäki所说,他的程序在11.10崩溃,我相信这个错误
介于两者之间。
好的,请考虑以下代码:
int main(int argc, char *argv[]) {
const char* data = "9999999999999999999999999.9999999999999999999999//i put alot more 9's there, this just to get the point through
float a;
int count = sscanf(data, "%f", &a);
printf("%f",a);
}
这个程序的输出是“inf” - 没有崩溃。我在那里放了大量的9。所以我怀疑Cppcheck对此是完全错误的。