[cfe-commits] r147091 - in /cfe/trunk: lib/Lex/Lexer.cpp test/Lexer/escape_newline.c

Argyrios Kyrtzidis kyrtzidis at apple.com
Wed Dec 21 20:45:01 PST 2011


On Dec 21, 2011, at 2:51 PM, David Blaikie wrote:

> I'll try this myself when I get a chance but I think if you adds other
> line at the end of your test file you'll see the crash still because
> the spelling loops will jump past their end pointer, becoming unbounded.

Good catch!
See r147138, I made a change to avoid consuming the second newline. This actually matches how the size of the comment token was determined in the first place.

-Argyrios

> 
> You could change those loops to use < rather than != and then perhaps
> if you move things in those loops around a bit you could just not add
> the char to the buffer if such a condition occurred. This would fix the
> spelling to be exact/correct too, though I think it would leave these
> functions with somewhat subtle semantics. Clear warning might suffice
> given there's only 3 callers or something - though I'd probably err
> towards a less surprising api
> From: Argyrios Kyrtzidis
> Sent: 12/21/2011 12:38 PM
> To: David Blaikie
> Cc: cfe-commits at cs.uiuc.edu
> Subject: Re: [cfe-commits] r147091 - in /cfe/trunk: lib/Lex/Lexer.cpp
> test/Lexer/escape_newline.c
> On Dec 21, 2011, at 2:19 PM, David Blaikie wrote:
> 
>> I suspect this isn't the right fix, but I'd have to test it further. If
>> the newline following the curious comment isn't the last character in
>> the file, this would still cause the original crash, wouldn't it?
>> (since this only detects the end of file case, but still might walk off
>> the end of the token we're currently spelling, which will cause thr
>> speller to jump past its end pointer as it was before)
> 
> If the new line is not the last character it won't walk off the end
> because getCharAndSizeSlow will continue returning the characters one
> by one.
> 
>> 
>> Also, even in the specific case this appears to remove the crash, it
>> does so by spelling the token incorrectly, doesn't it?
>> 
>> // \
>> x
>> 
>> Is spelled '// x' but
>> 
>> // \
>> 
>> 
>> Is spelled as '// \' which seems inconsistent.
> 
> That's true; how about if it returned a space instead of '\' ?
> Ideally spelling would halt before '\' but I think having it return a
> space is a reasonable and simpler fix.
> 
> -Argyrios
> 
>> 
>> I've thought about this bug a bi since I discovered it and haven't
>> found a 'nice' fix yet. Possibly using the size as an in/out parameter
>> (or adding an in parameter) to describe the size of the token being
>> read - and testing it after the call (so as not to add the returned
>> character if there was none available)... Or passing the pointer as
>> in/out and having this function increment it directly, then test != end
>> before appending
>> From: Argyrios Kyrtzidis
>> Sent: 12/21/2011 10:25 AM
>> To: cfe-commits at cs.uiuc.edu
>> Subject: [cfe-commits] r147091 - in /cfe/trunk: lib/Lex/Lexer.cpp
>> test/Lexer/escape_newline.c
>> Author: akirtzidis
>> Date: Wed Dec 21 14:19:55 2011
>> New Revision: 147091
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=147091&view=rev
>> Log:
>> In Lexer::getCharAndSizeSlow[NoWarn] make sure we don't go over the
>> end of the buffer
>> when the end of the buffer is immediately after an escaped newline.
>> 
>> Fixes http://llvm.org/PR10153.
>> 
>> Modified:
>>   cfe/trunk/lib/Lex/Lexer.cpp
>>   cfe/trunk/test/Lexer/escape_newline.c
>> 
>> Modified: cfe/trunk/lib/Lex/Lexer.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/Lexer.cpp?rev=147091&r1=147090&r2=147091&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Lex/Lexer.cpp (original)
>> +++ cfe/trunk/lib/Lex/Lexer.cpp Wed Dec 21 14:19:55 2011
>> @@ -1171,6 +1171,10 @@
>>      // Found backslash<whitespace><newline>.  Parse the char after it.
>>      Size += EscapedNewLineSize;
>>      Ptr  += EscapedNewLineSize;
>> +
>> +      if (Ptr[0] == '\0')
>> +        return '\\';
>> +
>>      // Use slow version to accumulate a correct size field.
>>      return getCharAndSizeSlow(Ptr, Size, Tok);
>>    }
>> @@ -1222,6 +1226,9 @@
>>      Size += EscapedNewLineSize;
>>      Ptr  += EscapedNewLineSize;
>> 
>> +      if (Ptr[0] == '\0')
>> +        return '\\';
>> +
>>      // Use slow version to accumulate a correct size field.
>>      return getCharAndSizeSlowNoWarn(Ptr, Size, Features);
>>    }
>> 
>> Modified: cfe/trunk/test/Lexer/escape_newline.c
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/escape_newline.c?rev=147091&r1=147090&r2=147091&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/Lexer/escape_newline.c (original)
>> +++ cfe/trunk/test/Lexer/escape_newline.c Wed Dec 21 14:19:55 2011
>> @@ -1,7 +1,10 @@
>> // RUN: %clang_cc1 -E -trigraphs %s | grep -- ' ->'
>> // RUN: %clang_cc1 -E -trigraphs %s 2>&1 | grep 'backslash and
>> newline separated by space'
>> // RUN: %clang_cc1 -E -trigraphs %s 2>&1 | grep 'trigraph converted'
>> +// RUN: %clang_cc1 -E -CC -trigraphs %s
>> 
>> // This is an ugly way to spell a -> token.
>> -??/
>>> 
>> +
>> +// \
>> 
>> 
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list