?

Log in

No account? Create an account
 
 
13 Ноябрь 2008 @ 09:43
Еще чуть-чуть про ошибки компилятора  
C бездны bash.org.ru (спасибо _winnie ):

if (65==0)
{
    printf("Ребят, тут ваще не реальная фигня какая-то случилась\n");
    exit(0);
}

В ситуации, аналогичной http://ddima.livejournal.com/43027.html (когда константный 0 записался в ESI и портился при сохранении на стеке в вызываемой функции) - запросто подобная фигня может произойти.
Метки:
 
 
 
Пушыстый_winnie on Ноябрь, 13, 2008 06:56 (UTC)
надо из переменной что-нибудь читать при этом! Или константный мусор записывать в EIP :)
warning C4127: conditional expression is constant
Михаил Певзнерpigmeich on Ноябрь, 13, 2008 07:14 (UTC)
> warning C4127: conditional expression is constant

А вы их volatile по голове и по почкам! Штоб знали, значит!
Дядя Димаddima on Ноябрь, 13, 2008 07:23 (UTC)
(volatile int)65
Да!
daradiboga on Ноябрь, 13, 2008 15:22 (UTC)
В конкретно этом примере - нет шансов увидеть сообщение.
Дядя Димаddima on Ноябрь, 13, 2008 15:31 (UTC)
Увы, есть.
Схожий случай описывался в посте по ссылке. Там легко можно было бы вставить if (0 == -1) и получить истину.
daradiboga on Ноябрь, 13, 2008 15:59 (UTC)
В Release build компилятор выбросит невыполняемый код.
Дядя Димаddima on Ноябрь, 13, 2008 17:04 (UTC)
Во первых, зависит от компилятора ;)
А во вторых - мы же не знаем первоисточника этого кода. Возможно, там на одном из мест стояла константная переменная...
daradiboga on Ноябрь, 13, 2008 17:13 (UTC)
Таких, чтобы не выбросил - уже не делают лет 10.
Это же не dead code, это unreachable code. Его вообще нельзя не заметить, он просто по графу управления найдется (обязательно). Даже анализ данных, даже линейный не требуется.

Про во-вторых - я ж написал про конкретный код.
daradiboga on Ноябрь, 13, 2008 15:23 (UTC)
Кстати, давеча поймали ошибку в компиляторе (MSVC 2005).
Как нефиг делать бывает.
Дядя Димаddima on Ноябрь, 13, 2008 15:57 (UTC)
Ошибки компилятора тоже бывают, спору нет.
Причем их количество напрямую коррелирует со сложностью реализуемых конструкций (обычно срубы идут на глубоких темплейтных классах, на простом if последнюю ошибку я видел лет 5 назад).
daradiboga on Ноябрь, 13, 2008 16:00 (UTC)
Даже не на темплейте.
Но на wpo.
Тупо все синлайнил, даже между функциями (молодец), но в регистр из памяти класться перестало.
Соответственно, из регистра брался мусор.
Дядя Димаddima on Ноябрь, 13, 2008 17:05 (UTC)
О, да. WPO для текущих версий - это такой же источник глюкавости, как full optimization в MSVC 4.0. Но я еще раз повторюсь со ссылкой на блог в исходном посте - бывают ситуации, что и константы портятся не по вине компилятора (хотя в той ситуации я почти уже сдался в плане поиска ошибки), а по вине человека.