Taille de lecture invalide dans strcasestr

Le code suivant:

#include  #include  int main() { char *s = strdup("keep-alive"); if(strcasestr(s, "close")) { } free(s); return 0; } 

donne l’erreur suivante dans Valgrind:

 ==13183== Invalid read of size 8 ==13183== at 0x4F53F94: __strcasestr_sse42 (emminsortingn.h:685) ==13183== by 0x4005BF: main (in /home/aaron/dev/strtest) ==13183== Address 0x51ce048 is 8 bytes inside a block of size 11 alloc'd ==13183== at 0x4C28F9F: malloc (vg_replace_malloc.c:236) ==13183== by 0x4EB1441: strdup (strdup.c:43) ==13183== by 0x4005A5: main (in /home/aaron/dev/strtest) 

Quelqu’un d’autre a-t-il vu cela? Cela se produit avec et sans optimisations, en utilisant gcc 4.6.1.

Si cela ne se produit que dans valgrind, ce n’est pas une erreur. Ce serait un comportement indéfini que votre code lise au-delà de la fin d’un object obtenu par malloc , mais strcasestr fait partie de “l’implémentation” et peut donc utiliser des connaissances spécifiques à l’implémentation: dans ce cas, le fait de sur-lire est parfaitement en sécurité tant que vous ne franchissez pas une limite de page.