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