收到错误“没有字段宽度限制的 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 上因大量输入数据而崩溃”的主要内容,如果未能解决你的问题,请参考以下文章

我收到错误错误类型参数一元减号和预期';'在 ':' 标记之前

为啥我会收到这种错误验证错误?

SimpleSAML 配置错误,收到此错误。可能是啥问题?

为啥我会收到错误数量的参数错误?

我收到以下错误:[GraphQL 错误]:消息:任务

为啥我会收到错误错误 C2664:'reverseString'