如何使用sscanf读取数据崩溃?

Jur*_*aho 11 c++ cppcheck

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警告,但答案并不完全令人满意.答案提到了类型安全,但这不应该是一个问题.

Dan*_*äki 7

我是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进行编译.