Front page | perl.perl5.porters |
Postings from October 2004
Re: [perl #32032] defined may incorrectly returns true in 5.8.X
Thread Next
From:
Austin Schutz
Date:
October 19, 2004 17:13
Subject:
Re: [perl #32032] defined may incorrectly returns true in 5.8.X
Message ID:
20041019170305.GB17425@gblx.net
On Tue, Oct 19, 2004 at 01:21:52PM -0000, Nick Ing-Simmons via RT wrote:
> Austin Schutz <perl5-porters@perl.org> writes:
> ># New Ticket Created by Austin Schutz
> ># Please include the string: [perl #32032]
> ># in the subject line of all future correspondence about this issue.
> ># <URL: http://rt.perl.org:80/rt3/Ticket/Display.html?id=32032 >
> >
> >
> > Included is a message I sent to the Expect.pm list regarding the
> >behavior of IO::Tty. What I discovered while debugging the error was very
> >strange behavior of defined(). I was able to recreate this error using both
> >perl 5.8.0 and 5.8.4, so I suspect it is a bug endemic to the 5.8 series.
> >
> > In order to recreate the bug, TIOCSCTTY must not be defined. This
> >may be accomplished by using a system which doesn't define this constant
> >or by commenting out or undefining it.
> >
> > After building IO::Tty, make test will warn "warning: TIOCSCTTY failed"
> >because the test if(defined TIOCSCTTY) at line 118 succeeds even though
> >TIOCSCTTY is set to undef, and is clearly set as such by the module.
>
> If TIOSCTTY isn't a constant sub it is a bareword i.e. a string.
It is a constant sub.
> So that is like writing
>
> if (defined("TIOSCTTY"))
>
> ands strings are always defined.
>
The behavior is not consistent between older and newer perls. But
the real problem is it is not consistent here either. Note that the
debugger admits that defined(TIOSCTTY) is not defined, but if() follows
it anyway. I actually tried changing the code to defined(&TIOSCTTY) and
it _still_ followed the wrong branch.
Austin
> I think it should be written as
>
> if (defined(&TIOSCTTY) && TIOSCTTY())
>
> >
> > IO::Tty version was 1.02, I've recreated this on a couple systems
> >verying both by perl version and OS, so I'm not including my perl -V
> >information here.
> >
> > Please let me know if there is anything I can do to help fix
> >this bug or provide more relevant information.
> >
> > Thanks muchly,
> >
> > Austin
> >
> >----- Forwarded message from Austin Schutz <tex@off.org> -----
> >
> >> Date: Fri, 8 Oct 2004 13:48:13 -0700
> >> From: Austin Schutz <tex@off.org>
> >> To: Roland Giersig <RGiersig@cpan.org>
> >> Cc: Austin Schutz <tex@off.org>, Zhisong Jin <jjin@dynaccsys.com>,
> >> expectperl-discuss@lists.sourceforge.net
> >> Subject: Re: [Expectperl-discuss] re: building Expect.pm on solaris 9
> >>
> >> On Fri, Oct 08, 2004 at 11:28:37AM +0200, Roland Giersig wrote:
> >> >
> >> > Hmm, in the 'perl Makefile.PL' step I'm trying to figure out what
> >> > constants are defined by compiling test progs for each constant. Austin,
> >> > as you seem to have a solaris machine on your hands, could you look into
> >> > that and see why it gets defined?
> >> >
> >>
> >> On my solaris machine I'm not able to replicate the issue because
> >> I'm running an old perl: 5.00503, which doesn't exhibit this problem and
> >> I can't get 5.8.4 to compile.
> >> However, I _was_ able to replicate this on my home linux workstation
> >> by commenting out #define TIOCSCTTY in /usr/include/asm/ioctls.h.
> >>
> >> I'm not sure why the code in question is being executed. Running
> >> it in the debugger I still couldn't figure it out (output follows). It looks
> >> to me like a perl bug. However, I was able to work around it by changing line
> >> 118 to:
> >>
> >> if (defined TIOCSCTTY && TIOCSCTTY) {
> >>
> >> which _should_ be valid - I doubt any vendor defines TIOCSCTTY as 0.
> >>
> >> Austin
> >>
> >> DB<5> p defined TIOCSCTTY
> >>
> >> DB<6> l
> >> 118==> if (defined TIOCSCTTY) {
> >> 119: if (not defined ioctl( ${*$self}{'io_pty_slave'}, TIOCSCTTY, 0 )) {
> >> 120: warn "warning: TIOCSCTTY failed, slave might not be set as control
> >> ling terminal: $!" if $^W;
> >> 121 }
> >> 122 } elsif (defined TCSETCTTY) {
> >> 123: if (not defined ioctl( ${*$self}{'io_pty_slave'}, TCSETCTTY, 0 )) {
> >> 124: warn "warning: TCSETCTTY failed, slave might not be set as control
> >> ling terminal: $!" if $^W;
> >> 125 }
> >> 126 }
> >> 127
> >> DB<6> s
> >> IO::Pty::make_slave_controlling_terminal(/root/.cpan/build/IO-Tty-1.02/blib/lib/
> >> IO/Pty.pm:119):
> >> 119: if (not defined ioctl( ${*$self}{'io_pty_slave'}, TIOCSCTTY, 0 )) {
> >> DB<6> p defined TIOCSCTTY
> >>
> >> DB<7> p defined TIOCSCTTY
> >>
> >> DB<8> if(defined TIOCSCTTY) { print "defined\n"; }
> >>
> >> DB<9> n
> >> IO::Pty::make_slave_controlling_terminal(/root/.cpan/build/IO-Tty-1.02/blib/lib/IO/Pty.pm:119):
> >> 119: if (not defined ioctl( ${*$self}{'io_pty_slave'}, TIOCSCTTY, 0 )) {
> >> DB<9> n
> >> Use of uninitialized value in ioctl at /root/.cpan/build/IO-Tty-1.02/blib/lib/IO/Pty.pm line 119, <XT> line 1.
> >> IO::Pty::make_slave_controlling_terminal('IO::Pty=GLOB(0x8171f8c)') called at test.pl line 66
> >> IO::Pty::make_slave_controlling_terminal(/root/.cpan/build/IO-Tty-1.02/blib/lib/IO/Pty.pm:120):
> >> 120: warn "warning: TIOCSCTTY failed, slave might not be set as controlling terminal: $!" if $^W;
> >
> >----- End forwarded message -----
Thread Next