主要内容

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

MISRA C++:2008 Rule 8-5-1

All variables shall have a defined value before they are used

描述

规则定义

All variables shall have a defined value before they are used. 1

理由

C++ 标准未指定未初始化的内存的值。该值无法预测,每次运行程序时可能会不同。读取和使用未初始化的内存值会导致意外行为。

Polyspace 实现

如果您的代码包含以下问题,则 Polyspace® 会报告违反此规则:

Polyspace 不会检查类构造函数是否初始化了该类的非静态成员。

故障排除

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

示例

全部展开

如果 command 不为 2,则变量 val 未赋值。在这种情况下,函数 get_sensor_value 的返回值无法确定。

int get_sensor_value(void)
{
    extern int getsensor(void);
    int command;
    int val;

    command = getsensor();
    if (command == 2) 
      {
        val = getsensor();
      }

    return val; //Noncompliant              
   
}

在此示例中,如果 flag 不为 0,则成员 _c 未初始化。

该缺陷出现在构造函数的闭合大括号中。以下是一些在源代码中进行导航的提示:

  • 结果详细信息窗格中,查看未初始化的成员。

  • 要导航到类定义,请右键点击构造函数中初始化的成员。右键点击该函数并选择转至定义。在类定义中,您可以看到所有成员,包括那些在构造函数中未初始化的成员。

class MyClass {
public:
    explicit MyClass(int);
private:
    int _i;
    char _c;
};

MyClass::MyClass(int flag) {
    if(flag == 0) {
        _i = 0;
        _c = 'a';
    }
    else {
        _i = 1;
    }
}//Noncompliant

如果 prev 不是 NULL,则指针 pi 未分配地址。但是,pi 在每个执行路径上都被解引用,无论 prev 是否为 NULL

#include <stdlib.h>

int* assign_pointer(int* prev)
{
    int j = 42;
    int* pi;

    if (prev == NULL) 
      {
        pi = (int*)malloc(sizeof(int));
        if (pi == NULL) return NULL;
      }

    *pi = j; //Noncompliant                    

    return pi;
}

检查信息

组:声明符
类别:必需

版本历史记录

在 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.