[cfe-commits] r163750 - in /cfe/trunk: include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp lib/StaticAnalyzer/Core/CallEvent.cpp test/Analysis/uninit-vals-ps.c

Jordan Rose jordan_rose at apple.com
Wed Sep 12 16:18:38 PDT 2012


Some comments inline.

On Sep 12, 2012, at 15:57 , Anna Zaks <ganna at apple.com> wrote:

> Author: zaks
> Date: Wed Sep 12 17:57:40 2012
> New Revision: 163750
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=163750&view=rev
> Log:
> [analyzer] Do not report use of undef on "return foo();" when the return type is void.
> 
> Fixes a false positive found by analyzing LLVM code base.
> 
> Modified:
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
>    cfe/trunk/lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp
>    cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp
>    cfe/trunk/test/Analysis/uninit-vals-ps.c
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h?rev=163750&r1=163749&r2=163750&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h Wed Sep 12 17:57:40 2012
> @@ -293,6 +293,9 @@
>   /// of some kind.
>   static bool isCallStmt(const Stmt *S);
> 
> +  /// \brief Returns the result type of a function, method declaration.
> +  static QualType getDeclaredResultType(const Decl *D);
> +
>   // Iterator access to formal parameters and their types.
> private:
>   typedef std::const_mem_fun_t<QualType, ParmVarDecl> get_type_fun;
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp?rev=163750&r1=163749&r2=163750&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/ReturnUndefChecker.cpp Wed Sep 12 17:57:40 2012
> @@ -16,6 +16,7 @@
> #include "ClangSACheckers.h"
> #include "clang/StaticAnalyzer/Core/Checker.h"
> #include "clang/StaticAnalyzer/Core/CheckerManager.h"
> +#include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
> #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
> 
> @@ -41,6 +42,19 @@
>   if (!C.getState()->getSVal(RetE, C.getLocationContext()).isUndef())
>     return;
> 
> +  // "return;" is modeled to evaluate to an UndefinedValue. Allow UndefinedValue
> +  // to be returned in functions returning void to support the following pattern:
> +  // void foo() {
> +  //  return;
> +  // }
> +  // void test() {
> +  //   return foo();
> +  // }
> +  const StackFrameContext *SFC = C.getStackFrame();
> +  QualType RT = CallEvent::getDeclaredResultType(SFC->getDecl());
> +  if (!RT.isNull() && RT->isSpecificBuiltinType(BuiltinType::Void))
> +    return;

The canonical way to write this would be RT->isVoidType(), which will handle typedefs as well.


>   ExplodedNode *N = C.generateSink();
> 
>   if (!N)
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp?rev=163750&r1=163749&r2=163750&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp Wed Sep 12 17:57:40 2012
> @@ -252,6 +252,16 @@
>                           || isa<CXXNewExpr>(S);
> }
> 
> +/// \brief Returns the result type, adjusted for references.
> +QualType CallEvent::getDeclaredResultType(const Decl *D) {
> +  assert(D);
> +  if (const FunctionDecl* FD = dyn_cast<FunctionDecl>(D))
> +    return FD->getResultType();
> +  else if (const ObjCMethodDecl* MD = dyn_cast<ObjCMethodDecl>(D))
> +    return MD->getResultType();
> +  return QualType();
> +}

This should not live on CallEvent since there is no "call" (even in this test case it's used for the top-level function). Also, it is incomplete (no blocks). AnalysisDeclContext may be a more appropriate location for this?



More information about the cfe-commits mailing list