It's a perfectly valid C99 program. With C89,
you'd need to add a 'return' statement.
A return statement by itself is equivilent to falling off the end of
the main procedure in C89. A return statement with a value can make
a difference.
In C89, if one does not have a return statement, the status value returned
to the operating system is implementation defined. Failing to use
a return is not a violation of the standard; and the behaviour of
the operating system in response to any given status value is outside
of the standard.
The issue with return and C89 is not that it is required, but rather
that without it, one cannot be certain that the operating system will
be informed that the program was "successful". It is thus more robust
to remove the uncertainty by returning a value. The operating system
may still do Weird Things, but at least you would have given it the
maximum chance to do something useful.