[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