CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C] Probleme realloc, glibc detected

mewsoul
mewsoul
Niveau 10
28 février 2013 à 21:05:16

Bonsoir,

J'ai un probleme avec un realloc, voici la l'organisation de mon code :

void func2(char *buffer) {
char tab_read[4096];
size_t size;

size = read(fd, tab_read, 4096);
buffer = realloc(buffer, size);
buffer = strncat(buffer, read, size);
[...]
}

void func1(char *buffer) {
[...]
while (1) {
[...]
func2(buffer);
[...]
}
[...]
}

int func() {
char *buffer;

buffer = malloc(sizeof(char *) * 1024);
buffer = memset(buffer, '\0', sizeof(char *) * 1024);

[...]
func1(buffer);
[...];
}

Et donc le probleme est que lorsque je souhaite reallouer, j'obtiens l'erreur suivante avec valgrind :

==19357== Invalid free() / delete / delete[] / realloc()
==19357== at 0x4A08A0E: realloc (vg_replace_malloc.c:662)
[...]
==19357== Invalid read of size 1
==19357== at 0x4A08E64: strncat (mc_replace_strmem.c:304)
[...]
==19357== Process terminating with default action of signal 11 (SIGSEGV)
==19357== Access not within mapped region at address 0x0
==19357== at 0x4A08E64: strncat (mc_replace_strmem.c:304)

Sans valgrind j'ai droit a :

    • glibc detected *** ./my_script: malloc(): memory corruption: 0x0000000001323870 ***

Savez-vous comment resoudre ce probleme ?
Je vous remercie d'avance

godrik
godrik
Niveau 30
28 février 2013 à 21:19:53

char *buffer;

buffer = malloc(sizeof(char *) * 1024);
buffer = memset(buffer, '\0', sizeof(char *) * 1024);

ca c'est bizzare. Je pense que tu veux sizeof(char).

Mais ca n'est certainemnet pas la source de l'erruer, laisse moi regarder un peu plus. Quelle est la valeure de size a ce moment ? (c'est possible que size=0 ait un comportement etrange)

mewsoul
mewsoul
Niveau 10
28 février 2013 à 21:39:01

Bah ce qu'il y a, c'est que je veux une certaine taille pour mon buffer car avant d'entrer dans la premiere fonction, je strncat quelque chose au prealable.

Concernant la valeur de size, je verifie que la valeur de retour du read soit superieure a 0 avant d'effectuer le realloc ainsi que le strncat, j'ai omis de l'indiquer.

godrik
godrik
Niveau 30
28 février 2013 à 21:54:42

Mais tu te rends compte que ce code "buffer = malloc(sizeof(char *) * 1024);" alloue de la place pour plus de 1024 caracteres?

Si le code que tu presentes n'est pas complet, il est difficile de verifier ce qu'il se passe.

mewsoul
mewsoul
Niveau 10
28 février 2013 à 22:00:50

Oui oui je le sais bien.

C'est juste cette verification concernant l'utilisation du buffer que je n'avais pas indique, sinon il n'y a que ces lignes la ou j'utilise cette variable. De plus si je n'utilise pas realloc et que je fais des read de faible taille, ca passe, mais avec des read de plus grosse taille ca va segfault.

godrik
godrik
Niveau 30
28 février 2013 à 22:55:33

sans code complet c'est difficile de tester.

Pseudo supprimé
Pseudo supprimé 01 mars 2013 à 02:58:29

buffer = strncat(buffer, read, size);

tab_read non ?

godrik
godrik
Niveau 30
01 mars 2013 à 03:28:06

good catch elite. Mais le premier probleme vient du realloc. Mais peut etre que valgrind fume et ne traite pas realloc correctement.

OP devrait fournir un code complet et minimal qui exhibe le probleme.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment