Если не вернуть значение из функции, которая имеет тип возврата не void
, это приводит к неопределенному поведению, но не является семантической ошибкой.
Причина этого, насколько я могу судить, во многом историческая.
C изначально не имел void
, а неявное int
означало, что большинство функций возвращало int
, если явно не объявлено, что оно возвращает что-то еще, даже если не было намерения использовать возвращаемое значение.
Это означает, что многие функции возвращали int, но без явной установки возвращаемого значения, но это было нормально, поскольку вызывающие никогда не будут использовать возвращаемое значение для этих функций.
Некоторые функции возвращали значение, но использовали неявный int
, поскольку int
был подходящим типом возврата.
Это означает, что в пре-1017 * коде было много функций, которые номинально возвращали int
, но которые могли быть объявлены для возврата void
, и множество других функций, которые должны возвращать int
без четкого способа сказать различия. Применение на всех этапах кода return
всех функций, отличных от void
, на любом этапе нарушило бы устаревший код.
Существует также аргумент, что некоторые пути кода в функции могут быть недоступны, но это может быть нелегко определить из простого статического анализа, так зачем применять ненужные return
?