Tag: misra

C中的Integral Promotion和Balancing有什么区别?

积分促销和平衡之间有什么区别。 我们可以在执行任何操作之前将任何类型转换为atleast int或unsigned int类型(逻辑运算符&&,||,!除外)以及更大类型(如果任何操作数的类型更大)比int?

为什么我的工具在这里抛出MISRA错误?

我该怎么做才能避免MISRA为下面的代码提供此错误? 我尝试使用(unit16_t)进行投射。 但后来它不允许明确的转换。 在复杂表达式中从基础MISRA类型“unsigned char”到“unsigned int”的非法隐式转换(MISRA C 2004规则10.1) uint8_t rate = 3U; uint8_t percentage = 130U; uint16_t basic_units = rate * percentage;

状态机没有function指针

我已经实现了一个复杂的状态机,具有许多状态转换,用于安全SIL 4系统。 此实现的后骨是使用函数指针完成的。 当一切顺利航行时,V&V反对在SIL 4系统中使用function指针。 参考 – 规则9 NASA .Misra C 2004然而并没有说不能使用函数指针。 有没有其他方法可以在没有任何函数指针的情况下实现复杂的状态机?

C / C ++条件返回语句

我正在研究嵌入式程序,在某些情况下如果没有条件,我想尽快从函数返回。 如果我有以下代码,我正在进行嵌入式编程: foo() { if (a < b) { return 0; // bail, since condition is met } else { // lots of calculations in this block } return 1; } 我的问题是,有多个return语句是不是很糟糕? 这是不好的做法吗? 有更好的方法吗? MISRA是否对此有所说明? 注意:这个问题特别针对嵌入式系统,与MISRA有关,而不仅仅是C / C ++ 谢谢…

如何隐式转换整数类型?

以下代码在MISRA检查中失败。 具体的错误消息是: (MISRA-C:2004 10.1 / R)如果不是转换为相同签名的更宽整数类型,则整数类型表达式的值不应隐式转换为不同的基础类型。 typedef enum _MyEnum { One, Two } MyEnum; MyEnum MyVariable; int foo(void) { int result = 1; if (One == MyVariable) // fails here with MISRA-C:2004 10.1/R { result = 2; } return result; } 为什么逻辑表达式被转换? 什么转换在这里? 当我交换One和MyVariable时,为什么代码会通过MISRA检查? 编辑 :编译器是TI“MSP430 C / C ++编译器v4.0.0”,包含MISRA规则检查。

计算函数返回值的最佳实践

通常我在C中构建函数来检查一些参数并返回错误代码。 当我发现错误时停止值检查的最佳方法是什么? 第一个例子: ErrorCode_e myCheckFunction( some params ) { ErrorCode_e error = CHECK_FAILED; if( foo == bar ) { if( foo_1 == bar_1 ) { if( foo_2 == bar_2 ) { error = CHECK_SUCCESS; } } } return error; } 第二个例子: ErrorCode_e myCheckFunction( some params ) { if( foo != bar ) { return CHECK_FAILED; […]