malloc() abstürzt, sagt beschädigt doppelt-verlinkten Liste

Bearbeiten Vollständige Quelle ist hier:

http://code.seanwoods.com/reynard.fossil.cgi/artifact/0cc9cbfbe021c2ba86dcb4d0cf6ada52f0a80063

Aufrufende Programm hier:

http://code.seanwoods.com/reynard.fossil.cgi/artifact/891405e62c95349aaf461dfb8ba82259f77fac9b

Habe ich eine relativ einfache Speicherzuweisung, das ausfällt. Die Anwendung ist nicht besonders kompliziert, obwohl es keine Speicher in ein paar Orte. Es ist C, nicht C++. Ich bin sicher, dies ist ein Problem die Zuteilung Speicher, nicht befreien Speicher.

Hier der code:

printf(":2 %d %d\n", initial_len, initial_len * sizeof(char));
o->data = (char*) malloc(initial_len * sizeof(char));
printf(":3 \n");

Bei der Ausführung, bekomme ich:

:1
:2 1024 1024
*** glibc detected *** ./menv: corrupted double-linked list: 0x0000000001d14400 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x76d76)[0x7f680cfc4d76]
/lib/x86_64-linux-gnu/libc.so.6(+0x771ed)[0x7f680cfc51ed]
/lib/x86_64-linux-gnu/libc.so.6(+0x794d4)[0x7f680cfc74d4]
/lib/x86_64-linux-gnu/libc.so.6(__libc_malloc+0x70)[0x7f680cfc9b90]
./menv[0x403971]
./menv[0x40391d]
./menv[0x4030ec]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xfd)[0x7f680cf6cead]
./menv[0x401369]
======= Memory map: ========
00400000-00405000 r-xp 00000000 08:03 2621441                            /home/swoods/code/reynard/modules/stdlib/menv
00605000-00606000 rw-p 00005000 08:03 2621441                            /home/swoods/code/reynard/modules/stdlib/menv
00606000-00706000 rw-p 00000000 00:00 0 
01cfd000-01d3d000 rw-p 00000000 00:00 0                                  [heap]
7f6808000000-7f6808021000 rw-p 00000000 00:00 0 
7f6808021000-7f680c000000 ---p 00000000 00:00 0 
7f680cd38000-7f680cd4d000 r-xp 00000000 08:05 10354962                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f680cd4d000-7f680cf4d000 ---p 00015000 08:05 10354962                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f680cf4d000-7f680cf4e000 rw-p 00015000 08:05 10354962                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7f680cf4e000-7f680d0ce000 r-xp 00000000 08:05 10354980                   /lib/x86_64-linux-gnu/libc-2.13.so
7f680d0ce000-7f680d2ce000 ---p 00180000 08:05 10354980                   /lib/x86_64-linux-gnu/libc-2.13.so
7f680d2ce000-7f680d2d2000 r--p 00180000 08:05 10354980                   /lib/x86_64-linux-gnu/libc-2.13.so
7f680d2d2000-7f680d2d3000 rw-p 00184000 08:05 10354980                   /lib/x86_64-linux-gnu/libc-2.13.so
7f680d2d3000-7f680d2d8000 rw-p 00000000 00:00 0 
7f680d2d8000-7f680d2da000 r-xp 00000000 08:05 10354973                   /lib/x86_64-linux-gnu/libdl-2.13.so
7f680d2da000-7f680d4da000 ---p 00002000 08:05 10354973                   /lib/x86_64-linux-gnu/libdl-2.13.so
7f680d4da000-7f680d4db000 r--p 00002000 08:05 10354973                   /lib/x86_64-linux-gnu/libdl-2.13.so
7f680d4db000-7f680d4dc000 rw-p 00003000 08:05 10354973                   /lib/x86_64-linux-gnu/libdl-2.13.so
7f680d4dc000-7f680d4fc000 r-xp 00000000 08:05 10354984                   /lib/x86_64-linux-gnu/ld-2.13.so
7f680d6df000-7f680d6e2000 rw-p 00000000 00:00 0 
7f680d6f8000-7f680d6fb000 rw-p 00000000 00:00 0 
7f680d6fb000-7f680d6fc000 r--p 0001f000 08:05 10354984                   /lib/x86_64-linux-gnu/ld-2.13.so
7f680d6fc000-7f680d6fd000 rw-p 00020000 08:05 10354984                   /lib/x86_64-linux-gnu/ld-2.13.so
7f680d6fd000-7f680d6fe000 rw-p 00000000 00:00 0 
7ffff3bd6000-7ffff3bf7000 rw-p 00000000 00:00 0                          [stack]
7ffff3bff000-7ffff3c00000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted
  • Der code wird kompiliert, ohne Frage.
  • Wenn ich es "standalone"," es stürzt ab mit dem Fehler oben. Ich sehe :2 aber ich sehe nicht,
    :3, was mir sagt, es ist ein Fehler innerhalb von malloc. (Ich hoffe, ich bin falsch.)
  • Wenn ich das gleiche binäre durch valgrind, funktioniert es wie erwartet.
  • Es nicht zu sein scheinen ein Problem mit der Deklaration der Variablen o->data, das ist ein
    char*. Wenn ich erklären char* A; A = statt o->data = es immer noch abstürzt.

Ich würde mich sehr über irgendwelche Ideen, wie Sie zu beheben/, warum dies geschieht.

Dank!

  • Ist *o Objekt zugewiesen?
  • Sie müssen eine SSCCE: sscce.org
  • Müssen, um eine vollständige, kompilierbare Beispiel wie schon andere gesagt haben, aber in der Zwischenzeit, nicht gegossen, die Rückkehr von malloc(), und verwenden Sie nicht sizeof(char) da ist es immer 1.
  • Ihr Fehler ist vermutlich verursacht durch heap-Beschädigung. Also die Fehler in Ihrem code vor dem Aufruf malloc du gepostet hast. Dies ist, warum Sie sind aufgefordert zu zeigen, mehr code.
  • Ich glaube, ich war übermäßig vorsichtig mit sizeof(). Ich weiß, Sie sind soll, dass bei der Verwendung von Typen, die anders sein könnte über Architekturen (wie int) also denke ich, war ich allzu vorsichtig. @VaughnCato Dies ist Teil eines größeren Projektes, das könnte ein bisschen schwer zu Folgen, aber ich habe links zu meiner Quell-repository in der original-post. Danke!
  • Noch nicht niet-und nagelfest Ihr problem, aber paar zufällige Beobachtungen: (1) Sie scheinen nicht zu #include <stdlib.h> ich weiß nicht, was zstring.h enthält, aber Sie benötigen diese für malloc(), und nicht casting-die Rückkehr würde wahrscheinlich warnen Sie über diese. (2) der Initialisierungs-Funktionen return 0 auf Fehler, aber Ihre main() - Funktion ignoriert das und läuft unabhängig.
  • Ich merke, du bist auf einem 64-bit system, so, wenn Sie nicht #include <stdlib.h>, dann malloc() wird wahrscheinlich wieder eine implizite int, die gehen, um Ihnen Probleme, wenn Sie auf einem system mit 32-bit - ints-und 64-bit-Zeiger. Genau die Art von Grund, warum sollten Sie nicht wirken, die Rückkehr von malloc().
  • Danke, @PaulGriffiths, für Ihre Hilfe/Beratung. <stdlib.h> ist enthalten in "zstring.h", ich nehme an aus Gründen der Klarheit und Richtigkeit, die ich explizit in die C-source-Datei.

InformationsquelleAutor Sean Woods | 2013-08-03
Schreibe einen Kommentar