Lines Matching defs:C
1 //= UnixAPIChecker.h - Checks preconditions for various Unix APIs --*- C++ -*-//
56 EnsurePtrNotNull(SVal PtrVal, const Expr *PtrExpr, CheckerContext &C,
63 const Expr *SizePtrExpr, CheckerContext &C, ProgramStateRef State) const;
69 void checkPreCall(const CallEvent &Call, CheckerContext &C) const;
71 void CheckOpen(CheckerContext &C, const CallEvent &Call) const;
72 void CheckOpenAt(CheckerContext &C, const CallEvent &Call) const;
73 void CheckGetDelim(CheckerContext &C, const CallEvent &Call) const;
74 void CheckPthreadOnce(CheckerContext &C, const CallEvent &Call) const;
76 void CheckOpenVariant(CheckerContext &C, const CallEvent &Call,
79 void ReportOpenBug(CheckerContext &C, ProgramStateRef State, const char *Msg,
85 void checkPreStmt(const CallExpr *CE, CheckerContext &C) const;
89 this, "Undefined allocation of 0 bytes (CERT MEM04-C; CWE-131)",
92 void CheckCallocZero(CheckerContext &C, const CallExpr *CE) const;
93 void CheckMallocZero(CheckerContext &C, const CallExpr *CE) const;
94 void CheckReallocZero(CheckerContext &C, const CallExpr *CE) const;
95 void CheckReallocfZero(CheckerContext &C, const CallExpr *CE) const;
96 void CheckAllocaZero(CheckerContext &C, const CallExpr *CE) const;
97 void CheckAllocaWithAlignZero(CheckerContext &C, const CallExpr *CE) const;
98 void CheckVallocZero(CheckerContext &C, const CallExpr *CE) const;
100 bool ReportZeroByteAllocation(CheckerContext &C,
104 void BasicAllocationCheck(CheckerContext &C,
114 SVal PtrVal, const Expr *PtrExpr, CheckerContext &C, ProgramStateRef State,
123 if (ExplodedNode *N = C.generateErrorNode(PtrNull)) {
129 C.emitReport(std::move(R));
156 CheckerContext &C) const {
167 StringRef FName = C.getCalleeName(FD);
172 CheckOpen(C, Call);
175 CheckOpenAt(C, Call);
178 CheckPthreadOnce(C, Call);
181 CheckGetDelim(C, Call);
183 void UnixAPIMisuseChecker::ReportOpenBug(CheckerContext &C,
187 ExplodedNode *N = C.generateErrorNode(State);
193 C.emitReport(std::move(Report));
196 void UnixAPIMisuseChecker::CheckOpen(CheckerContext &C,
198 CheckOpenVariant(C, Call, OpenVariant::Open);
201 void UnixAPIMisuseChecker::CheckOpenAt(CheckerContext &C,
203 CheckOpenVariant(C, Call, OpenVariant::OpenAt);
206 void UnixAPIMisuseChecker::CheckOpenVariant(CheckerContext &C,
234 ProgramStateRef state = C.getState();
249 ReportOpenBug(C, state,
260 ReportOpenBug(C, state, SBuf.c_str(),
278 NonLoc ocreateFlag = C.getSValBuilder()
281 SVal maskedFlagsUC = C.getSValBuilder().evalBinOpNN(state, BO_And,
304 ReportOpenBug(C, trueState,
316 const Expr *SizePtrExpr, CheckerContext &C, ProgramStateRef State) const {
324 auto EmitBugReport = [this, &C, SizePtrExpr, LinePtrPtrExpr](
326 if (ExplodedNode *N = C.generateErrorNode(BugState)) {
330 C.emitReport(std::move(R));
354 auto &SVB = C.getSValBuilder();
371 void UnixAPIMisuseChecker::CheckGetDelim(CheckerContext &C,
373 ProgramStateRef State = C.getState();
377 State = EnsurePtrNotNull(SizePtrSval, Call.getArgExpr(1), C, State, "Size");
384 EnsurePtrNotNull(LinePtrPtrSVal, Call.getArgExpr(0), C, State, "Line");
390 Call.getArgExpr(1), C, State);
394 C.addTransition(State);
401 void UnixAPIMisuseChecker::CheckPthreadOnce(CheckerContext &C,
412 ProgramStateRef state = C.getState();
417 ExplodedNode *N = C.generateErrorNode(state);
436 C.emitReport(std::move(report));
463 CheckerContext &C,
467 ExplodedNode *N = C.generateErrorNode(falseState);
479 C.emitReport(std::move(report));
486 void UnixAPIPortabilityChecker::BasicAllocationCheck(CheckerContext &C,
496 ProgramStateRef state = C.getState();
499 SVal argVal = C.getSVal(arg);
506 (void) ReportZeroByteAllocation(C, falseState, arg, fn);
512 C.addTransition(trueState);
515 void UnixAPIPortabilityChecker::CheckCallocZero(CheckerContext &C,
521 ProgramStateRef state = C.getState();
527 SVal argVal = C.getSVal(arg);
536 if (ReportZeroByteAllocation(C, falseState, arg, "calloc"))
548 C.addTransition(trueState);
551 void UnixAPIPortabilityChecker::CheckMallocZero(CheckerContext &C,
553 BasicAllocationCheck(C, CE, 1, 0, "malloc");
556 void UnixAPIPortabilityChecker::CheckReallocZero(CheckerContext &C,
558 BasicAllocationCheck(C, CE, 2, 1, "realloc");
561 void UnixAPIPortabilityChecker::CheckReallocfZero(CheckerContext &C,
563 BasicAllocationCheck(C, CE, 2, 1, "reallocf");
566 void UnixAPIPortabilityChecker::CheckAllocaZero(CheckerContext &C,
568 BasicAllocationCheck(C, CE, 1, 0, "alloca");
572 CheckerContext &C,
574 BasicAllocationCheck(C, CE, 2, 0, "__builtin_alloca_with_align");
577 void UnixAPIPortabilityChecker::CheckVallocZero(CheckerContext &C,
579 BasicAllocationCheck(C, CE, 1, 0, "valloc");
583 CheckerContext &C) const {
584 const FunctionDecl *FD = C.getCalleeDecl(CE);
594 StringRef FName = C.getCalleeName(FD);
599 CheckCallocZero(C, CE);
602 CheckMallocZero(C, CE);
605 CheckReallocZero(C, CE);
608 CheckReallocfZero(C, CE);
611 CheckAllocaZero(C, CE);
614 CheckAllocaWithAlignZero(C, CE);
617 CheckVallocZero(C, CE);