52#include "llvm/ADT/STLExtras.h"
53#include "llvm/ADT/SmallString.h"
54#include "llvm/ADT/StringExtras.h"
55#include "llvm/Support/FormatVariadic.h"
64class StdLibraryFunctionsChecker
65 :
public Checker<check::PreCall, check::PostCall, eval::Call> {
71 enum InvalidationKind {
80 enum RangeKind { OutOfRange, WithinRange };
82 static RangeKind negateKind(RangeKind K) {
89 llvm_unreachable(
"Unknown range kind");
98 typedef std::vector<std::pair<RangeInt, RangeInt>> IntRangeVector;
105 static const ArgNo Ret;
109 static void printArgDesc(ArgNo, llvm::raw_ostream &Out);
114 const CallEvent &
Call, llvm::raw_ostream &Out);
117 static void appendInsideRangeDesc(llvm::APSInt RMin, llvm::APSInt RMax,
118 QualType ArgT, BasicValueFactory &BVF,
119 llvm::raw_ostream &Out);
122 static void appendOutOfRangeDesc(llvm::APSInt RMin, llvm::APSInt RMax,
123 QualType ArgT, BasicValueFactory &BVF,
124 llvm::raw_ostream &Out);
126 class ValueConstraint;
135 using ValueConstraintPtr = std::shared_ptr<ValueConstraint>;
147 class ValueConstraint {
149 ValueConstraint(ArgNo ArgN) : ArgN(ArgN) {}
150 virtual ~ValueConstraint() {}
155 const Summary &Summary,
156 CheckerContext &
C)
const = 0;
160 enum DescriptionKind {
176 virtual void describe(DescriptionKind DK,
const CallEvent &
Call,
178 llvm::raw_ostream &Out)
const {
183 "Description not implemented for summary case constraints");
198 virtual bool describeArgumentValue(
const CallEvent &
Call,
200 const Summary &Summary,
201 llvm::raw_ostream &Out)
const {
202 if (
auto N = getArgSVal(
Call, getArgNo()).getAs<NonLoc>()) {
203 if (
const llvm::APSInt *Int = N->getAsInteger()) {
217 virtual std::vector<ArgNo> getArgsToTrack()
const {
return {ArgN}; }
220 virtual ValueConstraintPtr negate()
const {
221 llvm_unreachable(
"Not implemented");
229 bool checkValidity(
const FunctionDecl *FD)
const {
231 assert(ValidArg &&
"Arg out of range!");
235 return checkSpecificValidity(FD);
239 ArgNo getArgNo()
const {
return ArgN; }
250 virtual bool checkSpecificValidity(
const FunctionDecl *FD)
const {
265 class RangeConstraint :
public ValueConstraint {
272 IntRangeVector Ranges;
277 StringRef Description;
280 RangeConstraint(ArgNo ArgN, RangeKind Kind,
const IntRangeVector &Ranges,
282 : ValueConstraint(ArgN), Kind(Kind), Ranges(Ranges), Description(Desc) {
285 const IntRangeVector &getRanges()
const {
return Ranges; }
288 const Summary &Summary,
289 CheckerContext &
C)
const override;
291 void describe(DescriptionKind DK,
const CallEvent &
Call,
293 llvm::raw_ostream &Out)
const override;
296 const Summary &Summary,
297 llvm::raw_ostream &Out)
const override;
299 ValueConstraintPtr negate()
const override {
300 RangeConstraint Tmp(*
this);
301 Tmp.Kind = negateKind(Kind);
302 return std::make_shared<RangeConstraint>(Tmp);
306 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
307 const bool ValidArg =
310 "This constraint should be applied on an integral type");
319 using RangeApplyFunction =
324 void applyOnWithinRange(BasicValueFactory &BVF, QualType ArgT,
325 const RangeApplyFunction &F)
const;
336 void applyOnOutOfRange(BasicValueFactory &BVF, QualType ArgT,
337 const RangeApplyFunction &F)
const;
340 void applyOnRange(RangeKind Kind, BasicValueFactory &BVF, QualType ArgT,
341 const RangeApplyFunction &F)
const {
344 applyOnOutOfRange(BVF, ArgT, F);
347 applyOnWithinRange(BVF, ArgT, F);
354 class ComparisonConstraint :
public ValueConstraint {
361 : ValueConstraint(ArgN), Opcode(Opcode), OtherArgN(OtherArgN) {}
362 ArgNo getOtherArgNo()
const {
return OtherArgN; }
365 const Summary &Summary,
366 CheckerContext &
C)
const override;
370 class NullnessConstraint :
public ValueConstraint {
371 using ValueConstraint::ValueConstraint;
373 bool CannotBeNull =
true;
376 NullnessConstraint(ArgNo ArgN,
bool CannotBeNull =
true)
377 : ValueConstraint(ArgN), CannotBeNull(CannotBeNull) {}
380 const Summary &Summary,
381 CheckerContext &
C)
const override;
383 void describe(DescriptionKind DK,
const CallEvent &
Call,
385 llvm::raw_ostream &Out)
const override;
388 const Summary &Summary,
389 llvm::raw_ostream &Out)
const override;
391 ValueConstraintPtr negate()
const override {
392 NullnessConstraint Tmp(*
this);
393 Tmp.CannotBeNull = !this->CannotBeNull;
394 return std::make_shared<NullnessConstraint>(Tmp);
398 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
399 const bool ValidArg = getArgType(FD, ArgN)->isPointerType();
401 "This constraint should be applied only on a pointer type");
412 class BufferNullnessConstraint :
public ValueConstraint {
413 using ValueConstraint::ValueConstraint;
415 std::optional<ArgNo> SizeArg2N;
417 bool CannotBeNull =
true;
420 BufferNullnessConstraint(ArgNo ArgN, ArgNo SizeArg1N,
421 std::optional<ArgNo> SizeArg2N,
422 bool CannotBeNull =
true)
423 : ValueConstraint(ArgN), SizeArg1N(SizeArg1N), SizeArg2N(SizeArg2N),
424 CannotBeNull(CannotBeNull) {}
427 const Summary &Summary,
428 CheckerContext &
C)
const override;
430 void describe(DescriptionKind DK,
const CallEvent &
Call,
432 llvm::raw_ostream &Out)
const override;
435 const Summary &Summary,
436 llvm::raw_ostream &Out)
const override;
438 ValueConstraintPtr negate()
const override {
439 BufferNullnessConstraint Tmp(*
this);
440 Tmp.CannotBeNull = !this->CannotBeNull;
441 return std::make_shared<BufferNullnessConstraint>(Tmp);
445 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
446 const bool ValidArg = getArgType(FD, ArgN)->isPointerType();
448 "This constraint should be applied only on a pointer type");
463 class BufferSizeConstraint :
public ValueConstraint {
465 std::optional<llvm::APSInt> ConcreteSize;
467 std::optional<ArgNo> SizeArgN;
471 std::optional<ArgNo> SizeMultiplierArgN;
476 BufferSizeConstraint(ArgNo Buffer, llvm::APSInt BufMinSize)
477 : ValueConstraint(Buffer), ConcreteSize(BufMinSize) {}
478 BufferSizeConstraint(ArgNo Buffer, ArgNo BufSize)
479 : ValueConstraint(Buffer), SizeArgN(BufSize) {}
480 BufferSizeConstraint(ArgNo Buffer, ArgNo BufSize, ArgNo BufSizeMultiplier)
481 : ValueConstraint(Buffer), SizeArgN(BufSize),
482 SizeMultiplierArgN(BufSizeMultiplier) {}
485 const Summary &Summary,
486 CheckerContext &
C)
const override;
488 void describe(DescriptionKind DK,
const CallEvent &
Call,
490 llvm::raw_ostream &Out)
const override;
493 const Summary &Summary,
494 llvm::raw_ostream &Out)
const override;
496 std::vector<ArgNo> getArgsToTrack()
const override {
497 std::vector<ArgNo>
Result{ArgN};
499 Result.push_back(*SizeArgN);
500 if (SizeMultiplierArgN)
501 Result.push_back(*SizeMultiplierArgN);
505 ValueConstraintPtr negate()
const override {
506 BufferSizeConstraint Tmp(*
this);
508 return std::make_shared<BufferSizeConstraint>(Tmp);
512 bool checkSpecificValidity(
const FunctionDecl *FD)
const override {
513 const bool ValidArg = getArgType(FD, ArgN)->isPointerType();
515 "This constraint should be applied only on a pointer type");
521 using ConstraintSet = std::vector<ValueConstraintPtr>;
530 class ErrnoConstraintBase {
534 const Summary &Summary,
535 CheckerContext &
C)
const = 0;
540 virtual std::string
describe(CheckerContext &
C)
const {
return ""; }
542 virtual ~ErrnoConstraintBase() {}
545 ErrnoConstraintBase() =
default;
555 class ResetErrnoConstraint :
public ErrnoConstraintBase {
558 const Summary &Summary,
559 CheckerContext &
C)
const override {
568 class NoErrnoConstraint :
public ErrnoConstraintBase {
571 const Summary &Summary,
572 CheckerContext &
C)
const override {
581 class FailureErrnoConstraint :
public ErrnoConstraintBase {
584 const Summary &Summary,
585 CheckerContext &
C)
const override {
586 SValBuilder &SVB =
C.getSValBuilder();
588 C.blockCount(), &Tag)
599 class SuccessErrnoConstraint :
public ErrnoConstraintBase {
602 const Summary &Summary,
603 CheckerContext &
C)
const override {
607 std::string
describe(CheckerContext &
C)
const override {
608 return "'errno' becomes undefined after the call";
616 class ErrnoMustBeCheckedConstraint :
public ErrnoConstraintBase {
619 const Summary &Summary,
620 CheckerContext &
C)
const override {
622 Call.getCFGElementRef());
625 std::string
describe(CheckerContext &
C)
const override {
626 return "reading 'errno' is required to find out if the call has failed";
652 ConstraintSet Constraints;
653 const ErrnoConstraintBase &ErrnoConstraint;
657 SummaryCase(ConstraintSet &&Constraints,
const ErrnoConstraintBase &ErrnoC,
659 : Constraints(std::move(Constraints)), ErrnoConstraint(ErrnoC),
662 SummaryCase(
const ConstraintSet &Constraints,
663 const ErrnoConstraintBase &ErrnoC, StringRef Note)
664 : Constraints(Constraints), ErrnoConstraint(ErrnoC), Note(Note) {}
666 const ConstraintSet &getConstraints()
const {
return Constraints; }
667 const ErrnoConstraintBase &getErrnoConstraint()
const {
668 return ErrnoConstraint;
670 StringRef getNote()
const {
return Note; }
673 using ArgTypes = ArrayRef<std::optional<QualType>>;
674 using RetType = std::optional<QualType>;
678 const QualType Irrelevant{};
679 bool static isIrrelevant(QualType T) {
return T.
isNull(); }
686 using ArgQualTypes = std::vector<QualType>;
690 bool Invalid =
false;
695 Signature(ArgTypes ArgTys, RetType RetTy) {
696 for (std::optional<QualType> Arg : ArgTys) {
701 assertArgTypeSuitableForSignature(*Arg);
702 this->ArgTys.push_back(*Arg);
709 assertRetTypeSuitableForSignature(*RetTy);
710 this->RetTy = *RetTy;
714 bool isInvalid()
const {
return Invalid; }
715 bool matches(
const FunctionDecl *FD)
const;
718 static void assertArgTypeSuitableForSignature(QualType T) {
720 "We should have no void types in the spec");
722 "We should only have canonical types in the spec");
724 static void assertRetTypeSuitableForSignature(QualType T) {
726 "We should only have canonical types in the spec");
730 static QualType getArgType(
const FunctionDecl *FD, ArgNo ArgN) {
731 assert(FD &&
"Function must be set");
732 QualType T = (ArgN == Ret)
738 using SummaryCases = std::vector<SummaryCase>;
757 const InvalidationKind InvalidationKd;
759 ConstraintSet ArgConstraints;
763 const FunctionDecl *FD =
nullptr;
766 Summary(InvalidationKind InvalidationKd) : InvalidationKd(InvalidationKd) {}
768 Summary &Case(ConstraintSet &&CS,
const ErrnoConstraintBase &ErrnoC,
769 StringRef
Note =
"") {
770 Cases.push_back(SummaryCase(std::move(CS), ErrnoC,
Note));
773 Summary &Case(
const ConstraintSet &CS,
const ErrnoConstraintBase &ErrnoC,
774 StringRef
Note =
"") {
775 Cases.push_back(SummaryCase(CS, ErrnoC,
Note));
778 Summary &ArgConstraint(ValueConstraintPtr VC) {
779 assert(VC->getArgNo() != Ret &&
780 "Arg constraint should not refer to the return value");
781 ArgConstraints.push_back(VC);
785 InvalidationKind getInvalidationKd()
const {
return InvalidationKd; }
786 const SummaryCases &getCases()
const {
return Cases; }
787 const ConstraintSet &getArgConstraints()
const {
return ArgConstraints; }
789 QualType getArgType(ArgNo ArgN)
const {
790 return StdLibraryFunctionsChecker::getArgType(FD, ArgN);
795 bool matchesAndSet(
const Signature &Sign,
const FunctionDecl *FD) {
796 bool Result = Sign.matches(FD) && validateByConstraints(FD);
798 assert(!this->FD &&
"FD must not be set more than once");
807 bool validateByConstraints(
const FunctionDecl *FD)
const {
808 for (
const SummaryCase &Case : Cases)
809 for (
const ValueConstraintPtr &Constraint : Case.getConstraints())
810 if (!Constraint->checkValidity(FD))
812 for (
const ValueConstraintPtr &Constraint : ArgConstraints)
813 if (!Constraint->checkValidity(FD))
821 using FunctionSummaryMapType = llvm::DenseMap<const FunctionDecl *, Summary>;
822 mutable FunctionSummaryMapType FunctionSummaryMap;
824 const BugType BT_InvalidArg{
this,
"Function call with invalid argument"};
825 mutable bool SummariesInitialized =
false;
827 static SVal getArgSVal(
const CallEvent &
Call, ArgNo ArgN) {
828 return ArgN == Ret ?
Call.getReturnValue() :
Call.getArgSVal(ArgN);
831 assert(
Call.getDecl() &&
832 "Call was found by a summary, should have declaration");
837 void checkPreCall(
const CallEvent &
Call, CheckerContext &
C)
const;
838 void checkPostCall(
const CallEvent &
Call, CheckerContext &
C)
const;
839 bool evalCall(
const CallEvent &
Call, CheckerContext &
C)
const;
841 CheckerNameRef CheckName;
842 bool AddTestFunctions =
false;
844 bool DisplayLoadedSummaries =
false;
845 bool ModelPOSIX =
false;
846 bool ShouldAssumeControlledEnvironment =
false;
849 std::optional<Summary> findFunctionSummary(
const FunctionDecl *FD,
850 CheckerContext &
C)
const;
851 std::optional<Summary> findFunctionSummary(
const CallEvent &
Call,
852 CheckerContext &
C)
const;
854 LLVM_ATTRIBUTE_MINSIZE
void initFunctionSummaries(CheckerContext &
C)
const;
856 void reportBug(
const CallEvent &
Call, ExplodedNode *N,
857 const ValueConstraint *VC,
const ValueConstraint *NegatedVC,
858 const Summary &Summary, CheckerContext &
C)
const {
859 assert(
Call.getDecl() &&
860 "Function found in summary must have a declaration available");
861 SmallString<256> Msg;
862 llvm::raw_svector_ostream MsgOs(Msg);
865 printArgDesc(VC->getArgNo(), MsgOs);
868 NegatedVC->describeArgumentValue(
Call, N->
getState(), Summary, MsgOs);
872 MsgOs <<
"is out of the accepted range; It ";
873 VC->describe(ValueConstraint::Violation,
Call,
C.getState(), Summary,
875 Msg[0] = toupper(Msg[0]);
876 auto R = std::make_unique<PathSensitiveBugReport>(BT_InvalidArg, Msg, N);
878 for (ArgNo ArgN : VC->getArgsToTrack()) {
880 R->markInteresting(
Call.getArgSVal(ArgN));
882 R->addRange(
Call.getArgSourceRange(ArgN));
885 C.emitReport(std::move(R));
893 const NoErrnoConstraint ErrnoUnchanged{};
894 const ResetErrnoConstraint ErrnoIrrelevant{};
895 const ErrnoMustBeCheckedConstraint ErrnoMustBeChecked{};
896 const SuccessErrnoConstraint ErrnoMustNotBeChecked{};
897 const FailureErrnoConstraint ErrnoNEZeroIrrelevant{};
900int StdLibraryFunctionsChecker::ErrnoConstraintBase::Tag = 0;
902const StdLibraryFunctionsChecker::ArgNo StdLibraryFunctionsChecker::Ret =
903 std::numeric_limits<ArgNo>::max();
913void StdLibraryFunctionsChecker::printArgDesc(
914 StdLibraryFunctionsChecker::ArgNo ArgN, llvm::raw_ostream &Out) {
915 Out << std::to_string(ArgN + 1);
916 Out << llvm::getOrdinalSuffix(ArgN + 1);
920void StdLibraryFunctionsChecker::printArgValueInfo(ArgNo ArgN,
922 const CallEvent &
Call,
923 llvm::raw_ostream &Out) {
924 if (
const llvm::APSInt *Val =
925 State->getStateManager().getSValBuilder().getKnownValue(
926 State, getArgSVal(
Call, ArgN)))
927 Out <<
" (which is " << *Val <<
")";
930void StdLibraryFunctionsChecker::appendInsideRangeDesc(llvm::APSInt RMin,
933 BasicValueFactory &BVF,
934 llvm::raw_ostream &Out) {
935 if (RMin.isZero() && RMax.isZero())
937 else if (RMin == RMax)
943 Out <<
"<= " << RMax;
948 Out <<
">= " << RMin;
949 }
else if (RMin.isNegative() == RMax.isNegative() &&
950 RMin.getLimitedValue() == RMax.getLimitedValue() - 1) {
951 Out << RMin <<
" or " << RMax;
953 Out <<
"between " << RMin <<
" and " << RMax;
957void StdLibraryFunctionsChecker::appendOutOfRangeDesc(llvm::APSInt RMin,
960 BasicValueFactory &BVF,
961 llvm::raw_ostream &Out) {
962 if (RMin.isZero() && RMax.isZero())
964 else if (RMin == RMax) {
965 Out <<
"not equal to " << RMin;
976 }
else if (RMin.isNegative() == RMax.isNegative() &&
977 RMin.getLimitedValue() == RMax.getLimitedValue() - 1) {
978 Out <<
"not " << RMin <<
" and not " << RMax;
980 Out <<
"not between " << RMin <<
" and " << RMax;
984void StdLibraryFunctionsChecker::RangeConstraint::applyOnWithinRange(
985 BasicValueFactory &BVF, QualType ArgT,
const RangeApplyFunction &F)
const {
989 for (
auto [Start, End] : getRanges()) {
990 const llvm::APSInt &
Min = BVF.getValue(Start, ArgT);
991 const llvm::APSInt &
Max = BVF.getValue(End, ArgT);
998void StdLibraryFunctionsChecker::RangeConstraint::applyOnOutOfRange(
999 BasicValueFactory &BVF, QualType ArgT,
const RangeApplyFunction &F)
const {
1003 const IntRangeVector &
R = getRanges();
1004 size_t E =
R.size();
1006 const llvm::APSInt &MinusInf = BVF.
getMinValue(ArgT);
1007 const llvm::APSInt &PlusInf = BVF.
getMaxValue(ArgT);
1009 const llvm::APSInt &RangeLeft = BVF.getValue(R[0].first - 1ULL, ArgT);
1010 const llvm::APSInt &RangeRight = BVF.getValue(R[E - 1].second + 1ULL, ArgT);
1013 for (
size_t I = 1; I != E; ++I) {
1014 const llvm::APSInt &
Min = BVF.getValue(R[I - 1].second + 1ULL, ArgT);
1015 const llvm::APSInt &
Max = BVF.getValue(R[I].first - 1ULL, ArgT);
1022 if (RangeLeft != PlusInf) {
1023 assert(MinusInf <= RangeLeft);
1024 if (!F(MinusInf, RangeLeft))
1028 if (RangeRight != MinusInf) {
1029 assert(RangeRight <= PlusInf);
1030 if (!F(RangeRight, PlusInf))
1037 CheckerContext &
C)
const {
1038 ConstraintManager &CM =
C.getConstraintManager();
1039 SVal
V = getArgSVal(
Call, getArgNo());
1040 QualType T = Summary.getArgType(getArgNo());
1042 if (
auto N =
V.getAs<NonLoc>()) {
1043 auto ExcludeRangeFromArg = [&](
const llvm::APSInt &
Min,
1044 const llvm::APSInt &
Max) {
1046 return static_cast<bool>(State);
1050 applyOnRange(negateKind(Kind),
C.getSValBuilder().getBasicValueFactory(), T,
1051 ExcludeRangeFromArg);
1057void StdLibraryFunctionsChecker::RangeConstraint::describe(
1059 const Summary &Summary, llvm::raw_ostream &Out)
const {
1061 BasicValueFactory &BVF = getBVF(State);
1062 QualType T = Summary.getArgType(getArgNo());
1064 Out << ((DK == Violation) ?
"should be " :
"is ");
1065 if (!Description.empty()) {
1068 unsigned I = Ranges.size();
1069 if (Kind == WithinRange) {
1070 for (
const std::pair<RangeInt, RangeInt> &R : Ranges) {
1071 appendInsideRangeDesc(BVF.getValue(
R.first, T),
1072 BVF.getValue(
R.second, T), T, BVF, Out);
1077 for (
const std::pair<RangeInt, RangeInt> &R : Ranges) {
1078 appendOutOfRangeDesc(BVF.getValue(
R.first, T),
1079 BVF.getValue(
R.second, T), T, BVF, Out);
1087bool StdLibraryFunctionsChecker::RangeConstraint::describeArgumentValue(
1089 llvm::raw_ostream &Out)
const {
1090 unsigned int NRanges = 0;
1091 bool HaveAllRanges =
true;
1093 ProgramStateManager &Mgr = State->getStateManager();
1096 SVal
V = getArgSVal(
Call, getArgNo());
1098 if (
auto N =
V.getAs<NonLoc>()) {
1099 if (
const llvm::APSInt *Int = N->getAsInteger()) {
1104 QualType T = Summary.getArgType(getArgNo());
1105 SmallString<128> MoreInfo;
1106 llvm::raw_svector_ostream MoreInfoOs(MoreInfo);
1107 auto ApplyF = [&](
const llvm::APSInt &
Min,
const llvm::APSInt &
Max) {
1110 MoreInfoOs <<
" or ";
1111 appendInsideRangeDesc(
Min,
Max, T, BVF, MoreInfoOs);
1114 HaveAllRanges =
false;
1119 applyOnRange(Kind, BVF, T, ApplyF);
1120 assert(NRanges > 0);
1121 if (!HaveAllRanges || NRanges == 1) {
1130ProgramStateRef StdLibraryFunctionsChecker::ComparisonConstraint::apply(
1132 CheckerContext &
C)
const {
1134 ProgramStateManager &Mgr = State->getStateManager();
1137 QualType T = Summary.getArgType(getArgNo());
1138 SVal
V = getArgSVal(
Call, getArgNo());
1141 ArgNo OtherArg = getOtherArgNo();
1142 SVal OtherV = getArgSVal(
Call, OtherArg);
1143 QualType OtherT = Summary.getArgType(OtherArg);
1145 OtherV = SVB.
evalCast(OtherV, T, OtherT);
1146 if (
auto CompV = SVB.
evalBinOp(State, Op,
V, OtherV, CondT)
1147 .
getAs<DefinedOrUnknownSVal>())
1148 State = State->assume(*CompV,
true);
1154 CheckerContext &
C)
const {
1155 SVal
V = getArgSVal(
Call, getArgNo());
1159 DefinedOrUnknownSVal L =
V.castAs<DefinedOrUnknownSVal>();
1163 return State->assume(L, CannotBeNull);
1166void StdLibraryFunctionsChecker::NullnessConstraint::describe(
1168 const Summary &Summary, llvm::raw_ostream &Out)
const {
1169 assert(CannotBeNull &&
1170 "'describe' is not implemented when the value must be NULL");
1171 if (DK == Violation)
1172 Out <<
"should not be NULL";
1174 Out <<
"is not NULL";
1177bool StdLibraryFunctionsChecker::NullnessConstraint::describeArgumentValue(
1179 llvm::raw_ostream &Out)
const {
1180 assert(!CannotBeNull &&
"'describeArgumentValue' is not implemented when the "
1181 "value must be non-NULL");
1186ProgramStateRef StdLibraryFunctionsChecker::BufferNullnessConstraint::apply(
1188 CheckerContext &
C)
const {
1189 SVal
V = getArgSVal(
Call, getArgNo());
1192 DefinedOrUnknownSVal L =
V.
castAs<DefinedOrUnknownSVal>();
1196 std::optional<DefinedOrUnknownSVal> SizeArg1 =
1197 getArgSVal(
Call, SizeArg1N).getAs<DefinedOrUnknownSVal>();
1198 std::optional<DefinedOrUnknownSVal> SizeArg2;
1200 SizeArg2 = getArgSVal(
Call, *SizeArg2N).getAs<DefinedOrUnknownSVal>();
1202 auto IsArgZero = [State](std::optional<DefinedOrUnknownSVal> Val) {
1209 if (IsArgZero(SizeArg1) || IsArgZero(SizeArg2))
1212 return State->assume(L, CannotBeNull);
1215void StdLibraryFunctionsChecker::BufferNullnessConstraint::describe(
1217 const Summary &Summary, llvm::raw_ostream &Out)
const {
1218 assert(CannotBeNull &&
1219 "'describe' is not implemented when the buffer must be NULL");
1220 if (DK == Violation)
1221 Out <<
"should not be NULL";
1223 Out <<
"is not NULL";
1226bool StdLibraryFunctionsChecker::BufferNullnessConstraint::
1228 const Summary &Summary,
1229 llvm::raw_ostream &Out)
const {
1230 assert(!CannotBeNull &&
"'describeArgumentValue' is not implemented when the "
1231 "buffer must be non-NULL");
1236ProgramStateRef StdLibraryFunctionsChecker::BufferSizeConstraint::apply(
1238 CheckerContext &
C)
const {
1239 SValBuilder &SvalBuilder =
C.getSValBuilder();
1241 SVal BufV = getArgSVal(
Call, getArgNo());
1244 const SVal SizeV = [
this, &State, &
Call, &Summary, &SvalBuilder]() {
1246 return SVal(SvalBuilder.
makeIntVal(*ConcreteSize));
1248 assert(SizeArgN &&
"The constraint must be either a concrete value or "
1249 "encoded in an argument.");
1251 SVal SizeV = getArgSVal(
Call, *SizeArgN);
1253 if (SizeMultiplierArgN) {
1254 SVal SizeMulV = getArgSVal(
Call, *SizeMultiplierArgN);
1255 SizeV = SvalBuilder.
evalBinOp(State, BO_Mul, SizeV, SizeMulV,
1256 Summary.getArgType(*SizeArgN));
1264 SVal Feasible = SvalBuilder.
evalBinOp(State, Op, SizeV, BufDynSize,
1266 if (
auto F = Feasible.
getAs<DefinedOrUnknownSVal>())
1267 return State->assume(*F,
true);
1275 llvm_unreachable(
"Size argument or the dynamic size is Undefined");
1278void StdLibraryFunctionsChecker::BufferSizeConstraint::describe(
1280 const Summary &Summary, llvm::raw_ostream &Out)
const {
1281 Out << ((DK == Violation) ?
"should be " :
"is ");
1282 Out <<
"a buffer with size equal to or greater than ";
1284 Out << *ConcreteSize;
1285 }
else if (SizeArgN) {
1286 Out <<
"the value of the ";
1287 printArgDesc(*SizeArgN, Out);
1288 printArgValueInfo(*SizeArgN, State,
Call, Out);
1289 if (SizeMultiplierArgN) {
1290 Out <<
" times the ";
1291 printArgDesc(*SizeMultiplierArgN, Out);
1292 printArgValueInfo(*SizeMultiplierArgN, State,
Call, Out);
1297bool StdLibraryFunctionsChecker::BufferSizeConstraint::describeArgumentValue(
1299 llvm::raw_ostream &Out)
const {
1300 SVal BufV = getArgSVal(
Call, getArgNo());
1302 if (
const llvm::APSInt *Val =
1303 State->getStateManager().getSValBuilder().getKnownValue(State,
1305 Out <<
"is a buffer with size " << *Val;
1311void StdLibraryFunctionsChecker::checkPreCall(
const CallEvent &
Call,
1312 CheckerContext &
C)
const {
1313 std::optional<Summary> FoundSummary = findFunctionSummary(
Call,
C);
1317 const Summary &Summary = *FoundSummary;
1321 ExplodedNode *NewNode =
C.getPredecessor();
1322 for (
const ValueConstraintPtr &Constraint : Summary.getArgConstraints()) {
1323 ValueConstraintPtr NegatedConstraint = Constraint->negate();
1326 NegatedConstraint->apply(NewState,
Call, Summary,
C);
1328 if (FailureSt && !SuccessSt) {
1329 if (ExplodedNode *N =
C.generateErrorNode(State, NewNode))
1330 reportBug(
Call, N, Constraint.get(), NegatedConstraint.get(), Summary,
1339 NewState = SuccessSt;
1340 if (NewState != State) {
1341 SmallString<128> Msg;
1342 llvm::raw_svector_ostream Os(Msg);
1343 Os <<
"Assuming that the ";
1344 printArgDesc(Constraint->getArgNo(), Os);
1348 Constraint->describe(ValueConstraint::Assumption,
Call, NewState, Summary,
1350 const auto ArgSVal =
Call.getArgSVal(Constraint->getArgNo());
1351 NewNode =
C.addTransition(
1353 C.getNoteTag([Msg = std::move(Msg), ArgSVal](
1354 PathSensitiveBugReport &BR, llvm::raw_ostream &
OS) {
1355 if (BR.isInteresting(ArgSVal))
1362void StdLibraryFunctionsChecker::checkPostCall(
const CallEvent &
Call,
1363 CheckerContext &
C)
const {
1364 std::optional<Summary> FoundSummary = findFunctionSummary(
Call,
C);
1369 const Summary &Summary = *FoundSummary;
1371 ExplodedNode *Node =
C.getPredecessor();
1374 for (
const SummaryCase &Case : Summary.getCases()) {
1376 for (
const ValueConstraintPtr &Constraint : Case.getConstraints()) {
1377 NewState = Constraint->apply(NewState,
Call, Summary,
C);
1383 NewState = Case.getErrnoConstraint().apply(NewState,
Call, Summary,
C);
1394 ExplodedNode *Pred = Node;
1395 DeclarationName FunctionName =
1398 std::string ErrnoNote = Case.getErrnoConstraint().describe(
C);
1399 std::string CaseNote;
1400 if (Case.getNote().empty()) {
1401 if (!ErrnoNote.empty())
1403 llvm::formatv(
"After calling '{0}' {1}", FunctionName, ErrnoNote);
1408 llvm::formatv(
false, Case.getNote().str().c_str(), FunctionName);
1410 const SVal RV =
Call.getReturnValue();
1412 if (Summary.getInvalidationKd() == EvalCallAsPure) {
1415 if (!CaseNote.empty()) {
1416 const NoteTag *
Tag =
C.getNoteTag(
1417 [Node, CaseNote, RV](PathSensitiveBugReport &BR) -> std::string {
1432 Pred =
C.addTransition(NewState, Pred, Tag);
1435 if (!CaseNote.empty() || !ErrnoNote.empty()) {
1436 const NoteTag *
Tag =
1437 C.getNoteTag([CaseNote, ErrnoNote,
1438 RV](PathSensitiveBugReport &BR) -> std::string {
1445 std::optional<Loc> ErrnoLoc =
1447 bool ErrnoImportant = !ErrnoNote.empty() && ErrnoLoc &&
1449 if (ErrnoImportant) {
1451 if (CaseNote.empty())
1453 return llvm::formatv(
"{0}; {1}", CaseNote, ErrnoNote);
1460 Pred =
C.addTransition(NewState, Pred, Tag);
1465 if (Pred == Node && NewState != State)
1466 C.addTransition(NewState);
1470bool StdLibraryFunctionsChecker::evalCall(
const CallEvent &
Call,
1471 CheckerContext &
C)
const {
1472 std::optional<Summary> FoundSummary = findFunctionSummary(
Call,
C);
1476 const Summary &Summary = *FoundSummary;
1477 switch (Summary.getInvalidationKd()) {
1478 case EvalCallAsPure: {
1481 SVal
V =
C.getSValBuilder().conjureSymbolVal(
Call,
C.blockCount());
1482 State = State->BindExpr(CE,
C.getStackFrame(),
V);
1484 C.addTransition(State);
1493 llvm_unreachable(
"Unknown invalidation kind!");
1496bool StdLibraryFunctionsChecker::Signature::matches(
1497 const FunctionDecl *FD)
const {
1510 auto RemoveRestrict = [&FD](QualType T) {
1517 if (!isIrrelevant(RetTy)) {
1519 if (RetTy != FDRetTy)
1524 for (
auto [Idx, ArgTy] : llvm::enumerate(ArgTys)) {
1525 if (isIrrelevant(ArgTy))
1529 if (ArgTy != FDArgTy)
1536std::optional<StdLibraryFunctionsChecker::Summary>
1537StdLibraryFunctionsChecker::findFunctionSummary(
const FunctionDecl *FD,
1538 CheckerContext &
C)
const {
1540 return std::nullopt;
1542 initFunctionSummaries(
C);
1545 if (FSMI == FunctionSummaryMap.end())
1546 return std::nullopt;
1547 return FSMI->second;
1550std::optional<StdLibraryFunctionsChecker::Summary>
1551StdLibraryFunctionsChecker::findFunctionSummary(
const CallEvent &
Call,
1552 CheckerContext &
C)
const {
1553 const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(
Call.getDecl());
1555 return std::nullopt;
1556 return findFunctionSummary(FD,
C);
1559void StdLibraryFunctionsChecker::initFunctionSummaries(
1560 CheckerContext &
C)
const {
1561 if (SummariesInitialized)
1563 SummariesInitialized =
true;
1565 SValBuilder &SVB =
C.getSValBuilder();
1568 Preprocessor &PP =
C.getPreprocessor();
1572 const ASTContext &ACtx;
1575 LookupType(
const ASTContext &ACtx) : ACtx(ACtx) {}
1578 std::optional<QualType> operator()(StringRef Name) {
1579 IdentifierInfo &II = ACtx.
Idents.
get(Name);
1581 if (LookupRes.empty())
1582 return std::nullopt;
1589 for (Decl *D : LookupRes)
1590 if (
auto *TD = dyn_cast<TypedefNameDecl>(D))
1597 for (Decl *D : LookupRes)
1598 if (
auto *TD = dyn_cast<TypeDecl>(D))
1600 return std::nullopt;
1606 class GetRestrictTy {
1607 const ASTContext &ACtx;
1610 GetRestrictTy(
const ASTContext &ACtx) : ACtx(ACtx) {}
1611 QualType operator()(QualType Ty) {
1614 std::optional<QualType> operator()(std::optional<QualType> Ty) {
1616 return operator()(*Ty);
1617 return std::nullopt;
1619 } getRestrictTy(ACtx);
1620 class GetPointerTy {
1621 const ASTContext &ACtx;
1624 GetPointerTy(
const ASTContext &ACtx) : ACtx(ACtx) {}
1625 QualType operator()(QualType Ty) {
return ACtx.
getPointerType(Ty); }
1626 std::optional<QualType> operator()(std::optional<QualType> Ty) {
1628 return operator()(*Ty);
1629 return std::nullopt;
1631 } getPointerTy(ACtx);
1634 std::optional<QualType> operator()(std::optional<QualType> Ty) {
1635 return Ty ? std::optional<QualType>(Ty->withConst()) : std::nullopt;
1637 QualType operator()(QualType Ty) {
return Ty.
withConst(); }
1640 BasicValueFactory &BVF;
1643 GetMaxValue(BasicValueFactory &BVF) : BVF(BVF) {}
1644 std::optional<RangeInt> operator()(QualType Ty) {
1647 std::optional<RangeInt> operator()(std::optional<QualType> Ty) {
1649 return operator()(*Ty);
1651 return std::nullopt;
1662 const QualType VoidTy = ACtx.
VoidTy;
1663 const QualType CharTy = ACtx.
CharTy;
1664 const QualType WCharTy = ACtx.
WCharTy;
1665 const QualType IntTy = ACtx.
IntTy;
1667 const QualType LongTy = ACtx.
LongTy;
1670 const QualType VoidPtrTy = getPointerTy(VoidTy);
1671 const QualType IntPtrTy = getPointerTy(IntTy);
1672 const QualType UnsignedIntPtrTy =
1673 getPointerTy(UnsignedIntTy);
1674 const QualType VoidPtrRestrictTy = getRestrictTy(VoidPtrTy);
1675 const QualType ConstVoidPtrTy =
1676 getPointerTy(getConstTy(VoidTy));
1677 const QualType CharPtrTy = getPointerTy(CharTy);
1678 const QualType CharPtrRestrictTy = getRestrictTy(CharPtrTy);
1679 const QualType ConstCharPtrTy =
1680 getPointerTy(getConstTy(CharTy));
1681 const QualType ConstCharPtrRestrictTy = getRestrictTy(ConstCharPtrTy);
1682 const QualType Wchar_tPtrTy = getPointerTy(WCharTy);
1683 const QualType ConstWchar_tPtrTy =
1684 getPointerTy(getConstTy(WCharTy));
1685 const QualType ConstVoidPtrRestrictTy = getRestrictTy(ConstVoidPtrTy);
1686 const QualType SizePtrTy = getPointerTy(SizeTyCanonTy);
1687 const QualType SizePtrRestrictTy = getRestrictTy(SizePtrTy);
1689 const RangeInt IntMax = BVF.
getMaxValue(IntTy)->getLimitedValue();
1690 const RangeInt UnsignedIntMax =
1691 BVF.
getMaxValue(UnsignedIntTy)->getLimitedValue();
1692 const RangeInt LongMax = BVF.
getMaxValue(LongTy)->getLimitedValue();
1693 const RangeInt SizeMax = BVF.
getMaxValue(SizeTyCanonTy)->getLimitedValue();
1701 const RangeInt UCharRangeMax =
1711 struct AddToFunctionSummaryMap {
1712 const ASTContext &ACtx;
1713 FunctionSummaryMapType ⤅
1714 bool DisplayLoadedSummaries;
1715 AddToFunctionSummaryMap(
const ASTContext &ACtx, FunctionSummaryMapType &FSM,
1716 bool DisplayLoadedSummaries)
1717 : ACtx(ACtx), Map(FSM), DisplayLoadedSummaries(DisplayLoadedSummaries) {
1725 bool operator()(StringRef Name, Signature Sign, Summary Sum) {
1726 if (Sign.isInvalid())
1728 IdentifierInfo &II = ACtx.
Idents.
get(Name);
1730 if (LookupRes.empty())
1732 for (Decl *D : LookupRes) {
1733 if (
auto *FD = dyn_cast<FunctionDecl>(D)) {
1734 if (Sum.matchesAndSet(Sign, FD)) {
1736 assert(Res.second &&
"Function already has a summary set!");
1738 if (DisplayLoadedSummaries) {
1739 llvm::errs() <<
"Loaded summary for: ";
1740 FD->
print(llvm::errs());
1741 llvm::errs() <<
"\n";
1751 void operator()(ArrayRef<StringRef> Names, Signature Sign, Summary Sum) {
1752 for (StringRef Name : Names)
1753 operator()(Name, Sign, Sum);
1755 } addToFunctionSummaryMap(ACtx, FunctionSummaryMap, DisplayLoadedSummaries);
1758 auto ArgumentCondition = [](ArgNo ArgN, RangeKind
Kind, IntRangeVector Ranges,
1759 StringRef Desc =
"") {
1760 return std::make_shared<RangeConstraint>(ArgN, Kind, Ranges, Desc);
1762 auto BufferSize = [](
auto... Args) {
1763 return std::make_shared<BufferSizeConstraint>(Args...);
1766 auto operator()(RangeKind Kind, IntRangeVector Ranges) {
1767 return std::make_shared<RangeConstraint>(Ret, Kind, Ranges);
1770 return std::make_shared<ComparisonConstraint>(Ret, Op, OtherArgN);
1772 } ReturnValueCondition;
1774 auto operator()(RangeInt b, RangeInt e) {
1775 return IntRangeVector{std::pair<RangeInt, RangeInt>{b, e}};
1777 auto operator()(RangeInt b, std::optional<RangeInt> e) {
1779 return IntRangeVector{std::pair<RangeInt, RangeInt>{b, *e}};
1780 return IntRangeVector{};
1782 auto operator()(std::pair<RangeInt, RangeInt> i0,
1783 std::pair<RangeInt, std::optional<RangeInt>> i1) {
1785 return IntRangeVector{i0, {i1.first, *(i1.second)}};
1786 return IntRangeVector{i0};
1789 auto SingleValue = [](RangeInt v) {
1790 return IntRangeVector{std::pair<RangeInt, RangeInt>{v, v}};
1792 auto LessThanOrEq = BO_LE;
1793 auto NotNull = [&](ArgNo ArgN) {
1794 return std::make_shared<NullnessConstraint>(ArgN);
1796 auto IsNull = [&](ArgNo ArgN) {
1797 return std::make_shared<NullnessConstraint>(ArgN,
false);
1799 auto NotNullBuffer = [&](ArgNo ArgN, ArgNo SizeArg1N,
1800 std::optional<ArgNo> SizeArg2N = std::nullopt) {
1801 return std::make_shared<BufferNullnessConstraint>(ArgN, SizeArg1N,
1805 std::optional<QualType> FileTy = lookupTy(
"FILE");
1806 std::optional<QualType> FilePtrTy = getPointerTy(FileTy);
1807 std::optional<QualType> FilePtrRestrictTy = getRestrictTy(FilePtrTy);
1809 std::optional<QualType> FPosTTy = lookupTy(
"fpos_t");
1810 std::optional<QualType> FPosTPtrTy = getPointerTy(FPosTTy);
1811 std::optional<QualType> ConstFPosTPtrTy = getPointerTy(getConstTy(FPosTTy));
1812 std::optional<QualType> FPosTPtrRestrictTy = getRestrictTy(FPosTPtrTy);
1814 constexpr llvm::StringLiteral GenericSuccessMsg(
1815 "Assuming that '{0}' is successful");
1816 constexpr llvm::StringLiteral GenericFailureMsg(
"Assuming that '{0}' fails");
1833 addToFunctionSummaryMap(
1834 "isalnum", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1835 Summary(EvalCallAsPure)
1837 .Case({ArgumentCondition(0U, WithinRange,
1838 {{
'0',
'9'}, {
'A',
'Z'}, {
'a',
'z'}}),
1839 ReturnValueCondition(OutOfRange, SingleValue(0))},
1840 ErrnoIrrelevant,
"Assuming the character is alphanumeric")
1844 .Case({ArgumentCondition(0U, WithinRange, {{128, UCharRangeMax}})},
1849 {{
'0',
'9'}, {
'A',
'Z'}, {
'a',
'z'}, {128, UCharRangeMax}}),
1850 ReturnValueCondition(WithinRange, SingleValue(0))},
1851 ErrnoIrrelevant,
"Assuming the character is non-alphanumeric")
1852 .ArgConstraint(ArgumentCondition(0U, WithinRange,
1853 {{EOFv, EOFv}, {0, UCharRangeMax}},
1854 "an unsigned char value or EOF")));
1855 addToFunctionSummaryMap(
1856 "isalpha", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1857 Summary(EvalCallAsPure)
1858 .Case({ArgumentCondition(0U, WithinRange, {{
'A',
'Z'}, {
'a',
'z'}}),
1859 ReturnValueCondition(OutOfRange, SingleValue(0))},
1860 ErrnoIrrelevant,
"Assuming the character is alphabetical")
1862 .Case({ArgumentCondition(0U, WithinRange, {{128, UCharRangeMax}})},
1864 .Case({ArgumentCondition(
1866 {{
'A',
'Z'}, {
'a',
'z'}, {128, UCharRangeMax}}),
1867 ReturnValueCondition(WithinRange, SingleValue(0))},
1868 ErrnoIrrelevant,
"Assuming the character is non-alphabetical"));
1869 addToFunctionSummaryMap(
1870 "isascii", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1871 Summary(EvalCallAsPure)
1872 .Case({ArgumentCondition(0U, WithinRange,
Range(0, 127)),
1873 ReturnValueCondition(OutOfRange, SingleValue(0))},
1874 ErrnoIrrelevant,
"Assuming the character is an ASCII character")
1875 .Case({ArgumentCondition(0U, OutOfRange,
Range(0, 127)),
1876 ReturnValueCondition(WithinRange, SingleValue(0))},
1878 "Assuming the character is not an ASCII character"));
1879 addToFunctionSummaryMap(
1880 "isblank", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1881 Summary(EvalCallAsPure)
1882 .Case({ArgumentCondition(0U, WithinRange, {{
'\t',
'\t'}, {
' ',
' '}}),
1883 ReturnValueCondition(OutOfRange, SingleValue(0))},
1884 ErrnoIrrelevant,
"Assuming the character is a blank character")
1885 .Case({ArgumentCondition(0U, OutOfRange, {{
'\t',
'\t'}, {
' ',
' '}}),
1886 ReturnValueCondition(WithinRange, SingleValue(0))},
1888 "Assuming the character is not a blank character"));
1889 addToFunctionSummaryMap(
1890 "iscntrl", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1891 Summary(EvalCallAsPure)
1892 .Case({ArgumentCondition(0U, WithinRange, {{0, 32}, {127, 127}}),
1893 ReturnValueCondition(OutOfRange, SingleValue(0))},
1895 "Assuming the character is a control character")
1896 .Case({ArgumentCondition(0U, OutOfRange, {{0, 32}, {127, 127}}),
1897 ReturnValueCondition(WithinRange, SingleValue(0))},
1899 "Assuming the character is not a control character"));
1900 addToFunctionSummaryMap(
1901 "isdigit", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1902 Summary(EvalCallAsPure)
1903 .Case({ArgumentCondition(0U, WithinRange,
Range(
'0',
'9')),
1904 ReturnValueCondition(OutOfRange, SingleValue(0))},
1905 ErrnoIrrelevant,
"Assuming the character is a digit")
1906 .Case({ArgumentCondition(0U, OutOfRange,
Range(
'0',
'9')),
1907 ReturnValueCondition(WithinRange, SingleValue(0))},
1908 ErrnoIrrelevant,
"Assuming the character is not a digit"));
1909 addToFunctionSummaryMap(
1910 "isgraph", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1911 Summary(EvalCallAsPure)
1912 .Case({ArgumentCondition(0U, WithinRange,
Range(33, 126)),
1913 ReturnValueCondition(OutOfRange, SingleValue(0))},
1915 "Assuming the character has graphical representation")
1917 {ArgumentCondition(0U, OutOfRange,
Range(33, 126)),
1918 ReturnValueCondition(WithinRange, SingleValue(0))},
1920 "Assuming the character does not have graphical representation"));
1921 addToFunctionSummaryMap(
1922 "islower", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1923 Summary(EvalCallAsPure)
1925 .Case({ArgumentCondition(0U, WithinRange,
Range(
'a',
'z')),
1926 ReturnValueCondition(OutOfRange, SingleValue(0))},
1927 ErrnoIrrelevant,
"Assuming the character is a lowercase letter")
1929 .Case({ArgumentCondition(0U, WithinRange,
Range(0, 127)),
1930 ArgumentCondition(0U, OutOfRange,
Range(
'a',
'z')),
1931 ReturnValueCondition(WithinRange, SingleValue(0))},
1933 "Assuming the character is not a lowercase letter")
1935 .Case({ArgumentCondition(0U, WithinRange, {{128, UCharRangeMax}})},
1938 .Case({ArgumentCondition(0U, OutOfRange,
Range(0, UCharRangeMax)),
1939 ReturnValueCondition(WithinRange, SingleValue(0))},
1941 addToFunctionSummaryMap(
1942 "isprint", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1943 Summary(EvalCallAsPure)
1944 .Case({ArgumentCondition(0U, WithinRange,
Range(32, 126)),
1945 ReturnValueCondition(OutOfRange, SingleValue(0))},
1946 ErrnoIrrelevant,
"Assuming the character is printable")
1947 .Case({ArgumentCondition(0U, OutOfRange,
Range(32, 126)),
1948 ReturnValueCondition(WithinRange, SingleValue(0))},
1949 ErrnoIrrelevant,
"Assuming the character is non-printable"));
1950 addToFunctionSummaryMap(
1951 "ispunct", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1952 Summary(EvalCallAsPure)
1953 .Case({ArgumentCondition(
1955 {{
'!',
'/'}, {
':',
'@'}, {
'[',
'`'}, {
'{',
'~'}}),
1956 ReturnValueCondition(OutOfRange, SingleValue(0))},
1957 ErrnoIrrelevant,
"Assuming the character is a punctuation mark")
1958 .Case({ArgumentCondition(
1960 {{
'!',
'/'}, {
':',
'@'}, {
'[',
'`'}, {
'{',
'~'}}),
1961 ReturnValueCondition(WithinRange, SingleValue(0))},
1963 "Assuming the character is not a punctuation mark"));
1964 addToFunctionSummaryMap(
1965 "isspace", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1966 Summary(EvalCallAsPure)
1968 .Case({ArgumentCondition(0U, WithinRange, {{9, 13}, {
' ',
' '}}),
1969 ReturnValueCondition(OutOfRange, SingleValue(0))},
1971 "Assuming the character is a whitespace character")
1973 .Case({ArgumentCondition(0U, WithinRange, {{128, UCharRangeMax}})},
1975 .Case({ArgumentCondition(0U, OutOfRange,
1976 {{9, 13}, {
' ',
' '}, {128, UCharRangeMax}}),
1977 ReturnValueCondition(WithinRange, SingleValue(0))},
1979 "Assuming the character is not a whitespace character"));
1980 addToFunctionSummaryMap(
1981 "isupper", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1982 Summary(EvalCallAsPure)
1984 .Case({ArgumentCondition(0U, WithinRange,
Range(
'A',
'Z')),
1985 ReturnValueCondition(OutOfRange, SingleValue(0))},
1987 "Assuming the character is an uppercase letter")
1989 .Case({ArgumentCondition(0U, WithinRange, {{128, UCharRangeMax}})},
1992 .Case({ArgumentCondition(0U, OutOfRange,
1993 {{
'A',
'Z'}, {128, UCharRangeMax}}),
1994 ReturnValueCondition(WithinRange, SingleValue(0))},
1996 "Assuming the character is not an uppercase letter"));
1997 addToFunctionSummaryMap(
1998 "isxdigit", Signature(ArgTypes{IntTy}, RetType{IntTy}),
1999 Summary(EvalCallAsPure)
2000 .Case({ArgumentCondition(0U, WithinRange,
2001 {{
'0',
'9'}, {
'A',
'F'}, {
'a',
'f'}}),
2002 ReturnValueCondition(OutOfRange, SingleValue(0))},
2004 "Assuming the character is a hexadecimal digit")
2005 .Case({ArgumentCondition(0U, OutOfRange,
2006 {{
'0',
'9'}, {
'A',
'F'}, {
'a',
'f'}}),
2007 ReturnValueCondition(WithinRange, SingleValue(0))},
2009 "Assuming the character is not a hexadecimal digit"));
2010 addToFunctionSummaryMap(
2011 "toupper", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2012 Summary(EvalCallAsPure)
2013 .ArgConstraint(ArgumentCondition(0U, WithinRange,
2014 {{EOFv, EOFv}, {0, UCharRangeMax}},
2015 "an unsigned char value or EOF")));
2016 addToFunctionSummaryMap(
2017 "tolower", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2018 Summary(EvalCallAsPure)
2019 .ArgConstraint(ArgumentCondition(0U, WithinRange,
2020 {{EOFv, EOFv}, {0, UCharRangeMax}},
2021 "an unsigned char value or EOF")));
2022 addToFunctionSummaryMap(
2023 "toascii", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2024 Summary(EvalCallAsPure)
2025 .ArgConstraint(ArgumentCondition(0U, WithinRange,
2026 {{EOFv, EOFv}, {0, UCharRangeMax}},
2027 "an unsigned char value or EOF")));
2029 addToFunctionSummaryMap(
2030 "getchar", Signature(ArgTypes{}, RetType{IntTy}),
2032 .Case({ReturnValueCondition(WithinRange,
2033 {{EOFv, EOFv}, {0, UCharRangeMax}})},
2039 .Case({ArgumentCondition(1U, WithinRange,
Range(1, SizeMax)),
2040 ArgumentCondition(2U, WithinRange,
Range(1, SizeMax)),
2041 ReturnValueCondition(BO_LT, ArgNo(2)),
2042 ReturnValueCondition(WithinRange,
Range(0, SizeMax))},
2043 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2044 .Case({ArgumentCondition(1U, WithinRange,
Range(1, SizeMax)),
2045 ReturnValueCondition(BO_EQ, ArgNo(2)),
2046 ReturnValueCondition(WithinRange,
Range(0, SizeMax))},
2047 ErrnoMustNotBeChecked, GenericSuccessMsg)
2048 .Case({ArgumentCondition(1U, WithinRange, SingleValue(0)),
2049 ReturnValueCondition(WithinRange, SingleValue(0))},
2050 ErrnoMustNotBeChecked,
2051 "Assuming that argument 'size' to '{0}' is 0")
2052 .ArgConstraint(NotNullBuffer(ArgNo(0), ArgNo(1), ArgNo(2)))
2053 .ArgConstraint(NotNull(ArgNo(3)))
2054 .ArgConstraint(BufferSize(ArgNo(0), ArgNo(1),
2059 addToFunctionSummaryMap(
"fread",
2060 Signature(ArgTypes{VoidPtrRestrictTy, SizeTyCanonTy,
2061 SizeTyCanonTy, FilePtrRestrictTy},
2062 RetType{SizeTyCanonTy}),
2066 addToFunctionSummaryMap(
2068 Signature(ArgTypes{ConstVoidPtrRestrictTy, SizeTyCanonTy, SizeTyCanonTy,
2070 RetType{SizeTyCanonTy}),
2073 std::optional<QualType> Ssize_tTy = lookupTy(
"ssize_t");
2074 std::optional<RangeInt> Ssize_tMax = getMaxValue(Ssize_tTy);
2078 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
2079 ReturnValueCondition(WithinRange,
Range(-1, Ssize_tMax))},
2085 addToFunctionSummaryMap(
2087 Signature(ArgTypes{IntTy, VoidPtrTy, SizeTyCanonTy}, RetType{Ssize_tTy}),
2090 addToFunctionSummaryMap(
2092 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTyCanonTy},
2093 RetType{Ssize_tTy}),
2096 auto GetLineSummary =
2098 .Case({ReturnValueCondition(WithinRange,
2099 Range({-1, -1}, {1, Ssize_tMax}))},
2102 QualType CharPtrPtrRestrictTy = getRestrictTy(getPointerTy(CharPtrTy));
2109 addToFunctionSummaryMap(
2112 ArgTypes{CharPtrPtrRestrictTy, SizePtrRestrictTy, FilePtrRestrictTy},
2113 RetType{Ssize_tTy}),
2117 addToFunctionSummaryMap(
2119 Signature(ArgTypes{CharPtrPtrRestrictTy, SizePtrRestrictTy, IntTy,
2121 RetType{Ssize_tTy}),
2125 Summary GetenvSummary =
2127 .ArgConstraint(NotNull(ArgNo(0)))
2128 .Case({NotNull(Ret)}, ErrnoIrrelevant,
2129 "Assuming the environment variable exists");
2131 if (!ShouldAssumeControlledEnvironment)
2132 GetenvSummary.Case({NotNull(Ret)->negate()}, ErrnoIrrelevant,
2133 "Assuming the environment variable does not exist");
2136 addToFunctionSummaryMap(
2137 "getenv", Signature(ArgTypes{ConstCharPtrTy}, RetType{CharPtrTy}),
2138 std::move(GetenvSummary));
2144 addToFunctionSummaryMap(
2145 {
"getc",
"fgetc"}, Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2147 .Case({ReturnValueCondition(WithinRange,
2148 {{EOFv, EOFv}, {0, UCharRangeMax}})},
2150 .ArgConstraint(NotNull(ArgNo(0))));
2152 const auto ReturnsZero =
2153 ConstraintSet{ReturnValueCondition(WithinRange, SingleValue(0))};
2154 const auto ReturnsMinusOne =
2155 ConstraintSet{ReturnValueCondition(WithinRange, SingleValue(-1))};
2156 const auto ReturnsEOF =
2157 ConstraintSet{ReturnValueCondition(WithinRange, SingleValue(EOFv))};
2158 const auto ReturnsNonnegative =
2159 ConstraintSet{ReturnValueCondition(WithinRange,
Range(0, IntMax))};
2160 const auto ReturnsNonZero =
2161 ConstraintSet{ReturnValueCondition(OutOfRange, SingleValue(0))};
2162 const auto &ReturnsValidFileDescriptor = ReturnsNonnegative;
2164 auto ValidFileDescriptorOrAtFdcwd = [&](ArgNo ArgN) {
2165 return std::make_shared<RangeConstraint>(
2166 ArgN, WithinRange,
Range({AT_FDCWDv, AT_FDCWDv}, {0, IntMax}),
2167 "a valid file descriptor or AT_FDCWD");
2171 addToFunctionSummaryMap(
2173 Signature(ArgTypes{ConstCharPtrRestrictTy, ConstCharPtrRestrictTy},
2174 RetType{FilePtrTy}),
2176 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2177 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2178 .ArgConstraint(NotNull(ArgNo(0)))
2179 .ArgConstraint(NotNull(ArgNo(1))));
2182 addToFunctionSummaryMap(
2184 Signature(ArgTypes{IntTy, ConstCharPtrTy}, RetType{FilePtrTy}),
2186 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2187 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2188 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
2189 .ArgConstraint(NotNull(ArgNo(1))));
2192 addToFunctionSummaryMap(
2193 "tmpfile", Signature(ArgTypes{}, RetType{FilePtrTy}),
2195 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2196 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg));
2200 addToFunctionSummaryMap(
2202 Signature(ArgTypes{ConstCharPtrRestrictTy, ConstCharPtrRestrictTy,
2204 RetType{FilePtrTy}),
2206 .Case({ReturnValueCondition(BO_EQ, ArgNo(2))},
2207 ErrnoMustNotBeChecked, GenericSuccessMsg)
2208 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2209 .ArgConstraint(NotNull(ArgNo(1)))
2210 .ArgConstraint(NotNull(ArgNo(2))));
2213 addToFunctionSummaryMap(
2215 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy}, RetType{FilePtrTy}),
2217 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2218 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2219 .ArgConstraint(NotNull(ArgNo(0)))
2220 .ArgConstraint(NotNull(ArgNo(1))));
2223 addToFunctionSummaryMap(
2224 "fclose", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2226 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2227 .Case(ReturnsEOF, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2228 .ArgConstraint(NotNull(ArgNo(0))));
2231 addToFunctionSummaryMap(
2232 "pclose", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2234 .Case({ReturnValueCondition(WithinRange, {{0, IntMax}})},
2235 ErrnoMustNotBeChecked, GenericSuccessMsg)
2236 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2237 .ArgConstraint(NotNull(ArgNo(0))));
2239 std::optional<QualType> Off_tTy = lookupTy(
"off_t");
2240 std::optional<RangeInt> Off_tMax = getMaxValue(Off_tTy);
2244 addToFunctionSummaryMap(
2245 {
"getc",
"fgetc"}, Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2247 .Case({ReturnValueCondition(WithinRange, {{0, UCharRangeMax}})},
2248 ErrnoMustNotBeChecked, GenericSuccessMsg)
2249 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv))},
2250 ErrnoIrrelevant, GenericFailureMsg)
2251 .ArgConstraint(NotNull(ArgNo(0))));
2255 addToFunctionSummaryMap(
2257 Signature(ArgTypes{IntTy, FilePtrTy}, RetType{IntTy}),
2259 .Case({ArgumentCondition(0, WithinRange,
Range(0, UCharRangeMax)),
2260 ReturnValueCondition(BO_EQ, ArgNo(0))},
2261 ErrnoMustNotBeChecked, GenericSuccessMsg)
2262 .Case({ArgumentCondition(0, OutOfRange,
Range(0, UCharRangeMax)),
2263 ReturnValueCondition(WithinRange,
Range(0, UCharRangeMax))},
2264 ErrnoMustNotBeChecked, GenericSuccessMsg)
2265 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv))},
2266 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2267 .ArgConstraint(NotNull(ArgNo(1))));
2270 addToFunctionSummaryMap(
2272 Signature(ArgTypes{CharPtrRestrictTy, IntTy, FilePtrRestrictTy},
2273 RetType{CharPtrTy}),
2275 .Case({NotNull(Ret), ReturnValueCondition(BO_EQ, ArgNo(0))},
2276 ErrnoMustNotBeChecked, GenericSuccessMsg)
2277 .Case({
IsNull(Ret)}, ErrnoIrrelevant, GenericFailureMsg)
2278 .ArgConstraint(NotNull(ArgNo(0)))
2279 .ArgConstraint(ArgumentCondition(1, WithinRange,
Range(0, IntMax)))
2281 BufferSize(ArgNo(0), ArgNo(1)))
2282 .ArgConstraint(NotNull(ArgNo(2))));
2285 addToFunctionSummaryMap(
2287 Signature(ArgTypes{ConstCharPtrRestrictTy, FilePtrRestrictTy},
2290 .Case(ReturnsNonnegative, ErrnoMustNotBeChecked, GenericSuccessMsg)
2291 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv))},
2292 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2293 .ArgConstraint(NotNull(ArgNo(0)))
2294 .ArgConstraint(NotNull(ArgNo(1))));
2297 addToFunctionSummaryMap(
2298 "ungetc", Signature(ArgTypes{IntTy, FilePtrTy}, RetType{IntTy}),
2300 .Case({ReturnValueCondition(BO_EQ, ArgNo(0)),
2301 ArgumentCondition(0, WithinRange, {{0, UCharRangeMax}})},
2302 ErrnoMustNotBeChecked, GenericSuccessMsg)
2303 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv)),
2304 ArgumentCondition(0, WithinRange, SingleValue(EOFv))},
2305 ErrnoNEZeroIrrelevant,
2306 "Assuming that 'ungetc' fails because EOF was passed as "
2308 .Case({ReturnValueCondition(WithinRange, SingleValue(EOFv)),
2309 ArgumentCondition(0, WithinRange, {{0, UCharRangeMax}})},
2310 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2311 .ArgConstraint(ArgumentCondition(
2312 0, WithinRange, {{EOFv, EOFv}, {0, UCharRangeMax}}))
2313 .ArgConstraint(NotNull(ArgNo(1))));
2319 addToFunctionSummaryMap(
2320 "fseek", Signature(ArgTypes{FilePtrTy, LongTy, IntTy}, RetType{IntTy}),
2322 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2323 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2324 .ArgConstraint(NotNull(ArgNo(0)))
2325 .ArgConstraint(ArgumentCondition(2, WithinRange, {{0, 2}})));
2328 addToFunctionSummaryMap(
2330 Signature(ArgTypes{FilePtrTy, Off_tTy, IntTy}, RetType{IntTy}),
2332 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2333 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2334 .ArgConstraint(NotNull(ArgNo(0)))
2335 .ArgConstraint(ArgumentCondition(2, WithinRange, {{0, 2}})));
2341 addToFunctionSummaryMap(
2343 Signature(ArgTypes{FilePtrRestrictTy, FPosTPtrRestrictTy},
2346 .Case(ReturnsZero, ErrnoUnchanged, GenericSuccessMsg)
2347 .Case(ReturnsNonZero, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2348 .ArgConstraint(NotNull(ArgNo(0)))
2349 .ArgConstraint(NotNull(ArgNo(1))));
2355 addToFunctionSummaryMap(
2357 Signature(ArgTypes{FilePtrTy, ConstFPosTPtrTy}, RetType{IntTy}),
2359 .Case(ReturnsZero, ErrnoUnchanged, GenericSuccessMsg)
2360 .Case(ReturnsNonZero, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2361 .ArgConstraint(NotNull(ArgNo(0)))
2362 .ArgConstraint(NotNull(ArgNo(1))));
2365 addToFunctionSummaryMap(
2366 "fflush", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2368 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2369 .Case(ReturnsEOF, ErrnoNEZeroIrrelevant, GenericFailureMsg));
2375 addToFunctionSummaryMap(
2376 "ftell", Signature(ArgTypes{FilePtrTy}, RetType{LongTy}),
2378 .Case({ReturnValueCondition(WithinRange,
Range(0, LongMax))},
2379 ErrnoUnchanged, GenericSuccessMsg)
2380 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2381 .ArgConstraint(NotNull(ArgNo(0))));
2384 addToFunctionSummaryMap(
2385 "ftello", Signature(ArgTypes{FilePtrTy}, RetType{Off_tTy}),
2387 .Case({ReturnValueCondition(WithinRange,
Range(0, Off_tMax))},
2388 ErrnoMustNotBeChecked, GenericSuccessMsg)
2389 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2390 .ArgConstraint(NotNull(ArgNo(0))));
2398 addToFunctionSummaryMap(
2399 "fileno", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2401 .Case(ReturnsValidFileDescriptor, ErrnoUnchanged, GenericSuccessMsg)
2402 .ArgConstraint(NotNull(ArgNo(0))));
2406 addToFunctionSummaryMap(
"rewind",
2407 Signature(ArgTypes{FilePtrTy}, RetType{VoidTy}),
2409 .Case({}, ErrnoMustBeChecked)
2410 .ArgConstraint(NotNull(ArgNo(0))));
2413 addToFunctionSummaryMap(
2414 "clearerr", Signature(ArgTypes{FilePtrTy}, RetType{VoidTy}),
2415 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2418 addToFunctionSummaryMap(
2419 "feof", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2420 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2423 addToFunctionSummaryMap(
2424 "ferror", Signature(ArgTypes{FilePtrTy}, RetType{IntTy}),
2425 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2428 addToFunctionSummaryMap(
2429 "a64l", Signature(ArgTypes{ConstCharPtrTy}, RetType{LongTy}),
2430 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2433 addToFunctionSummaryMap(
"l64a",
2434 Signature(ArgTypes{LongTy}, RetType{CharPtrTy}),
2436 .ArgConstraint(ArgumentCondition(
2437 0, WithinRange,
Range(0, LongMax))));
2440 addToFunctionSummaryMap(
2441 "open", Signature(ArgTypes{ConstCharPtrTy, IntTy}, RetType{IntTy}),
2443 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2445 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2446 .ArgConstraint(NotNull(ArgNo(0))));
2449 addToFunctionSummaryMap(
2451 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy}, RetType{IntTy}),
2453 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2455 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2456 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2457 .ArgConstraint(NotNull(ArgNo(1))));
2460 addToFunctionSummaryMap(
2461 "access", Signature(ArgTypes{ConstCharPtrTy, IntTy}, RetType{IntTy}),
2463 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2464 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2465 .ArgConstraint(NotNull(ArgNo(0))));
2468 addToFunctionSummaryMap(
2470 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy, IntTy},
2473 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2474 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2475 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2476 .ArgConstraint(NotNull(ArgNo(1))));
2479 addToFunctionSummaryMap(
2480 "dup", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2482 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2484 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2486 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2489 addToFunctionSummaryMap(
2490 "dup2", Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
2492 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2494 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2495 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
2497 ArgumentCondition(1, WithinRange,
Range(0, IntMax))));
2500 addToFunctionSummaryMap(
2501 "fdatasync", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2503 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2504 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2506 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2509 addToFunctionSummaryMap(
2511 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy, IntTy},
2514 .ArgConstraint(NotNull(ArgNo(0)))
2515 .ArgConstraint(NotNull(ArgNo(1))));
2518 addToFunctionSummaryMap(
2519 "fsync", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2521 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2522 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2524 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2527 addToFunctionSummaryMap(
2529 Signature(ArgTypes{ConstCharPtrTy, Off_tTy}, RetType{IntTy}),
2531 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2532 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2533 .ArgConstraint(NotNull(ArgNo(0))));
2536 addToFunctionSummaryMap(
2538 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy}, RetType{IntTy}),
2540 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2541 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2542 .ArgConstraint(NotNull(ArgNo(0)))
2543 .ArgConstraint(NotNull(ArgNo(1))));
2546 addToFunctionSummaryMap(
2548 Signature(ArgTypes{ConstCharPtrTy, IntTy, ConstCharPtrTy},
2551 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2552 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2553 .ArgConstraint(NotNull(ArgNo(0)))
2554 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(1)))
2555 .ArgConstraint(NotNull(ArgNo(2))));
2558 addToFunctionSummaryMap(
2559 "lockf", Signature(ArgTypes{IntTy, IntTy, Off_tTy}, RetType{IntTy}),
2561 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2562 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2564 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2566 std::optional<QualType> Mode_tTy = lookupTy(
"mode_t");
2569 addToFunctionSummaryMap(
2570 "creat", Signature(ArgTypes{ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2572 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2574 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2575 .ArgConstraint(NotNull(ArgNo(0))));
2578 addToFunctionSummaryMap(
2579 "sleep", Signature(ArgTypes{UnsignedIntTy}, RetType{UnsignedIntTy}),
2582 ArgumentCondition(0, WithinRange,
Range(0, UnsignedIntMax))));
2584 std::optional<QualType> DirTy = lookupTy(
"DIR");
2585 std::optional<QualType> DirPtrTy = getPointerTy(DirTy);
2588 addToFunctionSummaryMap(
2589 "dirfd", Signature(ArgTypes{DirPtrTy}, RetType{IntTy}),
2591 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2593 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2594 .ArgConstraint(NotNull(ArgNo(0))));
2597 addToFunctionSummaryMap(
2598 "alarm", Signature(ArgTypes{UnsignedIntTy}, RetType{UnsignedIntTy}),
2601 ArgumentCondition(0, WithinRange,
Range(0, UnsignedIntMax))));
2604 addToFunctionSummaryMap(
2605 "closedir", Signature(ArgTypes{DirPtrTy}, RetType{IntTy}),
2607 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2608 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2609 .ArgConstraint(NotNull(ArgNo(0))));
2612 addToFunctionSummaryMap(
2613 "strdup", Signature(ArgTypes{ConstCharPtrTy}, RetType{CharPtrTy}),
2614 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2617 addToFunctionSummaryMap(
2619 Signature(ArgTypes{ConstCharPtrTy, SizeTyCanonTy}, RetType{CharPtrTy}),
2621 .ArgConstraint(NotNull(ArgNo(0)))
2623 ArgumentCondition(1, WithinRange,
Range(0, SizeMax))));
2626 addToFunctionSummaryMap(
2627 "wcsdup", Signature(ArgTypes{ConstWchar_tPtrTy}, RetType{Wchar_tPtrTy}),
2628 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2631 addToFunctionSummaryMap(
2632 "mkstemp", Signature(ArgTypes{CharPtrTy}, RetType{IntTy}),
2634 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
2636 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2637 .ArgConstraint(NotNull(ArgNo(0))));
2640 addToFunctionSummaryMap(
2641 "mkdtemp", Signature(ArgTypes{CharPtrTy}, RetType{CharPtrTy}),
2643 .Case({NotNull(Ret), ReturnValueCondition(BO_EQ, ArgNo(0))},
2644 ErrnoMustNotBeChecked, GenericSuccessMsg)
2645 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2646 .ArgConstraint(NotNull(ArgNo(0))));
2649 addToFunctionSummaryMap(
2651 Signature(ArgTypes{CharPtrTy, SizeTyCanonTy}, RetType{CharPtrTy}),
2654 ArgumentCondition(1, WithinRange,
Range(1, SizeMax)),
2655 ReturnValueCondition(BO_EQ, ArgNo(0)), NotNull(Ret)},
2656 ErrnoMustNotBeChecked, GenericSuccessMsg)
2658 ArgumentCondition(1, WithinRange, SingleValue(0)),
2660 ErrnoNEZeroIrrelevant,
"Assuming that argument 'size' is 0")
2662 ArgumentCondition(1, WithinRange,
Range(1, SizeMax)),
2664 ErrnoNEZeroIrrelevant, GenericFailureMsg)
2665 .Case({
IsNull(0), NotNull(Ret)}, ErrnoMustNotBeChecked,
2670 BufferSize( ArgNo(0), ArgNo(1)))
2672 ArgumentCondition(1, WithinRange,
Range(0, SizeMax))));
2675 addToFunctionSummaryMap(
2676 "mkdir", Signature(ArgTypes{ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2678 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2679 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2680 .ArgConstraint(NotNull(ArgNo(0))));
2683 addToFunctionSummaryMap(
2685 Signature(ArgTypes{IntTy, ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2687 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2688 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2689 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2690 .ArgConstraint(NotNull(ArgNo(1))));
2692 std::optional<QualType> Dev_tTy = lookupTy(
"dev_t");
2695 addToFunctionSummaryMap(
2697 Signature(ArgTypes{ConstCharPtrTy, Mode_tTy, Dev_tTy}, RetType{IntTy}),
2699 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2700 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2701 .ArgConstraint(NotNull(ArgNo(0))));
2704 addToFunctionSummaryMap(
2706 Signature(ArgTypes{IntTy, ConstCharPtrTy, Mode_tTy, Dev_tTy},
2709 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2710 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2711 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2712 .ArgConstraint(NotNull(ArgNo(1))));
2715 addToFunctionSummaryMap(
2716 "chmod", Signature(ArgTypes{ConstCharPtrTy, Mode_tTy}, RetType{IntTy}),
2718 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2719 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2720 .ArgConstraint(NotNull(ArgNo(0))));
2723 addToFunctionSummaryMap(
2725 Signature(ArgTypes{IntTy, ConstCharPtrTy, Mode_tTy, IntTy},
2728 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2729 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2730 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2731 .ArgConstraint(NotNull(ArgNo(1))));
2734 addToFunctionSummaryMap(
2735 "fchmod", Signature(ArgTypes{IntTy, Mode_tTy}, RetType{IntTy}),
2737 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2738 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2740 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2742 std::optional<QualType> Uid_tTy = lookupTy(
"uid_t");
2743 std::optional<QualType> Gid_tTy = lookupTy(
"gid_t");
2747 addToFunctionSummaryMap(
2749 Signature(ArgTypes{IntTy, ConstCharPtrTy, Uid_tTy, Gid_tTy, IntTy},
2752 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2753 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2754 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2755 .ArgConstraint(NotNull(ArgNo(1))));
2758 addToFunctionSummaryMap(
2760 Signature(ArgTypes{ConstCharPtrTy, Uid_tTy, Gid_tTy}, RetType{IntTy}),
2762 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2763 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2764 .ArgConstraint(NotNull(ArgNo(0))));
2767 addToFunctionSummaryMap(
2769 Signature(ArgTypes{ConstCharPtrTy, Uid_tTy, Gid_tTy}, RetType{IntTy}),
2771 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2772 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2773 .ArgConstraint(NotNull(ArgNo(0))));
2776 addToFunctionSummaryMap(
2777 "fchown", Signature(ArgTypes{IntTy, Uid_tTy, Gid_tTy}, RetType{IntTy}),
2779 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2780 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2782 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2785 addToFunctionSummaryMap(
2786 "rmdir", Signature(ArgTypes{ConstCharPtrTy}, RetType{IntTy}),
2788 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2789 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2790 .ArgConstraint(NotNull(ArgNo(0))));
2793 addToFunctionSummaryMap(
2794 "chdir", Signature(ArgTypes{ConstCharPtrTy}, RetType{IntTy}),
2796 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2797 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2798 .ArgConstraint(NotNull(ArgNo(0))));
2801 addToFunctionSummaryMap(
2803 Signature(ArgTypes{ConstCharPtrTy, ConstCharPtrTy}, RetType{IntTy}),
2805 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2806 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2807 .ArgConstraint(NotNull(ArgNo(0)))
2808 .ArgConstraint(NotNull(ArgNo(1))));
2812 addToFunctionSummaryMap(
2814 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy, ConstCharPtrTy, IntTy},
2817 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2818 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2819 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2820 .ArgConstraint(NotNull(ArgNo(1)))
2821 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(2)))
2822 .ArgConstraint(NotNull(ArgNo(3))));
2825 addToFunctionSummaryMap(
2826 "unlink", Signature(ArgTypes{ConstCharPtrTy}, RetType{IntTy}),
2828 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2829 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2830 .ArgConstraint(NotNull(ArgNo(0))));
2833 addToFunctionSummaryMap(
2835 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy}, RetType{IntTy}),
2837 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2838 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2839 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2840 .ArgConstraint(NotNull(ArgNo(1))));
2842 std::optional<QualType> StructStatTy = lookupTy(
"stat");
2843 std::optional<QualType> StructStatPtrTy = getPointerTy(StructStatTy);
2844 std::optional<QualType> StructStatPtrRestrictTy =
2845 getRestrictTy(StructStatPtrTy);
2848 addToFunctionSummaryMap(
2849 "fstat", Signature(ArgTypes{IntTy, StructStatPtrTy}, RetType{IntTy}),
2851 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2852 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2853 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
2854 .ArgConstraint(NotNull(ArgNo(1))));
2857 addToFunctionSummaryMap(
2859 Signature(ArgTypes{ConstCharPtrRestrictTy, StructStatPtrRestrictTy},
2862 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2863 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2864 .ArgConstraint(NotNull(ArgNo(0)))
2865 .ArgConstraint(NotNull(ArgNo(1))));
2868 addToFunctionSummaryMap(
2870 Signature(ArgTypes{ConstCharPtrRestrictTy, StructStatPtrRestrictTy},
2873 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2874 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2875 .ArgConstraint(NotNull(ArgNo(0)))
2876 .ArgConstraint(NotNull(ArgNo(1))));
2880 addToFunctionSummaryMap(
2882 Signature(ArgTypes{IntTy, ConstCharPtrRestrictTy,
2883 StructStatPtrRestrictTy, IntTy},
2886 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2887 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2888 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
2889 .ArgConstraint(NotNull(ArgNo(1)))
2890 .ArgConstraint(NotNull(ArgNo(2))));
2893 addToFunctionSummaryMap(
2894 "opendir", Signature(ArgTypes{ConstCharPtrTy}, RetType{DirPtrTy}),
2896 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2897 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2898 .ArgConstraint(NotNull(ArgNo(0))));
2901 addToFunctionSummaryMap(
2902 "fdopendir", Signature(ArgTypes{IntTy}, RetType{DirPtrTy}),
2904 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
2905 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2907 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2910 addToFunctionSummaryMap(
2911 "isatty", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2913 .Case({ReturnValueCondition(WithinRange,
Range(0, 1))},
2916 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
2919 addToFunctionSummaryMap(
2920 "close", Signature(ArgTypes{IntTy}, RetType{IntTy}),
2922 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2923 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2925 ArgumentCondition(0, WithinRange,
Range(-1, IntMax))));
2928 addToFunctionSummaryMap(
"fpathconf",
2929 Signature(ArgTypes{IntTy, IntTy}, RetType{LongTy}),
2931 .ArgConstraint(ArgumentCondition(
2932 0, WithinRange,
Range(0, IntMax))));
2935 addToFunctionSummaryMap(
2936 "pathconf", Signature(ArgTypes{ConstCharPtrTy, IntTy}, RetType{LongTy}),
2937 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2940 addToFunctionSummaryMap(
2941 "rewinddir", Signature(ArgTypes{DirPtrTy}, RetType{VoidTy}),
2942 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2945 addToFunctionSummaryMap(
2946 "seekdir", Signature(ArgTypes{DirPtrTy, LongTy}, RetType{VoidTy}),
2947 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2950 addToFunctionSummaryMap(
2951 "rand_r", Signature(ArgTypes{UnsignedIntPtrTy}, RetType{IntTy}),
2952 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
2957 addToFunctionSummaryMap(
2960 ArgTypes{VoidPtrTy, SizeTyCanonTy, IntTy, IntTy, IntTy, Off_tTy},
2961 RetType{VoidPtrTy}),
2963 .ArgConstraint(ArgumentCondition(1, WithinRange,
Range(1, SizeMax)))
2965 ArgumentCondition(4, WithinRange,
Range(-1, IntMax))));
2967 std::optional<QualType> Off64_tTy = lookupTy(
"off64_t");
2971 addToFunctionSummaryMap(
2974 ArgTypes{VoidPtrTy, SizeTyCanonTy, IntTy, IntTy, IntTy, Off64_tTy},
2975 RetType{VoidPtrTy}),
2977 .ArgConstraint(ArgumentCondition(1, WithinRange,
Range(1, SizeMax)))
2979 ArgumentCondition(4, WithinRange,
Range(-1, IntMax))));
2982 addToFunctionSummaryMap(
2983 "pipe", Signature(ArgTypes{IntPtrTy}, RetType{IntTy}),
2985 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
2986 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
2987 .ArgConstraint(NotNull(ArgNo(0))));
2994 addToFunctionSummaryMap(
2995 "lseek", Signature(ArgTypes{IntTy, Off_tTy, IntTy}, RetType{Off_tTy}),
2997 .Case(ReturnsNonnegative, ErrnoIrrelevant)
2998 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3000 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3004 addToFunctionSummaryMap(
3007 ArgTypes{ConstCharPtrRestrictTy, CharPtrRestrictTy, SizeTyCanonTy},
3008 RetType{Ssize_tTy}),
3010 .Case({ArgumentCondition(2, WithinRange,
Range(1, IntMax)),
3011 ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3012 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3013 ErrnoMustNotBeChecked, GenericSuccessMsg)
3014 .Case({ArgumentCondition(2, WithinRange, SingleValue(0)),
3015 ReturnValueCondition(WithinRange, SingleValue(0))},
3016 ErrnoMustNotBeChecked,
3017 "Assuming that argument 'bufsize' is 0")
3018 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3019 .ArgConstraint(NotNull(ArgNo(0)))
3020 .ArgConstraint(NotNull(ArgNo(1)))
3021 .ArgConstraint(BufferSize(ArgNo(1),
3024 ArgumentCondition(2, WithinRange,
Range(0, SizeMax))));
3028 addToFunctionSummaryMap(
3030 Signature(ArgTypes{IntTy, ConstCharPtrRestrictTy, CharPtrRestrictTy,
3032 RetType{Ssize_tTy}),
3034 .Case({ArgumentCondition(3, WithinRange,
Range(1, IntMax)),
3035 ReturnValueCondition(LessThanOrEq, ArgNo(3)),
3036 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3037 ErrnoMustNotBeChecked, GenericSuccessMsg)
3038 .Case({ArgumentCondition(3, WithinRange, SingleValue(0)),
3039 ReturnValueCondition(WithinRange, SingleValue(0))},
3040 ErrnoMustNotBeChecked,
3041 "Assuming that argument 'bufsize' is 0")
3042 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3043 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
3044 .ArgConstraint(NotNull(ArgNo(1)))
3045 .ArgConstraint(NotNull(ArgNo(2)))
3046 .ArgConstraint(BufferSize(ArgNo(2),
3049 ArgumentCondition(3, WithinRange,
Range(0, SizeMax))));
3053 addToFunctionSummaryMap(
3055 Signature(ArgTypes{IntTy, ConstCharPtrTy, IntTy, ConstCharPtrTy},
3058 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3059 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3060 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(0)))
3061 .ArgConstraint(NotNull(ArgNo(1)))
3062 .ArgConstraint(ValidFileDescriptorOrAtFdcwd(ArgNo(2)))
3063 .ArgConstraint(NotNull(ArgNo(3))));
3069 addToFunctionSummaryMap(
3071 Signature(ArgTypes{ConstCharPtrRestrictTy, CharPtrRestrictTy},
3072 RetType{CharPtrTy}),
3074 .Case({NotNull(Ret)}, ErrnoMustNotBeChecked, GenericSuccessMsg)
3075 .Case({
IsNull(Ret)}, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3076 .ArgConstraint(NotNull(ArgNo(0))));
3078 QualType CharPtrConstPtr = getPointerTy(getConstTy(CharPtrTy));
3081 addToFunctionSummaryMap(
3083 Signature(ArgTypes{ConstCharPtrTy, CharPtrConstPtr}, RetType{IntTy}),
3085 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant)
3086 .ArgConstraint(NotNull(ArgNo(0))));
3089 addToFunctionSummaryMap(
3091 Signature(ArgTypes{ConstCharPtrTy, CharPtrConstPtr}, RetType{IntTy}),
3093 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant)
3094 .ArgConstraint(NotNull(ArgNo(0))));
3097 addToFunctionSummaryMap(
3099 Signature(ArgTypes{IntTy, CharPtrConstPtr, ConstCharPtrTy},
3102 .Case({ReturnValueCondition(WithinRange,
Range(-1, UCharRangeMax))},
3104 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3105 .ArgConstraint(NotNull(ArgNo(1)))
3106 .ArgConstraint(NotNull(ArgNo(2))));
3108 std::optional<QualType> StructSockaddrTy = lookupTy(
"sockaddr");
3109 std::optional<QualType> StructSockaddrPtrTy =
3110 getPointerTy(StructSockaddrTy);
3111 std::optional<QualType> ConstStructSockaddrPtrTy =
3112 getPointerTy(getConstTy(StructSockaddrTy));
3113 std::optional<QualType> StructSockaddrPtrRestrictTy =
3114 getRestrictTy(StructSockaddrPtrTy);
3115 std::optional<QualType> ConstStructSockaddrPtrRestrictTy =
3116 getRestrictTy(ConstStructSockaddrPtrTy);
3117 std::optional<QualType> Socklen_tTy = lookupTy(
"socklen_t");
3118 std::optional<QualType> Socklen_tPtrTy = getPointerTy(Socklen_tTy);
3119 std::optional<QualType> Socklen_tPtrRestrictTy =
3120 getRestrictTy(Socklen_tPtrTy);
3121 std::optional<RangeInt> Socklen_tMax = getMaxValue(Socklen_tTy);
3131 addToFunctionSummaryMap(
3132 "socket", Signature(ArgTypes{IntTy, IntTy, IntTy}, RetType{IntTy}),
3134 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
3136 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg));
3140 .Case(ReturnsValidFileDescriptor, ErrnoMustNotBeChecked,
3142 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3143 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)));
3144 if (!addToFunctionSummaryMap(
3148 Signature(ArgTypes{IntTy, StructSockaddrPtrRestrictTy,
3149 Socklen_tPtrRestrictTy},
3152 addToFunctionSummaryMap(
3154 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tPtrRestrictTy},
3160 if (!addToFunctionSummaryMap(
3162 Signature(ArgTypes{IntTy, ConstStructSockaddrPtrTy, Socklen_tTy},
3165 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3166 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3168 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3169 .ArgConstraint(NotNull(ArgNo(1)))
3171 BufferSize(ArgNo(1), ArgNo(2)))
3173 ArgumentCondition(2, WithinRange,
Range(0, Socklen_tMax)))))
3175 addToFunctionSummaryMap(
3177 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tTy}, RetType{IntTy}),
3179 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3180 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3182 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3184 ArgumentCondition(2, WithinRange,
Range(0, Socklen_tMax))));
3188 if (!addToFunctionSummaryMap(
3190 Signature(ArgTypes{IntTy, StructSockaddrPtrRestrictTy,
3191 Socklen_tPtrRestrictTy},
3194 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3195 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3197 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3198 .ArgConstraint(NotNull(ArgNo(1)))
3199 .ArgConstraint(NotNull(ArgNo(2)))))
3200 addToFunctionSummaryMap(
3202 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tPtrRestrictTy},
3205 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3206 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3208 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3212 if (!addToFunctionSummaryMap(
3214 Signature(ArgTypes{IntTy, StructSockaddrPtrRestrictTy,
3215 Socklen_tPtrRestrictTy},
3218 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3219 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3221 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3222 .ArgConstraint(NotNull(ArgNo(1)))
3223 .ArgConstraint(NotNull(ArgNo(2)))))
3224 addToFunctionSummaryMap(
3226 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tPtrRestrictTy},
3229 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3230 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3232 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3236 if (!addToFunctionSummaryMap(
3238 Signature(ArgTypes{IntTy, ConstStructSockaddrPtrTy, Socklen_tTy},
3241 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3242 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3244 ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3245 .ArgConstraint(NotNull(ArgNo(1)))))
3246 addToFunctionSummaryMap(
3248 Signature(ArgTypes{IntTy,
Irrelevant, Socklen_tTy}, RetType{IntTy}),
3250 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3251 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3253 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3257 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3258 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3259 ErrnoMustNotBeChecked, GenericSuccessMsg)
3260 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3261 ArgumentCondition(2, WithinRange, SingleValue(0))},
3262 ErrnoMustNotBeChecked, GenericSuccessMsg)
3263 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3264 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3265 .ArgConstraint(BufferSize(ArgNo(1),
3267 if (!addToFunctionSummaryMap(
3273 Signature(ArgTypes{IntTy, VoidPtrRestrictTy, SizeTyCanonTy, IntTy,
3274 StructSockaddrPtrRestrictTy,
3275 Socklen_tPtrRestrictTy},
3276 RetType{Ssize_tTy}),
3278 addToFunctionSummaryMap(
3280 Signature(ArgTypes{IntTy, VoidPtrRestrictTy, SizeTyCanonTy, IntTy,
3282 RetType{Ssize_tTy}),
3287 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3288 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3289 ErrnoMustNotBeChecked, GenericSuccessMsg)
3290 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3291 ArgumentCondition(2, WithinRange, SingleValue(0))},
3292 ErrnoMustNotBeChecked, GenericSuccessMsg)
3293 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3294 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3295 .ArgConstraint(BufferSize(ArgNo(1),
3297 if (!addToFunctionSummaryMap(
3302 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTyCanonTy, IntTy,
3303 ConstStructSockaddrPtrTy, Socklen_tTy},
3304 RetType{Ssize_tTy}),
3306 addToFunctionSummaryMap(
3308 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTyCanonTy, IntTy,
3310 RetType{Ssize_tTy}),
3314 addToFunctionSummaryMap(
3315 "listen", Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
3317 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3318 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3320 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3323 addToFunctionSummaryMap(
3325 Signature(ArgTypes{IntTy, VoidPtrTy, SizeTyCanonTy, IntTy},
3326 RetType{Ssize_tTy}),
3328 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3329 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3330 ErrnoMustNotBeChecked, GenericSuccessMsg)
3331 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3332 ArgumentCondition(2, WithinRange, SingleValue(0))},
3333 ErrnoMustNotBeChecked, GenericSuccessMsg)
3334 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3335 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3336 .ArgConstraint(BufferSize(ArgNo(1),
3339 std::optional<QualType> StructMsghdrTy = lookupTy(
"msghdr");
3340 std::optional<QualType> StructMsghdrPtrTy = getPointerTy(StructMsghdrTy);
3341 std::optional<QualType> ConstStructMsghdrPtrTy =
3342 getPointerTy(getConstTy(StructMsghdrTy));
3345 addToFunctionSummaryMap(
3347 Signature(ArgTypes{IntTy, StructMsghdrPtrTy, IntTy},
3348 RetType{Ssize_tTy}),
3350 .Case({ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3351 ErrnoMustNotBeChecked, GenericSuccessMsg)
3352 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3354 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3357 addToFunctionSummaryMap(
3359 Signature(ArgTypes{IntTy, ConstStructMsghdrPtrTy, IntTy},
3360 RetType{Ssize_tTy}),
3362 .Case({ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3363 ErrnoMustNotBeChecked, GenericSuccessMsg)
3364 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3366 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3370 addToFunctionSummaryMap(
3372 Signature(ArgTypes{IntTy, IntTy, IntTy, ConstVoidPtrTy, Socklen_tTy},
3375 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3376 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3377 .ArgConstraint(NotNullBuffer(ArgNo(3), ArgNo(4)))
3379 BufferSize(ArgNo(3), ArgNo(4)))
3381 ArgumentCondition(4, WithinRange,
Range(0, Socklen_tMax))));
3386 addToFunctionSummaryMap(
3388 Signature(ArgTypes{IntTy, IntTy, IntTy, VoidPtrRestrictTy,
3389 Socklen_tPtrRestrictTy},
3392 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3393 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3394 .ArgConstraint(NotNull(ArgNo(3)))
3395 .ArgConstraint(NotNull(ArgNo(4))));
3398 addToFunctionSummaryMap(
3400 Signature(ArgTypes{IntTy, ConstVoidPtrTy, SizeTyCanonTy, IntTy},
3401 RetType{Ssize_tTy}),
3403 .Case({ReturnValueCondition(LessThanOrEq, ArgNo(2)),
3404 ReturnValueCondition(WithinRange,
Range(1, Ssize_tMax))},
3405 ErrnoMustNotBeChecked, GenericSuccessMsg)
3406 .Case({ReturnValueCondition(WithinRange, SingleValue(0)),
3407 ArgumentCondition(2, WithinRange, SingleValue(0))},
3408 ErrnoMustNotBeChecked, GenericSuccessMsg)
3409 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3410 .ArgConstraint(ArgumentCondition(0, WithinRange,
Range(0, IntMax)))
3411 .ArgConstraint(BufferSize(ArgNo(1),
3415 addToFunctionSummaryMap(
3417 Signature(ArgTypes{IntTy, IntTy, IntTy, IntPtrTy}, RetType{IntTy}),
3419 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3420 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3421 .ArgConstraint(NotNull(ArgNo(3))));
3424 addToFunctionSummaryMap(
3425 "shutdown", Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
3427 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3428 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3430 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3439 addToFunctionSummaryMap(
3441 Signature(ArgTypes{ConstStructSockaddrPtrRestrictTy, Socklen_tTy,
3442 CharPtrRestrictTy, Socklen_tTy, CharPtrRestrictTy,
3443 Socklen_tTy, IntTy},
3447 BufferSize(ArgNo(0), ArgNo(1)))
3449 ArgumentCondition(1, WithinRange,
Range(0, Socklen_tMax)))
3451 BufferSize(ArgNo(2), ArgNo(3)))
3453 ArgumentCondition(3, WithinRange,
Range(0, Socklen_tMax)))
3455 BufferSize(ArgNo(4), ArgNo(5)))
3457 ArgumentCondition(5, WithinRange,
Range(0, Socklen_tMax))));
3459 std::optional<QualType> StructUtimbufTy = lookupTy(
"utimbuf");
3460 std::optional<QualType> StructUtimbufPtrTy = getPointerTy(StructUtimbufTy);
3463 addToFunctionSummaryMap(
3465 Signature(ArgTypes{ConstCharPtrTy, StructUtimbufPtrTy}, RetType{IntTy}),
3467 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3468 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3469 .ArgConstraint(NotNull(ArgNo(0))));
3471 std::optional<QualType> StructTimespecTy = lookupTy(
"timespec");
3472 std::optional<QualType> StructTimespecPtrTy =
3473 getPointerTy(StructTimespecTy);
3474 std::optional<QualType> ConstStructTimespecPtrTy =
3475 getPointerTy(getConstTy(StructTimespecTy));
3478 addToFunctionSummaryMap(
3480 Signature(ArgTypes{IntTy, ConstStructTimespecPtrTy}, RetType{IntTy}),
3482 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3483 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3485 ArgumentCondition(0, WithinRange,
Range(0, IntMax))));
3489 addToFunctionSummaryMap(
3492 ArgTypes{IntTy, ConstCharPtrTy, ConstStructTimespecPtrTy, IntTy},
3495 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3496 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3497 .ArgConstraint(NotNull(ArgNo(1))));
3499 std::optional<QualType> StructTimevalTy = lookupTy(
"timeval");
3500 std::optional<QualType> ConstStructTimevalPtrTy =
3501 getPointerTy(getConstTy(StructTimevalTy));
3504 addToFunctionSummaryMap(
3506 Signature(ArgTypes{ConstCharPtrTy, ConstStructTimevalPtrTy},
3509 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3510 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3511 .ArgConstraint(NotNull(ArgNo(0))));
3514 addToFunctionSummaryMap(
3516 Signature(ArgTypes{ConstStructTimespecPtrTy, StructTimespecPtrTy},
3519 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3520 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3521 .ArgConstraint(NotNull(ArgNo(0))));
3523 std::optional<QualType> Time_tTy = lookupTy(
"time_t");
3524 std::optional<QualType> ConstTime_tPtrTy =
3525 getPointerTy(getConstTy(Time_tTy));
3526 std::optional<QualType> ConstTime_tPtrRestrictTy =
3527 getRestrictTy(ConstTime_tPtrTy);
3529 std::optional<QualType> StructTmTy = lookupTy(
"tm");
3530 std::optional<QualType> StructTmPtrTy = getPointerTy(StructTmTy);
3531 std::optional<QualType> StructTmPtrRestrictTy =
3532 getRestrictTy(StructTmPtrTy);
3533 std::optional<QualType> ConstStructTmPtrTy =
3534 getPointerTy(getConstTy(StructTmTy));
3535 std::optional<QualType> ConstStructTmPtrRestrictTy =
3536 getRestrictTy(ConstStructTmPtrTy);
3539 addToFunctionSummaryMap(
3541 Signature(ArgTypes{ConstTime_tPtrTy}, RetType{StructTmPtrTy}),
3542 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3546 addToFunctionSummaryMap(
3548 Signature(ArgTypes{ConstTime_tPtrRestrictTy, StructTmPtrRestrictTy},
3549 RetType{StructTmPtrTy}),
3551 .ArgConstraint(NotNull(ArgNo(0)))
3552 .ArgConstraint(NotNull(ArgNo(1))));
3555 addToFunctionSummaryMap(
3557 Signature(ArgTypes{ConstStructTmPtrRestrictTy, CharPtrRestrictTy},
3558 RetType{CharPtrTy}),
3560 .ArgConstraint(NotNull(ArgNo(0)))
3561 .ArgConstraint(NotNull(ArgNo(1)))
3562 .ArgConstraint(BufferSize(ArgNo(1),
3563 BVF.getValue(26, IntTy))));
3566 addToFunctionSummaryMap(
3568 Signature(ArgTypes{ConstTime_tPtrTy, CharPtrTy}, RetType{CharPtrTy}),
3570 .ArgConstraint(NotNull(ArgNo(0)))
3571 .ArgConstraint(NotNull(ArgNo(1)))
3572 .ArgConstraint(BufferSize(
3574 BVF.getValue(26, IntTy))));
3578 addToFunctionSummaryMap(
3580 Signature(ArgTypes{ConstTime_tPtrRestrictTy, StructTmPtrRestrictTy},
3581 RetType{StructTmPtrTy}),
3583 .ArgConstraint(NotNull(ArgNo(0)))
3584 .ArgConstraint(NotNull(ArgNo(1))));
3587 addToFunctionSummaryMap(
3588 "gmtime", Signature(ArgTypes{ConstTime_tPtrTy}, RetType{StructTmPtrTy}),
3589 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3591 std::optional<QualType> Clockid_tTy = lookupTy(
"clockid_t");
3594 addToFunctionSummaryMap(
3596 Signature(ArgTypes{Clockid_tTy, StructTimespecPtrTy}, RetType{IntTy}),
3598 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3599 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3600 .ArgConstraint(NotNull(ArgNo(1))));
3602 std::optional<QualType> StructItimervalTy = lookupTy(
"itimerval");
3603 std::optional<QualType> StructItimervalPtrTy =
3604 getPointerTy(StructItimervalTy);
3607 addToFunctionSummaryMap(
3609 Signature(ArgTypes{IntTy, StructItimervalPtrTy}, RetType{IntTy}),
3611 .Case(ReturnsZero, ErrnoMustNotBeChecked, GenericSuccessMsg)
3612 .Case(ReturnsMinusOne, ErrnoNEZeroIrrelevant, GenericFailureMsg)
3613 .ArgConstraint(NotNull(ArgNo(1))));
3615 std::optional<QualType> Pthread_cond_tTy = lookupTy(
"pthread_cond_t");
3616 std::optional<QualType> Pthread_cond_tPtrTy =
3617 getPointerTy(Pthread_cond_tTy);
3618 std::optional<QualType> Pthread_tTy = lookupTy(
"pthread_t");
3619 std::optional<QualType> Pthread_tPtrTy = getPointerTy(Pthread_tTy);
3620 std::optional<QualType> Pthread_tPtrRestrictTy =
3621 getRestrictTy(Pthread_tPtrTy);
3622 std::optional<QualType> Pthread_mutex_tTy = lookupTy(
"pthread_mutex_t");
3623 std::optional<QualType> Pthread_mutex_tPtrTy =
3624 getPointerTy(Pthread_mutex_tTy);
3625 std::optional<QualType> Pthread_mutex_tPtrRestrictTy =
3626 getRestrictTy(Pthread_mutex_tPtrTy);
3627 std::optional<QualType> Pthread_attr_tTy = lookupTy(
"pthread_attr_t");
3628 std::optional<QualType> Pthread_attr_tPtrTy =
3629 getPointerTy(Pthread_attr_tTy);
3630 std::optional<QualType> ConstPthread_attr_tPtrTy =
3631 getPointerTy(getConstTy(Pthread_attr_tTy));
3632 std::optional<QualType> ConstPthread_attr_tPtrRestrictTy =
3633 getRestrictTy(ConstPthread_attr_tPtrTy);
3634 std::optional<QualType> Pthread_mutexattr_tTy =
3635 lookupTy(
"pthread_mutexattr_t");
3636 std::optional<QualType> ConstPthread_mutexattr_tPtrTy =
3637 getPointerTy(getConstTy(Pthread_mutexattr_tTy));
3638 std::optional<QualType> ConstPthread_mutexattr_tPtrRestrictTy =
3639 getRestrictTy(ConstPthread_mutexattr_tPtrTy);
3641 QualType PthreadStartRoutineTy = getPointerTy(
3643 FunctionProtoType::ExtProtoInfo()));
3647 addToFunctionSummaryMap(
3648 {
"pthread_cond_signal",
"pthread_cond_broadcast"},
3649 Signature(ArgTypes{Pthread_cond_tPtrTy}, RetType{IntTy}),
3650 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3655 addToFunctionSummaryMap(
3657 Signature(ArgTypes{Pthread_tPtrRestrictTy,
3658 ConstPthread_attr_tPtrRestrictTy,
3659 PthreadStartRoutineTy, VoidPtrRestrictTy},
3662 .ArgConstraint(NotNull(ArgNo(0)))
3663 .ArgConstraint(NotNull(ArgNo(2))));
3667 addToFunctionSummaryMap(
3668 {
"pthread_attr_destroy",
"pthread_attr_init"},
3669 Signature(ArgTypes{Pthread_attr_tPtrTy}, RetType{IntTy}),
3670 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3676 addToFunctionSummaryMap(
3677 {
"pthread_attr_getstacksize",
"pthread_attr_getguardsize"},
3678 Signature(ArgTypes{ConstPthread_attr_tPtrRestrictTy, SizePtrRestrictTy},
3681 .ArgConstraint(NotNull(ArgNo(0)))
3682 .ArgConstraint(NotNull(ArgNo(1))));
3686 addToFunctionSummaryMap(
3687 {
"pthread_attr_setstacksize",
"pthread_attr_setguardsize"},
3688 Signature(ArgTypes{Pthread_attr_tPtrTy, SizeTyCanonTy}, RetType{IntTy}),
3690 .ArgConstraint(NotNull(ArgNo(0)))
3692 ArgumentCondition(1, WithinRange,
Range(0, SizeMax))));
3696 addToFunctionSummaryMap(
3697 "pthread_mutex_init",
3698 Signature(ArgTypes{Pthread_mutex_tPtrRestrictTy,
3699 ConstPthread_mutexattr_tPtrRestrictTy},
3701 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3707 addToFunctionSummaryMap(
3708 {
"pthread_mutex_destroy",
"pthread_mutex_lock",
"pthread_mutex_trylock",
3709 "pthread_mutex_unlock"},
3710 Signature(ArgTypes{Pthread_mutex_tPtrTy}, RetType{IntTy}),
3711 Summary(NoEvalCall).ArgConstraint(NotNull(ArgNo(0))));
3715 if (AddTestFunctions) {
3716 const RangeInt IntMin = BVF.
getMinValue(IntTy)->getLimitedValue();
3718 addToFunctionSummaryMap(
3719 "__not_null", Signature(ArgTypes{IntPtrTy}, RetType{IntTy}),
3720 Summary(EvalCallAsPure).ArgConstraint(NotNull(ArgNo(0))));
3722 addToFunctionSummaryMap(
3723 "__not_null_buffer",
3724 Signature(ArgTypes{VoidPtrTy, IntTy, IntTy}, RetType{IntTy}),
3725 Summary(EvalCallAsPure)
3726 .ArgConstraint(NotNullBuffer(ArgNo(0), ArgNo(1), ArgNo(2))));
3729 addToFunctionSummaryMap(
3730 "__single_val_0", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3731 Summary(EvalCallAsPure)
3732 .ArgConstraint(ArgumentCondition(0U, WithinRange, SingleValue(0))));
3733 addToFunctionSummaryMap(
3734 "__single_val_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3735 Summary(EvalCallAsPure)
3736 .ArgConstraint(ArgumentCondition(0U, WithinRange, SingleValue(1))));
3737 addToFunctionSummaryMap(
3738 "__range_1_2", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3739 Summary(EvalCallAsPure)
3740 .ArgConstraint(ArgumentCondition(0U, WithinRange,
Range(1, 2))));
3741 addToFunctionSummaryMap(
3742 "__range_m1_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3743 Summary(EvalCallAsPure)
3744 .ArgConstraint(ArgumentCondition(0U, WithinRange,
Range(-1, 1))));
3745 addToFunctionSummaryMap(
3746 "__range_m2_m1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3747 Summary(EvalCallAsPure)
3748 .ArgConstraint(ArgumentCondition(0U, WithinRange,
Range(-2, -1))));
3749 addToFunctionSummaryMap(
3750 "__range_m10_10", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3751 Summary(EvalCallAsPure)
3752 .ArgConstraint(ArgumentCondition(0U, WithinRange,
Range(-10, 10))));
3753 addToFunctionSummaryMap(
"__range_m1_inf",
3754 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3755 Summary(EvalCallAsPure)
3756 .ArgConstraint(ArgumentCondition(
3757 0U, WithinRange,
Range(-1, IntMax))));
3758 addToFunctionSummaryMap(
"__range_0_inf",
3759 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3760 Summary(EvalCallAsPure)
3761 .ArgConstraint(ArgumentCondition(
3762 0U, WithinRange,
Range(0, IntMax))));
3763 addToFunctionSummaryMap(
"__range_1_inf",
3764 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3765 Summary(EvalCallAsPure)
3766 .ArgConstraint(ArgumentCondition(
3767 0U, WithinRange,
Range(1, IntMax))));
3768 addToFunctionSummaryMap(
"__range_minf_m1",
3769 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3770 Summary(EvalCallAsPure)
3771 .ArgConstraint(ArgumentCondition(
3772 0U, WithinRange,
Range(IntMin, -1))));
3773 addToFunctionSummaryMap(
"__range_minf_0",
3774 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3775 Summary(EvalCallAsPure)
3776 .ArgConstraint(ArgumentCondition(
3777 0U, WithinRange,
Range(IntMin, 0))));
3778 addToFunctionSummaryMap(
"__range_minf_1",
3779 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3780 Summary(EvalCallAsPure)
3781 .ArgConstraint(ArgumentCondition(
3782 0U, WithinRange,
Range(IntMin, 1))));
3783 addToFunctionSummaryMap(
"__range_1_2__4_6",
3784 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3785 Summary(EvalCallAsPure)
3786 .ArgConstraint(ArgumentCondition(
3787 0U, WithinRange,
Range({1, 2}, {4, 6}))));
3788 addToFunctionSummaryMap(
3789 "__range_1_2__4_inf", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3790 Summary(EvalCallAsPure)
3791 .ArgConstraint(ArgumentCondition(0U, WithinRange,
3792 Range({1, 2}, {4, IntMax}))));
3795 addToFunctionSummaryMap(
3796 "__single_val_out_0", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3797 Summary(EvalCallAsPure)
3798 .ArgConstraint(ArgumentCondition(0U, OutOfRange, SingleValue(0))));
3799 addToFunctionSummaryMap(
3800 "__single_val_out_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3801 Summary(EvalCallAsPure)
3802 .ArgConstraint(ArgumentCondition(0U, OutOfRange, SingleValue(1))));
3803 addToFunctionSummaryMap(
3804 "__range_out_1_2", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3805 Summary(EvalCallAsPure)
3806 .ArgConstraint(ArgumentCondition(0U, OutOfRange,
Range(1, 2))));
3807 addToFunctionSummaryMap(
3808 "__range_out_m1_1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3809 Summary(EvalCallAsPure)
3810 .ArgConstraint(ArgumentCondition(0U, OutOfRange,
Range(-1, 1))));
3811 addToFunctionSummaryMap(
3812 "__range_out_m2_m1", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3813 Summary(EvalCallAsPure)
3814 .ArgConstraint(ArgumentCondition(0U, OutOfRange,
Range(-2, -1))));
3815 addToFunctionSummaryMap(
3816 "__range_out_m10_10", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3817 Summary(EvalCallAsPure)
3818 .ArgConstraint(ArgumentCondition(0U, OutOfRange,
Range(-10, 10))));
3819 addToFunctionSummaryMap(
"__range_out_m1_inf",
3820 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3821 Summary(EvalCallAsPure)
3822 .ArgConstraint(ArgumentCondition(
3823 0U, OutOfRange,
Range(-1, IntMax))));
3824 addToFunctionSummaryMap(
"__range_out_0_inf",
3825 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3826 Summary(EvalCallAsPure)
3827 .ArgConstraint(ArgumentCondition(
3828 0U, OutOfRange,
Range(0, IntMax))));
3829 addToFunctionSummaryMap(
"__range_out_1_inf",
3830 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3831 Summary(EvalCallAsPure)
3832 .ArgConstraint(ArgumentCondition(
3833 0U, OutOfRange,
Range(1, IntMax))));
3834 addToFunctionSummaryMap(
"__range_out_minf_m1",
3835 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3836 Summary(EvalCallAsPure)
3837 .ArgConstraint(ArgumentCondition(
3838 0U, OutOfRange,
Range(IntMin, -1))));
3839 addToFunctionSummaryMap(
"__range_out_minf_0",
3840 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3841 Summary(EvalCallAsPure)
3842 .ArgConstraint(ArgumentCondition(
3843 0U, OutOfRange,
Range(IntMin, 0))));
3844 addToFunctionSummaryMap(
"__range_out_minf_1",
3845 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3846 Summary(EvalCallAsPure)
3847 .ArgConstraint(ArgumentCondition(
3848 0U, OutOfRange,
Range(IntMin, 1))));
3849 addToFunctionSummaryMap(
"__range_out_1_2__4_6",
3850 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3851 Summary(EvalCallAsPure)
3852 .ArgConstraint(ArgumentCondition(
3853 0U, OutOfRange,
Range({1, 2}, {4, 6}))));
3854 addToFunctionSummaryMap(
3855 "__range_out_1_2__4_inf", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3856 Summary(EvalCallAsPure)
3858 ArgumentCondition(0U, OutOfRange,
Range({1, 2}, {4, IntMax}))));
3861 addToFunctionSummaryMap(
3862 "__within", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3863 Summary(EvalCallAsPure)
3864 .ArgConstraint(ArgumentCondition(0U, WithinRange, SingleValue(1))));
3865 addToFunctionSummaryMap(
3866 "__out_of", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3867 Summary(EvalCallAsPure)
3868 .ArgConstraint(ArgumentCondition(0U, OutOfRange, SingleValue(1))));
3870 addToFunctionSummaryMap(
3871 "__two_constrained_args",
3872 Signature(ArgTypes{IntTy, IntTy}, RetType{IntTy}),
3873 Summary(EvalCallAsPure)
3874 .ArgConstraint(ArgumentCondition(0U, WithinRange, SingleValue(1)))
3875 .ArgConstraint(ArgumentCondition(1U, WithinRange, SingleValue(1))));
3876 addToFunctionSummaryMap(
3877 "__arg_constrained_twice", Signature(ArgTypes{IntTy}, RetType{IntTy}),
3878 Summary(EvalCallAsPure)
3879 .ArgConstraint(ArgumentCondition(0U, OutOfRange, SingleValue(1)))
3880 .ArgConstraint(ArgumentCondition(0U, OutOfRange, SingleValue(2))));
3881 addToFunctionSummaryMap(
3883 Signature(ArgTypes{
Irrelevant, IntTy}, RetType{IntTy}),
3884 Summary(EvalCallAsPure).ArgConstraint(NotNull(ArgNo(0))));
3885 addToFunctionSummaryMap(
3887 Signature(ArgTypes{VoidPtrTy, ConstCharPtrTy}, RetType{IntTy}),
3888 Summary(EvalCallAsPure)
3889 .ArgConstraint(NotNull(ArgNo(0)))
3890 .ArgConstraint(NotNull(ArgNo(1))));
3891 addToFunctionSummaryMap(
3892 "__buf_size_arg_constraint",
3893 Signature(ArgTypes{ConstVoidPtrTy, SizeTyCanonTy}, RetType{IntTy}),
3894 Summary(EvalCallAsPure)
3896 BufferSize(ArgNo(0), ArgNo(1))));
3897 addToFunctionSummaryMap(
3898 "__buf_size_arg_constraint_mul",
3899 Signature(ArgTypes{ConstVoidPtrTy, SizeTyCanonTy, SizeTyCanonTy},
3901 Summary(EvalCallAsPure)
3902 .ArgConstraint(BufferSize(ArgNo(0), ArgNo(1),
3904 addToFunctionSummaryMap(
3905 "__buf_size_arg_constraint_concrete",
3906 Signature(ArgTypes{ConstVoidPtrTy}, RetType{IntTy}),
3907 Summary(EvalCallAsPure)
3908 .ArgConstraint(BufferSize(ArgNo(0),
3909 BVF.getValue(10, IntTy))));
3910 addToFunctionSummaryMap(
3911 {
"__test_restrict_param_0",
"__test_restrict_param_1",
3912 "__test_restrict_param_2"},
3913 Signature(ArgTypes{VoidPtrRestrictTy}, RetType{VoidTy}),
3914 Summary(EvalCallAsPure));
3917 addToFunctionSummaryMap(
3918 "__test_case_note", Signature(ArgTypes{}, RetType{IntTy}),
3919 Summary(EvalCallAsPure)
3920 .Case({ReturnValueCondition(WithinRange, SingleValue(0))},
3921 ErrnoIrrelevant,
"Function returns 0")
3922 .Case({ReturnValueCondition(WithinRange, SingleValue(1))},
3923 ErrnoIrrelevant,
"Function returns 1"));
3924 addToFunctionSummaryMap(
3925 "__test_case_range_1_2__4_6",
3926 Signature(ArgTypes{IntTy}, RetType{IntTy}),
3927 Summary(EvalCallAsPure)
3928 .Case({ArgumentCondition(0U, WithinRange,
3929 IntRangeVector{{IntMin, 0}, {3, 3}}),
3930 ReturnValueCondition(WithinRange, SingleValue(1))},
3932 .Case({ArgumentCondition(0U, WithinRange,
3933 IntRangeVector{{3, 3}, {7, IntMax}}),
3934 ReturnValueCondition(WithinRange, SingleValue(2))},
3936 .Case({ArgumentCondition(0U, WithinRange,
3937 IntRangeVector{{IntMin, 0}, {7, IntMax}}),
3938 ReturnValueCondition(WithinRange, SingleValue(3))},
3940 .Case({ArgumentCondition(
3942 IntRangeVector{{IntMin, 0}, {3, 3}, {7, IntMax}}),
3943 ReturnValueCondition(WithinRange, SingleValue(4))},
3948void ento::registerStdCLibraryFunctionsChecker(CheckerManager &mgr) {
3952 Checker->DisplayLoadedSummaries =
3953 Opts.getCheckerBooleanOption(Checker,
"DisplayLoadedSummaries");
3954 Checker->ModelPOSIX = Opts.getCheckerBooleanOption(Checker,
"ModelPOSIX");
3955 Checker->ShouldAssumeControlledEnvironment =
3956 Opts.ShouldAssumeControlledEnvironment;
3959bool ento::shouldRegisterStdCLibraryFunctionsChecker(
3960 const CheckerManager &mgr) {
3964void ento::registerStdCLibraryFunctionsTesterChecker(CheckerManager &mgr) {
3965 auto *Checker = mgr.
getChecker<StdLibraryFunctionsChecker>();
3966 Checker->AddTestFunctions =
true;
3969bool ento::shouldRegisterStdCLibraryFunctionsTesterChecker(
3970 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.
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
bool isNull() const
Return true if this QualType doesn't point to a type yet.
QualType getCanonicalType() const
void removeLocalRestrict()
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.
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)
The JSON file list parser is used to communicate input to InstallAPI.
bool isa(CodeGen::Address addr)
@ Result
The result type of a method or function.
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