Die Emulation GCC __builtin_unreachable?
Bekomme ich eine ganze viel von Warnungen über switches, die nur teilweise deckt den Bereich der Aufzählung umgestellt. Dafür würde ich gerne eine "Standard" - für alle, die Schalter, und setzen Sie __builtin_unreachable
(GCC-builtin) in diesem Fall, so dass der compiler weiß, dass Fall nicht erreichbar.
Kam ich jedoch zu wissen, dass GCC4.3 nicht unterstützt, dass builtin noch. Gibt es eine gute Art und Weise zu emulieren, die Funktionalität? Ich dachte über die Dereferenzierung eines null-Zeigers statt, aber das haben andere unerwünschte Nebenwirkungen/Warnungen und so. Haben Sie eine bessere Idee?
switch((int)myenum) /*silence warnings*/
^_^
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie den Aufruf einer inline-Funktion deklariert
_Noreturn
zu markieren alles, was nach diesem Anruf als nicht erreichbar. Der compiler darf, werfen Sie einen code nach einer solchen Funktion. Wenn die Funktion selbst iststatic
(und zurück), der compiler wird in der Regel auch die inline-Funktion. Hier ist ein Beispiel:Beachten Sie, dass Sie aufrufen undefiniert Verhalten, wenn eine Funktion markiert
_Noreturn
tatsächlich gibt. Werden Sie sicher, dass diese Funktion niemals aufgerufen wird.__builtin_unreachable()
ist es, dem compiler einen Hinweis-es kann nicht eingreifen, auf Ihre eigenen. Dieses Ziel wird nicht erreicht, indem ein Aufruf anabort()
.__builtin_unreachable()
wird über Optimierung, nicht um Sicherheit.unreachable()
komplett Weg?_Noreturn
, in der Tat alle, die ich finden kann sagt es wird unterstützt (in C11) von gcc-4.7. Wenn das wirklich der Fall ist, macht es keinen Sinn, da__builtin_unreachable()
unterstützt seit 4.5 nach der Antwort unten. Ich nehme an__attribute__ ((noreturn))
könnte eine alternative sein!?Hmm, so etwas wie (seit dem __builtin_unreachable() erschien in 4.5):
if (x) y(); else my_unreachable();
funktioniert nicht mit Ihrer definition__builtin_unreachable
. Ein Aufruf von "abort" wird es nicht tun, weil er hat bestimmt Verhalten, so dass der compiler noch hat, um den Anruf auf "Abbrechen" auf diesem Platz 🙁Würde
abort
(wobei ein core dump) oderthrow
(unter Berücksichtigung alternate data capture) für Ihre Bedürfnisse?Wollen Sie wirklich haben, switch-Anweisungen, die nicht für die vollständige enumeration? Ich bin fast immer versuchen, alle möglichen Fälle (no-op) und hat keinen Standardwert Fall so, dass gcc wird mich warnen, wenn neue Enumerationen Hinzugefügt werden, wie es erforderlich sein kann, um diese zu behandeln, anstatt das es im hintergrund (beim kompilieren) fallen in die default.
Bearbeiten:
Da willst du nicht erreichbaren code weggelassen werden, indem compiler, unten ist der einfachste Weg.
Compiler optimiert das Weg
x = x;
Anweisung, vor allem, wenn es nicht erreichbar. Hier ist die Verwendung:Wenn Sie
__builtin_unreachable()
Anfangfoo()
dann der compiler erzeugt eine linker-Fehler für implementierteoperator =
. Ich lief diese tests in gcc 3.4.6 (64-bit).halten Sie es einfach:
oder, noch besser:
NDEBUG
ist nicht definiert. Behauptungen gemeint sind, werden keine-ops bei nicht-debug-builds.