MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / checkVariableCallMatch

Function checkVariableCallMatch

lib/symboldatabase.cpp:5912–5954  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

5910//---------------------------------------------------------------------------
5911
5912static void checkVariableCallMatch(const Variable* callarg, const Variable* funcarg, size_t& same, size_t& fallback1, size_t& fallback2)
5913{
5914 if (callarg) {
5915 const ValueType::MatchResult res = ValueType::matchParameter(callarg->valueType(), callarg, funcarg);
5916 if (res == ValueType::MatchResult::SAME) {
5917 same++;
5918 return;
5919 }
5920 if (res == ValueType::MatchResult::FALLBACK1) {
5921 fallback1++;
5922 return;
5923 }
5924 if (res == ValueType::MatchResult::FALLBACK2) {
5925 fallback2++;
5926 return;
5927 }
5928 if (res == ValueType::MatchResult::NOMATCH)
5929 return;
5930
5931 const bool ptrequals = callarg->isArrayOrPointer() == funcarg->isArrayOrPointer();
5932 const bool constEquals = !callarg->isArrayOrPointer() || ((callarg->typeStartToken()->strAt(-1) == "const") == (funcarg->typeStartToken()->strAt(-1) == "const"));
5933 if (ptrequals && constEquals &&
5934 callarg->typeStartToken()->str() == funcarg->typeStartToken()->str() &&
5935 callarg->typeStartToken()->isUnsigned() == funcarg->typeStartToken()->isUnsigned() &&
5936 callarg->typeStartToken()->isLong() == funcarg->typeStartToken()->isLong()) {
5937 same++;
5938 } else if (callarg->isArrayOrPointer()) {
5939 if (ptrequals && constEquals && funcarg->typeStartToken()->str() == "void") // cppcheck-suppress knownConditionTrueFalse // #14418
5940 fallback1++;
5941 else if (constEquals && funcarg->isStlStringType() && Token::Match(callarg->typeStartToken(), "char|wchar_t"))
5942 fallback2++;
5943 } else if (ptrequals) {
5944 const bool takesInt = Token::Match(funcarg->typeStartToken(), "char|short|int|long");
5945 const bool takesFloat = Token::Match(funcarg->typeStartToken(), "float|double");
5946 const bool passesInt = Token::Match(callarg->typeStartToken(), "char|short|int|long");
5947 const bool passesFloat = Token::Match(callarg->typeStartToken(), "float|double");
5948 if ((takesInt && passesInt) || (takesFloat && passesFloat))
5949 fallback1++;
5950 else if ((takesInt && passesFloat) || (takesFloat && passesInt))
5951 fallback2++;
5952 }
5953 }
5954}
5955
5956static std::string getTypeString(const Token *typeToken)
5957{

Callers 1

findFunctionMethod · 0.85

Calls 3

isArrayOrPointerMethod · 0.80
isUnsignedMethod · 0.80
strMethod · 0.45

Tested by

no test coverage detected