newlocale(3) appears to be broken?
David Chisnall
theraven at FreeBSD.org
Fri Apr 24 09:31:35 UTC 2015
On 23 Apr 2015, at 19:29, Steve Kargl <sgk at troutmask.apl.washington.edu> wrote:
>
> It appears that newlocale(3) is broken.
>
> First, the manpage indicates that one
> needs to use
>
> #include <xlocale>
This is a typo in the man page, it should be xlocale.h
>
> which leads to
>
> troutmask:sgk[204] cc -o z r.c
> r.c:1:10: fatal error: 'xlocale' file not found
> #include <xlocale>
> ^
> 1 error generated.
>
> next the manpage says
>
> STANDARDS
> This function conforms to IEEE Std 1003.1-2008 (``POSIX.1'').
>
> However, http://pubs.opengroup.org/stage7tc1/functions/newlocale.html
> says newlocale is declared in locale.h.
If you have the correct preprocessor definitions to indicate a POSIX2008 target, then they are visible in locale.h. For earlier POSIX targets, they are exposed unconditionally in xlocale.h. This is for Darwin (and, I think, GNU) compatibility. I think that we should probably change the man pages to only refer to locale.h.
>
> Now consider
>
> % cat r.c
>
> #include <locale.h>
>
> int
> main(void)
> {
> locale_t a;
> a = newlocale(0, "C", 0);
> if (a)
> return 0;
> else
> return 1;
> }
>
> troutmask:sgk[206] cc -o z -static r.c && ./z
> Segmentation fault (core dumped)
>
> troutmask:sgk[206] cc -o z -static r.c && ./z
> Segmentation fault (core dumped)
> troutmask:sgk[207] gdb782 z z.core
> [New process 100313]
> Core was generated by `z'.
> Program terminated with signal SIGSEGV, Segmentation fault.
> #0 0x0000000000415798 in newlocale ()
> (gdb) bt
> #0 0x0000000000415798 in newlocale ()
> #1 0x0000000000400434 in main ()
I can reproduce this, though only with static linking. Omitting the -static results in the program working correctly. It appears to be caused by __xlocale_C_ctype being declared const, so the reference count manipulation causes segmentation faults. I’m a bit surprised that this doesn’t happen in the dynamically linked version. I’m testing a fix now.
David
More information about the freebsd-standards
mailing list