#include <setjmp.h> #include <vector> int main(int argc, char**) { std::vector<int> foo(argc); jmp_buf env; if (setjmp(env)) return 1; }
Компиляция приведенного выше кода с GCC 4.4.1, g ++ test.cc -Wextra -O1, дает это сбивающее с толку предупреждение:
/usr/include/c++/4.4/bits/stl_vector.h: In function ‘int main(int, char**)’: /usr/include/c++/4.4/bits/stl_vector.h:1035: warning: variable ‘__first’ might be clobbered by ‘longjmp’ or ‘vfork’
Строка 1035 файла stl_vector.h находится во вспомогательной функции, используемой конструктором vector (n, value), который я вызываю при создании foo. Предупреждение исчезает, если компилятор может определить значение аргумента (например, это числовой литерал), поэтому я использую argc в этом тестовом примере, потому что компилятор не может определить его значение.
Я предполагаю, что предупреждение может быть связано с тем, что компилятор оптимизирует конструкцию вектора, так что это действительно происходит после точки приземления setjmp (что, похоже, имеет место здесь, когда аргумент конструктора зависит от параметра функции).
Как я могу избежать проблемы, желательно без необходимости передавать часть setjmp другой функции?
Не использовать setjmp - это не вариант, потому что я застрял с кучей библиотек C, которые требуют его использования для обработки ошибок.