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?