Je remarque donc un comportement extrêmement incorrect des appels aux fonctions de bibliothèque standard dans GDB. J'ai le programme suivant à illustrer:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *s1 = "test";
char *s2 = calloc(strlen("test")+1,sizeof(char));
snprintf(s2,strlen("test")+1,"test");
printf("string constant: %lu\n", strlen(s1));
printf("allocated string: %lu\n", strlen(s2));
free(s2);
return 0;
}
Lorsqu'il est exécuté à partir de la ligne de commande, ce programme génère exactement ce que vous attendez:
string constant: 4
allocated string: 4
Cependant, dans GDB, le résultat suivant, incorrect, provient des appels à strlen ():
(gdb) p strlen(s1)
$1 = -938856896
(gdb) p strlen(s2)
$2 = -938856896
Je suis à peu près sûr que c’est un problème lié à la glibc fournie avec Ubuntu (j’utilise la version 10.10), mais c’est un problème grave pour ceux d’entre nous qui passons beaucoup de temps dans GDB.
Est-ce que quelqu'un d'autre rencontre ce genre d'erreur?
Quelle est la meilleure façon de le réparer? Construire glibc à partir de la source? (J'utilise déjà une version de GDB construite à partir des sources)
La bibliothèque fonctionne très bien. Le programme indique la valeur correcte même s’il est exécuté sous gdb. Le bogue semble être lié à la manière dont gdb évalue l'expression et oblige le programme cible à appeler la fonction. Je vois ce même comportement le 10.04 également. Étrangement, p printf ("foo\n") imprime correctement 4.
Il semble que gdb est confus parce que strlen est une commande intégrée. Si tu fais ça:
int (* len) (char *) = strlen;
Et puis, avec gdb print len ("foo"), vous obtenez le résultat correct.
C'est apparemment un bug connu dans eglibc. Voir http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=59474