Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

h2ph produces invalid code for a struct definition with #define #11615

Open
p5pRT opened this issue Aug 30, 2011 · 3 comments
Open

h2ph produces invalid code for a struct definition with #define #11615

p5pRT opened this issue Aug 30, 2011 · 3 comments

Comments

@p5pRT
Copy link

p5pRT commented Aug 30, 2011

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

Searchable as RT98062$

@p5pRT
Copy link
Author

p5pRT commented Aug 30, 2011

From mmaslano@redhat.com

Created by mmaslano@redhat.com

A definition of the form​:
#define struct foo {int bar;}
results in incorrect code generation, leading to a perl warning.
It's reproducible with blead perl, but also older are affected (tested
with perl 5.8.8).

Create a test file test.h, which contains​:
/* derived from standard includes */
# define __STD_TYPE typedef
#define __FSID_T_TYPE struct { int __val[2]; }
__STD_TYPE __FSID_T_TYPE __fsid_t; /* Type of file system IDs. */

Run command​:
h2ph -d . test.h

And run perl on test.ph​:
perl -w test.ph
Scalar found where operator expected at test.ph line 9, near "'int' $__val"
(Missing operator before $__val?)
syntax error at test.ph line 9, near "'struct struct' { "
syntax error at test.ph line 10, near "}"
Execution of test.ph aborted due to compilation errors.

Proposed fix by Martin Poole​:

Inline Patch
--- /usr/bin/h2ph       2009-10-05 22:14:35.000000000 +0530
+++ /usr/bin/h2ph.new   2009-10-05 22:14:29.000000000 +0530
@@ -454,7 +454,8 @@ sub expr {
        s/^([_a-zA-Z]\w*)//     && do {
            my $id = $1;
            if ($id eq 'struct' || $id eq 'union') {
-               s/^\s+(\w+)//;
+               # Get the entire thing to cater for an anonymous
struct/union \+ s/^\\s\+\(\.\+\)//;   $id \.= ' ' \. $1;   $isatype\{$id\} = 1;   \} elsif \($id =~ /^\(\(un\)?signed\)|\(long\)|\(short\)$/\) \{
Perl Info

Flags:
    category=utilities
    severity=medium

This perlbug was built using Perl 5.12.4 in the Fedora build system.
It is being executed now by Perl 5.12.4 - Fri Jun 24 13:23:32 UTC 2011.

Site configuration information for perl 5.12.4:

Configured by Red Hat, Inc. at Fri Jun 24 13:23:32 UTC 2011.

Summary of my perl5 (revision 5 version 12 subversion 4) configuration:

  Platform:
    osname=linux, osvers=2.6.32-131.2.1.el6.x86_64,
archname=x86_64-linux-thread-multi
    uname='linux x86-01.phx2.fedoraproject.org 2.6.32-131.2.1.el6.x86_64
#1 smp wed may 18 07:07:37 edt 2011 x86_64 x86_64 x86_64 gnulinux '
    config_args='-des -Doptimize=-O2 -g -pipe -Wall
-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector
--param=ssp-buffer-size=4 -m64 -mtune=generic
-Dccdlflags=-Wl,--enable-new-dtags -DDEBUGGING=-g -Dversion=5.12.4
-Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red
Hat, Inc. -Dprefix=/usr -Dvendorprefix=/usr -Dsiteprefix=/usr/local
-Dsitelib=/usr/local/share/perl5 -Dsitearch=/usr/local/lib64/perl5
-Dprivlib=/usr/share/perl5 -Dvendorlib=/usr/share/perl5
-Darchlib=/usr/lib64/perl5 -Dvendorarch=/usr/lib64/perl5
-Darchname=x86_64-linux-thread-multi -Dlibpth=/usr/local/lib64 /lib64
/usr/lib64 -Duseshrplib -Dusethreads -Duseithreads
-Dusedtrace=/usr/bin/dtrace -Duselargefiles -Dd_semctl_semun -Di_db
-Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio
-Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly
-Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto
-Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto
-Ud_endservent_r_proto -Ud_setservent_r_proto -Dscriptdir=/usr/bin
-Dotherlibdirs=/usr/local/lib64/perl5/site_perl/5.10.0/x86_64-linux-thread-multi:/usr/local/lib/perl5/site_perl/5.10.0:/usr/lib64/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi:/usr/lib/perl5/vendor_perl:/usr/lib/perl5/site_perl'
    hint=recommended, useposix=true, d_sigaction=define
    useithreads=define, usemultiplicity=define
    useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
    use64bitint=define, use64bitall=define, uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing
-pipe -fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64',
    optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions
-fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe
-fstack-protector -I/usr/local/include'
    ccversion='', gccversion='4.5.1 20100924 (Red Hat 4.5.1-4)',
gccosandvers=''
    intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
    ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t',
lseeksize=8
    alignbytes=8, prototype=define
  Linker and Libraries:
    ld='gcc', ldflags =' -fstack-protector'
    libpth=/usr/local/lib64 /lib64 /usr/lib64
    libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread
-lc -lgdbm_compat
    perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=, so=so, useshrplib=true, libperl=libperl.so
    gnulibc_version='2.13'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef,
ccdlflags='-Wl,--enable-new-dtags -Wl,-rpath,/usr/lib64/perl5/CORE'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall
-Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector
--param=ssp-buffer-size=4 -m64 -mtune=generic'

Locally applied patches:



@INC for perl 5.12.4:
    /usr/local/lib64/perl5
    /usr/local/share/perl5
    /usr/lib64/perl5
    /usr/share/perl5
    /usr/lib64/perl5
    /usr/share/perl5
    /usr/local/lib64/perl5/site_perl/5.10.0/x86_64-linux-thread-multi
    /usr/local/lib/perl5/site_perl/5.10.0
    /usr/lib64/perl5/vendor_perl/5.10.0/x86_64-linux-thread-multi
    /usr/lib/perl5/vendor_perl
    /usr/lib/perl5/site_perl
    .


Environment for perl 5.12.4:
    HOME=/home/marca
    LANG=en_US.UTF-8
    LANGUAGE=
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)

PATH=/home/marca/perl5/perlbrew/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/local/sbin:/usr/sbin:/sbin:/home/marca/bin
    PERLBREW_PATH=/home/marca/perl5/perlbrew/bin
    PERLBREW_ROOT=/home/marca/perl5/perlbrew
    PERLBREW_VERSION=0.27
    PERL_BADLANG (unset)
    SHELL=/bin/bash


@p5pRT
Copy link
Author

p5pRT commented Nov 11, 2011

From mmaslano@redhat.com

After regression testing this patch is not correct, because it would
break many other *.ph files.
Good test is for example​:
perl -w /usr/lib/perl5/sys/socket.ph

It looks like there is needed skip of { and } in struct or union. But
I'm not sure what should be the correct output from *.h file.

@p5pRT
Copy link
Author

p5pRT commented Nov 11, 2011

mmaslano@redhat.com - Status changed from 'new' to 'open'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants