Confused by segfault with legitimate call to strerror(3) on amd64 / sysctl (3) setting `odd' errno's

Christoph Mallon christoph.mallon at gmx.de
Fri Jan 16 02:21:27 PST 2009


Christian Kandeler schrieb:
> On Friday 16 January 2009 09:53, Christoph Mallon wrote:
> 
>>> int
>>> main() {
>>>
>>>         int mib[4];
>>>
>>>         size_t len;
>>>
>>>         if (sysctlnametomib("kern.ipc.shmmax", mib, &len) != 0) {
>>>                 printf("Errno: %d\n", errno);
>>>                 errx(errno, "Error: %s", strerror(errno));
>> The use of errno is wrong. printf might change errno. 
> 
> I don't think printf() can set errno. And even if it could, it 

Of course it can. See ISO/IEC 9899:1999 (E) §7.5:3.

> wouldn't matter, because C has call-by-value semantics.

This has nothing to do with call-by-value. errno is read (even twice!) 
*after* the call to printf().


More information about the freebsd-hackers mailing list