0

Klocwork は、誤ったアラームと思われるアラームを生成しています。それが言及しているバグは、私たちのコードの全バグの約 80% を説明しています。お知らせ下さい、

これにより、スニップセット(言い換え)があります:-

//a snip set
// no bug here //

{
  char*     destStr;
  destStr = (char*)malloc(150);
  if (destStr != NULL) {
    destStr[0]= '\0';  //__here is the difference__ 
    char * myStr = malloc(200) ; 
    if (myStr != NULL) {
      strcpy(myStr , destStr) ; 
    }
    free(myStr);
  }
  free (destStr);
  destStr = NULL; 
}

//__whereas a bug here__ !

{
  char* destStr;
  destStr = (char*) malloc(150);
  if (destStr != NULL) {
    destStr[0]= '\0'; // __here is the difference__ 
  }
  else {
    printf("hello world \n");
  }
  if (destStr != NULL) {
    char * myStr = malloc(200); 
    if (myStr != NULL) {
      strcpy(myStr , destStr);   // __NNTS (not NULL terminated string) –  Buffer overflow of 'myStr' due to non null terminated string 'destStr'.__ 
    }
    free (myStr);
  }
  free (destStr);
  destStr = NULL; 
}
//end of snip set
4

2 に答える 2

1

使用している Klocwork 製品のバージョンは? 提供されたコード サンプルを分析しようとしましたが、何も報告されませんでした。意図的な NPD をコードに追加すると、実際にツールを実行していたことを証明するためだけにレポートが作成されました ;p かなり最近のものを実行していない場合は、アップグレードを試みることをお勧めします (Insight 9.1 は最新のリリースされた製品セットです)。

よろしくお願いします。 Gwyn Fisher CTO 兼 VP R&D Klocwork, Inc gwyn-at-klocwork.com

于 2010-07-13T17:09:50.150 に答える
0
Please paste formatted code (read Readable code)

最初は、これは本質的に難読化されていると思いました。

質問に対して、 strcpy を実行するときは、宛先文字列がソース文字列を保持するのに十分な大きさであるかどうかを確認する必要があります。

ここで、DEST_LEN は、割り当てられたバイト単位のメモリ量と同じです。

if(source != NULL && dest != NULL)

{

strncpy (dest , source , DEST_LEN -1);

}

モデレーターによる編集ありがとうございます。

Klockworks は、strcpy を単なる静的解析ツールとしてエラーとして検出します。文字列関連の操作用にカスタム マクロを定義することをお勧めします。これにより、コピーされるメモリの長さがチェックされます。他の操作についても、このマクロを簡単に編集して、上記のような誤報を回避できます。

于 2010-07-13T14:06:46.200 に答える