r230061 - Fix merging of << at end of input.
Kostya Serebryany
kcc at google.com
Mon Feb 23 11:07:36 PST 2015
On Sun, Feb 22, 2015 at 5:56 PM, Jacques Pienaar <jpienaar at google.com>
wrote:
> That is weird as I tested that locally and that was one of the cases I
> checked. And it wouldn't have exercised the code path that caused problems
> last time. I tried reproducing locally as follows:
>
> cmake -GNinja -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
> -DLLVM_USE_SANITIZER=Address -DLLVM_USE_SANITIZE_COVERAGE=YES
> -DLLVM_ENABLE_ASSERTIONS=ON -DCMAKE_BUILD_TYPE=Release ../ && ninja -j 10
> clang-format
>
> printf "<<<" | ASAN_OPTIONS=coverage=1 ./bin/clang-format
>
The reproducer found by the fuzzer is slightly different. Attached file
still triggers an assertion (verified on r230238).
tools/clang/include/clang/Rewrite/Core/RewriteRope.h:203: void
clang::RewriteRope::erase(unsigned int, unsigned int): Assertion
`Offset+NumBytes <= size() && "Invalid region to erase!"' failed.
>
> ninja clang-format-fuzzer
>
> ./bin/clang-format-fuzzer corpus/
>
> But none of the tests gave me an error. So if I was doing it correctly,
> then the only other thing I could think of is that the bot was using an
> older revision. I didn't see the revision number in the error report. Is
> this possible?
>
>
> On Sun, Feb 22, 2015 at 1:43 PM, Kostya Serebryany <kcc at google.com> wrote:
>
>> I don't think this is a complete fix.
>> The fuzzer is still unhappy, this time on <<<
>>
>> http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fuzzer/builds/442/steps/stage2%2Fasan%20run%20clang-format-fuzzer/logs/stdio
>>
>> On Fri, Feb 20, 2015 at 1:09 PM, Jacques Pienaar <jpienaar at google.com>
>> wrote:
>>
>>> Author: jpienaar
>>> Date: Fri Feb 20 15:09:01 2015
>>> New Revision: 230061
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=230061&view=rev
>>> Log:
>>> Fix merging of << at end of input.
>>>
>>> Commit of review http://reviews.llvm.org/D7766
>>>
>>>
>>> Modified:
>>> cfe/trunk/lib/Format/Format.cpp
>>> cfe/trunk/unittests/Format/FormatTest.cpp
>>>
>>> Modified: cfe/trunk/lib/Format/Format.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Format/Format.cpp?rev=230061&r1=230060&r2=230061&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Format/Format.cpp (original)
>>> +++ cfe/trunk/lib/Format/Format.cpp Fri Feb 20 15:09:01 2015
>>> @@ -662,33 +662,26 @@ private:
>>>
>>> bool tryMergeLessLess() {
>>> // Merge X,less,less,Y into X,lessless,Y unless X or Y is less.
>>> - if (Tokens.size() < 4) {
>>> - // Merge <,<,eof to <<,eof
>>> - if (Tokens.back()->Tok.isNot(tok::eof))
>>> - return false;
>>> + if (Tokens.size() < 3)
>>> + return false;
>>>
>>> - auto &eof = Tokens.back();
>>> - Tokens.pop_back();
>>> - bool LessLessMerged;
>>> - if ((LessLessMerged = tryMergeTokens({tok::less, tok::less})))
>>> - Tokens.back()->Tok.setKind(tok::lessless);
>>> - Tokens.push_back(eof);
>>> - return LessLessMerged;
>>> - }
>>> + bool FourthTokenIsLess = false;
>>> + if (Tokens.size() > 3)
>>> + FourthTokenIsLess = (Tokens.end() - 4)[0]->is(tok::less);
>>>
>>> - auto First = Tokens.end() - 4;
>>> - if (First[3]->is(tok::less) || First[2]->isNot(tok::less) ||
>>> - First[1]->isNot(tok::less) || First[0]->is(tok::less))
>>> + auto First = Tokens.end() - 3;
>>> + if (First[2]->is(tok::less) || First[1]->isNot(tok::less) ||
>>> + First[0]->isNot(tok::less) || FourthTokenIsLess)
>>> return false;
>>>
>>> // Only merge if there currently is no whitespace between the two
>>> "<".
>>> - if (First[2]->WhitespaceRange.getBegin() !=
>>> - First[2]->WhitespaceRange.getEnd())
>>> + if (First[1]->WhitespaceRange.getBegin() !=
>>> + First[1]->WhitespaceRange.getEnd())
>>> return false;
>>>
>>> - First[1]->Tok.setKind(tok::lessless);
>>> - First[1]->TokenText = "<<";
>>> - First[1]->ColumnWidth += 1;
>>> + First[0]->Tok.setKind(tok::lessless);
>>> + First[0]->TokenText = "<<";
>>> + First[0]->ColumnWidth += 1;
>>> Tokens.erase(Tokens.end() - 2);
>>> return true;
>>> }
>>>
>>> Modified: cfe/trunk/unittests/Format/FormatTest.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Format/FormatTest.cpp?rev=230061&r1=230060&r2=230061&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/unittests/Format/FormatTest.cpp (original)
>>> +++ cfe/trunk/unittests/Format/FormatTest.cpp Fri Feb 20 15:09:01 2015
>>> @@ -9752,6 +9752,7 @@ TEST_F(FormatTest, TripleAngleBrackets)
>>> }
>>>
>>> TEST_F(FormatTest, MergeLessLessAtEnd) {
>>> + verifyFormat("<<");
>>>
>>> verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
>>> "aaallvm::outs() <<");
>>>
>>> verifyFormat("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150223/4f8cf3ce/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: crash-3030501594194
Type: application/octet-stream
Size: 5 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150223/4f8cf3ce/attachment.obj>
More information about the cfe-commits
mailing list