Tag: misra

MISRA违规规则10.1和枚举

首先,这类似于: 如何隐式转换整数类型? 但是有一个不同的MISRA警告。 编译器不会生成MISRA错误,但静态分析工具会生成错误。 我正在与正在进行的工具制造商订票。 鉴于: #include enum Color {RED, VIOLET, BLUE, GREEN, YELLOW, ORANGE}; int main(void) { enum Color my_color; my_color = BLUE; if (my_color == YELLOW) // Generates MISRA violation, see below. { printf(“Color is yellow.\n”); } else { printf(“Color is not yellow.\n”); } return 0; } 静态分析工具正在为if语句生成MISRA违规: MISRA-2004 Rule 10.1 violation: implicitly […]

BLAS和LAPACK库是否符合MISRA标准?

我猜答案是否定的 。 但是,我想知道是否有人对此话题有所了解。 BLAS和LAPACK库是否符合MISRA标准? MISRA标准(MISRA C:1998,MISRA C:2004,MISRA C:2012)极其苛刻,我相信BLAS和LAPACK库不符合它。 因此,如果我的软件项目要求MISRA合规,我不应该使用这样的库。 对这个问题的任何见解都将受到极大的赞赏:)

Misra C规则12.2 – 误报警告?

我的CCS 6.1 ARM编译器(用于LM3Sxxxx Stellaris)发出警告: “MISRA规则12.2。在标准允许的任何评估顺序下,表达的价值应相同” 用于以下代码: typedef struct { … uint32_t bufferCnt; uint8_t buffer[100]; … } DIAG_INTERFACE_T; static DIAG_INTERFACE_T diagInterfaces[1]; … DIAG_INTERFACE_T * diag = &diagInterfaces[0]; uint8_t data = 0; diag->bufferCnt = 0; diag->buffer[diag->bufferCnt++] = data; // line where warning is issued … 我的代码中没有发现问题。 这是误报还是我的错误?

如何在DIS 4.12和4.8之后的MISRAC:2012中创建模块?

该问题涉及遵循MISRAC:2012指南的ISO C99编码。 我正在寻找关于Dir 4.8的指导“如果在翻译单元中从不取消引用结构或联合的指针,那么应该隐藏对象的实现”与Dir 4.12一起“不应使用动态内存分配”。 在C中实现抽象数据类型时,通常使用句柄来引用ADT,该句柄是指向描述ADT内部状态的结构的指针。 这可以使用根据Dir 4.8的不透明指针来完成,其好处是内部细节对用户隐藏。 通常可以存在多个这些ADT,因此必须有一种方法来创建多个句柄。 这可以通过在初始化函数中为句柄引用的内部细节分配内存来解决,但是,在Dir 4.12下不允许这样做。 另一个选择是初始化例程接收指向用户提供的静态分配句柄的指针,但是,这不能使用不透明指针来完成。 我在下面说明了这个问题。 Module.h struct module; typedef struct module module_t; /* Module handle is only available to the world as an incomplete type. This allows us to satisfy MISRAC 2012 Dir 4.8.*/ Module.c #include “module.h” struct module { uint8_t value; }; module_t* module_get_a_handle(void) { return […]

具有(带符号)枚举值的按位运算

我正在使用标志的枚举器值: typedef enum { a = 0x00, b = 0x01u, // the u has no influence, as expected c = 0x02u, // the u has no influence, as expected … } enum_name; volatile unsigned char* reg = SomeAddress; *reg |= b; 根据MISRA-C:2004,不应使用带符号的类型进行按位操作。 不幸的是,我的编译器IAR使用signed int(或short或char)作为枚举的基础类型,我能找到的唯一选项与大小有关,而不是签名(“–enum-is-int”)。

为什么在MISRA:2012中需要function原型?

我想知道为什么MISRA要求function原型:2012。 在下面的示例中,两个原型并不是必需的。 #include #include // >>> Truly useless in my opinion void display(void); int main(void); // <<< void display(void) { printf("Hello World!\n"); } int main() { display(); return EXIT_SUCCESS; } 我在这里可以阅读的基本原理对我来说不是很清楚。 例如,如果main在声明之前尝试访问display ,则编译器或静态分析器将引发错误:声明之前使用的函数显示。 换句话说,为这个MISRA规则创建偏差是个好主意吗?

米斯拉2012背后的理由不允许在不同的指针之间施放

我目前正在开展一个项目,要求代码符合Misra 2012标准。 在整个项目中,我们有许多必需的misra警告告诉我们,我们无法将指针转换为指向另一种类型的指针。 像void *memcpy(void *to, const void *from, size_t n)这样简单的事情void *memcpy(void *to, const void *from, size_t n)产生两个Misra Required警告,因为需要分别将类型转换为void *和const void *。 从void *转换为指向任何其他类型的指针也会产生Misra警告。 我的问题是Misra如何在不抛出任何警告的情况下期望malloc和其他所有工作? 即使将void * buffer转换为uint8_t * buffer来逐字节解析abuffer并填充结构结构的所有元素也会引发大量警告? 而不是这些警告,它不仅可以显示使用注释或信息要求我们仔细检查包装,对齐和其他可能出错的地方吗?

为什么“继续”在MISRA C:2004中被视为C违规?

MISRA 14.5表示不得使用继续声明。 任何人都可以解释原因吗? 谢谢。

Misra标准的嵌入式软件

我要求制作大量符合MISRA标准的代码。 第一个问题:有人可以根据经验对嵌入式系统编写的代码进行评估 。 据我所知,“写得好”的定义不明确,含糊不清,所以我要求进行原始估算。 第二个问题:任何可以自定义的工具建议(即允许禁止特定警告)并在自动构建环境中使用(即命令行界面) 任何其他有用的建议,可以帮助完成这项任务。 谢谢伊利亚。

我可以选择禁用这两个MISRA规则:每个函数一个语句和强制函数原型吗?

我们公司现在是ISO-13485(医疗设备),并希望使用MISRAC2012。 我阅读了标准,但如果我认为可以提高稳定性和可读性,我无法弄清楚是否可以禁用某些规则。 两个例子: MISRA每个函数只允许1个return语句。 这通常会导致嵌套的条件结构看起来像圣诞树。 我真的不认为这条规则会增加安全性,因为它会降低代码的可读性并且更容易出错。 MISRA只接受具有原型的function,即使是静态function。 这允许程序员将其function放在文件中的任何位置而不考虑调用顺序。 没有原型,main函数必须是文件中的最新函数,并且多函数递归是不可能的,因为函数只能调用上面声明的函数。 如果我想禁用这两个规则,我可以这样做吗? 有客户会因此而责备我吗?