die folgende Frage ist etwas theoretischer Natur - nichtdestotrotz interessiert sie mich sehr, zumal ich dazu auch sonst im Netz nichts finden konnte.
Ich iteriere des öfteren gerne direkt über Speicherbereiche, was so aussieht:
Code: Alles auswählen
unsigned char *bufferEnd = buffer + bufferSize;
for (unsigned char *p = buffer; p < bufferEnd; ++p)
{
foo(*p);
}
Code: Alles auswählen
unsigned char *buffer = ...;
size_t bufferSize = ...;
Soweit, so gut. Ich frage mich allerdings, ob der Vergleich im Kopf der for-Schleife aus theoretischer Sicht OK ist (aus der Praxis weiß ich natürlich, dass er funktioniert).
Konkret sehe das folgende Problem: Wenn die letzte gültige Speicherzelle des gegeben Speicherbereiches auf der höchstmöglichen durch den Pointer darstellbaren Adresse liegt (also z.B. auf 0xffffffff bei x86), dann würde bufferEnd wrappen, somit die Adresse 0 erhalten, und die Schleife gar nicht ausgeführt werden. Fatal.
Könnte dies denn passieren? Habe ich in der Praxis bisher einfach nur "Glück" gehabt, dass dieser doch recht unwahrscheinliche Fall nicht eingetreten ist? Teilt das Betriebssystem solche Adressen von vorneherein nicht aus? Oder, was mir lieber wäre: Gibt es irgendwas im C++-Standard, was solche Iterator-Schleifen legitimieren würde? Soweit ich weiß, verwenden viele STL-Implementierungen im Release-Modus für ihre Iteratoren auch Roh-Zeiger, also muss es doch offensichtlich wassserdicht sein?