【问题标题】:MISRA C 2012 violation of rule 9.1 even with an initialized variableMISRA C 2012 违反规则 9.1 即使使用初始化变量
【发布时间】:2017-12-14 10:31:31
【问题描述】:

我正在尝试从我的代码中删除违反规则 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”在函数 do_test 中初始化 var2,其中 var4 被复制到 var2。

编译正常,我得到 y value = 1。

是否是由于func中的参数作为指针而导致的违规,并且函数do_test没有通过func中的指针了解值分配

有没有办法解决这个问题?

【问题讨论】:

  • var3var5 是否已初始化? var5[i] 是否已初始化?显然不是,所以这并不违反规则。
  • 出于好奇,哪个工具发出了警告?我想我还没有找到没有这个错误的。
  • 函数:main()在C语言中是特殊的,不要原型。使用int的返回类型,
  • 阅读rule sets 了解“规则集”以及如何操作它们。
  • 详细信息:“我正在初始化 var2 ... function "func" "。 C 将其描述为分配var2 的元素。要初始化 var2,使用uint64_t var4[10] = { something }; 之后的任何内容都是assignment

标签: c misra


【解决方案1】:

这是许多静态分析器中的常见工具错误。您的静态分析器显然无法理解函数func 初始化了var2 的所有项目,因此您在var2[9] == var4[9] 行上得到误报。

在许多静态分析器中,int my_array[10]; initialize(my_array); 等代码会产生令人沮丧的误报。 “您尝试在数组初始化之前对其进行初始化!!!”哦,真的...谢谢你,最有用的静态分析器。

您的代码很好。向您的工具供应商提交错误报告。

【讨论】:

  • @LundinI 在 switch 语句中遇到了同样的违规行为: switch (val) { case 0: result = 1;休息;案例 1:结果 = 2;休息;案例 2: if(temp == 1) { result = 2; } int32_t a = 10;一个+= 5;结果=一个;休息;案例 3:结果 = 4;休息;默认值:结果 = 0;休息; } 。当我为案例 2 引入花括号时,问题得到了解决。可能是什么原因?
  • @Salim 工具错误。
  • ' 我正面临违反规则 9.1 的另一种情况。我想在初始化之前读取一个自动变量(在声明时具有垃圾值),如果它不为 null,则分配 null。如果为空,则具有不同的值。示例代码:{ int8_t reg_num; uint64_t var1[NUM]; for (reg_num = 0; reg_num
  • @Salim 在初始化之前读取自动存储持续时间变量(没有获取其地址)始终是未定义的行为。因此,您的代码有一个错误:循环没有意义。只需初始化uint64_t var1[NUM] = { 0 };。错误已修复。作为奖励,您的代码变得更快、更易读。
猜你喜欢
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多