diff options
-rw-r--r-- | clang/lib/Frontend/TextDiagnostic.cpp | 14 | ||||
-rw-r--r-- | clang/test/Misc/diag-null-bytes-in-line.cpp | bin | 0 -> 398 bytes |
2 files changed, 11 insertions, 3 deletions
diff --git a/clang/lib/Frontend/TextDiagnostic.cpp b/clang/lib/Frontend/TextDiagnostic.cpp index d4e156d4458..5dda151d558 100644 --- a/clang/lib/Frontend/TextDiagnostic.cpp +++ b/clang/lib/Frontend/TextDiagnostic.cpp @@ -1082,10 +1082,13 @@ void TextDiagnostic::emitSnippetAndCaret( // Get information about the buffer it points into. bool Invalid = false; - const char *BufStart = SM.getBufferData(FID, &Invalid).data(); + StringRef BufData = SM.getBufferData(FID, &Invalid); if (Invalid) return; + const char *BufStart = BufData.data(); + const char *BufEnd = BufStart + BufData.size(); + unsigned LineNo = SM.getLineNumber(FID, FileOffset); unsigned ColNo = SM.getColumnNumber(FID, FileOffset); @@ -1101,15 +1104,20 @@ void TextDiagnostic::emitSnippetAndCaret( // 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') + while (*LineEnd != '\n' && *LineEnd != '\r' && LineEnd != BufEnd) ++LineEnd; // Arbitrarily stop showing snippets when the line is too long. if (size_t(LineEnd - LineStart) > MaxLineLengthToPrint) return; + // Trim trailing null-bytes. + StringRef Line(LineStart, LineEnd - LineStart); + while (Line.size() > ColNo && Line.back() == '\0') + Line = Line.drop_back(); + // Copy the line of code into an std::string for ease of manipulation. - std::string SourceLine(LineStart, LineEnd); + std::string SourceLine(Line.begin(), Line.end()); // Build the byte to column map. const SourceColumnMap sourceColMap(SourceLine, DiagOpts->TabStop); diff --git a/clang/test/Misc/diag-null-bytes-in-line.cpp b/clang/test/Misc/diag-null-bytes-in-line.cpp Binary files differnew file mode 100644 index 00000000000..1eba91f6b23 --- /dev/null +++ b/clang/test/Misc/diag-null-bytes-in-line.cpp |