[cfe-commits] r135250 - /cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp

Ted Kremenek kremenek at apple.com
Fri Jul 15 00:15:58 PDT 2011


Wonderful!

On Jul 14, 2011, at 11:02 PM, Jordy Rose wrote:

> Author: jrose
> Date: Fri Jul 15 01:02:19 2011
> New Revision: 135250
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=135250&view=rev
> Log:
> Clean up MacOSXAPIChecker, including switching its array of BugTypes to a single llvm::OwningPtr<BugType> (the new convention). No functionality change.
> 
> Modified:
>    cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp
> 
> Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp?rev=135250&r1=135249&r2=135250&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Checkers/MacOSXAPIChecker.cpp Fri Jul 15 01:02:19 2011
> @@ -31,22 +31,17 @@
> 
> namespace {
> class MacOSXAPIChecker : public Checker< check::PreStmt<CallExpr> > {
> -  enum SubChecks {
> -    DispatchOnce = 0,
> -    DispatchOnceF,
> -    NumChecks
> -  };
> -
> -  mutable BugType *BTypes[NumChecks];
> +  mutable llvm::OwningPtr<BugType> BT_dispatchOnce;
> 
> public:
> -  MacOSXAPIChecker() { memset(BTypes, 0, sizeof(*BTypes) * NumChecks); }
> -  ~MacOSXAPIChecker() {
> -    for (unsigned i=0; i != NumChecks; ++i)
> -      delete BTypes[i];
> -  }
> -
>   void checkPreStmt(const CallExpr *CE, CheckerContext &C) const;
> +
> +  void CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,
> +                         const IdentifierInfo *FI) const;
> +
> +  typedef void (MacOSXAPIChecker::*SubChecker)(CheckerContext &,
> +                                               const CallExpr *,
> +                                               const IdentifierInfo *) const;
> };
> } //end anonymous namespace
> 
> @@ -54,16 +49,8 @@
> // dispatch_once and dispatch_once_f
> //===----------------------------------------------------------------------===//
> 
> -static void CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,
> -                              BugType *&BT, const IdentifierInfo *FI) {
> -
> -  if (!BT) {
> -    llvm::SmallString<128> S;
> -    llvm::raw_svector_ostream os(S);
> -    os << "Improper use of '" << FI->getName() << '\'';
> -    BT = new BugType(os.str(), "Mac OS X API");
> -  }
> -
> +void MacOSXAPIChecker::CheckDispatchOnce(CheckerContext &C, const CallExpr *CE,
> +                                         const IdentifierInfo *FI) const {
>   if (CE->getNumArgs() < 1)
>     return;
> 
> @@ -78,6 +65,10 @@
>   if (!N)
>     return;
> 
> +  if (!BT_dispatchOnce)
> +    BT_dispatchOnce.reset(new BugType("Improper use of 'dispatch_once'",
> +                                      "Mac OS X API"));
> +
>   llvm::SmallString<256> S;
>   llvm::raw_svector_ostream os(S);
>   os << "Call to '" << FI->getName() << "' uses";
> @@ -90,7 +81,7 @@
>   if (isa<VarRegion>(R) && isa<StackLocalsSpaceRegion>(R->getMemorySpace()))
>     os << "  Perhaps you intended to declare the variable as 'static'?";
> 
> -  EnhancedBugReport *report = new EnhancedBugReport(*BT, os.str(), N);
> +  RangedBugReport *report = new RangedBugReport(*BT_dispatchOnce, os.str(), N);
>   report->addRange(CE->getArg(0)->getSourceRange());
>   C.EmitReport(report);
> }
> @@ -99,47 +90,29 @@
> // Central dispatch function.
> //===----------------------------------------------------------------------===//
> 
> -typedef void (*SubChecker)(CheckerContext &C, const CallExpr *CE, BugType *&BT,
> -                           const IdentifierInfo *FI);
> -namespace {
> -  class SubCheck {
> -    SubChecker SC;
> -    BugType **BT;
> -  public:
> -    SubCheck(SubChecker sc, BugType *& bt) : SC(sc), BT(&bt) {}
> -    SubCheck() : SC(NULL), BT(NULL) {}
> -
> -    void run(CheckerContext &C, const CallExpr *CE,
> -             const IdentifierInfo *FI) const {
> -      if (SC)
> -        SC(C, CE, *BT, FI);
> -    }
> -  };
> -} // end anonymous namespace
> -
> void MacOSXAPIChecker::checkPreStmt(const CallExpr *CE,
>                                     CheckerContext &C) const {
> -  // FIXME: Mostly copy and paste from UnixAPIChecker.  Should refactor.
> +  // FIXME: This sort of logic is common to several checkers, including
> +  // UnixAPIChecker, PthreadLockChecker, and CStringChecker.  Should refactor.
>   const GRState *state = C.getState();
>   const Expr *Callee = CE->getCallee();
> -  const FunctionTextRegion *Fn =
> -    dyn_cast_or_null<FunctionTextRegion>(state->getSVal(Callee).getAsRegion());
> +  const FunctionDecl *Fn = state->getSVal(Callee).getAsFunctionDecl();
> 
>   if (!Fn)
>     return;
> 
> -  const IdentifierInfo *FI = Fn->getDecl()->getIdentifier();
> +  const IdentifierInfo *FI = Fn->getIdentifier();
>   if (!FI)
>     return;
> 
> -  const SubCheck &SC =
> -    llvm::StringSwitch<SubCheck>(FI->getName())
> -      .Case("dispatch_once", SubCheck(CheckDispatchOnce, BTypes[DispatchOnce]))
> -      .Case("dispatch_once_f", SubCheck(CheckDispatchOnce,
> -                                        BTypes[DispatchOnceF]))
> -      .Default(SubCheck());
> +  SubChecker SC =
> +    llvm::StringSwitch<SubChecker>(FI->getName())
> +      .Cases("dispatch_once", "dispatch_once_f",
> +             &MacOSXAPIChecker::CheckDispatchOnce)
> +      .Default(NULL);
> 
> -  SC.run(C, CE, FI);
> +  if (SC)
> +    (this->*SC)(C, CE, FI);
> }
> 
> //===----------------------------------------------------------------------===//
> 
> 
> _______________________________________________
> 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