MISRA C ++规则7-1-1是否影响引用?

时间:2017-02-22 10:10:23

标签: c++ reference misra

  

规则7-1-1(必需)未修改的变量应为const限定

     

如果不需要修改变量,那么它应该是   用const限定声明,以便它不能被修改。一个   然后,非参数变量将需要在其初始化   宣言点。此外,未来的维护也不会意外   修改价值。

void b ( int32_t * );
int32_t f (       int32_t * p1,                 // Non-compliant
                  int32_t * const p2,           // Compliant
                  int32_t * const p3 )          // Compliant
{
     *p1 = 10;
     *p2 = 10;
     b( p3 );
     int32_t i = 0;                             // Non-compliant
     return i;
}

标准中包含的示例主要关注指针。该规则要求符合条件的所有指针都是const,例如int * const。如果我理解正确,需要指针和引用指向const个对象,例如const int *const int &。事实上,它被另一个规则所覆盖(但仅限于参数!):

  

规则7-1-2(必需)如果未修改相应的对象,则函数中的指针或引用参数应声明为const的指针或const的引用

那么,规则7-1-1是否适用于参考文献?引用在创建后无法重新绑定,因此应将其视为const指针。因此,所有引用都应自动符合规则7-1-1。

编辑(基于Lightness Races in OrbitRichard Critten& Peter和我的实验的评论:或规则是否正确在引用的情况下适用于引用对象的类型?我的意思是const int &int &类似于const intint? 我问,因为我的MISRA C ++检查程序不断报告引用的违规行为......其行为示例:

class A
{
    int property;
public:
    A(int param) : property(param) {}     // violation: should be: const int param
    int get_property() const { return property; }
    void set_property(int param) { property = param; }  // violation: should be: const int param
};

class ConstA
{
    const int property;
public:
    ConstA(int param) : property(param) {}  // violation: should be: const int param
    int get_property() const { return property; }
    // setter not allowed
};

void example1()
{
    const A const_obj_A(1);
    A nonconst_obj_A(2);
    ConstA nonconst_obj_constA(3);      // OK: used to create a non-const reference
    const A& const_ref_A = nonconst_obj_A;
    A& nonconst_ref_A = nonconst_obj_A; // OK: setter called
    nonconst_ref_A.set_property(4);
    ConstA& const_ref_constA = nonconst_obj_constA; // violation: no modification
    // In fact, it seems to be impossible to make
    // a non-violating ConstA& declaration.
    // The only chance is to make another non-const reference
    // but the last declaration in the chain will still violate.
}

void example2()
{
    const A const_obj_A(1);
    A nonconst_obj_A(2);
    ConstA nonconst_obj_constA(3);      // violation: used only in const reference
    const A& const_ref_A = nonconst_obj_A;
    A& nonconst_ref_A = nonconst_obj_A; // violation: no modification using the ref.
    const ConstA& const_ref_constA = nonconst_obj_constA;
}

2 个答案:

答案 0 :(得分:5)

不,7-1-1不适用于参考文献。

int32_t & const p2形式的声明是无稽之谈。

请求的唯一有意义的const限定格式为const int32_t &p2或等效int32_t const &p2。然后需要将这些表格完全覆盖在7-1-2中。

Misra 7-1-1不需要应用于此类引用,因为Misra的原理是指定语言标准不具有的约束,不重述已在语言中指定的约束(并由编译器强制执行)。 Misra 7-1-1要求变量(例如类型为int32_t)如果不被修改则声明为const - 例如引用示例中的i。在标准C ++中,不可能创建对该变量的非const引用 - 除非使用类型转换(也称为“强制转换”)来删除const。米苏拉规则5-2-5要求不得使用此类演员。

答案 1 :(得分:1)

C ++指针和引用之间存在显着的语义差异:引用不是对象(变量)。

它只是对象别名。因此,严格的形式意义7-1-1不适用于参考文献。