Я в основном убеждал себя, что столкнулся с какой-то ошибкой g ++ 4.8.3, но подумал, что сначала спрошу этот список, потому что у меня очень мало опыта работы с setjmp / longjmp. Я упростил свой код до следующего файла foo.cxx:
#include <setjmp.h>
#include <string.h>
// Changing MyStruct to be just a single int makes the compiler happy.
struct MyStruct
{
int a;
int b;
};
// Setting MyType to int makes the compiler happy.
#ifdef USE_STRUCT
typedef MyStruct MyType;
#elif USE_INT
typedef int MyType;
#endif
void SomeFunc(MyType val)
{
}
static void static_func(MyType val)
{
SomeFunc(val);
}
int main(int argc, char **argv)
{
jmp_buf env;
if (setjmp(env))
{
return 1;
}
MyType val;
#ifdef USE_STRUCT
val.a = val.b = 0;
#elif USE_INT
val = 0;
#endif
// Enabling the below memset call makes the compiler happy.
//memset(&val, 0, sizeof(val));
// Iterating 1 or 2 times makes the compiler happy.
for (unsigned i = 0; i < 3; i++)
{
// calling SomeFunc() directly makes the compiler happy.
static_func(val);
}
return 0;
}
Я использую g ++ 4.8.3 для компиляции этого кода. Что меня интересует, так это то, что когда я определяю USE_STRUCT, компиляция терпит неудачу, но завершается успешно с USE_INT. В коде есть комментарии, которые дополнительно указывают, как добиться успешной компиляции с помощью USE_STRUCT. Компиляция также не выполняется с параметром -fPIC для g ++, но это обязательный аргумент в моей среде.
Чтобы увидеть ошибку компиляции:
g++ -DUSE_STRUCT -Wextra -Wno-unused-parameter -O3 -Werror -fPIC foo.cxx
foo.cxx: In function ‘int main(int, char**)’:
foo.cxx:26:5: error: variable ‘val’ might be clobbered by ‘longjmp’ or ‘vfork’ [-Werror=clobbered]
Но можно использовать простой int:
g++ -DUSE_INT -Wextra -Wno-unused-parameter -O3 -Werror -fPIC foo.cxx
Может кто-нибудь объяснить мне, почему val может быть заторможено, если это структура, но не если это int? Есть ли какие-либо идеи о других способах успешной компиляции с помощью структуры, как указано в комментариях в коде? Или это указывает на ошибку компилятора?
Приветствуются любые идеи и комментарии.
setjmp
и т. д., вероятно, связано с нахождением в реестре. - person Basile Starynkevitch   schedule 06.01.2015longjmp
, вызывает неопределенное поведение в C ++. - person 5gon12eder   schedule 06.01.2015