gpt4 book ai didi

c - scanf Cppcheck 警告

转载 作者:太空狗 更新时间:2023-10-29 17:11:28 26 4
gpt4 key购买 nike

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 => %3iSample 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}")。如果没有给定的长度,它就必须假设一些长度,这也可能与平台相关(使该功能更难使用)。

一般来说,认为它可能有害并且是缓冲区溢出攻击的起点。如果您想保护和优化您的程序,请先用替代方案替换它。

关于c - scanf Cppcheck 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7022468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com