g ++ + strncat:可能溢出目标缓冲区

时间:2010-12-12 15:44:55

标签: c++ c g++ warnings strcat

我需要在我的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); 
[..]

如何摆脱此警告?

2 个答案:

答案 0 :(得分:1)

您的代码是安全的(我认为),但strncat()函数只有在知道以下内容时才能安全使用:

  1. 缓冲区
  2. 缓冲区中的材料
  3. 如果您还知道要添加的材料的长度并且它比可用空间短,您只需使用memmove();如果它更长,你应该报告你正在截断它;如果您不知道要添加的材料的长度,也许您应该(因此您可以报告您正在截断某些内容),但如果这样做不方便,那么您仍然可以使用memmove()并添加null在缓冲区的末尾,以确保无效终止。

答案 1 :(得分:1)

发表评论:

  

错误是在另一个strncat使用中,我只传递缓冲区的大小作为size参数=>固定

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

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