C Prog­ramming Lan­gu­age: не­оп­ре­делен­ное по­веде­ние в при­мерах

11 сентября 2019
C Programming Language: неопределенное поведение в примерах

Блоги бывают разные: с глубоким погружением в тему или справочного характера, где информация обработана и представлена в удобном виде. Для своей аудитории одинаково полезны и те, и другие. Вспомним сегодня язык С. А именно — его темную сторону. Недавно мы провели второй митап именно по этой теме и готовы поделиться информацией.


Темная сторона языка С трактуется двумя способами. Первый вариант: речь идет об опасных вещах, из-за которых в программе происходят сильно нежелательные события. Второй — то, о чем среднестатистический программист часто не задумывается. Этакая слепая зона, из-за невнимания к которой случаются серьезные аварии.

Неопределенное поведение

Неопределенное поведение (НП) — это когда может случиться все, что вы даже представить себе не могли. Стандарт не предъявляет никаких требований. Компиляция может прерваться или программа может выполняться некорректно, например. Случаи такого поведения описаны в стандарте C99.

Чем плохо неопределенное поведение

picture

picture

Когда хорошее правило может приводить к проблемам

Strict Aliasing. Компилятор видит указатели на разные участки памяти. Поэтому правило строгого алиасинга является неоднозначным. Однако опцию можно отключить. К примеру, ядро Linux собирается без этого. Когда оно вообще нужно? Например для трактовки одной и той же области памяти разными типами.

picture

Плюсы и минусы НП

Есть толковая статья на эту тему от Криса Латтнера “What Every C Programmer Should Know About Undefined Behavior”. В материале автор описывает чем неопределенное поведение может быть полезно.

Примеры

picture

picture

picture

Инструменты вам в руки

  • Сам компилятор. Warnings пишут не для дураков. Обращайте на них внимание;
  • Valgrind. Отладчик использования памяти. Если не боитесь, конечно, попасть в Вальгаллу раньше времени;
  • Address Sanitizer. Умеет делать то же, что и Valgrind, а в бинарник встраивается автоматом и забудете про внешние утилиты;
  • Undefined Behavior Sanitizer. Сами уже понимаете из названия, что он делает;
  • Static analyzers. Выявляет ошибки и недочеты.

Полную версию можно посмотреть на нашем Youtube-канале.

picture