diff options
author | Jordan Rose <jordan_rose@apple.com> | 2013-01-30 21:41:07 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2013-01-30 21:41:07 +0000 |
commit | f6e74a35e0c0e53b2e65fc9fe86f8e4cadcca473 (patch) | |
tree | 0670628c7bf4f94a5d2ad371fe697b7993d81f39 /lib/Frontend/TextDiagnostic.cpp | |
parent | 1a1c82e1530e834cceab58fa51ff5e356e260641 (diff) |
Diagnostics: if a line is longer than 4096 characters, don't print it.
Specifically, don't print snippets, caret diagnostics, or ranges for
lines over 4096 characters. We copy the line around a few times in our
diagnostics machinery, and we have to print a caret line that's just as
long. This uses a lot of memory just to create a poor user experience as
we print out a line much too long for anyone to read...or spend extra
energy trying to fit it to -fmessage-length.
<rdar://problem/13106850>
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173976 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Frontend/TextDiagnostic.cpp')
-rw-r--r-- | lib/Frontend/TextDiagnostic.cpp | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/lib/Frontend/TextDiagnostic.cpp b/lib/Frontend/TextDiagnostic.cpp index f7c0d60ae4..c2562eb5fc 100644 --- a/lib/Frontend/TextDiagnostic.cpp +++ b/lib/Frontend/TextDiagnostic.cpp @@ -1096,18 +1096,26 @@ void TextDiagnostic::emitSnippetAndCaret( unsigned LineNo = SM.getLineNumber(FID, FileOffset); unsigned ColNo = SM.getColumnNumber(FID, FileOffset); + + // Arbitrarily stop showing snippets when the line is too long. + static const unsigned MaxLineLength = 4096; + if (ColNo > MaxLineLength) + return; // Rewind from the current position to the start of the line. const char *TokPtr = BufStart+FileOffset; const char *LineStart = TokPtr-ColNo+1; // Column # is 1-based. - // Compute the line end. Scan forward from the error position to the end of // the line. const char *LineEnd = TokPtr; while (*LineEnd != '\n' && *LineEnd != '\r' && *LineEnd != '\0') ++LineEnd; + // Arbitrarily stop showing snippets when the line is too long. + if (LineEnd - LineStart > MaxLineLength) + return; + // Copy the line of code into an std::string for ease of manipulation. std::string SourceLine(LineStart, LineEnd); |