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:
- arrayGet.patch [download] added by msofer on 2001-12-02 07:39:39. [details]