¿Por qué el hecho de salir del final de una función no vacía sin devolver un valor no produce un error de compilación?

Desde que me di cuenta hace muchos años, que esto no produce un error por defecto (al menos en GCC), siempre me he preguntado por qué.

Entiendo que puede emitir marcas de compilación para producir una advertencia, pero ¿no debería ser siempre un error? ¿Por qué tiene sentido que una función no vacía no devuelva un valor para que sea válida?

Un ejemplo según lo solicitado en los comentarios:

#include <stdio.h>
int stringSize()
{
}

int main()
{
    char cstring[5];
    printf( "the last char is: %c\n", cstring[stringSize()-1] ); 
    return 0;
}

... compila.

Respuestas a la pregunta(8)

Su respuesta a la pregunta