收到错误“没有字段宽度限制的 scanf 可能会在某些版本的 libc 上因大量输入数据而崩溃”
Posted
技术标签:
【中文标题】收到错误“没有字段宽度限制的 scanf 可能会在某些版本的 libc 上因大量输入数据而崩溃”【英文标题】:getting an error "scanf without field width limits can crash with huge input data on some versions of libc" 【发布时间】:2016-04-13 13:33:01 【问题描述】:在进行 cppcheck 时,cppcheck 显示 'invalid scanf' 并表示:
在某些版本的 libc 上,没有字段宽度限制的 scanf 可能会因大量输入数据而崩溃。
它会给我的程序带来任何崩溃吗?如何摆脱这个问题?
int a;
char str[32];
int part[4];
// after this i am storing some string in 'str'.
a = sscanf(str, "%d%d%d%d", &part[0], &part[1], &part[2], &part[3]); // here i am getting that cppcheck portability error.
【问题讨论】:
【参考方案1】:如何解决这个问题
通过编写 C++ 而不是 C,并使用 C++ 标准库工具而不是过时且通常不安全的 C 标准库工具。
#include <iostream>
#include <sstream>
void test()
std::string str("4 5 6 7");
int part[4];
std::istringstream ss(str);
ss >> part[0]
>> part[1]
>> part[2]
>> part[3];
【讨论】:
【参考方案2】:你得到的只是一个警告:如果你给 %s 等提供了太长的字符串,一些 libc 实现可能会崩溃。CPPCheck 建议你使用其他类型安全的 c++ 方法来实现你的目标(即流和std::to_string() 转换器等)
【讨论】:
以上是关于收到错误“没有字段宽度限制的 scanf 可能会在某些版本的 libc 上因大量输入数据而崩溃”的主要内容,如果未能解决你的问题,请参考以下文章