svn commit: r287236 - head/bin/df

Xin Li delphij at delphij.net
Fri Aug 28 08:36:48 UTC 2015



On 8/27/15 21:43, Alexey Dokuchaev wrote:
> On Fri, Aug 28, 2015 at 12:44:59AM +0000, Xin LI wrote:
>> New Revision: 287236
>> URL: https://svnweb.freebsd.org/changeset/base/287236
>>
>> Log:
>>   Use exit() instead of return in main().
> 
> Because?..

Because the explicit exit() have a subtle difference from returning from
main(), and that could confuse static analyzers.  I thought it was
obvious and too much for trivial changes like this.  Let me try again:

C standard defines that when main() returns to the startup code, the
latter is required by the standard to call exit() with main()'s return
value, should main() be defined to return a type compatible with int.
On FreeBSD, this is done by lib/csu/${ARCH}/crt1.c.

Note, however, that return'ing from a C function means the stack
contents, for example, variables defined in function scope, are
discarded.  Therefore, if, let's say one defined a pointer in the
function scope, like:

	void *p;

And then later assign a block of memory allocated from heap to it:

	p = malloc(size);

Since p is in function scope, upon return, it's gone.  If there is no
other pointers that referenced the memory block referenced by p, the
memory block is _technically_ leaked.

This does not matter in practice because exit() or returning from main
are both the points of termination, and the kernel would then reclaim
all memory pages that belongs to the process.  However, doing exit()
makes it more explicit that this is the point of no returns, actually,
it hints the compiler or a static analyzer to do the right thing without
needing to make main() a special case.

Cheers,

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freebsd.org/pipermail/svn-src-head/attachments/20150828/5d9828be/attachment.bin>


More information about the svn-src-head mailing list