2014-11-05 1 views
7

dies der Schnipsel eines Programmcodes ist:Was bedeutet & Variable als Ausdruck in c bedeuten

char authenticated = 0; 
char guard1 = 234; 
char guard2 = 234; 
//more variables initliased... 
char buf[128]; 

&authenticated; 
&guard1; 
&guard2; 

Also, was bedeutet es, wenn die Referenz als einen einzelnen Ausdruck in dem Programmcode steht da?

bearbeiten: Mehr Kontext: Es ist mit gcc auf einem Debian-Server kompiliert und es ist ein Sicherheits Vorhaben, in dem Sie das buf Array überlaufen kann.

+2

Vielleicht verwandt mit [Warum verwenden Sie einen Funktionsparameter 'foo' auf diese Weise: * (& foo)?] (Http://StackOverflow.com/q/25530115/1708801), ich glaube nicht, dass es genug Kontext gibt . –

+7

'&' ist der Adressoperator. '& authenticated' ist die Adresse der' authenticated' Variablen im RAM. Die Anweisung '& authenticated;' (beachten Sie das ';') ist legal C, tut aber nichts. – UncleO

+3

Aus guten Gründen muss ich annehmen, dass es einen Zweck hat. – amaik

Antwort

6

Vorausgesetzt, dass dies für ein Sicherheitsprojekt ist, meine Vermutung ist, dass diese Anweisungen entworfen sind, um zu verhindern, dass der Compiler authenticated, guard1 und guard2 Variablen wegoptimiert. Wenn diese Variablen später nicht in der Funktion verwendet werden, könnte ein kompatibler C-Compiler sie optimieren und das Layout des Stapelrahmens für den Funktionsaufruf ändern.

Technisch gesehen, da diese Anweisungen keine Nebenwirkungen haben, könnte der Compiler sie im Prinzip auch optimieren. Allerdings ist der Sinn, den ich bekomme, dass der beabsichtigte Compiler dies nicht tut (nicht dass es könnte nicht es tun, nur dass es kann nicht es tun). Auf diese Weise wird das Layout des Stapelrahmens die authenticated Variable, die durch zwei char Werte abgeschirmt ist, die keine Nullabschlüsse sind, machen es möglicherweise ein bisschen schwieriger, authenticated zu überschreiben. Natürlich klingt es so, als ob Ihre Aufgabe speziell darin besteht, authenticated zu ändern, also ist es nicht narrensicher. :-)

Hoffe, das hilft!

+0

Macht Sinn. Ja, die Aufgabe besteht darin, authentifiziert zu überschreiben. Aber authentifiziert und die Wachen. (Es gibt auch zufällige Kanarienvögel, die ich der Einfachheit halber weggelassen habe), die alle später verwendet werden, um zu überprüfen, ob sich ihr Wert nicht geändert hat. – amaik

+0

In K & R C konnte die Adresse einer Variablen nicht in einem Register gespeichert werden. ISO C lockert diese Anforderung über die Als-ob-Regel auf; aber der Compiler, für den dieser Code geschrieben wurde, könnte diese Absicht respektieren. –

+2

Allerdings ist mir nicht klar, warum der Programmierer nicht 'struct {char guard1; Holzbüffel [128]; Char Guard2; } x; 'oder ähnlich –