#include <setjmp.h>
#include <ベクター>
int main(int argc, char**) {
std::vector<int> foo(argc);
jmp_buf 環境;
if (setjmp(env)) return 1;
}
上記のコードを GCC 4.4.1、g++ test.cc -Wextra -O1 でコンパイルすると、次の紛らわしい警告が表示されます。
/usr/include/c++/4.4/bits/stl_vector.h: 関数 'int main(int, char**)' 内: /usr/include/c++/4.4/bits/stl_vector.h:1035: 警告: 変数 '__first' が 'longjmp' または 'vfork' によって破壊される可能性があります
stl_vector.h の 1035 行目は、foo の構築中に呼び出した vector(n, value) コンストラクターによって使用されるヘルパー関数にあります。コンパイラが引数の値を把握できる場合 (数値リテラルなど)、警告は消えます。このテスト ケースでは、コンパイラがその値を判断できないため、argc を使用します。
警告は、setjmp ランディング ポイントの後に実際に発生するようにコンパイラがベクトル構築を最適化するためである可能性があると思います (これは、コンストラクター引数が関数のパラメーターに依存する場合のようです)。
できればsetjmp部分を別の関数に分割することなく、問題を回避するにはどうすればよいですか?
エラー処理に setjmp を使用する必要がある多数の C ライブラリに行き詰まっているため、setjmp を使用しないという選択肢はありません。