Tcl Source Code

View Ticket
Login
Ticket UUID: 771613
Title: Incorrect if syntax crashes tcl
Type: Bug Version: obsolete: 8.4.3
Submitter: nobody Created on: 2003-07-15 13:52:42
Subsystem: 45. Parsing and Eval Assigned To: dgp
Priority: 9 Immediate Severity:
Status: Closed Last Modified: 2003-07-16 04:00:21
Resolution: Fixed Closed By: dgp
    Closed on: 2003-07-15 21:00:19
Description:
OS platform: linux 2.4.20, glibc 2.3.2, gcc 3.2.2
Problem behaviour:
Incorrect syntax for the if command, where the body
opening brace is on the next line rather than the same
line as the
if command, causes the interpreter to crash.
In the sample code below, the barcode_* functions are just 
supporting functions from the program which exhibited
the problem. 
I reduced it down as far as I could. I note that if I
do not call
barcode_scanner_parm_get in the if expression, but
replace it
with something like 0 == 0, the crash does not occur.
To reproduce the problem, save the following code to a
file,
test.tcl, and issue the command:
tclsh test.tcl
A stack trace is also included below.
Expected behaviour:
Show syntax error message but do not crash.
Code sample:
------snip--------
proc barcode_scanner_parm_get {scanner parm} {
    global barcode_scanner
    if {[array get barcode_scanner $scanner,$parm] == ""} {
return 0
    }
    return $barcode_scanner($scanner,$parm)
}

proc barcode_scanner_parm_set {scanner parm val} {
    global barcode_scanner
    array set barcode_scanner "$scanner,$parm $val"
}

proc barcode_scanner_exists {scanner} {
    global barcode_scanner
    if {[array get barcode_scanner $scanner,mode] != ""} {
return 1
    } else {
return 0
    }
}

proc barcode_scanner_init {scanner} {
    barcode_scanner_parm_set $scanner mode normal
    barcode_scanner_parm_set $scanner state idle
}

proc test {} {
    set scanner 1
    if {![barcode_scanner_exists $scanner]} {
barcode_scanner_init $scanner
    }
    
    if {[barcode_scanner_parm_get $scanner log_id] != 0} {
if {[barcode_scanner_parm_get $scanner workorder] == 0 &&
    [barcode_scanner_parm_get $scanner workorder] == 0}
{
    rpc_return fail barcode-sequence no-workorder {}
}
set result [action_log_process_stop \
[barcode_scanner_parm_get $scanner log_id]]
    }
}

test
------snip--------

