From: Tom de Vries <tdevries@suse.de>
To: Pedro Alves <palves@redhat.com>,
Andrew Burgess <andrew.burgess@embecosm.com>
Cc: gdb-patches@sourceware.org
Subject: Re: [PATCH 3/3][gdb/testsuite] Warn about leaked global array
Date: Thu, 4 Jun 2020 13:40:59 +0200 [thread overview]
Message-ID: <5d6277ac-76ea-5f47-ab9e-7da58fbddd6e@suse.de> (raw)
In-Reply-To: <72b3c10c-d316-9a0e-13e9-56dee7c765a7@redhat.com>
On 03-06-2020 11:49, Pedro Alves wrote:
> On 6/2/20 4:38 PM, Andrew Burgess wrote:
>
>> If we're going to add code to loop over all globals anyway, then why
>> not, instead of warning about bad cases, and then wrapping tests in a
>> namespace, just have this code "fix" the leaked globals by deleting
>> them?
>>
>> My thinking is that any global that exists when we start a test should
>> continue to exist at the end of the test. Any other global should
>> just be unset when the test script finishes.
>>
>> If there really is some global state that is lazily created by a
>> particular test script then (a) this seems like a bug anyway, and (b)
>> this is easy to fix by giving it an earlier creation / initialisation.
>>
>> In this way, folk can just write test scripts, dump their junk all
>> over the global namespace as they like, and we'll just clean up for
>> them.
>>
>> Thoughts?
>
> Hmm, I thought of this when I saw Tom's detection patch the first time,
> but dismissed it, perhaps too quickly, thinking that it wouldn't
> be safe. You mention global state lazily created by test scripts, but I was
> thinking of lazy initialized globals within Dejagnu itself, or whatever Tcl
> library we might end up using the future, which might need to be carried
> over from testcase to testcase. Imagine, this in a Dejagnu function:
>
> proc fail {} {
> global number_of_fails
>
> # Hadn't been set before. (valid since Tcl 8.5; otherwise, imagine it wrapped in 'info exits')
> incr number_of_fails
> }
>
> This is obviously not the real "fail", it is just to
> show the point, or the risk. I imagined there might be similar
> functions in random Dejagnu boards.
>
Agreed, that is a risk.
A less aggressive approach is also possible though: only prevent leaked
global arrays, and leave the rest of the global state unmodified.
> (
> Now that I look, it seems like Dejagnu wants to be sure to initialize
> all global variables it uses in runtest.exp:
>
> # Initialize a few global variables used by all tests.
> # `reset_vars' resets several of these, we define them here to document their
> # existence. In fact, it would be nice if all globals used by some interface
> # of dejagnu proper were documented here.
>
> And I guess we can always initialize some ourselves, if we find that missing.
> )
>
Right, or, in terms of the latest proposed patch, call
gdb_persistent_global with the varname as argument.
> So if people think the benefits outweigh the risks, then I guess
> we should give it a go.
>
I guess it's worth a try, it could be easily reverted if it cause
trouble. If it causes trouble, it will take somebody's time, but OTOH
it will also take time to manually fix up test-cases to prevent the
originally proposed warning.
> BTW, global variables alone aren't the full scope of the
> bleeding between testcases. There's also the case of
> testcases overriding procedures, like gdb.base/dbx.exp,
> but those are perhaps rare enough that we can continue
> handling it "manually" as before.
AFAICT, that test-case does an effort to undo the override, though I'm
not sure how certain it is that the undo will be executed.
Also, while working on the latest proposed patch, I also ran into
trouble related to the renaming of spawn in lib/tuiterm.exp. I wonder if
to address this we could wrap every tui test-case in
...
tui_env {
...
}
...
and letting the tui_env proc deal with renaming and restoring the spawn.
We could even automate this in gdb_init/gdb_finish by calling
gdb_init_$subdir/gdb_finish_$subdir and handling it there.
Thanks,
- Tom
next prev parent reply other threads:[~2020-06-04 11:41 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-19 16:30 Tom de Vries
2020-05-22 20:15 ` Tom Tromey
2020-06-02 13:08 ` Tom de Vries
2020-06-02 15:38 ` Andrew Burgess
2020-06-02 15:52 ` Andrew Burgess
2020-06-02 16:31 ` Tom de Vries
2020-06-02 17:01 ` Andrew Burgess
2020-06-02 20:18 ` Andrew Burgess
2020-06-03 8:47 ` Tom de Vries
2020-06-03 9:38 ` Tom de Vries
2020-06-03 10:09 ` Tom de Vries
2020-06-03 10:24 ` Tom de Vries
2020-06-03 12:54 ` Andrew Burgess
2020-06-03 15:35 ` Tom de Vries
2020-06-04 11:16 ` Pedro Alves
2020-06-04 12:29 ` Tom de Vries
2020-06-12 13:11 ` [committed] gdb/testsuite: Prevent globals leaking between test scripts Tom de Vries
2020-06-03 9:49 ` [PATCH 3/3][gdb/testsuite] Warn about leaked global array Pedro Alves
2020-06-04 11:40 ` Tom de Vries [this message]
2020-06-05 10:06 ` [PATCH][gdb/testsuite] Don't leak tuiterm.exp spawn override Tom de Vries
2020-06-11 13:55 ` Tom Tromey
2020-06-12 11:36 ` [committed][gdb/testsuite] " Tom de Vries
2020-06-15 19:46 ` Tom Tromey
2020-06-17 14:55 ` Tom de Vries
2020-06-17 15:28 ` Andreas Schwab
2020-06-11 12:11 ` [committed][gdb/testsuite] Make gdb.base/dbx.exp more robust Tom de Vries
2020-06-11 12:16 ` Pedro Alves
2020-06-11 14:39 ` Simon Marchi
2020-06-11 14:52 ` Tom de Vries
2020-06-11 14:59 ` Simon Marchi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5d6277ac-76ea-5f47-ab9e-7da58fbddd6e@suse.de \
--to=tdevries@suse.de \
--cc=andrew.burgess@embecosm.com \
--cc=gdb-patches@sourceware.org \
--cc=palves@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox