相关疑难解决方法(0)

函数指针和另一种类型之间的转换 [MISRA 2012 规则 11.1,需要] | pclint 9074

我使用如下的函数指针数组来避免switch代码中的语句。

void E_func1(void);
void E_func2(void);
void E_func3(void);

void (*pfGetVal[3])() = {
      E_func1,
      E_func2,
      E_func3
}; 
Run Code Online (Sandbox Code Playgroud)

但是在运行 misra (pclint) 时,我收到以下错误:

函数指针和另一种类型之间的转换 [MISRA 2012 规则 11.1,需要]

我需要使用typedef吗?

我尝试如下,但没有奏效。

void (*pfGetVal[3])();  
pfGetVal[0] = E_func1;
pfGetVal[1] = E_func2;
pfGetVal[2] = E_func3;
Run Code Online (Sandbox Code Playgroud)

c misra pc-lint

3
推荐指数
1
解决办法
192
查看次数

安全编码实践

我正在启动一个新的 C/C++ 嵌入式应用程序,并试图让自己了解诸如 MISRA、AUTOSAR 和我目前最喜欢的安全编码实践,这可能是因为它是最短的,NASA 所谓的 10 次幂(https://en.wikipedia) .org/wiki/The_Power_of_10:_Rules_for_Developing_Safety-Critical_Code)。我可以看到许多规则背后的逻辑。但他们都试图消除或限制动态内存分配。例如,MISRA C++ 规则 18-4-1 说:“不应使用动态堆内存分配”,而 NASA 的规则 3 是“避免堆内存分配”。AUTOSAR 的限制较少。我理解他们的意图是确保系统不会耗尽内存,但我不太清楚 C 或 C++ 编译器将什么分配为“动态堆内存分配”或“堆内存分配”。我将编辑这篇文章以提出具体问题

  1. 这是否意味着例如所有变量都需要是静态的?(已经由@klutt 回答
  2. 只是为了确保我理解正确,根据 MISRA、AUTOSAR 和 NASA 指南,临时变量是否在堆栈上声明的方法中定义并因此是“安全的”?
  3. 根据 AUTOSAR 和 NASA 指南,初始化后不能使用“new”?
  4. 根据 MISRA、AUTOSAR 和 NASA 指南,C++ 库数组是否可以?
  5. 但是根据 AUTOSAR 和 NASA 指南,不能使用像 string 和 vector 这样的 C++ 库吗?
  6. 将不胜感激任何其他“不安全”动态内存分配示例

谢谢 - 基因

c c++ embedded misra autosar

2
推荐指数
1
解决办法
295
查看次数

标签 统计

c ×2

misra ×2

autosar ×1

c++ ×1

embedded ×1

pc-lint ×1