((void(*)())0)();



  • Hallo,

    habe denb folgenden Ausdruck

    ((void(*)())0)();
    

    irgendwo gesehen. Mein Compiler VS 2008 Express meckert auch nicht, aber ich verstehe ihn nicht komplett. Insbesondere die Klammern um den Stern

    Seb



  • das ganze ist ein cast von 0 nach

    void (*)()
    

    also ein zeiger auf eine funktion ohne parameter und rückgabetyp.
    die beiden klammern am ende rufen die gecastete funktion dann auf.

    ist ein aufruf der funktion an speicheraddresse 0.

    geht zu 99.999992455% schief, vllt im bios möglich



  • jup.
    ist vermutlich gedacht als aufruf des debuggers. statt zum beispiel __asm int 3;



  • ganz normale zugriffsverletzung unter msvc 2008



  • danke für eure Antwiorten.

    ich dachte das der Cast auf eine Funktion mit Rückgabe eines void-Zeigers und ohne Aufrufparameter so aussehen würde.

    ((void *())0)();
    

    Das scheint aber nicht zu funktionieren? oder das es vielleicht so aussehen würde.

    (((void *)())0)();
    

    Jetzt habe ich ja den Rückgabe Wert der Funktion (void 😉 geklammert.

    Das es nicht funktioniert ist klar. Mich interessiert auch nur die Theorie dahinter.

    Seb



  • neuling2009 schrieb:

    danke für eure Antwiorten.

    ich dachte das der Cast auf eine Funktion mit Rückgabe eines void-Zeigers und ohne Aufrufparameter so aussehen würde.

    ((void *())0)();
    

    Man kann nicht auf eine Funktion casten. Im Original wird auf einen Funktionszeiger gecastet, außerdem mit Rückgabetyp void, nicht void-Zeiger.

    Das es nicht funktioniert ist klar. Mich interessiert auch nur die Theorie dahinter.

    Schreibe das erstmal als Deklaration:

    void (*fcnptr)();
    

    Dann lass den Namen fcnptr weg, und du hast den Typ: void (*)() . Jetzt noch Klammern drum, und der Casts ist fertig.


Anmelden zum Antworten