主要内容

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 未报告该违规,请参阅诊断为何编码规范违规未按预期显示。

示例

全部展开

#include <memory>
#include <string>
#include <cstdint>

int func(const std::unique_ptr<int>& ptr) // Compliant
{
    *ptr = *ptr + 1;
    return *ptr;
}
union Small {
    uint8_t var1 ;
    uint8_t var2;
} ;

struct Large {
    std::uint32_t v1;
    std::uint32_t v2;
    std::uint32_t v3;
    std::uint32_t v4;
};

void func2(Small& arg) // Noncompliant
{
//...
}  

void func3(Large val,   // Noncompliant
           std::string& str) // Compliant
{
//...
} 

在此示例中,Polyspace 会标记以下 in 参数:

  • arg,因为它按引用传递,且属于平凡可复制类型。此参数可以改为按值传递。

  • val,因为它按值传递,且复制成本高。按引用传递此参数可以避免在每次调用 func3() 时产生高昂的复制开销。

以下按引用传递的 in 参数是合规的:

  • 参数 ptr,因为它属于仅可移动类型。

  • 参数 str,因为其复制成本高。虽然此参数并非 const,但在 func3() 内未被修改。

检查信息

组:声明符
类别:必需、自动
PQL 名称:std.autosar_cpp14.A8_4_7

版本历史记录

在 R2019a 中推出

全部展开