Perl / perl5

đŸȘ The Perl programming language
https://dev.perl.org/perl5/
Other
1.96k stars 555 forks source link

Cygwin build failure with v5.27.11-16-g71e845c342 #16532

Open p5pRT opened 6 years ago

p5pRT commented 6 years ago

Migrated from rt.perl.org#133152 (status was 'open')

Searchable as RT133152$

p5pRT commented 6 years ago

From @tonycoz

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

Inline Patch ```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   .

p5pRT commented 6 years ago

From @khwilliamson

What can be done about this? -- Karl Williamson

p5pRT commented 6 years ago

The RT System itself - Status changed from 'new' to 'open'

p5pRT commented 6 years ago

From @iabyn

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\, * 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.

p5pRT commented 6 years ago

From Stromeko@nexgo.de

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.

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

p5pRT commented 6 years ago

From @khwilliamson

On 04/30/2018 12​:29 PM\, Achim Gratz wrote​:

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?

p5pRT commented 6 years ago

From Stromeko@nexgo.de

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.

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

p5pRT commented 6 years ago

From @tonycoz

On Tue\, 01 May 2018 11​:56​:06 -0700\, Stromeko@​nexgo.de wrote​:

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

p5pRT commented 6 years ago

From @tonycoz

0001-perl-133152-nostdio.h-is-broken-don-t-use-it.patch ```diff From a1132ca5510c92bb8496e298ceea926f411f8a5d Mon Sep 17 00:00:00 2001 From: Tony Cook 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 ```
p5pRT commented 6 years ago

From Stromeko@nexgo.de

"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.

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

p5pRT commented 6 years ago

From @tonycoz

On Wed\, 02 May 2018 11​:56​:02 -0700\, Stromeko@​nexgo.de wrote​:

"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.

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

p5pRT commented 5 years ago

From @iabyn

On Tue\, May 01\, 2018 at 06​:50​:13PM -0700\, Tony Cook via RT wrote​:

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.

I propose that this ticket be moved from the 5.30.0 to the 5.32.0 blockers list.

-- This email is confidential\, and now that you have read it you are legally obliged to shoot yourself. Or shoot a lawyer\, if you prefer. If you have received this email in error\, place it in its original wrapping and return for a full refund. By opening this email\, you accept that Elvis lives.