簡體   English   中英

MISRA C 2012即使已初始化變量也違反規則9.1

[英]MISRA C 2012 violation of rule 9.1 even with an initialized variable

我試圖擺脫代碼中的違反規則9.1。

規則9.1:具有自動存儲持續時間的對象的值在設置之前不得讀取

樣例代碼:

#include <stdint.h>
#include <stdbool.h>
#define VAL 0xABCDEFABU

int32_t main(void);
static int32_t do_test(bool k);
static void func(uint64_t *var3, const uint64_t *var5);

int32_t 
main (void)
{
    bool b = false;

    int32_t y = do_test(b);

    return y;
}

static int32_t
do_test(bool k)
{
    uint64_t i = 0, var4[10];

    int32_t result = 0;

    for(i = 0U; i < 10U; i++) {
      var4[i] = VAL + i;
    }

    if(k == false) {
      uint64_t var2[10];
      func(var2, var4);

      if(var2[9] == var4[9]) {
        result = 1;
      }

    }

      return result;
}


static void
func(uint64_t *var3, const uint64_t *var5)
{
    int32_t i;
    for(i = 0; i < 10; i++) {
      var3[i] = var5[i];
    }

}

我通過調用另一個函數“ func”(在其中將var4復制到var2中)在函數do_test中初始化var2。

它編譯正常,我得到y值= 1。

是由於func中的參數作為指針而引起的違反,函數do_test並未通過func中的指針了解值分配

反正有解決此問題的方法嗎?

這是許多靜態分析儀中常見的工具錯誤。 您的靜態分析器顯然無法理解函數func初始化了var2所有項目,因此您在var2[9] == var4[9]行上得到了假肯定。

在許多靜態分析器上,例如int my_array[10]; initialize(my_array);代碼int my_array[10]; initialize(my_array); int my_array[10]; initialize(my_array); 提供令人沮喪的誤報。 “您嘗試在數組初始化之前對其進行初始化!!!” 哦,真的。。。謝謝您,最有用的靜態分析器。

您的代碼很好。 向您的工具供應商提交錯誤報告。

暫無
暫無

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

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