Skip to content

Commit 0df985c

Browse files
committed
add tests
1 parent 4fb3af8 commit 0df985c

File tree

3 files changed

+40
-19
lines changed

3 files changed

+40
-19
lines changed

‎plugin/DBZ.cc‎

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,39 +17,42 @@ class MyDZChecker
1717
CheckerContext &C) const;
1818

1919
public:
20-
voidcheckPreStmt(BinaryOperator const *B, CheckerContext &C) const;
2120
MyDZChecker()
22-
: BT(std::make_unique<BugType>(this, "hello-my-div-by-zero",
23-
categories::LogicError)){}
21+
: BT(std::make_unique<BugType>(this, "chx-DBZ", categories::LogicError)){
22+
}
23+
voidcheckPreStmt(BinaryOperator const *B, CheckerContext &C) const;
2424
voidcheckPostCall(CallEvent const &, CheckerContext &) const;
2525
};
2626

2727
voidMyDZChecker::reportBug(constchar *Msg, ProgramStateRef StateZero,
2828
CheckerContext &C) const{
2929
if (ExplodedNode *N = C.generateSink(StateZero)){
3030
BugReport *R = newBugReport(*BT, Msg, N);
31-
bugreporter::trackNullOrUndefValue(N, bugreporter::GetDenomExpr(N), *R);
31+
//bugreporter::trackNullOrUndefValue(N, bugreporter::GetDenomExpr(N), *R);
3232
C.emitReport(R);
3333
}
3434
}
3535

3636
voidMyDZChecker::checkPreStmt(const BinaryOperator *B,
3737
CheckerContext &C) const{
3838
BinaryOperator::Opcode Op = B->getOpcode();
39-
if (Op != BO_Div && Op != BO_Rem && Op != BO_DivAssign && Op != BO_RemAssign)
39+
if (Op != BinaryOperatorKind::BO_Div && Op != BinaryOperatorKind::BO_Rem &&
40+
Op != BinaryOperatorKind::BO_DivAssign &&
41+
Op != BinaryOperatorKind::BO_RemAssign)
4042
return;
4143

4244
if (!B->getRHS()->getType()->isScalarType()) return;
4345

4446
SVal Denom = C.getState()->getSVal(B->getRHS(), C.getLocationContext());
45-
Optional<DefinedSVal> DV = Denom.getAs<DefinedSVal>();
47+
SVal Numer = C.getState()->getSVal(B->getLHS(), C.getLocationContext());
48+
Optional<DefinedSVal> DVR = Denom.getAs<DefinedSVal>();
49+
Optional<DefinedSVal> DVL = Numer.getAs<DefinedSVal>();
4650

47-
if (!DV) return;
51+
if (!DVR) return;
4852

49-
// Check for divide by zero.
5053
ConstraintManager &CM = C.getConstraintManager();
5154
ProgramStateRef stateNotZero, stateZero;
52-
std::tie(stateNotZero, stateZero) = CM.assumeDual(C.getState(), *DV);
55+
std::tie(stateNotZero, stateZero) = CM.assumeDual(C.getState(), *DVR);
5356

5457
if (stateNotZero != nullptr){
5558
stateNotZero->dump();
@@ -58,19 +61,19 @@ void MyDZChecker::checkPreStmt(const BinaryOperator *B,
5861
stateZero->dump();
5962
}
6063

61-
if (!stateNotZero){
64+
// surely 0
65+
if (stateNotZero == nullptr){
6266
assert(stateZero);
63-
reportBug("my-divide-by-zero", stateZero, C);
67+
reportBug("chx.DBZ - DBZ", stateZero, C);
6468
return;
6569
}
6670

6771
/// std::cerr << (stateNotZero != nullptr) << " " << (stateZero != nullptr)
6872
/// << '\n'
6973

70-
bool TaintedD = C.getState()->isTainted(*DV);
71-
/// if (TaintedD){
74+
bool TaintedD = C.getState()->isTainted(*DVR);
7275
if ((stateNotZero != nullptr && stateZero != nullptr && TaintedD)){
73-
reportBug("tainted, possibly div zero", stateZero, C);
76+
reportBug("chx.DBZ - tainted DBZ", stateZero, C);
7477
return;
7578
}
7679

‎plugin/MyCheckers.cc‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
#include"heartbleed.cc"
33

44
extern"C"voidclang_registerCheckers(CheckerRegistry &registry){
5-
registry.addChecker<chx::MyDZChecker>("chx.DZChecker", "DZChecker");
6-
registry.addChecker<chx::NetworkTaintChecker>("chx.NetChecker", "NetChecker");
5+
registry.addChecker<chx::MyDZChecker>("chx.DBZ", "MyDBZ");
6+
registry.addChecker<chx::NetworkTaintChecker>("chx.Net", "MyNet");
77
}
88

99
extern"C"constchar clang_analyzerAPIVersionString[] =
Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,25 @@
1-
//RUN: %clang_cc1 -analyze -analyzer-checker=chx -verify %s
1+
//RUN: %clang -c -Xclang -analyze -Xclang -analyzer-checker=chx -Xclang -verify %s -o /dev/null
22

3-
intmain(void){
3+
#include<stdlib.h>
4+
5+
intlocal_zero(void){
46
inta=0;
7+
return3 / a; // expected-warning{{chx.DBZ - DBZ}}
8+
}
9+
10+
intrand_zero(void){
11+
inta=rand();
12+
return3 / a; // expected-warning{{chx.DBZ - tainted DBZ}}
13+
}
14+
15+
staticintga=0;
16+
externintgb;
17+
intstatic_global_zero (intv){
18+
intra=v / ga;
19+
intrb=v / gb;
20+
returnra+rb;
21+
}
522

6-
return3 / a; // expected-warning{{my-divide-by-zero}}
23+
inttest4(intb){
24+
return1 / b; // no-warning
725
}

0 commit comments

Comments
(0)