2010-12-12 41 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()時可能遇到的錯誤類型可能不太嚴重(忘記檢查截斷通常不是緩衝區溢出的問題)。