Код работает в отладочной сборке и ломается в релизной
В коде инициализации устройства встретилась строка:
assert(init_device(&dev) == 0);
В отладочной сборке всё работает. В релизной сборке устройство ведёт себя так, будто его никто не настраивал, и первое же обращение к нему возвращает ошибку.
Почему?
- В релизной сборке assert отключается макросом NDEBUG вместе со своим аргументом, поэтому init_device не вызывается вообще
- В релизной сборке assert завершает программу молча, поэтому устройство не успевает инициализироваться до первого обращения
- Оптимизация переставляет вызов init_device после первого использования dev, из-за чего устройство читается ненастроенным
- assert нельзя применять к выражениям с вызовом функции: аргумент должен быть простым сравнением переменных
