web-dev-qa-db-fra.com

strlen renvoie une valeur incorrecte lorsqu'il est appelé dans gdb

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.

  1. Est-ce que quelqu'un d'autre rencontre ce genre d'erreur?

  2. 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)

6
alesplin

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.

5
psusi

C'est apparemment un bug connu dans eglibc. Voir http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=59474

1
jelmer