aboutsummaryrefslogtreecommitdiff
path: root/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp')
-rw-r--r--lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp13
1 files changed, 10 insertions, 3 deletions
diff --git a/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp b/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp
index de5e6dca5e..87e218505b 100644
--- a/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp
@@ -57,10 +57,11 @@ void AttrNonNullChecker::checkPreCall(const CallEvent &Call,
if (!DV)
continue;
+ const Expr *ArgE = Call.getArgExpr(idx);
+
if (!DV->getAs<Loc>()) {
// If the argument is a union type, we want to handle a potential
// transparent_union GCC extension.
- const Expr *ArgE = Call.getArgExpr(idx);
if (!ArgE)
continue;
@@ -77,7 +78,13 @@ void AttrNonNullChecker::checkPreCall(const CallEvent &Call,
DV = V.getAs<DefinedSVal>();
assert(++CSV_I == CSV->end());
if (!DV)
- continue;
+ continue;
+ // Retrieve the corresponding expression.
+ if (const CompoundLiteralExpr *CE = dyn_cast<CompoundLiteralExpr>(ArgE))
+ if (const InitListExpr *IE =
+ dyn_cast<InitListExpr>(CE->getInitializer()))
+ ArgE = dyn_cast<Expr>(*(IE->begin()));
+
} else {
// FIXME: Handle LazyCompoundVals?
continue;
@@ -106,7 +113,7 @@ void AttrNonNullChecker::checkPreCall(const CallEvent &Call,
// Highlight the range of the argument that was null.
R->addRange(Call.getArgSourceRange(idx));
- if (const Expr *ArgE = Call.getArgExpr(idx))
+ if (ArgE)
bugreporter::trackNullOrUndefValue(errorNode, ArgE, *R);
// Emit the bug report.
C.emitReport(R);