W większości przekonałem się, że napotkałem błąd g ++ 4.8.3, ale pomyślałem, że najpierw zapytam tę listę, ponieważ mam bardzo mało doświadczenia z setjmp/longjmp. Uprościliśmy mój kod do następującego foo.cxx:Niespójne ostrzeżenie: zmienna może zostać zbuforowana przez "longjmp" lub "vfork"
#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;
}
Używam g ++ 4.8.3 do kompilacji tego kodu. Interesujące jest to, że kiedy definiuję USE_STRUCT, kompilacja nie powiedzie się, ale uda się z USE_INT. W kodzie znajdują się komentarze, które dodatkowo wskazują, jak dokonać kompilacji z USE_STRUCT. Kompilacja nie powiedzie się również z opcją -fPIC do g ++, ale jest to wymagany argument w moim środowisku.
Aby zobaczyć błąd kompilacji:
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]
Ale za pomocą prostego int jest OK:
g++ -DUSE_INT -Wextra -Wno-unused-parameter -O3 -Werror -fPIC foo.cxx
Czy ktoś może mi wyjaśnić dlaczego val może być niszczona, jeśli jest to struct, ale nie jeśli jest int? Wszelkie spostrzeżenia na temat innych sposobów kompilacji powiodły się z struct, jak wskazano w komentarzach w kodzie? Czy to wskazuje na błąd kompilatora?
Wszelkie spostrzeżenia i komentarze są bardzo doceniane.
gdyż temu przez 'setjmp' etc jest prawdopodobnie związane z bycia w rejestrze. –
Otwórz błąd, który może być tym https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48968 –
Odnośnie komentarza Basile, co się stanie, jeśli obniżysz poziom optymalizacji? Czy sprawdziłeś, który kod (a nawet pośredni) generowany jest przez kompilator? To może dać ci wskazówkę, co się dzieje. –