Ложная тревога не завершенная строка - PullRequest
0 голосов
/ 13 июля 2010

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 ]

1 голос
/ 13 июля 2010

Какую версию продуктов Klocwork вы используете?Я просто попытался проанализировать пример кода, как указано, и ничего не сообщил.Добавление преднамеренного NPD в код привело к появлению отчета, просто чтобы доказать, что я действительно запускал инструмент; p Предложите, если вы не запускаете что-то достаточно свежее, что вы пытаетесь обновить (Insight 9.1 - последний выпущенный набор продуктов).1001 *

С уважением, технический директор Гвин Фишер и вице-президент по исследованиям и разработкам Klocwork, Inc gwyn-at-klocwork.com

0 голосов
/ 13 июля 2010
Please paste formatted code (read Readable code)

Сначала я подумал, что это запутано по своей природе.

По поводу вопроса, когда вы делаете strcpy, вам нужно проверить, достаточно ли велика строка назначения для хранения исходной строки.

Здесь DEST_LEN равен объему памяти в байтах.

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

{

strncpy (dest , source , DEST_LEN -1);

}

Спасибо за редактирование модератором.

Klockworks обнаруживает strcpy как ошибку как инструмент статического анализа. Я бы предложил вам определить пользовательские макросы для операций со строками. Это проверит объем памяти, которая будет скопирована. Для других операций вы также можете легко отредактировать этот макрос и избежать ложных тревог, как указано выше.

...