9. November 2012 03:20

Fehlerhaftes Beispiel

creato schrieb am 8. November 2012 18:04

> Schily schrieb am 8. November 2012 16:53
> > denn ein Kompiler darf soetwas nicht wegoptimieren.

> Doch, darf er. Wenn der Code in etwa ist:

> void memset(char* p, int c, int v) {
>    while (c-- > 0) {
>        *p++ = v;
>    }
> }

> void doSomething() {
>   char[] v = "secret";
>   memset(v, sizeof(v), 0);
> }

> Dann kann ein Compiler das durchaus so optimieren, das der ungenutzte
> Wert erst gar nicht gesetzt wird. Wer's anders will, muss seinen
> Speicher explizit als volatile deklarieren.

Unabhängig davon, ob das wegoptimiert werden darf oder nicht: Der
Code ist fehlerhaft.
Der Speicher der Variablen v in
> char[] v = "secret";
ist ein Literal, welches üblicherweise im Code-Segment liegt, da es
während dem Compilieren bekannt ist und nicht verändert werden kann.
Wenn das memset ausgeführt wird und versucht "secret" im Code-Segment
zu überschreiben, ist mit einer Access-Violation zu rechnen da der
Speicher an dieser Stelle nicht geschrieben werden kann.

Anzeige

heise online Themen