Re: BUG: improper format string construction in framework.exp

Jacob Bachmeyer <[email protected]> Mon, 29 Oct 2018 23:17:33 -0500
Newsgroups gmane.comp.sysutils.dejagnu.bugs
Message-ID <[email protected]>
Andreas Schwab wrote:
> On Okt 28 2018, Jacob Bachmeyer <[email protected]> wrote:
>   
>> diff --git a/lib/framework.exp b/lib/framework.exp
>> index 6cb93c5..50ac757 100644
>> --- a/lib/framework.exp
>> +++ b/lib/framework.exp
>> @@ -800,7 +800,7 @@ proc record_test { type message args } {
>>  
>>      global multipass_name
>>      if { $multipass_name != "" } {
>> -       set message [format "$type: %s: $message" "$multipass_name"]
>> +       set message [format "%s: %s: %s" "$type" "$multipass_name" "$message"]
>>     
>
> What's the point of using format in the first place?
>
>           set message "$type: $multipass_name: $message"
>   

That code is ancient and was in the initial commit in whatever became 
the DejaGnu Git repository.  I presume that some version of Tcl does not 
correctly interpolate variables if the name contains underscore.  Using 
concat (another option I had considered) is not correct because concat 
inserts spaces between its arguments.

I am currently seeking to improve DejaGnu's testsuite to actually check 
this mode.  I plan to write documentation patches for MULTIPASS and 
document a hot-patch that testsuites can use to fix this bug at run-time 
when using older DejaGnu.  (As of this writing, "older DejaGnu" appears 
to be every release, ever, that had support for MULTIPASS.)

The DejaGnu testsuite appears to have some strange bugs.  In particular, 
testsuite/runtest.all/options.exp overwrites the site.exp file that the 
Automake-generated rules produce and using "--tool runtest" causes the 
final summary to fail to be printed with an expect error:  "send: spawn 
id exp0 not open" when {clone_output "\n\t\t=== $tool Summary ===\n"} is 
run during log_and_exit.  Bizarrely, it works fine if --tool is not 
given.  Perhaps it is actually an expect bug?  But I do not have similar 
problems with other testsuites, only DejaGnu itself.  Fixing this is 
necessary to test MULTIPASS, because DejaGnu cannot run both single-pass 
and multiple-pass tests in the same run and Automake needs to test 
different tools to run DejaGnu more than once.

****

Overwriting site.exp appears to actually be important, because the 
DejaGnu testsuite needs srcdir to be .../dejagnu/testsuite and Automake 
sets srcdir to .../dejagnu; thus the need for "--srcdir 
$(srcdir)/testsuite" in RUNTESTDEFAULTFLAGS in Makefile.am.  How best to 
fix this misintegration with Automake?

What is different between DejaGnu runs with the --tool option given and 
runs without it?

How do the DejaGnu instances run by options.exp know to not actually run 
the testsuite, which would lead to infinite recursion?

****

For those interested:  the hot-patch is six lines of Tcl, hereby placed 
under GPLv2+ if it is non-trivial enough to matter (thus compatible with 
every affected use of DejaGnu) (DejaGnu has already accepted the patch 
under GPLv3+, so this is an additional permission to cover all cases 
with the older releases that were GPLv2+)

if { [regexp {%s: \$message} [info body record_test]] } {
    proc record_test [info args record_test] \
	[regsub -line {format "\$type: %s: \$message" "\$multipass_name"} \
	     [info body record_test] \
	     {format "%s: %s: %s" "$type" "$multipass_name" "$message"} ]
}

It must be placed into an init file, preferably the tool init file for each affected tool.


-- Jacob