☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

复制成本高的参数不应按值传递

8.7 ID_paramPassedByValue
目录 › next › previous

如果参数为基本类型,或只包含少量非静态数据成员,且通过简单赋值即可完成复制,可以通过值传递参数,否则应使用引用或指针的方式以避免额外的复制开销。

一般而言,如果参数的大小超过了两个指针,不应使用值传递的方式。

示例:

using S = std::string;

void foo(S s) {   // Non-compliant
    ....
}

例中 s 是按值传递的参数,由传入的实际参数复制而成,涉及内存分配和非常量时间复杂度的数据复制,成本较高。

应改为常量引用的方式:

void foo(const S& s) {   // Compliant
    ....
}

当参数为复制成本较高的常量对象时,往往是漏写了引用符号,为常见笔误,如:

void bar(const S s);   // Non-compliant, missing ‘&’

当参数在函数体内被修改,也可能是有意让形式参数作为实际参数的副本,这种情况可不受本规则约束,但也可能是漏写了引用符号,审计工具不妨根据配置给出提醒,如:

S lower(S s) {   // Let it go?
    transform(
        s.begin(), s.end(), s.begin(),
        [](unsigned char c) { return static_cast<char>(tolower(c)); }
    );
    return s;
}

配置

allowModifiedParam: 是否放过被修改的参数 maxParamSize: 允许按值传递的参数对象大小上限

参考

C++ Core Guidelines F.16
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.