В большинстве бесед вокруг undefined поведения (UB) рассказывается о том, как есть некоторые платформы, которые могут это сделать, или некоторые компиляторы делают это.
Что делать, если вас интересует только одна платформа и только один компилятор (такая же версия), и вы знаете, что будете использовать их в течение многих лет?
Ничего не меняется, но код, а UB не определяется реализацией.
Как только UB проявил себя для этой архитектуры, и что этот компилятор и вы протестировали, не можете ли вы предположить, что с тех пор, что компилятор сделал с UB в первый раз, он будет делать это каждый раз?
Примечание: Я знаю, что поведение undefined очень, очень плохое, но когда я указал UB в коде, написанном кем-то в этой ситуации, они спросили об этом, и мне нечего было сказать лучше, чем если бы вам приходилось обновлять или порт, все UB будет очень дорого исправлять.
Кажется, существуют разные категории поведения:
-
Defined
- Это поведение, задокументированное для работы по стандартам -
Supported
- это поведение, задокументированное для поддержки a.k.a реализация определена -
Extensions
- это документированное дополнение, поддержка низкого уровня битные операции, такие какpopcount
, подсказки ветвей, попадают в эту категорию -
Constant
- пока не задокументированы, это поведение, которое вероятно, будет последовательным на данной платформе, например,sizeof
int
пока не переносится, вероятно, не изменится -
Reasonable
- обычно безопасный и обычно устаревший, литье из unsigned to signed, используя низкий бит указателя как временное пространство -
Dangerous
- чтение неинициализированной или нераспределенной памяти, возврат временную переменную, используяmemcopy
для класса non pod
Казалось бы, Constant
может быть инвариантным в версии патча на одной платформе. Линия между Reasonable
и Dangerous
, по-видимому, все больше и больше походит на Dangerous
, поскольку компиляторы становятся более агрессивными в своих оптимизации