Код может перестать работать с оптимизацией компилятора

Я использую компилятор C PellesC. Иногда мой код случайно перестает работать. Определенное утверждение может вызвать это. Например, я умножил переменную на sin(c) (c - двойное число), и мой код, казалось, только что закончил выполнение без результата. Иногда он зависает, иногда кажется, что он просто возвращается, но я всегда могу это исправить, удалив неправильное выражение или отключив оптимизацию компилятора, в частности "максимизировать скорость" или "максимизировать скорость больше". Замораживание также исчезнет почти в 100% случаев, если я добавлю инструкцию printf где-то рядом с точкой, в которой он падает. Я никогда не находил ничего, что указывало бы на то, что я обращаюсь к памяти неправильно, я уверен, что это проблема компилятора. Мне было интересно, если кто-нибудь может пролить свет на это. Возможно ли, что я на самом деле делаю что-то не так? Или это известная проблема с компилятором Pelles C?

Редактировать:

изменения

canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+2]=(unsigned char)(255.0*dtempA*(1-sin(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+1]=(unsigned char)(255.0*dtempA*(1+cos(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)]=(unsigned char)(255.0*dtempA*(1+sin(c)));

до (разница в конце последней строки)

canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+2]=(unsigned char)(255.0*dtempA*(1-sin(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)+1]=(unsigned char)(255.0*dtempA*(1+cos(c)));
canvas->pixels[(y*canvas->pitch)+(x*canvas->Bpp)]=(unsigned char)(255.0*dtempA*(1+1));

заставляет это работать.

2 ответа

Решение

Вероятно, вы случайно используете где-то неопределенное поведение, и изменение случайных инструкций в программе нарушает очень хрупкое выравнивание кода в стеке, которое приводит к работе программы.

Это может быть и другое, но хорошая ставка в том, что это вы:). Переменные, которые не были явно инициализированы, часто получают разные значения в оптимизированной по сравнению с неоптимизированной сборкой, поскольку компоновка стека может слегка изменяться в зависимости от того, насколько агрессивно компилятор удаляет временные значения а также другие факторы.

Другие вопросы по тегам