Темная сторона языка С трактуется двумя способами. Первый вариант: речь идет об опасных вещах, из-за которых в программе происходят сильно нежелательные события. Второй — то, о чем среднестатистический программист часто не задумывается. Этакая слепая зона, из-за невнимания к которой случаются серьезные аварии.
Неопределенное поведение (НП) — это когда может случиться все, что вы даже представить себе не могли. Стандарт не предъявляет никаких требований. Компиляция может прерваться или программа может выполняться некорректно, например. Случаи такого поведения описаны в стандарте C99.
Strict Aliasing. Компилятор видит указатели на разные участки памяти. Поэтому правило строгого алиасинга является неоднозначным. Однако опцию можно отключить. К примеру, ядро Linux собирается без этого. Когда оно вообще нужно? Например для трактовки одной и той же области памяти разными типами.
Есть толковая статья на эту тему от Криса Латтнера “What Every C Programmer Should Know About Undefined Behavior”. В материале автор описывает чем неопределенное поведение может быть полезно.
Полную версию можно посмотреть на нашем Youtube-канале.