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ärenchar* A; A =
statto->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 nichtsizeof(char)
da ist es immer1
. - 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 (wieint
) 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, waszstring.h
enthält, aber Sie benötigen diese fürmalloc()
, und nicht casting-die Rückkehr würde wahrscheinlich warnen Sie über diese. (2) der Initialisierungs-Funktionenreturn 0
auf Fehler, aber Ihremain()
- Funktion ignoriert das und läuft unabhängig. - Ich merke, du bist auf einem 64-bit system, so, wenn Sie nicht
#include <stdlib.h>
, dannmalloc()
wird wahrscheinlich wieder eine impliziteint
, die gehen, um Ihnen Probleme, wenn Sie auf einem system mit 32-bit -int
s-und 64-bit-Zeiger. Genau die Art von Grund, warum sollten Sie nicht wirken, die Rückkehr vonmalloc()
. - 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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
So, ich denke ich habe es gefunden. Möglicherweise müssen wir diese Datei unter "Sean muss lernen grundlegende Valgrind Fähigkeiten." Hier ist, wie ich es gelöst für alle zukünftigen Beobachter.
Funktion, so muss es sein, etwas bestimmtes zu meinem setup. Der Algorithmus ist der gleiche,
so muss es sein, die Daten.
Speicher, die passiert zu sein eine doppelt verkettete Liste -- so die Botschaft.
eine subtile Art und Weise.
dass. Seltsam, es funktioniert in Valgrind. Hmm.
flags, die Sie mit Fehler wie "Invalid write of size 1" zusammen mit einer Spur des
verschiedene labels/Symbole, wo dieser sich zeigt. Suchen Sie nach möglichen Fehlern und anpassen
notwendig.
memcpy()
imhashtable_put
Funktion
hashtable.c
. Die subtile Andeutung ist, dass ich es war vorbei, das erste argumentzu memcpy Verwendung des address-of-operator
&
, die Ursache der Korruption.Die moral von der Geschichte:
spuckt viele Infos Ihre eine erhöhte Wahrscheinlichkeit für ein problem.
und können beeinflusst werden durch viele Variablen. Valgrind stellt die Dinge in der Mitte Ihrer
Programm und die-Speicher-Bibliothek, so dass es weiß, was Los ist, so denke ich, dass diese betroffenen
das Programm ist die Bedienung irgendwie.
Den commit, der hat bisher das Problem beseitigt:
http://code.seanwoods.com/reynard.fossil.cgi/ci/bd6a5a23c1?sbs=0
main()
Funktion entfernt, also das wäre ein weiterer Anhaltspunkt, dass das problem an anderer Stelle.BEARBEITEN:
Da haben wir fast keine Ahnung, was Ihre struct o aussieht und welchen Datentyp
o->data
sein sollte, können wir nur speculae, was Sie zu tun versuchen.Bitte geben Sie die
o
struct definition, so können wir Ihnen helfen.char
Zeiger, wären Sie speichern das Ergebnis in einerchar **
, nicht einchar *
sind, allerdings ohne zu sehen, ein komplettes Beispiel, es ist unmöglich zu sagen, welche Arto->data
ist, aber sein code ist wenigstens konsequent, und Ihnen nicht.o->data
gegeben werden sollten, um voll und ganz empfehlen, was er zu tun versucht. Meine Vermutung war, dass er versucht, zum speichern einer Zeichenfolge. Aber ein Blick auf seinen code wieder würde vorschlagen, er versuchte, etwas anderes zu tun... ich werde meinen Beitrag Bearbeiten.