Я знаю, что когда вы делаете определенные вещи в программе на C, результаты undefined. Однако компилятор не должен генерировать неверный (машинный) код, не так ли? Было бы разумным, если бы код сделал не то, или код генерировал segfault или что-то еще...
Предполагается, что это произойдет в соответствии со спецификацией компилятора или это ошибка в компиляторе?
Здесь (простая) программа, которую я использую:
int main() {
char *ptr = 0;
*(ptr) = 0;
}
Я компилирую с -O3
. Это не должно генерировать неверные аппаратные инструкции, верно? С -O0
я получаю segfault при запуске кода. Это кажется намного более разумным.
Изменить: он генерирует инструкцию ud2
...