Fragen? Antworten! Siehe auch: Alternativlos
int range_ptrinbuf(const void* buf,unsigned long len,const void* ptr) {und hier ist ein Test der Testsuite:
register const char* c=(const char*)buf;
return (c && c+len>c && (const char*)ptr-c<len);
}
assert(range_ptrinbuf(buf,(unsigned long)-1,buf+1)==0);Dieser Test übergibt einen Buffer, bei dem die Länge einen Integer-Overflow produziert. Genau für diesen Fall ist der c+len>c Teil in der Funktion da. Und was passiert zu meinem Entsetzen? Mit gcc 4.1 kompiliert akzeptiert meine Funktion diesen Buffer, und zwar mit oder ohne Optimizer. Mit dem alten gcc 3.4.5 geht es.
Wieso blogge ich das? Weil das genau der Code ist, mit dem man diese Art von Problem erkennt. Und es gibt viele Stellen, wo man diese Art von Problem erkennen will — im Linux-Kernel, in Samba, … Wenn ihr also euren Linux-Kernel mit gcc 4.1 kompiliert hat, oder Samba, dann wäre jetzt eine gute Gelegenheit, das noch mal mit gcc 3 zu kompilieren. An der Stelle vielleicht auch erwähnenswert: gut, daß ich gleich eine Testsuite gemacht habe für meine Funktionen! Testsuiten finden nicht nur Bugs in der eigentlichen Software, sondern auch in der Infrastruktur drum herum. Daher immer schön Testsuiten bauen! Ach ja, nur um das mal erwähnt zu haben: auch gcc hat eine Testsuite, und zwar nicht zu knapp. Ich bin ehrlich gesagt erschüttert, daß diese Art von Bug nicht von deren Testsuite gefunden wurde. Bug 27180.