Формально, единственная функция, в которой можно не делать
return - это именно
main.
В остальных случаях, если функция что-то возвращает, наличие
return обязательно - иначе будет UB.
Почему для
main исключение - никто не знает, потому что параграф в стандарте языка, на который ссылается другой параграф - потерялся:
I looked it up. I believe this was introduced with C99, and apparently the C99 rationale is defect. It has comments for 5.1.2.2.1 Program startup, then labels the next chapter 5.1.2.3 Program execution. It should have been 5.1.2.2. As a consequence of this, the rationale for Program termination that should have been in the real chapter 5.1.2.3, has gone missing in action. Thus, main allows no return code in C99 and there exists no rational reason why.
Источник