Die größten Dummheiten die ihr gemacht habt

i_hasser

Grand Admiral Special
Mitglied seit
06.06.2002
Beiträge
18.964
Renomée
85
Standort
IO 0x60
Hab gedacht den Thread gibts schon, ging aber nur um schlimme Hacks.

Im gegensatz zu dem hier sind Hacks wenigstens irgendwie noch produktiv.




Also ich mach mal den Anfang: Hab mich gerade eine halbe Stunde nach einem Bug totgesucht.

fstream->read() hat mir auf Teufel komm raus keine Daten ausgelesen. Egal wohin ich das gelesen hab, immer stand 0 da. Die Länge des zu lesenden Abschnittes hab ich auch testweise manuell vorgegeben, ich hab sogar einen NULL Pointer als Ziel angegeben (sprich sowie da auch nur ein Byte hingelesen wird macht das Prog einen abflug).

Nix. Lief immer scheinheilig durch, gelesen wurde garnix. Geöffnet hatte ich die Datei mit "ios::out | ios::in | ios::binary".


Irgendwann hab ich dann festgestellt, dass die Datei inzwischen leer war :-X. Keine Ahnung wieso, aber irgendwie muss ich das zum Testen mal ohne ios::binary geöffnet haben, und schwupps war sie leer.

Das hätte ich ja auch noch halbwegs früh gemerkt, wenn ich nicht vorher vergessen hätte den Puffer auf 0 zu initialisieren, und so war der Puffer immer voll mit Müll (als ich den Fehler gemerkt hab, hab ich den Puffer auf 0 initialisiert und von da an stand nur noch 0 im Puffer).


Eine halbe Stunde ist eigentlich untertrieben, das dürfte inzwischen eine Stunde sein...



*chatt*
 
Ich hatte mal einen ganzen Tag lang nach dem Grund für einen Ausnahmefehler gesucht - damals noch ohne Debugger. *chatt*
Nachdem ich fast den gesamten Sourcecode (ca. 2.500 Zeilen) mittels printf()'s gecheckt hatte, stieß ich endlich auf den Fehler: eine nicht initialisierte Variable, die als Zähler/Index in einer for-Schleife verwendet wurde.
Das gute daran war, daß ich mir nach dieser Mammutaktion sicher sein konnte, daß das gesamte Programm nun fehlerfrei war ... :] ... aber zu welchem Preis? :-X
 
hab ich zwar nicht selber gemacht, aber trotzdem sehr lustig.
Bei einem Betriebssysteme-Praktikum hat eine andere Gruppe diesen lustigen Code fabriziert

while(1)
{
fork()
...
}

Naja, kurze Zeit später stand der Rechner... ;D
 
habe ich hier nicht letztens gelesen..

for (i = 0; i == 10; i++)

??? 8)
 
hmmm mal überlegen... es mangelt bei mir ja nicht an solchen Dummheiten, nur kann ich mich nicht mehr daran erinnern ;).


Hab mal was schönes gelesen. War Assembler... da hatte jemand beim Wechseln in den PM nicht alle Segmentregister initialisiert. Ansich ist das kein Problem. Dumm nur, dass er dann irgend eine Funktion aufgerufen hat. Da werden die Register alle gesichert (auch kein Problem) und dann wieder hergestellt (schon ein Problem) - bei jedem Schreibzugriff in ein Segmentregister wird geprüft, ob der Wert auch gültig ist, war er natürlich nicht. Ergo gabs eine Exception - ohne Exception Handler ist eine Exception aber auch nicht das wahre, weil die Kiste dann einfach neustartet.

Sprich man hat vielleicht in Zeile 100 in den PM gewechselt, dann 5000 Codezeilen geschrieben (in Assembler geht das ganz fix) und auf einmal schmiert die Kiste da ab, weil in Zeile 100 das Segmentregister nicht initialisiert wurde.



Tja, ab und zu hab ich die Eigenschaft bei for-Schleifen das '==' mit einem '=' zu vertauschen. Das kommt aber nur daher weil ich vor einer Weile gezwungen war ein Delphi Prog zu schreiben. Glücklicherweise meckert da auch der gcc rum.


Aber allgemein macht es Spaß fehler in Assembler zu suchen. Hab ich auch schon hinter mir - allerdings war das ein Bootstrap, also nix mit debuggen. Nichtmal Zahlen konnte ich ausgeben.

