summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Karpenkov <ekarpenkov@apple.com>2018-02-27 19:28:52 +0000
committerGeorge Karpenkov <ekarpenkov@apple.com>2018-02-27 19:28:52 +0000
commit53c1c10bebf401c2a1e5492725b56ba91cc62477 (patch)
tree02dc9d8ff3456d17e7e2641223b461d057b165cc
parentfc0d02cbbfaaa91bf09666bffb2c2f64342bdd07 (diff)
downloadbcm5719-llvm-53c1c10bebf401c2a1e5492725b56ba91cc62477.tar.gz
bcm5719-llvm-53c1c10bebf401c2a1e5492725b56ba91cc62477.zip
[analyzer] Only attempt to get the value of locations of known type
Fixes https://bugs.llvm.org/show_bug.cgi?id=36474 In general, getSVal API should be changed so that it does not crash on some non-obvious conditions. It should either be updated to require a type, or to return Optional<SVal>. Differential Revision: https://reviews.llvm.org/D43801 llvm-svn: 326233
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/NonnullGlobalConstantsChecker.cpp2
-rw-r--r--clang/test/Analysis/novoidtypecrash.c8
2 files changed, 9 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/NonnullGlobalConstantsChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/NonnullGlobalConstantsChecker.cpp
index 0b4ecb41d20..f65e1d022ed 100644
--- a/clang/lib/StaticAnalyzer/Checkers/NonnullGlobalConstantsChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/NonnullGlobalConstantsChecker.cpp
@@ -73,9 +73,9 @@ void NonnullGlobalConstantsChecker::checkLocation(SVal location, bool isLoad,
return;
ProgramStateRef State = C.getState();
- SVal V = State->getSVal(location.castAs<Loc>());
if (isGlobalConstString(location)) {
+ SVal V = State->getSVal(location.castAs<Loc>());
Optional<DefinedOrUnknownSVal> Constr = V.getAs<DefinedOrUnknownSVal>();
if (Constr) {
diff --git a/clang/test/Analysis/novoidtypecrash.c b/clang/test/Analysis/novoidtypecrash.c
new file mode 100644
index 00000000000..c04cfca29b4
--- /dev/null
+++ b/clang/test/Analysis/novoidtypecrash.c
@@ -0,0 +1,8 @@
+// RUN: %clang_analyze_cc1 -analyzer-checker=core %s
+a;
+b(void **c) { // no-crash
+ *c = a;
+ int *d;
+ b(&d);
+ *d;
+}
OpenPOWER on IntegriCloud