diff options
author | Jordan Rose <jordan_rose@apple.com> | 2014-01-07 21:39:48 +0000 |
---|---|---|
committer | Jordan Rose <jordan_rose@apple.com> | 2014-01-07 21:39:48 +0000 |
commit | 514f93541176ca28b21efb625d82487b1abf41f3 (patch) | |
tree | 40622752186b761505c4308199b98d191ca1f8ec /clang/lib/StaticAnalyzer/Core/CallEvent.cpp | |
parent | 6ad4cb4eca2094a3fcde0a90c118632de1b4f939 (diff) | |
download | bcm5719-llvm-514f93541176ca28b21efb625d82487b1abf41f3.tar.gz bcm5719-llvm-514f93541176ca28b21efb625d82487b1abf41f3.zip |
[analyzer] Pointers escape into +[NSValue valueWithPointer:]...
...even though the argument is declared "const void *", because this is
just a way to pass pointers around as objects. (Though NSData is often
a better one.)
PR18262
llvm-svn: 198710
Diffstat (limited to 'clang/lib/StaticAnalyzer/Core/CallEvent.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/CallEvent.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp index e0392bd1473..838d273cc0a 100644 --- a/clang/lib/StaticAnalyzer/Core/CallEvent.cpp +++ b/clang/lib/StaticAnalyzer/Core/CallEvent.cpp @@ -886,6 +886,17 @@ RuntimeDefinition ObjCMethodCall::getRuntimeDefinition() const { return RuntimeDefinition(); } +bool ObjCMethodCall::argumentsMayEscape() const { + if (isInSystemHeader() && !isInstanceMessage()) { + Selector Sel = getSelector(); + if (Sel.getNumArgs() == 1 && + Sel.getIdentifierInfoForSlot(0)->isStr("valueWithPointer")) + return true; + } + + return CallEvent::argumentsMayEscape(); +} + void ObjCMethodCall::getInitialStackFrameContents( const StackFrameContext *CalleeCtx, BindingsTy &Bindings) const { |