And*_* W. 7 c embedded misra embedded-linux
据我所知,MISRA-C标准适用于嵌入式固件.当嵌入式Linux是您的产品平台时,您的嵌入式应用程序可以/应该开发为符合MISRA-C吗?有没有人考虑过这样的练习?
我的一般意义是你必须先了解所有"规则",然后在设计/编码阶段应用它们.可能存在需要强制符合系统调用(pthread_create)和void*的情况 - 产生难看的代码.
一句话:不。
MISRA 确实提供了一些很好的指南,但您最好只选择您想要遵守的规则(假设您在构建/静态分析中进行了自动检查)。
浏览一下 MISRA-2004 的内容,以下是一些问题区域。
让所有库都符合 MISRA 本身就是 MISRA 规则。
内核和用户空间代码的数十亿行都违反了goto、、 、函数返回和指针算术规则,因此祝您的库(或内核)合规。continuebreak
如果使用套接字以及其他常见 API,则将无法遵循指针转换规则。
MISRA-2004 11.2 不得在指向对象的指针和除整型类型、另一个指向对象类型的指针或指向 void 的指针之外的任何类型之间执行转换。
2004-20.x部分禁止<errno.h>、<stdio.h>和<time.h>. <signal.h>如果您正在编写长期运行的、健壮的服务,那么禁止信号和错误检查会导致糟糕的 Linux 编程。
那里的某个地方没有动态内存分配的规则。
我知道 MISRA 的规则允许您在记录规则时违反规则(这是必需的还是只是建议性的???),但是您将记录太多的例外情况,这实际上毫无意义。
话虽如此,如果您有客户坚持要求遵守 MISRA(这是我见过使用它的唯一原因),您可能可以记录所有违反规则的行为,并尝试称自己符合 MISRA。因此,在 Linux 上假装符合 MISRA 可能有一个商业案例,但我认为其中几乎没有技术优势。
恐怕如果你想真正合规并且需要一个重量级/全功能的操作系统,你最好花钱购买 QNX、GHS Integrity、VxWorks 等。
虽然 MISRA-C 最初是作为汽车和安全关键型应用的标准而创建的,但现在情况已不再如此。如今,MISRA-C 更像是一个通用标准,可用于任何不希望出现错误、崩溃和可移植性问题的 C 程序。
您需要问自己为什么使用 MISRA-C。是因为您希望将其用作编码标准来消除错误,还是因为该应用程序具有关键任务性质?
对于 Linux 情况,主要问题是您是否只有自己的代码符合 MISRA 标准,或者您是否要求所有包含的库都符合这一要求。而且您无法使 Linux 内核 + 库符合 MISRA,您必须从头开始重写 Linux。
这使得 Linux 不适合关键任务软件。但如果您的程序不是关键任务,您应该能够使用 Linux。您可能必须提前写下 MISRA-C 的一些常设偏差,因为您知道的事情会导致问题。