代码之家  ›  专栏  ›  技术社区  ›  Federico

应特别注意确保安全使用堆栈上分配的字符数组

  •  2
  • Federico  · 技术社区  · 7 年前

    我用SonarQube和 RATS

    在Ubuntu Shell下,我执行

    老鼠——安静——xml-w 1>/rats_报告。xml

    获取将导入SonarQube的报告。

    我遇到了如下错误:

    应特别注意确保安全使用堆栈上分配的字符数组。它们是缓冲区溢出攻击的主要目标。

    static char* GetQueryStringForValue( const char* valueLabel )
    {
      static char queryString[QUERY_LEN + 1];
    
      memcpy( queryString, '\0', sizeof(queryString) );
      snprintf( queryString, sizeof(queryString), "{'%s'", valueLabel );
    
      return queryString;
    }
    

    我知道问题与分配到堆栈中的缓冲区有关。

    我的问题是:防止缓冲区溢出攻击的最佳做法是什么?

    谢谢你的帮助!

    费德里科

    1 回复  |  直到 7 年前
        1
  •  4
  •   user2371524 user2371524    7 年前

    这是误报,这里“在堆栈上”没有分配任何内容。和 static 存储类说明符, queryString 静态存储持续时间 这意味着它存在于程序的整个执行期间。C的任何实现都不会放置这样的对象 在堆栈上 .

    memcpy( queryString, '\0', sizeof(queryString) );
    

    这是试图取消引用 NULL 指针(指针 NUL 字符常量隐式转换为 无效的

    memset(queryString, 0, sizeof queryString);
    

    这就是说,如果你仍然收到这个警告,就把它当成是什么:一个警告。它警告你要格外小心。固定使用代码 memset() 查询字符串 在这里


    线程安全 静止的 变量最好让调用者为 .