[cfe-commits] r159559 - in /cfe/trunk: include/clang/StaticAnalyzer/Core/ include/clang/StaticAnalyzer/Core/PathSensitive/ lib/StaticAnalyzer/Checkers/ lib/StaticAnalyzer/Core/
David Blaikie
dblaikie at gmail.com
Mon Jul 2 13:46:27 PDT 2012
On Mon, Jul 2, 2012 at 12:28 PM, Jordan Rose <jordan_rose at apple.com> wrote:
> Author: jrose
> Date: Mon Jul 2 14:28:04 2012
> New Revision: 159559
>
> URL: http://llvm.org/viewvc/llvm-project?rev=159559&view=rev
> Log:
> [analyzer] Finish replacing ObjCMessage with ObjCMethodDecl and friends.
>
> The preObjCMessage and postObjCMessage callbacks now take an ObjCMethodCall
> argument, which can represent an explicit message send (ObjCMessageSend) or an
> implicit message generated by a property access (ObjCPropertyAccess).
>
> Removed:
> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h
> Modified:
> cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h
> cfe/trunk/include/clang/StaticAnalyzer/Core/CheckerManager.h
> cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/Calls.h
> cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/NSAutoreleasePoolChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/NoReturnFunctionChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/Calls.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
> cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp
>
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/Checker.h Mon Jul 2 14:28:04 2012
> @@ -122,7 +122,7 @@
>
> class PreObjCMessage {
> template <typename CHECKER>
> - static void _checkObjCMessage(void *checker, const ObjCMessage &msg,
> + static void _checkObjCMessage(void *checker, const ObjCMethodCall &msg,
> CheckerContext &C) {
> ((const CHECKER *)checker)->checkPreObjCMessage(msg, C);
> }
> @@ -137,7 +137,7 @@
>
> class PostObjCMessage {
> template <typename CHECKER>
> - static void _checkObjCMessage(void *checker, const ObjCMessage &msg,
> + static void _checkObjCMessage(void *checker, const ObjCMethodCall &msg,
> CheckerContext &C) {
> ((const CHECKER *)checker)->checkPostObjCMessage(msg, C);
> }
>
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/CheckerManager.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/CheckerManager.h?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/CheckerManager.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/CheckerManager.h Mon Jul 2 14:28:04 2012
> @@ -33,7 +33,7 @@
> class AnalysisManager;
> class BugReporter;
> class CheckerContext;
> - class ObjCMessage;
> + class ObjCMethodCall;
> class SVal;
> class ExplodedNode;
> class ExplodedNodeSet;
> @@ -207,7 +207,7 @@
> /// \brief Run checkers for pre-visiting obj-c messages.
> void runCheckersForPreObjCMessage(ExplodedNodeSet &Dst,
> const ExplodedNodeSet &Src,
> - const ObjCMessage &msg,
> + const ObjCMethodCall &msg,
> ExprEngine &Eng) {
> runCheckersForObjCMessage(/*isPreVisit=*/true, Dst, Src, msg, Eng);
> }
> @@ -215,7 +215,7 @@
> /// \brief Run checkers for post-visiting obj-c messages.
> void runCheckersForPostObjCMessage(ExplodedNodeSet &Dst,
> const ExplodedNodeSet &Src,
> - const ObjCMessage &msg,
> + const ObjCMethodCall &msg,
> ExprEngine &Eng) {
> runCheckersForObjCMessage(/*isPreVisit=*/false, Dst, Src, msg, Eng);
> }
> @@ -224,7 +224,7 @@
> void runCheckersForObjCMessage(bool isPreVisit,
> ExplodedNodeSet &Dst,
> const ExplodedNodeSet &Src,
> - const ObjCMessage &msg, ExprEngine &Eng);
> + const ObjCMethodCall &msg, ExprEngine &Eng);
>
> /// \brief Run checkers for load/store of a location.
> void runCheckersForLocation(ExplodedNodeSet &Dst,
> @@ -343,7 +343,7 @@
>
> typedef CheckerFn<void (const Stmt *, CheckerContext &)> CheckStmtFunc;
>
> - typedef CheckerFn<void (const ObjCMessage &, CheckerContext &)>
> + typedef CheckerFn<void (const ObjCMethodCall &, CheckerContext &)>
> CheckObjCMessageFunc;
>
> typedef CheckerFn<void (const SVal &location, bool isLoad,
>
> Modified: cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/Calls.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/Calls.h?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/Calls.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/Calls.h Mon Jul 2 14:28:04 2012
> @@ -20,8 +20,7 @@
> #include "clang/AST/DeclCXX.h"
> #include "clang/AST/ExprCXX.h"
> #include "clang/AST/ExprObjC.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h"
> +#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
>
> namespace clang {
> @@ -114,6 +113,10 @@
> /// \brief Returns the kind of call this is.
> Kind getKind() const { return K; }
>
> + /// \brief Returns a source range for the entire call, suitable for
> + /// outputting in diagnostics.
> + virtual SourceRange getSourceRange() const = 0;
> +
> /// \brief Returns the value of a given argument at the time of the call.
> virtual SVal getArgSVal(unsigned Index) const;
>
> @@ -213,6 +216,7 @@
> const FunctionDecl *getDecl() const;
>
> unsigned getNumArgs() const { return CE->getNumArgs(); }
> + SourceRange getSourceRange() const { return CE->getSourceRange(); }
>
> const Expr *getArgExpr(unsigned Index) const {
> return CE->getArg(Index);
> @@ -305,6 +309,7 @@
> : AnyFunctionCall(St, LCtx, CE_CXXConstructor), CE(ce), Target(target) {}
>
> const CXXConstructExpr *getOriginExpr() const { return CE; }
> + SourceRange getSourceRange() const { return CE->getSourceRange(); }
>
> const CXXConstructorDecl *getDecl() const {
> return CE->getConstructor();
> @@ -341,7 +346,9 @@
> Selector getSelector() const { return Msg->getSelector(); }
> bool isInstanceMessage() const { return Msg->isInstanceMessage(); }
> ObjCMethodFamily getMethodFamily() const { return Msg->getMethodFamily(); }
> +
> const ObjCMethodDecl *getDecl() const { return Msg->getMethodDecl(); }
> + SourceRange getSourceRange() const { return Msg->getSourceRange(); }
> unsigned getNumArgs() const { return Msg->getNumArgs(); }
> const Expr *getArgExpr(unsigned Index) const {
> return Msg->getArg(Index);
> @@ -351,6 +358,10 @@
>
> SVal getReceiverSVal() const;
>
> + const Expr *getInstanceReceiverExpr() const {
> + return Msg->getInstanceReceiver();
> + }
> +
> const ObjCInterfaceDecl *getReceiverInterface() const {
> return Msg->getReceiverInterface();
> }
> @@ -359,11 +370,6 @@
> return Msg->getReceiverRange();
> }
>
> - // FIXME: Remove this once everything is converted to use ObjCMethodCall.
> - virtual operator ObjCMessage() const {
> - return ObjCMessage(Msg);
> - }
> -
> static bool classof(const CallEvent *CA) {
> return CA->getKind() >= CE_BEG_OBJC_CALLS &&
> CA->getKind() <= CE_END_OBJC_CALLS;
> @@ -389,20 +395,23 @@
> /// Example: obj.prop += 1;
> class ObjCPropertyAccess : public ObjCMethodCall {
> const ObjCPropertyRefExpr *PropE;
> + SourceRange EntireRange;
>
> public:
> - ObjCPropertyAccess(const ObjCPropertyRefExpr *pe, const ObjCMessageExpr *Msg,
> - const ProgramStateRef St, const LocationContext *LCtx)
> - : ObjCMethodCall(Msg, St, LCtx, CE_ObjCPropertyAccess), PropE(pe) {}
> + ObjCPropertyAccess(const ObjCPropertyRefExpr *pe, SourceRange range,
> + const ObjCMessageExpr *Msg, const ProgramStateRef St,
> + const LocationContext *LCtx)
> + : ObjCMethodCall(Msg, St, LCtx, CE_ObjCPropertyAccess), PropE(pe),
> + EntireRange(range)
> + {}
>
> /// \brief Returns true if this property access is calling the setter method.
> bool isSetter() const {
> return getNumArgs() > 0;
> }
>
> - // FIXME: Remove this once everything is converted to use ObjCMethodCall.
> - operator ObjCMessage() const {
> - return ObjCMessage(getOriginExpr(), PropE, isSetter());
This change rendered the PropE member unused & breaks the -Werror
clang build (due to -Wunused-private-field). I've removed the member
(& then unused ctor parameter, and then unused local variable at the
ctor call site) in r159581. Feel free to re-add it & use it in
whatever way you see fit if this wasn't the right solution.
Thanks,
- David
> + SourceRange getSourceRange() const {
> + return EntireRange;
> }
>
> static bool classof(const CallEvent *CA) {
>
> Removed: 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=159558&view=auto
> ==============================================================================
> --- cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h (original)
> +++ cfe/trunk/include/clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h (removed)
> @@ -1,163 +0,0 @@
> -//===- ObjCMessage.h - Wrapper for ObjC messages and dot syntax ---*- C++ -*--//
> -//
> -// The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -//
> -// This file defines ObjCMessage which serves as a common wrapper for ObjC
> -// message expressions or implicit messages for loading/storing ObjC properties.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_OBJCMESSAGE
> -#define LLVM_CLANG_STATICANALYZER_PATHSENSITIVE_OBJCMESSAGE
> -
> -#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
> -#include "clang/AST/ExprObjC.h"
> -#include "clang/AST/ExprCXX.h"
> -#include "clang/Basic/SourceManager.h"
> -#include "llvm/ADT/PointerUnion.h"
> -#include "llvm/ADT/StringExtras.h"
> -#include "llvm/Support/Compiler.h"
> -
> -namespace clang {
> -namespace ento {
> -using llvm::StrInStrNoCase;
> -
> -/// \brief Represents both explicit ObjC message expressions and implicit
> -/// messages that are sent for handling properties in dot syntax.
> -class ObjCMessage {
> - const ObjCMessageExpr *Msg;
> - const ObjCPropertyRefExpr *PE;
> - const bool IsPropSetter;
> -public:
> - ObjCMessage() : Msg(0), PE(0), IsPropSetter(false) {}
> -
> - ObjCMessage(const ObjCMessageExpr *E, const ObjCPropertyRefExpr *pe = 0,
> - bool isSetter = false)
> - : Msg(E), PE(pe), IsPropSetter(isSetter) {
> - assert(E && "should not be initialized with null expression");
> - }
> -
> - bool isValid() const { return Msg; }
> -
> - bool isPureMessageExpr() const { return !PE; }
> -
> - bool isPropertyGetter() const { return PE && !IsPropSetter; }
> -
> - bool isPropertySetter() const {
> - return IsPropSetter;
> - }
> -
> - const ObjCMessageExpr *getMessageExpr() const {
> - return Msg;
> - }
> -
> - QualType getType(ASTContext &ctx) const {
> - return Msg->getType();
> - }
> -
> - QualType getResultType(ASTContext &ctx) const {
> - if (const ObjCMethodDecl *MD = Msg->getMethodDecl())
> - return MD->getResultType();
> - return getType(ctx);
> - }
> -
> - ObjCMethodFamily getMethodFamily() const {
> - return Msg->getMethodFamily();
> - }
> -
> - Selector getSelector() const {
> - return Msg->getSelector();
> - }
> -
> - const Expr *getInstanceReceiver() const {
> - return Msg->getInstanceReceiver();
> - }
> -
> - SVal getInstanceReceiverSVal(ProgramStateRef State,
> - const LocationContext *LC) const {
> - if (!isInstanceMessage())
> - return UndefinedVal();
> - if (const Expr *Ex = getInstanceReceiver())
> - return State->getSValAsScalarOrLoc(Ex, LC);
> -
> - // An instance message with no expression means we are sending to super.
> - // In this case the object reference is the same as 'self'.
> - const ImplicitParamDecl *SelfDecl = LC->getSelfDecl();
> - assert(SelfDecl && "No message receiver Expr, but not in an ObjC method");
> - return State->getSVal(State->getRegion(SelfDecl, LC));
> - }
> -
> - bool isInstanceMessage() const {
> - return Msg->isInstanceMessage();
> - }
> -
> - const ObjCMethodDecl *getMethodDecl() const {
> - return Msg->getMethodDecl();
> - }
> -
> - const ObjCInterfaceDecl *getReceiverInterface() const {
> - return Msg->getReceiverInterface();
> - }
> -
> - SourceLocation getSuperLoc() const {
> - if (PE)
> - return PE->getReceiverLocation();
> - return Msg->getSuperLoc();
> - }
> -
> - SourceRange getSourceRange() const LLVM_READONLY {
> - if (PE)
> - return PE->getSourceRange();
> - return Msg->getSourceRange();
> - }
> -
> - unsigned getNumArgs() const {
> - return Msg->getNumArgs();
> - }
> -
> - SVal getArgSVal(unsigned i,
> - const LocationContext *LCtx,
> - ProgramStateRef state) const {
> - assert(i < getNumArgs() && "Invalid index for argument");
> - return state->getSVal(Msg->getArg(i), LCtx);
> - }
> -
> - QualType getArgType(unsigned i) const {
> - assert(i < getNumArgs() && "Invalid index for argument");
> - return Msg->getArg(i)->getType();
> - }
> -
> - const Expr *getArgExpr(unsigned i) const {
> - assert(i < getNumArgs() && "Invalid index for argument");
> - return Msg->getArg(i);
> - }
> -
> - SourceRange getArgSourceRange(unsigned i) const {
> - const Expr *argE = getArgExpr(i);
> - return argE->getSourceRange();
> - }
> -
> - SourceRange getReceiverSourceRange() const {
> - if (PE) {
> - if (PE->isObjectReceiver())
> - return PE->getBase()->getSourceRange();
> - }
> - else {
> - return Msg->getReceiverRange();
> - }
> -
> - // FIXME: This isn't a range.
> - return PE->getReceiverLocation();
> - }
> -};
> -
> -}
> -}
> -
> -#endif
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp Mon Jul 2 14:28:04 2012
> @@ -17,10 +17,10 @@
> #include "clang/Analysis/DomainSpecific/CocoaConventions.h"
> #include "clang/StaticAnalyzer/Core/Checker.h"
> #include "clang/StaticAnalyzer/Core/CheckerManager.h"
> +#include "clang/StaticAnalyzer/Core/PathSensitive/Calls.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/ExplodedGraph.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
> #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h"
> @@ -46,10 +46,10 @@
> // Utility functions.
> //===----------------------------------------------------------------------===//
>
> -static const char* GetReceiverNameType(const ObjCMessage &msg) {
> +static StringRef GetReceiverInterfaceName(const ObjCMethodCall &msg) {
> if (const ObjCInterfaceDecl *ID = msg.getReceiverInterface())
> - return ID->getIdentifier()->getNameStart();
> - return 0;
> + return ID->getIdentifier()->getName();
> + return StringRef();
> }
>
> enum FoundationClass {
> @@ -95,15 +95,15 @@
> mutable OwningPtr<APIMisuse> BT;
>
> void WarnNilArg(CheckerContext &C,
> - const ObjCMessage &msg, unsigned Arg) const;
> + const ObjCMethodCall &msg, unsigned Arg) const;
>
> public:
> - void checkPreObjCMessage(ObjCMessage msg, CheckerContext &C) const;
> + void checkPreObjCMessage(const ObjCMethodCall &M, CheckerContext &C) const;
> };
> }
>
> void NilArgChecker::WarnNilArg(CheckerContext &C,
> - const ObjCMessage &msg,
> + const ObjCMethodCall &msg,
> unsigned int Arg) const
> {
> if (!BT)
> @@ -112,7 +112,7 @@
> if (ExplodedNode *N = C.generateSink()) {
> SmallString<128> sbuf;
> llvm::raw_svector_ostream os(sbuf);
> - os << "Argument to '" << GetReceiverNameType(msg) << "' method '"
> + os << "Argument to '" << GetReceiverInterfaceName(msg) << "' method '"
> << msg.getSelector().getAsString() << "' cannot be nil";
>
> BugReport *R = new BugReport(*BT, os.str(), N);
> @@ -121,7 +121,7 @@
> }
> }
>
> -void NilArgChecker::checkPreObjCMessage(ObjCMessage msg,
> +void NilArgChecker::checkPreObjCMessage(const ObjCMethodCall &msg,
> CheckerContext &C) const {
> const ObjCInterfaceDecl *ID = msg.getReceiverInterface();
> if (!ID)
> @@ -151,7 +151,7 @@
> Name == "compare:options:range:locale:" ||
> Name == "componentsSeparatedByCharactersInSet:" ||
> Name == "initWithFormat:") {
> - if (isNil(msg.getArgSVal(0, C.getLocationContext(), C.getState())))
> + if (isNil(msg.getArgSVal(0)))
> WarnNilArg(C, msg, 0);
> }
> }
> @@ -455,11 +455,11 @@
> mutable OwningPtr<BugType> BT;
>
> public:
> - void checkPreObjCMessage(ObjCMessage msg, CheckerContext &C) const;
> + void checkPreObjCMessage(const ObjCMethodCall &msg, CheckerContext &C) const;
> };
> }
>
> -void ClassReleaseChecker::checkPreObjCMessage(ObjCMessage msg,
> +void ClassReleaseChecker::checkPreObjCMessage(const ObjCMethodCall &msg,
> CheckerContext &C) const {
>
> if (!BT) {
> @@ -511,18 +511,18 @@
> mutable Selector initWithObjectsAndKeysS;
> mutable OwningPtr<BugType> BT;
>
> - bool isVariadicMessage(const ObjCMessage &msg) const;
> + bool isVariadicMessage(const ObjCMethodCall &msg) const;
>
> public:
> - void checkPreObjCMessage(ObjCMessage msg, CheckerContext &C) const;
> + void checkPreObjCMessage(const ObjCMethodCall &msg, CheckerContext &C) const;
> };
> }
>
> /// isVariadicMessage - Returns whether the given message is a variadic message,
> /// where all arguments must be Objective-C types.
> bool
> -VariadicMethodTypeChecker::isVariadicMessage(const ObjCMessage &msg) const {
> - const ObjCMethodDecl *MD = msg.getMethodDecl();
> +VariadicMethodTypeChecker::isVariadicMessage(const ObjCMethodCall &msg) const {
> + const ObjCMethodDecl *MD = msg.getDecl();
>
> if (!MD || !MD->isVariadic() || isa<ObjCProtocolDecl>(MD->getDeclContext()))
> return false;
> @@ -566,7 +566,7 @@
> }
> }
>
> -void VariadicMethodTypeChecker::checkPreObjCMessage(ObjCMessage msg,
> +void VariadicMethodTypeChecker::checkPreObjCMessage(const ObjCMethodCall &msg,
> CheckerContext &C) const {
> if (!BT) {
> BT.reset(new APIMisuse("Arguments passed to variadic method aren't all "
> @@ -602,7 +602,7 @@
> ProgramStateRef state = C.getState();
>
> for (unsigned I = variadicArgsBegin; I != variadicArgsEnd; ++I) {
> - QualType ArgTy = msg.getArgType(I);
> + QualType ArgTy = msg.getArgExpr(I)->getType();
> if (ArgTy->isObjCObjectPointerType())
> continue;
>
> @@ -611,8 +611,7 @@
> continue;
>
> // Ignore pointer constants.
> - if (isa<loc::ConcreteInt>(msg.getArgSVal(I, C.getLocationContext(),
> - state)))
> + if (isa<loc::ConcreteInt>(msg.getArgSVal(I)))
> continue;
>
> // Ignore pointer types annotated with 'NSObject' attribute.
> @@ -624,9 +623,8 @@
> continue;
>
> // Generate only one error node to use for all bug reports.
> - if (!errorNode.hasValue()) {
> + if (!errorNode.hasValue())
> errorNode = C.addTransition();
> - }
>
> if (!errorNode.getValue())
> continue;
> @@ -634,17 +632,18 @@
> SmallString<128> sbuf;
> llvm::raw_svector_ostream os(sbuf);
>
> - if (const char *TypeName = GetReceiverNameType(msg))
> + StringRef TypeName = GetReceiverInterfaceName(msg);
> + if (!TypeName.empty())
> os << "Argument to '" << TypeName << "' method '";
> else
> os << "Argument to method '";
>
> os << msg.getSelector().getAsString()
> - << "' should be an Objective-C pointer type, not '"
> - << ArgTy.getAsString() << "'";
> + << "' should be an Objective-C pointer type, not '";
> + ArgTy.print(os, C.getLangOpts());
> + os << "'";
>
> - BugReport *R = new BugReport(*BT, os.str(),
> - errorNode.getValue());
> + BugReport *R = new BugReport(*BT, os.str(), errorNode.getValue());
> R->addRange(msg.getArgSourceRange(I));
> C.EmitReport(R);
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CallAndMessageChecker.cpp Mon Jul 2 14:28:04 2012
> @@ -17,7 +17,6 @@
> #include "clang/StaticAnalyzer/Core/CheckerManager.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/Calls.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
> #include "clang/AST/ParentMap.h"
> #include "clang/Basic/TargetInfo.h"
> @@ -39,7 +38,7 @@
> public:
>
> void checkPreStmt(const CallExpr *CE, CheckerContext &C) const;
> - void checkPreObjCMessage(ObjCMessage msg, CheckerContext &C) const;
> + void checkPreObjCMessage(const ObjCMethodCall &msg, CheckerContext &C) const;
>
> private:
> static void PreVisitProcessArgs(CheckerContext &C, const CallEvent &Call,
> @@ -51,12 +50,12 @@
> OwningPtr<BugType> &BT);
>
> static void EmitBadCall(BugType *BT, CheckerContext &C, const CallExpr *CE);
> - void emitNilReceiverBug(CheckerContext &C, const ObjCMessage &msg,
> + void emitNilReceiverBug(CheckerContext &C, const ObjCMethodCall &msg,
> ExplodedNode *N) const;
>
> void HandleNilReceiver(CheckerContext &C,
> ProgramStateRef state,
> - ObjCMessage msg) const;
> + const ObjCMethodCall &msg) const;
>
> static void LazyInit_BT(const char *desc, OwningPtr<BugType> &BT) {
> if (!BT)
> @@ -248,65 +247,61 @@
> }
> }
>
> -void CallAndMessageChecker::checkPreObjCMessage(ObjCMessage msg,
> +void CallAndMessageChecker::checkPreObjCMessage(const ObjCMethodCall &msg,
> CheckerContext &C) const {
> + SVal recVal = msg.getReceiverSVal();
> + if (recVal.isUndef()) {
> + if (ExplodedNode *N = C.generateSink()) {
> + BugType *BT = 0;
> + if (isa<ObjCPropertyAccess>(msg)) {
> + if (!BT_objc_prop_undef)
> + BT_objc_prop_undef.reset(new BuiltinBug("Property access on an "
> + "uninitialized object pointer"));
> + BT = BT_objc_prop_undef.get();
> + } else {
> + if (!BT_msg_undef)
> + BT_msg_undef.reset(new BuiltinBug("Receiver in message expression "
> + "is an uninitialized value"));
> + BT = BT_msg_undef.get();
> + }
> + BugReport *R = new BugReport(*BT, BT->getName(), N);
> + R->addRange(msg.getReceiverSourceRange());
>
> - ProgramStateRef state = C.getState();
> - const LocationContext *LCtx = C.getLocationContext();
> -
> - // FIXME: Handle 'super'?
> - if (const Expr *receiver = msg.getInstanceReceiver()) {
> - SVal recVal = state->getSVal(receiver, LCtx);
> - if (recVal.isUndef()) {
> - if (ExplodedNode *N = C.generateSink()) {
> - BugType *BT = 0;
> - if (msg.isPureMessageExpr()) {
> - if (!BT_msg_undef)
> - BT_msg_undef.reset(new BuiltinBug("Receiver in message expression "
> - "is an uninitialized value"));
> - BT = BT_msg_undef.get();
> - }
> - else {
> - if (!BT_objc_prop_undef)
> - BT_objc_prop_undef.reset(new BuiltinBug("Property access on an "
> - "uninitialized object pointer"));
> - BT = BT_objc_prop_undef.get();
> - }
> - BugReport *R =
> - new BugReport(*BT, BT->getName(), N);
> - R->addRange(receiver->getSourceRange());
> + // FIXME: getTrackNullOrUndefValueVisitor can't handle "super" yet.
> + if (const Expr *ReceiverE = msg.getInstanceReceiverExpr())
> R->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N,
> - receiver,
> + ReceiverE,
> R));
> - C.EmitReport(R);
> - }
> + C.EmitReport(R);
> + }
> + return;
> + } else {
> + // Bifurcate the state into nil and non-nil ones.
> + DefinedOrUnknownSVal receiverVal = cast<DefinedOrUnknownSVal>(recVal);
> +
> + ProgramStateRef state = C.getState();
> + ProgramStateRef notNilState, nilState;
> + llvm::tie(notNilState, nilState) = state->assume(receiverVal);
> +
> + // Handle receiver must be nil.
> + if (nilState && !notNilState) {
> + HandleNilReceiver(C, state, msg);
> return;
> - } else {
> - // Bifurcate the state into nil and non-nil ones.
> - DefinedOrUnknownSVal receiverVal = cast<DefinedOrUnknownSVal>(recVal);
> -
> - ProgramStateRef notNilState, nilState;
> - llvm::tie(notNilState, nilState) = state->assume(receiverVal);
> -
> - // Handle receiver must be nil.
> - if (nilState && !notNilState) {
> - HandleNilReceiver(C, state, msg);
> - return;
> - }
> }
> }
>
> - const char *bugDesc = msg.isPropertySetter() ?
> - "Argument for property setter is an uninitialized value"
> - : "Argument in message expression is an uninitialized value";
> + const char *bugDesc = "Argument in message expression is an "
> + "uninitialized value";
> + if (const ObjCPropertyAccess *Prop = dyn_cast<ObjCPropertyAccess>(&msg))
> + if (Prop->isSetter())
> + bugDesc = "Argument for property setter is an uninitialized value";
> +
> // Check for any arguments that are uninitialized/undefined.
> - // FIXME: ObjCMessage is set to be removed soon.
> - PreVisitProcessArgs(C, ObjCMessageSend(msg.getMessageExpr(), state, LCtx),
> - bugDesc, BT_msg_arg);
> + PreVisitProcessArgs(C, msg, bugDesc, BT_msg_arg);
> }
>
> void CallAndMessageChecker::emitNilReceiverBug(CheckerContext &C,
> - const ObjCMessage &msg,
> + const ObjCMethodCall &msg,
> ExplodedNode *N) const {
>
> if (!BT_msg_ret)
> @@ -317,11 +312,13 @@
> SmallString<200> buf;
> llvm::raw_svector_ostream os(buf);
> os << "The receiver of message '" << msg.getSelector().getAsString()
> - << "' is nil and returns a value of type '"
> - << msg.getType(C.getASTContext()).getAsString() << "' that will be garbage";
> + << "' is nil and returns a value of type '";
> + msg.getResultType().print(os, C.getLangOpts());
> + os << "' that will be garbage";
>
> BugReport *report = new BugReport(*BT_msg_ret, os.str(), N);
> - if (const Expr *receiver = msg.getInstanceReceiver()) {
> + // FIXME: This won't track "self" in messages to super.
> + if (const Expr *receiver = msg.getInstanceReceiverExpr()) {
> report->addRange(receiver->getSourceRange());
> report->addVisitor(bugreporter::getTrackNullOrUndefValueVisitor(N,
> receiver,
> @@ -338,25 +335,25 @@
>
> void CallAndMessageChecker::HandleNilReceiver(CheckerContext &C,
> ProgramStateRef state,
> - ObjCMessage msg) const {
> + const ObjCMethodCall &Msg) const {
> ASTContext &Ctx = C.getASTContext();
>
> // Check the return type of the message expression. A message to nil will
> // return different values depending on the return type and the architecture.
> - QualType RetTy = msg.getType(Ctx);
> + QualType RetTy = Msg.getResultType();
> CanQualType CanRetTy = Ctx.getCanonicalType(RetTy);
> const LocationContext *LCtx = C.getLocationContext();
>
> if (CanRetTy->isStructureOrClassType()) {
> // Structure returns are safe since the compiler zeroes them out.
> - SVal V = C.getSValBuilder().makeZeroVal(msg.getType(Ctx));
> - C.addTransition(state->BindExpr(msg.getMessageExpr(), LCtx, V));
> + SVal V = C.getSValBuilder().makeZeroVal(RetTy);
> + C.addTransition(state->BindExpr(Msg.getOriginExpr(), LCtx, V));
> return;
> }
>
> // Other cases: check if sizeof(return type) > sizeof(void*)
> if (CanRetTy != Ctx.VoidTy && C.getLocationContext()->getParentMap()
> - .isConsumedExpr(msg.getMessageExpr())) {
> + .isConsumedExpr(Msg.getOriginExpr())) {
> // Compute: sizeof(void *) and sizeof(return type)
> const uint64_t voidPtrSize = Ctx.getTypeSize(Ctx.VoidPtrTy);
> const uint64_t returnTypeSize = Ctx.getTypeSize(CanRetTy);
> @@ -369,7 +366,7 @@
> Ctx.LongLongTy == CanRetTy ||
> Ctx.UnsignedLongLongTy == CanRetTy))) {
> if (ExplodedNode *N = C.generateSink(state))
> - emitNilReceiverBug(C, msg, N);
> + emitNilReceiverBug(C, Msg, N);
> return;
> }
>
> @@ -386,8 +383,8 @@
> // it most likely isn't nil. We should assume the semantics
> // of this case unless we have *a lot* more knowledge.
> //
> - SVal V = C.getSValBuilder().makeZeroVal(msg.getType(Ctx));
> - C.addTransition(state->BindExpr(msg.getMessageExpr(), LCtx, V));
> + SVal V = C.getSValBuilder().makeZeroVal(RetTy);
> + C.addTransition(state->BindExpr(Msg.getOriginExpr(), LCtx, V));
> return;
> }
>
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/CheckerDocumentation.cpp Mon Jul 2 14:28:04 2012
> @@ -76,10 +76,10 @@
> void checkPostStmt(const CallExpr *DS, CheckerContext &C) const;
>
> /// \brief Pre-visit the Objective C messages.
> - void checkPreObjCMessage(const ObjCMessage &Msg, CheckerContext &C) const {}
> + void checkPreObjCMessage(const ObjCMethodCall &M, CheckerContext &C) const {}
>
> /// \brief Post-visit the Objective C messages.
> - void checkPostObjCMessage(const ObjCMessage &Msg, CheckerContext &C) const {}
> + void checkPostObjCMessage(const ObjCMethodCall &M, CheckerContext &C) const {}
>
> /// \brief Pre-visit of the condition statement of a branch (such as IfStmt).
> void checkBranchCondition(const Stmt *Condition, CheckerContext &Ctx) const {}
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MallocChecker.cpp Mon Jul 2 14:28:04 2012
> @@ -124,7 +124,7 @@
>
> void checkPreStmt(const CallExpr *S, CheckerContext &C) const;
> void checkPostStmt(const CallExpr *CE, CheckerContext &C) const;
> - void checkPreObjCMessage(const ObjCMessage &Msg, CheckerContext &C) const;
> + void checkPreObjCMessage(const ObjCMethodCall &Call, CheckerContext &C) const;
> void checkPostStmt(const BlockExpr *BE, CheckerContext &C) const;
> void checkDeadSymbols(SymbolReaper &SymReaper, CheckerContext &C) const;
> void checkEndPath(CheckerContext &C) const;
> @@ -491,29 +491,21 @@
> return false;
> }
>
> -void MallocChecker::checkPreObjCMessage(const ObjCMessage &Msg,
> +void MallocChecker::checkPreObjCMessage(const ObjCMethodCall &Call,
> CheckerContext &C) const {
> - const ObjCMethodDecl *MD = Msg.getMethodDecl();
> - if (!MD)
> - return;
> -
> - // FIXME: ObjCMessage is going away soon.
> - ObjCMessageSend Call(Msg.getMessageExpr(), C.getState(),
> - C.getLocationContext());
> - Selector S = Msg.getSelector();
> -
> // If the first selector is dataWithBytesNoCopy, assume that the memory will
> // be released with 'free' by the new object.
> // Ex: [NSData dataWithBytesNoCopy:bytes length:10];
> // Unless 'freeWhenDone' param set to 0.
> // TODO: Check that the memory was allocated with malloc.
> + Selector S = Call.getSelector();
> if ((S.getNameForSlot(0) == "dataWithBytesNoCopy" ||
> S.getNameForSlot(0) == "initWithBytesNoCopy" ||
> S.getNameForSlot(0) == "initWithCharactersNoCopy") &&
> !isFreeWhenDoneSetToZero(Call)){
> unsigned int argIdx = 0;
> C.addTransition(FreeMemAux(C, Call.getArgExpr(argIdx),
> - Msg.getMessageExpr(), C.getState(), true));
> + Call.getOriginExpr(), C.getState(), true));
> }
> }
>
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/NSAutoreleasePoolChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/NSAutoreleasePoolChecker.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/NSAutoreleasePoolChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/NSAutoreleasePoolChecker.cpp Mon Jul 2 14:28:04 2012
> @@ -20,9 +20,9 @@
> #include "clang/StaticAnalyzer/Core/CheckerManager.h"
> #include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
> #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
> +#include "clang/StaticAnalyzer/Core/PathSensitive/Calls.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> #include "clang/AST/DeclObjC.h"
> #include "clang/AST/Decl.h"
>
> @@ -36,29 +36,20 @@
> mutable Selector releaseS;
>
> public:
> - void checkPreObjCMessage(ObjCMessage msg, CheckerContext &C) const;
> + void checkPreObjCMessage(const ObjCMethodCall &msg, CheckerContext &C) const;
> };
>
> } // end anonymous namespace
>
> -void NSAutoreleasePoolChecker::checkPreObjCMessage(ObjCMessage msg,
> +void NSAutoreleasePoolChecker::checkPreObjCMessage(const ObjCMethodCall &msg,
> CheckerContext &C) const {
> -
> - const Expr *receiver = msg.getInstanceReceiver();
> - if (!receiver)
> + if (!msg.isInstanceMessage())
> return;
> -
> - // FIXME: Enhance with value-tracking information instead of consulting
> - // the type of the expression.
> - const ObjCObjectPointerType* PT =
> - receiver->getType()->getAs<ObjCObjectPointerType>();
> -
> - if (!PT)
> - return;
> - const ObjCInterfaceDecl *OD = PT->getInterfaceDecl();
> +
> + const ObjCInterfaceDecl *OD = msg.getReceiverInterface();
> if (!OD)
> return;
> - if (!OD->getIdentifier()->getName().equals("NSAutoreleasePool"))
> + if (!OD->getIdentifier()->isStr("NSAutoreleasePool"))
> return;
>
> if (releaseS.isNull())
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/NoReturnFunctionChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/NoReturnFunctionChecker.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/NoReturnFunctionChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/NoReturnFunctionChecker.cpp Mon Jul 2 14:28:04 2012
> @@ -15,8 +15,8 @@
> #include "ClangSACheckers.h"
> #include "clang/StaticAnalyzer/Core/Checker.h"
> #include "clang/StaticAnalyzer/Core/CheckerManager.h"
> +#include "clang/StaticAnalyzer/Core/PathSensitive/Calls.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> #include "llvm/ADT/StringSwitch.h"
> #include <cstdarg>
>
> @@ -29,7 +29,7 @@
> check::PostObjCMessage > {
> public:
> void checkPostStmt(const CallExpr *CE, CheckerContext &C) const;
> - void checkPostObjCMessage(const ObjCMessage &msg, CheckerContext &C) const;
> + void checkPostObjCMessage(const ObjCMethodCall &msg, CheckerContext &C) const;
> };
>
> }
> @@ -98,7 +98,7 @@
> return (Arg == NULL);
> }
>
> -void NoReturnFunctionChecker::checkPostObjCMessage(const ObjCMessage &Msg,
> +void NoReturnFunctionChecker::checkPostObjCMessage(const ObjCMethodCall &Msg,
> CheckerContext &C) const {
> // HACK: This entire check is to handle two messages in the Cocoa frameworks:
> // -[NSAssertionHandler
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCContainersChecker.cpp Mon Jul 2 14:28:04 2012
> @@ -21,7 +21,6 @@
> #include "clang/StaticAnalyzer/Core/CheckerManager.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
> #include "clang/AST/ParentMap.h"
>
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/ObjCSelfInitChecker.cpp Mon Jul 2 14:28:04 2012
> @@ -42,7 +42,6 @@
> #include "clang/StaticAnalyzer/Core/PathSensitive/Calls.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
> #include "clang/AST/ParentMap.h"
>
> @@ -51,7 +50,7 @@
>
> static bool shouldRunOnFunctionOrMethod(const NamedDecl *ND);
> static bool isInitializationMethod(const ObjCMethodDecl *MD);
> -static bool isInitMessage(const ObjCMessage &msg);
> +static bool isInitMessage(const ObjCMethodCall &Msg);
> static bool isSelfVar(SVal location, CheckerContext &C);
>
> namespace {
> @@ -64,8 +63,8 @@
> check::Location,
> check::Bind > {
> public:
> - void checkPreObjCMessage(ObjCMessage msg, CheckerContext &C) const;
> - void checkPostObjCMessage(ObjCMessage msg, CheckerContext &C) const;
> + void checkPreObjCMessage(const ObjCMethodCall &Msg, CheckerContext &C) const;
> + void checkPostObjCMessage(const ObjCMethodCall &Msg, CheckerContext &C) const;
> void checkPostStmt(const ObjCIvarRefExpr *E, CheckerContext &C) const;
> void checkPreStmt(const ReturnStmt *S, CheckerContext &C) const;
> void checkPreStmt(const CallExpr *CE, CheckerContext &C) const;
> @@ -184,7 +183,7 @@
> C.EmitReport(report);
> }
>
> -void ObjCSelfInitChecker::checkPostObjCMessage(ObjCMessage msg,
> +void ObjCSelfInitChecker::checkPostObjCMessage(const ObjCMethodCall &Msg,
> CheckerContext &C) const {
> // When encountering a message that does initialization (init rule),
> // tag the return value so that we know later on that if self has this value
> @@ -195,7 +194,7 @@
> C.getCurrentAnalysisDeclContext()->getDecl())))
> return;
>
> - if (isInitMessage(msg)) {
> + if (isInitMessage(Msg)) {
> // Tag the return value as the result of an initializer.
> ProgramStateRef state = C.getState();
>
> @@ -204,15 +203,12 @@
> // value out when we return from this method.
> state = state->set<CalledInit>(true);
>
> - SVal V = state->getSVal(msg.getMessageExpr(), C.getLocationContext());
> + SVal V = state->getSVal(Msg.getOriginExpr(), C.getLocationContext());
> addSelfFlag(state, V, SelfFlag_InitRes, C);
> return;
> }
>
> - // FIXME: ObjCMessage is going away.
> - ObjCMessageSend MsgWrapper(msg.getMessageExpr(), C.getState(),
> - C.getLocationContext());
> - checkPostStmt(MsgWrapper, C);
> + checkPostStmt(Msg, C);
>
> // We don't check for an invalid 'self' in an obj-c message expression to cut
> // down false positives where logging functions get information from self
> @@ -300,12 +296,9 @@
> }
> }
>
> -void ObjCSelfInitChecker::checkPreObjCMessage(ObjCMessage Msg,
> +void ObjCSelfInitChecker::checkPreObjCMessage(const ObjCMethodCall &Msg,
> CheckerContext &C) const {
> - // FIXME: ObjCMessage is going away.
> - ObjCMessageSend MsgWrapper(Msg.getMessageExpr(), C.getState(),
> - C.getLocationContext());
> - checkPreStmt(MsgWrapper, C);
> + checkPreStmt(Msg, C);
> }
>
> void ObjCSelfInitChecker::checkPreStmt(const CallEvent &CE,
> @@ -440,8 +433,8 @@
> return MD->getMethodFamily() == OMF_init;
> }
>
> -static bool isInitMessage(const ObjCMessage &msg) {
> - return msg.getMethodFamily() == OMF_init;
> +static bool isInitMessage(const ObjCMethodCall &Call) {
> + return Call.getMethodFamily() == OMF_init;
> }
>
> //===----------------------------------------------------------------------===//
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp Mon Jul 2 14:28:04 2012
> @@ -27,7 +27,6 @@
> #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramStateTrait.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> #include "llvm/ADT/DenseMap.h"
> #include "llvm/ADT/FoldingSet.h"
> #include "llvm/ADT/ImmutableList.h"
> @@ -2530,7 +2529,7 @@
> void checkPostStmt(const ObjCDictionaryLiteral *DL, CheckerContext &C) const;
> void checkPostStmt(const ObjCBoxedExpr *BE, CheckerContext &C) const;
>
> - void checkPostObjCMessage(const ObjCMessage &Msg, CheckerContext &C) const;
> + void checkPostObjCMessage(const ObjCMethodCall &Msg, CheckerContext &C) const;
>
> void checkSummary(const RetainSummary &Summ, const CallEvent &Call,
> CheckerContext &C) const;
> @@ -2792,17 +2791,12 @@
> C.addTransition(State);
> }
>
> -void RetainCountChecker::checkPostObjCMessage(const ObjCMessage &Msg,
> +void RetainCountChecker::checkPostObjCMessage(const ObjCMethodCall &Msg,
> CheckerContext &C) const {
> - ProgramStateRef state = C.getState();
> - const LocationContext *LC = C.getLocationContext();
> - // FIXME: ObjCMessage is going away.
> - ObjCMessageSend Call(Msg.getMessageExpr(), state, LC);
> -
> RetainSummaryManager &Summaries = getSummaryManager(C);
> - const RetainSummary *Summ = Summaries.getSummary(Call, state);
> + const RetainSummary *Summ = Summaries.getSummary(Msg, C.getState());
>
> - checkSummary(*Summ, Call, C);
> + checkSummary(*Summ, Msg, C);
> }
>
> /// GetReturnType - Used to get the return type of a message expression or
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/Calls.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/Calls.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/Calls.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/Calls.cpp Mon Jul 2 14:28:04 2012
> @@ -14,8 +14,8 @@
> //===----------------------------------------------------------------------===//
>
> #include "clang/StaticAnalyzer/Core/PathSensitive/Calls.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> #include "llvm/ADT/SmallSet.h"
> +#include "llvm/ADT/StringExtras.h"
>
> using namespace clang;
> using namespace ento;
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/CheckerManager.cpp Mon Jul 2 14:28:04 2012
> @@ -14,7 +14,7 @@
> #include "clang/StaticAnalyzer/Core/CheckerManager.h"
> #include "clang/StaticAnalyzer/Core/Checker.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/CheckerContext.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> +#include "clang/StaticAnalyzer/Core/PathSensitive/Calls.h"
> #include "clang/Analysis/ProgramPoint.h"
> #include "clang/AST/DeclBase.h"
>
> @@ -178,14 +178,14 @@
> typedef std::vector<CheckerManager::CheckObjCMessageFunc> CheckersTy;
> bool IsPreVisit;
> const CheckersTy &Checkers;
> - const ObjCMessage &Msg;
> + const ObjCMethodCall &Msg;
> ExprEngine &Eng;
>
> CheckersTy::const_iterator checkers_begin() { return Checkers.begin(); }
> CheckersTy::const_iterator checkers_end() { return Checkers.end(); }
>
> CheckObjCMessageContext(bool isPreVisit, const CheckersTy &checkers,
> - const ObjCMessage &msg, ExprEngine &eng)
> + const ObjCMethodCall &msg, ExprEngine &eng)
> : IsPreVisit(isPreVisit), Checkers(checkers), Msg(msg), Eng(eng) { }
>
> void runChecker(CheckerManager::CheckObjCMessageFunc checkFn,
> @@ -193,7 +193,7 @@
> ProgramPoint::Kind K = IsPreVisit ? ProgramPoint::PreStmtKind :
> ProgramPoint::PostStmtKind;
> const ProgramPoint &L =
> - ProgramPoint::getProgramPoint(Msg.getMessageExpr(),
> + ProgramPoint::getProgramPoint(Msg.getOriginExpr(),
> K, Pred->getLocationContext(),
> checkFn.Checker);
> CheckerContext C(Bldr, Eng, Pred, L);
> @@ -207,7 +207,7 @@
> void CheckerManager::runCheckersForObjCMessage(bool isPreVisit,
> ExplodedNodeSet &Dst,
> const ExplodedNodeSet &Src,
> - const ObjCMessage &msg,
> + const ObjCMethodCall &msg,
> ExprEngine &Eng) {
> CheckObjCMessageContext C(isPreVisit,
> isPreVisit ? PreObjCMessageCheckers
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngine.cpp Mon Jul 2 14:28:04 2012
> @@ -20,7 +20,6 @@
> #include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/Calls.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
> #include "clang/AST/CharUnits.h"
> #include "clang/AST/ParentMap.h"
> #include "clang/AST/StmtObjC.h"
> @@ -884,7 +883,8 @@
>
> if (const ObjCPropertyRefExpr *PR =
> dyn_cast<ObjCPropertyRefExpr>(syntactic)) {
> - VisitObjCMessage(ObjCPropertyAccess(PR, ME, Pred->getState(), LCtx),
> + VisitObjCMessage(ObjCPropertyAccess(PR, PO->getSourceRange(), ME,
> + Pred->getState(), LCtx),
> Pred, Dst);
> evaluated = true;
> }
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp?rev=159559&r1=159558&r2=159559&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineObjC.cpp Mon Jul 2 14:28:04 2012
> @@ -15,7 +15,6 @@
> #include "clang/StaticAnalyzer/Core/CheckerManager.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/Calls.h"
> #include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h"
> -#include "clang/StaticAnalyzer/Core/PathSensitive/ObjCMessage.h"
>
> using namespace clang;
> using namespace ento;
>
>
> _______________________________________________
> 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