Comment bien utiliser strcmp ou strncmp?

Comment bien utiliser strcmp ou strncmp?

by Benedek Hauer -
Number of replies: 2

Bonjour,

Je suis un peu confus en ce qui concerne strcmp et strncmp. 
Il a été expliqué de ne pas utiliser strcmp , car c'était préférable d'utiliser strncmp  (pour forcer le max de nombre de caractères lus).

Ce qui me perturbe, c'est l'utilisation de strcmp dans le cours 10, slide 8:

Je me suis demandé pourquoi ne pas utiliser strncmp(argv[0], "-P", 2), mais je me suis dit que c'était logique pour éviter d'entrer dans le "if" avec un argument comme

"-Pblabla".

Par contre, en utilisant strcmp, ne risquerait-on pas d'avoir un buffer overrun (comme on n'a pas fixé la taille à lire), et donc lire à des endroits dans lesquels on ne devrait pas?

Qu'est-ce qu'on pourrait faire dans ce cas-là? Est-ce que ce serait une solution d'utiliser strncmp(argv[0], "-P", 2) puis de tester que argv[0][2] vaut bien '\0'?

Merci d'avance!

In reply to Benedek Hauer

Re: Comment bien utiliser strcmp ou strncmp?

by Jean-Cédric Chappelier -

oui il vaut mieux utiliser strncmp pour eviter les débordements de tampon. Cela reste LA règle.
Mais (comme toute règle) on peut avoir des exceptions et c'est pour cela qu'il faut bien comprendre la raison de la règle et quand on peut, EN TOUTE SECURITE ; en particulier si on est sûr que l'on ne va pas déborder.
Ce qui est exactement le cas ici : on compare deux chaînes qui ont été allouées par « le système » et qui sont bien formées (au sens du C = se terminent, c'est sûr, par `\0`) : le argv[i] est alloué par l'environnement qui appelle le programme et le "-P" est alloué par le compilateur (revoir le slide 4 du cours semaine 6 « Pointeurs 2 ») ; aucun risque de débordement dans ce cas.
Si argv[i] est "-Pblabla" la comparaison strcmp s'arrêtera sur le '\0' du "-P" (qui est bien présent et EST DANS la zone allouée ; donc pas de débordement ici).
Est-ce assez clair ?