Hab dann praktsich sowas wie Haltepunkte genommen - einfach an bestimmten Stellen ein paar Sonderzeichen auf den Moni *chatt*.
 
if(strcpy(text1, text1) == 0)
.....


hat gut eine Stunde gedauert bis mein Kollege die richtige Funktion strcmp() benutzt hatte ;D War das ein Spass danach :]

oder sehr nervig gewesen:

char * text = "das ist ein Test";
char * text_hilf;

text_hilf = text;


und dann irgendwo im Programm wo man nicht mehr drüber nachgedacht hat...
strupr(text_hilf);

ich dachte schon der debugger sei am spinnen gewesen...
 
Ich nehm eigentlich auch ganz gerne die while(1) {..} Schleifen. Glaub das war der Sortieralgorithmus - der hat in der Schleife eben eine verkettete Liste immer weiter verlängert (-> sprich da war auch ein malloc dabei) und sollte aufhören, wenn er fertig sortiert hat (per break;).

Irgendwie hat letzteres nicht ganz geklappt, und das kleine Gigabyte Ram war innerhalb von einer Sekunde voll. Dann hat die Platte rumgerödelt - natürlich konnte ich die Sache so schnell nicht mehr abbrechen. Das laden vom KDE Sys Guard hat schätzungsweise 10 Sekunden gedauert (in der Zeit hat das Prog natürlich fröhlich weiter Speicher reserviert). 3 Sekunden später hab ich das Ding dann gekillt.

Die nächste Zeit hat die HDD bei jedem noch so kleinen Klick Arbeit bekommen. Der RAM war direkt nachdem ich das Prog gekickt hatte nur mit 100mb oder so belegt - bei laufendem KDE, Mozilla, Konquerer, KDevelop und haufenweise Terminals.

Momentan ist ähnlich viel offen, da braucht er 250MB Ram :].
 
Das dümmste, was ich je gemacht habe, war es eine Komponente in Delphi von einem Panel zu vererben. Diese neue Komponente dürfte grob 100-400 mal dynamisch auf meinem Fenster verteilt werden. Das hat auch alles schön funktioniert, zumindest unter Win XP. Jedoch nicht unter Win 9x, IMO zu viele Handles, was das Ding nicht mehr verwalten konnte. Die Folge war eine Auslastung der Resourcen.

Ende der Geschichte war die, dass ich das Problem weitgehend anders lösen musste. Und ich hatte mich so gefreut, meine erste passende Anwendung für richtige Vererbung zu haben :(
Dumm also deshalb, weil es mich sehr viel Zeit gekostet hat, zum einen den "Fehler" zu finden und dann das Problem auf eine deutlich andere Art und Weise zu lösen.
 
Original geschrieben von Devastators
habe ich hier nicht letztens gelesen..

for (i = 0; i == 10; i++)

??? 8)


Hey, da hatt ich ne totale Blockade... :( ;D
 
die größte dummheit?

das ich jemals in Qbasic programmiert habe,
das ich danach in pascal programmiert habe,
und danach in Delphi ohne Objektorientierung *lol*

Abgesehen davon: Spaghetticode und zuwenig kommentieren.

Danach sind mir bis jetzt aber keine gravierenden Fehler mehr passiert die nicht innerhalb von Minuten debuggt waren.
 
Mir ist nochwas eingefallen. Vor langer Zeit hab ich bei einem Projekt (Real Mode) aus versehen ins E und F Segment geschrieben (da sitzt normalerweise das BIOS).

Schwupps und weg war er *chatt*
 
So, aus aktuellem Anlass hab ich wieder 2 Sachen beizusteuern.

An der ersten Sache hab ich sicher eine Stunde debuggt, ohne auch nur einen Schritt weiterzukommen. Dabei geht es um eine der Implementierungen aus dem Primzahl-Thread, meine frisch geschriebene hat da komischerweise immer falsche Ergebnisse geliefert. Nicht um Größenordnungen, aber es waren immer etwas weniger Primzahlen als es hätten sein sollen.
In kurzform hole ich mal aus wie so ein Sieb funktioniert: Man markiert einen gewissen Anteil von Zahlen, der auch alle Primzahlen enthält als prim und schließt dann nach und nach alle nicht-Primzahlen wieder aus. Das lässt sich recht einfach in einem Bit-Feld erledigen, wo zB. 1 für prim, und 0 für nicht prim steht.
Durch diverse Optimierungen kann man das soweit ausbauen, dass man nur noch einen kleineren Teilbereich aller Zahlen betrachtet, die man auch zu Anfangs alle als prim vermutet und so als prim (entspr. Bit=1) markiert.

Ich hab dafür normale 32bit Integer genommen, und zur Initialisierung in einem Array von Integern muss jedes Bit jeden Integers auf 1 gesetzt werden.

Also hab ich alle Integer auf 0xFFFFFF gesetzt. Nach dieser besagten Stunde sinnlosen Debuggens (das Prog selbst hat einwandfrei funktioniert) bin ich doch mal darüber gestollpert, dass 0xFFFFFF die oberen 8 Bits auf 0 setzt... die richtige Maske wäre 0xFFFFFFFF *chatt*.


2. Problem ist eben gerade aufgetaucht. Das hab ich aber schnell gefunden, denn laut Murphy muss sowas einfach mal passieren (geht garnet anders). Da ich gerade vor meinem NB sitze (A64, AMD64 Gentoo) hab ich bevor ich meinen Desktop verlassen hab meinen ganzen Development-Ordner (Progs der letzten 2 Jahre, immerhin 250MB groß) auf mein NB kopiert. Da mein Desktop ein normaler K7 2.2GHz ist, bringt das immer so ein paar Probleme mit sich (IA32 vs. AMD64), man muss in den Ordnern von KDevelop (damit progge ich hauptsächlich) noch ein libtoolize --copy --force ausführen. Da ich das weis, hab ich das natürlich auch gemacht, danach per Automake usw. das Configure Skript erzeugt, das hat mir die Makefile gemacht und das Programm (an dem ich gerade rumgeändert hatte) wurde problemlos übersetzt.
Allerdings gab es an einer recht unerklärlichen Stelle ein Segfault, und der Debugger hat das auf eine Zeile zurückgeführt die zwar mit Speicher hantiert, die aber noch nie Probleme gemacht hat (und diese Funktion die das betrifft hab ich schon seit einer ganzen Weile völlig ohne Probleme im Einsatz).
Es kam wie es kommen musste - die Flags standen, da das Programm nicht großartig schnell laufen muss, einfach auf -O0 -g3 für den Debug-Mode... ohne march Angabe.
Ich hatte natürlich nicht alle Sources verändert, und so kam beim Vergleich von Source und .o heraus, dass er nicht alles neucompiliern muss. Und so hat er (gcc) fröhlich eine IA32 ELF (.o), die noch von meinem K7 compiliert wurde, mit den neuen AMD64 ELFs aus den veränderten Sources zusammengelinkt - ohne sich auch nur 1mal zu beschweren.
Dass das in die Hose gehen muss, war natürlich irgendwie klar.
 
Ein echter Klassiker, den ich mir unter PHP geleistet habe (unter Java hätte der Compiler gemeckert).

PHP:
$lalala = $_GET['lalala'];

//......

if ($lalala = 'hallo')
    macheirgendwas();

Und ich hab mich gefragt, warum die ganze Zeit macheirgendwas() aufgerufen wurde, obwohl $lalala nicht 'hallo' war. Hat auch verdammt lang gedauert, bis ich den Fehler gefunden habe.

Naja, ein = sieht ja auch fast wie ein == aus *g*
 
habe vor jahren mit turbo pascal mal nen iq-test programmiert und meinem namen "i" gegeben ... wo "i" noch 0 war und sofort nach eingabe dieses strings i:i lief ... und ich depp habe (weils schnell gehen musste) das nimmer überprüft ... sollte ja net bei meinem namen so sein, sondern der des kumpels ...
 
@Beffo

Das hab ich mit C/++ aber auch schon ein paarmal gehabt... wozu ein -Wall setzen, wenn es auch ohne geht? *oink*
 
Habe mal an einem Online-Shop gebastelt, Änderungen im PHP Code vorgenommen, brav hochgeladen und mich gewundert warum es nicht anders angezeigt wurde... fast verzweifelt, am nächsten Morgen ging es dann... bis ich feststellt das ich den Cache aktiviert hatte... :o :] dafür habe ich mir die halbe nacht um die Ohren geschlagen... seitdem arbeite ich dort ohne Cache ;).

Greetz BB
 
Wie das schreibt ist dir doch absolut selbst überlassen, ich setze die Einrückungen und Zeilenumbrüche genauso. Davon warnt der Compiler aber auch nicht davor, wenn man ihn nicht dazu auffordert vor sowas zu warnen.
 
Achja ich hab auch noch was, quasi aus meinem ersten C/C++ Projekt:
Aufgabe: Gib dem Programm nen Ordner, es soll daraus ne Playlist erstellen. Benutze dafür ne Lib, die schon existiert.

Problem 1: Programm schreibt Müll in die Datei. Warum? Nach vielen cout's der aktuellen Elemente (natürlich muss man auch noch so abfangen, dass er das aktuelle Element vor dem "absturz ausgibt, weil die Daten in der Reihenfolge gelesen werden, in der sie auf der Platte sind). Irgendwann bin ich aber darauf gekommen, dass ich nicht bedacht habe, dass die Lib von nem Bild/txt/sonstwas komische Werte gibt. Also Stunden und viele Fragen gebraucht, bis ich dazu ne halbwegs vernünftige if habe. Dabei noch Stunden gebraucht um die Dateiendungen alle klein zu schreiben, weil mein Programm natürlich case-sensitive ist.

Problem 2: Immernoch Müll in der Datei.
Nach einigen suchen finde ich heraus, dass es an der Lib liegt. Die hat nämlich ne eigene Stringklasse, die man auch noch umwandeln muss.

Und da fällt mir gerade noch was von Delphi ein:
Ich weiß nicht mehr was für nen Programm das war, auf jedenfall habe ich Jahrzehnte gebraucht um den "Fehler" zu finden. Herausgestellt hat sich folgendes:
Wird ein bestimmtes Objekt zur kontrolle ausgegeben, dann kommt Müll raus.
Wird diese Ausgabe nicht gemacht, funktioniert das Programm wie erwartet.
Kann mir jemand das erklären? Das Objekt wird natürlich nicht irgendwie zerstört beim ausgeben.
 
Wie das schreibt ist dir doch absolut selbst überlassen, ich setze die Einrückungen und Zeilenumbrüche genauso.

Darum ging es mir nicht, intel_hasser ;-) sondern darum anstatt
Code:
if(i==0)

Code:
if (0==i)

zu schreiben ;-) Wenn du bei der ersten Variante ein "=" vergisst, hast du eine Zuweisung und suchst lange rum. Beim 2. Code bekommst du eine Fehlermeldung vom Compiler ;-)

greetz
André
 
Achso, stimmt natürlich. Lässt sich zwar nicht bei sowas wie variable1==variable2 anwenden, aber in den restlichen Fällen bringts natürlich was.
 
"called object is not a function" und gewundert, dass eine per Header eingebundene Funktion in der Funktion darunter problemlos funktioniert hat.

Nach einer Weile ist mir durch Zufall aufgefallen, dass ich einen gleichnamigen Parameter an die Funktion übergeben hab :].
 
Wird ein bestimmtes Objekt zur kontrolle ausgegeben, dann kommt Müll raus.
Wird diese Ausgabe nicht gemacht, funktioniert das Programm wie erwartet.
Kann mir jemand das erklären?
Vermutlich schreibt das Programm an Stellen im Speicher rum, an denen es nicht rumschreiben soll. Wenn es eine unwichtige Stelle war und die Zugriffsrechte passen, muss deswegen das Programm nicht abstürzen. Wenn aber nachfolgender Code auf diesen Speicherbereich zugreift und sich am geänderten Inhalt verschluckt, crasht das Programm.
Such also mal nach Pufferüberläufen, mehrfachen Speicherfreigaben und ähnlichen Sachen. Solche Fehler lassen sich idR sehr schwer aufspüren, weil das Programm wie gesagt nach dem Passieren der fehlerhaften Stelle noch tagelang weiterlaufen kann bevor es abstürzt.
 
Für unsere Firma die Homepage von ASP auf PHP umgestellt und aus Faulheit das & für die ASP Stringverknüpfung per Suchen& Ersetzen in einen . geändert, so wie das funktioniert.

Nur wollte dieses 3.000 Zeilen Script mit ner riesen Datenbank dahinter einfach nichts ausgeben.

Nach sehr viel Kaffee und 2 Tagen davor rumgehockt ist mir dann aufgefallen, dass im HTML Link statt einem & wie HTML strings ja verknüpft werden plötzlich auch ein . stand.....

War ich sauer oO
 
Zurück
Oben Unten