bug-m4
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

another core dump to be fixed before 1.4.5


From: Eric Blake
Subject: another core dump to be fixed before 1.4.5
Date: Thu, 1 Jun 2006 04:48:45 +0000 (UTC)
User-agent: Loom/3.14 (http://gmane.org/)

Just found this one:

$ m4 -tfoo
indir(`foo')
stdin:1: m4: INTERNAL ERROR: Bad symbol type in call_macro ()
Aborted (core dumped)

It turns out the hash table tracks macro names that must be traced once 
defined, but indir does not filter on whether the macro is already defined.  
I'll add a test case and patch this soon.

Further investigation turned up these additional differences between Solaris 
and GNU.  I doubt any of them are show-stoppers for 1.4.5, but I will probably 
be able to fix them anyways as part of fixing John's coredump about undefining 
a symbol while it is being used in macro expansion.  Of course, a fix includes 
adding a test case in m4.texinfo, so that we don't regress in the future.

$ /usr/ccs/bin/m4
traceon`'define(`foo',`1')foo
Trace(0): define(foo,1)
Trace(0): foo
1
^D
$ m4
traceon`'define(`foo',`1')foo
m4trace: -1- define
1
^D

Hmm - Solaris traceon is truly global, so new definitions are traced.  But GNU 
simply marks all existing macros as traced, which ignores new definitions.


$ /usr/ccs/bin/m4
define(`foo',`1')define(`bar',`2')traceon(`foo')

foo bar
Trace(0): foo
1 2
traceon

foo bar
Trace(0): foo
Trace(0): bar
1 2
traceoff
Trace(0): traceoff

foo bar
Trace(0): foo
1 2
^D
$ m4
define(`foo',`1')define(`bar',`2')traceon(`foo')

foo bar
m4trace: -1- foo
1 2
traceon

foo bar
m4trace: -1- foo
1 m4trace: -1- bar
2
traceoff
m4trace: -1- traceoff

foo bar
1 2
^D

Hmm - Solaris global traceon is independent of the macro traceon status, so a 
named trace remains in force regardless of the global trace status.  GNU m4 
does not have global trace status, so named traces are lost at global traceoff.


$ /usr/ccs/bin/m4
traceon(`bar')define(`bar',`1')bar
1
^D
$ m4
traceon(`bar')define(`bar',`1')bar
stdin:1: m4: Undefined name bar
1
^D
$ m4 -tbar
traceon(`bar')define(`bar',`1')bar
m4trace: -1- bar
1

Hmm - when requesting a trace by name, Solaris just ignores the request for 
undefined macros. GNU m4 warns if the macro is not in use.  But at startup, it 
reserves a slot in the hashtable at startup for undefined names mentioned by -
t, and the warning is avoided in that case.  Not very consistent.  When not 
worried about matching traditional behavior, either GNU should always warn 
about tracing an undefined macro; or better yet, always behave as though a 
currently undefined macro can later be defined with tracing already enabled, as 
though specified by -t.  When trying to be traditional, it should just be 
silent on unknown trace requests.

-- 
Eric Blake






reply via email to

[Prev in Thread] Current Thread [Next in Thread]