strlen retorna valor incorreto quando chamado no gdb

6

Estou percebendo um comportamento severamente incorreto de chamadas para funções de biblioteca padrão dentro do GDB. Eu tenho o seguinte programa para ilustrar:

#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;
}

Quando executado a partir da linha de comando, este programa gera exatamente o que você espera:

string constant: 4
allocated string: 4

No entanto, no GDB, recebo a seguinte saída incorreta de chamadas para o strlen ():

(gdb) p strlen(s1)
 = -938856896
(gdb) p strlen(s2)
 = -938856896

Tenho certeza que este é um problema com o glibc fornecido com o Ubuntu (estou usando 10.10), mas isso é um problema sério para aqueles que gastam muito tempo no GDB.

  1. Alguém mais está passando por esse tipo de erro?

  2. Qual é a melhor maneira de corrigir isso? Construir glibc da fonte? (Eu já estou executando uma versão do GDB construída a partir do código-fonte)

por alesplin 18.02.2011 / 19:31

2 respostas

5

A biblioteca está funcionando bem. O programa informa o valor correto, mesmo quando executado em gdb. O bug parece estar na maneira como o gdb está avaliando a expressão e forçando o programa alvo a chamar a função. Eu estou vendo esse mesmo comportamento em 10.04 também. Estranhamente p printf ("foo \ n") imprime corretamente 4.

Parece que o gdb está confuso porque o strlen é interno. Se você fizer isso:

int (* len) (char *) = strlen;

E então, gdb print len ("foo") você obtém o resultado correto.

    
por psusi 18.02.2011 / 20:40
1

Este é um bug conhecido no eglibc aparentemente. Consulte o link

    
por jelmer 14.03.2011 / 02:53