Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

21

29.01.2008, 12:14

ich bin augenzeuge dass das funktioniert ^^
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

22

29.01.2008, 12:19

Zitat von »"$nooc"«

ich bin augenzeuge dass das funktioniert ^^


najaaaa, wenns tatsächlich so ist wie ich denk, dann eher nicht. denn dann wird bei dir nirgendwo etwas dereferenziert...

und was genau beim dereferenzieren eines 0 pointers passiert, das bestimmt sicher noch eher das os als der compiler

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

23

29.01.2008, 13:06

kA was dafür verantwortlich ist, auf jedenfall gabs keinen fehler..

auch wenn auf keine memebervariable zugegriffen wurde bzw die funktion nicht statisch war, sollte das trotzdem nicht gehn.. das tat es aber..

hat jemand von euch das zu hause mal versucht? gings bei euch auch?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

24

29.01.2008, 13:18

Zitat von »"$nooc"«


auch wenn auf keine memebervariable zugegriffen wurde bzw die funktion nicht statisch war, sollte das trotzdem nicht gehn..


Wer sagt das? :shock:

Nehmen wir mal folgenden Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct foo
{
    int x;

    void bar()
    {
        printf( "foobar 0x%08x", this );
    }
};

int main()
{
    foo* p = 0;
    p->bar();
}


Möglicherweise gibt läuft der Code fehlerlos durch und das Programm gibt die Ausgabe "foobar 0x00000000" aus.
Wieso? Sehen wir uns mal den relevanten Assemblercode zu dem Programm an:

C-/C++-Quelltext

1
2
3
mov dword ptr [p], 0 // foo* p = 0

mov ecx, dword ptr [p] // funktionsaufruf für p

call 12345h // foo::bar() aufrufen


Der Aufruf funktioniert, da die Funktionsadresse der Methode bekannt ist. Da jedes Objekt die selbe Methode verwendet, der Aufruf also nicht von einer korrekt erzeugten Instanz abhängig ist, kann die Methode auch ohne diese aufgerufen werden.

Weiter gehts in der Methode foo::bar().

C-/C++-Quelltext

1
2
3
4
5
6
//...

mov eax, dword ptr [this] 
push eax // ellipsisparameter von  printf

push offset string "foobar 0x%08x" // strfmt parameter von printf

call dword ptr [printf] // printf aufrufen

// ...


Auch hier wird das Objekt selbst nicht benötigt. Also theoretisch auch kein Grund das Programm abzuwürgen.

Ändert man nun die Funktion foo::bar() etwas um

C-/C++-Quelltext

1
2
3
4
void bar()
{
    x = 100;
}


sähe die Sache wieder etwas anders aus:

C-/C++-Quelltext

1
2
3
4
//...

mov eax, dwprd ptr [this] 
mov dword ptr [eax], 64h // oops, dereferenzieren vom 0-Zeiger :)))

//...


Hier knallts dann weil versucht wird in einen ungültigen Speicherbreich zu schreiben.
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

25

30.01.2008, 08:54

wunderbar wenn man es so erklären kann :)


weisst du evtl. eine gute website für assembler-newbies? hab mich schonmal umgesehen, weiss nicht mehr wie die seite hies, aber da gabs nen "compiler" zum downloaden.. der hieß MASM oder so .. aber er lies sich einfach nicht installieren..

assembler würde mich interessieren.. hättest du nen guten tipp?


und bitte keinen google link posten.. ich hab da wirklich schon gesucht .. ^^
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

26

30.01.2008, 08:57

Hi!

Hier gibts ne gute Linksammlung.
@D13_Dreinig

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

27

30.01.2008, 22:53

danke :)
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Werbeanzeige