1

我需要在我的 C++ 程序中包含一个 C 函数,当使用 g++ 编译代码时,我收到以下警告:

In function ‘char* strncat(char*, const char*, size_t)’,
    inlined from ‘int get_usage(pid_t, pstat*)’ at src/getusage.c:24:
/usr/include/bits/string3.h:154: warning: call to
char* __builtin___strncat_chk(char*, const char*, long unsigned int,
long unsigned int) might overflow destination buffer

代码:

int pidof(const char* process_name){
char cmd[50] ="pidof ";
strncat(cmd, process_name, sizeof(cmd) - strlen(cmd) -1); 
[..]

我如何摆脱这个警告?

4

2 回答 2

1

您的代码是安全的(我认为),但strncat()只有在您知道以下长度的情况下才能安全使用该函数:

  1. 缓冲区
  2. 已经在缓冲区中的材料

如果您还知道要添加的材料的长度并且比可用空间短,则可以简单地使用memmove(); 如果它更长,您是否应该报告您正在截断它?如果您不知道要添加的材料的长度,也许您应该(这样您就可以报告您正在截断某些内容),但是如果这不方便,那么您仍然可以使用memmove()并在末尾添加一个 null缓冲区以确保空终止。

于 2010-12-12T16:16:03.917 回答
1

从发表的评论中:

错误出现在另一个 strncat 使用中,我只将缓冲区的大小作为大小参数传递 => 已修复

strlcat()为您正在执行的连接类型提供了一个更直接的界面 - 旨在完全防止这种类型的错误(忘记考虑缓冲区中已经存在的字符串的长度)。

如果您的工具链没有它,OpenBSD 版本有一个非常自由的许可证,如果您由于某种原因无法合并它,那么您自己实现它是一个非常简单的功能(只要确保测试边界条件,如果您走这条路)。这样做一次,就可以避免因使用不当而导致的bug strncat()。使用不当可能遇到的错误类型可能不strlcat()那么严重(忘记检查截断通常比缓冲区溢出问题更小)。

于 2010-12-12T22:45:03.350 回答