Следующий пример демонстрирует проблему:Сегментация ошибка при переходе к Гото над VLA массива
#include <cstdio>
int main()
{
unsigned int remaining=1;
goto loop;
while(remaining) {
unsigned char tmp[remaining];
printf("&tmp: %p\n",tmp);
loop:
remaining = 512;//or something else;
}
}
Первоначально инициализация «оставшейся» переменной была немного долго, и я использовал goto
для его инициализации в одной строке. Однако теперь этот пример дает ошибку сегментации на линии printf
.
Похоже, что массив не инициализирован должным образом.
Даже GDB не может напечатать адрес массива TMP в:
Program received signal SIGSEGV, Segmentation fault.
0x00000000004005b8 in main() at test.cpp:11
11 printf("&tmp: %p\n",tmp);
(gdb) p tmp
$1 = 0xfffffffffffffe00 <error: Cannot access memory at address 0xfffffffffffffe00>
Моя версия GCC:
gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
компиляции с:
g++ -o testc test.cpp
Если удалить Гото, или замените переменный массив с фиксированным массивом, ошибка сегментации исчезла. Что происходит на самом деле?
Это ошибка gcc? Если комбинация goto
и вариационных массивов не допускается, должно быть предупреждение?
Составьте свой пример с недавним звоном или GCC 4.9 * и они не допустят, чтобы ваш код идти.. – XapaJIaMnu