| 3500 | } |
| 3501 | |
| 3502 | void 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 | |
| 3545 | void CheckClassImpl::returnByReferenceError(const Function* func, const Variable* var) |
| 3546 | { |
no test coverage detected