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 バージョンにはかなりリベラルなライセンスがあり、何らかの理由でそれを組み込むことができない場合は、自分で実装するのは非常に簡単な関数です (境界条件をテストする場合は必ず確認してください)。このルートで行きます)。strncat()これを一度行えば、 foreverの不適切な使用によるバグを回避できます。の不適切な使用によって発生する可能性のあるバグの種類は、strlcat()それほど深刻ではない可能性があります (通常、切り捨てのチェックを忘れることは、バッファ オーバーランほど問題にはなりません)。

于 2010-12-12T22:45:03.350 に答える