develooper Front page | perl.perl5.porters | Postings from October 2004

Re: [perl #32032] defined may incorrectly returns true in 5.8.X

Thread Previous
From:
Nick Ing-Simmons
Date:
October 19, 2004 06:21
Subject:
Re: [perl #32032] defined may incorrectly returns true in 5.8.X
Message ID:
20041019132110.5043.2@llama.elixent.com
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.
So that is like writing 

         if (defined("TIOSCTTY"))

ands strings are always defined. 

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 Previous


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About