2016-12-04 1 views
1

Ich habe ein Legacy-Projekt mit vielen Typ-Konvertierungen und Castings. Normalerweise den Überlauf dynamische Verhalten zu überprüfen, gcc (und C lang) eine eingebaute Funktion für die:Catching Typ Konvertierung Überläufe mit GCC

eingebaute Funktion: bool __builtin_add_overflow (Typ1 a, Typ2 b, type3 * res)

Wenn das Ergebnis überläuft, gibt die Funktion true zurück. Dann kann mein Programm diesen Zustand erfassen und entsprechend handeln.

Aus Gründen der gleichen Funktionalität, ohne Änderung von Legacy-Code, ist es möglich, GCC anweisen solche Builtins zu verwenden und eine bereitgestellte Funktion als Catcher aufzurufen, wenn die eingebauten True zurückgeben? Ich wünschte, ich so etwas wie finden:

Leere _cyg_add_overflow_catcher (A, B, __FILE, LINE);

GCC bereits können instrument functions, für die Rückverfolgbarkeit und Profilierung, so das Konzept ist nicht komisch. Irgendwelche Ideen?

+1

Gibt es eine Chance, dass Sie einfach [UBSan] (http://developers.redhat.com/blog/2014/10/16/gcc-undefined-behavior-sanitizer-ubsan) verwenden könnten? – yugr

Antwort

2

Diese Funktionen werden von GCC auf effiziente asm-Sequenzen reduziert, sodass sie im endgültigen Objektcode nicht vorhanden sind. Auf der anderen Seite, wenn in UBSan mode kompiliert wird GCC dedizierte Rückrufe von libubsan.so auf Überlauf aufrufen. Sie könnten diese Rückrufe in Ihrer ausführbaren Datei überschreiben und die notwendige Verarbeitung durchführen (das ist natürlich ziemlich hacky).

Beachten Sie, dass GCC nur Überläufe für signierte-Nummern verfolgt, da vorzeichenlose Überläufe vom Standard definiert werden.

+0

Ich wusste nichts über UBSan, was perfekt zu meinem Bedarf passt. Aber wie wird es für eine bare-bone-c-Implementierung berichten? –

+1

"Aber wie wird es für eine bare-bone-c-Implementierung berichten" - meinen Sie, dass Sie Überläufe in einem Bare-Metal-Programm wie Bootloader erkennen wollen? In diesem Fall müssen Sie die Implementierung von UBSan Callbacks selbst durchführen und sie mit Ihrer App verknüpfen. Dies wurde für [Linux-Kernel] (https://kernel.org/doc/html/latest/dev-tools/ubsan.html) getan, also ist es möglich. – yugr