首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MISRA增量(C)

MISRA增量(C)
EN

Stack Overflow用户
提问于 2015-05-14 14:02:02
回答 3查看 8.9K关注 0票数 13

在调试一些嵌入式代码时,我遇到了这样的情况:

代码语言:javascript
复制
buffPtr = &a[5];
buffEndPtr = &a[10];

while (buffPtr != buffEndPtr) 
{ 
    *buffPtr = 0xFF; 
    buffPtr  = &buffPtr[1];         /*  MISRA improvement for: buffPtr++ */ 
}

为什么这个构造比(*buffPtr)++更好呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-05-14 14:44:52

有一个MISRA规则,它声明唯一允许的指针数学是索引操作。

您所显示的模式是执行得不好的工作。它是丑陋的/怪异的/不常见的,而且可能是基于对该规则的目的的误解。这也可能违反另一条规则。

编写这段代码的更好方法是:

代码语言:javascript
复制
for(i=5; i < 10; i++)
{
    a[i] = 0xff;
}

更新2015-05-20 -由于这是公认的答案,以下是实际违反的规则,由embedded.kyle提供:

MISRA-C:2004,规则17.4 (必需)或MISRA-C:2012,规则18.4 (必需)数组索引将是唯一允许的指针算术形式。

票数 12
EN

Stack Overflow用户

发布于 2015-05-14 15:20:41

(*buffPtr)++违反的规则是:

MISRA-C:2004,第17.4条(要求)或MISRA-C:2012,第18.4条(要求) 数组索引将是唯一允许的指针算法形式。

他们在这一规则背后的理由:

使用数组下标语法ptr[expr]进行数组索引是指针算法的首选形式,因为它通常更清晰,因此比指针操作更容易出错。任何显式计算的指针值都有可能访问意外或无效的内存地址。这种行为在数组索引中也是可能的,但是下标语法可以简化手动检查的任务。 C中的指针算法可能会使新手感到困惑,表达式ptr+1可能会被错误地解释为将1添加到ptr中持有的地址。实际上,新的内存地址取决于指针目标的字节大小。如果sizeof应用不当,这种误解可能导致意外行为。

米斯拉的许多规则都有类似的理由。基本上,他们的思维过程是,如果您编写的尽可能简单和显式,代码将更加可读性和可维护性,这将导致本质上更安全的代码。更安全的代码是MISRA标准背后的目的。

正如Brian所指出的,有一些方法可以编写符合MISRA的代码,但仍然违背了规则背后的意图。在我看来,Brian的for循环示例将是最常见和最容易理解的构造。

票数 10
EN

Stack Overflow用户

发布于 2015-05-18 09:25:50

在MISRA:2004规则第17.4条中,有一条咨询规则禁止一切形式的指针算术。意图是好的,该规则的目的是试图禁止具有潜在危险的法典,例如:

代码语言:javascript
复制
stuff* p; 
p = p + 5; // 5 stuff, not 5 bytes, bug or intentional?

和硬读代码,例如

代码语言:javascript
复制
*(p + 5) = something;  // harder to read but equivalent to p[5]

通常,当循环遍历指向数据时,建议使用整数迭代器而不是指针算法。

然而,该规则还禁止了可能不危险的各种基本指针操作,例如ptr++。一般来说,这条规则太严格了。

在MISRA:2012中,这条规则(18.4)被放宽,只禁止+ - += -=运营商。

在您的例子中,buffPtr = &buffPtr[1];是一种逃避第17.4条规则的错误尝试,因为该规则没有多大意义。相反,程序员决定混淆他们的程序,使其可读性降低,从而降低安全性。

正确的处理方法是使用++操作符并忽略规则17.4。这是一条咨询规则,所以不需要做偏差(除非本地MISRA实现出于某种原因而不这么说)。如果您确实需要偏离,您可以简单地说,该规则对++运算符没有任何意义,然后参考MISRA:201218.4。

(当然,如另一个答案所示,将整个循环重写为for循环是最好的解决方案)

不使用常识的编程总是非常危险的,就像盲目地遵循MISRA而不理解规则背后的合理原理,或者在这种情况下缺乏这样的逻辑。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30239374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档