作为汽车嵌入式开发的相对新手,我目前面临一个问题,我需要将指针初始化到一个给定的地址,然后用它来浏览微控制器的ROM。
由于我的代码必须符合MISRA-C 2004标准,我想在声明中初始化此指针而不分配新的内存,无论如何都不会使用,但是,为了避免“不要使用指针”算术“MISRA-error,我需要将它声明为数组。
让我向您展示我目前的澄清代码:
static uint8* MemoryCursor_p = FIRST_ADDRESS_POINTED_BY_CURSOR;
/* Some cool stuff happens here*/
MemoryCursor_p = &( MemoryCursor_p [1]); /* Moving the cursor one byte forward in memory*/
这会导致MISRA检查触发错误,因为MemoryCursor_p未定义为数组,而是定义为指针。但是如果我将它声明为一个数组,我被要求定义指向的值,但我想在声明中设置指向的地址。
当然,如果我只是尝试:
MemoryCursor_p += 1ul;
我被MISRA骂了使用指针运算。
我想避免犯下MISRA违规行为。有人可以告诉我如何继续吗?
就像这些代码位的指示一样:这是一个简单CRC16算法实现的一部分,该算法对某些内存进行校验和。
非常感谢!
答案 0 :(得分:4)
你永远不应盲目跟随MISRA,更不用说盲目跟随你的静态分析仪警告了。
在MISRA-C:2004中提到的规则17.4没有任何意义。这是一种误导性的尝试,以防止使用*(x + i)
而不是更清晰的x[i]
。但是规则中提供的越界错误的基本原理没有任何意义,没有人可以争论为什么*(x + i)
形式不那么安全(除了可读性较差)。
因此,此规则已在MISRA-C:2012中取代。因此,在我看来,正确的方法是在整个公司范围内制定偏离规则的方法。阻止与17.4相关的所有警告。
在任何情况下,您都不应该尝试使用一些模糊的,混淆的语法来规避规则。 MemoryCursor_p++
是正确的,最清晰的形式,使用它。或者,使用计数器变量i
并访问数组项目编号i
。两种形式都没问题。
答案 1 :(得分:0)
@Domack - MISRA-C:2004年关于偏差的书前面有一整节......现在有一整本书(MISRA C Compliance),如果您愿意,同样适用!我同意Lundin的观点,你最好的选择是引用偏差,引用2012年的变化