scanf Cppcheck警告

2023-11-21

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(使用前将#替换为@)

scanf Cppcheck警告 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • MVC3中设置下拉列表中的所选项目

    我必须为视图中的下拉列表设置所选项目 但它不起作用 View div class editor label Html LabelFor model gt model Gender div div class editor field Htm
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 将函数参数类型提取为参数包

    这是一个后续问题 解包 元组以调用匹配的函数指针 https stackoverflow com questions 7858817 unpacking a tuple to call a matching function pointer
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 如何在 MacOS 上的 python 构建中包含 ssl

    在 MacOS 上从源代码构建 python 时 我不小心覆盖了 MacOS 附带的 python 现在它没有 SSL 我尝试通过运行再次构建 with ssl option configure with ssl 但当我随后跑时make 它
  • 将 feDropShadow 添加到 SVG 中的垂直线使其消失

    我有以下 SVG 文档
  • 以编程方式从 Exchange Outlook 联系人获取 Internet 电子邮件地址?

    我正在尝试从连接 Exchange 的 Outlook 读出 Internet 格式的地址 我从 Outlook 联系人中读取了所有联系人 即不是从全局通讯簿 GAB 中读取的 问题是对于存储在 Exchange GAB 中的联系人中的所有
  • jQuery:如何检测给定元素内的 html 是否已更改?

    在 javascript 中 可能使用 jQuery 如何检测给定元素的 html 内容是否已更改 我希望能够做类似的事情 myDiv change function do some stuff 我基本上试图检测给定元素是否被添加到 div
  • 如何通过“下拉并释放”手势刷新 UIWebView?

    我知道这在 iPhone 版 Tweetie 或 xkcd iPhone 应用程序中是可能的 但他们使用的是表格 知道这是否可以通过简单的方式完成UIWebView还有 我知道 Javascript 建议这个问题 但是本地制作怎么样 要检索
  • 在 mysql 中过滤别名

    为什么以下查询不起作用 Mysql 抱怨 z 我不能在 WHERE 子句中使用别名吗 SELECT x y AS z t FROM t WHERE x 1 and z 2 我得到的错误是 Error Code 1054 Unknown co
  • Ruby strftime '%Z' 方法返回 '0545' 而不是 'NPT'

    将我的 MacOS 升级到最新版本后 我在使用 Time strftime 方法时遇到一些奇怪的问题 Time now in time zone Kathmandu strftime Z gt 0545 Time now in time z
  • 增加IP地址

    在该程序中我想增加IP地址 我看到这样的输出 125 23 45 67 126 23 45 67 127 23 45 67 128 23 45 67 129 23 45 67 130 23 45 67 131 23 45 67 132 23
  • 连接字符串最有效的方法?

    连接字符串最有效的方法是什么 里科 马里亚尼 NET 性能大师一篇文章关于这个主题 这并不像人们想象的那么简单 基本建议是这样的 如果你的模式看起来像 x f1 f2 f3 f4 这是一个连接 而且速度很快 StringBuilder 可能
  • 组织编程竞赛 - Howto 编译和执行

    我正在构建一个基于 Web 的界面 人们可以在其中输入简单的 C 代码来解决算法编程问题 我正在使用 Ace 编辑器 人们可以在其中输入代码 当按下运行按钮时 C 代码将被发送到服务器 进行编译并发送回输出 如何以安全的方式完成第二部分 我
  • 如何使用 Java EE 7 WebSockets 实现向客户端推送?

    我浏览了很多 Web Socket 示例 演示幻灯片 它们大多集中在相当简单的场景上 其中客户端与服务器之间的通信由客户端发起 我对另一种场景感兴趣 它似乎同样实用 纯粹的服务器推送到客户端 我想到的示例是一个更新网站上股票价值的应用程序
  • 最广泛使用的 C++ 向量/矩阵数学/线性代数库是什么,以及它们的成本和收益权衡? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 似乎许多项目慢慢地需要进行矩阵数学 并陷入首先构建一些向量类并慢慢添加功能的陷阱 直到他们发现构建了一个半途而废的自定义线性代数库 并依赖它 我想避
  • 如何制作一个简单的PHP应用程序从heroku cedar堆栈发送电子邮件?

    我有一个非常简单的 php 网站 有一个使用 php mail 函数发送电子邮件的联系表单 我怎样才能在heroku上托管这个 我应该使用哪个附加组件 如何将其设置为与 php 一起使用 这是我为解决同样的问题所做的 1 您需要使用自定义构
  • 错误:在reduce函数上传递的不可变值

    我正在尝试执行以下代码 将元组数组转换为字典 但收到一条编译错误 String String 类型的不可变值仅具有名为 updateValue 的可变成员 var array key0 value0 key1 value1 var init
  • 如何使用多个 AVVideoComposition 合成视频

    我想弄清楚如何合成多个视频 AVAssets 成单个视频 以便每个视频都有自己的视频合成 但是 我看不到实现此目标的方法 并且想知道是否有人有任何想法 考虑以下 上图说明了我正在尝试做的事情 我想从四个不同的视频中获取视频轨道 并将它们合并
  • 删除临时表(如果存在)

    Friends 我正在创建一个临时表 该脚本可能会运行多次 因此我需要检查临时表是否存在然后删除它 我已经编写了下面的代码 但运行脚本两次时出现错误 该表已经存在 数据库中已有一个名为 lu sensor name 19 的对象 看起来IF
  • Android NDK 和 Google Play 过滤

    Google Play 应用商店会自动将您的应用程序过滤到具有兼容 CPU 架构的设备 例如 如果您有一个仅为 ARMv5 编译的库 您的应用程序将仅显示在具有 ARMv5 或 ARMv7 处理器的设备上 如果我有 Java 替代方案 并且
  • Switch 语句示例 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 如果此文本框的总计为 Po
  • ReactJs:是否可以通过类名将 DOM 渲染为文档?

    我正在学习 ReactJs 并且非常喜欢它 我想问一下我们是否可以通过类名将虚拟 DOM 渲染到文档中 React render
  • scanf Cppcheck警告

    Cppcheck 显示 scanf 的以下警告 Message scanf without field width limits can crash with huge input data To fix this error messag