主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MISRA C++:2008 Rule 2-10-2

Identifiers declared in an inner scope shall not hide an identifier declared in an outer scope

描述

规则定义

Identifiers declared in an inner scope shall not hide an identifier declared in an outer scope. 1

理由

该规则标记在两个变量声明中使用了相同的标识符名称的情况,一个在外部范围,另一个在内部范围。

int var; 
...
{
...
  int var;
...
}

在内部作用域中,该名称的所有使用都指在内部作用域中声明的变量。但是,开发人员或代码评审人员可能会错误地认为该用法是指外部范围内声明的变量。

Polyspace 实现

规则检查项会标记所有变量遮蔽的情况,包括以下情况:

  • 相同的标识符名称在外部和内部命名命名空间中被使用。

  • 同一个名称被用于类数据成员和类外的变量。

  • 同一个名称在基类和派生类中用于表示同一个方法。

要排除这些情况,请切换到更现代的标准 AUTOSAR C++14,并检查规则 AUTOSAR C++14 Rule A2-10-1

故障排除

如果您预期会出现违规,而 Polyspace® 未报告该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

int varInit = 1;

void doSomething(void);

void step(void) {
    int varInit = 0; //Noncompliant
    if(varInit)
       doSomething(); 
}

在此示例中,在 func 中定义的 varInit 隐藏了全局变量 varInitif 条件指的是本地 varInit,并且该模块无法访问,但您可能期望结果相反。

void runSomeCheck(int);

void checkMatrix(int dim1, int dim2) {
  for(int index = 0; index < dim1; index++) {
      for(int index = 0; index < dim2; index++) { // Noncompliant
          runSomeCheck(index);
      }
  }
}

在此示例中,在内部循环 for 中定义的变量 index 隐藏了外部循环中同名的变量。

检查信息

组:词法规范
类别:必需

版本历史记录

在 R2013b 中推出


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.