Digital > Fefes Blog 2.0 > babc3ebb
  Leserreporter: Wer schöne Verschwörungslinks für mich hat: ab an felix-bloginput (at) fefe.de!
[zurück][ältere Posting][neuere Posting]  Montag, 17 April 2006 | Blog: 1 | No: 4815     feed-image

Und was passiert zu meinem Entsetzen?

Ich habe ja schon ein paar gcc-Bugs in meinem Leben getriggert, aber das hier ist wirklich hart. Ich benutze in meiner täglichen Arbeit grundsätzlich die gcc-Version mit der höchsten Versionsnummer, damit meine selbst geschriebene Software auch damit zusammenarbeitet. Während ich an dem SMB-Code in gatling gearbeitet habe, fiel mir auf, wie häufig man in Netzwerk-Code die immer wieder gleichen Checks braucht, um zu gucken, ob ein gegebener Pointer überhaupt in dem reingekommenen Paket liegt, ob der String, der an Offset 15 beginnen soll, in dem Paket ist und 0-terminiert ist, sowas halt. Also habe ich mal ein paar Funktionen dazu zu Schreiben begonnen, und natürlich gleich mit Testsuite, die alle Fälle abdeckt. Hier ist eine dieser Funktionen:
int range_ptrinbuf(const void* buf,unsigned long len,const void* ptr) {
register const char* c=(const char*)buf;
return (c && c+len>c && (const char*)ptr-c<len);
}
und hier ist ein Test der Testsuite:
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.

[zurück] [ältere Posting][neuere Posting]
[zurück] [ältere Posting][neuere Posting]

Fefes Latest Youtube Video Links