[analyzer] Fix crashing getSValFromInitListExpr for nested initlists
In the following example, we will end up hitting the `llvm_unreachable()`: https://godbolt.org/z/5sccc95Ec ```lang=C++ enum class E {}; const E glob[] = {{}}; void initlistWithinInitlist() { clang_analyzer_dump(glob[0]); // crashes at loading from `glob[0]` } ``` We should just return `std::nullopt` instead for these cases. It's better than crashing. Reviewed By: xazax.hun Differential Revision: https://reviews.llvm.org/D146538
This commit is contained in:
parent
9bb96fd874
commit
558b46fde2
|
@ -1849,8 +1849,12 @@ std::optional<SVal> RegionStoreManager::getSValFromInitListExpr(
|
|||
// Go to the nested initializer list.
|
||||
ILE = IL;
|
||||
}
|
||||
llvm_unreachable(
|
||||
"Unhandled InitListExpr sub-expressions or invalid offsets.");
|
||||
|
||||
assert(ILE);
|
||||
|
||||
// FIXME: Unhandeled InitListExpr sub-expression, possibly constructing an
|
||||
// enum?
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
/// Returns an SVal, if possible, for the specified position in a string
|
||||
|
|
|
@ -249,3 +249,10 @@ void glob_array_parentheses1() {
|
|||
clang_analyzer_eval(glob_arr9[1][2] == 7); // expected-warning{{TRUE}}
|
||||
clang_analyzer_eval(glob_arr9[1][3] == 0); // expected-warning{{TRUE}}
|
||||
}
|
||||
|
||||
enum class E {};
|
||||
const E glob[] = {{}};
|
||||
void initlistWithinInitlist() {
|
||||
// no-crash
|
||||
clang_analyzer_dump(glob[0]); // expected-warning-re {{reg_${{[0-9]+}}<enum E Element{glob,0 S64b,enum E}>}}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user