[cfe-commits] r159160 - in /cfe/trunk: include/clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h lib/StaticAnalyzer/Checkers/MallocChecker.cpp test/Analysis/new.cpp

Anna Zaks ganna at apple.com
Fri Jul 27 13:51:41 PDT 2012


The function definition is becoming too beefy,  could be moved out of the header.
Anna.
On Jun 25, 2012, at 1:48 PM, Jordan Rose wrote:

> Author: jrose
> Date: Mon Jun 25 15:48:28 2012
> New Revision: 159160
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=159160&view=rev
> Log:
> [analyzer] Be careful about implicitly-declared operator new/delete. (PR13090)
> 
> The implicit global allocation functions do not have valid source locations,
> but we still want to treat them as being "system header" functions for the
> purposes of how they affect program state.
> 
> Modified:
>    cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h
>    cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
>    cfe/trunk/test/Analysis/new.cpp
> 
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h?rev=159160&r1=159159&r2=159160&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h Mon Jun 25 15:48:28 2012
> @@ -199,10 +199,16 @@
> 
>   /// Check if the callee is declared in the system header.
>   bool isInSystemHeader() const {
> -    if (const Decl *FD = getDecl()) {
> +    if (const Decl *D = getDecl()) {
>       const SourceManager &SM =
>         State->getStateManager().getContext().getSourceManager();
> -      return SM.isInSystemHeader(FD->getLocation());
> +      SourceLocation Loc = D->getLocation();
> +      // Be careful: the implicit declarations of operator new/delete have
> +      // invalid source locations but should still count as system files.
> +      if (Loc.isValid())
> +        return SM.isInSystemHeader(D->getLocation());
> +      else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
> +        return FD->isOverloadedOperator() && FD->isImplicit() && FD->isGlobal();
>     }
>     return false;
>   }
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp?rev=159160&r1=159159&r2=159160&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp Mon Jun 25 15:48:28 2012
> @@ -1338,8 +1338,7 @@
>   }
> 
>   // If it's not a system call, assume it frees memory.
> -  SourceManager &SM = ASTC.getSourceManager();
> -  if (!SM.isInSystemHeader(D->getLocation()))
> +  if (!Call->isInSystemHeader())
>     return false;
> 
>   // Process C/ObjC functions.
> 
> Modified: cfe/trunk/test/Analysis/new.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/new.cpp?rev=159160&r1=159159&r2=159160&view=diff
> ==============================================================================
> --- cfe/trunk/test/Analysis/new.cpp (original)
> +++ cfe/trunk/test/Analysis/new.cpp Mon Jun 25 15:48:28 2012
> @@ -5,6 +5,21 @@
> typedef typeof(sizeof(int)) size_t;
> extern "C" void *malloc(size_t);
> 
> +int someGlobal;
> +void testImplicitlyDeclaredGlobalNew() {
> +  if (someGlobal != 0)
> +    return;
> +
> +  // This used to crash because the global operator new is being implicitly
> +  // declared and it does not have a valid source location. (PR13090)
> +  void *x = ::operator new(0);
> +  ::operator delete(x);
> +
> +  // Check that the new/delete did not invalidate someGlobal;
> +  clang_analyzer_eval(someGlobal == 0); // expected-warning{{TRUE}}
> +}
> +
> +
> // This is the standard placement new.
> inline void* operator new(size_t, void* __p) throw()
> {
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list