Вступить в клуб →
лёгкаявопросСборка, отладка и профилирование

Код работает в отладочной сборке и ломается в релизной

В коде инициализации устройства встретилась строка:

assert(init_device(&dev) == 0);

В отладочной сборке всё работает. В релизной сборке устройство ведёт себя так, будто его никто не настраивал, и первое же обращение к нему возвращает ошибку.

Почему?

  • В релизной сборке assert отключается макросом NDEBUG вместе со своим аргументом, поэтому init_device не вызывается вообще
  • В релизной сборке assert завершает программу молча, поэтому устройство не успевает инициализироваться до первого обращения
  • Оптимизация переставляет вызов init_device после первого использования dev, из-за чего устройство читается ненастроенным
  • assert нельзя применять к выражениям с вызовом функции: аргумент должен быть простым сравнением переменных

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела