Fragen? Antworten! Siehe auch: Alternativlos
Clang will now more aggressively use undefined behavior on pointer addition overflow for optimization purposes. For example, a check like ptr + unsigned_offset < ptr will now optimize to false, because ptr + unsigned_offset will cause undefined behavior if it overflows (or advances past the end of the object).
NEEEIIIIIN!!!!!Das heißt: Alter Code, der versucht, Dinge richtig zu machen, und nach Overflows guckt, aber es formaljuristisch nicht korrekt macht, kriegt jetzt Sicherheitslücken übergeholfen, die vorher nicht da waren.
Glücklicherweise sind die Standardisierungsleute bei C++ gerade dabei, der Reihe nach undefined behavior aus dem Standard zu schmeißen. C wird ein paar Jahrzehnte später nachfolgen. Bis dahin wird C leider völlig irrelevant sein.
Tja, so kann man sich auch den Fuß schießen. *slow clap*
Wenn ihr solchen Code produziert habt, und euch jetzt fragt, wie man den Check korrekt formuliert: Vorher nach uintptr_t casten. Das ist zwar formaljuristisch auch falsch, denn der Standard sagt, uintptr_t ist groß genug, um einen Pointer zu halten, aber garantiert nicht, dass es nicht größer ist, was dann den Overflow verbergen würde. Aber in der Praxis ist sizeof(uintptr_t) == sizeof(void*).
Update: Vorsicht beim Casten nach uintptr_t, denn dabei geht das implizite * sizeof(*ptr) verloren. Wenn das ein int* war, meint ptr + 3, dass drei ints dazugezählt werden, nicht drei Bytes. Wenn ich ptr vorher nach uintptr_t caste, dann muss man das * sizeof(int) von Hand machen.
Update: Fortschritt ist möglicherweise auch bei C weiter als befürchtet.