@@ -457,6 +457,10 @@ class StdLibraryFunctionsChecker
457
457
CaseConstraints.push_back (std::move (CS));
458
458
return *this ;
459
459
}
460
+ Summary &Case (const ConstraintSet &CS) {
461
+ CaseConstraints.push_back (CS);
462
+ return *this ;
463
+ }
460
464
Summary &ArgConstraint (ValueConstraintPtr VC) {
461
465
assert (VC->getArgNo () != Ret &&
462
466
" Arg constraint should not refer to the return value" );
@@ -1235,9 +1239,8 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1235
1239
// read()-like functions that never return more than buffer size.
1236
1240
auto FreadSummary =
1237
1241
Summary (NoEvalCall)
1238
- .Case ({
1239
- ReturnValueCondition (LessThanOrEq, ArgNo (2 )),
1240
- })
1242
+ .Case ({ReturnValueCondition (LessThanOrEq, ArgNo (2 )),
1243
+ ReturnValueCondition (WithinRange, Range (0 , SizeMax))})
1241
1244
.ArgConstraint (NotNull (ArgNo (0 )))
1242
1245
.ArgConstraint (NotNull (ArgNo (3 )))
1243
1246
.ArgConstraint (BufferSize (/* Buffer=*/ ArgNo (0 ), /* BufSize=*/ ArgNo (1 ),
@@ -1764,6 +1767,8 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1764
1767
Signature (ArgTypes{ConstCharPtrRestrictTy, CharPtrRestrictTy, SizeTy},
1765
1768
RetType{Ssize_tTy}),
1766
1769
Summary (NoEvalCall)
1770
+ .Case ({ReturnValueCondition (LessThanOrEq, ArgNo (2 )),
1771
+ ReturnValueCondition (WithinRange, Range (-1 , Ssize_tMax))})
1767
1772
.ArgConstraint (NotNull (ArgNo (0 )))
1768
1773
.ArgConstraint (NotNull (ArgNo (1 )))
1769
1774
.ArgConstraint (BufferSize (/* Buffer=*/ ArgNo (1 ),
@@ -1779,6 +1784,8 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1779
1784
ArgTypes{IntTy, ConstCharPtrRestrictTy, CharPtrRestrictTy, SizeTy},
1780
1785
RetType{Ssize_tTy}),
1781
1786
Summary (NoEvalCall)
1787
+ .Case ({ReturnValueCondition (LessThanOrEq, ArgNo (3 )),
1788
+ ReturnValueCondition (WithinRange, Range (-1 , Ssize_tMax))})
1782
1789
.ArgConstraint (ArgumentCondition (0 , WithinRange, Range (0 , IntMax)))
1783
1790
.ArgConstraint (NotNull (ArgNo (1 )))
1784
1791
.ArgConstraint (NotNull (ArgNo (2 )))
@@ -1842,6 +1849,9 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1842
1849
Optional<QualType> Socklen_tPtrRestrictTy = getRestrictTy (Socklen_tPtrTy);
1843
1850
Optional<RangeInt> Socklen_tMax = getMaxValue (Socklen_tTy);
1844
1851
1852
+ const auto ReturnsZeroOrMinusOne =
1853
+ ConstraintSet{ReturnValueCondition (WithinRange, Range (-1 , 0 ))};
1854
+
1845
1855
// In 'socket.h' of some libc implementations with C99, sockaddr parameter
1846
1856
// is a transparent union of the underlying sockaddr_ family of pointers
1847
1857
// instead of being a pointer to struct sockaddr. In these cases, the
@@ -1850,6 +1860,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1850
1860
// constraints which require pointer types for the sockaddr param.
1851
1861
auto Accept =
1852
1862
Summary (NoEvalCall)
1863
+ .Case ({ReturnValueCondition (WithinRange, Range (-1 , IntMax))})
1853
1864
.ArgConstraint (ArgumentCondition (0 , WithinRange, Range (0 , IntMax)));
1854
1865
if (!addToFunctionSummaryMap (
1855
1866
" accept" ,
@@ -1872,6 +1883,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1872
1883
Signature (ArgTypes{IntTy, ConstStructSockaddrPtrTy, Socklen_tTy},
1873
1884
RetType{IntTy}),
1874
1885
Summary (NoEvalCall)
1886
+ .Case (ReturnsZeroOrMinusOne)
1875
1887
.ArgConstraint (
1876
1888
ArgumentCondition (0 , WithinRange, Range (0 , IntMax)))
1877
1889
.ArgConstraint (NotNull (ArgNo (1 )))
@@ -1884,6 +1896,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1884
1896
" bind" ,
1885
1897
Signature (ArgTypes{IntTy, Irrelevant, Socklen_tTy}, RetType{IntTy}),
1886
1898
Summary (NoEvalCall)
1899
+ .Case (ReturnsZeroOrMinusOne)
1887
1900
.ArgConstraint (
1888
1901
ArgumentCondition (0 , WithinRange, Range (0 , IntMax)))
1889
1902
.ArgConstraint (
@@ -1897,6 +1910,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1897
1910
Socklen_tPtrRestrictTy},
1898
1911
RetType{IntTy}),
1899
1912
Summary (NoEvalCall)
1913
+ .Case (ReturnsZeroOrMinusOne)
1900
1914
.ArgConstraint (
1901
1915
ArgumentCondition (0 , WithinRange, Range (0 , IntMax)))
1902
1916
.ArgConstraint (NotNull (ArgNo (1 )))
@@ -1906,6 +1920,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1906
1920
Signature (ArgTypes{IntTy, Irrelevant, Socklen_tPtrRestrictTy},
1907
1921
RetType{IntTy}),
1908
1922
Summary (NoEvalCall)
1923
+ .Case (ReturnsZeroOrMinusOne)
1909
1924
.ArgConstraint (
1910
1925
ArgumentCondition (0 , WithinRange, Range (0 , IntMax))));
1911
1926
@@ -1917,6 +1932,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1917
1932
Socklen_tPtrRestrictTy},
1918
1933
RetType{IntTy}),
1919
1934
Summary (NoEvalCall)
1935
+ .Case (ReturnsZeroOrMinusOne)
1920
1936
.ArgConstraint (
1921
1937
ArgumentCondition (0 , WithinRange, Range (0 , IntMax)))
1922
1938
.ArgConstraint (NotNull (ArgNo (1 )))
@@ -1926,6 +1942,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1926
1942
Signature (ArgTypes{IntTy, Irrelevant, Socklen_tPtrRestrictTy},
1927
1943
RetType{IntTy}),
1928
1944
Summary (NoEvalCall)
1945
+ .Case (ReturnsZeroOrMinusOne)
1929
1946
.ArgConstraint (
1930
1947
ArgumentCondition (0 , WithinRange, Range (0 , IntMax))));
1931
1948
@@ -1936,18 +1953,22 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1936
1953
Signature (ArgTypes{IntTy, ConstStructSockaddrPtrTy, Socklen_tTy},
1937
1954
RetType{IntTy}),
1938
1955
Summary (NoEvalCall)
1956
+ .Case (ReturnsZeroOrMinusOne)
1939
1957
.ArgConstraint (
1940
1958
ArgumentCondition (0 , WithinRange, Range (0 , IntMax)))
1941
1959
.ArgConstraint (NotNull (ArgNo (1 )))))
1942
1960
addToFunctionSummaryMap (
1943
1961
" connect" ,
1944
1962
Signature (ArgTypes{IntTy, Irrelevant, Socklen_tTy}, RetType{IntTy}),
1945
1963
Summary (NoEvalCall)
1964
+ .Case (ReturnsZeroOrMinusOne)
1946
1965
.ArgConstraint (
1947
1966
ArgumentCondition (0 , WithinRange, Range (0 , IntMax))));
1948
1967
1949
1968
auto Recvfrom =
1950
1969
Summary (NoEvalCall)
1970
+ .Case ({ReturnValueCondition (LessThanOrEq, ArgNo (2 )),
1971
+ ReturnValueCondition (WithinRange, Range (-1 , Ssize_tMax))})
1951
1972
.ArgConstraint (ArgumentCondition (0 , WithinRange, Range (0 , IntMax)))
1952
1973
.ArgConstraint (BufferSize (/* Buffer=*/ ArgNo (1 ),
1953
1974
/* BufSize=*/ ArgNo (2 )));
@@ -1971,6 +1992,8 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1971
1992
1972
1993
auto Sendto =
1973
1994
Summary (NoEvalCall)
1995
+ .Case ({ReturnValueCondition (LessThanOrEq, ArgNo (2 )),
1996
+ ReturnValueCondition (WithinRange, Range (-1 , Ssize_tMax))})
1974
1997
.ArgConstraint (ArgumentCondition (0 , WithinRange, Range (0 , IntMax)))
1975
1998
.ArgConstraint (BufferSize (/* Buffer=*/ ArgNo (1 ),
1976
1999
/* BufSize=*/ ArgNo (2 )));
@@ -1994,6 +2017,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
1994
2017
addToFunctionSummaryMap (" listen" ,
1995
2018
Signature (ArgTypes{IntTy, IntTy}, RetType{IntTy}),
1996
2019
Summary (NoEvalCall)
2020
+ .Case (ReturnsZeroOrMinusOne)
1997
2021
.ArgConstraint (ArgumentCondition (
1998
2022
0 , WithinRange, Range (0 , IntMax))));
1999
2023
@@ -2003,6 +2027,8 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
2003
2027
Signature (ArgTypes{IntTy, VoidPtrTy, SizeTy, IntTy},
2004
2028
RetType{Ssize_tTy}),
2005
2029
Summary (NoEvalCall)
2030
+ .Case ({ReturnValueCondition (LessThanOrEq, ArgNo (2 )),
2031
+ ReturnValueCondition (WithinRange, Range (-1 , Ssize_tMax))})
2006
2032
.ArgConstraint (ArgumentCondition (0 , WithinRange, Range (0 , IntMax)))
2007
2033
.ArgConstraint (BufferSize (/* Buffer=*/ ArgNo (1 ),
2008
2034
/* BufSize=*/ ArgNo (2 ))));
@@ -2013,19 +2039,22 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
2013
2039
getPointerTy (getConstTy (StructMsghdrTy));
2014
2040
2015
2041
// ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
2016
- addToFunctionSummaryMap (" recvmsg" ,
2017
- Signature (ArgTypes{IntTy, StructMsghdrPtrTy, IntTy},
2018
- RetType{Ssize_tTy}),
2019
- Summary (NoEvalCall)
2020
- .ArgConstraint (ArgumentCondition (
2021
- 0 , WithinRange, Range (0 , IntMax))));
2042
+ addToFunctionSummaryMap (
2043
+ " recvmsg" ,
2044
+ Signature (ArgTypes{IntTy, StructMsghdrPtrTy, IntTy},
2045
+ RetType{Ssize_tTy}),
2046
+ Summary (NoEvalCall)
2047
+ .Case ({ReturnValueCondition (WithinRange, Range (-1 , Ssize_tMax))})
2048
+ .ArgConstraint (
2049
+ ArgumentCondition (0 , WithinRange, Range (0 , IntMax))));
2022
2050
2023
2051
// ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
2024
2052
addToFunctionSummaryMap (
2025
2053
" sendmsg" ,
2026
2054
Signature (ArgTypes{IntTy, ConstStructMsghdrPtrTy, IntTy},
2027
2055
RetType{Ssize_tTy}),
2028
2056
Summary (NoEvalCall)
2057
+ .Case ({ReturnValueCondition (WithinRange, Range (-1 , Ssize_tMax))})
2029
2058
.ArgConstraint (
2030
2059
ArgumentCondition (0 , WithinRange, Range (0 , IntMax))));
2031
2060
@@ -2036,6 +2065,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
2036
2065
Signature (ArgTypes{IntTy, IntTy, IntTy, ConstVoidPtrTy, Socklen_tTy},
2037
2066
RetType{IntTy}),
2038
2067
Summary (NoEvalCall)
2068
+ .Case (ReturnsZeroOrMinusOne)
2039
2069
.ArgConstraint (NotNull (ArgNo (3 )))
2040
2070
.ArgConstraint (
2041
2071
BufferSize (/* Buffer=*/ ArgNo (3 ), /* BufSize=*/ ArgNo (4 )))
@@ -2051,6 +2081,7 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
2051
2081
Socklen_tPtrRestrictTy},
2052
2082
RetType{IntTy}),
2053
2083
Summary (NoEvalCall)
2084
+ .Case (ReturnsZeroOrMinusOne)
2054
2085
.ArgConstraint (NotNull (ArgNo (3 )))
2055
2086
.ArgConstraint (NotNull (ArgNo (4 ))));
2056
2087
@@ -2060,6 +2091,8 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
2060
2091
Signature (ArgTypes{IntTy, ConstVoidPtrTy, SizeTy, IntTy},
2061
2092
RetType{Ssize_tTy}),
2062
2093
Summary (NoEvalCall)
2094
+ .Case ({ReturnValueCondition (LessThanOrEq, ArgNo (2 )),
2095
+ ReturnValueCondition (WithinRange, Range (-1 , Ssize_tMax))})
2063
2096
.ArgConstraint (ArgumentCondition (0 , WithinRange, Range (0 , IntMax)))
2064
2097
.ArgConstraint (BufferSize (/* Buffer=*/ ArgNo (1 ),
2065
2098
/* BufSize=*/ ArgNo (2 ))));
@@ -2068,7 +2101,9 @@ void StdLibraryFunctionsChecker::initFunctionSummaries(
2068
2101
addToFunctionSummaryMap (
2069
2102
" socketpair" ,
2070
2103
Signature (ArgTypes{IntTy, IntTy, IntTy, IntPtrTy}, RetType{IntTy}),
2071
- Summary (NoEvalCall).ArgConstraint (NotNull (ArgNo (3 ))));
2104
+ Summary (NoEvalCall)
2105
+ .Case (ReturnsZeroOrMinusOne)
2106
+ .ArgConstraint (NotNull (ArgNo (3 ))));
2072
2107
2073
2108
// int getnameinfo(const struct sockaddr *restrict sa, socklen_t salen,
2074
2109
// char *restrict node, socklen_t nodelen,
0 commit comments