diff --git a/clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp index 1f3e749892293..c06d2fcd8e7df 100644 --- a/clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/GenericTaintChecker.cpp @@ -110,7 +110,9 @@ class GenericTaintChecker : public Checker { static Optional create(const CallEvent &Call, const CheckerContext &C) { - assert(Call.getDecl()); + if (!Call.getDecl()) + return None; + const FunctionDecl *FDecl = Call.getDecl()->getAsFunction(); if (!FDecl || (FDecl->getKind() != Decl::Function && FDecl->getKind() != Decl::CXXMethod)) diff --git a/clang/test/Analysis/taint-generic.c b/clang/test/Analysis/taint-generic.c index a299501b10687..1cc1913eb9a84 100644 --- a/clang/test/Analysis/taint-generic.c +++ b/clang/test/Analysis/taint-generic.c @@ -390,3 +390,7 @@ void testConfigurationSinks() { mySink(1, 2, x); // expected-warning@-1 {{Untrusted data is passed to a user-defined sink}} } + +void testUnknownFunction(void (*foo)(void)) { + foo(); // no-crash +}