r208154 - [analyzer] Functions marked __attribute__((const)) don't modify any memory.
Jordan Rose
jordan_rose at apple.com
Tue May 6 20:29:56 PDT 2014
Author: jrose
Date: Tue May 6 22:29:56 2014
New Revision: 208154
URL: http://llvm.org/viewvc/llvm-project?rev=208154&view=rev
Log:
[analyzer] Functions marked __attribute__((const)) don't modify any memory.
This applies to __attribute__((pure)) as well, but 'const' is more interesting
because many of our builtins are marked 'const'.
PR19661
Modified:
cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp
cfe/trunk/test/Analysis/call-invalidation.cpp
Modified: cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp?rev=208154&r1=208153&r2=208154&view=diff
==============================================================================
--- cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Core/CallEvent.cpp Tue May 6 22:29:56 2014
@@ -139,6 +139,11 @@ ProgramStateRef CallEvent::invalidateReg
ProgramStateRef Orig) const {
ProgramStateRef Result = (Orig ? Orig : getState());
+ // Don't invalidate anything if the callee is marked pure/const.
+ if (const Decl *callee = getDecl())
+ if (callee->hasAttr<PureAttr>() || callee->hasAttr<ConstAttr>())
+ return Result;
+
SmallVector<SVal, 8> ValuesToInvalidate;
RegionAndSymbolInvalidationTraits ETraits;
Modified: cfe/trunk/test/Analysis/call-invalidation.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/call-invalidation.cpp?rev=208154&r1=208153&r2=208154&view=diff
==============================================================================
--- cfe/trunk/test/Analysis/call-invalidation.cpp (original)
+++ cfe/trunk/test/Analysis/call-invalidation.cpp Tue May 6 22:29:56 2014
@@ -89,3 +89,32 @@ void testConstReferenceStruct() {
clang_analyzer_eval(x == 42); // expected-warning{{UNKNOWN}}
}
+
+void usePointerPure(int * const *) __attribute__((pure));
+void usePointerConst(int * const *) __attribute__((const));
+
+void testPureConst() {
+ extern int global;
+ int x;
+ int *p;
+
+ p = &x;
+ x = 42;
+ global = -5;
+ clang_analyzer_eval(x == 42); // expected-warning{{TRUE}}
+ clang_analyzer_eval(global == -5); // expected-warning{{TRUE}}
+
+ usePointerPure(&p);
+ clang_analyzer_eval(x == 42); // expected-warning{{TRUE}}
+ clang_analyzer_eval(global == -5); // expected-warning{{TRUE}}
+
+ usePointerConst(&p);
+ clang_analyzer_eval(x == 42); // expected-warning{{TRUE}}
+ clang_analyzer_eval(global == -5); // expected-warning{{TRUE}}
+
+ usePointer(&p);
+ clang_analyzer_eval(x == 42); // expected-warning{{UNKNOWN}}
+ clang_analyzer_eval(global == -5); // expected-warning{{UNKNOWN}}
+}
+
+
More information about the cfe-commits
mailing list