永远不会使用分配给变量的C / C ++默认值/值

时间:2018-05-16 13:41:15

标签: c++ c initialization default misra

我喜欢始终初始化局部变量,例如

int32_t result = 0;

我认为这是一种很好的编程风格,因为"结果"永远不会变得没有初始化,不管是否遵循if-constructs设置它。

但是现在我正在尝试使用静态代码检查器工具(IAR嵌入式工作台的C_STAT),并抱怨在下面的函数中,MISRA-C ++规则2008-01-06("不应包含非实例) -volatile变量被赋予永远不会被使用的值")和MISRA C:2012规则2.2c("没有死代码")和CWE 563("未使用的变量")是侵犯。

// gets signal1 - signal2 (checks range of value)
int16_t getSignalDifferenceFromFloat(float signal1, int16_t signal2)
{
    int32_t result = 0; // <-- this assignment makes the violation 
                        // ... but I feel better with it

    if (signal1 > 65535.0)
    {
        // because result cannot be smaller than the max value of TSignal
        result = 32767;
    }
    else if (signal1 < -65535.0)  // <-- here an else  was missing
    {
        // because result cannot be larger than the min value of TSignal
        result = -32768;
    }
    else
    {
        result = (int32_t)signal1 - (int32_t)signal2;

        if (result < -32768)
        {
            result = -32768;
        }
        else if (result > 32767)
        {
            result = 32767;
        }
    }

    return (int16_t) result;
}

原始问题:您如何看待它?

新问题:

  1. 是否有良好的编码标准,需要始终立即初始化声明的局部变量?
  2. 代码检查器是否过于迂腐(有些编译器不会在这个地方抱怨,但会抱怨变量会完全保持未使用状态)?我做了多年,但我不记得我在哪里见过它。

3 个答案:

答案 0 :(得分:2)

我同意MISRA。

变量的不必要的初始化可以允许草率的代码,因为它会破坏检查未初始化变量的工具。

在您的特定情况下,您可以将result本地化为最终else案例,并在其他情况下提前返回。但这并不是每个人都喜欢的。

答案 1 :(得分:1)

静态分析器应用您定义的规则 - 其中一些规则会发生冲突,因为您需要将它们设置为与本地编码标准相匹配。我想也有一条规则可能会或可能不会启用要求初始化所有变量;你不能两者兼顾。

选择符合您首选标准的非冲突规则集。你选择的是一个意见问题,所以不是一个真正有效的问题。

答案 2 :(得分:1)

大多数优秀的静态分析器将为您提供数据流分析-会警告您可能存在未初始化变量的路径。

以您的示例为例,假设您(偶然)错过了以后的一项任务,那么SA不会检测到这一点:

/// gets signal1 - signal2 (checks range of value)
int16_t getSignalDifferenceFromFloat(float signal1, int16_t signal2)
{
    int32_t result = 0; // <-- this assignment makes the violation 
        // ... but I feel better with it

    if (signal1 > 65535.0)
    {
        // commented out this line
        // No data-flow anomoly detected
        // result = 32767;
    }

    // Snip rest of code

    return (int16_t) result;
}

《 MISRA指南》在任何方面都不是完美的,但是我们尽力防止出现明显的问题……而且只要您不试图弄乱问题,未初始化的变量就很容易检测到。

有点像强制转换,只是要关闭“静态分析”工具……

[请参阅个人资料以了解免责声明]