[cfe-commits] r162246 - in /cfe/trunk: lib/StaticAnalyzer/Core/BasicConstraintManager.cpp lib/StaticAnalyzer/Core/RangeConstraintManager.cpp test/Analysis/reference.cpp
Ted Kremenek
kremenek at apple.com
Mon Aug 20 21:23:46 PDT 2012
Is there any way for us to pull this up higher? Seems sub-optimal to replicate it in each ConstraintManager.
On Aug 20, 2012, at 5:27 PM, Jordan Rose <jordan_rose at apple.com> wrote:
> Author: jrose
> Date: Mon Aug 20 19:27:33 2012
> New Revision: 162246
>
> URL: http://llvm.org/viewvc/llvm-project?rev=162246&view=rev
> Log:
> [analyzer] Assume that reference symbols are non-null.
>
> By doing this in the constraint managers, we can ensure that ANY reference
> whose value we don't know gets the effect, even if it's not a top-level
> parameter.
>
> Modified:
> cfe/trunk/lib/StaticAnalyzer/Core/BasicConstraintManager.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp
> cfe/trunk/test/Analysis/reference.cpp
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/BasicConstraintManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BasicConstraintManager.cpp?rev=162246&r1=162245&r2=162246&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/BasicConstraintManager.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/BasicConstraintManager.cpp Mon Aug 20 19:27:33 2012
> @@ -363,6 +363,10 @@
> bool BasicConstraintManager::isNotEqual(ProgramStateRef state,
> SymbolRef sym,
> const llvm::APSInt& V) const {
> + // Special case: references are known to be non-zero.
> + if (sym->getType(getBasicVals().getContext())->isReferenceType())
> + if (V == 0)
> + return true;
>
> // Retrieve the NE-set associated with the given symbol.
> const ConstNotEqTy::data_type* T = state->get<ConstNotEq>(sym);
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp?rev=162246&r1=162245&r2=162246&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/RangeConstraintManager.cpp Mon Aug 20 19:27:33 2012
> @@ -380,7 +380,17 @@
> // given symbol type.
> BasicValueFactory &BV = getBasicVals();
> QualType T = sym->getType(BV.getContext());
> - return RangeSet(F, BV.getMinValue(T), BV.getMaxValue(T));
> +
> + RangeSet Result(F, BV.getMinValue(T), BV.getMaxValue(T));
> +
> + // Special case: references are known to be non-zero.
> + if (T->isReferenceType()) {
> + APSIntType IntType = BV.getAPSIntType(T);
> + Result = Result.Intersect(BV, F, ++IntType.getZeroValue(),
> + --IntType.getZeroValue());
> + }
> +
> + return Result;
> }
>
> //===------------------------------------------------------------------------===
>
> Modified: cfe/trunk/test/Analysis/reference.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/reference.cpp?rev=162246&r1=162245&r2=162246&view=diff
> ==============================================================================
> --- cfe/trunk/test/Analysis/reference.cpp (original)
> +++ cfe/trunk/test/Analysis/reference.cpp Mon Aug 20 19:27:33 2012
> @@ -1,3 +1,4 @@
> +// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=basic -verify -Wno-null-dereference %s
> // RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=range -verify -Wno-null-dereference %s
>
> void clang_analyzer_eval(bool);
> @@ -110,6 +111,16 @@
> y = 5; // expected-warning{{Dereference of null pointer}}
> }
>
> +void testReferenceAddress(int &x) {
> + clang_analyzer_eval(&x != 0); // expected-warning{{TRUE}}
> + clang_analyzer_eval(&ref() != 0); // expected-warning{{TRUE}}
> +
> + struct S { int &x; };
> +
> + extern S *getS();
> + clang_analyzer_eval(&getS()->x != 0); // expected-warning{{TRUE}}
> +}
> +
>
> // ------------------------------------
> // False negatives
> @@ -127,5 +138,11 @@
> B *x = 0;
> return *x; // should warn here!
> }
> +}
> +
> +void testReferenceFieldAddress() {
> + struct S { int &x; };
>
> + extern S getS();
> + clang_analyzer_eval(&getS().x != 0); // expected-warning{{UNKNOWN}}
> }
>
>
> _______________________________________________
> 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