11

Cppcheck 在如下代码中检测到潜在问题:

float a, b, c;
int count = sscanf(data, "%f,%f,%f", &a, &b, &c);

它说:“没有字段宽度限制的scanf可能会因大量数据而崩溃”。这怎么可能?这是某些 sscanf 实现中的已知错误吗?我知道数字可能会溢出(数字上),但程序怎么会崩溃?这是cppcheck中的误报吗?

我发现了一个类似的问题:scanf Cppcheck warning,但答案并不完全令人满意。答案提到了类型安全,但这不应该是一个问题。

4

3 回答 3

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;
}

为了您的信息,当我在 Visual Studio 上尝试此示例代码时,我不会崩溃。

我使用 g++ 版本 4.6.1 进行编译。

于 2012-02-15T14:49:45.950 回答
4

分段错误似乎是 glibc 中的错误。

我刚刚用一个类似的程序对此进行了测试,该程序在 ubuntu 10.04 中崩溃,但在 ubuntu 12.04 中有效。

正如 Daniel Marjamäki 所说,他的程序在 11.10 中崩溃了,我相信该错误已在两者之间修复。

于 2012-06-12T14:34:51.387 回答
1

好的,考虑以下代码:

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 对此完全错误。

于 2012-02-15T12:48:44.867 回答