@@ -5393,6 +5393,18 @@ static bool getMinMaxValues(const ValueType *vt, const cppcheck::Platform &platf
53935393 return true ;
53945394}
53955395
5396+ static bool getMinMaxValues (const std::string &typestr, const Settings *settings, int64_t *minvalue, int64_t *maxvalue)
5397+ {
5398+ TokenList typeTokens (settings);
5399+ std::istringstream istr (typestr+" ;" );
5400+ if (!typeTokens.createTokens (istr))
5401+ return false ;
5402+ typeTokens.simplifyPlatformTypes ();
5403+ typeTokens.simplifyStdType ();
5404+ const ValueType &vt = ValueType::parseDecl (typeTokens.front (), settings);
5405+ return getMinMaxValues (&vt, *settings, minvalue, maxvalue);
5406+ }
5407+
53965408static void valueFlowSafeFunctions (TokenList *tokenlist, SymbolDatabase *symboldatabase, ErrorLogger *errorLogger, const Settings *settings)
53975409{
53985410 if (settings->platformType == cppcheck::Platform::PlatformType::Unspecified)
@@ -5430,6 +5442,38 @@ static void valueFlowSafeFunctions(TokenList *tokenlist, SymbolDatabase *symbold
54305442 }
54315443}
54325444
5445+ static void valueFlowSafeFunctionReturn (TokenList *tokenlist, const Settings *settings)
5446+ {
5447+ if (!settings->checkAllSafeFunctionReturnValues )
5448+ return ;
5449+ for (Token *tok = tokenlist->front (); tok; tok = tok->next ()) {
5450+ if (!tok->astParent () || tok->str () != " (" )
5451+ continue ;
5452+ if (!Token::Match (tok->previous (), " %name%" ))
5453+ continue ;
5454+ int64_t v1,v2;
5455+ if (!settings->library .returnValueSafeValues (tok->previous (), &v1, &v2))
5456+ continue ;
5457+
5458+ // Get min/max values for return type
5459+ const std::string typestr = settings->library .returnValueType (tok->previous ());
5460+ int64_t minvalue, maxvalue;
5461+ if (!getMinMaxValues (typestr, settings, &minvalue, &maxvalue))
5462+ continue ;
5463+
5464+ auto value = [](int64_t v, int64_t minvalue, int64_t maxvalue) {
5465+ if (v < minvalue)
5466+ return ValueFlow::Value (minvalue);
5467+ if (v > maxvalue)
5468+ return ValueFlow::Value (maxvalue);
5469+ return ValueFlow::Value (v);
5470+ };
5471+
5472+ setTokenValue (const_cast <Token *>(tok), value (v1, minvalue, maxvalue), settings);
5473+ setTokenValue (const_cast <Token *>(tok), value (v2, minvalue, maxvalue), settings);
5474+ }
5475+ }
5476+
54335477ValueFlow::Value::Value (const Token *c, long long val)
54345478 : valueType(INT ),
54355479 intvalue(val),
@@ -5496,6 +5540,7 @@ void ValueFlow::setValues(TokenList *tokenlist, SymbolDatabase* symboldatabase,
54965540 valueFlowNumber (tokenlist);
54975541 valueFlowString (tokenlist);
54985542 valueFlowArray (tokenlist);
5543+ valueFlowSafeFunctionReturn (tokenlist, settings);
54995544 valueFlowGlobalConstVar (tokenlist, settings);
55005545 valueFlowGlobalStaticVar (tokenlist, settings);
55015546 valueFlowPointerAlias (tokenlist);
0 commit comments