Tcl Source Code

View Ticket
Login
Ticket UUID: 449893
Title: traces on array misbehaving
Type: Bug Version: obsolete: 8.4a4
Submitter: msofer Created on: 2001-08-10 19:17:05
Subsystem: 46. Traces Assigned To: msofer
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2004-03-28 07:59:44
Resolution: Fixed Closed By: msofer
    Closed on: 2004-03-28 00:59:44
Description:
This shouldn't core-dump!

% info patch
8.4a4
% set x(bar) 0
0
% trace variable x r {set x(foo) 1 ;#}
% trace variable x r {unset -nocomplain x(bar) ;#}
% trace vinfo x
{r {unset -nocomplain x(bar) ;#}} {r {set x(foo) 1 ;#}}
% array get
x                                                                              
": no such element in array
% array get x
Segmentation fault (core dumped)
User Comments: msofer added on 2004-03-28 07:59:43:
Logged In: YES 
user_id=148712

Docs added to array.n

msofer added on 2001-12-06 04:39:02:
Logged In: YES 
user_id=148712

Re docs: or with [trace]? Or both?
It is a really something that is relevant to the interplay
between [array get] and [trace] - when there are read traces
on an array that either add or remove an element of the
array.

I'm also not 100% happy with the error message when the
trace unsets the whole array (see test trace-1.13 ): should
it rather return {} and no error as does [array get
nonExistingArray] ?

Reopening the ticket, with lower priority now that the
segfault is gone ...

dgp added on 2001-12-06 04:24:59:
Logged In: YES 
user_id=80530

the patch included no doc changes.  Is there a
best place to document the particular behavior?
In the [array get] docs, perhaps?

msofer added on 2001-12-06 03:45:09:
Logged In: YES 
user_id=148712

Patch committed to HEAD.

msofer added on 2001-12-02 07:39:39:

File Added - 14049: arrayGet.patch

Logged In: YES 
user_id=148712

It is difficult to define what the correct behaviour of
[array get]
should be when there are read traces that modify the array 
structure. 

In discussions on the Tcl'ers Chat with Kevin Kenny and 
Don Porter we agreed that a (the only ?) reasonable
behaviour 
is given by

 proc array-get { aName } {
     set result [list]
     upvar 1 $aName array
     foreach s [array names array] {
         if { [info exists array($s)] } { 
     # because a trace could have deleted it 
             lappend result $s $array($s)
         }
     }
     return $result
 }

The enclosed patch implements this behaviour and adds three
tests 
for it. These tests cause illegal memory behaviour without
the patch 
to tclVar.c - an access to a previously disposed Tcl_Obj is
detected 
by TCL_MEM_DEBUG.

dgp added on 2001-08-11 02:37:36:
Logged In: YES 
user_id=80530

Note, a very similar script causes a segfault
in Tcl 8.3.3.  (Change [unset -nocomplain ...]
to [catch {unset ... )

msofer added on 2001-08-11 02:23:22:
Logged In: YES 
user_id=148712

Bug is also present in 8.3.3 and 8.0.5.

Attachments: