Watcom Compiler generiert falschen Code



  • Hallo,

    wir haben noch ein altes Programm (gerade im Begriff umgestellt zu werden, ist aber relativ umfangreich), welches noch mit Watcom 11.c kompiliert werden muss.
    Allerdings gibt es das Problem, dass dies in einem Destruktor in etwa 3% der Fälle einen Crash gibt. Dort wird für jedes Element einer Liste von Pointern (kann bis zu 10000 Einträge haben) delete auf diesem Element aufgerufen.
    Bei den Crashdumps sind mir zwei Probleme aufgefallen, die ich mir absolut nicht erklären kann, außer dass der Compiler falschen Code generiert hat:
    - Der Pointer hat auf einmal einen ungeraden Wert, und ist exakt um 1 Byte zu niedrig. Beim Zugriff auf den vermeintlichen vpointer gibt es einen Crash. Würde man den Pointer um 1 inkrementieren, und die darauffolgenden 4 Bytes als vpointer interpretieren, käme man zu der vtable (oder jedenfalls etwas, was stark nach einer vtable aussieht)
    - Noch interessanter: Der Pointer stimmt, aber der eigentliche vpointer ist um eins zu niedrig. Der vpointer wird - für den virtuellen Destruktor - dereferenziert und der Offset für die Funktion addiert, welcher aber natürlich nicht stimmt. Würde man hier wieder um 1 inkrementieren, bekäme man einen korrekten Funktionspointer, hinter dem sich auch Instruktionen verbergen, die stark nach FUnktion riechen (mehrere register werden auf den Stack gepusht).

    Was mich etwas verwundert ist, dass auf diese Pointerliste während des Programmablaufs stark zugegriffen wird, aber die Crashes sind immer nur im Destruktor.
    Hat jemand schonmal sowas gesehen und weiß was das sein könnte, oder welche Art von Optimierung einen derartigen Fehler verursachen kann?

    Danke!



  • mortified_penguin schrieb:

    ... welches noch mit Watcom 11.c kompiliert werden muss.

    Warum geht kein anderer Compiler?

    Der Watcom-C ist inzwischen Open Source. Einfach mal eine andere Version nehmen. https://github.com/open-watcom/open-watcom-v2



  • Wenn du nichtmal den Versuch unternimmst, die fehlerhafte Codegenerierung durch Aufzeigen des falschen Maschinencodes zu belegen, ist so eine Diagnose nicht entfernt ernstzunehmen.



  • Gute Idee von Shellbombs weil du wohl schnell ausprobieren kannst ob es sich dadurch ändert - der v2 sollte nicht wirklich Umstellungen zu deinem 11.c benötigen
    https://github.com/open-watcom/open-watcom-v2
    ganz oben den Link hinter "Latest binary build is available from..."

    zu dem Pointer

    ich kann mir nicht vorstellen das du einen Kompilerbug gefunden hast - eher das deinen Pointer/Objekte schon vorher beschädigt werden und es sich eben (leider) nicht so schnell auswirkt



  • Zusatz:

    Ich würde an deiner Stelle auf jeden Fall versuchen einen Linux Port auf Basis von GCC/Clang zu machen - selbst wenn manche Teile unter Linux (Hardware-Abindung und solche Dinge?) vielleicht nur simuliert werden können - der eingebaute Adress-Sanitizer ist einfach bares Geld wert um solche und weitere Fehler schnell zu finden, nur dafür lohnt sich schon ein Linux Port - neben der guten Kompiler-Qualität und C/C++ Konformität



  • Was ist denn das für eine Watcom 11.c Applikation - so richtig altes DOS oder schon Windows?


Anmelden zum Antworten