53#include "llvm/ADT/STLExtras.h"
54#include "llvm/ADT/SmallString.h"
55#include "llvm/ADT/StringExtras.h"
56#include "llvm/Support/FormatVariadic.h"
65class StdLibraryFunctionsChecker
66 :
public Checker<check::PreCall, check::PostCall, eval::Call> {
72 enum InvalidationKind {
81 enum RangeKind { OutOfRange, WithinRange };
83 static RangeKind negateKind(RangeKind K) {
90 llvm_unreachable(
"Unknown range kind");
99 typedef std::vector<std::pair<RangeInt, RangeInt>> IntRangeVector;
106 static const ArgNo Ret;
110 static void printArgDesc(ArgNo, llvm::raw_ostream &Out);
115 const CallEvent &
Call, llvm::raw_ostream &Out);
118 static void appendInsideRangeDesc(llvm::APSInt RMin, llvm::APSInt RMax,
119 QualType ArgT, BasicValueFactory &BVF,
120 llvm::raw_ostream &Out);
123 static void appendOutOfRangeDesc(llvm::APSInt RMin, llvm::APSInt RMax,
124 QualType ArgT, BasicValueFactory &BVF,
125 llvm::raw_ostream &Out);
127 class ValueConstraint;
136 using ValueConstraintPtr = std::shared_ptr<ValueConstraint>;
148 class ValueConstraint {
150 ValueConstraint(ArgNo ArgN) : ArgN(ArgN) {}
151 virtual ~ValueConstraint() {}
156 const Summary &Summary,
157 CheckerContext &
C)
const = 0;
161 enum DescriptionKind {
177 virtual void describe(DescriptionKind DK,
const CallEvent &
Call,
179 llvm::raw_ostream &Out)
const {
184 "Description not implemented for summary case constraints");
199 virtual bool describeArgumentValue(
const CallEvent &
Call,
201 const Summary &Summary,
202 llvm::raw_ostream &Out)
const {
203 if (
auto N = getArgSVal(
Call, getArgNo()).getAs<NonLoc>()) {
204 if (
const llvm::APSInt *Int = N->getAsInteger()) {
218 virtual std::vector<ArgNo> getArgsToTrack()
const {
return {ArgN}; }
221 virtual ValueConstraintPtr negate()
const {
222 llvm_unreachable(
"Not implemented");
230 bool checkValidity(
const FunctionDecl *FD)
const {
232 assert(ValidArg &&
"Arg out of range!");
236 return checkSpecificValidity(FD);
240 ArgNo getArgNo()
const {
return ArgN; }
251 virtual bool checkSpecificValidity(
const FunctionDecl *FD)
const {
266 class RangeConstraint :
public ValueConstraint {
273 IntRangeVector Ranges;
278 StringRef Description;
281 RangeConstraint(ArgNo ArgN, RangeKind Kind,
const IntRangeVector &Ranges,
283 : ValueConstraint(ArgN), Kind(Kind), Ranges(Ranges), Description(Desc) {
286 const IntRangeVector &getRanges()
const {
return Ranges; }
289 const Summary &Summary,
290 CheckerContext &
C)
const override;
292 void describe(DescriptionKind DK,
const CallEvent &
Call,
294 llvm::raw_ostream &Out)
const override;
297 const Summary &Summary,
298 llvm::raw_ostream &Out)
const override;
300 ValueConstraintPtr negate()
const override {
301 RangeConstraint Tmp(*
this);
302 Tmp.Kind = negateKind(Kind);
303 return std::make_shared<RangeConstraint>(Tmp);
307 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
308 return getArgType(FD, ArgN)->isIntegralType(FD->
getASTContext());
316 using RangeApplyFunction =
321 void applyOnWithinRange(BasicValueFactory &BVF, QualType ArgT,
322 const RangeApplyFunction &F)
const;
333 void applyOnOutOfRange(BasicValueFactory &BVF, QualType ArgT,
334 const RangeApplyFunction &F)
const;
337 void applyOnRange(RangeKind Kind, BasicValueFactory &BVF, QualType ArgT,
338 const RangeApplyFunction &F)
const {
341 applyOnOutOfRange(BVF, ArgT, F);
344 applyOnWithinRange(BVF, ArgT, F);
351 class ComparisonConstraint :
public ValueConstraint {
358 : ValueConstraint(ArgN), Opcode(Opcode), OtherArgN(OtherArgN) {}
359 ArgNo getOtherArgNo()
const {
return OtherArgN; }
362 const Summary &Summary,
363 CheckerContext &
C)
const override;
367 class NullnessConstraint :
public ValueConstraint {
368 using ValueConstraint::ValueConstraint;
370 bool CannotBeNull =
true;
373 NullnessConstraint(ArgNo ArgN,
bool CannotBeNull =
true)
374 : ValueConstraint(ArgN), CannotBeNull(CannotBeNull) {}
377 const Summary &Summary,
378 CheckerContext &
C)
const override;
380 void describe(DescriptionKind DK,
const CallEvent &
Call,
382 llvm::raw_ostream &Out)
const override;
385 const Summary &Summary,
386 llvm::raw_ostream &Out)
const override;
388 ValueConstraintPtr negate()
const override {
389 NullnessConstraint Tmp(*
this);
390 Tmp.CannotBeNull = !this->CannotBeNull;
391 return std::make_shared<NullnessConstraint>(Tmp);
395 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
396 const bool ValidArg = getArgType(FD, ArgN)->isPointerType();
398 "This constraint should be applied only on a pointer type");
409 class BufferNullnessConstraint :
public ValueConstraint {
410 using ValueConstraint::ValueConstraint;
412 std::optional<ArgNo> SizeArg2N;
414 bool CannotBeNull =
true;
417 BufferNullnessConstraint(ArgNo ArgN, ArgNo SizeArg1N,
418 std::optional<ArgNo> SizeArg2N,
419 bool CannotBeNull =
true)
420 : ValueConstraint(ArgN), SizeArg1N(SizeArg1N), SizeArg2N(SizeArg2N),
421 CannotBeNull(CannotBeNull) {}
424 const Summary &Summary,
425 CheckerContext &
C)
const override;
427 void describe(DescriptionKind DK,
const CallEvent &
Call,
429 llvm::raw_ostream &Out)
const override;
432 const Summary &Summary,
433 llvm::raw_ostream &Out)
const override;
435 ValueConstraintPtr negate()
const override {
436 BufferNullnessConstraint Tmp(*
this);
437 Tmp.CannotBeNull = !this->CannotBeNull;
438 return std::make_shared<BufferNullnessConstraint>(Tmp);
442 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
443 const bool ValidArg = getArgType(FD, ArgN)->isPointerType();
445 "This constraint should be applied only on a pointer type");
460 class BufferSizeConstraint :
public ValueConstraint {
462 std::optional<llvm::APSInt> ConcreteSize;
464 std::optional<ArgNo> SizeArgN;
468 std::optional<ArgNo> SizeMultiplierArgN;
473 BufferSizeConstraint(ArgNo Buffer, llvm::APSInt BufMinSize)
474 : ValueConstraint(Buffer), ConcreteSize(BufMinSize) {}
475 BufferSizeConstraint(ArgNo Buffer, ArgNo BufSize)
476 : ValueConstraint(Buffer), SizeArgN(BufSize) {}
477 BufferSizeConstraint(ArgNo Buffer, ArgNo BufSize, ArgNo BufSizeMultiplier)
478 : ValueConstraint(Buffer), SizeArgN(BufSize),
479 SizeMultiplierArgN(BufSizeMultiplier) {}
482 const Summary &Summary,
483 CheckerContext &
C)
const override;
485 void describe(DescriptionKind DK,
const CallEvent &
Call,
487 llvm::raw_ostream &Out)
const override;
490 const Summary &Summary,
491 llvm::raw_ostream &Out)
const override;
493 std::vector<ArgNo> getArgsToTrack()
const override {
494 std::vector<ArgNo>
Result{ArgN};
496 Result.push_back(*SizeArgN);
497 if (SizeMultiplierArgN)
498 Result.push_back(*SizeMultiplierArgN);
502 ValueConstraintPtr negate()
const override {
503 BufferSizeConstraint Tmp(*
this);
505 return std::make_shared<BufferSizeConstraint>(Tmp);
509 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
510 const bool ValidArg = getArgType(FD, ArgN)->isPointerType();
512 "This constraint should be applied only on a pointer type");
518 using ConstraintSet = std::vector<ValueConstraintPtr>;
527 class ErrnoConstraintBase {
531 const Summary &Summary,
532 CheckerContext &
C)
const = 0;
537 virtual std::string
describe(CheckerContext &
C)
const {
return ""; }
539 virtual ~ErrnoConstraintBase() {}
542 ErrnoConstraintBase() =
default;
552 class ResetErrnoConstraint :
public ErrnoConstraintBase {
555 const Summary &Summary,
556 CheckerContext &
C)
const override {
565 class NoErrnoConstraint :
public ErrnoConstraintBase {
568 const Summary &Summary,
569 CheckerContext &
C)
const override {
578 class FailureErrnoConstraint :
public ErrnoConstraintBase {
581 const Summary &Summary,
582 CheckerContext &
C)
const override {
583 SValBuilder &SVB =
C.getSValBuilder();
585 C.blockCount(), &Tag)
596 class SuccessErrnoConstraint :
public ErrnoConstraintBase {
599 const Summary &Summary,
600 CheckerContext &
C)
const override {
604 std::string
describe(CheckerContext &
C)
const override {
605 return "'errno' becomes undefined after the call";
613 class ErrnoMustBeCheckedConstraint :
public ErrnoConstraintBase {
616 const Summary &Summary,
617 CheckerContext &
C)
const override {
619 Call.getCFGElementRef());
622 std::string
describe(CheckerContext &
C)
const override {
623 return "reading 'errno' is required to find out if the call has failed";
649 ConstraintSet Constraints;
650 const ErrnoConstraintBase &ErrnoConstraint;
654 SummaryCase(ConstraintSet &&Constraints,
const ErrnoConstraintBase &ErrnoC,
656 : Constraints(std::move(Constraints)), ErrnoConstraint(ErrnoC),
659 SummaryCase(
const ConstraintSet &Constraints,
660 const ErrnoConstraintBase &ErrnoC, StringRef Note)
661 : Constraints(Constraints), ErrnoConstraint(ErrnoC), Note(Note) {}
663 const ConstraintSet &getConstraints()
const {
return Constraints; }
664 const ErrnoConstraintBase &getErrnoConstraint()
const {
665 return ErrnoConstraint;
667 StringRef getNote()
const {
return Note; }
670 using ArgTypes = ArrayRef<std::optional<QualType>>;
671 using RetType = std::optional<QualType>;
675 const QualType Irrelevant{};
676 bool static isIrrelevant(QualType
T) {
return T.isNull(); }
683 using ArgQualTypes = std::vector<QualType>;
687 bool Invalid =
false;
692 Signature(ArgTypes ArgTys, RetType RetTy) {
693 for (std::optional<QualType> Arg : ArgTys) {
698 assertArgTypeSuitableForSignature(*Arg);
699 this->ArgTys.push_back(*Arg);
706 assertRetTypeSuitableForSignature(*RetTy);
707 this->RetTy = *RetTy;
711 bool isInvalid()
const {
return Invalid; }
712 bool matches(
const FunctionDecl *FD)
const;
715 static void assertArgTypeSuitableForSignature(QualType
T) {
717 "We should have no void types in the spec");
718 assert((
T.isNull() ||
T.isCanonical()) &&
719 "We should only have canonical types in the spec");
721 static void assertRetTypeSuitableForSignature(QualType
T) {
722 assert((
T.isNull() ||
T.isCanonical()) &&
723 "We should only have canonical types in the spec");
727 static QualType getArgType(
const FunctionDecl *FD, ArgNo ArgN) {
728 assert(FD &&
"Function must be set");
729 QualType
T = (ArgN == Ret)
735 using SummaryCases = std::vector<SummaryCase>;
754 const InvalidationKind InvalidationKd;
756 ConstraintSet ArgConstraints;
760 const FunctionDecl *FD =
nullptr;
763 Summary(InvalidationKind InvalidationKd) : InvalidationKd(InvalidationKd) {}
765 Summary &Case(ConstraintSet &&CS,
const ErrnoConstraintBase &ErrnoC,
766 StringRef
Note =
"") {
767 Cases.push_back(SummaryCase(std::move(CS), ErrnoC,
Note));
770 Summary &Case(
const ConstraintSet &CS,
const ErrnoConstraintBase &ErrnoC,
771 StringRef
Note =
"") {
772 Cases.push_back(SummaryCase(CS, ErrnoC,
Note));
775 Summary &ArgConstraint(ValueConstraintPtr VC) {
776 assert(VC->getArgNo() != Ret &&
777 "Arg constraint should not refer to the return value");
778 ArgConstraints.push_back(VC);
782 InvalidationKind getInvalidationKd()
const {
return InvalidationKd; }
783 const SummaryCases &getCases()
const {
return Cases; }
784 const ConstraintSet &getArgConstraints()
const {
return ArgConstraints; }
786 QualType getArgType(ArgNo ArgN)
const {
787 return StdLibraryFunctionsChecker::getArgType(FD, ArgN);
792 bool matchesAndSet(
const Signature &Sign,
const FunctionDecl *FD) {
793 bool Result = Sign.matches(FD) && validateByConstraints(FD);
795 assert(!this->FD &&
"FD must not be set more than once");
804 bool validateByConstraints(
const FunctionDecl *FD)
const {
805 for (
const SummaryCase &Case : Cases)
806 for (
const ValueConstraintPtr &Constraint : Case.getConstraints())
807 if (!Constraint->checkValidity(FD))
809 for (
const ValueConstraintPtr &Constraint : ArgConstraints)
810 if (!Constraint->checkValidity(FD))
818 using FunctionSummaryMapType = llvm::DenseMap<const FunctionDecl *, Summary>;
819 mutable FunctionSummaryMapType FunctionSummaryMap;
821 const BugType BT_InvalidArg{
this,
"Function call with invalid argument"};
822 mutable bool SummariesInitialized =
false;
824 static SVal getArgSVal(
const CallEvent &
Call, ArgNo ArgN) {
825 return ArgN == Ret ?
Call.getReturnValue() :
Call.getArgSVal(ArgN);
828 assert(
Call.getDecl() &&
829 "Call was found by a summary, should have declaration");
834 void checkPreCall(
const CallEvent &
Call, CheckerContext &
C)
const;
835 void checkPostCall(
const CallEvent &
Call, CheckerContext &
C)
const;
836 bool evalCall(
const CallEvent &
Call, CheckerContext &
C)
const;
838 CheckerNameRef CheckName;
839 bool AddTestFunctions =
false;
841 bool DisplayLoadedSummaries =
false;
842 bool ModelPOSIX =
false;
843 bool ShouldAssumeControlledEnvironment =
false;
846 std::optional<Summary> findFunctionSummary(
const FunctionDecl *FD,
847 CheckerContext &
C)
const;
848 std::optional<Summary> findFunctionSummary(
const CallEvent &
Call,
849 CheckerContext &
C)
const;
851 LLVM_ATTRIBUTE_MINSIZE
void initFunctionSummaries(CheckerContext &
C)
const;
853 void reportBug(
const CallEvent &
Call, ExplodedNode *N,
854 const ValueConstraint *VC,
const ValueConstraint *NegatedVC,
855 const Summary &Summary, CheckerContext &
C)
const {
856 assert(
Call.getDecl() &&
857 "Function found in summary must have a declaration available");
858 SmallString<256> Msg;
859 llvm::raw_svector_ostream MsgOs(Msg);
862 printArgDesc(VC->getArgNo(), MsgOs);
865 NegatedVC->describeArgumentValue(
Call, N->
getState(), Summary, MsgOs);
869 MsgOs <<
"is out of the accepted range; It ";
870 VC->describe(ValueConstraint::Violation,
Call,
C.getState(), Summary,
872 Msg[0] = toupper(Msg[0]);
873 auto R = std::make_unique<PathSensitiveBugReport>(BT_InvalidArg, Msg, N);
875 for (ArgNo ArgN : VC->getArgsToTrack()) {
877 R->markInteresting(
Call.getArgSVal(ArgN));
879 R->addRange(
Call.getArgSourceRange(ArgN));
882 C.emitReport(std::move(R));
890 const NoErrnoConstraint ErrnoUnchanged{};
891 const ResetErrnoConstraint ErrnoIrrelevant{};
892 const ErrnoMustBeCheckedConstraint ErrnoMustBeChecked{};
893 const SuccessErrnoConstraint ErrnoMustNotBeChecked{};
894 const FailureErrnoConstraint ErrnoNEZeroIrrelevant{};
897int StdLibraryFunctionsChecker::ErrnoConstraintBase::Tag = 0;
899const StdLibraryFunctionsChecker::ArgNo StdLibraryFunctionsChecker::Ret =
900 std::numeric_limits<ArgNo>::max();
910void StdLibraryFunctionsChecker::printArgDesc(
911 StdLibraryFunctionsChecker::ArgNo ArgN, llvm::raw_ostream &Out) {
912 Out << std::to_string(ArgN + 1);
913 Out << llvm::getOrdinalSuffix(ArgN + 1);
917void StdLibraryFunctionsChecker::printArgValueInfo(ArgNo ArgN,
919 const CallEvent &
Call,
920 llvm::raw_ostream &Out) {
921 if (
const llvm::APSInt *Val =
922 State->getStateManager().getSValBuilder().getKnownValue(
923 State, getArgSVal(
Call, ArgN)))
924 Out <<
" (which is " << *Val <<
")";
927void StdLibraryFunctionsChecker::appendInsideRangeDesc(llvm::APSInt RMin,
930 BasicValueFactory &BVF,
931 llvm::raw_ostream &Out) {
932 if (RMin.isZero() && RMax.isZero())
934 else if (RMin == RMax)
940 Out <<
"<= " << RMax;
945 Out <<
">= " << RMin;
946 }
else if (RMin.isNegative() == RMax.isNegative() &&
947 RMin.getLimitedValue() == RMax.getLimitedValue() - 1) {
948 Out << RMin <<
" or " << RMax;
950 Out <<
"between " << RMin <<
" and " << RMax;
954void StdLibraryFunctionsChecker::appendOutOfRangeDesc(llvm::APSInt RMin,
957 BasicValueFactory &BVF,
958 llvm::raw_ostream &Out) {
959 if (RMin.isZero() && RMax.isZero())
961 else if (RMin == RMax) {
962 Out <<
"not equal to " << RMin;
973 }
else if (RMin.isNegative() == RMax.isNegative() &&
974 RMin.getLimitedValue() == RMax.getLimitedValue() - 1) {
975 Out <<
"not " << RMin <<
" and not " << RMax;
977 Out <<
"not between " << RMin <<
" and " << RMax;
981void StdLibraryFunctionsChecker::RangeConstraint::applyOnWithinRange(
982 BasicValueFactory &BVF, QualType ArgT,
const RangeApplyFunction &F)
const {
986 for (
auto [Start, End] : getRanges()) {
987 const llvm::APSInt &
Min = BVF.getValue(Start, ArgT);
988 const llvm::APSInt &
Max = BVF.getValue(End, ArgT);
995void StdLibraryFunctionsChecker::RangeConstraint::applyOnOutOfRange(
996 BasicValueFactory &BVF, QualType ArgT,
const RangeApplyFunction &F)
const {
1000 const IntRangeVector &
R = getRanges();
1001 size_t E =
R.size();
1003 const llvm::APSInt &MinusInf = BVF.
getMinValue(ArgT);
1004 const llvm::APSInt &PlusInf = BVF.
getMaxValue(ArgT);
1006 const llvm::APSInt &RangeLeft = BVF.getValue(R[0].first - 1ULL, ArgT);
1007 const llvm::APSInt &RangeRight = BVF.getValue(R[E - 1].second + 1ULL, ArgT);
1010 for (
size_t I = 1; I != E; ++I) {
1011 const llvm::APSInt &
Min = BVF.getValue(R[I - 1].second + 1ULL, ArgT);
1012 const llvm::APSInt &
Max = BVF.getValue(R[I].first - 1ULL, ArgT);
1019 if (RangeLeft != PlusInf) {
1020 assert(MinusInf <= RangeLeft);
1021 if (!F(MinusInf, RangeLeft))
1025 if (RangeRight != MinusInf) {
1026 assert(RangeRight <= PlusInf);
1027 if (!F(RangeRight, PlusInf))
1034 CheckerContext &
C)
const {
1035 ConstraintManager &CM =
C.getConstraintManager();
1036 SVal
V = getArgSVal(
Call, getArgNo());
1037 QualType
T = Summary.getArgType(getArgNo());
1039 if (
auto N =
V.getAs<NonLoc>()) {
1040 auto ExcludeRangeFromArg = [&](
const llvm::APSInt &
Min,
1041 const llvm::APSInt &
Max) {
1043 return static_cast<bool>(State);
1047 applyOnRange(negateKind(Kind),
C.getSValBuilder().getBasicValueFactory(),
T,
1048 ExcludeRangeFromArg);
1054void StdLibraryFunctionsChecker::RangeConstraint::describe(
1056 const Summary &Summary, llvm::raw_ostream &Out)
const {
1058 BasicValueFactory &BVF = getBVF(State);
1059 QualType
T = Summary.getArgType(getArgNo());
1061 Out << ((DK == Violation) ?
"should be " :
"is ");
1062 if (!Description.empty()) {
1065 unsigned I = Ranges.size();
1066 if (Kind == WithinRange) {
1067 for (
const std::pair<RangeInt, RangeInt> &R : Ranges) {
1068 appendInsideRangeDesc(BVF.getValue(
R.first,
T),
1069 BVF.getValue(
R.second,
T),
T, BVF, Out);
1074 for (
const std::pair<RangeInt, RangeInt> &R : Ranges) {
1075 appendOutOfRangeDesc(BVF.getValue(
R.first,
T),
1076 BVF.getValue(
R.second,
T),
T, BVF, Out);
1084bool StdLibraryFunctionsChecker::RangeConstraint::describeArgumentValue(
1086 llvm::raw_ostream &Out)
const {
1087 unsigned int NRanges = 0;
1088 bool HaveAllRanges =
true;
1090 ProgramStateManager &Mgr = State->getStateManager();
1093 SVal
V = getArgSVal(
Call, getArgNo());
1095 if (
auto N =
V.getAs<NonLoc>()) {
1096 if (
const llvm::APSInt *Int = N->getAsInteger()) {
1101 QualType
T = Summary.getArgType(getArgNo());
1102 SmallString<128> MoreInfo;
1103 llvm::raw_svector_ostream MoreInfoOs(MoreInfo);
1104 auto ApplyF = [&](
const llvm::APSInt &
Min,
const llvm::APSInt &
Max) {
1107 MoreInfoOs <<
" or ";
1108 appendInsideRangeDesc(
Min,
Max,
T, BVF, MoreInfoOs);
1111 HaveAllRanges =
false;
1116 applyOnRange(Kind, BVF,
T, ApplyF);
1117 assert(NRanges > 0);
1118 if (!HaveAllRanges || NRanges == 1) {
1127ProgramStateRef StdLibraryFunctionsChecker::ComparisonConstraint::apply(
1129 CheckerContext &
C)
const {
1131 ProgramStateManager &Mgr = State->getStateManager();
1134 QualType
T = Summary.getArgType(getArgNo());
1135 SVal
V = getArgSVal(
Call, getArgNo());
1138 ArgNo OtherArg = getOtherArgNo();
1139 SVal OtherV = getArgSVal(
Call, OtherArg);
1140 QualType OtherT = Summary.getArgType(OtherArg);
1142 OtherV = SVB.
evalCast(OtherV,
T, OtherT);
1143 if (
auto CompV = SVB.
evalBinOp(State, Op,
V, OtherV, CondT)
1144 .
getAs<DefinedOrUnknownSVal>())
1145 State = State->assume(*CompV,
true);
1151 CheckerContext &
C)
const {
1152 SVal
V = getArgSVal(
Call, getArgNo());
1156 DefinedOrUnknownSVal L =
V.castAs<DefinedOrUnknownSVal>();
1160 return State->assume(L, CannotBeNull);
1163void StdLibraryFunctionsChecker::NullnessConstraint::describe(
1165 const Summary &Summary, llvm::raw_ostream &Out)
const {
1166 assert(CannotBeNull &&
1167 "'describe' is not implemented when the value must be NULL");
1168 if (DK == Violation)
1169 Out <<
"should not be NULL";
1171 Out <<
"is not NULL";
1174bool StdLibraryFunctionsChecker::NullnessConstraint::describeArgumentValue(
1176 llvm::raw_ostream &Out)
const {
1177 assert(!CannotBeNull &&
"'describeArgumentValue' is not implemented when the "
1178 "value must be non-NULL");
1183ProgramStateRef StdLibraryFunctionsChecker::BufferNullnessConstraint::apply(
1185 CheckerContext &
C)
const {
1186 SVal
V = getArgSVal(
Call, getArgNo());
1189 DefinedOrUnknownSVal L =
V.
castAs<DefinedOrUnknownSVal>();
1193 std::optional<DefinedOrUnknownSVal> SizeArg1 =
1194 getArgSVal(
Call, SizeArg1N).getAs<DefinedOrUnknownSVal>();
1195 std::optional<DefinedOrUnknownSVal> SizeArg2;
1197 SizeArg2 = getArgSVal(
Call, *SizeArg2N).getAs<DefinedOrUnknownSVal>();
1199 auto IsArgZero = [State](std::optional<DefinedOrUnknownSVal> Val) {
1206 if (IsArgZero(SizeArg1) || IsArgZero(SizeArg2))
1209 return State->assume(L, CannotBeNull);
1212void StdLibraryFunctionsChecker::BufferNullnessConstraint::describe(
1214 const Summary &Summary, llvm::raw_ostream &Out)
const {
1215 assert(CannotBeNull &&
1216 "'describe' is not implemented when the buffer must be NULL");
1217 if (DK == Violation)
1218 Out <<
"should not be NULL";
1220 Out <<
"is not NULL";
1223bool StdLibraryFunctionsChecker::BufferNullnessConstraint::
1225 const Summary &Summary,
1226 llvm::raw_ostream &Out)
const {
1227 assert(!CannotBeNull &&
"'describeArgumentValue' is not implemented when the "
1228 "buffer must be non-NULL");
1233ProgramStateRef StdLibraryFunctionsChecker::BufferSizeConstraint::apply(
1235 CheckerContext &
C)
const {
1236 SValBuilder &SvalBuilder =
C.getSValBuilder();
1238 SVal BufV = getArgSVal(
Call, getArgNo());
1241 const SVal SizeV = [
this, &State, &
Call, &Summary, &SvalBuilder]() {
1243 return SVal(SvalBuilder.
makeIntVal(*ConcreteSize));
1245 assert(SizeArgN &&
"The constraint must be either a concrete value or "
1246 "encoded in an argument.");
1248 SVal SizeV = getArgSVal(
Call, *SizeArgN);
1250 if (SizeMultiplierArgN) {
1251 SVal SizeMulV = getArgSVal(
Call, *SizeMultiplierArgN);
1252 SizeV = SvalBuilder.
evalBinOp(State, BO_Mul, SizeV, SizeMulV,
1253 Summary.getArgType(*SizeArgN));
1261 SVal Feasible = SvalBuilder.
evalBinOp(State, Op, SizeV, BufDynSize,
1263 if (
auto F = Feasible.
getAs<DefinedOrUnknownSVal>())
1264 return State->assume(*F,
true);
1272 llvm_unreachable(
"Size argument or the dynamic size is Undefined");
1275void StdLibraryFunctionsChecker::BufferSizeConstraint::describe(
1277 const Summary &Summary, llvm::raw_ostream &Out)
const {
1278 Out << ((DK == Violation) ?
"should be " :
"is ");
1279 Out <<
"a buffer with size equal to or greater than ";
1281 Out << *ConcreteSize;
1282 }
else if (SizeArgN) {
1283 Out <<
"the value of the ";
1284 printArgDesc(*SizeArgN, Out);
1285 printArgValueInfo(*SizeArgN, State,
Call, Out);
1286 if (SizeMultiplierArgN) {
1287 Out <<
" times the ";
1288 printArgDesc(*SizeMultiplierArgN, Out);
1289 printArgValueInfo(*SizeMultiplierArgN, State,
Call, Out);
1294bool StdLibraryFunctionsChecker::BufferSizeConstraint::describeArgumentValue(
1296 llvm::raw_ostream &Out)
const {
1297 SVal BufV = getArgSVal(
Call, getArgNo());
1299 if (
const llvm::APSInt *Val =
1300 State->getStateManager().getSValBuilder().getKnownValue(State,
1302 Out <<
"is a buffer with size " << *Val;
1308void StdLibraryFunctionsChecker::checkPreCall(
const CallEvent &
Call,
1309 CheckerContext &
C)
const {
1310 std::optional<Summary> FoundSummary = findFunctionSummary(
Call,
C);
1314 const Summary &Summary = *FoundSummary;
1318 ExplodedNode *NewNode =
C.getPredecessor();
1319 for (
const ValueConstraintPtr &Constraint : Summary.getArgConstraints()) {
1320 ValueConstraintPtr NegatedConstraint = Constraint->negate();
1323 NegatedConstraint->apply(NewState,
Call, Summary,
C);
1325 if (FailureSt && !SuccessSt) {
1326 if (ExplodedNode *N =
C.generateErrorNode(State, NewNode))
1327 reportBug(
Call, N, Constraint.get(), NegatedConstraint.get(), Summary,
1336 NewState = SuccessSt;
1337 if (NewState != State) {
1338 SmallString<128> Msg;
1339 llvm::raw_svector_ostream Os(Msg);
1340 Os <<
"Assuming that the ";
1341 printArgDesc(Constraint->getArgNo(), Os);
1345 Constraint->describe(ValueConstraint::Assumption,
Call, NewState, Summary,
1347 const auto ArgSVal =
Call.getArgSVal(Constraint->getArgNo());
1348 NewNode =
C.addTransition(
1350 C.getNoteTag([Msg = std::move(Msg), ArgSVal](
1351 PathSensitiveBugReport &BR, llvm::raw_ostream &
OS) {
1352 if (BR.isInteresting(ArgSVal))
1359void StdLibraryFunctionsChecker::checkPostCall(
const CallEvent &
Call,
1360 CheckerContext &
C)
const {
1361 std::optional<Summary> FoundSummary = findFunctionSummary(
Call,
C);
1366 const Summary &Summary = *FoundSummary;
1368 ExplodedNode *Node =
C.getPredecessor();
1371 for (
const SummaryCase &Case : Summary.getCases()) {
1373 for (
const ValueConstraintPtr &Constraint : Case.getConstraints()) {
1374 NewState = Constraint->apply(NewState,
Call, Summary,
C);
1380 NewState = Case.getErrnoConstraint().apply(NewState,
Call, Summary,
C);
1391 ExplodedNode *Pred = Node;
1392 DeclarationName FunctionName =
1395 std::string ErrnoNote = Case.getErrnoConstraint().describe(
C);
1396 std::string CaseNote;
1397 if (Case.getNote().empty()) {
1398 if (!ErrnoNote.empty())
1400 llvm::formatv(
"After calling '{0}' {1}", FunctionName, ErrnoNote);
1405 llvm::formatv(
false, Case.getNote().str().c_str(), FunctionName);
1407 const SVal RV =
Call.getReturnValue();
1409 if (Summary.getInvalidationKd() == EvalCallAsPure) {
1412 if (!CaseNote.empty()) {
1413 const NoteTag *
Tag =
C.getNoteTag(
1414 [Node, CaseNote, RV](PathSensitiveBugReport &BR) -> std::string {
1429 Pred =
C.addTransition(NewState, Pred, Tag);
1432 if (!CaseNote.empty() || !ErrnoNote.empty()) {
1433 const NoteTag *
Tag =
1434 C.getNoteTag([CaseNote, ErrnoNote,
1435 RV](PathSensitiveBugReport &BR) -> std::string {
1442 std::optional<Loc> ErrnoLoc =
1444 bool ErrnoImportant = !ErrnoNote.empty() && ErrnoLoc &&
1446 if (ErrnoImportant) {
1448 if (CaseNote.empty())
1450 return llvm::formatv(
"{0}; {1}", CaseNote, ErrnoNote);
1457 Pred =
C.addTransition(NewState, Pred, Tag);
1462 if (Pred == Node && NewState != State)
1463 C.addTransition(NewState);
1467bool StdLibraryFunctionsChecker::evalCall(
const CallEvent &
Call,
1468 CheckerContext &
C)
const {
1469 std::optional<Summary> FoundSummary = findFunctionSummary(
Call,
C);
1473 const Summary &Summary = *FoundSummary;
1474 switch (Summary.getInvalidationKd()) {
1475 case EvalCallAsPure: {
1478 SVal
V =
C.getSValBuilder().conjureSymbolVal(
Call,
C.blockCount());
1479 State = State->BindExpr(CE,
C.getStackFrame(),
V);
1481 C.addTransition(State);
1490 llvm_unreachable(
"Unknown invalidation kind!");
1493bool StdLibraryFunctionsChecker::Signature::matches(
1494 const FunctionDecl *FD)
const {
1507 auto RemoveRestrict = [&FD](QualType
T) {
1509 T.removeLocalRestrict();
1514 if (!isIrrelevant(RetTy)) {
1516 if (RetTy != FDRetTy)
1521 for (
auto [Idx, ArgTy] : llvm::enumerate(ArgTys)) {
1522 if (isIrrelevant(ArgTy))
1526 if (ArgTy != FDArgTy)
1533std::optional<StdLibraryFunctionsChecker::Summary>
1534StdLibraryFunctionsChecker::findFunctionSummary(
const FunctionDecl *FD,
1535 CheckerContext &
C)
const {
1537 return std::nullopt;
1539 initFunctionSummaries(
C);
1542 if (FSMI == FunctionSummaryMap.end())
1543 return std::nullopt;
1544 return FSMI->second;
1547std::optional<StdLibraryFunctionsChecker::Summary>
1548StdLibraryFunctionsChecker::findFunctionSummary(
const CallEvent &
Call,
1549 CheckerContext &
C)
const {
1550 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(
Call.getDecl());
1552 return std::nullopt;
1553 return findFunctionSummary(FD,
C);
1556void StdLibraryFunctionsChecker::initFunctionSummaries(
1557 CheckerContext &
C)
const {
1558 if (SummariesInitialized)
1560 SummariesInitialized =
true;
1562 SValBuilder &SVB =
C.getSValBuilder();
1565 Preprocessor &PP =
C.getPreprocessor();
1569 const ASTContext &ACtx;
1572 LookupType(
const ASTContext &ACtx) : ACtx(ACtx) {}
1575 std::optional<QualType> operator()(StringRef Name) {
1576 IdentifierInfo &II = ACtx.
Idents.
get(Name);
1578 if (LookupRes.empty())
1579 return std::nullopt;
1586 for (Decl *D : LookupRes)
1587 if (
auto *TD = dyn_cast<TypedefNameDecl>(D))
1594 for (Decl *D : LookupRes)
1595 if (
auto *TD = dyn_cast<TypeDecl>(D))
1597 return std::nullopt;
1603 class GetRestrictTy {
1604 const ASTContext &ACtx;
1607 GetRestrictTy(
const ASTContext &ACtx) : ACtx(ACtx) {}
1608 QualType operator()(QualType Ty) {
1611 std::optional<QualType> operator()(std::optional<QualType> Ty) {
1613 return operator()(*Ty);
1614 return std::nullopt;
1616 } getRestrictTy(ACtx);
1617 class GetPointerTy {
1618 const ASTContext &ACtx;
1621 GetPointerTy(
const ASTContext &ACtx) : ACtx(ACtx) {}
1622 QualType operator()(QualType Ty) {
return ACtx.
getPointerType(Ty); }
1623 std::optional<QualType> operator()(std::optional<QualType> Ty) {
1625 return operator()(*Ty);
1626 return std::nullopt;
1628 } getPointerTy(ACtx);
1631 std::optional<QualType> operator()(std::optional<QualType> Ty) {
1632 return Ty ? std::optional<QualType>(Ty->withConst()) : std::nullopt;
1634 QualType operator()(QualType Ty) {
return Ty.
withConst(); }
1637 BasicValueFactory &BVF;
1640 GetMaxValue(BasicValueFactory &BVF) : BVF(BVF) {}
1641 std::optional<RangeInt> operator()(QualType Ty) {
1644 std::optional<RangeInt> operator()(std::optional<QualType> Ty) {
1646 return operator()(*Ty);
1648 return std::nullopt;
1659 const QualType VoidTy = ACtx.
VoidTy;
1660 const QualType CharTy = ACtx.
CharTy;
1661 const QualType WCharTy = ACtx.
WCharTy;
1662 const QualType IntTy = ACtx.
IntTy;
1664 const QualType LongTy = ACtx.
LongTy;
1667 const QualType VoidPtrTy = getPointerTy(VoidTy);
1668 const QualType IntPtrTy = getPointerTy(IntTy);
1669 const QualType UnsignedIntPtrTy =
1670 getPointerTy(UnsignedIntTy);
1671 const QualType VoidPtrRestrictTy = getRestrictTy(VoidPtrTy);
1672 const QualType ConstVoidPtrTy =
1673 getPointerTy(getConstTy(VoidTy));
1674 const QualType CharPtrTy = getPointerTy(CharTy);
1675 const QualType CharPtrRestrictTy = getRestrictTy(CharPtrTy);
1676 const QualType ConstCharPtrTy =
1677 getPointerTy(getConstTy(CharTy));
1678 const QualType ConstCharPtrRestrictTy = getRestrictTy(ConstCharPtrTy);
1679 const QualType Wchar_tPtrTy = getPointerTy(WCharTy);
1680 const QualType ConstWchar_tPtrTy =
1681 getPointerTy(getConstTy(WCharTy));
1682 const QualType ConstVoidPtrRestrictTy = getRestrictTy(ConstVoidPtrTy);
1683 const QualType SizePtrTy = getPointerTy(SizeTyCanonTy);
1684 const QualType SizePtrRestrictTy = getRestrictTy(SizePtrTy);
1686 const RangeInt IntMax = BVF.
getMaxValue(IntTy)->getLimitedValue();
1687 const RangeInt UnsignedIntMax =
1688 BVF.
getMaxValue(UnsignedIntTy)->getLimitedValue();
1689 const RangeInt LongMax = BVF.
getMaxValue(LongTy)->getLimitedValue();
1690 const RangeInt SizeMax = BVF.
getMaxValue(SizeTyCanonTy)->getLimitedValue();
1698 const RangeInt UCharRangeMax =
1708 struct AddToFunctionSummaryMap {
1709 const ASTContext &ACtx;
1710 FunctionSummaryMapType ⤅
1711 bool DisplayLoadedSummaries;
1712 AddToFunctionSummaryMap(
const ASTContext &ACtx, FunctionSummaryMapType &FSM,
1713 bool DisplayLoadedSummaries)
1714 : ACtx(ACtx), Map(FSM), DisplayLoadedSummaries(DisplayLoadedSummaries) {
1722 bool operator()(StringRef Name, Signature Sign, Summary Sum) {
1723 if (Sign.isInvalid())
1725 IdentifierInfo &II = ACtx.
Idents.
get(Name);
1727 if (LookupRes.empty())
1729 for (Decl *D : LookupRes) {
1730 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
1731 if (Sum.matchesAndSet(Sign, FD)) {
1733 assert(Res.second &&
"Function already has a summary set!");
1735 if (DisplayLoadedSummaries) {
1736 llvm::errs() <<
"Loaded summary for: ";
1737 FD->
print(llvm::errs());
1738 llvm::errs() <<
"\n";
1748 void operator()(ArrayRef<StringRef> Names, Signature Sign, Summary Sum) {
1749 for (StringRef Name : Names)
1750 operator()(Name, Sign, Sum);
1752 } addToFunctionSummaryMap(ACtx, FunctionSummaryMap, DisplayLoadedSummaries);
1755 auto ArgumentCondition = [](ArgNo ArgN, RangeKind
Kind, IntRangeVector Ranges,
1756 StringRef Desc =
"") {
1757 return std::make_shared<RangeConstraint>(ArgN, Kind, Ranges, Desc);
1759 auto BufferSize = [](
auto... Args) {
1760 return std::make_shared<BufferSizeConstraint>(Args...);
1763 auto operator()(RangeKind Kind, IntRangeVector Ranges) {
1764 return std::make_shared<RangeConstraint>(Ret, Kind, Ranges);
1767 return std::make_shared<ComparisonConstraint>(Ret, Op, OtherArgN);
1769 } ReturnValueCondition;
1771 auto operator()(RangeInt b, RangeInt e) {
1772 return IntRangeVector{std::pair<RangeInt, RangeInt>{b, e}};
1774 auto operator()(RangeInt b, std::optional<RangeInt> e) {
1776 return IntRangeVector{std::pair<RangeInt, RangeInt>{b, *e}};
1777 return IntRangeVector{};
1779 auto operator()(std::pair<RangeInt, RangeInt> i0,
1780 std::pair<RangeInt, std::optional<RangeInt>> i1) {
1782 return IntRangeVector{i0, {i1.first, *(i1.second)}};
1783 return IntRangeVector{i0};
1786 auto SingleValue = [](RangeInt v) {
1787 return IntRangeVector{std::pair<RangeInt, RangeInt>{v, v}};
1789 auto LessThanOrEq = BO_LE;
1790 auto NotNull = [&](ArgNo ArgN) {
1791 return std::make_shared<NullnessConstraint>(ArgN);
1793 auto IsNull = [&](ArgNo ArgN) {
1794 return std::make_shared<NullnessConstraint>(ArgN,
false);
1796 auto NotNullBuffer = [&](ArgNo ArgN, ArgNo SizeArg1N,
1797 std::optional<ArgNo> SizeArg2N = std::nullopt) {
1798 return std::make_shared<BufferNullnessConstraint>(ArgN, SizeArg1N,
1802 std::optional<QualType> FileTy = lookupTy(
"FILE");
1803 std::optional<QualType> FilePtrTy = getPointerTy(FileTy);
1804 std::optional<QualType> FilePtrRestrictTy = getRestrictTy(FilePtrTy);
1806 std::optional<QualType> FPosTTy = lookupTy(
"fpos_t");
1807 std::optional<QualType> FPosTPtrTy = getPointerTy(FPosTTy);
1808 std::optional<QualType> ConstFPosTPtrTy = getPointerTy(getConstTy(FPosTTy));
1809 std::optional<QualType> FPosTPtrRestrictTy = getRestrictTy(FPosTPtrTy);
1811 constexpr llvm::StringLiteral GenericSuccessMsg(
1812 "Assuming that '{0}' is successful");
1813 constexpr llvm::StringLiteral GenericFailureMsg(
"Assuming that '{0}' fails");
1830 addToFunctionSummaryMap(
1831 "isalnum", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1832 Summary(EvalCallAsPure)
1834 .Case({ArgumentCondition(0U, WithinRange,
1835 {{
'0',
'9'}, {
'A',
'Z'}, {
'a',
'z'}}),
1836 ReturnValueCondition(OutOfRange, SingleValue(0))},
1837 ErrnoIrrelevant,
"Assuming the character is alphanumeric")
1841 .Case({ArgumentCondition(0U, WithinRange, {{128, UCharRangeMax}})},
1846 {{
'0',
'9'}, {
'A',
'Z'}, {
'a',
'z'}, {128, UCharRangeMax}}),
1847 ReturnValueCondition(WithinRange, SingleValue(0))},
1848 ErrnoIrrelevant,
"Assuming the character is non-alphanumeric")
1849 .ArgConstraint(ArgumentCondition(0U, WithinRange,
1850 {{EOFv, EOFv}, {0, UCharRangeMax}},
1851 "an unsigned char value or EOF")));
1852 addToFunctionSummaryMap(
1853 "isalpha", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1854 Summary(EvalCallAsPure)
1855 .Case({ArgumentCondition(0U, WithinRange, {{
'A',
'Z'}, {
'a',
'z'}}),
1856 ReturnValueCondition(OutOfRange, SingleValue(0))},
1857 ErrnoIrrelevant,
"Assuming the character is alphabetical")
1859 .Case({ArgumentCondition(0U, WithinRange, {{128, UCharRangeMax}})},
1861 .Case({ArgumentCondition(
1863 {{
'A',
'Z'}, {
'a',
'z'}, {128, UCharRangeMax}}),
1864 ReturnValueCondition(WithinRange, SingleValue(0))},
1865 ErrnoIrrelevant,
"Assuming the character is non-alphabetical"));
1866 addToFunctionSummaryMap(
1867 "isascii", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1868 Summary(EvalCallAsPure)
1869 .Case({ArgumentCondition(0U, WithinRange,
Range(0, 127)),
1870 ReturnValueCondition(OutOfRange, SingleValue(0))},
1871 ErrnoIrrelevant,
"Assuming the character is an ASCII character")
1872 .Case({ArgumentCondition(0U, OutOfRange,
Range(0, 127)),
1873 ReturnValueCondition(WithinRange, SingleValue(0))},
1875 "Assuming the character is not an ASCII character"));
1876 addToFunctionSummaryMap(
1877 "isblank", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1878 Summary(EvalCallAsPure)
1879 .Case({ArgumentCondition(0U, WithinRange, {{
'\t',
'\t'}, {
' ',
' '}}),
1880 ReturnValueCondition(OutOfRange, SingleValue(0))},
1881 ErrnoIrrelevant,
"Assuming the character is a blank character")
1882 .Case({ArgumentCondition(0U, OutOfRange, {{
'\t',
'\t'}, {
' ',
' '}}),
1883 ReturnValueCondition(WithinRange, SingleValue(0))},
1885 "Assuming the character is not a blank character"));
1886 addToFunctionSummaryMap(
1887 "iscntrl", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1888 Summary(EvalCallAsPure)
1889 .Case({ArgumentCondition(0U, WithinRange, {{0, 32}, {127, 127}}),
1890 ReturnValueCondition(OutOfRange, SingleValue(0))},
1892 "Assuming the character is a control character")
1893 .Case({ArgumentCondition(0U, OutOfRange, {{0, 32}, {127, 127}}),
1894 ReturnValueCondition(WithinRange, SingleValue(0))},
1896 "Assuming the character is not a control character"));
1897 addToFunctionSummaryMap(
1898 "isdigit", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1899 Summary(EvalCallAsPure)
1900 .Case({ArgumentCondition(0U, WithinRange,
Range(
'0',
'9')),
1901 ReturnValueCondition(OutOfRange, SingleValue(0))},
1902 ErrnoIrrelevant,
"Assuming the character is a digit")
1903 .Case({ArgumentCondition(0U, OutOfRange,
Range(
'0',
'9')),
1904 ReturnValueCondition(WithinRange, SingleValue(0))},
1905 ErrnoIrrelevant,
"Assuming the character is not a digit"));
1906 addToFunctionSummaryMap(
1907 "isgraph", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1908 Summary(EvalCallAsPure)
1909 .Case({ArgumentCondition(0U, WithinRange,
Range(33, 126)),
1910 ReturnValueCondition(OutOfRange, SingleValue(0))},
1912 "Assuming the character has graphical representation")
1914 {ArgumentCondition(0U, OutOfRange,
Range(33, 126)),
1915 ReturnValueCondition(WithinRange, SingleValue(0))},
1917 "Assuming the character does not have graphical representation"));
1918 addToFunctionSummaryMap(
1919 "islower", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1920 Summary(EvalCallAsPure)
1922 .Case({ArgumentCondition(0U, WithinRange,
Range(
'a',
'z')),
1923 ReturnValueCondition(OutOfRange, SingleValue(0))},
1924 ErrnoIrrelevant,
"Assuming the character is a lowercase letter")
1926 .Case({ArgumentCondition(0U, WithinRange,
Range(0, 127)),
1927 ArgumentCondition(0U, OutOfRange,
Range(
'a',
'z')),
1928 ReturnValueCondition(WithinRange, SingleValue(0))},
1930 "Assuming the character is not a lowercase letter")
1932 .Case({ArgumentCondition(0U, WithinRange, {{128, UCharRangeMax}})},
1935 .Case({ArgumentCondition(0U, OutOfRange,
Range(0, UCharRangeMax)),
1936 ReturnValueCondition(WithinRange, SingleValue(0))},
1938 addToFunctionSummaryMap(
1939 "isprint", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1940 Summary(EvalCallAsPure)
1941 .Case({ArgumentCondition(0U, WithinRange,
Range(32, 126)),
1942 ReturnValueCondition(OutOfRange, SingleValue(0))},
1943 ErrnoIrrelevant,
"Assuming the character is printable")
1944 .Case({ArgumentCondition(0U, OutOfRange,
Range(32, 126)),
1945 ReturnValueCondition(WithinRange, SingleValue(0))},
1946 ErrnoIrrelevant,
"Assuming the character is non-printable"));
1947 addToFunctionSummaryMap(
1948 "ispunct", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1949 Summary(EvalCallAsPure)
1950 .Case({ArgumentCondition(
1952 {{
'!',
'/'}, {
':',
'@'}, {
'[',
'`'}, {
'{',
'~'}}),
1953 ReturnValueCondition(OutOfRange, SingleValue(0))},
1954 ErrnoIrrelevant,
"Assuming the character is a punctuation mark")
1955 .Case({ArgumentCondition(
1957 {{
'!',
'/'}, {
':',
'@'}, {
'[',
'`'}, {
'{',
'~'}}),
1958 ReturnValueCondition(WithinRange, SingleValue(0))},
1960 "Assuming the character is not a punctuation mark"));
1961 addToFunctionSummaryMap(
1962 "isspace", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1963 Summary(EvalCallAsPure)
1965 .Case({ArgumentCondition(0U, WithinRange, {{9, 13}, {
' ',
' '}}),
1966 ReturnValueCondition(OutOfRange, SingleValue(0))},
1968 "Assuming the character is a whitespace character")
1970 .Case({ArgumentCondition(0U, WithinRange, {{128, UCharRangeMax}})},
1972 .Case({ArgumentCondition(0U, OutOfRange,
1973 {{9, 13}, {
' ',
' '}, {128, UCharRangeMax}}),
1974 ReturnValueCondition(WithinRange, SingleValue(0))},
1976 "Assuming the character is not a whitespace character"));
1977 addToFunctionSummaryMap(
1978 "isupper", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1979 Summary(EvalCallAsPure)
1981 .Case({ArgumentCondition(0U, WithinRange,
Range(
'A',
'Z')),
1982 ReturnValueCondition(OutOfRange, SingleValue(0))},
1984 "Assuming the character is an uppercase letter")
1986 .Case({ArgumentCondition(0U, WithinRange, {{128, UCharRangeMax}})},
1989 .Case({ArgumentCondition(0U, OutOfRange,
1990 {{
'A',
'Z'}, {128, UCharRangeMax}}),
1991 ReturnValueCondition(WithinRange, SingleValue(0))},
1993 "Assuming the character is not an uppercase letter"));
1994 addToFunctionSummaryMap(
1995 "isxdigit", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1996 Summary(EvalCallAsPure)
1997 .Case({ArgumentCondition(0U, WithinRange,
1998 {{
'0',
'9'}, {
'A',
'F'}, {
'a',
'f'}}),
1999 ReturnValueCondition(OutOfRange, SingleValue(0))},
2001 "Assuming the character is a hexadecimal digit")
2002 .Case({ArgumentCondition(0U, OutOfRange,
2003 {{
'0',
'9'}, {
'A',
'F'}, {
'a',
'f'}}),
2004 ReturnValueCondition(WithinRange, SingleValue(0))},
2006 "Assuming the character is not a hexadecimal digit"));
2007 addToFunctionSummaryMap(
2008 "toupper", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2009 Summary(EvalCallAsPure)
2010 .ArgConstraint(ArgumentCondition(0U, WithinRange,
2011 {{EOFv, EOFv}, {0, UCharRangeMax}},
2012 "an unsigned char value or EOF")));
2013 addToFunctionSummaryMap(
2014 "tolower", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2015 Summary(EvalCallAsPure)
2016 .ArgConstraint(ArgumentCondition(0U, WithinRange,
2017 {{EOFv, EOFv}, {0, UCharRangeMax}},
2018 "an unsigned char value or EOF")));
2019 addToFunctionSummaryMap(
2020 "toascii", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2021 Summary(EvalCallAsPure)
2022 .ArgConstraint(ArgumentCondition(0U, WithinRange,
2023 {{EOFv, EOFv}, {0, UCharRangeMax}},
2024 "an unsigned char value or EOF")));
2026 addToFunctionSummaryMap(
2027 "getchar", Signature(ArgTypes{}, RetType{IntTy}),
2029 .Case({ReturnValueCondition(WithinRange,
2030 {{EOFv, EOFv}, {0, UCharRangeMax}})},
2036 .Case({ArgumentCondition(1U, WithinRange,
Range(1, SizeMax)),
2037 ArgumentCondition(2U, WithinRange,
Range(1, SizeMax)),
2038 ReturnValueCondition(BO_LT, ArgNo(2)),
2039 ReturnValueCondition(WithinRange,
Range(0, SizeMax))},
2040 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2041 .Case({ArgumentCondition(1U, WithinRange,
Range(1, SizeMax)),
2042 ReturnValueCondition(BO_EQ, ArgNo(2)),
2043 ReturnValueCondition(WithinRange,
Range(0, SizeMax))},
2044 ErrnoMustNotBeChecked, GenericSuccessMsg)
2045 .Case({ArgumentCondition(1U, WithinRange, SingleValue(0)),
2046 ReturnValueCondition(WithinRange, SingleValue(0))},
2047 ErrnoMustNotBeChecked,
2048 "Assuming that argument 'size' to '{0}' is 0")
2049 .ArgConstraint(NotNullBuffer(ArgNo(0), ArgNo(1), ArgNo(2)))
2050 .ArgConstraint(NotNull(ArgNo(3)))
2051 .ArgConstraint(BufferSize(ArgNo(0), ArgNo(1),
2056 addToFunctionSummaryMap(
"fread",
2057 Signature(ArgTypes{VoidPtrRestrictTy, SizeTyCanonTy,
2058 SizeTyCanonTy, FilePtrRestrictTy},
2059 RetType{SizeTyCanonTy}),
2063 addToFunctionSummaryMap(
2065 Signature(ArgTypes{ConstVoidPtrRestrictTy, SizeTyCanonTy, SizeTyCanonTy,
2067 RetType{SizeTyCanonTy}),
2070 std::optional<QualType> Ssize_tTy = lookupTy(
"ssize_t");
2071 std::optional<RangeInt> Ssize_tMax = getMaxValue(Ssize_tTy);
2075 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
2076 ReturnValueCondition(WithinRange,
Range(-1, Ssize_tMax))},
2082 addToFunctionSummaryMap(
2084 Signature(ArgTypes{IntTy, VoidPtrTy, SizeTyCanonTy}, RetType{Ssize_tTy}),
2087 addToFunctionSummaryMap(
2089 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTyCanonTy},
2090 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 ReturnsZero =
2150 ConstraintSet{ReturnValueCondition(WithinRange, SingleValue(0))};
2151 const auto ReturnsMinusOne =
2152 ConstraintSet{ReturnValueCondition(WithinRange, SingleValue(-1))};
2153 const auto ReturnsEOF =
2154 ConstraintSet{ReturnValueCondition(WithinRange, SingleValue(EOFv))};
2155 const auto ReturnsNonnegative =
2156 ConstraintSet{ReturnValueCondition(WithinRange,
Range(0, IntMax))};
2157 const auto ReturnsNonZero =
2158 ConstraintSet{ReturnValueCondition(OutOfRange, SingleValue(0))};
2159 const auto &ReturnsValidFileDescriptor = ReturnsNonnegative;
2161 auto ValidFileDescriptorOrAtFdcwd = [&](ArgNo ArgN) {
2162 return std::make_shared<RangeConstraint>(
2163 ArgN, WithinRange,
Range({AT_FDCWDv, AT_FDCWDv}, {0, IntMax}),
2164 "a valid file descriptor or AT_FDCWD");
2168 addToFunctionSummaryMap(
2170 Signature(ArgTypes{ConstCharPtrRestrictTy, ConstCharPtrRestrictTy},
2171 RetType{FilePtrTy}),
2173 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2174 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2175 .ArgConstraint(NotNull(ArgNo(0)))
2176 .ArgConstraint(NotNull(ArgNo(1))));
2179 addToFunctionSummaryMap(
2181 Signature(ArgTypes{IntTy, ConstCharPtrTy}, RetType{FilePtrTy}),
2183 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2184 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2185 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
2186 .ArgConstraint(NotNull(ArgNo(1))));
2189 addToFunctionSummaryMap(
2190 "tmpfile", Signature(ArgTypes{}, RetType{FilePtrTy}),
2192 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2193 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg));
2197 addToFunctionSummaryMap(
2199 Signature(ArgTypes{ConstCharPtrRestrictTy, ConstCharPtrRestrictTy,
2201 RetType{FilePtrTy}),
2203 .Case({ReturnValueCondition(BO_EQ, ArgNo(2))},
2204 ErrnoMustNotBeChecked, GenericSuccessMsg)
2205 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2206 .ArgConstraint(NotNull(ArgNo(1)))
2207 .ArgConstraint(NotNull(ArgNo(2))));
2210 addToFunctionSummaryMap(
2212 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy}, RetType{FilePtrTy}),
2214 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2215 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2216 .ArgConstraint(NotNull(ArgNo(0)))
2217 .ArgConstraint(NotNull(ArgNo(1))));
2220 addToFunctionSummaryMap(
2221 "fclose", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2223 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2224 .Case(ReturnsEOF, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2225 .ArgConstraint(NotNull(ArgNo(0))));
2228 addToFunctionSummaryMap(
2229 "pclose", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2231 .Case({ReturnValueCondition(WithinRange, {{0, IntMax}})},
2232 ErrnoMustNotBeChecked, GenericSuccessMsg)
2233 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2234 .ArgConstraint(NotNull(ArgNo(0))));
2236 std::optional<QualType> Off_tTy = lookupTy(
"off_t");
2237 std::optional<RangeInt> Off_tMax = getMaxValue(Off_tTy);
2241 addToFunctionSummaryMap(
2242 {
"getc",
"fgetc"}, Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2244 .Case({ReturnValueCondition(WithinRange, {{0, UCharRangeMax}})},
2245 ErrnoMustNotBeChecked, GenericSuccessMsg)
2246 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv))},
2247 ErrnoIrrelevant, GenericFailureMsg)
2248 .ArgConstraint(NotNull(ArgNo(0))));
2252 addToFunctionSummaryMap(
2254 Signature(ArgTypes{IntTy, FilePtrTy}, RetType{IntTy}),
2256 .Case({ArgumentCondition(0, WithinRange,
Range(0, UCharRangeMax)),
2257 ReturnValueCondition(BO_EQ, ArgNo(0))},
2258 ErrnoMustNotBeChecked, GenericSuccessMsg)
2259 .Case({ArgumentCondition(0, OutOfRange,
Range(0, UCharRangeMax)),
2260 ReturnValueCondition(WithinRange,
Range(0, UCharRangeMax))},
2261 ErrnoMustNotBeChecked, GenericSuccessMsg)
2262 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv))},
2263 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2264 .ArgConstraint(NotNull(ArgNo(1))));
2267 addToFunctionSummaryMap(
2269 Signature(ArgTypes{CharPtrRestrictTy, IntTy, FilePtrRestrictTy},
2270 RetType{CharPtrTy}),
2272 .Case({NotNull(Ret), ReturnValueCondition(BO_EQ, ArgNo(0))},
2273 ErrnoMustNotBeChecked, GenericSuccessMsg)
2274 .Case({
IsNull(Ret)}, ErrnoIrrelevant, GenericFailureMsg)
2275 .ArgConstraint(NotNull(ArgNo(0)))
2276 .ArgConstraint(ArgumentCondition(1, WithinRange,
Range(0, IntMax)))
2278 BufferSize(ArgNo(0), ArgNo(1)))
2279 .ArgConstraint(NotNull(ArgNo(2))));
2282 addToFunctionSummaryMap(
2284 Signature(ArgTypes{ConstCharPtrRestrictTy, FilePtrRestrictTy},
2287 .Case(ReturnsNonnegative, ErrnoMustNotBeChecked, GenericSuccessMsg)
2288 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv))},
2289 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2290 .ArgConstraint(NotNull(ArgNo(0)))
2291 .ArgConstraint(NotNull(ArgNo(1))));
2294 addToFunctionSummaryMap(
2295 "ungetc", Signature(ArgTypes{IntTy, FilePtrTy}, RetType{IntTy}),
2297 .Case({ReturnValueCondition(BO_EQ, ArgNo(0)),
2298 ArgumentCondition(0, WithinRange, {{0, UCharRangeMax}})},
2299 ErrnoMustNotBeChecked, GenericSuccessMsg)
2300 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv)),
2301 ArgumentCondition(0, WithinRange, SingleValue(EOFv))},
2302 ErrnoNEZeroIrrelevant,
2303 "Assuming that 'ungetc' fails because EOF was passed as "
2305 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv)),
2306 ArgumentCondition(0, WithinRange, {{0, UCharRangeMax}})},
2307 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2308 .ArgConstraint(ArgumentCondition(
2309 0, WithinRange, {{EOFv, EOFv}, {0, UCharRangeMax}}))
2310 .ArgConstraint(NotNull(ArgNo(1))));
2316 addToFunctionSummaryMap(
2317 "fseek", Signature(ArgTypes{FilePtrTy, LongTy, IntTy}, RetType{IntTy}),
2319 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2320 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2321 .ArgConstraint(NotNull(ArgNo(0)))
2322 .ArgConstraint(ArgumentCondition(2, WithinRange, {{0, 2}})));
2325 addToFunctionSummaryMap(
2327 Signature(ArgTypes{FilePtrTy, Off_tTy, IntTy}, RetType{IntTy}),
2329 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2330 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2331 .ArgConstraint(NotNull(ArgNo(0)))
2332 .ArgConstraint(ArgumentCondition(2, WithinRange, {{0, 2}})));
2338 addToFunctionSummaryMap(
2340 Signature(ArgTypes{FilePtrRestrictTy, FPosTPtrRestrictTy},
2343 .Case(ReturnsZero, ErrnoUnchanged, GenericSuccessMsg)
2344 .Case(ReturnsNonZero, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2345 .ArgConstraint(NotNull(ArgNo(0)))
2346 .ArgConstraint(NotNull(ArgNo(1))));
2352 addToFunctionSummaryMap(
2354 Signature(ArgTypes{FilePtrTy, ConstFPosTPtrTy}, RetType{IntTy}),
2356 .Case(ReturnsZero, ErrnoUnchanged, GenericSuccessMsg)
2357 .Case(ReturnsNonZero, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2358 .ArgConstraint(NotNull(ArgNo(0)))
2359 .ArgConstraint(NotNull(ArgNo(1))));
2362 addToFunctionSummaryMap(
2363 "fflush", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2365 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2366 .Case(ReturnsEOF, ErrnoNEZeroIrrelevant, GenericFailureMsg));
2372 addToFunctionSummaryMap(
2373 "ftell", Signature(ArgTypes{FilePtrTy}, RetType{LongTy}),
2375 .Case({ReturnValueCondition(WithinRange,
Range(0, LongMax))},
2376 ErrnoUnchanged, GenericSuccessMsg)
2377 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2378 .ArgConstraint(NotNull(ArgNo(0))));
2381 addToFunctionSummaryMap(
2382 "ftello", Signature(ArgTypes{FilePtrTy}, RetType{Off_tTy}),
2384 .Case({ReturnValueCondition(WithinRange,
Range(0, Off_tMax))},
2385 ErrnoMustNotBeChecked, GenericSuccessMsg)
2386 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2387 .ArgConstraint(NotNull(ArgNo(0))));
2395 addToFunctionSummaryMap(
2396 "fileno", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2398 .Case(ReturnsValidFileDescriptor, ErrnoUnchanged, GenericSuccessMsg)
2399 .ArgConstraint(NotNull(ArgNo(0))));
2403 addToFunctionSummaryMap(
"rewind",
2404 Signature(ArgTypes{FilePtrTy}, RetType{VoidTy}),
2406 .Case({}, ErrnoMustBeChecked)
2407 .ArgConstraint(NotNull(ArgNo(0))));
2410 addToFunctionSummaryMap(
2411 "clearerr", Signature(ArgTypes{FilePtrTy}, RetType{VoidTy}),
2412 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2415 addToFunctionSummaryMap(
2416 "feof", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2417 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2420 addToFunctionSummaryMap(
2421 "ferror", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2422 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2425 addToFunctionSummaryMap(
2426 "a64l", Signature(ArgTypes{ConstCharPtrTy}, RetType{LongTy}),
2427 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2430 addToFunctionSummaryMap(
"l64a",
2431 Signature(ArgTypes{LongTy}, RetType{CharPtrTy}),
2433 .ArgConstraint(ArgumentCondition(
2434 0, WithinRange,
Range(0, LongMax))));
2437 addToFunctionSummaryMap(
2438 "open", Signature(ArgTypes{ConstCharPtrTy, IntTy}, RetType{IntTy}),
2440 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2442 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2443 .ArgConstraint(NotNull(ArgNo(0))));
2446 addToFunctionSummaryMap(
2448 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy}, RetType{IntTy}),
2450 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2452 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2453 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2454 .ArgConstraint(NotNull(ArgNo(1))));
2457 addToFunctionSummaryMap(
2458 "access", Signature(ArgTypes{ConstCharPtrTy, IntTy}, RetType{IntTy}),
2460 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2461 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2462 .ArgConstraint(NotNull(ArgNo(0))));
2465 addToFunctionSummaryMap(
2467 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy, IntTy},
2470 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2471 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2472 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2473 .ArgConstraint(NotNull(ArgNo(1))));
2476 addToFunctionSummaryMap(
2477 "dup", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2479 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2481 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2483 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2486 addToFunctionSummaryMap(
2487 "dup2", Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
2489 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2491 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2492 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
2494 ArgumentCondition(1, WithinRange,
Range(0, IntMax))));
2497 addToFunctionSummaryMap(
2498 "fdatasync", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2500 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2501 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2503 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2506 addToFunctionSummaryMap(
2508 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy, IntTy},
2511 .ArgConstraint(NotNull(ArgNo(0)))
2512 .ArgConstraint(NotNull(ArgNo(1))));
2515 addToFunctionSummaryMap(
2516 "fsync", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2518 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2519 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2521 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2524 addToFunctionSummaryMap(
2526 Signature(ArgTypes{ConstCharPtrTy, Off_tTy}, RetType{IntTy}),
2528 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2529 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2530 .ArgConstraint(NotNull(ArgNo(0))));
2533 addToFunctionSummaryMap(
2535 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy}, RetType{IntTy}),
2537 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2538 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2539 .ArgConstraint(NotNull(ArgNo(0)))
2540 .ArgConstraint(NotNull(ArgNo(1))));
2543 addToFunctionSummaryMap(
2545 Signature(ArgTypes{ConstCharPtrTy, IntTy, ConstCharPtrTy},
2548 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2549 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2550 .ArgConstraint(NotNull(ArgNo(0)))
2551 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(1)))
2552 .ArgConstraint(NotNull(ArgNo(2))));
2555 addToFunctionSummaryMap(
2556 "lockf", Signature(ArgTypes{IntTy, IntTy, Off_tTy}, RetType{IntTy}),
2558 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2559 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2561 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2563 std::optional<QualType> Mode_tTy = lookupTy(
"mode_t");
2566 addToFunctionSummaryMap(
2567 "creat", Signature(ArgTypes{ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2569 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2571 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2572 .ArgConstraint(NotNull(ArgNo(0))));
2575 addToFunctionSummaryMap(
2576 "sleep", Signature(ArgTypes{UnsignedIntTy}, RetType{UnsignedIntTy}),
2579 ArgumentCondition(0, WithinRange,
Range(0, UnsignedIntMax))));
2581 std::optional<QualType> DirTy = lookupTy(
"DIR");
2582 std::optional<QualType> DirPtrTy = getPointerTy(DirTy);
2585 addToFunctionSummaryMap(
2586 "dirfd", Signature(ArgTypes{DirPtrTy}, RetType{IntTy}),
2588 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2590 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2591 .ArgConstraint(NotNull(ArgNo(0))));
2594 addToFunctionSummaryMap(
2595 "alarm", Signature(ArgTypes{UnsignedIntTy}, RetType{UnsignedIntTy}),
2598 ArgumentCondition(0, WithinRange,
Range(0, UnsignedIntMax))));
2601 addToFunctionSummaryMap(
2602 "closedir", Signature(ArgTypes{DirPtrTy}, RetType{IntTy}),
2604 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2605 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2606 .ArgConstraint(NotNull(ArgNo(0))));
2609 addToFunctionSummaryMap(
2610 "strdup", Signature(ArgTypes{ConstCharPtrTy}, RetType{CharPtrTy}),
2611 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2614 addToFunctionSummaryMap(
2616 Signature(ArgTypes{ConstCharPtrTy, SizeTyCanonTy}, RetType{CharPtrTy}),
2618 .ArgConstraint(NotNull(ArgNo(0)))
2620 ArgumentCondition(1, WithinRange,
Range(0, SizeMax))));
2623 addToFunctionSummaryMap(
2624 "wcsdup", Signature(ArgTypes{ConstWchar_tPtrTy}, RetType{Wchar_tPtrTy}),
2625 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2628 addToFunctionSummaryMap(
2629 "mkstemp", Signature(ArgTypes{CharPtrTy}, RetType{IntTy}),
2631 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2633 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2634 .ArgConstraint(NotNull(ArgNo(0))));
2637 addToFunctionSummaryMap(
2638 "mkdtemp", Signature(ArgTypes{CharPtrTy}, RetType{CharPtrTy}),
2640 .Case({NotNull(Ret), ReturnValueCondition(BO_EQ, ArgNo(0))},
2641 ErrnoMustNotBeChecked, GenericSuccessMsg)
2642 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2643 .ArgConstraint(NotNull(ArgNo(0))));
2646 addToFunctionSummaryMap(
2648 Signature(ArgTypes{CharPtrTy, SizeTyCanonTy}, RetType{CharPtrTy}),
2651 ArgumentCondition(1, WithinRange,
Range(1, SizeMax)),
2652 ReturnValueCondition(BO_EQ, ArgNo(0)), NotNull(Ret)},
2653 ErrnoMustNotBeChecked, GenericSuccessMsg)
2655 ArgumentCondition(1, WithinRange, SingleValue(0)),
2657 ErrnoNEZeroIrrelevant,
"Assuming that argument 'size' is 0")
2659 ArgumentCondition(1, WithinRange,
Range(1, SizeMax)),
2661 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2662 .Case({
IsNull(0), NotNull(Ret)}, ErrnoMustNotBeChecked,
2667 BufferSize( ArgNo(0), ArgNo(1)))
2669 ArgumentCondition(1, WithinRange,
Range(0, SizeMax))));
2672 addToFunctionSummaryMap(
2673 "mkdir", Signature(ArgTypes{ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2675 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2676 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2677 .ArgConstraint(NotNull(ArgNo(0))));
2680 addToFunctionSummaryMap(
2682 Signature(ArgTypes{IntTy, ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2684 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2685 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2686 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2687 .ArgConstraint(NotNull(ArgNo(1))));
2689 std::optional<QualType> Dev_tTy = lookupTy(
"dev_t");
2692 addToFunctionSummaryMap(
2694 Signature(ArgTypes{ConstCharPtrTy, Mode_tTy, Dev_tTy}, RetType{IntTy}),
2696 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2697 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2698 .ArgConstraint(NotNull(ArgNo(0))));
2701 addToFunctionSummaryMap(
2703 Signature(ArgTypes{IntTy, ConstCharPtrTy, Mode_tTy, Dev_tTy},
2706 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2707 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2708 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2709 .ArgConstraint(NotNull(ArgNo(1))));
2712 addToFunctionSummaryMap(
2713 "chmod", Signature(ArgTypes{ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2715 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2716 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2717 .ArgConstraint(NotNull(ArgNo(0))));
2720 addToFunctionSummaryMap(
2722 Signature(ArgTypes{IntTy, ConstCharPtrTy, Mode_tTy, IntTy},
2725 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2726 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2727 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2728 .ArgConstraint(NotNull(ArgNo(1))));
2731 addToFunctionSummaryMap(
2732 "fchmod", Signature(ArgTypes{IntTy, Mode_tTy}, RetType{IntTy}),
2734 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2735 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2737 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2739 std::optional<QualType> Uid_tTy = lookupTy(
"uid_t");
2740 std::optional<QualType> Gid_tTy = lookupTy(
"gid_t");
2744 addToFunctionSummaryMap(
2746 Signature(ArgTypes{IntTy, ConstCharPtrTy, Uid_tTy, Gid_tTy, IntTy},
2749 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2750 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2751 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2752 .ArgConstraint(NotNull(ArgNo(1))));
2755 addToFunctionSummaryMap(
2757 Signature(ArgTypes{ConstCharPtrTy, Uid_tTy, Gid_tTy}, RetType{IntTy}),
2759 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2760 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2761 .ArgConstraint(NotNull(ArgNo(0))));
2764 addToFunctionSummaryMap(
2766 Signature(ArgTypes{ConstCharPtrTy, Uid_tTy, Gid_tTy}, RetType{IntTy}),
2768 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2769 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2770 .ArgConstraint(NotNull(ArgNo(0))));
2773 addToFunctionSummaryMap(
2774 "fchown", Signature(ArgTypes{IntTy, Uid_tTy, Gid_tTy}, RetType{IntTy}),
2776 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2777 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2779 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2782 addToFunctionSummaryMap(
2783 "rmdir", Signature(ArgTypes{ConstCharPtrTy}, RetType{IntTy}),
2785 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2786 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2787 .ArgConstraint(NotNull(ArgNo(0))));
2790 addToFunctionSummaryMap(
2791 "chdir", Signature(ArgTypes{ConstCharPtrTy}, RetType{IntTy}),
2793 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2794 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2795 .ArgConstraint(NotNull(ArgNo(0))));
2798 addToFunctionSummaryMap(
2800 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy}, RetType{IntTy}),
2802 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2803 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2804 .ArgConstraint(NotNull(ArgNo(0)))
2805 .ArgConstraint(NotNull(ArgNo(1))));
2809 addToFunctionSummaryMap(
2811 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy, ConstCharPtrTy, IntTy},
2814 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2815 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2816 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2817 .ArgConstraint(NotNull(ArgNo(1)))
2818 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(2)))
2819 .ArgConstraint(NotNull(ArgNo(3))));
2822 addToFunctionSummaryMap(
2823 "unlink", Signature(ArgTypes{ConstCharPtrTy}, RetType{IntTy}),
2825 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2826 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2827 .ArgConstraint(NotNull(ArgNo(0))));
2830 addToFunctionSummaryMap(
2832 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy}, RetType{IntTy}),
2834 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2835 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2836 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2837 .ArgConstraint(NotNull(ArgNo(1))));
2839 std::optional<QualType> StructStatTy = lookupTy(
"stat");
2840 std::optional<QualType> StructStatPtrTy = getPointerTy(StructStatTy);
2841 std::optional<QualType> StructStatPtrRestrictTy =
2842 getRestrictTy(StructStatPtrTy);
2845 addToFunctionSummaryMap(
2846 "fstat", Signature(ArgTypes{IntTy, StructStatPtrTy}, RetType{IntTy}),
2848 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2849 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2850 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
2851 .ArgConstraint(NotNull(ArgNo(1))));
2854 addToFunctionSummaryMap(
2856 Signature(ArgTypes{ConstCharPtrRestrictTy, StructStatPtrRestrictTy},
2859 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2860 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2861 .ArgConstraint(NotNull(ArgNo(0)))
2862 .ArgConstraint(NotNull(ArgNo(1))));
2865 addToFunctionSummaryMap(
2867 Signature(ArgTypes{ConstCharPtrRestrictTy, StructStatPtrRestrictTy},
2870 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2871 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2872 .ArgConstraint(NotNull(ArgNo(0)))
2873 .ArgConstraint(NotNull(ArgNo(1))));
2877 addToFunctionSummaryMap(
2879 Signature(ArgTypes{IntTy, ConstCharPtrRestrictTy,
2880 StructStatPtrRestrictTy, IntTy},
2883 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2884 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2885 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2886 .ArgConstraint(NotNull(ArgNo(1)))
2887 .ArgConstraint(NotNull(ArgNo(2))));
2890 addToFunctionSummaryMap(
2891 "opendir", Signature(ArgTypes{ConstCharPtrTy}, RetType{DirPtrTy}),
2893 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2894 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2895 .ArgConstraint(NotNull(ArgNo(0))));
2898 addToFunctionSummaryMap(
2899 "fdopendir", Signature(ArgTypes{IntTy}, RetType{DirPtrTy}),
2901 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2902 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2904 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2907 addToFunctionSummaryMap(
2908 "isatty", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2910 .Case({ReturnValueCondition(WithinRange,
Range(0, 1))},
2913 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2916 addToFunctionSummaryMap(
2917 "close", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2919 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2920 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2922 ArgumentCondition(0, WithinRange,
Range(-1, IntMax))));
2925 addToFunctionSummaryMap(
"fpathconf",
2926 Signature(ArgTypes{IntTy, IntTy}, RetType{LongTy}),
2928 .ArgConstraint(ArgumentCondition(
2929 0, WithinRange,
Range(0, IntMax))));
2932 addToFunctionSummaryMap(
2933 "pathconf", Signature(ArgTypes{ConstCharPtrTy, IntTy}, RetType{LongTy}),
2934 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2937 addToFunctionSummaryMap(
2938 "rewinddir", Signature(ArgTypes{DirPtrTy}, RetType{VoidTy}),
2939 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2942 addToFunctionSummaryMap(
2943 "seekdir", Signature(ArgTypes{DirPtrTy, LongTy}, RetType{VoidTy}),
2944 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2947 addToFunctionSummaryMap(
2948 "rand_r", Signature(ArgTypes{UnsignedIntPtrTy}, RetType{IntTy}),
2949 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2954 auto MmapSignature = Signature(
2955 ArgTypes{VoidPtrTy, SizeTyCanonTy, IntTy, IntTy, IntTy, Off_tTy},
2956 RetType{VoidPtrTy});
2957 auto MmapSummaryWithLengthConstraint =
2960 ArgumentCondition(1, WithinRange,
Range(1, SizeMax)));
2967 addToFunctionSummaryMap(
"mmap", MmapSignature,
2968 MmapSummaryWithLengthConstraint);
2971 addToFunctionSummaryMap(
2972 "mmap", MmapSignature,
2973 MmapSummaryWithLengthConstraint.ArgConstraint(
2974 ArgumentCondition(4, WithinRange,
Range(-1, IntMax))));
2977 std::optional<QualType> Off64_tTy = lookupTy(
"off64_t");
2981 addToFunctionSummaryMap(
2984 ArgTypes{VoidPtrTy, SizeTyCanonTy, IntTy, IntTy, IntTy, Off64_tTy},
2985 RetType{VoidPtrTy}),
2987 .ArgConstraint(ArgumentCondition(1, WithinRange,
Range(1, SizeMax)))
2989 ArgumentCondition(4, WithinRange,
Range(-1, IntMax))));
2992 addToFunctionSummaryMap(
2993 "pipe", Signature(ArgTypes{IntPtrTy}, RetType{IntTy}),
2995 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2996 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2997 .ArgConstraint(NotNull(ArgNo(0))));
3004 addToFunctionSummaryMap(
3005 "lseek", Signature(ArgTypes{IntTy, Off_tTy, IntTy}, RetType{Off_tTy}),
3007 .Case(ReturnsNonnegative, ErrnoIrrelevant)
3008 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3010 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3014 addToFunctionSummaryMap(
3017 ArgTypes{ConstCharPtrRestrictTy, CharPtrRestrictTy, SizeTyCanonTy},
3018 RetType{Ssize_tTy}),
3020 .Case({ArgumentCondition(2, WithinRange,
Range(1, IntMax)),
3021 ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3022 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3023 ErrnoMustNotBeChecked, GenericSuccessMsg)
3024 .Case({ArgumentCondition(2, WithinRange, SingleValue(0)),
3025 ReturnValueCondition(WithinRange, SingleValue(0))},
3026 ErrnoMustNotBeChecked,
3027 "Assuming that argument 'bufsize' is 0")
3028 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3029 .ArgConstraint(NotNull(ArgNo(0)))
3030 .ArgConstraint(NotNull(ArgNo(1)))
3031 .ArgConstraint(BufferSize(ArgNo(1),
3034 ArgumentCondition(2, WithinRange,
Range(0, SizeMax))));
3038 addToFunctionSummaryMap(
3040 Signature(ArgTypes{IntTy, ConstCharPtrRestrictTy, CharPtrRestrictTy,
3042 RetType{Ssize_tTy}),
3044 .Case({ArgumentCondition(3, WithinRange,
Range(1, IntMax)),
3045 ReturnValueCondition(LessThanOrEq, ArgNo(3)),
3046 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3047 ErrnoMustNotBeChecked, GenericSuccessMsg)
3048 .Case({ArgumentCondition(3, WithinRange, SingleValue(0)),
3049 ReturnValueCondition(WithinRange, SingleValue(0))},
3050 ErrnoMustNotBeChecked,
3051 "Assuming that argument 'bufsize' is 0")
3052 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3053 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
3054 .ArgConstraint(NotNull(ArgNo(1)))
3055 .ArgConstraint(NotNull(ArgNo(2)))
3056 .ArgConstraint(BufferSize(ArgNo(2),
3059 ArgumentCondition(3, WithinRange,
Range(0, SizeMax))));
3063 addToFunctionSummaryMap(
3065 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy, ConstCharPtrTy},
3068 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3069 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3070 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
3071 .ArgConstraint(NotNull(ArgNo(1)))
3072 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(2)))
3073 .ArgConstraint(NotNull(ArgNo(3))));
3079 addToFunctionSummaryMap(
3081 Signature(ArgTypes{ConstCharPtrRestrictTy, CharPtrRestrictTy},
3082 RetType{CharPtrTy}),
3084 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
3085 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3086 .ArgConstraint(NotNull(ArgNo(0))));
3088 QualType CharPtrConstPtr = getPointerTy(getConstTy(CharPtrTy));
3091 addToFunctionSummaryMap(
3093 Signature(ArgTypes{ConstCharPtrTy, CharPtrConstPtr}, RetType{IntTy}),
3095 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant)
3096 .ArgConstraint(NotNull(ArgNo(0))));
3099 addToFunctionSummaryMap(
3101 Signature(ArgTypes{ConstCharPtrTy, CharPtrConstPtr}, RetType{IntTy}),
3103 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant)
3104 .ArgConstraint(NotNull(ArgNo(0))));
3107 addToFunctionSummaryMap(
3109 Signature(ArgTypes{IntTy, CharPtrConstPtr, ConstCharPtrTy},
3112 .Case({ReturnValueCondition(WithinRange,
Range(-1, UCharRangeMax))},
3114 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3115 .ArgConstraint(NotNull(ArgNo(1)))
3116 .ArgConstraint(NotNull(ArgNo(2))));
3118 std::optional<QualType> StructSockaddrTy = lookupTy(
"sockaddr");
3119 std::optional<QualType> StructSockaddrPtrTy =
3120 getPointerTy(StructSockaddrTy);
3121 std::optional<QualType> ConstStructSockaddrPtrTy =
3122 getPointerTy(getConstTy(StructSockaddrTy));
3123 std::optional<QualType> StructSockaddrPtrRestrictTy =
3124 getRestrictTy(StructSockaddrPtrTy);
3125 std::optional<QualType> ConstStructSockaddrPtrRestrictTy =
3126 getRestrictTy(ConstStructSockaddrPtrTy);
3127 std::optional<QualType> Socklen_tTy = lookupTy(
"socklen_t");
3128 std::optional<QualType> Socklen_tPtrTy = getPointerTy(Socklen_tTy);
3129 std::optional<QualType> Socklen_tPtrRestrictTy =
3130 getRestrictTy(Socklen_tPtrTy);
3131 std::optional<RangeInt> Socklen_tMax = getMaxValue(Socklen_tTy);
3141 addToFunctionSummaryMap(
3142 "socket", Signature(ArgTypes{IntTy, IntTy, IntTy}, RetType{IntTy}),
3144 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
3146 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg));
3150 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
3152 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3153 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)));
3154 if (!addToFunctionSummaryMap(
3158 Signature(ArgTypes{IntTy, StructSockaddrPtrRestrictTy,
3159 Socklen_tPtrRestrictTy},
3162 addToFunctionSummaryMap(
3164 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tPtrRestrictTy},
3170 if (!addToFunctionSummaryMap(
3172 Signature(ArgTypes{IntTy, ConstStructSockaddrPtrTy, Socklen_tTy},
3175 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3176 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3178 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3179 .ArgConstraint(NotNull(ArgNo(1)))
3181 BufferSize(ArgNo(1), ArgNo(2)))
3183 ArgumentCondition(2, WithinRange,
Range(0, Socklen_tMax)))))
3185 addToFunctionSummaryMap(
3187 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tTy}, RetType{IntTy}),
3189 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3190 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3192 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3194 ArgumentCondition(2, WithinRange,
Range(0, Socklen_tMax))));
3198 if (!addToFunctionSummaryMap(
3200 Signature(ArgTypes{IntTy, StructSockaddrPtrRestrictTy,
3201 Socklen_tPtrRestrictTy},
3204 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3205 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3207 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3208 .ArgConstraint(NotNull(ArgNo(1)))
3209 .ArgConstraint(NotNull(ArgNo(2)))))
3210 addToFunctionSummaryMap(
3212 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tPtrRestrictTy},
3215 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3216 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3218 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3222 if (!addToFunctionSummaryMap(
3224 Signature(ArgTypes{IntTy, StructSockaddrPtrRestrictTy,
3225 Socklen_tPtrRestrictTy},
3228 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3229 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3231 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3232 .ArgConstraint(NotNull(ArgNo(1)))
3233 .ArgConstraint(NotNull(ArgNo(2)))))
3234 addToFunctionSummaryMap(
3236 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tPtrRestrictTy},
3239 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3240 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3242 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3246 if (!addToFunctionSummaryMap(
3248 Signature(ArgTypes{IntTy, ConstStructSockaddrPtrTy, Socklen_tTy},
3251 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3252 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3254 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3255 .ArgConstraint(NotNull(ArgNo(1)))))
3256 addToFunctionSummaryMap(
3258 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tTy}, RetType{IntTy}),
3260 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3261 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3263 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3267 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3268 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3269 ErrnoMustNotBeChecked, GenericSuccessMsg)
3270 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3271 ArgumentCondition(2, WithinRange, SingleValue(0))},
3272 ErrnoMustNotBeChecked, GenericSuccessMsg)
3273 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3274 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3275 .ArgConstraint(BufferSize(ArgNo(1),
3277 if (!addToFunctionSummaryMap(
3283 Signature(ArgTypes{IntTy, VoidPtrRestrictTy, SizeTyCanonTy, IntTy,
3284 StructSockaddrPtrRestrictTy,
3285 Socklen_tPtrRestrictTy},
3286 RetType{Ssize_tTy}),
3288 addToFunctionSummaryMap(
3290 Signature(ArgTypes{IntTy, VoidPtrRestrictTy, SizeTyCanonTy, IntTy,
3292 RetType{Ssize_tTy}),
3297 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3298 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3299 ErrnoMustNotBeChecked, GenericSuccessMsg)
3300 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3301 ArgumentCondition(2, WithinRange, SingleValue(0))},
3302 ErrnoMustNotBeChecked, GenericSuccessMsg)
3303 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3304 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3305 .ArgConstraint(BufferSize(ArgNo(1),
3307 if (!addToFunctionSummaryMap(
3312 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTyCanonTy, IntTy,
3313 ConstStructSockaddrPtrTy, Socklen_tTy},
3314 RetType{Ssize_tTy}),
3316 addToFunctionSummaryMap(
3318 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTyCanonTy, IntTy,
3320 RetType{Ssize_tTy}),
3324 addToFunctionSummaryMap(
3325 "listen", Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
3327 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3328 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3330 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3333 addToFunctionSummaryMap(
3335 Signature(ArgTypes{IntTy, VoidPtrTy, SizeTyCanonTy, IntTy},
3336 RetType{Ssize_tTy}),
3338 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3339 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3340 ErrnoMustNotBeChecked, GenericSuccessMsg)
3341 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3342 ArgumentCondition(2, WithinRange, SingleValue(0))},
3343 ErrnoMustNotBeChecked, GenericSuccessMsg)
3344 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3345 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3346 .ArgConstraint(BufferSize(ArgNo(1),
3349 std::optional<QualType> StructMsghdrTy = lookupTy(
"msghdr");
3350 std::optional<QualType> StructMsghdrPtrTy = getPointerTy(StructMsghdrTy);
3351 std::optional<QualType> ConstStructMsghdrPtrTy =
3352 getPointerTy(getConstTy(StructMsghdrTy));
3355 addToFunctionSummaryMap(
3357 Signature(ArgTypes{IntTy, StructMsghdrPtrTy, IntTy},
3358 RetType{Ssize_tTy}),
3360 .Case({ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3361 ErrnoMustNotBeChecked, GenericSuccessMsg)
3362 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3364 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3367 addToFunctionSummaryMap(
3369 Signature(ArgTypes{IntTy, ConstStructMsghdrPtrTy, IntTy},
3370 RetType{Ssize_tTy}),
3372 .Case({ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3373 ErrnoMustNotBeChecked, GenericSuccessMsg)
3374 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3376 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3380 addToFunctionSummaryMap(
3382 Signature(ArgTypes{IntTy, IntTy, IntTy, ConstVoidPtrTy, Socklen_tTy},
3385 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3386 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3387 .ArgConstraint(NotNullBuffer(ArgNo(3), ArgNo(4)))
3389 BufferSize(ArgNo(3), ArgNo(4)))
3391 ArgumentCondition(4, WithinRange,
Range(0, Socklen_tMax))));
3396 addToFunctionSummaryMap(
3398 Signature(ArgTypes{IntTy, IntTy, IntTy, VoidPtrRestrictTy,
3399 Socklen_tPtrRestrictTy},
3402 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3403 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3404 .ArgConstraint(NotNull(ArgNo(3)))
3405 .ArgConstraint(NotNull(ArgNo(4))));
3408 addToFunctionSummaryMap(
3410 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTyCanonTy, IntTy},
3411 RetType{Ssize_tTy}),
3413 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3414 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3415 ErrnoMustNotBeChecked, GenericSuccessMsg)
3416 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3417 ArgumentCondition(2, WithinRange, SingleValue(0))},
3418 ErrnoMustNotBeChecked, GenericSuccessMsg)
3419 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3420 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3421 .ArgConstraint(BufferSize(ArgNo(1),
3425 addToFunctionSummaryMap(
3427 Signature(ArgTypes{IntTy, IntTy, IntTy, IntPtrTy}, RetType{IntTy}),
3429 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3430 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3431 .ArgConstraint(NotNull(ArgNo(3))));
3434 addToFunctionSummaryMap(
3435 "shutdown", Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
3437 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3438 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3440 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3449 addToFunctionSummaryMap(
3451 Signature(ArgTypes{ConstStructSockaddrPtrRestrictTy, Socklen_tTy,
3452 CharPtrRestrictTy, Socklen_tTy, CharPtrRestrictTy,
3453 Socklen_tTy, IntTy},
3457 BufferSize(ArgNo(0), ArgNo(1)))
3459 ArgumentCondition(1, WithinRange,
Range(0, Socklen_tMax)))
3461 BufferSize(ArgNo(2), ArgNo(3)))
3463 ArgumentCondition(3, WithinRange,
Range(0, Socklen_tMax)))
3465 BufferSize(ArgNo(4), ArgNo(5)))
3467 ArgumentCondition(5, WithinRange,
Range(0, Socklen_tMax))));
3469 std::optional<QualType> StructUtimbufTy = lookupTy(
"utimbuf");
3470 std::optional<QualType> StructUtimbufPtrTy = getPointerTy(StructUtimbufTy);
3473 addToFunctionSummaryMap(
3475 Signature(ArgTypes{ConstCharPtrTy, StructUtimbufPtrTy}, RetType{IntTy}),
3477 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3478 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3479 .ArgConstraint(NotNull(ArgNo(0))));
3481 std::optional<QualType> StructTimespecTy = lookupTy(
"timespec");
3482 std::optional<QualType> StructTimespecPtrTy =
3483 getPointerTy(StructTimespecTy);
3484 std::optional<QualType> ConstStructTimespecPtrTy =
3485 getPointerTy(getConstTy(StructTimespecTy));
3488 addToFunctionSummaryMap(
3490 Signature(ArgTypes{IntTy, ConstStructTimespecPtrTy}, RetType{IntTy}),
3492 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3493 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3495 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3499 addToFunctionSummaryMap(
3502 ArgTypes{IntTy, ConstCharPtrTy, ConstStructTimespecPtrTy, IntTy},
3505 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3506 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3507 .ArgConstraint(NotNull(ArgNo(1))));
3509 std::optional<QualType> StructTimevalTy = lookupTy(
"timeval");
3510 std::optional<QualType> ConstStructTimevalPtrTy =
3511 getPointerTy(getConstTy(StructTimevalTy));
3514 addToFunctionSummaryMap(
3516 Signature(ArgTypes{ConstCharPtrTy, ConstStructTimevalPtrTy},
3519 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3520 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3521 .ArgConstraint(NotNull(ArgNo(0))));
3524 addToFunctionSummaryMap(
3526 Signature(ArgTypes{ConstStructTimespecPtrTy, StructTimespecPtrTy},
3529 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3530 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3531 .ArgConstraint(NotNull(ArgNo(0))));
3533 std::optional<QualType> Time_tTy = lookupTy(
"time_t");
3534 std::optional<QualType> ConstTime_tPtrTy =
3535 getPointerTy(getConstTy(Time_tTy));
3536 std::optional<QualType> ConstTime_tPtrRestrictTy =
3537 getRestrictTy(ConstTime_tPtrTy);
3539 std::optional<QualType> StructTmTy = lookupTy(
"tm");
3540 std::optional<QualType> StructTmPtrTy = getPointerTy(StructTmTy);
3541 std::optional<QualType> StructTmPtrRestrictTy =
3542 getRestrictTy(StructTmPtrTy);
3543 std::optional<QualType> ConstStructTmPtrTy =
3544 getPointerTy(getConstTy(StructTmTy));
3545 std::optional<QualType> ConstStructTmPtrRestrictTy =
3546 getRestrictTy(ConstStructTmPtrTy);
3549 addToFunctionSummaryMap(
3551 Signature(ArgTypes{ConstTime_tPtrTy}, RetType{StructTmPtrTy}),
3552 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3556 addToFunctionSummaryMap(
3558 Signature(ArgTypes{ConstTime_tPtrRestrictTy, StructTmPtrRestrictTy},
3559 RetType{StructTmPtrTy}),
3561 .ArgConstraint(NotNull(ArgNo(0)))
3562 .ArgConstraint(NotNull(ArgNo(1))));
3565 addToFunctionSummaryMap(
3567 Signature(ArgTypes{ConstStructTmPtrRestrictTy, CharPtrRestrictTy},
3568 RetType{CharPtrTy}),
3570 .ArgConstraint(NotNull(ArgNo(0)))
3571 .ArgConstraint(NotNull(ArgNo(1)))
3572 .ArgConstraint(BufferSize(ArgNo(1),
3573 BVF.getValue(26, IntTy))));
3576 addToFunctionSummaryMap(
3578 Signature(ArgTypes{ConstTime_tPtrTy, CharPtrTy}, RetType{CharPtrTy}),
3580 .ArgConstraint(NotNull(ArgNo(0)))
3581 .ArgConstraint(NotNull(ArgNo(1)))
3582 .ArgConstraint(BufferSize(
3584 BVF.getValue(26, IntTy))));
3588 addToFunctionSummaryMap(
3590 Signature(ArgTypes{ConstTime_tPtrRestrictTy, StructTmPtrRestrictTy},
3591 RetType{StructTmPtrTy}),
3593 .ArgConstraint(NotNull(ArgNo(0)))
3594 .ArgConstraint(NotNull(ArgNo(1))));
3597 addToFunctionSummaryMap(
3598 "gmtime", Signature(ArgTypes{ConstTime_tPtrTy}, RetType{StructTmPtrTy}),
3599 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3601 std::optional<QualType> Clockid_tTy = lookupTy(
"clockid_t");
3604 addToFunctionSummaryMap(
3606 Signature(ArgTypes{Clockid_tTy, StructTimespecPtrTy}, RetType{IntTy}),
3608 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3609 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3610 .ArgConstraint(NotNull(ArgNo(1))));
3612 std::optional<QualType> StructItimervalTy = lookupTy(
"itimerval");
3613 std::optional<QualType> StructItimervalPtrTy =
3614 getPointerTy(StructItimervalTy);
3617 addToFunctionSummaryMap(
3619 Signature(ArgTypes{IntTy, StructItimervalPtrTy}, RetType{IntTy}),
3621 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3622 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3623 .ArgConstraint(NotNull(ArgNo(1))));
3625 std::optional<QualType> Pthread_cond_tTy = lookupTy(
"pthread_cond_t");
3626 std::optional<QualType> Pthread_cond_tPtrTy =
3627 getPointerTy(Pthread_cond_tTy);
3628 std::optional<QualType> Pthread_tTy = lookupTy(
"pthread_t");
3629 std::optional<QualType> Pthread_tPtrTy = getPointerTy(Pthread_tTy);
3630 std::optional<QualType> Pthread_tPtrRestrictTy =
3631 getRestrictTy(Pthread_tPtrTy);
3632 std::optional<QualType> Pthread_mutex_tTy = lookupTy(
"pthread_mutex_t");
3633 std::optional<QualType> Pthread_mutex_tPtrTy =
3634 getPointerTy(Pthread_mutex_tTy);
3635 std::optional<QualType> Pthread_mutex_tPtrRestrictTy =
3636 getRestrictTy(Pthread_mutex_tPtrTy);
3637 std::optional<QualType> Pthread_attr_tTy = lookupTy(
"pthread_attr_t");
3638 std::optional<QualType> Pthread_attr_tPtrTy =
3639 getPointerTy(Pthread_attr_tTy);
3640 std::optional<QualType> ConstPthread_attr_tPtrTy =
3641 getPointerTy(getConstTy(Pthread_attr_tTy));
3642 std::optional<QualType> ConstPthread_attr_tPtrRestrictTy =
3643 getRestrictTy(ConstPthread_attr_tPtrTy);
3644 std::optional<QualType> Pthread_mutexattr_tTy =
3645 lookupTy(
"pthread_mutexattr_t");
3646 std::optional<QualType> ConstPthread_mutexattr_tPtrTy =
3647 getPointerTy(getConstTy(Pthread_mutexattr_tTy));
3648 std::optional<QualType> ConstPthread_mutexattr_tPtrRestrictTy =
3649 getRestrictTy(ConstPthread_mutexattr_tPtrTy);
3651 QualType PthreadStartRoutineTy = getPointerTy(
3653 FunctionProtoType::ExtProtoInfo()));
3657 addToFunctionSummaryMap(
3658 {
"pthread_cond_signal",
"pthread_cond_broadcast"},
3659 Signature(ArgTypes{Pthread_cond_tPtrTy}, RetType{IntTy}),
3660 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3665 addToFunctionSummaryMap(
3667 Signature(ArgTypes{Pthread_tPtrRestrictTy,
3668 ConstPthread_attr_tPtrRestrictTy,
3669 PthreadStartRoutineTy, VoidPtrRestrictTy},
3672 .ArgConstraint(NotNull(ArgNo(0)))
3673 .ArgConstraint(NotNull(ArgNo(2))));
3677 addToFunctionSummaryMap(
3678 {
"pthread_attr_destroy",
"pthread_attr_init"},
3679 Signature(ArgTypes{Pthread_attr_tPtrTy}, RetType{IntTy}),
3680 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3686 addToFunctionSummaryMap(
3687 {
"pthread_attr_getstacksize",
"pthread_attr_getguardsize"},
3688 Signature(ArgTypes{ConstPthread_attr_tPtrRestrictTy, SizePtrRestrictTy},
3691 .ArgConstraint(NotNull(ArgNo(0)))
3692 .ArgConstraint(NotNull(ArgNo(1))));
3696 addToFunctionSummaryMap(
3697 {
"pthread_attr_setstacksize",
"pthread_attr_setguardsize"},
3698 Signature(ArgTypes{Pthread_attr_tPtrTy, SizeTyCanonTy}, RetType{IntTy}),
3700 .ArgConstraint(NotNull(ArgNo(0)))
3702 ArgumentCondition(1, WithinRange,
Range(0, SizeMax))));
3706 addToFunctionSummaryMap(
3707 "pthread_mutex_init",
3708 Signature(ArgTypes{Pthread_mutex_tPtrRestrictTy,
3709 ConstPthread_mutexattr_tPtrRestrictTy},
3711 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3717 addToFunctionSummaryMap(
3718 {
"pthread_mutex_destroy",
"pthread_mutex_lock",
"pthread_mutex_trylock",
3719 "pthread_mutex_unlock"},
3720 Signature(ArgTypes{Pthread_mutex_tPtrTy}, RetType{IntTy}),
3721 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3725 if (AddTestFunctions) {
3726 const RangeInt IntMin = BVF.
getMinValue(IntTy)->getLimitedValue();
3728 addToFunctionSummaryMap(
3729 "__not_null", Signature(ArgTypes{IntPtrTy}, RetType{IntTy}),
3730 Summary(EvalCallAsPure).ArgConstraint(NotNull(ArgNo(0))));
3732 addToFunctionSummaryMap(
3733 "__not_null_buffer",
3734 Signature(ArgTypes{VoidPtrTy, IntTy, IntTy}, RetType{IntTy}),
3735 Summary(EvalCallAsPure)
3736 .ArgConstraint(NotNullBuffer(ArgNo(0), ArgNo(1), ArgNo(2))));
3739 addToFunctionSummaryMap(
3740 "__single_val_0", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3741 Summary(EvalCallAsPure)
3742 .ArgConstraint(ArgumentCondition(0U, WithinRange, SingleValue(0))));
3743 addToFunctionSummaryMap(
3744 "__single_val_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3745 Summary(EvalCallAsPure)
3746 .ArgConstraint(ArgumentCondition(0U, WithinRange, SingleValue(1))));
3747 addToFunctionSummaryMap(
3748 "__range_1_2", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3749 Summary(EvalCallAsPure)
3750 .ArgConstraint(ArgumentCondition(0U, WithinRange,
Range(1, 2))));
3751 addToFunctionSummaryMap(
3752 "__range_m1_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3753 Summary(EvalCallAsPure)
3754 .ArgConstraint(ArgumentCondition(0U, WithinRange,
Range(-1, 1))));
3755 addToFunctionSummaryMap(
3756 "__range_m2_m1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3757 Summary(EvalCallAsPure)
3758 .ArgConstraint(ArgumentCondition(0U, WithinRange,
Range(-2, -1))));
3759 addToFunctionSummaryMap(
3760 "__range_m10_10", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3761 Summary(EvalCallAsPure)
3762 .ArgConstraint(ArgumentCondition(0U, WithinRange,
Range(-10, 10))));
3763 addToFunctionSummaryMap(
"__range_m1_inf",
3764 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3765 Summary(EvalCallAsPure)
3766 .ArgConstraint(ArgumentCondition(
3767 0U, WithinRange,
Range(-1, IntMax))));
3768 addToFunctionSummaryMap(
"__range_0_inf",
3769 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3770 Summary(EvalCallAsPure)
3771 .ArgConstraint(ArgumentCondition(
3772 0U, WithinRange,
Range(0, IntMax))));
3773 addToFunctionSummaryMap(
"__range_1_inf",
3774 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3775 Summary(EvalCallAsPure)
3776 .ArgConstraint(ArgumentCondition(
3777 0U, WithinRange,
Range(1, IntMax))));
3778 addToFunctionSummaryMap(
"__range_minf_m1",
3779 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3780 Summary(EvalCallAsPure)
3781 .ArgConstraint(ArgumentCondition(
3782 0U, WithinRange,
Range(IntMin, -1))));
3783 addToFunctionSummaryMap(
"__range_minf_0",
3784 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3785 Summary(EvalCallAsPure)
3786 .ArgConstraint(ArgumentCondition(
3787 0U, WithinRange,
Range(IntMin, 0))));
3788 addToFunctionSummaryMap(
"__range_minf_1",
3789 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3790 Summary(EvalCallAsPure)
3791 .ArgConstraint(ArgumentCondition(
3792 0U, WithinRange,
Range(IntMin, 1))));
3793 addToFunctionSummaryMap(
"__range_1_2__4_6",
3794 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3795 Summary(EvalCallAsPure)
3796 .ArgConstraint(ArgumentCondition(
3797 0U, WithinRange,
Range({1, 2}, {4, 6}))));
3798 addToFunctionSummaryMap(
3799 "__range_1_2__4_inf", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3800 Summary(EvalCallAsPure)
3801 .ArgConstraint(ArgumentCondition(0U, WithinRange,
3802 Range({1, 2}, {4, IntMax}))));
3805 addToFunctionSummaryMap(
3806 "__single_val_out_0", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3807 Summary(EvalCallAsPure)
3808 .ArgConstraint(ArgumentCondition(0U, OutOfRange, SingleValue(0))));
3809 addToFunctionSummaryMap(
3810 "__single_val_out_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3811 Summary(EvalCallAsPure)
3812 .ArgConstraint(ArgumentCondition(0U, OutOfRange, SingleValue(1))));
3813 addToFunctionSummaryMap(
3814 "__range_out_1_2", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3815 Summary(EvalCallAsPure)
3816 .ArgConstraint(ArgumentCondition(0U, OutOfRange,
Range(1, 2))));
3817 addToFunctionSummaryMap(
3818 "__range_out_m1_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3819 Summary(EvalCallAsPure)
3820 .ArgConstraint(ArgumentCondition(0U, OutOfRange,
Range(-1, 1))));
3821 addToFunctionSummaryMap(
3822 "__range_out_m2_m1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3823 Summary(EvalCallAsPure)
3824 .ArgConstraint(ArgumentCondition(0U, OutOfRange,
Range(-2, -1))));
3825 addToFunctionSummaryMap(
3826 "__range_out_m10_10", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3827 Summary(EvalCallAsPure)
3828 .ArgConstraint(ArgumentCondition(0U, OutOfRange,
Range(-10, 10))));
3829 addToFunctionSummaryMap(
"__range_out_m1_inf",
3830 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3831 Summary(EvalCallAsPure)
3832 .ArgConstraint(ArgumentCondition(
3833 0U, OutOfRange,
Range(-1, IntMax))));
3834 addToFunctionSummaryMap(
"__range_out_0_inf",
3835 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3836 Summary(EvalCallAsPure)
3837 .ArgConstraint(ArgumentCondition(
3838 0U, OutOfRange,
Range(0, IntMax))));
3839 addToFunctionSummaryMap(
"__range_out_1_inf",
3840 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3841 Summary(EvalCallAsPure)
3842 .ArgConstraint(ArgumentCondition(
3843 0U, OutOfRange,
Range(1, IntMax))));
3844 addToFunctionSummaryMap(
"__range_out_minf_m1",
3845 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3846 Summary(EvalCallAsPure)
3847 .ArgConstraint(ArgumentCondition(
3848 0U, OutOfRange,
Range(IntMin, -1))));
3849 addToFunctionSummaryMap(
"__range_out_minf_0",
3850 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3851 Summary(EvalCallAsPure)
3852 .ArgConstraint(ArgumentCondition(
3853 0U, OutOfRange,
Range(IntMin, 0))));
3854 addToFunctionSummaryMap(
"__range_out_minf_1",
3855 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3856 Summary(EvalCallAsPure)
3857 .ArgConstraint(ArgumentCondition(
3858 0U, OutOfRange,
Range(IntMin, 1))));
3859 addToFunctionSummaryMap(
"__range_out_1_2__4_6",
3860 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3861 Summary(EvalCallAsPure)
3862 .ArgConstraint(ArgumentCondition(
3863 0U, OutOfRange,
Range({1, 2}, {4, 6}))));
3864 addToFunctionSummaryMap(
3865 "__range_out_1_2__4_inf", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3866 Summary(EvalCallAsPure)
3868 ArgumentCondition(0U, OutOfRange,
Range({1, 2}, {4, IntMax}))));
3871 addToFunctionSummaryMap(
3872 "__within", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3873 Summary(EvalCallAsPure)
3874 .ArgConstraint(ArgumentCondition(0U, WithinRange, SingleValue(1))));
3875 addToFunctionSummaryMap(
3876 "__out_of", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3877 Summary(EvalCallAsPure)
3878 .ArgConstraint(ArgumentCondition(0U, OutOfRange, SingleValue(1))));
3880 addToFunctionSummaryMap(
3881 "__two_constrained_args",
3882 Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
3883 Summary(EvalCallAsPure)
3884 .ArgConstraint(ArgumentCondition(0U, WithinRange, SingleValue(1)))
3885 .ArgConstraint(ArgumentCondition(1U, WithinRange, SingleValue(1))));
3886 addToFunctionSummaryMap(
3887 "__arg_constrained_twice", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3888 Summary(EvalCallAsPure)
3889 .ArgConstraint(ArgumentCondition(0U, OutOfRange, SingleValue(1)))
3890 .ArgConstraint(ArgumentCondition(0U, OutOfRange, SingleValue(2))));
3891 addToFunctionSummaryMap(
3893 Signature(ArgTypes{
Irrelevant, IntTy}, RetType{IntTy}),
3894 Summary(EvalCallAsPure).ArgConstraint(NotNull(ArgNo(0))));
3895 addToFunctionSummaryMap(
3897 Signature(ArgTypes{VoidPtrTy, ConstCharPtrTy}, RetType{IntTy}),
3898 Summary(EvalCallAsPure)
3899 .ArgConstraint(NotNull(ArgNo(0)))
3900 .ArgConstraint(NotNull(ArgNo(1))));
3901 addToFunctionSummaryMap(
3902 "__buf_size_arg_constraint",
3903 Signature(ArgTypes{ConstVoidPtrTy, SizeTyCanonTy}, RetType{IntTy}),
3904 Summary(EvalCallAsPure)
3906 BufferSize(ArgNo(0), ArgNo(1))));
3907 addToFunctionSummaryMap(
3908 "__buf_size_arg_constraint_mul",
3909 Signature(ArgTypes{ConstVoidPtrTy, SizeTyCanonTy, SizeTyCanonTy},
3911 Summary(EvalCallAsPure)
3912 .ArgConstraint(BufferSize(ArgNo(0), ArgNo(1),
3914 addToFunctionSummaryMap(
3915 "__buf_size_arg_constraint_concrete",
3916 Signature(ArgTypes{ConstVoidPtrTy}, RetType{IntTy}),
3917 Summary(EvalCallAsPure)
3918 .ArgConstraint(BufferSize(ArgNo(0),
3919 BVF.getValue(10, IntTy))));
3920 addToFunctionSummaryMap(
3921 {
"__test_restrict_param_0",
"__test_restrict_param_1",
3922 "__test_restrict_param_2"},
3923 Signature(ArgTypes{VoidPtrRestrictTy}, RetType{VoidTy}),
3924 Summary(EvalCallAsPure));
3927 addToFunctionSummaryMap(
3928 "__test_case_note", Signature(ArgTypes{}, RetType{IntTy}),
3929 Summary(EvalCallAsPure)
3930 .Case({ReturnValueCondition(WithinRange, SingleValue(0))},
3931 ErrnoIrrelevant,
"Function returns 0")
3932 .Case({ReturnValueCondition(WithinRange, SingleValue(1))},
3933 ErrnoIrrelevant,
"Function returns 1"));
3934 addToFunctionSummaryMap(
3935 "__test_case_range_1_2__4_6",
3936 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3937 Summary(EvalCallAsPure)
3938 .Case({ArgumentCondition(0U, WithinRange,
3939 IntRangeVector{{IntMin, 0}, {3, 3}}),
3940 ReturnValueCondition(WithinRange, SingleValue(1))},
3942 .Case({ArgumentCondition(0U, WithinRange,
3943 IntRangeVector{{3, 3}, {7, IntMax}}),
3944 ReturnValueCondition(WithinRange, SingleValue(2))},
3946 .Case({ArgumentCondition(0U, WithinRange,
3947 IntRangeVector{{IntMin, 0}, {7, IntMax}}),
3948 ReturnValueCondition(WithinRange, SingleValue(3))},
3950 .Case({ArgumentCondition(
3952 IntRangeVector{{IntMin, 0}, {3, 3}, {7, IntMax}}),
3953 ReturnValueCondition(WithinRange, SingleValue(4))},
3958void ento::registerStdCLibraryFunctionsChecker(CheckerManager &mgr) {
3962 Checker->DisplayLoadedSummaries =
3963 Opts.getCheckerBooleanOption(Checker,
"DisplayLoadedSummaries");
3964 Checker->ModelPOSIX = Opts.getCheckerBooleanOption(Checker,
"ModelPOSIX");
3965 Checker->ShouldAssumeControlledEnvironment =
3966 Opts.ShouldAssumeControlledEnvironment;
3969bool ento::shouldRegisterStdCLibraryFunctionsChecker(
3970 const CheckerManager &mgr) {
3974void ento::registerStdCLibraryFunctionsTesterChecker(CheckerManager &mgr) {
3975 auto *Checker = mgr.
getChecker<StdLibraryFunctionsChecker>();
3976 Checker->AddTestFunctions =
true;
3979bool ento::shouldRegisterStdCLibraryFunctionsTesterChecker(
3980 const CheckerManager &mgr) {
static std::string getFunctionName(const CallEvent &Call)
static bool isInvalid(LocType Loc, bool *Invalid)
TranslationUnitDecl * getTranslationUnitDecl() const
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const LangOptions & getLangOpts() const
CanQualType getCanonicalSizeType() const
QualType getRestrictType(QualType T) const
Return the uniqued reference to the type for a restrict qualified type.
CanQualType getCanonicalTypeDeclType(const TypeDecl *TD) const
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.
const TargetInfo & getTargetInfo() const
static Opcode negateComparisonOp(Opcode Opc)
BinaryOperatorKind Opcode
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
ASTContext & getASTContext() const LLVM_READONLY
void print(raw_ostream &Out, unsigned Indentation=0, bool PrintInstantiation=false) const
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
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
QualType withConst() const
QualType getCanonicalType() const
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
APSIntPtr getMaxValue(const llvm::APSInt &v)
APSIntPtr getMinValue(const llvm::APSInt &v)
ASTContext & getContext() const
const AnalyzerOptions & getAnalyzerOptions() const
CHECKER * registerChecker(AT &&...Args)
Register a single-part checker (derived from Checker): construct its singleton instance,...
CheckerNameRef getCurrentCheckerName() const
CHECKER * getChecker(AT &&...Args)
If the the singleton instance of a checker class is not yet constructed, then construct it (with the ...
Simple checker classes that implement one frontend (i.e.
ProgramStateRef assumeInclusiveRange(ProgramStateRef State, NonLoc Value, const llvm::APSInt &From, const llvm::APSInt &To, bool InBound)
const ProgramStateRef & getState() const
unsigned succ_size() const
const ExplodedNode * getErrorNode() const
void markNotInteresting(SymbolRef sym)
bool isInteresting(SymbolRef sym) const
SValBuilder & getSValBuilder()
ConstraintManager & getConstraintManager()
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.
QualType getConditionType() const
SVal evalBinOp(ProgramStateRef state, BinaryOperator::Opcode op, SVal lhs, SVal rhs, QualType type)
DefinedOrUnknownSVal conjureSymbolVal(const void *symbolTag, ConstCFGElementRef elem, const StackFrame *SF, unsigned count)
Create a new symbol with a unique 'name'.
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.
Defines the clang::TargetInfo interface.
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 setErrnoStdMustBeChecked(ProgramStateRef State, CheckerContext &C, ConstCFGElementRef Elem)
Set errno state for the common case when a standard function indicates failure only by errno.
ProgramStateRef setErrnoState(ProgramStateRef State, ErrnoCheckState EState)
Set the errno check state, do not modify the errno value.
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'.
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
SVal getDynamicExtentWithOffset(ProgramStateRef State, SVal BufV)
Get the dynamic extent for a symbolic value that represents a buffer.
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
std::optional< int > tryExpandAsInteger(StringRef Macro, const Preprocessor &PP)
Try to parse the value of a defined preprocessor macro.
PRESERVE_NONE bool Ret(InterpState &S)
bool IsNonNull(InterpState &S)
bool matches(const til::SExpr *E1, const til::SExpr *E2)
Top level wrappers for InstallAPI frontend operations.
bool isa(CodeGen::Address addr)
@ Result
The result type of a method or function.
const FunctionProtoType * T
U cast(CodeGen::Address addr)
int const char * function
__packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_t