Avec la même commande dans le PC de mon collègue, mon programme fonctionne sans problème. Mais dans mon PC, le programme plante avec segfault;

La trace arrière GDB au cœur se lit comme suit:

#0 strrchr () at ../sysdeps/x86_64/strrchr.S:32
32     ../sysdeps/x86_64/strrchr.S: no such file or directory
(gdb) bt
#0 strrchr () at ../sysdeps/x86_64/strrchr.S:32
#1 0x00007f10961236d7 in dirname (path=0x324a47a0 <error: Cannot access memory at address 0x324a47a0>) at dirname.c:31

Je compile déjà l'exécutable avec les options -g -ggdb.

La chose étrange est que .. avec valgrind, le programme fonctionne également sans erreur sur mon PC.

Comment puis-je résoudre le problème? J'ai observé que les erreurs se produisent uniquement avec les fonctions strrchr, strcmp, strlen, ... string.h.

+ Edit: le backtrace gdb indique que le programme plante ici:

char* base_dir = dirname(get_abs_name(test_dir));

Où get_abs_name est défini comme

char* get_abs_name(char* dir) {
    char abs_path[PATH_MAX];
    char* c = malloc(PATH_MAX*sizeof(char));
    realpath(dir, abs_path);
    strcpy(c, abs_path);
    return c;
}

+ Edit2: 'dir' est le chemin de certains fichiers, comme '../program/blabla.jpg'.

En utilisant valgrind,

printf("%s\n", dir)

Imprime normalement '/ home / frozenca / path_to_program'. Je ne peux pas deviner pourquoi le programme plante sans valgrind.

c
1
frozenca 1 sept. 2017 à 09:41

2 réponses

Convertir le type

char* c = malloc(PATH_MAX*sizeof(char));

Merci!

-3
Sunil Garg 1 sept. 2017 à 08:53

Supprimez entièrement votre fonction et utilisez la valeur de retour de realpath(dir, NULL) à la place.

0
Mathieu Borderé 1 sept. 2017 à 07:22