LINUX.ORG.RU

Нашёл вот такой вот:

void some_func(void)
{
  volatile register int *pSPsaved;
  {
    automatic int iTemp;
    pSPsaved = &iTemp;
  }
  ...
  {
    automatic int iTemp;
    if(pSPsaved != &iTemp)
      printf("Oops?\n");
  }
}

Теперь ещё вопрос, в чём могут быть причины?

UVV ★★★★★
() автор топика

Смотреть ассемблерный листинг? Еще можно попытаться сократить код до минимального, содержащего баг.

amomymous ★★★
()
Ответ на: комментарий от UVV

Теперь ещё вопрос, в чём могут быть причины?

printf/scanf/etc с неправильной форматной строкой, например.

Relan ★★★★★
()
Ответ на: комментарий от UVV

АХАХА, ЧТО ТЫ ДЕЛАЕШЬ, ПРЕКРАТИ.

Про области видимости переменных что-нибудь приходилось слышать?

anonymous
()

Фишка в том, что проверки на 0 везде стоят. Я подумываю, что каким-то образом может быть размер стэка в определённый момент превышает допустимый и тогда Ж.?

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Ты мне скажи, ты чего пытаешься добиться проверкой, которую выше запостил? С какого перепугу адреса должны совпасть?

anonymous
()
Ответ на: комментарий от UVV

Проверки на 0 не спасают от преполнения стека; проверки на соблюдение границ - спасает.

может быть размер стэка в определённый момент превышает допустимый и тогда Ж.?

Если у тебя не DOS и не ублюдочная встраиваемая ОС без защиты памяти, то в этом случае будет какой-нибудь приличный сигнал.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Сигнал летит, но общий (что жопа уже случилась)... Сейчас буду смотреть, можно ли что-нибудь детальное поймать.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Это не то. При сигнале по обычному переполнению стек будет целым.

Сейчас буду смотреть, можно ли что-нибудь детальное поймать.

Если ситуация стабильно наигрывается, ее можно ловить скриптом на gdb: останавливаться при возврате из каждой функции, смотреть, есть ли в стектрейсе main, и, если еще есть, продолжать исполнение.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

мну вспомнил весёлую гифку с мистером Бином, не могу чё-то нагуглить.. )

UVV ★★★★★
() автор топика

Опция /GS компилятора

frame ★★★
()

valgrind или breakpoint на область памяти

kulti ★★
()

Вотчпоинты в gdb могут помочь.

Сигнал летит, но общий

Тут тоже gdb поможет.. можно, если стек совсем не испохабился сделать backtrace.

naszar
()

Потратить 5 минут на мануал по valgrind и жизнь изменится навсегда.

kiverattes ★☆
()
Ответ на: комментарий от UVV
>cat mm.cpp 
int main()
{
  automatic int i = 0;
}
>g++ mm.cpp 
mm.cpp: In function ‘int main()’:
mm.cpp:3: error: ‘automatic’ was not declared in this scope <-see here
mm.cpp:3: error: expected ‘;’ before ‘int’

так понятней?

nanoolinux ★★★★
()
Ответ на: комментарий от nanoolinux

Да меня только вот пару часов назад допёрло, лол =)

UVV ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.