Вы задаете два вопроса:
[...], компиляторы вообще дают такие дополнительные гарантии? :
В противном случае они были бы в значительной степени непригодны, но я не думаю, что на это можно дать однозначный ответ. Нам пришлось бы доказать, что не существует компилятора, который бы не давал таких гарантий.
Таким образом, "обычно" слишком широкий.
При взгляде на специфику c компиляторы / платформы, ваши примеры приводят ко второму вопросу:
Будут ли мои примеры с неопределенным поведением работать на определенных платформах?
Вы уже знаете, что в примерах есть UB. Если компилятор обнаружит это, он может делать с этим кодом все, что захочет, например,
- отбросить все это
- сгенерировать код, который форматирует ваш SSD
- сгенерировать код это делает то, на что вы надеетесь
Проблема с UB заключается в том, что даже если сегодня ваш компилятор выберет третий вариант, нет никакой гарантии, что он сделает это снова завтра.
См. Также cppreference
Итак, ответ на второй вопрос: ну, может быть, но нет гарантии.