我需要在我的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);
[..]
如何摆脱此警告?
答案 0 :(得分:1)
您的代码是安全的(我认为),但strncat()
函数只有在知道以下内容时才能安全使用:
如果您还知道要添加的材料的长度并且它比可用空间短,您只需使用memmove()
;如果它更长,你应该报告你正在截断它;如果您不知道要添加的材料的长度,也许您应该(因此您可以报告您正在截断某些内容),但如果这样做不方便,那么您仍然可以使用memmove()
并添加null在缓冲区的末尾,以确保无效终止。
答案 1 :(得分:1)
发表评论:
错误是在另一个strncat使用中,我只传递缓冲区的大小作为size参数=>固定
strlcat()
为你正在执行的连接提供了一个更简单的接口 - 旨在防止这种类型的错误(忘记考虑缓冲区中已经存在的字符串的长度)。
如果你的工具链没有它,那么OpenBSD版本有一个非常自由的许可证,如果你因为某种原因无法合并它,那么实现你自己就是一个非常简单的功能(只需确保测试边界)如果你走这条路的条件)。这样做一次,您可以避免因永久使用strncat()
而导致的错误。不正确使用strlcat()
可能会遇到的错误类型可能不那么严重(忘记检查截断通常不是缓冲区溢出问题)。