@@ -23,19 +23,19 @@ using namespace clang;
23
23
using namespace ento ;
24
24
25
25
namespace {
26
- class BoolAssignmentChecker : public Checker < check::Bind > {
27
- const BugType BT{this , " Assignment of a non-Boolean value" };
28
- void emitReport (ProgramStateRef state , CheckerContext &C,
29
- bool IsTainted = false ) const ;
30
-
31
- public:
32
- void checkBind (SVal loc , SVal val , const Stmt *S, CheckerContext &C) const ;
33
- };
26
+ class BoolAssignmentChecker : public Checker <check::Bind> {
27
+ const BugType BT{this , " Assignment of a non-Boolean value" };
28
+ void emitReport (ProgramStateRef State , CheckerContext &C,
29
+ bool IsTainted = false ) const ;
30
+
31
+ public:
32
+ void checkBind (SVal Loc , SVal Val , const Stmt *S, CheckerContext &C) const ;
33
+ };
34
34
} // end anonymous namespace
35
35
36
- void BoolAssignmentChecker::emitReport (ProgramStateRef state , CheckerContext &C,
36
+ void BoolAssignmentChecker::emitReport (ProgramStateRef State , CheckerContext &C,
37
37
bool IsTainted) const {
38
- if (ExplodedNode *N = C.generateNonFatalErrorNode (state )) {
38
+ if (ExplodedNode *N = C.generateNonFatalErrorNode (State )) {
39
39
StringRef Msg = IsTainted ? " Might assign a tainted non-Boolean value"
40
40
: " Assignment of a non-Boolean value" ;
41
41
C.emitReport (std::make_unique<PathSensitiveBugReport>(BT, Msg, N));
@@ -47,59 +47,58 @@ static bool isBooleanType(QualType Ty) {
47
47
return true ;
48
48
49
49
if (const TypedefType *TT = Ty->getAs <TypedefType>())
50
- return TT->getDecl ()->getName () == " BOOL" || // Objective-C
51
- TT->getDecl ()->getName () == " _Bool" || // stdbool.h < C99
52
- TT->getDecl ()->getName () == " Boolean" ; // MacTypes.h
50
+ return TT->getDecl ()->getName () == " BOOL" || // Objective-C
51
+ TT->getDecl ()->getName () == " _Bool" || // stdbool.h < C99
52
+ TT->getDecl ()->getName () == " Boolean" ; // MacTypes.h
53
53
54
54
return false ;
55
55
}
56
56
57
- void BoolAssignmentChecker::checkBind (SVal loc , SVal val , const Stmt *S,
57
+ void BoolAssignmentChecker::checkBind (SVal Loc , SVal Val , const Stmt *S,
58
58
CheckerContext &C) const {
59
59
60
60
// We are only interested in stores into Booleans.
61
61
const TypedValueRegion *TR =
62
- dyn_cast_or_null<TypedValueRegion>(loc .getAsRegion ());
62
+ dyn_cast_or_null<TypedValueRegion>(Loc .getAsRegion ());
63
63
64
64
if (!TR)
65
65
return ;
66
66
67
- QualType valTy = TR->getValueType ();
67
+ QualType RegTy = TR->getValueType ();
68
68
69
- if (!isBooleanType (valTy ))
69
+ if (!isBooleanType (RegTy ))
70
70
return ;
71
71
72
72
// Get the value of the right-hand side. We only care about values
73
73
// that are defined (UnknownVals and UndefinedVals are handled by other
74
74
// checkers).
75
- std::optional<NonLoc> NV = val .getAs <NonLoc>();
75
+ std::optional<NonLoc> NV = Val .getAs <NonLoc>();
76
76
if (!NV)
77
77
return ;
78
78
79
79
// Check if the assigned value meets our criteria for correctness. It must
80
80
// be a value that is either 0 or 1. One way to check this is to see if
81
81
// the value is possibly < 0 (for a negative value) or greater than 1.
82
- ProgramStateRef state = C.getState ();
83
- SValBuilder &svalBuilder = C.getSValBuilder ();
84
- BasicValueFactory &BVF = svalBuilder.getBasicValueFactory ();
82
+ ProgramStateRef State = C.getState ();
83
+ BasicValueFactory &BVF = C.getSValBuilder ().getBasicValueFactory ();
85
84
ConstraintManager &CM = C.getConstraintManager ();
86
85
87
- llvm::APSInt Zero = BVF.getValue (0 , valTy );
88
- llvm::APSInt One = BVF.getValue (1 , valTy );
86
+ llvm::APSInt Zero = BVF.getValue (0 , RegTy );
87
+ llvm::APSInt One = BVF.getValue (1 , RegTy );
89
88
90
89
ProgramStateRef StIn, StOut;
91
- std::tie (StIn, StOut) = CM.assumeInclusiveRangeDual (state , *NV, Zero, One);
90
+ std::tie (StIn, StOut) = CM.assumeInclusiveRangeDual (State , *NV, Zero, One);
92
91
93
92
if (!StIn)
94
93
emitReport (StOut, C);
95
- if (StIn && StOut && taint::isTainted (state , *NV))
94
+ if (StIn && StOut && taint::isTainted (State , *NV))
96
95
emitReport (StOut, C, /* IsTainted=*/ true );
97
96
}
98
97
99
- void ento::registerBoolAssignmentChecker (CheckerManager &mgr ) {
100
- mgr .registerChecker <BoolAssignmentChecker>();
98
+ void ento::registerBoolAssignmentChecker (CheckerManager &Mgr ) {
99
+ Mgr .registerChecker <BoolAssignmentChecker>();
101
100
}
102
101
103
- bool ento::shouldRegisterBoolAssignmentChecker (const CheckerManager &mgr ) {
102
+ bool ento::shouldRegisterBoolAssignmentChecker (const CheckerManager &Mgr ) {
104
103
return true ;
105
104
}
0 commit comments