diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-10-19 09:11:21 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-10-19 09:11:21 +0000 |
commit | 06d10728b86ebb2bd73b593146e95e0c1688acc4 (patch) | |
tree | 5294b64dc8d07b79449f0701d4e3178ebcb296e4 | |
parent | ff430e6d68d1bea07046adafa28a52b314eeaa88 (diff) |
Workaround a bug exposed by the FileCheckify of message-length.c, the caret end
column computation isn't correct and could exceed the line length, which
resulted in a buffer overflow later.
- Chris, is there a better way for this code to compute the final column used
by the caret?
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84475 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Frontend/TextDiagnosticPrinter.cpp | 6 | ||||
-rw-r--r-- | test/Misc/message-length.c | 4 |
2 files changed, 8 insertions, 2 deletions
diff --git a/lib/Frontend/TextDiagnosticPrinter.cpp b/lib/Frontend/TextDiagnosticPrinter.cpp index 63d9a50b36..14769c1873 100644 --- a/lib/Frontend/TextDiagnosticPrinter.cpp +++ b/lib/Frontend/TextDiagnosticPrinter.cpp @@ -214,6 +214,7 @@ static void SelectInterestingSourceRegion(std::string &SourceLine, // Move the end of the interesting region right until we've // pulled in something else interesting. if (CaretEnd != SourceLength) { + assert(CaretEnd < SourceLength && "Unexpected caret position!"); unsigned NewEnd = CaretEnd; // Skip over any whitespace we see here; we're looking for @@ -320,6 +321,11 @@ void TextDiagnosticPrinter::EmitCaretDiagnostic(SourceLocation Loc, while (*LineEnd != '\n' && *LineEnd != '\r' && *LineEnd != '\0') ++LineEnd; + // FIXME: This shouldn't be necessary, but the CaretEndColNo can extend past + // the source line length as currently being computed. See + // test/Misc/message-length.c. + CaretEndColNo = std::min(CaretEndColNo, unsigned(LineEnd - LineStart)); + // Copy the line of code into an std::string for ease of manipulation. std::string SourceLine(LineStart, LineEnd); diff --git a/test/Misc/message-length.c b/test/Misc/message-length.c index 69a5c1c191..9f4d66fe71 100644 --- a/test/Misc/message-length.c +++ b/test/Misc/message-length.c @@ -1,4 +1,4 @@ -// RUN: clang -fsyntax-only -fmessage-length=72 %s 2>&1 | tee /tmp/out.txt | FileCheck -strict-whitespace %s && +// RUN: clang -fsyntax-only -fmessage-length=72 %s 2>&1 | FileCheck -strict-whitespace %s && // RUN: clang -fsyntax-only -fmessage-length=1 %s // Hack so we can check things better, force the file name and line. @@ -29,4 +29,4 @@ void a_very_long_line(int *ip, float *FloatPointer) { // CHECK: FILE:23:78 -// CHECK: {{^ ...some long comment text and a brace, eh {} $}} +// CHECK: {{^ ...// some long comment text and a brace, eh {} $}} |