At 11:13 -0500 2003.11.19, Dan Sugalski wrote:
>On Wed, 19 Nov 2003, Rafael Garcia-Suarez wrote:
>
>> Dan Sugalski wrote:
>> > Basically you're using a variable that can be affected by external things
>> > in a way that pretty much guarantees that external things will be
>> > happening. That it changes isn't much of a surprise. ($!/$^E may get
>> > modified by some signal handlers too, depending on what you do, so there's
>> > not even any guarantee that "$^E = 42; $^E++;" will end up with $^E set to
>> > 43.
>>
>> Using the Mac OS X equivalent of truss/strace might help to find out
>> why errno changes there.
>
>My bet would be that the print triggers an errno update, which strikes me
>as perfectly reasonable.

Yes, I just realized you might think that, and I should have been more
descriptive: it happens regardless of print.

  $ ktrace perl -le '$! = -1728; $x = $^E+0; $y = $^E+0; print $x; print $y'
  -1728
  22


It has nothing to do with addition, either:  :-)

  $ ktrace perl -le '$! = -1728; $x = $^E; $y = $^E; print $x; print $y'
  Unknown error: -1728
  Invalid argument


And since it doesn't change with $!, it is not merely because the error is
unknown:

  $ ktrace perl -le '$! = -1728; $x = $!; $y = $!; print $x; print $y'
  Unknown error: -1728
  Unknown error: -1728


Also, the ktrace output of that is identical to the output of the original
(modulo addresses and PIDs):

  $ ktrace perl -le '$! = -1728; print $^E+0 for 0,1'
  -1728
  22

No syscalls between the two assignments.  No reason for errno to update.
And even if it did, why would it only update when $^E is printed, and not
$!?

ktrace/kdump output below if anyone cares.  But there's got to be something
different about $^E from $! that is causing this bug.

  1343 ktrace   RET   ktrace 0
  1343 ktrace   CALL  execve(0xbffff3b0,0xbffff9e8,0xbffff9f8)
  1343 ktrace   NAMI  "/Users/pudge/bin/perl"
  1343 ktrace   RET   execve -1 errno 2 No such file or directory
  1343 ktrace   CALL  execve(0xbffff3b0,0xbffff9e8,0xbffff9f8)
  1343 ktrace   NAMI  "/usr/local/slash/bin/perl"
  1343 ktrace   RET   execve -1 errno 2 No such file or directory
  1343 ktrace   CALL  execve(0xbffff3b0,0xbffff9e8,0xbffff9f8)
  1343 ktrace   NAMI  "/usr/local/apache/bin/perl"
  1343 ktrace   RET   execve -1 errno 2 No such file or directory
  1343 ktrace   CALL  execve(0xbffff3b0,0xbffff9e8,0xbffff9f8)
  1343 ktrace   NAMI  "/usr/local/bin/perl"
  1343 ktrace   NAMI  "/usr/lib/dyld"
  1343 perl     RET   execve 0
  1343 perl     CALL  getuid
  1343 perl     RET   getuid 502/0x1f6
  1343 perl     CALL  getuid
  1343 perl     RET   getuid 502/0x1f6
  1343 perl     CALL  getuid
  1343 perl     RET   getuid 502/0x1f6
  1343 perl     CALL  getgid
  1343 perl     RET   getgid 20/0x14
  1343 perl     CALL  getgid
  1343 perl     RET   getgid 20/0x14
  1343 perl     CALL  open(0x13d8,0,0)
  1343 perl     NAMI  "/usr/local/lib/perl5/5.8.0/darwin/CORE/libperl.dylib"
  1343 perl     RET   open 3
  1343 perl     CALL  fstat(0x3,0xbffff770)
  1343 perl     RET   fstat 0
  1343 perl     CALL  close(0x3)
  1343 perl     RET   close 0
  1343 perl     CALL  open(0x1428,0,0)
  1343 perl     NAMI  "/usr/lib/libSystem.B.dylib"
  1343 perl     RET   open 3
  1343 perl     CALL  fstat(0x3,0xbffff770)
  1343 perl     RET   fstat 0
  1343 perl     CALL
load_shared_file(0x1428,0x22b000,0x1798fc,0xbffff580,0x4,0xbffff510,0xbffff584)
  1343 perl     NAMI  "/usr/lib/libSystem.B.dylib"
  1343 perl     RET   load_shared_file 0
  1343 perl     CALL  close(0x3)
  1343 perl     RET   close 0
  1343 perl     CALL  open(0x900006e8,0,0)
  1343 perl     NAMI  "/usr/lib/system/libmathCommon.A.dylib"
  1343 perl     RET   open 3
  1343 perl     CALL  fstat(0x3,0xbffff700)
  1343 perl     RET   fstat 0
  1343 perl     CALL
load_shared_file(0x900006e8,0x7000,0x6ac4,0xbffff510,0x3,0xbffff4a0,0xbffff514)
  1343 perl     NAMI  "/usr/lib/system/libmathCommon.A.dylib"
  1343 perl     RET   load_shared_file 0
  1343 perl     CALL  close(0x3)
  1343 perl     RET   close 0
  1343 perl     CALL  __sysctl(0xbffff918,0x2,0xbffff920,0xbffff924,0,0)
  1343 perl     RET   __sysctl 0
  1343 perl     CALL  sigaction(0x8,0xbffff850,0xbffff8c0)
  1343 perl     RET   sigaction 0
  1343 perl     CALL  getuid
  1343 perl     RET   getuid 502/0x1f6
  1343 perl     CALL  getuid
  1343 perl     RET   getuid 502/0x1f6
  1343 perl     CALL  getgid
  1343 perl     RET   getgid 20/0x14
  1343 perl     CALL  getgid
  1343 perl     RET   getgid 20/0x14
  1343 perl     CALL  open(0x3011c0,0,0x1b6)
  1343 perl     NAMI  "/dev/null"
  1343 perl     RET   open 3
  1343 perl     CALL  fcntl(0x3,0x2,0x1)
  1343 perl     RET   fcntl 0
  1343 perl     CALL  sigaction(0x14,0,0xbffff3e0)
  1343 perl     RET   sigaction 0
  1343 perl     CALL  getpid
  1343 perl     RET   getpid 1343/0x55a
  1343 perl     CALL  close(0x3)
  1343 perl     RET   close 0
  1343 perl     CALL  fstat(0x1,0xbffff100)
  1343 perl     RET   fstat 0
  1343 perl     CALL  ioctl(0x1,FIODTYPE,0xbffff150)
  1343 perl     RET   ioctl 0
  1343 perl     CALL  write(0x1,0x7000,0x6)
  1343 perl     GIO   fd 1 wrote 6 bytes
       "-1728
       "
  1343 perl     RET   write 6
  1343 perl     CALL  write(0x1,0x7000,0x3)
  1343 perl     GIO   fd 1 wrote 3 bytes
       "22
       "
  1343 perl     RET   write 3
  1343 perl     CALL  exit(0)

-- 
Chris Nandor                      [EMAIL PROTECTED]    http://pudge.net/
Open Source Development Network    [EMAIL PROTECTED]     http://osdn.com/

Reply via email to