Pull to refresh

Ошибка в компиляторе? Маловероятно, но…

Reading time2 min
Views5.7K
Однажды мне понравилось высказывание «Думаете, что ошибка в компиляторе? Проверьте получше свой код!». Действительно, в моей практике такое случалось – когда, казалось бы, все разумные причины ошибки были отброшены и мысль о том, что вот на этот раз уж точно глюк где-то в системе, вдруг находилась какая-нибудь до смешного банальная ошибка в своем коде, сразу объясняющая все предыдущие странности.

Но иногда все же виновным может оказаться и компилятор.


Проект на контроллере TMS570 (одной из ключевых особенностей которого, повлиявшей на выбор, было наличие модуля с плавающей точкой). Предназначенность контроллера для safety-critical систем как бы вообще не оставляет шанса на то, что какие-то серьезные проблемы могут быть с самим контроллером. По крайней мере, в это очень хочется верить.

В проекте присутствует весьма и весьма сложный алгоритм, требующий множества вычислений с плавающей точкой. Который, конечно же, с первой попытки реализации работать отказывается. Ничего удивительного пока, нормальный процесс разработки и отладки.

Но дальше начинаются странности. Там, где значения вычислений ну никак не могут быть больше 1, вдруг начинает возникать ошибка «бесконечного результата». При этом попытки поймать момент, когда же это случается, не приводят к успеху.

Финалом стало следующее: фрагмент

if (x > 1)
{
    printf(“%f”, x);
}


выдавал на печать значения вида 0.0043, т.е. сильно меньше единицы…

И вот тут мысль о том, что «возможно, на этот раз виноват таки компилятор», вновь активизировалась. И после некоторого копания в эту сторону проблема была заподозрена, подтверждена и успешно решена.

Дело было в том, что компилятор неправильно генерировал код входа-выхода в прерывание, не сохраняя все регистры с плавающей точкой! В результате, как только во время выполнения каких-либо вычислений с плавающей точкой случалось прерывание, внутри которого также выполнялись вычисления с плавающей точкой (а такое реально происходило!), система начинала вести себя непредсказуемым образом вроде вышеописанного. И после ручного исправления кода входа-выхода в прерывание проблема благополучно решилась и больше не проявлялась.

ЗЫ. А когда знаешь, где же именно проблема, то уже легко можно найти, что она была известна и ранее. К сожалению, информация о ней присутствовала только на форуме TexasInstruments, и нигде не была описана в стандартной документации или среди известных проблем.

ЗЗЫ. Что же, даже предназначенность контроллера для safety critical систем, как оказалось, не дает гарантии, что все в нем будет работать так, как заявлено…
Tags:
Hubs:
+39
Comments10

Articles

Change theme settings