(gelöst) glibc detected invalid pointer(Architekturabhängig)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Heiko M.
Beiträge: 216
Registriert: 17.01.2005 12:31:34
Lizenz eigener Beiträge: MIT Lizenz

(gelöst) glibc detected invalid pointer(Architekturabhängig)

Beitrag von Heiko M. » 27.02.2010 15:47:06

Hallo,

hab noch nicht so viel Programmiererfahrung, konnte jedoch bisher alles mit Google & Co lösen. Nun bin ich auf ein Problem gestoßen, dessen Ursache ich einfach nicht finden kann.

Folgender Code http://debianforum.de/forum/pastebin.ph ... ew&s=34369 lässt sich unter einem 32bit sowie einem 64bit System fehlerfrei kompilieren.
Wenn ich das Programm dann aber ausführe, geht das nur auf dem 64bit System ohne Fehler. Das 32bit System beschwert sich:

Code: Alles auswählen

*** glibc detected *** ./WriteDistortion: free(): invalid pointer: 0x09f994f4 ***               
======= Backtrace: =========                                                                    
/lib/libc.so.6[0xb7552905]                                                                      
/lib/libc.so.6[0xb75541a3]                                                                      
/lib/libc.so.6(cfree+0x6d)[0xb755722d]                                                          
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb772d331]
/usr/lib/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1d)[0xb77094dd]
/usr/lib/libstdc++.so.6(_ZNSsD1Ev+0x4c)[0xb770ae8c]
./WriteDistortion[0x8048dd3]
/lib/libc.so.6(__libc_start_main+0xe5)[0xb74fdb55]
./WriteDistortion[0x8048a21]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:05 403429     /home/heiko/WriteDistortion
0804a000-0804b000 rw-p 00001000 08:05 403429     /home/heiko/WriteDistortion
09f95000-09fb8000 rw-p 00000000 00:00 0          [heap]
b7300000-b7321000 rw-p 00000000 00:00 0
b7321000-b7400000 ---p 00000000 00:00 0
b74e6000-b74e7000 rw-p 00000000 00:00 0
b74e7000-b7628000 r-xp 00000000 08:02 34224      /lib/libc-2.10.2.so
b7628000-b762a000 r--p 00141000 08:02 34224      /lib/libc-2.10.2.so
b762a000-b762b000 rw-p 00143000 08:02 34224      /lib/libc-2.10.2.so
b762b000-b762e000 rw-p 00000000 00:00 0
b762e000-b764a000 r-xp 00000000 08:02 32738      /lib/libgcc_s.so.1
b764a000-b764b000 rw-p 0001c000 08:02 32738      /lib/libgcc_s.so.1
b764b000-b764c000 rw-p 00000000 00:00 0
b764c000-b7670000 r-xp 00000000 08:02 34190      /lib/libm-2.10.2.so
b7670000-b7671000 r--p 00023000 08:02 34190      /lib/libm-2.10.2.so
b7671000-b7672000 rw-p 00024000 08:02 34190      /lib/libm-2.10.2.so
b7672000-b775b000 r-xp 00000000 08:02 68000      /usr/lib/libstdc++.so.6.0.13
b775b000-b775f000 r--p 000e8000 08:02 68000      /usr/lib/libstdc++.so.6.0.13
b775f000-b7760000 rw-p 000ec000 08:02 68000      /usr/lib/libstdc++.so.6.0.13
b7760000-b7767000 rw-p 00000000 00:00 0
b777e000-b7780000 rw-p 00000000 00:00 0
b7780000-b7781000 r-xp 00000000 00:00 0          [vdso]
b7781000-b779d000 r-xp 00000000 08:02 34196      /lib/ld-2.10.2.so
b779d000-b779e000 r--p 0001b000 08:02 34196      /lib/ld-2.10.2.so
b779e000-b779f000 rw-p 0001c000 08:02 34196      /lib/ld-2.10.2.so
bf971000-bf986000 rw-p 00000000 00:00 0          [stack]
Abgebrochen
Bin absolut ratlos.

Gruß
Heiko

EDIT: Link zum Code war falsch. Ist nun korrigiert.
Zuletzt geändert von Heiko M. am 07.03.2010 14:25:15, insgesamt 2-mal geändert.
Debian Testing (amd64) + KDE

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: glibc detected invalid pointer (Architekturabhängig)

Beitrag von gms » 27.02.2010 17:42:43

ich hoffe den richtigen Link gefunden zu haben: http://debianforum.de/forum/pastebin.ph ... ew&s=34369

Code: Alles auswählen

    std::string hdr = "SIZE";
    char buf[4];
    sprintf(buf,"%s",hdr.c_str());
hdr.c_str() liefert einen C-String also die 4 Zeichen von "SIZE" und ein abschließendes '\x0'
Daher sollte die 'buf' variable mindestens 5 Zeichen lang sein

btw:

Code: Alles auswählen

                        num = numCh*(y*resX+x);
hier gehört

Code: Alles auswählen

                        num = numCh*(y*resY+x);
Gruß
gms

Benutzeravatar
Heiko M.
Beiträge: 216
Registriert: 17.01.2005 12:31:34
Lizenz eigener Beiträge: MIT Lizenz

Re: glibc detected invalid pointer (Architekturabhängig)