#0  0x42073499 in free () from /lib/tls/libc.so.6
#1  0x400f4437 in TclpFree () from
/usr/local/lib/libtcl8.4.so
#2  0x400fa5bd in Tcl_Free () from
/usr/local/lib/libtcl8.4.so
#3  0x401107f6 in TclFreeJumpFixupArray () from
/usr/local/lib/libtcl8.4.so
#4  0x4010906f in TclCompileIfCmd () from
/usr/local/lib/libtcl8.4.so
#5  0x4010e995 in TclCompileScript () from
/usr/local/lib/libtcl8.4.so
#6  0x4010fa4b in TclCompileCmdWord () from
/usr/local/lib/libtcl8.4.so
#7  0x40108bb6 in TclCompileIfCmd () from
/usr/local/lib/libtcl8.4.so
#8  0x4010e995 in TclCompileScript () from
/usr/local/lib/libtcl8.4.so
#9  0x4010e28e in TclSetByteCodeFromAny () from
/usr/local/lib/libtcl8.4.so
#10 0x4010e417 in SetByteCodeFromAny () from
/usr/local/lib/libtcl8.4.so
#11 0x40116fc3 in TclCompEvalObj () from
/usr/local/lib/libtcl8.4.so
#12 0x400f7474 in Tcl_EvalObjEx () from
/usr/local/lib/libtcl8.4.so
#13 0x401046a8 in Tcl_SwitchObjCmd () from
/usr/local/lib/libtcl8.4.so
#14 0x400f668d in TclEvalObjvInternal () from
/usr/local/lib/libtcl8.4.so
#15 0x401179ab in TclExecuteByteCode () from
/usr/local/lib/libtcl8.4.so
#16 0x4011706b in TclCompEvalObj () from
/usr/local/lib/libtcl8.4.so
#17 0x40141bea in TclObjInterpProc () from
/usr/local/lib/libtcl8.4.so
#18 0x400f668d in TclEvalObjvInternal () from
/usr/local/lib/libtcl8.4.so
#19 0x400f6f5d in Tcl_EvalEx () from
/usr/local/lib/libtcl8.4.so
#20 0x400f7447 in Tcl_EvalObjEx () from
/usr/local/lib/libtcl8.4.so
#21 0x401415ed in Tcl_UplevelObjCmd () from
/usr/local/lib/libtcl8.4.so
#22 0x400f668d in TclEvalObjvInternal () from
/usr/local/lib/libtcl8.4.so
---Type <return> to continue, or q <return> to quit---
#23 0x401179ab in TclExecuteByteCode () from
/usr/local/lib/libtcl8.4.so
#24 0x4011706b in TclCompEvalObj () from
/usr/local/lib/libtcl8.4.so
#25 0x40117a50 in TclExecuteByteCode () from
/usr/local/lib/libtcl8.4.so
#26 0x4011706b in TclCompEvalObj () from
/usr/local/lib/libtcl8.4.so
#27 0x40141bea in TclObjInterpProc () from
/usr/local/lib/libtcl8.4.so
#28 0x400f668d in TclEvalObjvInternal () from
/usr/local/lib/libtcl8.4.so
#29 0x400f6f5d in Tcl_EvalEx () from
/usr/local/lib/libtcl8.4.so
#30 0x40147417 in AfterProc () from
/usr/local/lib/libtcl8.4.so
#31 0x40146cc7 in TclServiceIdle () from
/usr/local/lib/libtcl8.4.so
#32 0x40138d96 in Tcl_DoOneEvent () from
/usr/local/lib/libtcl8.4.so
#33 0x4011668a in Tcl_VwaitObjCmd () from
/usr/local/lib/libtcl8.4.so
#34 0x400f668d in TclEvalObjvInternal () from
/usr/local/lib/libtcl8.4.so
#35 0x401179ab in TclExecuteByteCode () from
/usr/local/lib/libtcl8.4.so
#36 0x4011706b in TclCompEvalObj () from
/usr/local/lib/libtcl8.4.so
#37 0x400f7474 in Tcl_EvalObjEx () from
/usr/local/lib/libtcl8.4.so
#38 0x400fdb3d in Tcl_IfObjCmd () from
/usr/local/lib/libtcl8.4.so
#39 0x400f668d in TclEvalObjvInternal () from
/usr/local/lib/libtcl8.4.so
#40 0x400f6f5d in Tcl_EvalEx () from
/usr/local/lib/libtcl8.4.so
#41 0x400f7447 in Tcl_EvalObjEx () from
/usr/local/lib/libtcl8.4.so
#42 0x400fb400 in Tcl_EvalObjCmd () from
/usr/local/lib/libtcl8.4.so
#43 0x400f668d in TclEvalObjvInternal () from
/usr/local/lib/libtcl8.4.so
#44 0x401179ab in TclExecuteByteCode () from
/usr/local/lib/libtcl8.4.so
#45 0x4011706b in TclCompEvalObj () from
/usr/local/lib/libtcl8.4.so
---Type <return> to continue, or q <return> to quit---
#46 0x40141bea in TclObjInterpProc () from
/usr/local/lib/libtcl8.4.so
#47 0x400f668d in TclEvalObjvInternal () from
/usr/local/lib/libtcl8.4.so
#48 0x401179ab in TclExecuteByteCode () from
/usr/local/lib/libtcl8.4.so
#49 0x4011706b in TclCompEvalObj () from
/usr/local/lib/libtcl8.4.so
#50 0x40141bea in TclObjInterpProc () from
/usr/local/lib/libtcl8.4.so
#51 0x400f668d in TclEvalObjvInternal () from
/usr/local/lib/libtcl8.4.so
#52 0x401179ab in TclExecuteByteCode () from
/usr/local/lib/libtcl8.4.so
#53 0x4011706b in TclCompEvalObj () from
/usr/local/lib/libtcl8.4.so
#54 0x400f7474 in Tcl_EvalObjEx () from
/usr/local/lib/libtcl8.4.so
#55 0x40122d3f in Tcl_RecordAndEvalObj () from
/usr/local/lib/libtcl8.4.so
#56 0x40122c27 in Tcl_RecordAndEval () from
/usr/local/lib/libtcl8.4.so
#57 0x400472fd in StdinProc () from
/usr/local/lib/libtk8.4.so
#58 0x4012a09f in Tcl_NotifyChannel () from
/usr/local/lib/libtcl8.4.so
#59 0x4015598a in FileHandlerEventProc () from
/usr/local/lib/libtcl8.4.so
#60 0x40138a64 in Tcl_ServiceEvent () from
/usr/local/lib/libtcl8.4.so
#61 0x40138d7e in Tcl_DoOneEvent () from
/usr/local/lib/libtcl8.4.so
#62 0x4003bf33 in Tk_MainLoop () from
/usr/local/lib/libtk8.4.so
#63 0x4004718b in Tk_MainEx () from
/usr/local/lib/libtk8.4.so
#64 0x080487f1 in main ()
#65 0x42015574 in __libc_start_main () from
/lib/tls/libc.so.6
User Comments: dgp added on 2003-07-16 04:00:21:

File Added - 55909: 771613.patch

dgp added on 2003-07-16 04:00:19:
Logged In: YES 
user_id=80530


fix is attached patch, now committed
to core-8-4-branch and HEAD.

If testing fails, please re-open this bug.

hobbs added on 2003-07-16 03:22:31:
Logged In: YES 
user_id=72656

bug introduced by 711371 fix.  Assigning to dgp to correct.

dgp added on 2003-07-16 03:15:35:
Logged In: YES 
user_id=80530

FWIW, I can only reproduce
the crash on Solaris using
the original demo script, not
the reduced one.

Furthermore, the crash only
shows up for Tcl 8.4.3 and
the tip of the core-8-4-branch.
Releases, Tcl 8.4.0, 8.4.1, 8.4.2
do not crash.  

That may or may not be meaningful.

dgp added on 2003-07-16 01:23:35:
Logged In: YES 
user_id=80530


making no progress tracking this
down.  It's a Heisenbug that
goes away when I enable symbols.

nasty memory corruption somewhere.

msofer added on 2003-07-15 21:33:04:
Logged In: YES 
user_id=148712

Crash confirmed, case reduced to

  proc test {} {
      if {[someLongNameIsApparentlyNecessary]  
&&[longNamePossiblyNotTheSame]}
  } 
  test

msofer added on 2003-07-15 21:12:31:
Logged In: YES 
user_id=148712

Contact info: submitted by alias mb in the tcl'ers chat
(contact data there, I will not replicate it here without
mb's permission)

Attachments: