5 Stimmen

Feedback zur Analyse eines Codebeispiels (sichere Codierung)

Ich habe ein Stück Code aus einem Auftrag, bei dem ich mir unsicher bin. Ich bin zuversichtlich, dass ich die Antwort weiß, aber ich möchte mich nur noch einmal bei der Community erkundigen, falls ich etwas vergessen habe. Der Titel ist im Grunde sichere Kodierung und die Frage ist nur, um die Ergebnisse zu erklären.

int main() {
   unsigned int i = 1;
   unsigned int c = 1;
   while (i > 0) {
     i = i*2;
     c++;
   }
   printf("%d\n", c);
   return 0;
}

Meine Argumentation ist folgende:

Auf den ersten Blick könnte man meinen, der Code würde ewig laufen, da er mit einem positiven Wert initialisiert wird und immer größer wird. Das ist natürlich falsch, denn irgendwann wird der Wert so groß werden, dass er einen Integer-Überlauf verursacht. Das wiederum ist auch nicht ganz richtig, weil es die Variable 'i' dazu zwingt, vorzeichenbehaftet zu sein, indem es das letzte Bit auf 1 setzt und somit als negative Zahl angesehen wird, wodurch die Schleife beendet wird. Es wird also nicht in den nicht zugewiesenen Speicher geschrieben und damit ein Integer-Überlauf verursacht, sondern der Datentyp wird verletzt und damit die Schleife abgebrochen.

Ich bin mir ziemlich sicher, dass dies der Grund ist, aber ich möchte es nur noch einmal überprüfen. Hat jemand eine Meinung?

0voto

notk0 Punkte 11

Sie haben Recht mit dem Überlauf, aber ein vorzeichenloser int ist aus einem bestimmten Grund vorzeichenlos (es gibt kein Vorzeichenbit, daher vorzeichenlos, ein vorzeichenloser int beginnt bei 0), daher wird er zu 0 überlaufen, wenn er vorzeichenlos war, wäre er zu einer negativen Zahl übergelaufen (- 2**31 auf einer 32-Bit-Maschine zum Beispiel)

0voto

Albert Perrien Punkte 1154

Da es sich bei i um eine ganze Zahl ohne Vorzeichen (0 - 255) handelt, ist i nach 8 Iterationen aufgrund der binären Abrundung gleich 0.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X