2010-12-12 35 views
0

我需要在我的C++程序中的C函数,相克编译代码时++,我得到以下警告:克++ + strncat函数:可能导致目标缓冲区溢出

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

欢迎来到StackOverflow!请看周围的常见问题:http://stackoverflow.com/faq – 2010-12-12 15:53:32

+0

ouh,愚蠢的错误:)我误读错误消息,错误是在另一个strncat使用,我只通过缓冲区的大小作为大小参数=>固定:) – fho 2010-12-12 16:14:30

+0

你应该使用std :: string。它们更易于使用。已经构建了对连接的支持,并且它们也更安全。 – bruno 2010-12-12 16:20:15

回答

1

你的代码是安全的(我认为),但strncat()功能只可以放心使用,如果你知道的长度:

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

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

1

从所发布注释:为在另一strncat函数使用

错误的位置我只通过了缓冲液作为大小参数=的大小>固定

strlcat()呈现更简单的接口,以你正在执行的连接类型 - 旨在防止这种类型的错误(忘记考虑已存在于缓冲区中的字符串的长度)。

如果你的工具链没有它,OpenBSD的版本有一个非常自由的许可证,如果你无法将它整合到任何原因,这是一个非常简单的函数来实现你自己(只要确保测试边界条件,如果你走这条路线)。这样做一次,并且可以避免由于永远不正确使用strncat()而导致的错误。不适当使用strlcat()时可能遇到的错误类型可能不太严重(忘记检查截断通常不是缓冲区溢出的问题)。