On Nov 2, 2012, at 19:54 , Anna Zaks <[email protected]> wrote:

> Modified: cfe/trunk/lib/StaticAnalyzer/Core/SymbolManager.cpp
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/SymbolManager.cpp?rev=167352&r1=167351&r2=167352&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/SymbolManager.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/SymbolManager.cpp Fri Nov  2 21:54:20 
> 2012
> @@ -510,6 +510,9 @@
> 
> bool
> SymbolReaper::isLive(const Stmt *ExprVal, const LocationContext *ELCtx) const 
> {
> +  if (LCtx == 0)
> +    return false;
> +
>   if (LCtx != ELCtx) {
>     // If the reaper's location context is a parent of the expression's
>     // location context, then the expression value is now "out of scope".
> @@ -517,6 +520,7 @@
>       return false;
>     return true;
>   }
> +
>   // If no statement is provided, everything is this and parent contexts is 
> live.
>   if (!Loc)
>     return true;
> @@ -526,6 +530,12 @@
> 
> bool SymbolReaper::isLive(const VarRegion *VR, bool includeStoreBindings) 
> const{
>   const StackFrameContext *VarContext = VR->getStackFrame();
> +
> +  if (!VarContext)
> +    return true;
> +
> +  if (!LCtx)
> +    return false;

This might have interesting repercussions for blocks. I'm not sure. I can try 
to come up with a test case.


>   const StackFrameContext *CurrentContext = LCtx->getCurrentStackFrame();
> 
>   if (VarContext == CurrentContext) {
> @@ -557,7 +567,7 @@
>     return false;
>   }
> 
> -  return !VarContext || VarContext->isParentOf(CurrentContext);
> +  return VarContext->isParentOf(CurrentContext);
> }
> 
> SymbolVisitor::~SymbolVisitor() {}
> 
> Modified: cfe/trunk/test/Analysis/simple-stream-checks.c
> URL: 
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/simple-stream-checks.c?rev=167352&r1=167351&r2=167352&view=diff
> ==============================================================================
> --- cfe/trunk/test/Analysis/simple-stream-checks.c (original)
> +++ cfe/trunk/test/Analysis/simple-stream-checks.c Fri Nov  2 21:54:20 2012
> @@ -49,3 +49,17 @@
>     fclose(F);
>   int x = 0; // no warning
> }
> +
> +void leakOnEnfOfPath1(int *Data) {
> +  FILE *F = fopen("myfile.txt", "w");// expected-warning {{Opened file is 
> never closed; potential resource leak}}
> +}
> +
> +void leakOnEnfOfPath2(int *Data) {
> +  FILE *F = fopen("myfile.txt", "w");
> +  return; // expected-warning {{Opened file is never closed; potential 
> resource leak}}
> +}
> +
> +FILE *leakOnEnfOfPath3(int *Data) {
> +  FILE *F = fopen("myfile.txt", "w");
> +  return F;
> +}
> 
> 
> _______________________________________________
> cfe-commits mailing list
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to