Skip to content

Commit d71b6cf

Browse files
[lldb][NFC] Avoid an assertion failure in dwim-print (#139197)
With a debug build on Windows, printing inline diagnostics resulted in an error, for example: ``` > cd llvm-project\lldb\test\API\functionalities\postmortem\elf-core > lldb.exe -c altmain.core > p dummy LLDB diagnostics will be written to ... Please include the directory content when filing a bug report Exception Code: 0x80000003 0x00007FF8FD6633EC, C:\llvm\build\bin\liblldb.dll(0x00007FF8FC2C0000) + 0x13A33EC byte(s), std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<lldb_private::DiagnosticDetail> > >::_Compat() + 0x6C byte(s), C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\vector, line 202 + 0x5D byte(s) 0x00007FF8FD662ABE, C:\llvm\build\bin\liblldb.dll(0x00007FF8FC2C0000) + 0x13A2ABE byte(s), std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<lldb_private::DiagnosticDetail> > >::operator==() + 0x1E byte(s), C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\vector, line 166 + 0x0 byte(s) 0x00007FF8FD662B2E, C:\llvm\build\\bin\liblldb.dll(0x00007FF8FC2C0000) + 0x13A2B2E byte(s), std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<lldb_private::DiagnosticDetail> > >::operator!=() + 0x1E byte(s), C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\vector, line 176 + 0xF byte(s) 0x00007FF8FD65EE1C, C:\llvm\build\\bin\liblldb.dll(0x00007FF8FC2C0000) + 0x139EE1C byte(s), std::operator!=<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<lldb_private::DiagnosticDetail> > >,std::_Vector_iterator<std::_Vector_val<std::_Simple_types<lldb_private::DiagnosticDetail> > > >() + 0x3C byte(s), C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.43.34808\include\xutility, line 1947 + 0x0 byte(s) 0x00007FF8FD65D4E5, C:\llvm\build\\bin\liblldb.dll(0x00007FF8FC2C0000) + 0x139D4E5 byte(s), lldb_private::RenderDiagnosticDetails() + 0x8F5 byte(s), C:\llvm\src\llvm-project\lldb\source\Utility\DiagnosticsRendering.cpp, line 189 + 0x25 byte(s) ... ``` The comparison operator of the iterators checks that they belong to the same container, but `remaining_details.pop_back()` invalidates `detail` making it incompatible with `remaining_details.rend()`. --------- Co-authored-by: Michael Buch <[email protected]>
1 parent bd0d048 commit d71b6cf

File tree

1 file changed

+6
-7
lines changed

1 file changed

+6
-7
lines changed

lldb/source/Utility/DiagnosticsRendering.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,8 @@ void RenderDiagnosticDetails(Stream &stream,
185185

186186
// Work through each detail in reverse order using the vector/stack.
187187
bool did_print = false;
188-
for (auto detail = remaining_details.rbegin();
189-
detail != remaining_details.rend();
190-
++detail, remaining_details.pop_back()) {
188+
for (; !remaining_details.empty(); remaining_details.pop_back()) {
189+
const auto &detail = remaining_details.back();
191190
// Get the information to print this detail and remove it from the stack.
192191
// Print all the lines for all the other messages first.
193192
stream << std::string(padding, ' ');
@@ -196,7 +195,7 @@ void RenderDiagnosticDetails(Stream &stream,
196195
llvm::ArrayRef(remaining_details).drop_back(1)) {
197196
uint16_t column = remaining_detail.source_location->column;
198197
// Is this a note with the same column as another diagnostic?
199-
if (column == detail->source_location->column)
198+
if (column == detail.source_location->column)
200199
continue;
201200

202201
if (column >= x_pos) {
@@ -205,16 +204,16 @@ void RenderDiagnosticDetails(Stream &stream,
205204
}
206205
}
207206

208-
uint16_t column = detail->source_location->column;
207+
uint16_t column = detail.source_location->column;
209208
// Print the line connecting the ^ with the error message.
210209
if (column >= x_pos)
211210
stream << std::string(column - x_pos, ' ') << joint << hbar << spacer;
212211

213212
// Print a colorized string based on the message's severity type.
214-
PrintSeverity(stream, detail->severity);
213+
PrintSeverity(stream, detail.severity);
215214

216215
// Finally, print the message and start a new line.
217-
stream << detail->message << '\n';
216+
stream << detail.message << '\n';
218217
did_print = true;
219218
}
220219

0 commit comments

Comments
 (0)