【发布时间】:2023-03-08 10:39:02
【问题描述】:
我正在使用带有 Visual C++ 2008 的 systemC。我编写了一个简单的 hello world 程序。但是我反复收到此错误:
警告 C4996:“sprintf”:此函数或变量可能不安全。
为什么会这样?我将不胜感激。
【问题讨论】:
-
这是一个警告,而不是错误。
标签: c++ vhdl hdl systemc secure-coding
我正在使用带有 Visual C++ 2008 的 systemC。我编写了一个简单的 hello world 程序。但是我反复收到此错误:
警告 C4996:“sprintf”:此函数或变量可能不安全。
为什么会这样?我将不胜感激。
【问题讨论】:
标签: c++ vhdl hdl systemc secure-coding
编译器警告不要使用sprintf(),因为它可能导致缓冲区溢出,因为它不检查缓冲区的限制。相反,请使用snprintf(),它永远不会填充超出传入限制的缓冲区。
manpage也给出了这条建议:
因为 sprintf() 和 vsprintf() 假定一个任意长的字符串,调用者必须是 注意不要溢出实际空间;这通常是无法保证的。注意 产生的字符串的长度取决于语言环境并且难以预测。利用 snprintf() 和 vsnprintf() 代替(或 asprintf(3) 和 vasprintf(3))。
【讨论】:
gets 或 scanf("%s"),您无法控制输入)与 sprintf 等您可以 i> 确保安全。其他人都应该重新使用 VB :-) 我总是用 #define 关闭这些警告,因为我知道我在做什么。
gets() 和sprintf() 在潜在漏洞方面属于不同的类别,但使用您未提及但已连接的sprintf() 存在危险有维护:修改格式字符串或传递给sprintf()的其他参数时,很容易忘记更新缓冲区大小。
这是不安全的,因为 - From MSDN
没有办法限制写入的字符数,这意味着使用 sprintf 的代码容易受到缓冲区溢出的影响。考虑使用相关函数 _snprintf,它指定要写入缓冲区的最大字符数,或使用 _scprintf 来确定需要多大的缓冲区。另外,请确保格式不是用户定义的字符串。
【讨论】: