AUTOSAR C++14 Rule A8-4-7
R2026b"in" parameters for "cheap to copy" types shall be passed by value
描述
"in" parameters for "cheap to copy" types shall be passed by value.
理由
当您仅打算在函数内读取某个参数时,该参数即属于 in 参数。如果该参数复制成本低,则按值传递该参数,以便:
明确表示您不打算修改该参数。
避免产生按引用传递参数时从函数内访问该参数所需的额外间接寻址开销。
当同时满足以下两个条件时,即认为参数的复制成本低:
参数的大小小于或等于两个字长。例如,对于参数
foo,sizeof(foo) <= 2 * sizeof(int)。参数属于平凡可复制类型。请参阅 is_trivially_copyable。
Polyspace 实现
Polyspace® 会标记以下参数:
复制成本低(即
sizeof <= 2 * sizeof(int)且属于平凡可复制类型)但按引用传递的const参数。复制成本不低但按值传递的
const参数。例如,在以下代码片段中,参数str(复制成本高)和b(非平凡可复制)均不合规。void func1(const std::string str); struct B { B(B const&) {} }; void func2(const B b);
Polyspace 不会标记以下参数:
复制成本不低且不会在函数内被修改的按引用传递的非
const参数。Polyspace 将这些参数视为 in 参数。属于仅可移动类型的按引用传递的 in 参数。例如,
int f(const std::unique_ptr<int>& p);。拷贝构造函数中按引用传递的
const参数。例如,在以下代码片段中,point不会引发缺陷。class coord { public: coord(int x, int y) {p_x = x; p_y = y;} coord(const coord& point) { p_x = obj.p_x; p_y = obj.p_y;} //... private: int p_x, p_y; }; coord point{1, 1}; void func(const coord& point);
故障排除
如果您预期会出现违规,而 Polyspace 未报告该违规,请参阅诊断为何编码规范违规未按预期显示。
示例
检查信息
| 组:声明符 |
| 类别:必需、自动 |
PQL 名称:std.autosar_cpp14.A8_4_7 |