Beitrag von Heiko M. » 27.02.2010 17:55:43

Danke!

Als ich gerade meinen Beitrag nochmal durchgeschaut hab, ist mir der falsche Link auch aufgefallen (letzte Ziffer ging beim kopieren verloren).
Dass ich den Fehler nicht entdeckt hab ist eigentlich echt peinlich. :oops:

Wie kommt´s, dass das auf einem 64bit System keine Fehlermeldung gibt?

Gruß
Heiko
Debian Testing (amd64) + KDE

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: glibc detected invalid pointer (Architekturabhängig)

Beitrag von GoKi » 27.02.2010 17:59:42

Ist mehr oder weniger Zufall, dass es auf 32-bit funktioniert. Da sprintf Speicher überschreibt der außerhalb von buf liegt (die Größe des Zielbuffers wird nicht überprüft, besser snprintf verwenden), kann es zu allerhand Fehlern kommen.
MfG GoKi
:wq

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: glibc detected invalid pointer (Architekturabhängig)

Beitrag von gms » 27.02.2010 18:30:28

Heiko M. hat geschrieben: Wie kommt´s, dass das auf einem 64bit System keine Fehlermeldung gibt?
wegen dem unterschiedlichen Alignment

wenn du folgende Zeilen deinem Programm hinzufügst:

Code: Alles auswählen

    printf("hdr start=%p end=%p\n",&hdr,&hdr+sizeof(std::string)-1);
    printf("buf start=%p end=%p\n",buf,buf+sizeof(buf)-1);
siehst du, daß in der 32 bit Version zwischen 'buf' und 'hdr' kein Zwischenraum ist:

Code: Alles auswählen

gms@gms1 ~/tmp $ g++ -o x x.cpp  -m32
gms@gms1 ~/tmp $ ./x
hdr start=0xffd5ee94 end=0xffd5eea0
buf start=0xffd5ee90 end=0xffd5ee93
während in der 64 bit Version einige Byte ungenützt sind:

Code: Alles auswählen

gms@gms1 ~/tmp $ g++ -o x x.cpp
gms@gms1 ~/tmp $ ./x
hdr start=0x7fffb3b819f0 end=0x7fffb3b81a28
buf start=0x7fffb3b819e0 end=0x7fffb3b819e3
Du müßtest in der 64-bit Version nur einen größeren Speicherbereich in 'buf' hineinschreiben, dann würdest du 'hdr' genauso überschreiben.

Gruß
gms

Benutzeravatar
Heiko M.
Beiträge: 216
Registriert: 17.01.2005 12:31:34
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) glibc detected invalid pointer(Architekturabhän

Beitrag von Heiko M. » 07.03.2010 14:39:40

gms hat geschrieben:
Heiko M. hat geschrieben: Wie kommt´s, dass das auf einem 64bit System keine Fehlermeldung gibt?
wegen dem unterschiedlichen Alignment
Vielen Dank, für die ausführliche Erklärung.

Beim letzten mal hab ich vergessen zu erwähnen, dass

Code: Alles auswählen

num = numCh*(y*resX+x);
schon seine Richtigkeit hat. Es werden die Daten für jede y-Zeile werden nacheinander ins Array geschrieben.
Also in der Form:
  • y0x0, y0x1, .... , y0xMax
    y1x0, y1x1, ... , y1xMax
    ... usw.
Gruß
Heiko
Debian Testing (amd64) + KDE

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) glibc detected invalid pointer(Architekturabhän

Beitrag von gms » 07.03.2010 18:12:20

Heiko M. hat geschrieben: Beim letzten mal hab ich vergessen zu erwähnen, dass

Code: Alles auswählen

num = numCh*(y*resX+x);
schon seine Richtigkeit hat.
da hast du recht.

eigentlich hätte ich diese unnötige Berechnung von 'num' als Ganzes kritisieren sollen. Stattdessen könnte man hier einfach einen Pointer hochzählen:

Code: Alles auswählen

float *arrptr = array
...
  for(int y=0; y<resY; y++)
        {
                for(int x=0; x<resX; x++)
                {
                        *arrptr++ = x*xStep;
                        *arrptr++ = y*yStep;
...
oder die Variable 'num' einfach hochzählen:

Code: Alles auswählen

  for(int y=0, num=0; y<resY; y++)
        {
                for(int x=0; x<resX; x++)
                {
                        array[num++] = x*xStep;
                        array[num++] = y*yStep;
                        array[num++] = sin(x*xStep*M_PI);
                        array[num++] = sin(y*yStep*M_PI);
                }
        }
Gruß
gms

Benutzeravatar
Heiko M.
Beiträge: 216
Registriert: 17.01.2005 12:31:34
Lizenz eigener Beiträge: MIT Lizenz

Re: (gelöst) glibc detected invalid pointer(Architekturabhän

Beitrag von Heiko M. » 12.03.2010 22:06:37

gms hat geschrieben:eigentlich hätte ich diese unnötige Berechnung von 'num' als Ganzes kritisieren sollen. Stattdessen könnte man hier einfach einen Pointer hochzählen:
Jo, da hast du völlig Recht. Für mich als Anfänger ist aber die Methode mit der Berechnung von 'num' irgendwie leichter zu lesen.

Gruß
Heiko
Debian Testing (amd64) + KDE

Antworten