Skip to content

Commit

Permalink
[clang][analyzer] Reformat code of BoolAssignmentChecker (NFC). (#81461)
Browse files Browse the repository at this point in the history
This is only a code reformatting and rename of variables to the newer
format.
  • Loading branch information
balazske committed Feb 14, 2024
1 parent dc866ae commit a2eb234
Showing 1 changed file with 27 additions and 28 deletions.
55 changes: 27 additions & 28 deletions clang/lib/StaticAnalyzer/Checkers/BoolAssignmentChecker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,19 @@ using namespace clang;
using namespace ento;

namespace {
class BoolAssignmentChecker : public Checker< check::Bind > {
const BugType BT{this, "Assignment of a non-Boolean value"};
void emitReport(ProgramStateRef state, CheckerContext &C,
bool IsTainted = false) const;

public:
void checkBind(SVal loc, SVal val, const Stmt *S, CheckerContext &C) const;
};
class BoolAssignmentChecker : public Checker<check::Bind> {
const BugType BT{this, "Assignment of a non-Boolean value"};
void emitReport(ProgramStateRef State, CheckerContext &C,
bool IsTainted = false) const;

public:
void checkBind(SVal Loc, SVal Val, const Stmt *S, CheckerContext &C) const;
};
} // end anonymous namespace

void BoolAssignmentChecker::emitReport(ProgramStateRef state, CheckerContext &C,
void BoolAssignmentChecker::emitReport(ProgramStateRef State, CheckerContext &C,
bool IsTainted) const {
if (ExplodedNode *N = C.generateNonFatalErrorNode(state)) {
if (ExplodedNode *N = C.generateNonFatalErrorNode(State)) {
StringRef Msg = IsTainted ? "Might assign a tainted non-Boolean value"
: "Assignment of a non-Boolean value";
C.emitReport(std::make_unique<PathSensitiveBugReport>(BT, Msg, N));
Expand All @@ -47,59 +47,58 @@ static bool isBooleanType(QualType Ty) {
return true;

if (const TypedefType *TT = Ty->getAs<TypedefType>())
return TT->getDecl()->getName() == "BOOL" || // Objective-C
TT->getDecl()->getName() == "_Bool" || // stdbool.h < C99
TT->getDecl()->getName() == "Boolean"; // MacTypes.h
return TT->getDecl()->getName() == "BOOL" || // Objective-C
TT->getDecl()->getName() == "_Bool" || // stdbool.h < C99
TT->getDecl()->getName() == "Boolean"; // MacTypes.h

return false;
}

void BoolAssignmentChecker::checkBind(SVal loc, SVal val, const Stmt *S,
void BoolAssignmentChecker::checkBind(SVal Loc, SVal Val, const Stmt *S,
CheckerContext &C) const {

// We are only interested in stores into Booleans.
const TypedValueRegion *TR =
dyn_cast_or_null<TypedValueRegion>(loc.getAsRegion());
dyn_cast_or_null<TypedValueRegion>(Loc.getAsRegion());

if (!TR)
return;

QualType valTy = TR->getValueType();
QualType RegTy = TR->getValueType();

if (!isBooleanType(valTy))
if (!isBooleanType(RegTy))
return;

// Get the value of the right-hand side. We only care about values
// that are defined (UnknownVals and UndefinedVals are handled by other
// checkers).
std::optional<NonLoc> NV = val.getAs<NonLoc>();
std::optional<NonLoc> NV = Val.getAs<NonLoc>();
if (!NV)
return;

// Check if the assigned value meets our criteria for correctness. It must
// be a value that is either 0 or 1. One way to check this is to see if
// the value is possibly < 0 (for a negative value) or greater than 1.
ProgramStateRef state = C.getState();
SValBuilder &svalBuilder = C.getSValBuilder();
BasicValueFactory &BVF = svalBuilder.getBasicValueFactory();
ProgramStateRef State = C.getState();
BasicValueFactory &BVF = C.getSValBuilder().getBasicValueFactory();
ConstraintManager &CM = C.getConstraintManager();

llvm::APSInt Zero = BVF.getValue(0, valTy);
llvm::APSInt One = BVF.getValue(1, valTy);
llvm::APSInt Zero = BVF.getValue(0, RegTy);
llvm::APSInt One = BVF.getValue(1, RegTy);

ProgramStateRef StIn, StOut;
std::tie(StIn, StOut) = CM.assumeInclusiveRangeDual(state, *NV, Zero, One);
std::tie(StIn, StOut) = CM.assumeInclusiveRangeDual(State, *NV, Zero, One);

if (!StIn)
emitReport(StOut, C);
if (StIn && StOut && taint::isTainted(state, *NV))
if (StIn && StOut && taint::isTainted(State, *NV))
emitReport(StOut, C, /*IsTainted=*/true);
}

void ento::registerBoolAssignmentChecker(CheckerManager &mgr) {
mgr.registerChecker<BoolAssignmentChecker>();
void ento::registerBoolAssignmentChecker(CheckerManager &Mgr) {
Mgr.registerChecker<BoolAssignmentChecker>();
}

bool ento::shouldRegisterBoolAssignmentChecker(const CheckerManager &mgr) {
bool ento::shouldRegisterBoolAssignmentChecker(const CheckerManager &Mgr) {
return true;
}

0 comments on commit a2eb234

Please sign in to comment.