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

Method checkReturnByReference

lib/checkclass.cpp:3502–3543  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

3500}
3501
3502void CheckClassImpl::checkReturnByReference()
3503{
3504 if (!mSettings.severity.isEnabled(Severity::performance) && !mSettings.isPremiumEnabled("returnByReference"))
3505 return;
3506
3507 logChecker("CheckClass::checkReturnByReference"); // performance
3508
3509 for (const Scope* classScope : mSymbolDatabase->classAndStructScopes) {
3510 for (const Function& func : classScope->functionList) {
3511 if (Function::returnsPointer(&func) || Function::returnsReference(&func) || Function::returnsStandardType(&func))
3512 continue;
3513 if (func.isImplicitlyVirtual())
3514 continue;
3515 if (func.isOperator())
3516 continue;
3517 if (func.functionPointerUsage)
3518 continue;
3519 if (const Library::Container* container = mSettings.library.detectContainer(func.retDef))
3520 if (container->view)
3521 continue;
3522 if (!func.isConst() && func.hasRvalRefQualifier())
3523 // this method could be used by temporary objects, return by value can be dangerous
3524 continue;
3525 if (const Variable* var = getSingleReturnVar(func.functionScope)) {
3526 if (!var->valueType())
3527 continue;
3528 if (var->isArgument())
3529 continue;
3530 const bool isContainer = var->valueType()->type == ValueType::Type::CONTAINER && var->valueType()->container;
3531 const bool isView = isContainer && var->valueType()->container->view;
3532 bool warn = isContainer && !isView;
3533 if (!warn && !isView) {
3534 const std::size_t size = var->valueType()->getSizeOf(mSettings, ValueType::Accuracy::LowerBound, ValueType::SizeOf::Pointer);
3535 if (size > 2 * mSettings.platform.sizeof_pointer)
3536 warn = true;
3537 }
3538 if (warn)
3539 returnByReferenceError(&func, var);
3540 }
3541 }
3542 }
3543}
3544
3545void CheckClassImpl::returnByReferenceError(const Function* func, const Variable* var)
3546{

Callers 1

runChecksMethod · 0.80

Calls 7

getSingleReturnVarFunction · 0.85
isPremiumEnabledMethod · 0.80
detectContainerMethod · 0.80
isConstMethod · 0.80
getSizeOfMethod · 0.80
isEnabledMethod · 0.45
isImplicitlyVirtualMethod · 0.45

Tested by

no test coverage detected