2016-07-30 29 views
1

Gemäß der LLVM Coding Standards, "LLVM verwendet keine Ausnahmen". LLVM verwendet jedoch C++ - Standardcontainer wie std::vector.Wie kann LLVM C++ - Standardcontainer ohne Ausnahmen verwenden?

Wie ist es möglich, dass LLVM die Standardcontainer ohne Ausnahmen verwendet? Wie behandelt es eine Situation, in der ein Container normalerweise throw wäre? Zum Beispiel, was passiert, wenn std::vector::push_back Speicher nicht zuordnen kann und nicht throw std::bad_alloc?

+0

Es sagt im Zitat, dass es sie ausschaltet, was trivialerweise mit '-fno-rtti' oder-' fno-exceptions' gemacht wird. –

Antwort

5

LLVM behandelt das Erreichen eines Status, der eine Ausnahme als sofortigen Absturz auslösen würde. Wenn die verwendeten Implementierungs-/Kompilierungseinstellungen Ausnahmen aktivieren, wird eine Instanz abgesetzt und findet keinen Catch-Handler und ruft std::terminate auf. Wenn die Implementierungs-/Kompilierungseinstellungen Ausnahmen deaktivieren, muss die Implementierung ein alternatives Verhalten bereitstellen. Die meisten werden sofort auf die eine oder andere Weise abstürzen.

Entwickler auf LLVM testen ihren Code mit genau diesen Einstellungen und sind vorsichtig, Umstände zu vermeiden, die möglicherweise werfen könnten.

Ein Umstand, der nicht direkt vermieden werden kann, sind Zuordnungsfehler. LLVM unterstützt einfach keine Plattformen, bei denen Zuteilungen fehlschlagen und der Benutzer bad_alloc fangen muss. Wenn die Plattform zu irgendeinem Zeitpunkt keinen Speicher zuweist, stürzt LLVM ab.

Es stellt sich heraus, dass die überwiegende Mehrheit der nicht eingebetteten Plattformen heute eine Form von overcommit verwenden. Und aufgrund der Art und Weise, wie LLVM entwickelt wird, haben wir keinen besonders nützlichen Mechanismus, um vernünftig auf eine fehlgeschlagene Speicherzuweisung zu reagieren. Als Konsequenz wird dies als fataler und nicht behebbarer Fehler angesehen. Ob wir Ausnahmen zulassen oder nicht, wir werden den Prozess an diesem Punkt beenden.

1

Die libC++ - Implementierung enthält Prüfungen auf _LIBCPP_NO_EXCEPTIONS, die von der Compiler-Unterstützung für Ausnahmen abgeleitet ist.

Wenn ich mir die spezifische Implementierung für Vektor anschaue, sieht es so aus, als wäre die Bedingung aktiviert, anstatt eine Ausnahme auszulösen. Dies konnte ich jedoch für die bad_alloc nicht verifizieren.

Da keine Dokumentation über das Verhalten, wenn -fno-exceptions gegeben ist, würde ich davon ausgehen, dass die Anwendung abstürzt.

+0

Die Frage scheint nach dem Codierungsstil von LLVM selbst zu fragen, nicht nach der Implementierung der Standardbibliothek, die von denselben Entwicklern bereitgestellt wird. –

+0

LLVM kann mit einem eigenen C++ - Compiler und einer eigenen STL-Implementierung erstellt werden. Entweder sollten sie vorab überprüft werden, was hart/unmöglich ist, um std :: bad_alloc zu verhindern, oder abstürzen. – JVApen