static int x = 0;
return &x;
}
- void PreVisitCallExpr(CheckerContext &C, const CallExpr *CE);
void PostVisitCallExpr(CheckerContext &C, const CallExpr *CE);
void AcquireLock(CheckerContext &C, const CallExpr *CE,
Eng.registerCheck(new PthreadLockChecker());
}
-void PthreadLockChecker::PreVisitCallExpr(CheckerContext &C,
- const CallExpr *CE) {
+
+void PthreadLockChecker::PostVisitCallExpr(CheckerContext &C,
+ const CallExpr *CE) {
const GRState *state = C.getState();
const Expr *Callee = CE->getCallee();
const CodeTextRegion *R =
return;
llvm::StringRef FName = R->getDecl()->getName();
-
+
if (FName == "pthread_mutex_lock") {
if (CE->getNumArgs() != 1)
return;
if (CE->getNumArgs() != 1)
return;
AcquireLock(C, CE, state->getSVal(CE->getArg(0)), true);
- }
-}
-
-void PthreadLockChecker::PostVisitCallExpr(CheckerContext &C,
- const CallExpr *CE) {
- const GRState *state = C.getState();
- const Expr *Callee = CE->getCallee();
- const CodeTextRegion *R =
- dyn_cast_or_null<CodeTextRegion>(state->getSVal(Callee).getAsRegion());
-
- if (!R)
- return;
-
- llvm::StringRef FName = R->getDecl()->getName();
-
- if (FName == "pthread_mutex_unlock") {
+ }
+ else if (FName == "pthread_mutex_unlock") {
if (CE->getNumArgs() != 1)
return;
ReleaseLock(C, CE, state->getSVal(CE->getArg(0)));