C++ 使用sscanf读取数字怎么会崩溃?

C++ 使用sscanf读取数字怎么会崩溃?,c++,cppcheck,C++,Cppcheck,Cppcheck检测到以下代码中存在潜在问题: float a, b, c; int count = sscanf(data, "%f,%f,%f", &a, &b, &c); 它说:“没有字段宽度限制的scanf可能会因海量数据而崩溃”。这怎么可能?这是某些sscanf实现中的已知错误吗?我知道数字可能会溢出(数字),但程序怎么会崩溃呢?这是cppcheck中的假阳性吗 我发现了一个类似的问题:,但答案并不完全令人满意。答案提到类型安全,但这不应该是问题。 < P>

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

float a, b, c;
int count = sscanf(data, "%f,%f,%f", &a, &b, &c);
它说:“没有字段宽度限制的scanf可能会因海量数据而崩溃”。这怎么可能?这是某些sscanf实现中的已知错误吗?我知道数字可能会溢出(数字),但程序怎么会崩溃呢?这是cppcheck中的假阳性吗


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

< P> ok,请考虑此代码:

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在这方面是完全错误的。

我是一名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;
}
#包括
#定义巨大的\u大小100000000
int main()
{
int i;
char*data=新字符[大字符];
对于(int i=0;i<大尺寸;++i)
数据[i]=“1”;
数据[大尺寸-1]=0;
sscanf(数据、%i、&i);
删除[]数据;
返回0;
}
请注意,当我在VisualStudio上尝试此示例代码时,我没有遇到崩溃


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

分段错误似乎是glibc中的一个bug

我刚刚用一个类似的程序测试过,它在ubuntu 10.04中崩溃, 但它在ubuntu 12.04中工作

正如Daniel Marjamäki所说,他的程序在11.10中崩溃,我相信这个错误是错误的
修正了两者之间的问题。

改用sscanf\u s。与正常扫描一样,sscanf不是溢出安全的。@guitarflow:问题是我看不到它可能溢出的地方。@guitarflow或Dot
sscanf_s
不可移植,而且实际上也不安全,尽管它的名字暗示了什么,微软也声称。这也是值得注意的。仅缓冲区溢出并不是扫描中唯一的漏洞。如果允许用户输入格式字符串,则用户可以使用%x打印任意内存位置,并使用%n写入它们。正如你所看到的,这里的格式是字符串文字,所以这不是问题。你用哪种编译器检查过这个问题?只用g++编译。为什么,您在另一个编译器上得到了不同的结果?还没有,但我觉得“CppCheck完全错误”的结论在仅测试一个编译器时可能有点过早。(对不起,我现在只能用VC++2005进行测试。)你在你的编译器中试过Daniel Marjamäki发布的示例吗?问题仍然存在。为什么会崩溃?当解析数字的代码可能是这样的时候,我看不出任何原因:
对于数据中的每个数字:result*=10;结果+=数字
。那怎么会崩溃呢?为什么它不是固定的?我主要想回答“这是Cppcheck中的假阳性吗?”。这是一次奇怪的撞车,所以很容易这么想。我无法回答为什么技术上它会崩溃。多年来,这一直是一个众所周知的普遍问题。我同意你的代码不会崩溃,很明显这不是数据解析的方式。是的,我理解。至少感谢你的部分回答。我给你+1。