This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: [RFC] Unset tcl variable addr to avoid clashing
- From: Doug Evans <dje at google dot com>
- To: Sergio Durigan Junior <sergiodj at redhat dot com>
- Cc: Yao Qi <qiyaoltc at gmail dot com>, gdb-patches <gdb-patches at sourceware dot org>
- Date: Sun, 12 Apr 2015 10:22:22 -0700
- Subject: Re: [RFC] Unset tcl variable addr to avoid clashing
- Authentication-results: sourceware.org; auth=none
- References: <1428666671-12926-1-git-send-email-qiyaoltc at gmail dot com> <87r3rqppgq dot fsf at redhat dot com>
On Sat, Apr 11, 2015 at 10:03 AM, Sergio Durigan Junior
<sergiodj@redhat.com> wrote:
> On Friday, April 10 2015, Yao Qi wrote:
>
>> From: Yao Qi <yao.qi@linaro.org>
>>
>> Hi,
>> I see some tcl ERRORs in gdb.sum recently:
>>
>> ERROR: tcl error sourcing ../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp.
>> ERROR: can't set "addr": variable is array
>> while executing
>> "set addr "0x\[0-9a-zA-Z\]+""
>> (file "../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp" line 45)
>> invoked from within
>> "source ../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp"
>> ("uplevel" body line 1)
>> invoked from within
>> "uplevel #0 source ../../../../../binutils-gdb/gdb/testsuite/gdb.base/dmsym.exp"
>> invoked from within
>> "catch "uplevel #0 source $test_file_name""
>>
>> It is OK to run single dmsym.exp. This error is caused by the name
>> clashing with coredump-filter.exp, and it can be reproduced,
>
> It seems that coredump-filter.exp is causing lots of headaches
> lately... Sorry about that.
>
>> $ make check RUNTESTFLAGS='coredump-filter.exp dmsym.exp exception.exp stepi-random-signal.exp'
>>
>> as variable addr is used in all of them. This patch is to unset array
>> addr, but manually unset variables isn't good to me. Is there any
>> approaches we can do to avoid name clashing?
>
> FWIW, there is not strong reason to keep the variable name as "addr" in
> the testcase. So, an easier solution would be to rename the variable to
> something else, like "coredump_var_addr" (I think this name is unique
> enough). The patch below does that.
>
> WDYT?
>
> --
> Sergio
> GPG key ID: 237A 54B1 0287 28BF 00EF 31F4 D0EB 7628 65FC 5E36
> Please send encrypted e-mail if possible
> http://sergiodj.net/
>
> gdb/testsuite/ChangeLog:
> 2015-04-11 Sergio Durigan Junior <sergiodj@redhat.com>
>
> * gdb.base/coredump-filter.exp: Rename variable "addr" to
> "coredump_var_addr" to avoid naming conflict with other
> testcases.
Ok by me with one nit.
There's an issue here that still needs to be documented so it becomes
part of the collective lore.
Can this include a note about the need to give global array variables
unique names to either testsuite/README or
https://sourceware.org/gdb/wiki/Internals%20GDB-Testsuite-Coding-Standards
>
> diff --git a/gdb/testsuite/gdb.base/coredump-filter.exp b/gdb/testsuite/gdb.base/coredump-filter.exp
> index f3203be..8c94e94 100644
> --- a/gdb/testsuite/gdb.base/coredump-filter.exp
> +++ b/gdb/testsuite/gdb.base/coredump-filter.exp
> @@ -38,7 +38,7 @@ proc do_save_core { filter_flag core ipid } {
> }
>
> proc do_load_and_test_core { core var working_var working_value } {
> - global hex decimal addr
> + global hex decimal coredump_var_addr
>
> set core_loaded [gdb_core_cmd "$core" "load core"]
> if { $core_loaded == -1 } {
> @@ -47,9 +47,9 @@ proc do_load_and_test_core { core var working_var working_value } {
> }
>
> # Access the memory the addresses point to.
> - gdb_test "print/x *(char *) $addr($var)" "\(\\\$$decimal = <error: \)?Cannot access memory at address $hex\(>\)?" \
> + gdb_test "print/x *(char *) $coredump_var_addr($var)" "\(\\\$$decimal = <error: \)?Cannot access memory at address $hex\(>\)?" \
> "printing $var when core is loaded (should not work)"
> - gdb_test "print/x *(char *) $addr($working_var)" " = $working_value.*" \
> + gdb_test "print/x *(char *) $coredump_var_addr($working_var)" " = $working_value.*" \
> "print/x *$working_var ( = $working_value)"
> }
>
> @@ -163,7 +163,7 @@ foreach item $all_anon_corefiles {
> set test "print/x $name"
> gdb_test_multiple $test $test {
> -re " = \($hex\)\r\n$gdb_prompt $" {
> - set addr($name) $expect_out(1,string)
> + set coredump_var_addr($name) $expect_out(1,string)
> }
> }
> }