develooper Front page | perl.perl5.porters | Postings from September 2000

[ID 20000927.001] do and eval sometimes don't clear $@

Thread Next
From:
pimlott
Date:
September 27, 2000 20:43
Subject:
[ID 20000927.001] do and eval sometimes don't clear $@
Message ID:
m13btMG-000SFJC@nolfolan.idiomtech.com
This is a bug report for perl from pimlott@idiomtech.com,
generated with the help of perlbug 1.26 running under perl 5.00503.


-----------------------------------------------------------------
[Please enter your report here]

The documentation for eval says

    If there was no error, C<$@> is guaranteed to be a null string.

and the documentation for do (the do EXPR form) says

        do 'stat.pl';

    is just like

        scalar eval `cat stat.pl`;

However, there are circumstances where eval and do leave $@ set to its
previous value.  This can cause subtle bugs.

Example 1:

    eval { die "shouldn't see this\n" };
    eval { };
    warn $@ if $@;

Example 2:

    eval { die "shouldn't see this\n" };
    do 'no such file';
    warn $@ if $@;

Both examples will warn "shouldn't see this".  While the first example is
somewhat pathological (it can happen perhaps in program-generated code), the
second example is a common idiom and in fact demonstrates that the sample
code in the documentation for do EXPR is wrong.  More generally, it
demonstrates that do EXPR (like system) is not robust because it's hard or
impossible to distinguish all its failure modes (a Perl 6 RFC?).

Andrew

[Please do not change anything below this line]
-----------------------------------------------------------------

---
Site configuration information for perl 5.00503:

Configured by drow at Sun Apr 30 12:07:23 EDT 2000.

Summary of my perl5 (5.0 patchlevel 5 subversion 3) configuration:
  Platform:
    osname=linux, osvers=2.2.15pre14, archname=i386-linux
    uname='linux them 2.2.15pre14 #2 smp mon mar 13 14:29:00 est 2000 i686 unknown '
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=undef useperlio=undef d_sfio=undef
  Compiler:
    cc='cc', optimize='-O2 ', gccversion=2.95.2 20000313 (Debian GNU/Linux)
    cppflags='-Dbool=char -DHAS_BOOL -D_REENTRANT -DDEBIAN -I/usr/local/include'
    ccflags ='-Dbool=char -DHAS_BOOL -D_REENTRANT -DDEBIAN -I/usr/local/include'
    stdchar='char', d_stdstdio=undef, usevfork=false
    intsize=4, longsize=4, ptrsize=4, doublesize=8
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    alignbytes=4, usemymalloc=n, prototype=define
  Linker and Libraries:
    ld='cc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lnsl -lndbm -lgdbm -ldbm -ldb -ldl -lm -lc -lposix -lcrypt
    libc=, so=so, useshrplib=false, libperl=libperl.a
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-rdynamic'
    cccdlflags='-fPIC', lddlflags='-shared -L/usr/local/lib'

Locally applied patches:
    

---
@INC for perl 5.00503:
    /home/pimlott/idiom/perl
    /usr/lib/perl5/5.005/i386-linux
    /usr/lib/perl5/5.005
    /usr/local/lib/site_perl/i386-linux
    /usr/local/lib/site_perl
    /usr/lib/perl5
    .

---
Environment for perl 5.00503:
    HOME=/home/pimlott
    LANG (unset)
    LANGUAGE (unset)
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/home/pimlott/bin:/usr/local/atria/bin:/usr/sbin:/sbin:/home/pimlott/bin:/usr/local/atria/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games
    PERL5LIB=/home/pimlott/idiom/perl
    PERL_BADLANG (unset)
    SHELL=/usr/bin/zsh


Thread Next


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