不为null终止字符串虚警?

时间:2010-07-13 13:56:46

标签: c klocwork

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

2 个答案:

答案 0 :(得分:1)

您使用的是什么版本的Klocwork产品?我只是尝试分析所提供的代码示例并且没有报告任何内容。在代码中添加有意的NPD确实会导致报告,只是为了证明我实际上正在运行该工具; p如果你没有运行合适的最近尝试升级(Insight 9.1是最新发布的产品集),请建议。 / p>

此致 Gwyn Fisher CTO和副总裁R& D Klocwork,Inc gwyn-at-klocwork.com

答案 1 :(得分:0)

Please paste formatted code (read Readable code)

起初我认为这本质上是obfuscated

回答这个问题,当你执行strcpy时,你需要检查目标字符串是否足以容纳源字符串。

这里DEST_LEN等于分配的字节数。

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

{

strncpy (dest , source , DEST_LEN -1);

}

感谢主持人的编辑。

Klockworks将strcpy检测为错误,因为它只是一个静态分析工具。我建议你为字符串相关的操作定义自定义宏。这将检查要复制的内存长度。对于其他操作,您也可以轻松编辑此宏并避免上述虚假警报。