forked from OSchip/llvm-project
Don't crash w/ a diagnostic range containing a null byte
We prematurely ended the line at the null byte which caused us to crash down stream because we tried to reason about columns beyond the end of the line. llvm-svn: 261171
This commit is contained in:
parent
1c793ef3dd
commit
38a3dbdcbf
|
@ -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);
|
||||
|
|
Binary file not shown.
Loading…
Reference in New Issue