Skip Menu |
Report information
Id: 133152
Status: open
Priority: 0/
Queue: perl5

Owner: Nobody
Requestors: tonyc <tony [at] develop-help.com>
Cc:
AdminCc:

Operating System: (no value)
PatchStatus: (no value)
Severity: low
Type: unknown
Perl Version: (no value)
Fixed In: (no value)

Attachments
0001-perl-133152-nostdio.h-is-broken-don-t-use-it.patch



To: perlbug [...] perl.org
From: Tony Cook <tony [...] develop-help.com>
Subject: Cygwin build failure with v5.27.11-16-g71e845c342
Date: Wed, 25 Apr 2018 10:18:12 +1000
Download (untitled) / with headers
text/plain 8.5k
A vanilla build of blead on: $ uname -a CYGWIN_NT-6.1 phobos 2.10.0(0.325/5/3) 2018-02-02 15:16 x86_64 Cygwin Fails with: $ make locale.o gcc -c -DPERL_CORE -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_FORTIFY_SOURCE=2 -std=c89 -O3 -Wall -Werror=declaration-after-statement -Werror=pointer-arith -Wextra -Wc++-compat -Wwrite-strings locale.c In file included from /usr/include/ssp/stdlib.h:4:0, from /usr/include/stdlib.h:338, from perl.h:819, from locale.c:49: /usr/include/ssp/wchar.h:78:1: error: conflicting types for ‘fgetws’ __ssp_decl(wchar_t *, fgetws, (wchar_t *__restrict __buf, int __wlen, FILE *__restrict __fp)) ^ In file included from locale.c:54:0: /usr/include/wchar.h:228:10: note: previous declaration of ‘fgetws’ was here wchar_t *fgetws (wchar_t *__restrict, int, __FILE *__restrict); ^~~~~~ In file included from /usr/include/ssp/stdlib.h:4:0, from /usr/include/stdlib.h:338, from perl.h:819, from locale.c:49: /usr/include/ssp/wchar.h:86:1: error: conflicting types for ‘fgetws_unlocked’ __ssp_decl(wchar_t *, fgetws_unlocked, (wchar_t *__buf, int __wlen, FILE *__fp)) ^ In file included from locale.c:54:0: /usr/include/wchar.h:261:10: note: previous declaration of ‘fgetws_unlocked’ was here wchar_t *fgetws_unlocked (wchar_t *__restrict, int, __FILE *__restrict); ^~~~~~~~~~~~~~~ make: *** [GNUmakefile:245: locale.o] Error 1 If I modify locale.c to skip the brokeness that is nostdio.h then locale.o builds successfully: tony@phobos ~/dev/perl/git/perl $ make locale.o gcc -c -DPERL_CORE -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_FORTIFY_SOURCE=2 -std=c89 -O3 -Wall -Werror=declaration-after-statement -Werror=pointer-arith -Wextra -Wc++-compat -Wwrite-strings locale.c tony@phobos ~/dev/perl/git/perl $ git diff diff --git a/locale.c b/locale.c index 7653340477..f6e946fe15 100644 --- a/locale.c +++ b/locale.c @@ -43,6 +43,7 @@ * this end, and is retained, #ifdef'd out. */ +#define PERLIO_NOT_STDIO 0 #include "EXTERN.h" #define PERL_IN_LOCALE_C #include "perl_langinfo.h" But POSIX.o fails with the same problem: gcc -c -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wall -Werror=declaration-after-statement -Werror=pointer-arith -Wextra -Wc++-compat -Wwrite-strings -DUSEIMPORTLIB -O3 -DVERSION=\"1.84\" -DXS_VERSION=\"1.84\" "-I../.." POSIX.c In file included from /usr/include/sys/time.h:268:0, from /usr/include/sys/resource.h:12, from /usr/include/sys/wait.h:13, from ../../perl.h:842, from POSIX.xs:19: POSIX.xs:1351:7: warning: ‘_tzname’ redeclared without dllimport attribute: previous dllimport ignored [-Wattributes] char *tzname[] = { "" , "" }; ^ POSIX.xs:1351:20: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] char *tzname[] = { "" , "" }; ^~ POSIX.xs:1351:25: warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers] char *tzname[] = { "" , "" }; ^~ In file included from /usr/include/ssp/stdlib.h:4:0, from /usr/include/stdlib.h:338, from ../../perl.h:819, from POSIX.xs:19: /usr/include/ssp/wchar.h:78:1: error: conflicting types for ‘fgetws’ __ssp_decl(wchar_t *, fgetws, (wchar_t *__restrict __buf, int __wlen, FILE *__restrict __fp)) ^ In file included from POSIX.c:4457:0: /usr/include/wchar.h:228:10: note: previous declaration of ‘fgetws’ was here wchar_t *fgetws (wchar_t *__restrict, int, __FILE *__restrict); ^~~~~~ In file included from /usr/include/ssp/stdlib.h:4:0, from /usr/include/stdlib.h:338, from ../../perl.h:819, from POSIX.xs:19: /usr/include/ssp/wchar.h:86:1: error: conflicting types for ‘fgetws_unlocked’ __ssp_decl(wchar_t *, fgetws_unlocked, (wchar_t *__buf, int __wlen, FILE *__fp)) ^ In file included from POSIX.c:4457:0: /usr/include/wchar.h:261:10: note: previous declaration of ‘fgetws_unlocked’ was here wchar_t *fgetws_unlocked (wchar_t *__restrict, int, __FILE *__restrict); ^~~~~~~~~~~~~~~ POSIX.xs: In function ‘XS_POSIX_cuserid’: POSIX.xs:3712:12: warning: implicit declaration of function ‘cuserid’ [-Wimplicit-function-declaration] RETVAL = cuserid(s); ^~~~~~~ POSIX.xs:3712:10: warning: assignment makes pointer from integer without a cast -Wint-conversion] RETVAL = cuserid(s); ^ POSIX.xs: In function ‘my_rint’: POSIX.xs:1082:1: warning: control reaches end of non-void function [-Wreturn-typ ] } ^ make[1]: *** [Makefile:335: POSIX.o] Error 1 make[1]: Leaving directory '/home/tony/dev/perl/git/perl/ext/POSIX' Unsuccessful make(ext/POSIX): code=512 at make_ext.pl line 570. make: *** [GNUmakefile:585: lib/auto/POSIX/POSIX.dll] Error 2 Tony $ ./miniperl -Ilib -V Summary of my perl5 (revision 5 version 28 subversion 0) configuration: Derived from: 71e845c3420f2496b845cf717d584dcaa063f4bf Platform: osname=cygwin osvers=2.10.0(0.32553) archname=cygwin-thread-multi uname='cygwin_nt-6.1 phobos 2.10.0(0.32553) 2018-02-02 15:16 x86_64 cygwin ' config_args='-des -Dusedevel' hint=recommended useposix=true d_sigaction=define useithreads=define usemultiplicity=define use64bitint=define use64bitall=define uselongdouble=undef usemymalloc=n default_inc_excludes_dot=define bincompat5005=undef Compiler: cc='gcc' ccflags ='-DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_FORTIFY_SOURCE=2' optimize='-O3' cppflags='-DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong' ccversion='' gccversion='6.4.0' gccosandvers='' intsize=4 longsize=8 ptrsize=8 doublesize=8 byteorder=12345678 doublekind=3 d_longlong=define longlongsize=8 d_longdbl=define longdblsize=16 longdblkind=3 ivtype='long' ivsize=8 nvtype='double' nvsize=8 Off_t='off_t' lseeksize=8 alignbytes=8 prototype=define Linker and Libraries: ld='g++' ldflags =' -Wl,--enable-auto-import -Wl,--export-all-symbols -Wl,--enable-auto-image-base -fstack-protector-strong -L/usr/local/lib' libpth=/usr/lib /usr/lib/gcc/x86_64-pc-cygwin/6.4.0/../../../../lib/../include/w32api /usr/local/lib /lib libs=-lpthread -ldl perllibs=-lpthread -ldl libc=/usr/lib/libc.a so=dll useshrplib=true libperl=cygperl5_28_0.dll gnulibc_version='' Dynamic Linking: dlsrc=dl_dlopen.xs dlext=dll d_dlsymun=undef ccdlflags=' ' cccdlflags=' ' lddlflags=' --shared -Wl,--enable-auto-import -Wl,--export-all-symbols -Wl,--enable-auto-image-base -L/usr/local/lib -fstack-protector-strong' Characteristics of this binary (from libperl): Compile-time options: HAS_TIMES MULTIPLICITY PERLIO_LAYERS PERL_COPY_ON_WRITE PERL_DONT_CREATE_GVSV PERL_EXTERNAL_GLOB PERL_IMPLICIT_CONTEXT PERL_IS_MINIPERL PERL_MALLOC_WRAP PERL_OP_PARENT PERL_PRESERVE_IVUV PERL_USE_DEVEL PERL_USE_SAFE_PUTENV USE_64_BIT_ALL USE_64_BIT_INT USE_ITHREADS USE_LARGE_FILES USE_LOCALE USE_LOCALE_COLLATE USE_LOCALE_CTYPE USE_LOCALE_NUMERIC USE_LOCALE_TIME USE_PERLIO USE_PERL_ATOF USE_REENTRANT_API USE_SITECUSTOMIZE Built under cygwin Compiled at Apr 25 2018 10:01:22 @INC: /home/tony/dev/perl/git/perl/cpan/AutoLoader/lib /home/tony/dev/perl/git/perl/dist/Carp/lib /home/tony/dev/perl/git/perl/dist/PathTools /home/tony/dev/perl/git/perl/dist/PathTools/lib /home/tony/dev/perl/git/perl/cpan/ExtUtils-Install/lib /home/tony/dev/perl/git/perl/cpan/ExtUtils-MakeMaker/lib /home/tony/dev/perl/git/perl/cpan/ExtUtils-Manifest/lib /home/tony/dev/perl/git/perl/cpan/File-Path/lib /home/tony/dev/perl/git/perl/ext/re /home/tony/dev/perl/git/perl/dist/Term-ReadLine/lib /home/tony/dev/perl/git/perl/dist/Exporter/lib /home/tony/dev/perl/git/perl/ext/File-Find/lib /home/tony/dev/perl/git/perl/cpan/Text-Tabs/lib /home/tony/dev/perl/git/perl/dist/constant/lib /home/tony/dev/perl/git/perl/cpan/version/lib /home/tony/dev/perl/git/perl/lib .
RT-Send-CC: perl5-porters [...] perl.org
What can be done about this? -- Karl Williamson
Date: Mon, 30 Apr 2018 12:26:01 +0100
To: perl5-porters [...] perl.org
From: Dave Mitchell <davem [...] iabyn.com>
Subject: Re: [perl #133152] Cygwin build failure with v5.27.11-16-g71e845c342
Download (untitled) / with headers
text/plain 1.2k
On Tue, Apr 24, 2018 at 05:18:24PM -0700, Tony Cook (via RT) wrote: Show quoted text
> $ make locale.o > gcc -c -DPERL_CORE -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_FORTIFY_SOURCE=2 -std=c89 -O3 -Wall -Werror=declaration-after-statement -Werror=pointer-arith -Wextra -Wc++-compat -Wwrite-strings locale.c > In file included from /usr/include/ssp/stdlib.h:4:0, > from /usr/include/stdlib.h:338, > from perl.h:819, > from locale.c:49: > /usr/include/ssp/wchar.h:78:1: error: conflicting types for ‘fgetws’ > __ssp_decl(wchar_t *, fgetws, (wchar_t *__restrict __buf, int __wlen, FILE *__restrict __fp)) > ^ > In file included from locale.c:54:0: > /usr/include/wchar.h:228:10: note: previous declaration of ‘fgetws’ was here > wchar_t *fgetws (wchar_t *__restrict, int, __FILE *__restrict); > ^~~~~~
Do you know any of: * what the ssp/ include files are for, * why they have alternate definitions of fgetws etc, * why perl redefining a bunch of stdio macros cause both versions to be included? -- "There's something wrong with our bloody ships today, Chatfield." -- Admiral Beatty at the Battle of Jutland, 31st May 1916.
Date: Mon, 30 Apr 2018 20:29:13 +0200
Subject: Re: [perl #133152] Cygwin build failure with v5.27.11-16-g71e845c342
From: Achim Gratz <Stromeko [...] nexgo.de>
To: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 1.7k
Dave Mitchell writes: Show quoted text
> On Tue, Apr 24, 2018 at 05:18:24PM -0700, Tony Cook (via RT) wrote:
>> $ make locale.o >> gcc -c -DPERL_CORE -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_FORTIFY_SOURCE=2 -std=c89 -O3 -Wall -Werror=declaration-after-statement -Werror=pointer-arith -Wextra -Wc++-compat -Wwrite-strings locale.c >> In file included from /usr/include/ssp/stdlib.h:4:0, >> from /usr/include/stdlib.h:338, >> from perl.h:819, >> from locale.c:49: >> /usr/include/ssp/wchar.h:78:1: error: conflicting types for ‘fgetws’ >> __ssp_decl(wchar_t *, fgetws, (wchar_t *__restrict __buf, int __wlen, FILE *__restrict __fp)) >> ^ >> In file included from locale.c:54:0: >> /usr/include/wchar.h:228:10: note: previous declaration of ‘fgetws’ was here >> wchar_t *fgetws (wchar_t *__restrict, int, __FILE *__restrict); >> ^~~~~~
> > Do you know any of: > > * what the ssp/ include files are for,
That's an implementation detail of how the fortified versions of those functions are provided. AFAIK, ssp == stack smashing protection. Show quoted text
> * why they have alternate definitions of fgetws etc,
That's what you get when fortification is requested. Show quoted text
> * why perl redefining a bunch of stdio macros cause both versions to be > included?
You'd have to ask someone who knows the details of how the feature test macros work, probably Yaakov Selkowitz. And no, I don't think you should redefine any macros that are already existing. Regards, Achim. -- +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+ Wavetables for the Terratec KOMPLEXER: http://Synth.Stromeko.net/Downloads.html#KomplexerWaves
Date: Tue, 1 May 2018 12:18:05 -0600
Subject: Re: [perl #133152] Cygwin build failure with v5.27.11-16-g71e845c342
From: Karl Williamson <public [...] khwilliamson.com>
To: Achim Gratz <Stromeko [...] nexgo.de>, perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 1.7k
On 04/30/2018 12:29 PM, Achim Gratz wrote: Show quoted text
> Dave Mitchell writes:
>> On Tue, Apr 24, 2018 at 05:18:24PM -0700, Tony Cook (via RT) wrote:
>>> $ make locale.o >>> gcc -c -DPERL_CORE -DPERL_USE_SAFE_PUTENV -U__STRICT_ANSI__ -D_GNU_SOURCE -fwrapv -fno-strict-aliasing -pipe -fstack-protector-strong -D_FORTIFY_SOURCE=2 -std=c89 -O3 -Wall -Werror=declaration-after-statement -Werror=pointer-arith -Wextra -Wc++-compat -Wwrite-strings locale.c >>> In file included from /usr/include/ssp/stdlib.h:4:0, >>> from /usr/include/stdlib.h:338, >>> from perl.h:819, >>> from locale.c:49: >>> /usr/include/ssp/wchar.h:78:1: error: conflicting types for ‘fgetws’ >>> __ssp_decl(wchar_t *, fgetws, (wchar_t *__restrict __buf, int __wlen, FILE *__restrict __fp)) >>> ^ >>> In file included from locale.c:54:0: >>> /usr/include/wchar.h:228:10: note: previous declaration of ‘fgetws’ was here >>> wchar_t *fgetws (wchar_t *__restrict, int, __FILE *__restrict); >>> ^~~~~~
>> >> Do you know any of: >> >> * what the ssp/ include files are for,
> > That's an implementation detail of how the fortified versions of those > functions are provided. AFAIK, ssp == stack smashing protection. >
>> * why they have alternate definitions of fgetws etc,
> > That's what you get when fortification is requested. >
>> * why perl redefining a bunch of stdio macros cause both versions to be >> included?
> > You'd have to ask someone who knows the details of how the feature test > macros work, probably Yaakov Selkowitz. And no, I don't think you > should redefine any macros that are already existing.
So a potential fix for this is to not fortify the source for this platform?
Date: Tue, 01 May 2018 20:55:49 +0200
Subject: Re: [perl #133152] Cygwin build failure with v5.27.11-16-g71e845c342
From: Achim Gratz <Stromeko [...] nexgo.de>
To: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 829b
Karl Williamson writes: Show quoted text
>> You'd have to ask someone who knows the details of how the feature test >> macros work, probably Yaakov Selkowitz. And no, I don't think you >> should redefine any macros that are already existing.
> > So a potential fix for this is to not fortify the source for this platform?
No, the platform default is FORTIFY_SOURCE=2 adn I'd not veer from it for such a key piece of the whole. I haven't yet had the chance to look into what exactly happens, but at least until the recently released 5.26.2 fortification was possible and produced no such errors; that was using the same Cygwin and compiler version I think. Regards, Achim. -- +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+ Wavetables for the Terratec KOMPLEXER: http://Synth.Stromeko.net/Downloads.html#KomplexerWaves
RT-Send-CC: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 1.9k
On Tue, 01 May 2018 11:56:06 -0700, Stromeko@nexgo.de wrote: Show quoted text
> Karl Williamson writes:
> >> You'd have to ask someone who knows the details of how the feature > >> test > >> macros work, probably Yaakov Selkowitz. And no, I don't think you > >> should redefine any macros that are already existing.
> > > > So a potential fix for this is to not fortify the source for this > > platform?
> > No, the platform default is FORTIFY_SOURCE=2 adn I'd not veer from it > for such a key piece of the whole. I haven't yet had the chance to > look > into what exactly happens, but at least until the recently released > 5.26.2 fortification was possible and produced no such errors; that > was > using the same Cygwin and compiler version I think.
There's two issues here: 1) cygwin declares fgetws() when stdlib.h is included, but that name isn't reserved to the implementation unless wchar.h is included (C11 7.1.3) So a C program that defines a fgetws() function but doesn't include wchar.h would be conforming, but this would break if stdlib.h is included, making cygwin non-conforming. But I wouldn't be too surprised to find other implementations leak in similar ways. 2) Perl includes wchar.h which uses the FILE type (you're meant to #include stdio.h to use the I/O functions with the C standard[2], but POSIX requires wchar.h to define the FILE type), but nostdio.h defines a macro FILE, using a named reserved to the implementation[1]. I think the real fix is probably to eliminate nostdio.h - its use of reserved names leads to random issues as we update perl and as platforms update their implementations. The attached patch doesn't remove nostdio.h, it just prevents perlio.h from including it. Tony [1] we use some other names more indirectly reserved, eg. nostdio.h defines _CANNOT and __STDIO_LOADED [2] I couldn't find wording for that, but every I/O function synopsis in C11 that I looked at for wchar.h includes stdio.h then wchar.h
Subject: 0001-perl-133152-nostdio.h-is-broken-don-t-use-it.patch
From a1132ca5510c92bb8496e298ceea926f411f8a5d Mon Sep 17 00:00:00 2001 From: Tony Cook <tony@develop-help.com> Date: Wed, 2 May 2018 11:15:30 +1000 Subject: [PATCH] (perl #133152) nostdio.h is broken, don't use it --- perlio.h | 40 ---------------------------------------- 1 file changed, 40 deletions(-) diff --git a/perlio.h b/perlio.h index d515020618..f72945e8a5 100644 --- a/perlio.h +++ b/perlio.h @@ -88,46 +88,6 @@ PERL_CALLCONV void PerlIO_clone(pTHX_ PerlInterpreter *proto, /* ----------- End of implementation choices ---------- */ -/* We now need to determine what happens if source trys to use stdio. - * There are three cases based on PERLIO_NOT_STDIO which XS code - * can set how it wants. - */ - -#ifdef PERL_CORE -/* Make a choice for perl core code - - currently this is set to try and catch lingering raw stdio calls. - This is a known issue with some non UNIX ports which still use - "native" stdio features. -*/ -# ifndef PERLIO_NOT_STDIO -# define PERLIO_NOT_STDIO 1 -# endif -#else -# ifndef PERLIO_NOT_STDIO -# define PERLIO_NOT_STDIO 0 -# endif -#endif - -#ifdef PERLIO_NOT_STDIO -#if PERLIO_NOT_STDIO -/* - * PERLIO_NOT_STDIO #define'd as 1 - * Case 1: Strong denial of stdio - make all stdio calls (we can think of) errors - */ -#include "nostdio.h" -#else /* if PERLIO_NOT_STDIO */ -/* - * PERLIO_NOT_STDIO #define'd as 0 - * Case 2: Declares that both PerlIO and stdio can be used - */ -#endif /* if PERLIO_NOT_STDIO */ -#else /* ifdef PERLIO_NOT_STDIO */ -/* - * PERLIO_NOT_STDIO not defined - * Case 3: Try and fake stdio calls as PerlIO calls - */ -#include "fakesdio.h" -#endif /* ifndef PERLIO_NOT_STDIO */ /* ----------- fill in things that have not got #define'd ---------- */ -- 2.17.0
Date: Wed, 02 May 2018 20:55:46 +0200
Subject: Re: [perl #133152] Cygwin build failure with v5.27.11-16-g71e845c342
From: Achim Gratz <Stromeko [...] nexgo.de>
To: perl5-porters [...] perl.org
Download (untitled) / with headers
text/plain 1.5k
"Tony Cook via RT" writes: Show quoted text
> 1) cygwin declares fgetws() when stdlib.h is included, but that name > isn't reserved to the implementation unless wchar.h is included (C11 > 7.1.3) > > So a C program that defines a fgetws() function but doesn't include > wchar.h would be conforming, but this would break if stdlib.h is > included, making cygwin non-conforming. > > But I wouldn't be too surprised to find other implementations leak in > similar ways.
For starters, unless you request strict POSIX/ANSI behaviour from the compiler, that line of argumentation can't be conclusive. IIRC, you've been compiling with GNU_SOURCE at least, so that may already poke holes in the conformance. Anyway, whether there is a bug or not I can't really tell myself and will defer to Yaakov or Eric, who are the Cygwin experts on these topics. Show quoted text
> 2) Perl includes wchar.h which uses the FILE type (you're meant to > #include stdio.h to use the I/O functions with the C standard[2], but > POSIX requires wchar.h to define the FILE type), but nostdio.h defines > a macro FILE, using a named reserved to the implementation[1]. > > I think the real fix is probably to eliminate nostdio.h - its use of > reserved names leads to random issues as we update perl and as > platforms update their implementations. > > The attached patch doesn't remove nostdio.h, it just prevents perlio.h > from including it.
What is nostdio.h useful for anyway? Just asking. Regards, Achim. -- +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+ Samples for the Waldorf Blofeld: http://Synth.Stromeko.net/Downloads.html#BlofeldSamplesExtra
RT-Send-CC: perl5-porters [...] perl.org
On Wed, 02 May 2018 11:56:02 -0700, Stromeko@nexgo.de wrote: Show quoted text
> "Tony Cook via RT" writes:
> > 1) cygwin declares fgetws() when stdlib.h is included, but that name > > isn't reserved to the implementation unless wchar.h is included (C11 > > 7.1.3) > > > > So a C program that defines a fgetws() function but doesn't include > > wchar.h would be conforming, but this would break if stdlib.h is > > included, making cygwin non-conforming. > > > > But I wouldn't be too surprised to find other implementations leak in > > similar ways.
> > For starters, unless you request strict POSIX/ANSI behaviour from the > compiler, that line of argumentation can't be conclusive. IIRC, you've > been compiling with GNU_SOURCE at least, so that may already poke holes > in the conformance. Anyway, whether there is a bug or not I can't > really tell myself and will defer to Yaakov or Eric, who are the Cygwin > experts on these topics.
You're probably right - I only tested within the perl build, and didn't test a strict ANSI build. Show quoted text
>
> > 2) Perl includes wchar.h which uses the FILE type (you're meant to > > #include stdio.h to use the I/O functions with the C standard[2], but > > POSIX requires wchar.h to define the FILE type), but nostdio.h defines > > a macro FILE, using a named reserved to the implementation[1]. > > > > I think the real fix is probably to eliminate nostdio.h - its use of > > reserved names leads to random issues as we update perl and as > > platforms update their implementations. > > > > The attached patch doesn't remove nostdio.h, it just prevents perlio.h > > from including it.
> > What is nostdio.h useful for anyway? Just asking.
From the header itself: /* * Strong denial of stdio - make all stdio calls (we can think of) errors */ /* This is a 1st attempt to stop other include files pulling in real <stdio.h>. A more ambitious set of possible symbols can be found in sfio.h (inside an _cplusplus gard). It is completely pointless as we have already included it ourselves. */ I assume it was more justifiable when PerlIO was new to enforce perl's implementation using PerlIO rather than stdio. Tony


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org