2016-07-30 12 views
1

LLVM Coding Standardsによると、 "LLVMは[...]例外を使用しません"。しかし、LLVMは、std::vectorのようなC++の標準コンテナを利用しています。LLVMは例外なくC++の標準コンテナをどのように使用できますか?

LLVMは例外なく標準コンテナをどのように使用できますか?コンテナが通常はthrowになる状況はどのように処理されますか?たとえば、std::vector::push_backがメモリを割り当てることができず、throw std::bad_allocできない場合はどうなりますか?

+0

引用符では、それは '-fno-rtti'または-'fno-exceptions'で簡単に行われます。 –

答えて

5

LLVMは、即時クラッシュとして例外をスローする状態に達したとみなします。使用された実装/コンパイル設定で例外を有効にすると、unwindsがスローされ、キャッチハンドラが見つからずにstd::terminateが呼び出されます。実装/コンパイル設定で例外が無効になっている場合、実装は何らかの代替動作を提供する必要があります。ほとんどの場合、ただちにクラッシュが発生します。

LLVM上の開発者は、これらの設定でコードをテストし、潜在的に投げられる可能性のある状況を避けるよう注意します。

直接回避することが不可能な状況の1つは、割り当ての失敗です。 LLVMは、割り当てが失敗し、ユーザがbad_allocをキャッチしなければならないプラットフォームをサポートしていません。プラットフォームがいつでもメモリの割り当てに失敗すると、LLVMはクラッシュします。

現在、非組み込みプラットフォームの大部分は、overcommitという形式を使用しています。また、LLVMの設計の性質上、メモリを割り当てられなかった場合に正常に応答するための有用なメカニズムはありません。結果として、それは致命的かつ回復不能なエラーとみなされ、例外を有効にするかどうかに関わらず、その時点でプロセスを終了させます。

1

libC++の実装には、例外のコンパイラサポートから導かれた_LIBCPP_NO_EXCEPTIONSのチェックが含まれています。

vectorの特定の実装を見てみると、例外をスローする代わりに条件がアサートされたように見えます。しかし、私はbad_allocのためにこれを確認することができませんでした。

-fno-exceptionsが与えられたときの動作に関するドキュメントが存在しないため、アプリケーションがクラッシュすると想定します。

+0

質問は、同じ開発者が提供する標準ライブラリの実装ではなく、LLVM自体のコーディングスタイルについて質問しているようです。 –

+0

LLVMは独自のC++コンパイラと独自のSTL実装でビルドできます。したがって、どちらかが事前チェックされている必要があります。これは、std :: bad_allocを防止するためには不可能または不可能です。 – JVApen

関連する問題