Cppcheck 显示 scanf 的以下警告:
Message: scanf without field width limits can crash with huge input data. To fix this error message add a field width specifier:
%s => %20s
%i => %3i
Sample program that can crash:
#include
int main()
{
int a;
scanf("%i", &a;);
return 0;
}
To make it crash:
perl -e 'print "5"x2100000' | ./a.out
我无法输入“大量输入数据”使该程序崩溃。我究竟应该输入什么内容才能发生此崩溃?我也不明白这个警告中最后一行的含义:
perl -e ...
最后一行是一个示例命令,用于演示示例程序的崩溃情况。它本质上使 perl 打印 2.100.000 次“5”,然后将其传递给程序“a.out”的标准输入(这意味着是编译后的示例程序)。
首先,scanf()
应该仅用于测试,而不是在现实世界的程序中,因为它无法正常处理几个问题(例如,要求“%i”但用户输入“12345abc”(“abc”将保留在标准输入中,并可能导致以下输入被填充而用户没有机会更改它们)。
关于这个问题:scanf()
会知道它应该读取一个整数值,但它不知道它可以有多长。该指针可以指向 16 位整数、32 位整数、64 位整数或更大的整数(它不知道这一点)。具有可变数量参数的函数(定义为...
)不知道传递的元素的确切数据类型,因此它必须依赖于格式字符串(格式标签的原因不是像在 C# 中那样可选,您只需对它们进行编号,例如"{0} {1} {2}"
)。如果没有给定的长度,它必须假设一定的长度,这也可能取决于平台(使得该函数更难以使用)。
一般来说,考虑它可能有害并且是缓冲区溢出攻击的起点。如果您想保护和优化您的程序,请首先用替代方案替换它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)