52#include "llvm/ADT/STLExtras.h"
53#include "llvm/ADT/SmallString.h"
54#include "llvm/ADT/StringExtras.h"
55#include "llvm/Support/FormatVariadic.h"
64class StdLibraryFunctionsChecker
65 :
public Checker<check::PreCall, check::PostCall, eval::Call> {
71 enum InvalidationKind {
80 enum RangeKind { OutOfRange, WithinRange };
82 static RangeKind negateKind(RangeKind K) {
89 llvm_unreachable(
"Unknown range kind");
98 typedef std::vector<std::pair<RangeInt, RangeInt>> IntRangeVector;
105 static const ArgNo
Ret;
109 static void printArgDesc(ArgNo, llvm::raw_ostream &Out);
117 static void appendInsideRangeDesc(llvm::APSInt RMin, llvm::APSInt RMax,
119 llvm::raw_ostream &Out);
122 static void appendOutOfRangeDesc(llvm::APSInt RMin, llvm::APSInt RMax,
124 llvm::raw_ostream &Out);
126 class ValueConstraint;
135 using ValueConstraintPtr = std::shared_ptr<ValueConstraint>;
147 class ValueConstraint {
149 ValueConstraint(ArgNo ArgN) : ArgN(ArgN) {}
150 virtual ~ValueConstraint() {}
155 const Summary &Summary,
160 enum DescriptionKind {
178 llvm::raw_ostream &Out)
const {
183 "Description not implemented for summary case constraints");
200 const Summary &Summary,
201 llvm::raw_ostream &Out)
const {
202 if (
auto N = getArgSVal(
Call, getArgNo()).getAs<NonLoc>()) {
203 if (
const llvm::APSInt *Int = N->getAsInteger()) {
217 virtual std::vector<ArgNo> getArgsToTrack()
const {
return {ArgN}; }
220 virtual ValueConstraintPtr negate()
const {
221 llvm_unreachable(
"Not implemented");
231 assert(ValidArg &&
"Arg out of range!");
235 return checkSpecificValidity(FD);
239 ArgNo getArgNo()
const {
return ArgN; }
250 virtual bool checkSpecificValidity(
const FunctionDecl *FD)
const {
265 class RangeConstraint :
public ValueConstraint {
272 IntRangeVector Ranges;
277 StringRef Description;
280 RangeConstraint(ArgNo ArgN, RangeKind Kind,
const IntRangeVector &Ranges,
282 : ValueConstraint(ArgN),
Kind(
Kind), Ranges(Ranges), Description(Desc) {
285 const IntRangeVector &getRanges()
const {
return Ranges; }
288 const Summary &Summary,
293 llvm::raw_ostream &Out)
const override;
296 const Summary &Summary,
297 llvm::raw_ostream &Out)
const override;
299 ValueConstraintPtr negate()
const override {
300 RangeConstraint Tmp(*
this);
301 Tmp.Kind = negateKind(Kind);
302 return std::make_shared<RangeConstraint>(Tmp);
306 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
307 const bool ValidArg =
310 "This constraint should be applied on an integral type");
319 using RangeApplyFunction =
320 std::function<
bool(
const llvm::APSInt &
Min,
const llvm::APSInt &
Max)>;
325 const RangeApplyFunction &F)
const;
337 const RangeApplyFunction &F)
const;
341 const RangeApplyFunction &F)
const {
344 applyOnOutOfRange(BVF, ArgT, F);
347 applyOnWithinRange(BVF, ArgT, F);
354 class ComparisonConstraint :
public ValueConstraint {
361 : ValueConstraint(ArgN),
Opcode(
Opcode), OtherArgN(OtherArgN) {}
362 ArgNo getOtherArgNo()
const {
return OtherArgN; }
365 const Summary &Summary,
370 class NotNullConstraint :
public ValueConstraint {
371 using ValueConstraint::ValueConstraint;
373 bool CannotBeNull =
true;
376 NotNullConstraint(ArgNo ArgN,
bool CannotBeNull =
true)
377 : ValueConstraint(ArgN), CannotBeNull(CannotBeNull) {}
380 const Summary &Summary,
385 llvm::raw_ostream &Out)
const override;
388 const Summary &Summary,
389 llvm::raw_ostream &Out)
const override;
391 ValueConstraintPtr negate()
const override {
392 NotNullConstraint Tmp(*
this);
393 Tmp.CannotBeNull = !this->CannotBeNull;
394 return std::make_shared<NotNullConstraint>(Tmp);
398 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
399 const bool ValidArg = getArgType(FD, ArgN)->isPointerType();
401 "This constraint should be applied only on a pointer type");
412 class NotNullBufferConstraint :
public ValueConstraint {
413 using ValueConstraint::ValueConstraint;
415 std::optional<ArgNo> SizeArg2N;
417 bool CannotBeNull =
true;
420 NotNullBufferConstraint(ArgNo ArgN, ArgNo SizeArg1N,
421 std::optional<ArgNo> SizeArg2N,
422 bool CannotBeNull =
true)
423 : ValueConstraint(ArgN), SizeArg1N(SizeArg1N), SizeArg2N(SizeArg2N),
424 CannotBeNull(CannotBeNull) {}
427 const Summary &Summary,
432 llvm::raw_ostream &Out)
const override;
435 const Summary &Summary,
436 llvm::raw_ostream &Out)
const override;
438 ValueConstraintPtr negate()
const override {
439 NotNullBufferConstraint Tmp(*
this);
440 Tmp.CannotBeNull = !this->CannotBeNull;
441 return std::make_shared<NotNullBufferConstraint>(Tmp);
445 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
446 const bool ValidArg = getArgType(FD, ArgN)->isPointerType();
448 "This constraint should be applied only on a pointer type");
463 class BufferSizeConstraint :
public ValueConstraint {
465 std::optional<llvm::APSInt> ConcreteSize;
467 std::optional<ArgNo> SizeArgN;
471 std::optional<ArgNo> SizeMultiplierArgN;
476 BufferSizeConstraint(ArgNo Buffer, llvm::APSInt BufMinSize)
477 : ValueConstraint(Buffer), ConcreteSize(BufMinSize) {}
478 BufferSizeConstraint(ArgNo Buffer, ArgNo BufSize)
479 : ValueConstraint(Buffer), SizeArgN(BufSize) {}
480 BufferSizeConstraint(ArgNo Buffer, ArgNo BufSize, ArgNo BufSizeMultiplier)
481 : ValueConstraint(Buffer), SizeArgN(BufSize),
482 SizeMultiplierArgN(BufSizeMultiplier) {}
485 const Summary &Summary,
490 llvm::raw_ostream &Out)
const override;
493 const Summary &Summary,
494 llvm::raw_ostream &Out)
const override;
496 std::vector<ArgNo> getArgsToTrack()
const override {
497 std::vector<ArgNo> Result{ArgN};
499 Result.push_back(*SizeArgN);
500 if (SizeMultiplierArgN)
501 Result.push_back(*SizeMultiplierArgN);
505 ValueConstraintPtr negate()
const override {
506 BufferSizeConstraint Tmp(*
this);
508 return std::make_shared<BufferSizeConstraint>(Tmp);
512 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
513 const bool ValidArg = getArgType(FD, ArgN)->isPointerType();
515 "This constraint should be applied only on a pointer type");
521 using ConstraintSet = std::vector<ValueConstraintPtr>;
530 class ErrnoConstraintBase {
534 const Summary &Summary,
542 virtual ~ErrnoConstraintBase() {}
545 ErrnoConstraintBase() =
default;
555 class ResetErrnoConstraint :
public ErrnoConstraintBase {
558 const Summary &Summary,
568 class NoErrnoConstraint :
public ErrnoConstraintBase {
571 const Summary &Summary,
581 class FailureErrnoConstraint :
public ErrnoConstraintBase {
584 const Summary &Summary,
589 C.getLocationContext(),
C.getASTContext().IntTy,
601 class SuccessErrnoConstraint :
public ErrnoConstraintBase {
604 const Summary &Summary,
610 return "'errno' becomes undefined after the call";
618 class ErrnoMustBeCheckedConstraint :
public ErrnoConstraintBase {
621 const Summary &Summary,
624 Call.getOriginExpr());
628 return "reading 'errno' is required to find out if the call has failed";
654 ConstraintSet Constraints;
655 const ErrnoConstraintBase &ErrnoConstraint;
659 SummaryCase(ConstraintSet &&Constraints,
const ErrnoConstraintBase &ErrnoC,
661 : Constraints(
std::move(Constraints)), ErrnoConstraint(ErrnoC),
664 SummaryCase(
const ConstraintSet &Constraints,
665 const ErrnoConstraintBase &ErrnoC, StringRef Note)
666 : Constraints(Constraints), ErrnoConstraint(ErrnoC),
Note(
Note) {}
668 const ConstraintSet &getConstraints()
const {
return Constraints; }
669 const ErrnoConstraintBase &getErrnoConstraint()
const {
670 return ErrnoConstraint;
672 StringRef getNote()
const {
return Note; }
676 using RetType = std::optional<QualType>;
681 bool static isIrrelevant(
QualType T) {
return T.isNull(); }
688 using ArgQualTypes = std::vector<QualType>;
697 Signature(ArgTypes ArgTys, RetType RetTy) {
698 for (std::optional<QualType> Arg : ArgTys) {
703 assertArgTypeSuitableForSignature(*Arg);
704 this->ArgTys.push_back(*Arg);
711 assertRetTypeSuitableForSignature(*RetTy);
712 this->RetTy = *RetTy;
720 static void assertArgTypeSuitableForSignature(
QualType T) {
722 "We should have no void types in the spec");
723 assert((
T.isNull() ||
T.isCanonical()) &&
724 "We should only have canonical types in the spec");
726 static void assertRetTypeSuitableForSignature(
QualType T) {
727 assert((
T.isNull() ||
T.isCanonical()) &&
728 "We should only have canonical types in the spec");
733 assert(FD &&
"Function must be set");
740 using SummaryCases = std::vector<SummaryCase>;
759 const InvalidationKind InvalidationKd;
761 ConstraintSet ArgConstraints;
768 Summary(InvalidationKind InvalidationKd) : InvalidationKd(InvalidationKd) {}
770 Summary &Case(ConstraintSet &&CS,
const ErrnoConstraintBase &ErrnoC,
771 StringRef
Note =
"") {
772 Cases.push_back(SummaryCase(std::move(CS), ErrnoC,
Note));
775 Summary &Case(
const ConstraintSet &CS,
const ErrnoConstraintBase &ErrnoC,
776 StringRef
Note =
"") {
777 Cases.push_back(SummaryCase(CS, ErrnoC,
Note));
780 Summary &ArgConstraint(ValueConstraintPtr VC) {
781 assert(VC->getArgNo() != Ret &&
782 "Arg constraint should not refer to the return value");
783 ArgConstraints.push_back(VC);
787 InvalidationKind getInvalidationKd()
const {
return InvalidationKd; }
788 const SummaryCases &getCases()
const {
return Cases; }
789 const ConstraintSet &getArgConstraints()
const {
return ArgConstraints; }
791 QualType getArgType(ArgNo ArgN)
const {
792 return StdLibraryFunctionsChecker::getArgType(FD, ArgN);
797 bool matchesAndSet(
const Signature &Sign,
const FunctionDecl *FD) {
798 bool Result = Sign.matches(FD) && validateByConstraints(FD);
800 assert(!this->FD &&
"FD must not be set more than once");
809 bool validateByConstraints(
const FunctionDecl *FD)
const {
810 for (
const SummaryCase &Case : Cases)
811 for (
const ValueConstraintPtr &Constraint : Case.getConstraints())
812 if (!Constraint->checkValidity(FD))
814 for (
const ValueConstraintPtr &Constraint : ArgConstraints)
815 if (!Constraint->checkValidity(FD))
823 using FunctionSummaryMapType = llvm::DenseMap<const FunctionDecl *, Summary>;
824 mutable FunctionSummaryMapType FunctionSummaryMap;
826 const BugType BT_InvalidArg{
this,
"Function call with invalid argument"};
827 mutable bool SummariesInitialized =
false;
830 return ArgN ==
Ret ?
Call.getReturnValue() :
Call.getArgSVal(ArgN);
833 assert(
Call.getDecl() &&
834 "Call was found by a summary, should have declaration");
835 return cast<NamedDecl>(
Call.getDecl())->getNameAsString();
844 bool AddTestFunctions =
false;
846 bool DisplayLoadedSummaries =
false;
847 bool ModelPOSIX =
false;
848 bool ShouldAssumeControlledEnvironment =
false;
851 std::optional<Summary> findFunctionSummary(
const FunctionDecl *FD,
853 std::optional<Summary> findFunctionSummary(
const CallEvent &
Call,
859 const ValueConstraint *VC,
const ValueConstraint *NegatedVC,
861 assert(
Call.getDecl() &&
862 "Function found in summary must have a declaration available");
864 llvm::raw_svector_ostream MsgOs(Msg);
867 printArgDesc(VC->getArgNo(), MsgOs);
868 MsgOs <<
" to '" << getFunctionName(
Call) <<
"' ";
870 NegatedVC->describeArgumentValue(
Call, N->
getState(), Summary, MsgOs);
874 MsgOs <<
"is out of the accepted range; It ";
875 VC->describe(ValueConstraint::Violation,
Call,
C.getState(), Summary,
877 Msg[0] = toupper(Msg[0]);
878 auto R = std::make_unique<PathSensitiveBugReport>(BT_InvalidArg, Msg, N);
880 for (ArgNo ArgN : VC->getArgsToTrack()) {
882 R->markInteresting(
Call.getArgSVal(ArgN));
884 R->addRange(
Call.getArgSourceRange(ArgN));
887 C.emitReport(std::move(R));
895 const NoErrnoConstraint ErrnoUnchanged{};
896 const ResetErrnoConstraint ErrnoIrrelevant{};
897 const ErrnoMustBeCheckedConstraint ErrnoMustBeChecked{};
898 const SuccessErrnoConstraint ErrnoMustNotBeChecked{};
899 const FailureErrnoConstraint ErrnoNEZeroIrrelevant{};
902int StdLibraryFunctionsChecker::ErrnoConstraintBase::Tag = 0;
904const StdLibraryFunctionsChecker::ArgNo StdLibraryFunctionsChecker::Ret =
905 std::numeric_limits<ArgNo>::max();
915void StdLibraryFunctionsChecker::printArgDesc(
916 StdLibraryFunctionsChecker::ArgNo ArgN, llvm::raw_ostream &Out) {
917 Out << std::to_string(ArgN + 1);
918 Out << llvm::getOrdinalSuffix(ArgN + 1);
922void StdLibraryFunctionsChecker::printArgValueInfo(ArgNo ArgN,
925 llvm::raw_ostream &Out) {
926 if (
const llvm::APSInt *Val =
927 State->getStateManager().getSValBuilder().getKnownValue(
928 State, getArgSVal(
Call, ArgN)))
929 Out <<
" (which is " << *Val <<
")";
932void StdLibraryFunctionsChecker::appendInsideRangeDesc(llvm::APSInt RMin,
936 llvm::raw_ostream &Out) {
937 if (RMin.isZero() && RMax.isZero())
939 else if (RMin == RMax)
945 Out <<
"<= " << RMax;
950 Out <<
">= " << RMin;
951 }
else if (RMin.isNegative() == RMax.isNegative() &&
952 RMin.getLimitedValue() == RMax.getLimitedValue() - 1) {
953 Out << RMin <<
" or " << RMax;
955 Out <<
"between " << RMin <<
" and " << RMax;
959void StdLibraryFunctionsChecker::appendOutOfRangeDesc(llvm::APSInt RMin,
963 llvm::raw_ostream &Out) {
964 if (RMin.isZero() && RMax.isZero())
966 else if (RMin == RMax) {
967 Out <<
"not equal to " << RMin;
978 }
else if (RMin.isNegative() == RMax.isNegative() &&
979 RMin.getLimitedValue() == RMax.getLimitedValue() - 1) {
980 Out <<
"not " << RMin <<
" and not " << RMax;
982 Out <<
"not between " << RMin <<
" and " << RMax;
986void StdLibraryFunctionsChecker::RangeConstraint::applyOnWithinRange(
991 for (
auto [Start, End] : getRanges()) {
992 const llvm::APSInt &
Min = BVF.getValue(Start, ArgT);
993 const llvm::APSInt &
Max = BVF.getValue(End, ArgT);
1000void StdLibraryFunctionsChecker::RangeConstraint::applyOnOutOfRange(
1005 const IntRangeVector &R = getRanges();
1006 size_t E = R.size();
1008 const llvm::APSInt &MinusInf = BVF.
getMinValue(ArgT);
1009 const llvm::APSInt &PlusInf = BVF.
getMaxValue(ArgT);
1011 const llvm::APSInt &RangeLeft = BVF.getValue(R[0].first - 1ULL, ArgT);
1012 const llvm::APSInt &RangeRight = BVF.getValue(R[
E - 1].second + 1ULL, ArgT);
1015 for (
size_t I = 1; I !=
E; ++I) {
1016 const llvm::APSInt &
Min = BVF.getValue(R[I - 1].second + 1ULL, ArgT);
1017 const llvm::APSInt &
Max = BVF.getValue(R[I].first - 1ULL, ArgT);
1024 if (RangeLeft != PlusInf) {
1025 assert(MinusInf <= RangeLeft);
1026 if (!F(MinusInf, RangeLeft))
1030 if (RangeRight != MinusInf) {
1031 assert(RangeRight <= PlusInf);
1032 if (!F(RangeRight, PlusInf))
1042 QualType T = Summary.getArgType(getArgNo());
1044 if (
auto N =
V.getAs<
NonLoc>()) {
1045 auto ExcludeRangeFromArg = [&](
const llvm::APSInt &
Min,
1046 const llvm::APSInt &
Max) {
1048 return static_cast<bool>(State);
1052 applyOnRange(negateKind(Kind),
C.getSValBuilder().getBasicValueFactory(),
T,
1053 ExcludeRangeFromArg);
1059void StdLibraryFunctionsChecker::RangeConstraint::describe(
1061 const Summary &Summary, llvm::raw_ostream &Out)
const {
1064 QualType T = Summary.getArgType(getArgNo());
1066 Out << ((DK == Violation) ?
"should be " :
"is ");
1067 if (!Description.empty()) {
1070 unsigned I = Ranges.size();
1071 if (Kind == WithinRange) {
1072 for (
const std::pair<RangeInt, RangeInt> &R : Ranges) {
1073 appendInsideRangeDesc(BVF.getValue(R.first,
T),
1074 BVF.getValue(R.second,
T),
T, BVF, Out);
1079 for (
const std::pair<RangeInt, RangeInt> &R : Ranges) {
1080 appendOutOfRangeDesc(BVF.getValue(R.first,
T),
1081 BVF.getValue(R.second,
T),
T, BVF, Out);
1089bool StdLibraryFunctionsChecker::RangeConstraint::describeArgumentValue(
1091 llvm::raw_ostream &Out)
const {
1092 unsigned int NRanges = 0;
1093 bool HaveAllRanges =
true;
1100 if (
auto N =
V.getAs<
NonLoc>()) {
1101 if (
const llvm::APSInt *Int = N->getAsInteger()) {
1106 QualType T = Summary.getArgType(getArgNo());
1108 llvm::raw_svector_ostream MoreInfoOs(MoreInfo);
1109 auto ApplyF = [&](
const llvm::APSInt &
Min,
const llvm::APSInt &
Max) {
1112 MoreInfoOs <<
" or ";
1113 appendInsideRangeDesc(
Min,
Max,
T, BVF, MoreInfoOs);
1116 HaveAllRanges =
false;
1121 applyOnRange(Kind, BVF,
T, ApplyF);
1122 assert(NRanges > 0);
1123 if (!HaveAllRanges || NRanges == 1) {
1132ProgramStateRef StdLibraryFunctionsChecker::ComparisonConstraint::apply(
1139 QualType T = Summary.getArgType(getArgNo());
1143 ArgNo OtherArg = getOtherArgNo();
1144 SVal OtherV = getArgSVal(
Call, OtherArg);
1145 QualType OtherT = Summary.getArgType(OtherArg);
1147 OtherV = SVB.
evalCast(OtherV,
T, OtherT);
1148 if (
auto CompV = SVB.
evalBinOp(State, Op,
V, OtherV, CondT)
1150 State = State->assume(*CompV,
true);
1165 return State->assume(L, CannotBeNull);
1168void StdLibraryFunctionsChecker::NotNullConstraint::describe(
1170 const Summary &Summary, llvm::raw_ostream &Out)
const {
1171 assert(CannotBeNull &&
1172 "Describe should not be used when the value must be NULL");
1173 if (DK == Violation)
1174 Out <<
"should not be NULL";
1176 Out <<
"is not NULL";
1179bool StdLibraryFunctionsChecker::NotNullConstraint::describeArgumentValue(
1181 llvm::raw_ostream &Out)
const {
1182 assert(!CannotBeNull &&
"This function is used when the value is NULL");
1187ProgramStateRef StdLibraryFunctionsChecker::NotNullBufferConstraint::apply(
1197 std::optional<DefinedOrUnknownSVal> SizeArg1 =
1199 std::optional<DefinedOrUnknownSVal> SizeArg2;
1203 auto IsArgZero = [State](std::optional<DefinedOrUnknownSVal> Val) {
1210 if (IsArgZero(SizeArg1) || IsArgZero(SizeArg2))
1213 return State->assume(L, CannotBeNull);
1216void StdLibraryFunctionsChecker::NotNullBufferConstraint::describe(
1218 const Summary &Summary, llvm::raw_ostream &Out)
const {
1219 assert(CannotBeNull &&
1220 "Describe should not be used when the value must be NULL");
1221 if (DK == Violation)
1222 Out <<
"should not be NULL";
1224 Out <<
"is not NULL";
1227bool StdLibraryFunctionsChecker::NotNullBufferConstraint::describeArgumentValue(
1229 llvm::raw_ostream &Out)
const {
1230 assert(!CannotBeNull &&
"This function is used when the value is NULL");
1235ProgramStateRef StdLibraryFunctionsChecker::BufferSizeConstraint::apply(
1240 SVal BufV = getArgSVal(
Call, getArgNo());
1243 const SVal SizeV = [
this, &State, &
Call, &Summary, &SvalBuilder]() {
1247 assert(SizeArgN &&
"The constraint must be either a concrete value or "
1248 "encoded in an argument.");
1250 SVal SizeV = getArgSVal(
Call, *SizeArgN);
1252 if (SizeMultiplierArgN) {
1253 SVal SizeMulV = getArgSVal(
Call, *SizeMultiplierArgN);
1254 SizeV = SvalBuilder.
evalBinOp(State, BO_Mul, SizeV, SizeMulV,
1255 Summary.getArgType(*SizeArgN));
1263 SVal Feasible = SvalBuilder.
evalBinOp(State, Op, SizeV, BufDynSize,
1266 return State->assume(*F,
true);
1274 llvm_unreachable(
"Size argument or the dynamic size is Undefined");
1277void StdLibraryFunctionsChecker::BufferSizeConstraint::describe(
1279 const Summary &Summary, llvm::raw_ostream &Out)
const {
1280 Out << ((DK == Violation) ?
"should be " :
"is ");
1281 Out <<
"a buffer with size equal to or greater than ";
1283 Out << *ConcreteSize;
1284 }
else if (SizeArgN) {
1285 Out <<
"the value of the ";
1286 printArgDesc(*SizeArgN, Out);
1287 printArgValueInfo(*SizeArgN, State,
Call, Out);
1288 if (SizeMultiplierArgN) {
1289 Out <<
" times the ";
1290 printArgDesc(*SizeMultiplierArgN, Out);
1291 printArgValueInfo(*SizeMultiplierArgN, State,
Call, Out);
1296bool StdLibraryFunctionsChecker::BufferSizeConstraint::describeArgumentValue(
1298 llvm::raw_ostream &Out)
const {
1299 SVal BufV = getArgSVal(
Call, getArgNo());
1301 if (
const llvm::APSInt *Val =
1302 State->getStateManager().getSValBuilder().getKnownValue(State,
1304 Out <<
"is a buffer with size " << *Val;
1310void StdLibraryFunctionsChecker::checkPreCall(
const CallEvent &
Call,
1312 std::optional<Summary> FoundSummary = findFunctionSummary(
Call,
C);
1316 const Summary &Summary = *FoundSummary;
1321 for (
const ValueConstraintPtr &Constraint : Summary.getArgConstraints()) {
1322 ValueConstraintPtr NegatedConstraint = Constraint->negate();
1325 NegatedConstraint->apply(NewState,
Call, Summary,
C);
1327 if (FailureSt && !SuccessSt) {
1329 reportBug(
Call, N, Constraint.get(), NegatedConstraint.get(), Summary,
1338 NewState = SuccessSt;
1339 if (NewState != State) {
1341 llvm::raw_svector_ostream Os(Msg);
1342 Os <<
"Assuming that the ";
1343 printArgDesc(Constraint->getArgNo(), Os);
1345 Os << getFunctionName(
Call);
1347 Constraint->describe(ValueConstraint::Assumption,
Call, NewState, Summary,
1349 const auto ArgSVal =
Call.getArgSVal(Constraint->getArgNo());
1350 NewNode =
C.addTransition(
1352 C.getNoteTag([Msg = std::move(Msg), ArgSVal](
1354 if (BR.isInteresting(ArgSVal))
1361void StdLibraryFunctionsChecker::checkPostCall(
const CallEvent &
Call,
1363 std::optional<Summary> FoundSummary = findFunctionSummary(
Call,
C);
1368 const Summary &Summary = *FoundSummary;
1373 for (
const SummaryCase &Case : Summary.getCases()) {
1375 for (
const ValueConstraintPtr &Constraint : Case.getConstraints()) {
1376 NewState = Constraint->apply(NewState,
Call, Summary,
C);
1382 NewState = Case.getErrnoConstraint().apply(NewState,
Call, Summary,
C);
1395 cast<NamedDecl>(
Call.getDecl())->getDeclName();
1397 std::string ErrnoNote = Case.getErrnoConstraint().describe(
C);
1398 std::string CaseNote;
1399 if (Case.getNote().empty()) {
1400 if (!ErrnoNote.empty())
1402 llvm::formatv(
"After calling '{0}' {1}", FunctionName, ErrnoNote);
1407 llvm::formatv(
false, Case.getNote().str().c_str(), FunctionName);
1409 const SVal RV =
Call.getReturnValue();
1411 if (Summary.getInvalidationKd() == EvalCallAsPure) {
1414 if (!CaseNote.empty()) {
1431 Pred =
C.addTransition(NewState, Pred, Tag);
1434 if (!CaseNote.empty() || !ErrnoNote.empty()) {
1436 C.getNoteTag([CaseNote, ErrnoNote,
1444 std::optional<Loc> ErrnoLoc =
1446 bool ErrnoImportant = !ErrnoNote.empty() && ErrnoLoc &&
1448 if (ErrnoImportant) {
1450 if (CaseNote.empty())
1452 return llvm::formatv(
"{0}; {1}", CaseNote, ErrnoNote);
1459 Pred =
C.addTransition(NewState, Pred, Tag);
1464 if (Pred ==
Node && NewState != State)
1465 C.addTransition(NewState);
1469bool StdLibraryFunctionsChecker::evalCall(
const CallEvent &
Call,
1471 std::optional<Summary> FoundSummary = findFunctionSummary(
Call,
C);
1475 const Summary &Summary = *FoundSummary;
1476 switch (Summary.getInvalidationKd()) {
1477 case EvalCallAsPure: {
1480 const auto *CE = cast<CallExpr>(
Call.getOriginExpr());
1481 SVal V =
C.getSValBuilder().conjureSymbolVal(
1482 CE, LC, CE->getType().getCanonicalType(),
C.blockCount());
1483 State = State->BindExpr(CE, LC,
V);
1485 C.addTransition(State);
1494 llvm_unreachable(
"Unknown invalidation kind!");
1497bool StdLibraryFunctionsChecker::Signature::matches(
1511 auto RemoveRestrict = [&FD](
QualType T) {
1513 T.removeLocalRestrict();
1518 if (!isIrrelevant(RetTy)) {
1520 if (RetTy != FDRetTy)
1525 for (
auto [Idx, ArgTy] : llvm::enumerate(ArgTys)) {
1526 if (isIrrelevant(ArgTy))
1530 if (ArgTy != FDArgTy)
1537std::optional<StdLibraryFunctionsChecker::Summary>
1538StdLibraryFunctionsChecker::findFunctionSummary(
const FunctionDecl *FD,
1541 return std::nullopt;
1543 initFunctionSummaries(
C);
1546 if (FSMI == FunctionSummaryMap.end())
1547 return std::nullopt;
1548 return FSMI->second;
1551std::optional<StdLibraryFunctionsChecker::Summary>
1552StdLibraryFunctionsChecker::findFunctionSummary(
const CallEvent &
Call,
1556 return std::nullopt;
1557 return findFunctionSummary(FD,
C);
1560void StdLibraryFunctionsChecker::initFunctionSummaries(
1562 if (SummariesInitialized)
1564 SummariesInitialized =
true;
1576 LookupType(
const ASTContext &ACtx) : ACtx(ACtx) {}
1579 std::optional<QualType> operator()(StringRef Name) {
1582 if (LookupRes.empty())
1583 return std::nullopt;
1590 for (
Decl *
D : LookupRes)
1591 if (
auto *TD = dyn_cast<TypedefNameDecl>(
D))
1598 for (
Decl *
D : LookupRes)
1599 if (
auto *TD = dyn_cast<TypeDecl>(
D))
1601 return std::nullopt;
1607 class GetRestrictTy {
1611 GetRestrictTy(
const ASTContext &ACtx) : ACtx(ACtx) {}
1615 std::optional<QualType> operator()(std::optional<QualType> Ty) {
1617 return operator()(*Ty);
1618 return std::nullopt;
1620 } getRestrictTy(ACtx);
1621 class GetPointerTy {
1625 GetPointerTy(
const ASTContext &ACtx) : ACtx(ACtx) {}
1627 std::optional<QualType> operator()(std::optional<QualType> Ty) {
1629 return operator()(*Ty);
1630 return std::nullopt;
1632 } getPointerTy(ACtx);
1635 std::optional<QualType> operator()(std::optional<QualType> Ty) {
1636 return Ty ? std::optional<QualType>(Ty->withConst()) :
std::nullopt;
1645 std::optional<RangeInt> operator()(
QualType Ty) {
1648 std::optional<RangeInt> operator()(std::optional<QualType> Ty) {
1650 return operator()(*Ty);
1652 return std::nullopt;
1671 const QualType VoidPtrTy = getPointerTy(VoidTy);
1672 const QualType IntPtrTy = getPointerTy(IntTy);
1674 getPointerTy(UnsignedIntTy);
1675 const QualType VoidPtrRestrictTy = getRestrictTy(VoidPtrTy);
1677 getPointerTy(getConstTy(VoidTy));
1678 const QualType CharPtrTy = getPointerTy(CharTy);
1679 const QualType CharPtrRestrictTy = getRestrictTy(CharPtrTy);
1681 getPointerTy(getConstTy(CharTy));
1682 const QualType ConstCharPtrRestrictTy = getRestrictTy(ConstCharPtrTy);
1683 const QualType Wchar_tPtrTy = getPointerTy(WCharTy);
1685 getPointerTy(getConstTy(WCharTy));
1686 const QualType ConstVoidPtrRestrictTy = getRestrictTy(ConstVoidPtrTy);
1687 const QualType SizePtrTy = getPointerTy(SizeTy);
1688 const QualType SizePtrRestrictTy = getRestrictTy(SizePtrTy);
1690 const RangeInt IntMax = BVF.
getMaxValue(IntTy)->getLimitedValue();
1691 const RangeInt UnsignedIntMax =
1692 BVF.
getMaxValue(UnsignedIntTy)->getLimitedValue();
1693 const RangeInt LongMax = BVF.
getMaxValue(LongTy)->getLimitedValue();
1694 const RangeInt SizeMax = BVF.
getMaxValue(SizeTy)->getLimitedValue();
1702 const RangeInt UCharRangeMax =
1712 struct AddToFunctionSummaryMap {
1714 FunctionSummaryMapType ⤅
1715 bool DisplayLoadedSummaries;
1716 AddToFunctionSummaryMap(
const ASTContext &ACtx, FunctionSummaryMapType &FSM,
1717 bool DisplayLoadedSummaries)
1718 : ACtx(ACtx), Map(FSM), DisplayLoadedSummaries(DisplayLoadedSummaries) {
1726 bool operator()(StringRef Name, Signature Sign, Summary Sum) {
1727 if (Sign.isInvalid())
1731 if (LookupRes.empty())
1733 for (
Decl *
D : LookupRes) {
1734 if (
auto *FD = dyn_cast<FunctionDecl>(
D)) {
1735 if (Sum.matchesAndSet(Sign, FD)) {
1737 assert(Res.second &&
"Function already has a summary set!");
1739 if (DisplayLoadedSummaries) {
1740 llvm::errs() <<
"Loaded summary for: ";
1741 FD->
print(llvm::errs());
1742 llvm::errs() <<
"\n";
1753 for (StringRef Name : Names)
1754 operator()(Name, Sign, Sum);
1756 } addToFunctionSummaryMap(ACtx, FunctionSummaryMap, DisplayLoadedSummaries);
1759 auto ArgumentCondition = [](ArgNo ArgN, RangeKind
Kind, IntRangeVector Ranges,
1760 StringRef Desc =
"") {
1761 return std::make_shared<RangeConstraint>(ArgN, Kind, Ranges, Desc);
1763 auto BufferSize = [](
auto... Args) {
1764 return std::make_shared<BufferSizeConstraint>(Args...);
1767 auto operator()(RangeKind Kind, IntRangeVector Ranges) {
1768 return std::make_shared<RangeConstraint>(Ret, Kind, Ranges);
1771 return std::make_shared<ComparisonConstraint>(Ret, Op, OtherArgN);
1773 } ReturnValueCondition;
1775 auto operator()(RangeInt
b, RangeInt e) {
1776 return IntRangeVector{std::pair<RangeInt, RangeInt>{
b, e}};
1778 auto operator()(RangeInt
b, std::optional<RangeInt> e) {
1780 return IntRangeVector{std::pair<RangeInt, RangeInt>{
b, *e}};
1781 return IntRangeVector{};
1783 auto operator()(std::pair<RangeInt, RangeInt> i0,
1784 std::pair<RangeInt, std::optional<RangeInt>> i1) {
1786 return IntRangeVector{i0, {i1.first, *(i1.second)}};
1787 return IntRangeVector{i0};
1790 auto SingleValue = [](RangeInt
v) {
1791 return IntRangeVector{std::pair<RangeInt, RangeInt>{
v,
v}};
1793 auto LessThanOrEq = BO_LE;
1794 auto NotNull = [&](ArgNo ArgN) {
1795 return std::make_shared<NotNullConstraint>(ArgN);
1797 auto IsNull = [&](ArgNo ArgN) {
1798 return std::make_shared<NotNullConstraint>(ArgN,
false);
1800 auto NotNullBuffer = [&](ArgNo ArgN, ArgNo SizeArg1N, ArgNo SizeArg2N) {
1801 return std::make_shared<NotNullBufferConstraint>(ArgN, SizeArg1N,
1805 std::optional<QualType> FileTy = lookupTy(
"FILE");
1806 std::optional<QualType> FilePtrTy = getPointerTy(FileTy);
1807 std::optional<QualType> FilePtrRestrictTy = getRestrictTy(FilePtrTy);
1809 std::optional<QualType> FPosTTy = lookupTy(
"fpos_t");
1810 std::optional<QualType> FPosTPtrTy = getPointerTy(FPosTTy);
1811 std::optional<QualType> ConstFPosTPtrTy = getPointerTy(getConstTy(FPosTTy));
1812 std::optional<QualType> FPosTPtrRestrictTy = getRestrictTy(FPosTPtrTy);
1814 constexpr llvm::StringLiteral GenericSuccessMsg(
1815 "Assuming that '{0}' is successful");
1816 constexpr llvm::StringLiteral GenericFailureMsg(
"Assuming that '{0}' fails");
1833 addToFunctionSummaryMap(
1834 "isalnum", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1835 Summary(EvalCallAsPure)
1837 .Case({ArgumentCondition(0
U, WithinRange,
1838 {{
'0',
'9'}, {
'A',
'Z'}, {
'a',
'z'}}),
1839 ReturnValueCondition(OutOfRange, SingleValue(0))},
1840 ErrnoIrrelevant,
"Assuming the character is alphanumeric")
1844 .Case({ArgumentCondition(0
U, WithinRange, {{128, UCharRangeMax}})},
1849 {{
'0',
'9'}, {
'A',
'Z'}, {
'a',
'z'}, {128, UCharRangeMax}}),
1850 ReturnValueCondition(WithinRange, SingleValue(0))},
1851 ErrnoIrrelevant,
"Assuming the character is non-alphanumeric")
1852 .ArgConstraint(ArgumentCondition(0
U, WithinRange,
1853 {{EOFv, EOFv}, {0, UCharRangeMax}},
1854 "an unsigned char value or EOF")));
1855 addToFunctionSummaryMap(
1856 "isalpha", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1857 Summary(EvalCallAsPure)
1858 .Case({ArgumentCondition(0
U, WithinRange, {{
'A',
'Z'}, {
'a',
'z'}}),
1859 ReturnValueCondition(OutOfRange, SingleValue(0))},
1860 ErrnoIrrelevant,
"Assuming the character is alphabetical")
1862 .Case({ArgumentCondition(0
U, WithinRange, {{128, UCharRangeMax}})},
1864 .Case({ArgumentCondition(
1866 {{
'A',
'Z'}, {
'a',
'z'}, {128, UCharRangeMax}}),
1867 ReturnValueCondition(WithinRange, SingleValue(0))},
1868 ErrnoIrrelevant,
"Assuming the character is non-alphabetical"));
1869 addToFunctionSummaryMap(
1870 "isascii", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1871 Summary(EvalCallAsPure)
1872 .Case({ArgumentCondition(0
U, WithinRange,
Range(0, 127)),
1873 ReturnValueCondition(OutOfRange, SingleValue(0))},
1874 ErrnoIrrelevant,
"Assuming the character is an ASCII character")
1875 .Case({ArgumentCondition(0
U, OutOfRange,
Range(0, 127)),
1876 ReturnValueCondition(WithinRange, SingleValue(0))},
1878 "Assuming the character is not an ASCII character"));
1879 addToFunctionSummaryMap(
1880 "isblank", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1881 Summary(EvalCallAsPure)
1882 .Case({ArgumentCondition(0
U, WithinRange, {{
'\t',
'\t'}, {
' ',
' '}}),
1883 ReturnValueCondition(OutOfRange, SingleValue(0))},
1884 ErrnoIrrelevant,
"Assuming the character is a blank character")
1885 .Case({ArgumentCondition(0
U, OutOfRange, {{
'\t',
'\t'}, {
' ',
' '}}),
1886 ReturnValueCondition(WithinRange, SingleValue(0))},
1888 "Assuming the character is not a blank character"));
1889 addToFunctionSummaryMap(
1890 "iscntrl", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1891 Summary(EvalCallAsPure)
1892 .Case({ArgumentCondition(0
U, WithinRange, {{0, 32}, {127, 127}}),
1893 ReturnValueCondition(OutOfRange, SingleValue(0))},
1895 "Assuming the character is a control character")
1896 .Case({ArgumentCondition(0
U, OutOfRange, {{0, 32}, {127, 127}}),
1897 ReturnValueCondition(WithinRange, SingleValue(0))},
1899 "Assuming the character is not a control character"));
1900 addToFunctionSummaryMap(
1901 "isdigit", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1902 Summary(EvalCallAsPure)
1903 .Case({ArgumentCondition(0
U, WithinRange,
Range(
'0',
'9')),
1904 ReturnValueCondition(OutOfRange, SingleValue(0))},
1905 ErrnoIrrelevant,
"Assuming the character is a digit")
1906 .Case({ArgumentCondition(0
U, OutOfRange,
Range(
'0',
'9')),
1907 ReturnValueCondition(WithinRange, SingleValue(0))},
1908 ErrnoIrrelevant,
"Assuming the character is not a digit"));
1909 addToFunctionSummaryMap(
1910 "isgraph", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1911 Summary(EvalCallAsPure)
1912 .Case({ArgumentCondition(0
U, WithinRange,
Range(33, 126)),
1913 ReturnValueCondition(OutOfRange, SingleValue(0))},
1915 "Assuming the character has graphical representation")
1917 {ArgumentCondition(0
U, OutOfRange,
Range(33, 126)),
1918 ReturnValueCondition(WithinRange, SingleValue(0))},
1920 "Assuming the character does not have graphical representation"));
1921 addToFunctionSummaryMap(
1922 "islower", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1923 Summary(EvalCallAsPure)
1925 .Case({ArgumentCondition(0
U, WithinRange,
Range(
'a',
'z')),
1926 ReturnValueCondition(OutOfRange, SingleValue(0))},
1927 ErrnoIrrelevant,
"Assuming the character is a lowercase letter")
1929 .Case({ArgumentCondition(0
U, WithinRange,
Range(0, 127)),
1930 ArgumentCondition(0
U, OutOfRange,
Range(
'a',
'z')),
1931 ReturnValueCondition(WithinRange, SingleValue(0))},
1933 "Assuming the character is not a lowercase letter")
1935 .Case({ArgumentCondition(0
U, WithinRange, {{128, UCharRangeMax}})},
1938 .Case({ArgumentCondition(0
U, OutOfRange,
Range(0, UCharRangeMax)),
1939 ReturnValueCondition(WithinRange, SingleValue(0))},
1941 addToFunctionSummaryMap(
1942 "isprint", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1943 Summary(EvalCallAsPure)
1944 .Case({ArgumentCondition(0
U, WithinRange,
Range(32, 126)),
1945 ReturnValueCondition(OutOfRange, SingleValue(0))},
1946 ErrnoIrrelevant,
"Assuming the character is printable")
1947 .Case({ArgumentCondition(0
U, OutOfRange,
Range(32, 126)),
1948 ReturnValueCondition(WithinRange, SingleValue(0))},
1949 ErrnoIrrelevant,
"Assuming the character is non-printable"));
1950 addToFunctionSummaryMap(
1951 "ispunct", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1952 Summary(EvalCallAsPure)
1953 .Case({ArgumentCondition(
1955 {{
'!',
'/'}, {
':',
'@'}, {
'[',
'`'}, {
'{',
'~'}}),
1956 ReturnValueCondition(OutOfRange, SingleValue(0))},
1957 ErrnoIrrelevant,
"Assuming the character is a punctuation mark")
1958 .Case({ArgumentCondition(
1960 {{
'!',
'/'}, {
':',
'@'}, {
'[',
'`'}, {
'{',
'~'}}),
1961 ReturnValueCondition(WithinRange, SingleValue(0))},
1963 "Assuming the character is not a punctuation mark"));
1964 addToFunctionSummaryMap(
1965 "isspace", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1966 Summary(EvalCallAsPure)
1968 .Case({ArgumentCondition(0
U, WithinRange, {{9, 13}, {
' ',
' '}}),
1969 ReturnValueCondition(OutOfRange, SingleValue(0))},
1971 "Assuming the character is a whitespace character")
1973 .Case({ArgumentCondition(0
U, WithinRange, {{128, UCharRangeMax}})},
1975 .Case({ArgumentCondition(0
U, OutOfRange,
1976 {{9, 13}, {
' ',
' '}, {128, UCharRangeMax}}),
1977 ReturnValueCondition(WithinRange, SingleValue(0))},
1979 "Assuming the character is not a whitespace character"));
1980 addToFunctionSummaryMap(
1981 "isupper", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1982 Summary(EvalCallAsPure)
1984 .Case({ArgumentCondition(0
U, WithinRange,
Range(
'A',
'Z')),
1985 ReturnValueCondition(OutOfRange, SingleValue(0))},
1987 "Assuming the character is an uppercase letter")
1989 .Case({ArgumentCondition(0
U, WithinRange, {{128, UCharRangeMax}})},
1992 .Case({ArgumentCondition(0
U, OutOfRange,
1993 {{
'A',
'Z'}, {128, UCharRangeMax}}),
1994 ReturnValueCondition(WithinRange, SingleValue(0))},
1996 "Assuming the character is not an uppercase letter"));
1997 addToFunctionSummaryMap(
1998 "isxdigit", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1999 Summary(EvalCallAsPure)
2000 .Case({ArgumentCondition(0
U, WithinRange,
2001 {{
'0',
'9'}, {
'A',
'F'}, {
'a',
'f'}}),
2002 ReturnValueCondition(OutOfRange, SingleValue(0))},
2004 "Assuming the character is a hexadecimal digit")
2005 .Case({ArgumentCondition(0
U, OutOfRange,
2006 {{
'0',
'9'}, {
'A',
'F'}, {
'a',
'f'}}),
2007 ReturnValueCondition(WithinRange, SingleValue(0))},
2009 "Assuming the character is not a hexadecimal digit"));
2010 addToFunctionSummaryMap(
2011 "toupper", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2012 Summary(EvalCallAsPure)
2013 .ArgConstraint(ArgumentCondition(0
U, WithinRange,
2014 {{EOFv, EOFv}, {0, UCharRangeMax}},
2015 "an unsigned char value or EOF")));
2016 addToFunctionSummaryMap(
2017 "tolower", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2018 Summary(EvalCallAsPure)
2019 .ArgConstraint(ArgumentCondition(0
U, WithinRange,
2020 {{EOFv, EOFv}, {0, UCharRangeMax}},
2021 "an unsigned char value or EOF")));
2022 addToFunctionSummaryMap(
2023 "toascii", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2024 Summary(EvalCallAsPure)
2025 .ArgConstraint(ArgumentCondition(0
U, WithinRange,
2026 {{EOFv, EOFv}, {0, UCharRangeMax}},
2027 "an unsigned char value or EOF")));
2029 addToFunctionSummaryMap(
2030 "getchar", Signature(ArgTypes{}, RetType{IntTy}),
2032 .Case({ReturnValueCondition(WithinRange,
2033 {{EOFv, EOFv}, {0, UCharRangeMax}})},
2039 .Case({ArgumentCondition(1U, WithinRange,
Range(1, SizeMax)),
2040 ArgumentCondition(2U, WithinRange,
Range(1, SizeMax)),
2041 ReturnValueCondition(BO_LT, ArgNo(2)),
2042 ReturnValueCondition(WithinRange,
Range(0, SizeMax))},
2043 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2044 .Case({ArgumentCondition(1U, WithinRange,
Range(1, SizeMax)),
2045 ReturnValueCondition(BO_EQ, ArgNo(2)),
2046 ReturnValueCondition(WithinRange,
Range(0, SizeMax))},
2047 ErrnoMustNotBeChecked, GenericSuccessMsg)
2048 .Case({ArgumentCondition(1U, WithinRange, SingleValue(0)),
2049 ReturnValueCondition(WithinRange, SingleValue(0))},
2050 ErrnoMustNotBeChecked,
2051 "Assuming that argument 'size' to '{0}' is 0")
2052 .ArgConstraint(NotNullBuffer(ArgNo(0), ArgNo(1), ArgNo(2)))
2053 .ArgConstraint(NotNull(ArgNo(3)))
2054 .ArgConstraint(BufferSize(ArgNo(0), ArgNo(1),
2059 addToFunctionSummaryMap(
2061 Signature(ArgTypes{VoidPtrRestrictTy, SizeTy, SizeTy, FilePtrRestrictTy},
2066 addToFunctionSummaryMap(
"fwrite",
2067 Signature(ArgTypes{ConstVoidPtrRestrictTy, SizeTy,
2068 SizeTy, FilePtrRestrictTy},
2072 std::optional<QualType> Ssize_tTy = lookupTy(
"ssize_t");
2073 std::optional<RangeInt> Ssize_tMax = getMaxValue(Ssize_tTy);
2077 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
2078 ReturnValueCondition(WithinRange,
Range(-1, Ssize_tMax))},
2084 addToFunctionSummaryMap(
2085 "read", Signature(ArgTypes{IntTy, VoidPtrTy, SizeTy}, RetType{Ssize_tTy}),
2088 addToFunctionSummaryMap(
2090 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTy}, RetType{Ssize_tTy}),
2093 auto GetLineSummary =
2095 .Case({ReturnValueCondition(WithinRange,
2096 Range({-1, -1}, {1, Ssize_tMax}))},
2099 QualType CharPtrPtrRestrictTy = getRestrictTy(getPointerTy(CharPtrTy));
2106 addToFunctionSummaryMap(
2109 ArgTypes{CharPtrPtrRestrictTy, SizePtrRestrictTy, FilePtrRestrictTy},
2110 RetType{Ssize_tTy}),
2114 addToFunctionSummaryMap(
2116 Signature(ArgTypes{CharPtrPtrRestrictTy, SizePtrRestrictTy, IntTy,
2118 RetType{Ssize_tTy}),
2122 Summary GetenvSummary =
2124 .ArgConstraint(NotNull(ArgNo(0)))
2125 .Case({NotNull(Ret)}, ErrnoIrrelevant,
2126 "Assuming the environment variable exists");
2128 if (!ShouldAssumeControlledEnvironment)
2129 GetenvSummary.Case({NotNull(Ret)->negate()}, ErrnoIrrelevant,
2130 "Assuming the environment variable does not exist");
2133 addToFunctionSummaryMap(
2134 "getenv", Signature(ArgTypes{ConstCharPtrTy}, RetType{CharPtrTy}),
2135 std::move(GetenvSummary));
2141 addToFunctionSummaryMap(
2142 {
"getc",
"fgetc"}, Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2144 .Case({ReturnValueCondition(WithinRange,
2145 {{EOFv, EOFv}, {0, UCharRangeMax}})},
2147 .ArgConstraint(NotNull(ArgNo(0))));
2149 const auto ReturnsZeroOrMinusOne =
2150 ConstraintSet{ReturnValueCondition(WithinRange,
Range(-1, 0))};
2151 const auto ReturnsZero =
2152 ConstraintSet{ReturnValueCondition(WithinRange, SingleValue(0))};
2153 const auto ReturnsMinusOne =
2154 ConstraintSet{ReturnValueCondition(WithinRange, SingleValue(-1))};
2155 const auto ReturnsEOF =
2156 ConstraintSet{ReturnValueCondition(WithinRange, SingleValue(EOFv))};
2157 const auto ReturnsNonnegative =
2158 ConstraintSet{ReturnValueCondition(WithinRange,
Range(0, IntMax))};
2159 const auto ReturnsNonZero =
2160 ConstraintSet{ReturnValueCondition(OutOfRange, SingleValue(0))};
2161 const auto ReturnsFileDescriptor =
2162 ConstraintSet{ReturnValueCondition(WithinRange,
Range(-1, IntMax))};
2163 const auto &ReturnsValidFileDescriptor = ReturnsNonnegative;
2165 auto ValidFileDescriptorOrAtFdcwd = [&](ArgNo ArgN) {
2166 return std::make_shared<RangeConstraint>(
2167 ArgN, WithinRange,
Range({AT_FDCWDv, AT_FDCWDv}, {0, IntMax}),
2168 "a valid file descriptor or AT_FDCWD");
2172 addToFunctionSummaryMap(
2174 Signature(ArgTypes{ConstCharPtrRestrictTy, ConstCharPtrRestrictTy},
2175 RetType{FilePtrTy}),
2177 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2178 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2179 .ArgConstraint(NotNull(ArgNo(0)))
2180 .ArgConstraint(NotNull(ArgNo(1))));
2183 addToFunctionSummaryMap(
2185 Signature(ArgTypes{IntTy, ConstCharPtrTy}, RetType{FilePtrTy}),
2187 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2188 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2189 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
2190 .ArgConstraint(NotNull(ArgNo(1))));
2193 addToFunctionSummaryMap(
2194 "tmpfile", Signature(ArgTypes{}, RetType{FilePtrTy}),
2196 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2197 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg));
2201 addToFunctionSummaryMap(
2203 Signature(ArgTypes{ConstCharPtrRestrictTy, ConstCharPtrRestrictTy,
2205 RetType{FilePtrTy}),
2207 .Case({ReturnValueCondition(BO_EQ, ArgNo(2))},
2208 ErrnoMustNotBeChecked, GenericSuccessMsg)
2209 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2210 .ArgConstraint(NotNull(ArgNo(1)))
2211 .ArgConstraint(NotNull(ArgNo(2))));
2214 addToFunctionSummaryMap(
2216 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy}, RetType{FilePtrTy}),
2218 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2219 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2220 .ArgConstraint(NotNull(ArgNo(0)))
2221 .ArgConstraint(NotNull(ArgNo(1))));
2224 addToFunctionSummaryMap(
2225 "fclose", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2227 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2228 .Case(ReturnsEOF, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2229 .ArgConstraint(NotNull(ArgNo(0))));
2232 addToFunctionSummaryMap(
2233 "pclose", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2235 .Case({ReturnValueCondition(WithinRange, {{0, IntMax}})},
2236 ErrnoMustNotBeChecked, GenericSuccessMsg)
2237 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2238 .ArgConstraint(NotNull(ArgNo(0))));
2240 std::optional<QualType> Off_tTy = lookupTy(
"off_t");
2241 std::optional<RangeInt> Off_tMax = getMaxValue(Off_tTy);
2245 addToFunctionSummaryMap(
2246 {
"getc",
"fgetc"}, Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2248 .Case({ReturnValueCondition(WithinRange, {{0, UCharRangeMax}})},
2249 ErrnoMustNotBeChecked, GenericSuccessMsg)
2250 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv))},
2251 ErrnoIrrelevant, GenericFailureMsg)
2252 .ArgConstraint(NotNull(ArgNo(0))));
2256 addToFunctionSummaryMap(
2258 Signature(ArgTypes{IntTy, FilePtrTy}, RetType{IntTy}),
2260 .Case({ArgumentCondition(0, WithinRange,
Range(0, UCharRangeMax)),
2261 ReturnValueCondition(BO_EQ, ArgNo(0))},
2262 ErrnoMustNotBeChecked, GenericSuccessMsg)
2263 .Case({ArgumentCondition(0, OutOfRange,
Range(0, UCharRangeMax)),
2264 ReturnValueCondition(WithinRange,
Range(0, UCharRangeMax))},
2265 ErrnoMustNotBeChecked, GenericSuccessMsg)
2266 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv))},
2267 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2268 .ArgConstraint(NotNull(ArgNo(1))));
2271 addToFunctionSummaryMap(
2273 Signature(ArgTypes{CharPtrRestrictTy, IntTy, FilePtrRestrictTy},
2274 RetType{CharPtrTy}),
2276 .Case({ReturnValueCondition(BO_EQ, ArgNo(0))},
2277 ErrnoMustNotBeChecked, GenericSuccessMsg)
2278 .Case({
IsNull(Ret)}, ErrnoIrrelevant, GenericFailureMsg)
2279 .ArgConstraint(NotNull(ArgNo(0)))
2280 .ArgConstraint(ArgumentCondition(1, WithinRange,
Range(0, IntMax)))
2282 BufferSize(ArgNo(0), ArgNo(1)))
2283 .ArgConstraint(NotNull(ArgNo(2))));
2286 addToFunctionSummaryMap(
2288 Signature(ArgTypes{ConstCharPtrRestrictTy, FilePtrRestrictTy},
2291 .Case(ReturnsNonnegative, ErrnoMustNotBeChecked, GenericSuccessMsg)
2292 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv))},
2293 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2294 .ArgConstraint(NotNull(ArgNo(0)))
2295 .ArgConstraint(NotNull(ArgNo(1))));
2298 addToFunctionSummaryMap(
2299 "ungetc", Signature(ArgTypes{IntTy, FilePtrTy}, RetType{IntTy}),
2301 .Case({ReturnValueCondition(BO_EQ, ArgNo(0)),
2302 ArgumentCondition(0, WithinRange, {{0, UCharRangeMax}})},
2303 ErrnoMustNotBeChecked, GenericSuccessMsg)
2304 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv)),
2305 ArgumentCondition(0, WithinRange, SingleValue(EOFv))},
2306 ErrnoNEZeroIrrelevant,
2307 "Assuming that 'ungetc' fails because EOF was passed as "
2309 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv)),
2310 ArgumentCondition(0, WithinRange, {{0, UCharRangeMax}})},
2311 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2312 .ArgConstraint(ArgumentCondition(
2313 0, WithinRange, {{EOFv, EOFv}, {0, UCharRangeMax}}))
2314 .ArgConstraint(NotNull(ArgNo(1))));
2320 addToFunctionSummaryMap(
2321 "fseek", Signature(ArgTypes{FilePtrTy, LongTy, IntTy}, RetType{IntTy}),
2323 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2324 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2325 .ArgConstraint(NotNull(ArgNo(0)))
2326 .ArgConstraint(ArgumentCondition(2, WithinRange, {{0, 2}})));
2329 addToFunctionSummaryMap(
2331 Signature(ArgTypes{FilePtrTy, Off_tTy, IntTy}, RetType{IntTy}),
2333 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2334 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2335 .ArgConstraint(NotNull(ArgNo(0)))
2336 .ArgConstraint(ArgumentCondition(2, WithinRange, {{0, 2}})));
2342 addToFunctionSummaryMap(
2344 Signature(ArgTypes{FilePtrRestrictTy, FPosTPtrRestrictTy},
2347 .Case(ReturnsZero, ErrnoUnchanged, GenericSuccessMsg)
2348 .Case(ReturnsNonZero, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2349 .ArgConstraint(NotNull(ArgNo(0)))
2350 .ArgConstraint(NotNull(ArgNo(1))));
2356 addToFunctionSummaryMap(
2358 Signature(ArgTypes{FilePtrTy, ConstFPosTPtrTy}, RetType{IntTy}),
2360 .Case(ReturnsZero, ErrnoUnchanged, GenericSuccessMsg)
2361 .Case(ReturnsNonZero, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2362 .ArgConstraint(NotNull(ArgNo(0)))
2363 .ArgConstraint(NotNull(ArgNo(1))));
2366 addToFunctionSummaryMap(
2367 "fflush", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2369 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2370 .Case(ReturnsEOF, ErrnoNEZeroIrrelevant, GenericFailureMsg));
2376 addToFunctionSummaryMap(
2377 "ftell", Signature(ArgTypes{FilePtrTy}, RetType{LongTy}),
2379 .Case({ReturnValueCondition(WithinRange,
Range(0, LongMax))},
2380 ErrnoUnchanged, GenericSuccessMsg)
2381 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2382 .ArgConstraint(NotNull(ArgNo(0))));
2385 addToFunctionSummaryMap(
2386 "ftello", Signature(ArgTypes{FilePtrTy}, RetType{Off_tTy}),
2388 .Case({ReturnValueCondition(WithinRange,
Range(0, Off_tMax))},
2389 ErrnoMustNotBeChecked, GenericSuccessMsg)
2390 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2391 .ArgConstraint(NotNull(ArgNo(0))));
2399 addToFunctionSummaryMap(
2400 "fileno", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2402 .Case(ReturnsValidFileDescriptor, ErrnoUnchanged, GenericSuccessMsg)
2403 .ArgConstraint(NotNull(ArgNo(0))));
2407 addToFunctionSummaryMap(
"rewind",
2408 Signature(ArgTypes{FilePtrTy}, RetType{VoidTy}),
2410 .Case({}, ErrnoMustBeChecked)
2411 .ArgConstraint(NotNull(ArgNo(0))));
2414 addToFunctionSummaryMap(
2415 "clearerr", Signature(ArgTypes{FilePtrTy}, RetType{VoidTy}),
2416 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2419 addToFunctionSummaryMap(
2420 "feof", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2421 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2424 addToFunctionSummaryMap(
2425 "ferror", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2426 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2429 addToFunctionSummaryMap(
2430 "a64l", Signature(ArgTypes{ConstCharPtrTy}, RetType{LongTy}),
2431 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2434 addToFunctionSummaryMap(
"l64a",
2435 Signature(ArgTypes{LongTy}, RetType{CharPtrTy}),
2437 .ArgConstraint(ArgumentCondition(
2438 0, WithinRange,
Range(0, LongMax))));
2441 addToFunctionSummaryMap(
2442 "open", Signature(ArgTypes{ConstCharPtrTy, IntTy}, RetType{IntTy}),
2444 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2446 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2447 .ArgConstraint(NotNull(ArgNo(0))));
2450 addToFunctionSummaryMap(
2452 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy}, RetType{IntTy}),
2454 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2456 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2457 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2458 .ArgConstraint(NotNull(ArgNo(1))));
2461 addToFunctionSummaryMap(
2462 "access", Signature(ArgTypes{ConstCharPtrTy, IntTy}, RetType{IntTy}),
2464 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2465 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2466 .ArgConstraint(NotNull(ArgNo(0))));
2469 addToFunctionSummaryMap(
2471 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy, IntTy},
2474 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2475 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2476 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2477 .ArgConstraint(NotNull(ArgNo(1))));
2480 addToFunctionSummaryMap(
2481 "dup", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2483 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2485 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2487 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2490 addToFunctionSummaryMap(
2491 "dup2", Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
2493 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2495 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2496 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
2498 ArgumentCondition(1, WithinRange,
Range(0, IntMax))));
2501 addToFunctionSummaryMap(
2502 "fdatasync", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2504 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2505 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2507 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2510 addToFunctionSummaryMap(
2512 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy, IntTy},
2515 .ArgConstraint(NotNull(ArgNo(0)))
2516 .ArgConstraint(NotNull(ArgNo(1))));
2519 addToFunctionSummaryMap(
2520 "fsync", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2522 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2523 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2525 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2528 addToFunctionSummaryMap(
2530 Signature(ArgTypes{ConstCharPtrTy, Off_tTy}, RetType{IntTy}),
2532 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2533 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2534 .ArgConstraint(NotNull(ArgNo(0))));
2537 addToFunctionSummaryMap(
2539 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy}, RetType{IntTy}),
2541 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2542 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2543 .ArgConstraint(NotNull(ArgNo(0)))
2544 .ArgConstraint(NotNull(ArgNo(1))));
2547 addToFunctionSummaryMap(
2549 Signature(ArgTypes{ConstCharPtrTy, IntTy, ConstCharPtrTy},
2552 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2553 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2554 .ArgConstraint(NotNull(ArgNo(0)))
2555 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(1)))
2556 .ArgConstraint(NotNull(ArgNo(2))));
2559 addToFunctionSummaryMap(
2560 "lockf", Signature(ArgTypes{IntTy, IntTy, Off_tTy}, RetType{IntTy}),
2562 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2563 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2565 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2567 std::optional<QualType> Mode_tTy = lookupTy(
"mode_t");
2570 addToFunctionSummaryMap(
2571 "creat", Signature(ArgTypes{ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2573 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2575 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2576 .ArgConstraint(NotNull(ArgNo(0))));
2579 addToFunctionSummaryMap(
2580 "sleep", Signature(ArgTypes{UnsignedIntTy}, RetType{UnsignedIntTy}),
2583 ArgumentCondition(0, WithinRange,
Range(0, UnsignedIntMax))));
2585 std::optional<QualType> DirTy = lookupTy(
"DIR");
2586 std::optional<QualType> DirPtrTy = getPointerTy(DirTy);
2589 addToFunctionSummaryMap(
2590 "dirfd", Signature(ArgTypes{DirPtrTy}, RetType{IntTy}),
2592 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2594 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2595 .ArgConstraint(NotNull(ArgNo(0))));
2598 addToFunctionSummaryMap(
2599 "alarm", Signature(ArgTypes{UnsignedIntTy}, RetType{UnsignedIntTy}),
2602 ArgumentCondition(0, WithinRange,
Range(0, UnsignedIntMax))));
2605 addToFunctionSummaryMap(
2606 "closedir", Signature(ArgTypes{DirPtrTy}, RetType{IntTy}),
2608 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2609 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2610 .ArgConstraint(NotNull(ArgNo(0))));
2613 addToFunctionSummaryMap(
2614 "strdup", Signature(ArgTypes{ConstCharPtrTy}, RetType{CharPtrTy}),
2615 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2618 addToFunctionSummaryMap(
2620 Signature(ArgTypes{ConstCharPtrTy, SizeTy}, RetType{CharPtrTy}),
2622 .ArgConstraint(NotNull(ArgNo(0)))
2624 ArgumentCondition(1, WithinRange,
Range(0, SizeMax))));
2627 addToFunctionSummaryMap(
2628 "wcsdup", Signature(ArgTypes{ConstWchar_tPtrTy}, RetType{Wchar_tPtrTy}),
2629 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2632 addToFunctionSummaryMap(
2633 "mkstemp", Signature(ArgTypes{CharPtrTy}, RetType{IntTy}),
2635 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2637 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2638 .ArgConstraint(NotNull(ArgNo(0))));
2641 addToFunctionSummaryMap(
2642 "mkdtemp", Signature(ArgTypes{CharPtrTy}, RetType{CharPtrTy}),
2644 .Case({ReturnValueCondition(BO_EQ, ArgNo(0))},
2645 ErrnoMustNotBeChecked, GenericSuccessMsg)
2646 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2647 .ArgConstraint(NotNull(ArgNo(0))));
2650 addToFunctionSummaryMap(
2651 "getcwd", Signature(ArgTypes{CharPtrTy, SizeTy}, RetType{CharPtrTy}),
2653 .Case({ArgumentCondition(1, WithinRange,
Range(1, SizeMax)),
2654 ReturnValueCondition(BO_EQ, ArgNo(0))},
2655 ErrnoMustNotBeChecked, GenericSuccessMsg)
2656 .Case({ArgumentCondition(1, WithinRange, SingleValue(0)),
2658 ErrnoNEZeroIrrelevant,
"Assuming that argument 'size' is 0")
2659 .Case({ArgumentCondition(1, WithinRange,
Range(1, SizeMax)),
2661 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2662 .ArgConstraint(NotNull(ArgNo(0)))
2664 BufferSize( ArgNo(0), ArgNo(1)))
2666 ArgumentCondition(1, WithinRange,
Range(0, SizeMax))));
2669 addToFunctionSummaryMap(
2670 "mkdir", Signature(ArgTypes{ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2672 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2673 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2674 .ArgConstraint(NotNull(ArgNo(0))));
2677 addToFunctionSummaryMap(
2679 Signature(ArgTypes{IntTy, ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2681 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2682 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2683 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2684 .ArgConstraint(NotNull(ArgNo(1))));
2686 std::optional<QualType> Dev_tTy = lookupTy(
"dev_t");
2689 addToFunctionSummaryMap(
2691 Signature(ArgTypes{ConstCharPtrTy, Mode_tTy, Dev_tTy}, RetType{IntTy}),
2693 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2694 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2695 .ArgConstraint(NotNull(ArgNo(0))));
2698 addToFunctionSummaryMap(
2700 Signature(ArgTypes{IntTy, ConstCharPtrTy, Mode_tTy, Dev_tTy},
2703 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2704 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2705 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2706 .ArgConstraint(NotNull(ArgNo(1))));
2709 addToFunctionSummaryMap(
2710 "chmod", Signature(ArgTypes{ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2712 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2713 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2714 .ArgConstraint(NotNull(ArgNo(0))));
2717 addToFunctionSummaryMap(
2719 Signature(ArgTypes{IntTy, ConstCharPtrTy, Mode_tTy, IntTy},
2722 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2723 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2724 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2725 .ArgConstraint(NotNull(ArgNo(1))));
2728 addToFunctionSummaryMap(
2729 "fchmod", Signature(ArgTypes{IntTy, Mode_tTy}, RetType{IntTy}),
2731 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2732 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2734 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2736 std::optional<QualType> Uid_tTy = lookupTy(
"uid_t");
2737 std::optional<QualType> Gid_tTy = lookupTy(
"gid_t");
2741 addToFunctionSummaryMap(
2743 Signature(ArgTypes{IntTy, ConstCharPtrTy, Uid_tTy, Gid_tTy, IntTy},
2746 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2747 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2748 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2749 .ArgConstraint(NotNull(ArgNo(1))));
2752 addToFunctionSummaryMap(
2754 Signature(ArgTypes{ConstCharPtrTy, Uid_tTy, Gid_tTy}, RetType{IntTy}),
2756 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2757 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2758 .ArgConstraint(NotNull(ArgNo(0))));
2761 addToFunctionSummaryMap(
2763 Signature(ArgTypes{ConstCharPtrTy, Uid_tTy, Gid_tTy}, RetType{IntTy}),
2765 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2766 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2767 .ArgConstraint(NotNull(ArgNo(0))));
2770 addToFunctionSummaryMap(
2771 "fchown", Signature(ArgTypes{IntTy, Uid_tTy, Gid_tTy}, RetType{IntTy}),
2773 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2774 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2776 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2779 addToFunctionSummaryMap(
2780 "rmdir", Signature(ArgTypes{ConstCharPtrTy}, RetType{IntTy}),
2782 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2783 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2784 .ArgConstraint(NotNull(ArgNo(0))));
2787 addToFunctionSummaryMap(
2788 "chdir", Signature(ArgTypes{ConstCharPtrTy}, RetType{IntTy}),
2790 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2791 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2792 .ArgConstraint(NotNull(ArgNo(0))));
2795 addToFunctionSummaryMap(
2797 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy}, RetType{IntTy}),
2799 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2800 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2801 .ArgConstraint(NotNull(ArgNo(0)))
2802 .ArgConstraint(NotNull(ArgNo(1))));
2806 addToFunctionSummaryMap(
2808 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy, ConstCharPtrTy, IntTy},
2811 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2812 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2813 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2814 .ArgConstraint(NotNull(ArgNo(1)))
2815 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(2)))
2816 .ArgConstraint(NotNull(ArgNo(3))));
2819 addToFunctionSummaryMap(
2820 "unlink", Signature(ArgTypes{ConstCharPtrTy}, RetType{IntTy}),
2822 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2823 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2824 .ArgConstraint(NotNull(ArgNo(0))));
2827 addToFunctionSummaryMap(
2829 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy}, RetType{IntTy}),
2831 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2832 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2833 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2834 .ArgConstraint(NotNull(ArgNo(1))));
2836 std::optional<QualType> StructStatTy = lookupTy(
"stat");
2837 std::optional<QualType> StructStatPtrTy = getPointerTy(StructStatTy);
2838 std::optional<QualType> StructStatPtrRestrictTy =
2839 getRestrictTy(StructStatPtrTy);
2842 addToFunctionSummaryMap(
2843 "fstat", Signature(ArgTypes{IntTy, StructStatPtrTy}, RetType{IntTy}),
2845 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2846 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2847 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
2848 .ArgConstraint(NotNull(ArgNo(1))));
2851 addToFunctionSummaryMap(
2853 Signature(ArgTypes{ConstCharPtrRestrictTy, StructStatPtrRestrictTy},
2856 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2857 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2858 .ArgConstraint(NotNull(ArgNo(0)))
2859 .ArgConstraint(NotNull(ArgNo(1))));
2862 addToFunctionSummaryMap(
2864 Signature(ArgTypes{ConstCharPtrRestrictTy, StructStatPtrRestrictTy},
2867 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2868 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2869 .ArgConstraint(NotNull(ArgNo(0)))
2870 .ArgConstraint(NotNull(ArgNo(1))));
2874 addToFunctionSummaryMap(
2876 Signature(ArgTypes{IntTy, ConstCharPtrRestrictTy,
2877 StructStatPtrRestrictTy, IntTy},
2880 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2881 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2882 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2883 .ArgConstraint(NotNull(ArgNo(1)))
2884 .ArgConstraint(NotNull(ArgNo(2))));
2887 addToFunctionSummaryMap(
2888 "opendir", Signature(ArgTypes{ConstCharPtrTy}, RetType{DirPtrTy}),
2890 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2891 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2892 .ArgConstraint(NotNull(ArgNo(0))));
2895 addToFunctionSummaryMap(
2896 "fdopendir", Signature(ArgTypes{IntTy}, RetType{DirPtrTy}),
2898 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2899 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2901 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2904 addToFunctionSummaryMap(
2905 "isatty", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2907 .Case({ReturnValueCondition(WithinRange,
Range(0, 1))},
2910 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2913 addToFunctionSummaryMap(
2914 "close", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2916 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2917 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2919 ArgumentCondition(0, WithinRange,
Range(-1, IntMax))));
2922 addToFunctionSummaryMap(
"fpathconf",
2923 Signature(ArgTypes{IntTy, IntTy}, RetType{LongTy}),
2925 .ArgConstraint(ArgumentCondition(
2926 0, WithinRange,
Range(0, IntMax))));
2929 addToFunctionSummaryMap(
2930 "pathconf", Signature(ArgTypes{ConstCharPtrTy, IntTy}, RetType{LongTy}),
2931 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2934 addToFunctionSummaryMap(
2935 "rewinddir", Signature(ArgTypes{DirPtrTy}, RetType{VoidTy}),
2936 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2939 addToFunctionSummaryMap(
2940 "seekdir", Signature(ArgTypes{DirPtrTy, LongTy}, RetType{VoidTy}),
2941 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2944 addToFunctionSummaryMap(
2945 "rand_r", Signature(ArgTypes{UnsignedIntPtrTy}, RetType{IntTy}),
2946 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2951 addToFunctionSummaryMap(
2953 Signature(ArgTypes{VoidPtrTy, SizeTy, IntTy, IntTy, IntTy, Off_tTy},
2954 RetType{VoidPtrTy}),
2956 .ArgConstraint(ArgumentCondition(1, WithinRange,
Range(1, SizeMax)))
2958 ArgumentCondition(4, WithinRange,
Range(-1, IntMax))));
2960 std::optional<QualType> Off64_tTy = lookupTy(
"off64_t");
2964 addToFunctionSummaryMap(
2966 Signature(ArgTypes{VoidPtrTy, SizeTy, IntTy, IntTy, IntTy, Off64_tTy},
2967 RetType{VoidPtrTy}),
2969 .ArgConstraint(ArgumentCondition(1, WithinRange,
Range(1, SizeMax)))
2971 ArgumentCondition(4, WithinRange,
Range(-1, IntMax))));
2974 addToFunctionSummaryMap(
2975 "pipe", Signature(ArgTypes{IntPtrTy}, RetType{IntTy}),
2977 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2978 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2979 .ArgConstraint(NotNull(ArgNo(0))));
2986 addToFunctionSummaryMap(
2987 "lseek", Signature(ArgTypes{IntTy, Off_tTy, IntTy}, RetType{Off_tTy}),
2989 .Case(ReturnsNonnegative, ErrnoIrrelevant)
2990 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2992 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2996 addToFunctionSummaryMap(
2998 Signature(ArgTypes{ConstCharPtrRestrictTy, CharPtrRestrictTy, SizeTy},
2999 RetType{Ssize_tTy}),
3001 .Case({ArgumentCondition(2, WithinRange,
Range(1, IntMax)),
3002 ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3003 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3004 ErrnoMustNotBeChecked, GenericSuccessMsg)
3005 .Case({ArgumentCondition(2, WithinRange, SingleValue(0)),
3006 ReturnValueCondition(WithinRange, SingleValue(0))},
3007 ErrnoMustNotBeChecked,
3008 "Assuming that argument 'bufsize' is 0")
3009 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3010 .ArgConstraint(NotNull(ArgNo(0)))
3011 .ArgConstraint(NotNull(ArgNo(1)))
3012 .ArgConstraint(BufferSize(ArgNo(1),
3015 ArgumentCondition(2, WithinRange,
Range(0, SizeMax))));
3019 addToFunctionSummaryMap(
3022 ArgTypes{IntTy, ConstCharPtrRestrictTy, CharPtrRestrictTy, SizeTy},
3023 RetType{Ssize_tTy}),
3025 .Case({ArgumentCondition(3, WithinRange,
Range(1, IntMax)),
3026 ReturnValueCondition(LessThanOrEq, ArgNo(3)),
3027 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3028 ErrnoMustNotBeChecked, GenericSuccessMsg)
3029 .Case({ArgumentCondition(3, WithinRange, SingleValue(0)),
3030 ReturnValueCondition(WithinRange, SingleValue(0))},
3031 ErrnoMustNotBeChecked,
3032 "Assuming that argument 'bufsize' is 0")
3033 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3034 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
3035 .ArgConstraint(NotNull(ArgNo(1)))
3036 .ArgConstraint(NotNull(ArgNo(2)))
3037 .ArgConstraint(BufferSize(ArgNo(2),
3040 ArgumentCondition(3, WithinRange,
Range(0, SizeMax))));
3044 addToFunctionSummaryMap(
3046 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy, ConstCharPtrTy},
3049 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3050 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3051 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
3052 .ArgConstraint(NotNull(ArgNo(1)))
3053 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(2)))
3054 .ArgConstraint(NotNull(ArgNo(3))));
3060 addToFunctionSummaryMap(
3062 Signature(ArgTypes{ConstCharPtrRestrictTy, CharPtrRestrictTy},
3063 RetType{CharPtrTy}),
3065 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
3066 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3067 .ArgConstraint(NotNull(ArgNo(0))));
3069 QualType CharPtrConstPtr = getPointerTy(getConstTy(CharPtrTy));
3072 addToFunctionSummaryMap(
3074 Signature(ArgTypes{ConstCharPtrTy, CharPtrConstPtr}, RetType{IntTy}),
3076 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant)
3077 .ArgConstraint(NotNull(ArgNo(0))));
3080 addToFunctionSummaryMap(
3082 Signature(ArgTypes{ConstCharPtrTy, CharPtrConstPtr}, RetType{IntTy}),
3084 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant)
3085 .ArgConstraint(NotNull(ArgNo(0))));
3088 addToFunctionSummaryMap(
3090 Signature(ArgTypes{IntTy, CharPtrConstPtr, ConstCharPtrTy},
3093 .Case({ReturnValueCondition(WithinRange,
Range(-1, UCharRangeMax))},
3095 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3096 .ArgConstraint(NotNull(ArgNo(1)))
3097 .ArgConstraint(NotNull(ArgNo(2))));
3099 std::optional<QualType> StructSockaddrTy = lookupTy(
"sockaddr");
3100 std::optional<QualType> StructSockaddrPtrTy =
3101 getPointerTy(StructSockaddrTy);
3102 std::optional<QualType> ConstStructSockaddrPtrTy =
3103 getPointerTy(getConstTy(StructSockaddrTy));
3104 std::optional<QualType> StructSockaddrPtrRestrictTy =
3105 getRestrictTy(StructSockaddrPtrTy);
3106 std::optional<QualType> ConstStructSockaddrPtrRestrictTy =
3107 getRestrictTy(ConstStructSockaddrPtrTy);
3108 std::optional<QualType> Socklen_tTy = lookupTy(
"socklen_t");
3109 std::optional<QualType> Socklen_tPtrTy = getPointerTy(Socklen_tTy);
3110 std::optional<QualType> Socklen_tPtrRestrictTy =
3111 getRestrictTy(Socklen_tPtrTy);
3112 std::optional<RangeInt> Socklen_tMax = getMaxValue(Socklen_tTy);
3122 addToFunctionSummaryMap(
3123 "socket", Signature(ArgTypes{IntTy, IntTy, IntTy}, RetType{IntTy}),
3125 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
3127 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg));
3131 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
3133 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3134 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)));
3135 if (!addToFunctionSummaryMap(
3139 Signature(ArgTypes{IntTy, StructSockaddrPtrRestrictTy,
3140 Socklen_tPtrRestrictTy},
3143 addToFunctionSummaryMap(
3145 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tPtrRestrictTy},
3151 if (!addToFunctionSummaryMap(
3153 Signature(ArgTypes{IntTy, ConstStructSockaddrPtrTy, Socklen_tTy},
3156 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3157 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3159 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3160 .ArgConstraint(NotNull(ArgNo(1)))
3162 BufferSize(ArgNo(1), ArgNo(2)))
3164 ArgumentCondition(2, WithinRange,
Range(0, Socklen_tMax)))))
3166 addToFunctionSummaryMap(
3168 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tTy}, RetType{IntTy}),
3170 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3171 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3173 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3175 ArgumentCondition(2, WithinRange,
Range(0, Socklen_tMax))));
3179 if (!addToFunctionSummaryMap(
3181 Signature(ArgTypes{IntTy, StructSockaddrPtrRestrictTy,
3182 Socklen_tPtrRestrictTy},
3185 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3186 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3188 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3189 .ArgConstraint(NotNull(ArgNo(1)))
3190 .ArgConstraint(NotNull(ArgNo(2)))))
3191 addToFunctionSummaryMap(
3193 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tPtrRestrictTy},
3196 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3197 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3199 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3203 if (!addToFunctionSummaryMap(
3205 Signature(ArgTypes{IntTy, StructSockaddrPtrRestrictTy,
3206 Socklen_tPtrRestrictTy},
3209 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3210 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3212 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3213 .ArgConstraint(NotNull(ArgNo(1)))
3214 .ArgConstraint(NotNull(ArgNo(2)))))
3215 addToFunctionSummaryMap(
3217 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tPtrRestrictTy},
3220 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3221 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3223 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3227 if (!addToFunctionSummaryMap(
3229 Signature(ArgTypes{IntTy, ConstStructSockaddrPtrTy, Socklen_tTy},
3232 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3233 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3235 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3236 .ArgConstraint(NotNull(ArgNo(1)))))
3237 addToFunctionSummaryMap(
3239 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tTy}, RetType{IntTy}),
3241 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3242 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3244 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3248 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3249 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3250 ErrnoMustNotBeChecked, GenericSuccessMsg)
3251 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3252 ArgumentCondition(2, WithinRange, SingleValue(0))},
3253 ErrnoMustNotBeChecked, GenericSuccessMsg)
3254 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3255 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3256 .ArgConstraint(BufferSize(ArgNo(1),
3258 if (!addToFunctionSummaryMap(
3264 Signature(ArgTypes{IntTy, VoidPtrRestrictTy, SizeTy, IntTy,
3265 StructSockaddrPtrRestrictTy,
3266 Socklen_tPtrRestrictTy},
3267 RetType{Ssize_tTy}),
3269 addToFunctionSummaryMap(
3271 Signature(ArgTypes{IntTy, VoidPtrRestrictTy, SizeTy, IntTy,
3273 RetType{Ssize_tTy}),
3278 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3279 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3280 ErrnoMustNotBeChecked, GenericSuccessMsg)
3281 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3282 ArgumentCondition(2, WithinRange, SingleValue(0))},
3283 ErrnoMustNotBeChecked, GenericSuccessMsg)
3284 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3285 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3286 .ArgConstraint(BufferSize(ArgNo(1),
3288 if (!addToFunctionSummaryMap(
3293 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTy, IntTy,
3294 ConstStructSockaddrPtrTy, Socklen_tTy},
3295 RetType{Ssize_tTy}),
3297 addToFunctionSummaryMap(
3299 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTy, IntTy,
Irrelevant,
3301 RetType{Ssize_tTy}),
3305 addToFunctionSummaryMap(
3306 "listen", Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
3308 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3309 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3311 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3314 addToFunctionSummaryMap(
3316 Signature(ArgTypes{IntTy, VoidPtrTy, SizeTy, IntTy},
3317 RetType{Ssize_tTy}),
3319 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3320 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3321 ErrnoMustNotBeChecked, GenericSuccessMsg)
3322 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3323 ArgumentCondition(2, WithinRange, SingleValue(0))},
3324 ErrnoMustNotBeChecked, GenericSuccessMsg)
3325 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3326 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3327 .ArgConstraint(BufferSize(ArgNo(1),
3330 std::optional<QualType> StructMsghdrTy = lookupTy(
"msghdr");
3331 std::optional<QualType> StructMsghdrPtrTy = getPointerTy(StructMsghdrTy);
3332 std::optional<QualType> ConstStructMsghdrPtrTy =
3333 getPointerTy(getConstTy(StructMsghdrTy));
3336 addToFunctionSummaryMap(
3338 Signature(ArgTypes{IntTy, StructMsghdrPtrTy, IntTy},
3339 RetType{Ssize_tTy}),
3341 .Case({ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3342 ErrnoMustNotBeChecked, GenericSuccessMsg)
3343 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3345 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3348 addToFunctionSummaryMap(
3350 Signature(ArgTypes{IntTy, ConstStructMsghdrPtrTy, IntTy},
3351 RetType{Ssize_tTy}),
3353 .Case({ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3354 ErrnoMustNotBeChecked, GenericSuccessMsg)
3355 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3357 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3361 addToFunctionSummaryMap(
3363 Signature(ArgTypes{IntTy, IntTy, IntTy, ConstVoidPtrTy, Socklen_tTy},
3366 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3367 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3368 .ArgConstraint(NotNull(ArgNo(3)))
3370 BufferSize(ArgNo(3), ArgNo(4)))
3372 ArgumentCondition(4, WithinRange,
Range(0, Socklen_tMax))));
3377 addToFunctionSummaryMap(
3379 Signature(ArgTypes{IntTy, IntTy, IntTy, VoidPtrRestrictTy,
3380 Socklen_tPtrRestrictTy},
3383 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3384 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3385 .ArgConstraint(NotNull(ArgNo(3)))
3386 .ArgConstraint(NotNull(ArgNo(4))));
3389 addToFunctionSummaryMap(
3391 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTy, IntTy},
3392 RetType{Ssize_tTy}),
3394 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3395 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3396 ErrnoMustNotBeChecked, GenericSuccessMsg)
3397 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3398 ArgumentCondition(2, WithinRange, SingleValue(0))},
3399 ErrnoMustNotBeChecked, GenericSuccessMsg)
3400 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3401 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3402 .ArgConstraint(BufferSize(ArgNo(1),
3406 addToFunctionSummaryMap(
3408 Signature(ArgTypes{IntTy, IntTy, IntTy, IntPtrTy}, RetType{IntTy}),
3410 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3411 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3412 .ArgConstraint(NotNull(ArgNo(3))));
3415 addToFunctionSummaryMap(
3416 "shutdown", Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
3418 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3419 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3421 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3430 addToFunctionSummaryMap(
3432 Signature(ArgTypes{ConstStructSockaddrPtrRestrictTy, Socklen_tTy,
3433 CharPtrRestrictTy, Socklen_tTy, CharPtrRestrictTy,
3434 Socklen_tTy, IntTy},
3438 BufferSize(ArgNo(0), ArgNo(1)))
3440 ArgumentCondition(1, WithinRange,
Range(0, Socklen_tMax)))
3442 BufferSize(ArgNo(2), ArgNo(3)))
3444 ArgumentCondition(3, WithinRange,
Range(0, Socklen_tMax)))
3446 BufferSize(ArgNo(4), ArgNo(5)))
3448 ArgumentCondition(5, WithinRange,
Range(0, Socklen_tMax))));
3450 std::optional<QualType> StructUtimbufTy = lookupTy(
"utimbuf");
3451 std::optional<QualType> StructUtimbufPtrTy = getPointerTy(StructUtimbufTy);
3454 addToFunctionSummaryMap(
3456 Signature(ArgTypes{ConstCharPtrTy, StructUtimbufPtrTy}, RetType{IntTy}),
3458 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3459 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3460 .ArgConstraint(NotNull(ArgNo(0))));
3462 std::optional<QualType> StructTimespecTy = lookupTy(
"timespec");
3463 std::optional<QualType> StructTimespecPtrTy =
3464 getPointerTy(StructTimespecTy);
3465 std::optional<QualType> ConstStructTimespecPtrTy =
3466 getPointerTy(getConstTy(StructTimespecTy));
3469 addToFunctionSummaryMap(
3471 Signature(ArgTypes{IntTy, ConstStructTimespecPtrTy}, RetType{IntTy}),
3473 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3474 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3476 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3480 addToFunctionSummaryMap(
3483 ArgTypes{IntTy, ConstCharPtrTy, ConstStructTimespecPtrTy, IntTy},
3486 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3487 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3488 .ArgConstraint(NotNull(ArgNo(1))));
3490 std::optional<QualType> StructTimevalTy = lookupTy(
"timeval");
3491 std::optional<QualType> ConstStructTimevalPtrTy =
3492 getPointerTy(getConstTy(StructTimevalTy));
3495 addToFunctionSummaryMap(
3497 Signature(ArgTypes{ConstCharPtrTy, ConstStructTimevalPtrTy},
3500 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3501 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3502 .ArgConstraint(NotNull(ArgNo(0))));
3505 addToFunctionSummaryMap(
3507 Signature(ArgTypes{ConstStructTimespecPtrTy, StructTimespecPtrTy},
3510 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3511 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3512 .ArgConstraint(NotNull(ArgNo(0))));
3514 std::optional<QualType> Time_tTy = lookupTy(
"time_t");
3515 std::optional<QualType> ConstTime_tPtrTy =
3516 getPointerTy(getConstTy(Time_tTy));
3517 std::optional<QualType> ConstTime_tPtrRestrictTy =
3518 getRestrictTy(ConstTime_tPtrTy);
3520 std::optional<QualType> StructTmTy = lookupTy(
"tm");
3521 std::optional<QualType> StructTmPtrTy = getPointerTy(StructTmTy);
3522 std::optional<QualType> StructTmPtrRestrictTy =
3523 getRestrictTy(StructTmPtrTy);
3524 std::optional<QualType> ConstStructTmPtrTy =
3525 getPointerTy(getConstTy(StructTmTy));
3526 std::optional<QualType> ConstStructTmPtrRestrictTy =
3527 getRestrictTy(ConstStructTmPtrTy);
3530 addToFunctionSummaryMap(
3532 Signature(ArgTypes{ConstTime_tPtrTy}, RetType{StructTmPtrTy}),
3533 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3537 addToFunctionSummaryMap(
3539 Signature(ArgTypes{ConstTime_tPtrRestrictTy, StructTmPtrRestrictTy},
3540 RetType{StructTmPtrTy}),
3542 .ArgConstraint(NotNull(ArgNo(0)))
3543 .ArgConstraint(NotNull(ArgNo(1))));
3546 addToFunctionSummaryMap(
3548 Signature(ArgTypes{ConstStructTmPtrRestrictTy, CharPtrRestrictTy},
3549 RetType{CharPtrTy}),
3551 .ArgConstraint(NotNull(ArgNo(0)))
3552 .ArgConstraint(NotNull(ArgNo(1)))
3553 .ArgConstraint(BufferSize(ArgNo(1),
3554 BVF.getValue(26, IntTy))));
3557 addToFunctionSummaryMap(
3559 Signature(ArgTypes{ConstTime_tPtrTy, CharPtrTy}, RetType{CharPtrTy}),
3561 .ArgConstraint(NotNull(ArgNo(0)))
3562 .ArgConstraint(NotNull(ArgNo(1)))
3563 .ArgConstraint(BufferSize(
3565 BVF.getValue(26, IntTy))));
3569 addToFunctionSummaryMap(
3571 Signature(ArgTypes{ConstTime_tPtrRestrictTy, StructTmPtrRestrictTy},
3572 RetType{StructTmPtrTy}),
3574 .ArgConstraint(NotNull(ArgNo(0)))
3575 .ArgConstraint(NotNull(ArgNo(1))));
3578 addToFunctionSummaryMap(
3579 "gmtime", Signature(ArgTypes{ConstTime_tPtrTy}, RetType{StructTmPtrTy}),
3580 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3582 std::optional<QualType> Clockid_tTy = lookupTy(
"clockid_t");
3585 addToFunctionSummaryMap(
3587 Signature(ArgTypes{Clockid_tTy, StructTimespecPtrTy}, RetType{IntTy}),
3589 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3590 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3591 .ArgConstraint(NotNull(ArgNo(1))));
3593 std::optional<QualType> StructItimervalTy = lookupTy(
"itimerval");
3594 std::optional<QualType> StructItimervalPtrTy =
3595 getPointerTy(StructItimervalTy);
3598 addToFunctionSummaryMap(
3600 Signature(ArgTypes{IntTy, StructItimervalPtrTy}, RetType{IntTy}),
3602 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3603 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3604 .ArgConstraint(NotNull(ArgNo(1))));
3606 std::optional<QualType> Pthread_cond_tTy = lookupTy(
"pthread_cond_t");
3607 std::optional<QualType> Pthread_cond_tPtrTy =
3608 getPointerTy(Pthread_cond_tTy);
3609 std::optional<QualType> Pthread_tTy = lookupTy(
"pthread_t");
3610 std::optional<QualType> Pthread_tPtrTy = getPointerTy(Pthread_tTy);
3611 std::optional<QualType> Pthread_tPtrRestrictTy =
3612 getRestrictTy(Pthread_tPtrTy);
3613 std::optional<QualType> Pthread_mutex_tTy = lookupTy(
"pthread_mutex_t");
3614 std::optional<QualType> Pthread_mutex_tPtrTy =
3615 getPointerTy(Pthread_mutex_tTy);
3616 std::optional<QualType> Pthread_mutex_tPtrRestrictTy =
3617 getRestrictTy(Pthread_mutex_tPtrTy);
3618 std::optional<QualType> Pthread_attr_tTy = lookupTy(
"pthread_attr_t");
3619 std::optional<QualType> Pthread_attr_tPtrTy =
3620 getPointerTy(Pthread_attr_tTy);
3621 std::optional<QualType> ConstPthread_attr_tPtrTy =
3622 getPointerTy(getConstTy(Pthread_attr_tTy));
3623 std::optional<QualType> ConstPthread_attr_tPtrRestrictTy =
3624 getRestrictTy(ConstPthread_attr_tPtrTy);
3625 std::optional<QualType> Pthread_mutexattr_tTy =
3626 lookupTy(
"pthread_mutexattr_t");
3627 std::optional<QualType> ConstPthread_mutexattr_tPtrTy =
3628 getPointerTy(getConstTy(Pthread_mutexattr_tTy));
3629 std::optional<QualType> ConstPthread_mutexattr_tPtrRestrictTy =
3630 getRestrictTy(ConstPthread_mutexattr_tPtrTy);
3632 QualType PthreadStartRoutineTy = getPointerTy(
3638 addToFunctionSummaryMap(
3639 {
"pthread_cond_signal",
"pthread_cond_broadcast"},
3640 Signature(ArgTypes{Pthread_cond_tPtrTy}, RetType{IntTy}),
3641 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3646 addToFunctionSummaryMap(
3648 Signature(ArgTypes{Pthread_tPtrRestrictTy,
3649 ConstPthread_attr_tPtrRestrictTy,
3650 PthreadStartRoutineTy, VoidPtrRestrictTy},
3653 .ArgConstraint(NotNull(ArgNo(0)))
3654 .ArgConstraint(NotNull(ArgNo(2))));
3658 addToFunctionSummaryMap(
3659 {
"pthread_attr_destroy",
"pthread_attr_init"},
3660 Signature(ArgTypes{Pthread_attr_tPtrTy}, RetType{IntTy}),
3661 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3667 addToFunctionSummaryMap(
3668 {
"pthread_attr_getstacksize",
"pthread_attr_getguardsize"},
3669 Signature(ArgTypes{ConstPthread_attr_tPtrRestrictTy, SizePtrRestrictTy},
3672 .ArgConstraint(NotNull(ArgNo(0)))
3673 .ArgConstraint(NotNull(ArgNo(1))));
3677 addToFunctionSummaryMap(
3678 {
"pthread_attr_setstacksize",
"pthread_attr_setguardsize"},
3679 Signature(ArgTypes{Pthread_attr_tPtrTy, SizeTy}, RetType{IntTy}),
3681 .ArgConstraint(NotNull(ArgNo(0)))
3683 ArgumentCondition(1, WithinRange,
Range(0, SizeMax))));
3687 addToFunctionSummaryMap(
3688 "pthread_mutex_init",
3689 Signature(ArgTypes{Pthread_mutex_tPtrRestrictTy,
3690 ConstPthread_mutexattr_tPtrRestrictTy},
3692 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3698 addToFunctionSummaryMap(
3699 {
"pthread_mutex_destroy",
"pthread_mutex_lock",
"pthread_mutex_trylock",
3700 "pthread_mutex_unlock"},
3701 Signature(ArgTypes{Pthread_mutex_tPtrTy}, RetType{IntTy}),
3702 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3706 if (AddTestFunctions) {
3707 const RangeInt IntMin = BVF.
getMinValue(IntTy)->getLimitedValue();
3709 addToFunctionSummaryMap(
3710 "__not_null", Signature(ArgTypes{IntPtrTy}, RetType{IntTy}),
3711 Summary(EvalCallAsPure).ArgConstraint(NotNull(ArgNo(0))));
3713 addToFunctionSummaryMap(
3714 "__not_null_buffer",
3715 Signature(ArgTypes{VoidPtrTy, IntTy, IntTy}, RetType{IntTy}),
3716 Summary(EvalCallAsPure)
3717 .ArgConstraint(NotNullBuffer(ArgNo(0), ArgNo(1), ArgNo(2))));
3720 addToFunctionSummaryMap(
3721 "__single_val_0", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3722 Summary(EvalCallAsPure)
3723 .ArgConstraint(ArgumentCondition(0
U, WithinRange, SingleValue(0))));
3724 addToFunctionSummaryMap(
3725 "__single_val_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3726 Summary(EvalCallAsPure)
3727 .ArgConstraint(ArgumentCondition(0
U, WithinRange, SingleValue(1))));
3728 addToFunctionSummaryMap(
3729 "__range_1_2", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3730 Summary(EvalCallAsPure)
3731 .ArgConstraint(ArgumentCondition(0
U, WithinRange,
Range(1, 2))));
3732 addToFunctionSummaryMap(
3733 "__range_m1_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3734 Summary(EvalCallAsPure)
3735 .ArgConstraint(ArgumentCondition(0
U, WithinRange,
Range(-1, 1))));
3736 addToFunctionSummaryMap(
3737 "__range_m2_m1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3738 Summary(EvalCallAsPure)
3739 .ArgConstraint(ArgumentCondition(0
U, WithinRange,
Range(-2, -1))));
3740 addToFunctionSummaryMap(
3741 "__range_m10_10", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3742 Summary(EvalCallAsPure)
3743 .ArgConstraint(ArgumentCondition(0
U, WithinRange,
Range(-10, 10))));
3744 addToFunctionSummaryMap(
"__range_m1_inf",
3745 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3746 Summary(EvalCallAsPure)
3747 .ArgConstraint(ArgumentCondition(
3748 0
U, WithinRange,
Range(-1, IntMax))));
3749 addToFunctionSummaryMap(
"__range_0_inf",
3750 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3751 Summary(EvalCallAsPure)
3752 .ArgConstraint(ArgumentCondition(
3753 0
U, WithinRange,
Range(0, IntMax))));
3754 addToFunctionSummaryMap(
"__range_1_inf",
3755 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3756 Summary(EvalCallAsPure)
3757 .ArgConstraint(ArgumentCondition(
3758 0
U, WithinRange,
Range(1, IntMax))));
3759 addToFunctionSummaryMap(
"__range_minf_m1",
3760 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3761 Summary(EvalCallAsPure)
3762 .ArgConstraint(ArgumentCondition(
3763 0
U, WithinRange,
Range(IntMin, -1))));
3764 addToFunctionSummaryMap(
"__range_minf_0",
3765 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3766 Summary(EvalCallAsPure)
3767 .ArgConstraint(ArgumentCondition(
3768 0
U, WithinRange,
Range(IntMin, 0))));
3769 addToFunctionSummaryMap(
"__range_minf_1",
3770 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3771 Summary(EvalCallAsPure)
3772 .ArgConstraint(ArgumentCondition(
3773 0
U, WithinRange,
Range(IntMin, 1))));
3774 addToFunctionSummaryMap(
"__range_1_2__4_6",
3775 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3776 Summary(EvalCallAsPure)
3777 .ArgConstraint(ArgumentCondition(
3778 0
U, WithinRange,
Range({1, 2}, {4, 6}))));
3779 addToFunctionSummaryMap(
3780 "__range_1_2__4_inf", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3781 Summary(EvalCallAsPure)
3782 .ArgConstraint(ArgumentCondition(0
U, WithinRange,
3783 Range({1, 2}, {4, IntMax}))));
3786 addToFunctionSummaryMap(
3787 "__single_val_out_0", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3788 Summary(EvalCallAsPure)
3789 .ArgConstraint(ArgumentCondition(0
U, OutOfRange, SingleValue(0))));
3790 addToFunctionSummaryMap(
3791 "__single_val_out_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3792 Summary(EvalCallAsPure)
3793 .ArgConstraint(ArgumentCondition(0
U, OutOfRange, SingleValue(1))));
3794 addToFunctionSummaryMap(
3795 "__range_out_1_2", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3796 Summary(EvalCallAsPure)
3797 .ArgConstraint(ArgumentCondition(0
U, OutOfRange,
Range(1, 2))));
3798 addToFunctionSummaryMap(
3799 "__range_out_m1_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3800 Summary(EvalCallAsPure)
3801 .ArgConstraint(ArgumentCondition(0
U, OutOfRange,
Range(-1, 1))));
3802 addToFunctionSummaryMap(
3803 "__range_out_m2_m1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3804 Summary(EvalCallAsPure)
3805 .ArgConstraint(ArgumentCondition(0
U, OutOfRange,
Range(-2, -1))));
3806 addToFunctionSummaryMap(
3807 "__range_out_m10_10", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3808 Summary(EvalCallAsPure)
3809 .ArgConstraint(ArgumentCondition(0
U, OutOfRange,
Range(-10, 10))));
3810 addToFunctionSummaryMap(
"__range_out_m1_inf",
3811 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3812 Summary(EvalCallAsPure)
3813 .ArgConstraint(ArgumentCondition(
3814 0
U, OutOfRange,
Range(-1, IntMax))));
3815 addToFunctionSummaryMap(
"__range_out_0_inf",
3816 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3817 Summary(EvalCallAsPure)
3818 .ArgConstraint(ArgumentCondition(
3819 0
U, OutOfRange,
Range(0, IntMax))));
3820 addToFunctionSummaryMap(
"__range_out_1_inf",
3821 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3822 Summary(EvalCallAsPure)
3823 .ArgConstraint(ArgumentCondition(
3824 0
U, OutOfRange,
Range(1, IntMax))));
3825 addToFunctionSummaryMap(
"__range_out_minf_m1",
3826 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3827 Summary(EvalCallAsPure)
3828 .ArgConstraint(ArgumentCondition(
3829 0
U, OutOfRange,
Range(IntMin, -1))));
3830 addToFunctionSummaryMap(
"__range_out_minf_0",
3831 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3832 Summary(EvalCallAsPure)
3833 .ArgConstraint(ArgumentCondition(
3834 0
U, OutOfRange,
Range(IntMin, 0))));
3835 addToFunctionSummaryMap(
"__range_out_minf_1",
3836 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3837 Summary(EvalCallAsPure)
3838 .ArgConstraint(ArgumentCondition(
3839 0
U, OutOfRange,
Range(IntMin, 1))));
3840 addToFunctionSummaryMap(
"__range_out_1_2__4_6",
3841 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3842 Summary(EvalCallAsPure)
3843 .ArgConstraint(ArgumentCondition(
3844 0
U, OutOfRange,
Range({1, 2}, {4, 6}))));
3845 addToFunctionSummaryMap(
3846 "__range_out_1_2__4_inf", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3847 Summary(EvalCallAsPure)
3849 ArgumentCondition(0
U, OutOfRange,
Range({1, 2}, {4, IntMax}))));
3852 addToFunctionSummaryMap(
3853 "__within", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3854 Summary(EvalCallAsPure)
3855 .ArgConstraint(ArgumentCondition(0
U, WithinRange, SingleValue(1))));
3856 addToFunctionSummaryMap(
3857 "__out_of", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3858 Summary(EvalCallAsPure)
3859 .ArgConstraint(ArgumentCondition(0
U, OutOfRange, SingleValue(1))));
3861 addToFunctionSummaryMap(
3862 "__two_constrained_args",
3863 Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
3864 Summary(EvalCallAsPure)
3865 .ArgConstraint(ArgumentCondition(0
U, WithinRange, SingleValue(1)))
3866 .ArgConstraint(ArgumentCondition(1U, WithinRange, SingleValue(1))));
3867 addToFunctionSummaryMap(
3868 "__arg_constrained_twice", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3869 Summary(EvalCallAsPure)
3870 .ArgConstraint(ArgumentCondition(0
U, OutOfRange, SingleValue(1)))
3871 .ArgConstraint(ArgumentCondition(0
U, OutOfRange, SingleValue(2))));
3872 addToFunctionSummaryMap(
3874 Signature(ArgTypes{
Irrelevant, IntTy}, RetType{IntTy}),
3875 Summary(EvalCallAsPure).ArgConstraint(NotNull(ArgNo(0))));
3876 addToFunctionSummaryMap(
3878 Signature(ArgTypes{VoidPtrTy, ConstCharPtrTy}, RetType{IntTy}),
3879 Summary(EvalCallAsPure)
3880 .ArgConstraint(NotNull(ArgNo(0)))
3881 .ArgConstraint(NotNull(ArgNo(1))));
3882 addToFunctionSummaryMap(
3883 "__buf_size_arg_constraint",
3884 Signature(ArgTypes{ConstVoidPtrTy, SizeTy}, RetType{IntTy}),
3885 Summary(EvalCallAsPure)
3887 BufferSize(ArgNo(0), ArgNo(1))));
3888 addToFunctionSummaryMap(
3889 "__buf_size_arg_constraint_mul",
3890 Signature(ArgTypes{ConstVoidPtrTy, SizeTy, SizeTy}, RetType{IntTy}),
3891 Summary(EvalCallAsPure)
3892 .ArgConstraint(BufferSize(ArgNo(0), ArgNo(1),
3894 addToFunctionSummaryMap(
3895 "__buf_size_arg_constraint_concrete",
3896 Signature(ArgTypes{ConstVoidPtrTy}, RetType{IntTy}),
3897 Summary(EvalCallAsPure)
3898 .ArgConstraint(BufferSize(ArgNo(0),
3899 BVF.getValue(10, IntTy))));
3900 addToFunctionSummaryMap(
3901 {
"__test_restrict_param_0",
"__test_restrict_param_1",
3902 "__test_restrict_param_2"},
3903 Signature(ArgTypes{VoidPtrRestrictTy}, RetType{VoidTy}),
3904 Summary(EvalCallAsPure));
3907 addToFunctionSummaryMap(
3908 "__test_case_note", Signature(ArgTypes{}, RetType{IntTy}),
3909 Summary(EvalCallAsPure)
3910 .Case({ReturnValueCondition(WithinRange, SingleValue(0))},
3911 ErrnoIrrelevant,
"Function returns 0")
3912 .Case({ReturnValueCondition(WithinRange, SingleValue(1))},
3913 ErrnoIrrelevant,
"Function returns 1"));
3914 addToFunctionSummaryMap(
3915 "__test_case_range_1_2__4_6",
3916 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3917 Summary(EvalCallAsPure)
3918 .Case({ArgumentCondition(0
U, WithinRange,
3919 IntRangeVector{{IntMin, 0}, {3, 3}}),
3920 ReturnValueCondition(WithinRange, SingleValue(1))},
3922 .Case({ArgumentCondition(0
U, WithinRange,
3923 IntRangeVector{{3, 3}, {7, IntMax}}),
3924 ReturnValueCondition(WithinRange, SingleValue(2))},
3926 .Case({ArgumentCondition(0
U, WithinRange,
3927 IntRangeVector{{IntMin, 0}, {7, IntMax}}),
3928 ReturnValueCondition(WithinRange, SingleValue(3))},
3930 .Case({ArgumentCondition(
3932 IntRangeVector{{IntMin, 0}, {3, 3}, {7, IntMax}}),
3933 ReturnValueCondition(WithinRange, SingleValue(4))},
3938void ento::registerStdCLibraryFunctionsChecker(
CheckerManager &mgr) {
3942 Checker->DisplayLoadedSummaries =
3945 Checker->ShouldAssumeControlledEnvironment =
3946 Opts.ShouldAssumeControlledEnvironment;
3949bool ento::shouldRegisterStdCLibraryFunctionsChecker(
3954void ento::registerStdCLibraryFunctionsTesterChecker(
CheckerManager &mgr) {
3956 Checker->AddTestFunctions =
true;
3959bool ento::shouldRegisterStdCLibraryFunctionsTesterChecker(
static bool isInvalid(LocType Loc, bool *Invalid)
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
const LangOptions & getLangOpts() const
QualType getRestrictType(QualType T) const
Return the uniqued reference to the type for a restrict qualified type.
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
CanQualType UnsignedCharTy
CanQualType UnsignedIntTy
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
Stores options for the analyzer from the command line.
bool getCheckerBooleanOption(StringRef CheckerName, StringRef OptionName, bool SearchInParents=false) const
Interprets an option's string value as a boolean.
static Opcode negateComparisonOp(Opcode Opc)
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
Decl - This represents one declaration (or definition), e.g.
ASTContext & getASTContext() const LLVM_READONLY
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
The name of a declaration.
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
QualType getReturnType() const
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
size_t param_size() const
One of these records is kept for each identifier that is lexed.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
It wraps the AnalysisDeclContext to represent both the call stack with the help of StackFrameContext ...
Engages in a tight little dance with the lexer to efficiently preprocess tokens.
A (possibly-)qualified type.
QualType withConst() const
QualType getCanonicalType() const
APSIntPtr getMaxValue(const llvm::APSInt &v)
APSIntPtr getMinValue(const llvm::APSInt &v)
ASTContext & getContext() const
Represents an abstract call to a function or method along a particular path.
const AnalyzerOptions & getAnalyzerOptions() const
CHECKER * registerChecker(AT &&... Args)
Used to register checkers.
CheckerNameRef getCurrentCheckerName() const
This wrapper is used to ensure that only StringRefs originating from the CheckerRegistry are used as ...
ProgramStateRef assumeInclusiveRange(ProgramStateRef State, NonLoc Value, const llvm::APSInt &From, const llvm::APSInt &To, bool InBound)
const ProgramStateRef & getState() const
The tag upon which the TagVisitor reacts.
const ExplodedNode * getErrorNode() const
void markNotInteresting(SymbolRef sym)
bool isInteresting(SymbolRef sym) const
SValBuilder & getSValBuilder()
ConstraintManager & getConstraintManager()
A Range represents the closed range [from, to].
BasicValueFactory & getBasicValueFactory()
ASTContext & getContext()
nonloc::ConcreteInt makeIntVal(const IntegerLiteral *integer)
SVal evalCast(SVal V, QualType CastTy, QualType OriginalTy)
Cast a given SVal to another SVal using given QualType's.
DefinedOrUnknownSVal conjureSymbolVal(const void *symbolTag, const Expr *expr, const LocationContext *LCtx, unsigned count)
Create a new symbol with a unique 'name'.
QualType getConditionType() const
SVal evalBinOp(ProgramStateRef state, BinaryOperator::Opcode op, SVal lhs, SVal rhs, QualType type)
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
std::optional< T > getAs() const
Convert to the specified SVal type, returning std::nullopt if this SVal is not of the desired type.
T castAs() const
Convert to the specified SVal type, asserting that this SVal is of the desired type.
bool trackExpressionValue(const ExplodedNode *N, const Expr *E, PathSensitiveBugReport &R, TrackingOptions Opts={})
Attempts to add visitors to track expression value back to its point of origin.
std::optional< Loc > getErrnoLoc(ProgramStateRef State)
Returns the location that points to the MemoryRegion where the 'errno' value is stored.
ProgramStateRef setErrnoForStdSuccess(ProgramStateRef State, CheckerContext &C)
Set errno state for the common case when a standard function is successful.
ProgramStateRef setErrnoState(ProgramStateRef State, ErrnoCheckState EState)
Set the errno check state, do not modify the errno value.
ProgramStateRef setErrnoStdMustBeChecked(ProgramStateRef State, CheckerContext &C, const Expr *InvalE)
Set errno state for the common case when a standard function indicates failure only by errno.
ProgramStateRef setErrnoForStdFailure(ProgramStateRef State, CheckerContext &C, NonLoc ErrnoSym)
Set errno state for the common case when a standard function fails.
@ Irrelevant
We do not know anything about 'errno'.
SVal getDynamicExtentWithOffset(ProgramStateRef State, SVal BufV)
Get the dynamic extent for a symbolic value that represents a buffer.
std::optional< int > tryExpandAsInteger(StringRef Macro, const Preprocessor &PP)
Try to parse the value of a defined preprocessor macro.
bool IsNonNull(InterpState &S, CodePtr OpPC)
bool Ret(InterpState &S, CodePtr &PC)
bool matches(const til::SExpr *E1, const til::SExpr *E2)
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
Extra information about a function prototype.