Рассмотрим следующий базовый пример:
#include <stdio.h>
int main(void)
{
printf("Hi there!\n");
}
Он вызывает поведение undefined в C89? Я попытался получить некоторый смысл от этого вопроса, но большинство утвержденных ответов утверждают, что он определен в реализации и определенно не UB здесь (с комментариями Кейта Томпсона, который выглядит противоречиво).
Спектр говорит в §3.16. Определения и условные обозначения:
Если требование "должно" или "не должно", которое появляется за пределами ограничение нарушено. поведение undefined. undefined поведение указывается в этом Международном стандарте словами: "undefined поведение" или путем пропуска любого явного определения поведение. В этих трех различиях нет разницы: они все описывают "поведение, которое undefined".
и §5.1.2.2.3 Окончание программы:
Возврат от начального вызова к функции
main
эквивалентен вызывая функциюexit
со значением, возвращаемым функциейmain
как его аргумент. Если функцияmain
выполняет возврат, указывающий нет значения, статус завершения, возвращаемый в среду хоста, undefined.
Мое понимание заключается в том, что в последнем подпункте не рассматривается случай отсутствия возврата, поскольку оператор return
не вызывается никогда, поэтому применяется предыдущий подзапрос.
Однако дальнейшее чтение указывает на что-то другое, §6.6.6.4 Оператор return
:
Если выполняется оператор
return
без выражения, а значение вызова функции используется вызывающим, поведение undefined. Достижение}
, которое завершает функцию, эквивалентно выполнениюreturn
без выражения.
Итак, теперь применяется подкласс 5.1.2.2.3
:
Если функция
main
выполняет возврат, указывающий неважно. статус завершения, возвращаемый в среду хоста, undefined.
Термин "статус завершения - undefined", по-видимому, не является UB, а не каким-либо конкретным поведением, но больше похоже на него за пределами C-стандарта, думая больше: "пусть принимающей среды, о которой нужно беспокоиться, мы отмываем руки отсюда". Это правильная интуиция?