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 首席技术官兼研发副总裁 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 回答