【问题标题】:SystemC error, using visual c++ 2008SystemC 错误,使用 Visual C++ 2008
【发布时间】:2023-03-08 10:39:02
【问题描述】:

我正在使用带有 Visual C++ 2008 的 systemC。我编写了一个简单的 hello world 程序。但是我反复收到此错误:

警告 C4996:“sprintf”:此函数或变量可能不安全。

为什么会这样?我将不胜感激。

【问题讨论】:

  • 这是一个警告,而不是错误。

标签: c++ vhdl hdl systemc secure-coding


【解决方案1】:

编译器警告不要使用sprintf(),因为它可能导致缓冲区溢出,因为它不检查缓冲区的限制。相反,请使用snprintf(),它永远不会填充超出传入限制的缓冲区。

manpage也给出了这条建议:

因为 sprintf() 和 vsprintf() 假定一个任意长的字符串,调用者必须是 注意不要溢出实际空间;这通常是无法保证的。注意 产生的字符串的长度取决于语言环境并且难以预测。利用 snprintf() 和 vsnprintf() 代替(或 asprintf(3) 和 vasprintf(3))。

【讨论】:

  • “这通常是不可能保证的”,只有当你是个白痴时。长期使用 C 语言编写代码的人都知道真正不安全的东西(如 getsscanf("%s"),您无法控制输入)与 sprintf 等您可以 i> 确保安全。其他人都应该重新使用 VB :-) 我总是用 #define 关闭这些警告,因为我知道我在做什么。
  • 我同意gets()sprintf() 在潜在漏洞方面属于不同的类别,但使用您未提及但已连接的sprintf() 存在危险有维护:修改格式字符串或传递给sprintf()的其他参数时,很容易忘记更新缓冲区大小。
【解决方案2】:

这是不安全的,因为 - From MSDN

没有办法限制写入的字符数,这意味着使用 sprintf 的代码容易受到缓冲区溢出的影响。考虑使用相关函数 _snprintf,它指定要写入缓冲区的最大字符数,或使用 _scprintf 来确定需要多大的缓冲区。另外,请确保格式不是用户定义的字符串。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-01-12
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
相关资源
最近更新 更多