Gelöst: Absturz bei strlen



  • Hallo,

    ich habe folgendes kleines Testprogramm:

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        const char  *cp = "hello";
    
        size_t t = strlen( cp );
        printf( "%d\n", (int)t );
    
        return 0;
    }
    

    Übersetzt wird es mit

    g++ gcctest.cpp
    

    Beim Aufruf von strlen erhalte ich aber einen Segmentation Fault:

    judith:/Source/GAKLIB # gdb a.out
    GNU gdb 6.8
    Copyright (C) 2008 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-suse-linux"...
    (gdb) r
    Starting program: /Source/GAKLIB/a.out 
    
    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000601040 in strlen@@GLIBC_2.2.5 ()
    (gdb) bt
    #0  0x0000000000601040 in strlen@@GLIBC_2.2.5 ()
    #1  0x0000000000400655 in main ()
    

    Was kann das sein?

    Eine kleine Änderung:

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        size_t t = strlen( "Hello" );
        printf( "%d\n", (int)t );
    
        return 0;
    }
    

    Und das Programm macht, was es soll.

    mfg Martin



  • Hm, der Codepad compiler stirbt dabei nicht: http://codepad.org/VhkQLcDm

    Nur spaßeshalber: Setzt mal ein \0 ans *cp



  • also die Nullterminierung sollte bei Stringliteralen eigentlich funktionieren...



  • Seikilos schrieb:

    Hm, der Codepad compiler stirbt dabei nicht: http://codepad.org/VhkQLcDm

    Nur spaßeshalber: Setzt mal ein \0 ans *cp

    Meinst Du so?

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        const char  *cp = "hello\0";
    
        size_t t = strlen( cp );
        printf( "%d\n", (int)t );
    
        return 0;
    }
    

    Das hat nichts gebracht 😞

    Ach ja ich vergaß: Auf meinem 32-Bit Linux funktioniert das wie es soll.

    Trotzdem Danke für Deine Mühe.

    mfg Martin



  • Hallo

    noch eine Info:

    Wenn ich das ganze mit der Option -O<irgendwas> (1-3) übersetze, funktioniert es. Nur leider hat dieser Workarround bei der Anwendung, in der der Fehler auftaucht nichts gebracht.

    mfg Martin



  • Kannst du da im Debugger reinsteppen und gucken, was er macht?



  • Seikilos schrieb:

    Kannst du da im Debugger reinsteppen und gucken, was er macht?

    gak@judith:/Source/GAKLIB> gdb a.out 
    GNU gdb 6.8
    Copyright (C) 2008 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-suse-linux"...
    (gdb) b main
    Breakpoint 1 at 0x400644: file gcctest.cpp, line 7.
    (gdb) r
    Starting program: /Source/GAKLIB/a.out 
    
    Breakpoint 1, main () at gcctest.cpp:7
    7               const char      *cp = "hello\0";
    (gdb) display/i $pc
    1: x/i $pc
    0x400644 <main+8>:      movq   $0x400774,-0x10(%rbp)
    (gdb) si
    9               size_t t = strlen( cp );
    1: x/i $pc
    0x40064c <main+16>:     mov    -0x10(%rbp),%rdi
    (gdb) 
    0x0000000000400650      9               size_t t = strlen( cp );
    1: x/i $pc
    0x400650 <main+20>:     callq  0x601040 <strlen@@GLIBC_2.2.5>
    (gdb) 
    0x0000000000601040 in strlen@@GLIBC_2.2.5 ()
    1: x/i $pc
    0x601040 <strlen@@GLIBC_2.2.5>: pxor   %xmm2,%xmm2
    (gdb) 
    
    Program received signal SIGSEGV, Segmentation fault.
    0x0000000000601040 in strlen@@GLIBC_2.2.5 ()
    1: x/i $pc
    0x601040 <strlen@@GLIBC_2.2.5>: pxor   %xmm2,%xmm2
    

    Ich kann leider nicht wirklich mit Intelassembler was anfangen. Und was xmm2 bedeuted, hab ich keine Ahnung. 😞

    mfg Martin



  • Hallo,

    bevor jetzt alle schimpfen, ich weiß: ich bin ein Depp.

    Was war passiert? Ich wollte einen neuen Notebook mit Windoof 7 in mein Netz integrieren und habe deshalb das openSUSE Repository von 11.4 in meine 11.0 Installation mit eingehängt und SAMBA aktualisiert. Das hat zwar leider nicht funktioniert, nachdem ich aber zur alten Version von Samba zurückgekehrt bin, hat mir der Installer die Shared Library von openSUSE 11.4 stehen lassen. Die habe ich jetzt selber downgegraded und jetzt funktioniert es wieder.

    Nochmal ein Dank an alle, die sich Gedanken gemacht haben.

    mfg Martin


Log in to reply