Hier ein klein bissl was für Insider, aber gehört zu meinen All-Time Lieblings-Bugs:
Nicht unbedingt der konkrete Bug selbst, aber einfach diese Kategorie an Bugs: Ich hatte genau so einen Bugfix selbst auch schon mal machen dürfen:
http://sourceware.org/ml/glibc-cvs/2013 ... 00115.html
Fix the value of TWO
#define MONE -1.0 /* -1 */
-#define TWO -2.0 /* -2 */
+#define TWO 2.0 /* 2 */
#define TWO5 0x1.0p5 /* 2^5 */
(bei einem Diff werden die Zeilen mit '-' am Anfang durch jene mit '+' am Anfang ersetzt ... )
In meinem Fall war static const int THREE = 2; definiert .. das kommt öfter vor als man denkt, dass Leute Konstanten wie TWO, THREE, .. definieren, und dann auch noch falsch. Weiß der Geier wieso man nur auf so ne Idee kommen kann, solche Leute sollten lebenslanges Programmier-Verbot bekommen.
In der guten alten Zeit habs wenigstens noch richtige Programmiersprachen für Männer wie FORTRAN, dort konnte man (durch einen Compiler-Bug) tatsächlich '4' als '2' definieren, wenn man nicht aufpasst
subroutine munge (i)
i = 3
return
j = 7
call munge (7)
write (6, 11) j
11 format ('j = ', i6)
Beim Call wird dann i auf '7' gesetzt, und '7' bekommt 3 zugewiesen womit danach alle 7er durch 3er ersetzt werden, und das Programm gibt 'j = 3' aus..
Dass der Bug in glibc ist, ist dafür ein doppelter Insider, denn glibc-Code ist bekannt dafür, das Tor zur Hölle zu sein, und der Big Boss war bis vor kurzem Ulrich Drepper, bekannt für seine Aussagen ala "meine Unicode Definition ist korrekter als die vom unicode.org Konsortium", oder "Die glibc sourcen kompiliert nicht" "glibc soll man ja auch nicht kompilieren, sondern von der Distribution nehmen", oder "So was funktioniert aber nicht auf ARM" "ARM ist mir egal, kein Mensch verwendet ARM" ..
glibc ist *die* Basis-Bibliothek auf praktisch jedem Linux-PC, auf der *alles* aufbaut, zumindest war sie das bis vor kurzem, bis ein paar Leute beschlossen haben, sie schreiben die gesamte libc einfach neu, zum teil wegen dem furchtbaren Code, größtenteils aber einfach wegen Ulrichs Ego-Problemen (das ist eine riesen-Menge code!), und die ganze restliche Linux-Welt ist fast geschlossen drauf aufgesprungen, aus demselben Grund. Drepper ist jetzt bei Goldmann Sachs.
Dieser Bug hier geht noch mehr in die Tiefe, aber zeigt sehr schön womit man sich rumplagt wenn man an Compilern oder Kernel oder generell größeren, komplexen C/C++ Programmen arbeitet. Die Menge an Zeit die da reingeflossen sein muss um das zu finden macht das zu einem meiner Favorits:
http://lwn.net/Articles/478657/
Wenn man den btrfs Dateisystem (!) Linuxtreiber mit einer bestimmten Version von GCC für eine bestimmte 64bit Architektur übersetzt, dann optimiert der Compiler (formal legal) den Zugriff auf einen Wert in einer Datenstruktur im generierten Assembly so um, dass das danebenliegende Synchronisationsflag zurückgesetzt wird, wenn zeitgleich (!) ein anderer (!) Prozess das Flag setzt.
D.h., der Bug tritt nur auf, wenn man einen bestimmten Prozessor hat, mit einem bestimmten Compiler mit bestimmten Optimierungen übersetzt, und zufällig grad mehrere Prozesse zur gleichen Zeit lesen und schreiben, und alles was man davon beobachtet ist, dass dann irgendwo in einem Experimental-Dateisystem Daten durcheinandergewürfelt werden. Wenn man sich mit dem Debugger reinhängt und durchsteppt, lauft das ganze nicht mehr wirklich gleichzeitig ab und alles funktioniert.. Der C Code schaut absolut korrekt aus, der C Standard lässt aber offen was da passieren kann, damit kann man nicht mal wirklich gut argumentieren, wo jetzt überhaupt der Bug ist.
Ich hatte aber auch schon schon mal z.B. den Fall, dass Parameterübergabe von 64bit Werten funktioniert hat oder nicht, je nachdem ob man vorher eine gerade oder ungerade Anzahl an Variablen in seinem Programm verwendet hat (64bit Variablen zählen doppelt) .. je nachdem wie man seinen Code hinschreibt optimiert der Compiler allerdings ein paar der Variablen weg. Dadurch hat das Testprogramm zB. je nachdem ob man eine IF-Bedingung reinschreibt oder nicht den Wert 6.0 entweder als 6.00000 oder 6.00002 ausgegeben. Schuld war dass eine Compiler-Konfiguration zwar an einer Stelle richtig gesetzt war, für den Code hat er aber ne andere undokumentierte Variable verwendet, die er nicht aus der Konfiguration befüllt sondern die man zusätzlich setzen musste.. Hat mich auch ne gute Woche gekostet
Gut, so was kommt in den besten Familien vor .. Die Ariane 5 hat sich beim ersten Testflug auch selbst gesprengt, weil das Guidance System einen Overflow beim Geschwindigkeitswert hatte. Da wurde nämlich Software von der Ariane 4 wiederverwendet. Die Ariane 5 ist aber schneller.