主要内容

MISRA C++:2023 Rule 6.7.2

Global variables shall not be used

自 R2024b 起

描述

Global variables shall not be used. 1

理由

全局变量是指:

  • namespace 作用域(包括全局命名空间)中声明的变量。

  • 类中的 static 数据成员。

根据此类变量的链接方式,可以从源文件或程序中的任何位置读取或写入该变量。这种对非局部对象的广泛访问会导致多种问题:

  • 由于许多函数和实体可以读取或写入这些全局变量,因此它们的交互变得不可预测。

  • 由于多个函数可以同时访问这些全局变量,因此并发程序可能会面临数据争用导致的未定义行为风险。

  • 由于 C++ 标准并未完全指定这些全局变量的初始化顺序,因此如果对变量进行动态初始化,则其值可能不可预测。

请避免使用全局变量,但以下不违反规则的变量除外:

  • constexpr 变量

  • 以静态方式进行初始化的 const 变量

  • 保存 lambda 但不进行 lambda 捕获的变量

Polyspace 实现

如果您声明了以下任何对象,则 Polyspace® 会报告违反了此规则:

  • 一个全局变量或命名空间作用域变量,该变量既不是 const,也不是 constexpr

  • 动态初始化的 const 全局变量或命名空间作用域变量

  • static 类成员

故障排除

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

示例

全部展开

此示例显示 Polyspace 针对以下情形报告违反了此规则:

  • 在全局命名空间(例如 nonConstGlobalthreadLocalGlobal)中声明的非 const 变量

  • 以动态方式进行初始化的 const 全局变量,例如 constGlobalDynamicAlloc

  • 命名空间作用域变量,例如 namespaceScopeVar

  • 静态类成员,例如 myClass::staticClassMember

 int getVal();
constexpr int getConstexprVal(){return 5;}

int nonConstGlobal; //Noncompliant - variable declared in global namespace scope
thread_local unsigned int threadLocalGlobal= 1; //Noncompliant 
                                             // global variable is local to a thread
constexpr int  constantExpressionGlobal {0}; //Compliant by exception

int const constGlobal{0}; //Compliant by exception
int const constGlobalDynamicAlloc{getVal()}; //Noncompliant

namespace{
int namespaceScopeVar; //Noncompliant - variable declared in namespace scope
constexpr int namespaceScopeConstexprVar{getConstexprVal()}; //Compliant by exception
}

class myClass{
static int staticClassMember; //Noncompliant - static data mmeber
};

auto globalLambdaNoCapture = [](){/**/}; //Compliant by exception

Polyspace 不会针对以下规则例外情形报告违规:

  • constexpr 变量,例如 constantExpressionGlobalnamespaceScopeConstexprVar

  • 静态初始化的 const 变量,例如 constGlobal

  • 保存 lambda 但不进行 lambda 捕获的变量,例如 globalLambdaNoCapture

检查信息

组:基本概念
类别:必需
PQL 名称:std.misra_cpp_2023.R6_7_2

版本历史记录

在 R2024b 中推出


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.