簡體   English   中英

從未使用C / C ++默認值/分配給變量的值

[英]C/C++ default value/value assigned to variable is never used

我喜歡總是初始化局部變量,例如

int32_t result = 0;

我認為這是一種很好的編程風格,因為“結果”永遠不會變得未初始化,而與以下if-constructs是否進行設置無關。

但是現在我正在嘗試使用靜態代碼檢查器工具(用於IAR嵌入式工作台的C_STAT),並且它抱怨在下面的函數中,MISRA-C ++規則2008-01-06(“不得包含給定值的非易失性變量的實例。 ”,並且違反了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. 代碼檢查器是否過於花哨(某些編譯器在此處不抱怨,但會抱怨變量將完全不使用)? 我做了很多年,但我不記得在哪里看過它。

我同意MISRA。

變量的不必要初始化可能會導致草率的代碼,因為它會使檢查未初始化變量的工具失敗。

在您的特定情況下,您可以將result本地化為else情況,而在其他情況下則過早返回。 但這也不符合所有人的口味。

靜態分析器會應用您定義的規則-其中一些規則會發生沖突,因為您需要將其設置為與本地編碼標准相匹配。 我認為還有一個規則可能會啟用,也可能不會啟用, 要求初始化所有變量。 而且你不能兩者都做。

選擇一個與您的首選標准相匹配的無沖突規則集。 您選擇的是意見問題,因此不是真正有效的SO問題。

大多數優秀的靜態分析器將為您提供數據流分析-會警告您可能存在未初始化變量的路徑。

以您的示例為例,假設您(偶然)錯過了以后的一項任務,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指南在任何方面都不是完美的,但是我們會盡力防止出現明顯的......並且未初始化的變量很容易檢測到-只要您不嘗試解決問題。

有點像強制轉換,只是要關閉“靜態分析”工具……

[查看免責聲明]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM