[cfe-dev] bug in the Rewriter

Nuno Lopes nunoplopes at sapo.pt
Wed Sep 24 11:47:00 PDT 2008


Today I've tracked down a bug in the Rewriter, but I'm not sure how to fix 
it. I'll try to explain what's happening.
The problem happens when running the analyzer and when it flags an error in 
a token that starts with a char that needs escaping.
char *arg_free=NULL, **arg_excp=&arg_free;

gets translated to:
<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg" 
style="margin-left:32ex">warning: Value stored to 'arg_excp' during its 
initialization is never read</div></td></tr>
<tr><td class="num" id="LN596">596</td><td class="line">        <span 
class='keyword'>char</span> *arg_free=<span class='macro'>NULL<span 
class='expansion'>( ( void * ) 0 )</span></span>, **arg_excp=&span 

note that the '&' char is escaped in the wrong place. This is because 
ReplaceText() searches for the offset with AfterInserts=false, which is 
wrong because we may have several replacements at the same original offset 
(as in this case). Turning it to true fixes the problem.

But wait, that would be too easy :) Then there's one objc rewrite test that 
starts failing. Why? because it rewrites both the AST tree and the output 
several times and the new tree nodes keep the original offsets. So the objc 
rewriter really wants to search for the offsets with AfterInserts=false.

    while (mapTable->capacity) {

1st it is translated to:
    while (((struct NSConcreteMapTableValueEnumerator_IMPL 
*)self)->mapTable->capacity) {

and then to:
    while (((struct NSConcreteMapTableValueEnumerator_IMPL *)self)->((struct 
NSConcreteMapTable_IMPL *)((struct NSConcreteMapTableValueEnumerator_IMPL 
*)self)->mapTable)->capacity) {

instead of
    while (((struct NSConcreteMapTable_IMPL *)((struct 
NSConcreteMapTableValueEnumerator_IMPL *)self)->mapTable)->capacity) {

Anyone with a better insight than me can please either fix the problem or 
give me some clue on how to fix it?


More information about the cfe-dev mailing list