LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Это не UB, UB - это не предвиденное поведения, которое зависит от версии компилятора, состояния меркурия и т.п.

По стандарту Си/Си++ и схожих языков (Zig, …) именно это UB.

А зависимость от компилятора и прочего — это определяемое реализацией = implementation defined = IB.

Например чтение из удаленой/освобожденной области памяти - это может быть ub, потому что там может быть как старые данные, так и данные, которые там оказались, в результате создания новой переменной.

Если в стандарте написано, что чтение из удаленой/освобожденной области памяти может вернуть произвольные данные, тогда это IB. Если же в стандарте написано, что это UB, тогда это чтение может вообще не возвращать данные, а например, отформатировать диск. Или изменить код программы произвольным образом. И компилятор вправе постулировать, что UB никогда не случается, то есть, если написано if(x < 0){ здесь UB }, значит x всегда неотрицательно.

P.S. Не на то ответил… Хотел ответить mx

Исходная версия monk, :

Это не UB, UB - это не предвиденное поведения, которое зависит от версии компилятора, состояния меркурия и т.п.

По стандарту Си/Си++ и схожих языков (Zig, …) именно это UB.

А зависимость от компилятора и прочего — это определяемое реализацией = implementation defined = IB.

Например чтение из удаленой/освобожденной области памяти - это может быть ub, потому что там может быть как старые данные, так и данные, которые там оказались, в результате создания новой переменной.

Если в стандарте написано, что чтение из удаленой/освобожденной области памяти может вернуть произвольные данные, тогда это IB. Если же в стандарте написано, что это UB, тогда это чтение может вообще не возвращать данные, а например, отформатировать диск. Или изменить код программы произвольным образом. И компилятор вправе постулировать, что UB никогда не случается, то есть, если написано if(x < 0){ здесь UB }, значит x всегда неотрицательно.