2010-07-13 5 views
0

Klocwork produit une alarme qui semble être fausse. Le bug qu'il mentionne décrit environ 80% du nombre total de bogues dans notre code. S'il vous plaît conseiller,Non annulé chaîne terminée fausse alarme?

est un ensemble Par la présente snip (paraphrase): -

//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

double possible [chaîne de caractères terminée Non null -. Une erreur Klocwork sans raison compréhensible] (http : //stackoverflow.com/questions/3181018/not-null-terminated-string-a-klocwork-error-with-no-understandable-reason) – kiamlaluno

Répondre

1

Quelle version des produits Klocwork utilisez-vous? J'ai juste essayé d'analyser l'échantillon de code comme prévu et n'ai rien rapporté. Ajout d'un NPD intentionnel dans le code a provoqué un rapport, juste pour prouver que j'exécutais réellement l'outil; p Suggérer si vous n'exécutez pas quelque chose de relativement récent que vous essayez de mettre à jour (Insight 9.1 est l'ensemble de produit publié le plus récent).

Cordialement, Gwyn Fisher CTO et vice-président R & D Klocwork, Inc gwyn-at-klocwork.com

+0

Salut, ma version est 9.0.0 (build 9.0.0.1.8), l'erreur apparaît dans le deuxième bloc de l'ensemble de snip, lors de l'appel de la strcpy. Il semble que le Klocwork ne sache pas que destStr était Null terminé par le précédent "if (destStr! = NULL)". C'est une paraphrase d'un cas plus complexe quand une fonction crée un char * str et le retourne pour être appelé à une autre fonction qui effectue une action similaire à strcpy. – Moshe

+0

S'il vous plaît noter que calloc résout le problème, mais je ne veux pas le surcoût supplémentaire, car le code d'origine est très souvent utilisé. – Moshe

+0

OK, suggère de mettre à jour si possible. Sans voir l'exemple concret, je ne peux rien garantir, mais ça vaut le coup! –

0
Please paste formatted code (read Readable code) 

Au début, je pensais que c'est obfuscated dans la nature. À la question, lorsque vous faites un strcpy, vous devez vérifier si la chaîne de destination est assez grande pour contenir la chaîne source.

Ici, DEST_LEN est égal à la quantité de mémoire allouée en octets.

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

{ 

strncpy (dest , source , DEST_LEN -1); 

} 

Merci pour le montage par le modérateur.

Klockworks détecte strcpy comme une erreur car c'est juste un outil d'analyse statique. Je vous suggère de définir des macros personnalisées pour les opérations liées aux chaînes. Cela vérifiera la longueur de la mémoire à copier. Pour les autres opérations, vous pouvez également éditer facilement cette macro et éviter les fausses alarmes comme ci-dessus.

+0

Salut, strncpy résout le problème. Mais, comme c'est seulement une paraphrase d'un appel à un enregistreur, je ne peux pas être sûr de la taille de la chaîne elle-même. L'enregistreur a: (* this) [nSeverity] << strMsg << ":" << destStr << LogEndl; quand destStr doit avoir une terminaison Null bien sûr, ce qui - comme dans ce cas je sais qu'il en a un - mais le Klocwork dit le contraire. – Moshe

+0

@Moshe - Veuillez noter que lorsque vous effectuez une allocation dynamique, vous connaissez à l'avance la longueur de la chaîne. Utilisez cela pour allouer de la mémoire et dans le strncpy. S'il vous plaît soyez plus élaboré dans vos commentaires. –

Questions connexes