在函数参数中计算C表达式是否违反MISRA C准则?
现在考虑一下在安全关键嵌入式软件中执行的以下代码,在函数参数中计算C表达式是否违反MISRA C准则?,c,compiler-optimization,misra,C,Compiler Optimization,Misra,现在考虑一下在安全关键嵌入式软件中执行的以下代码,gcc\u optimization\u level的大小为Level2。比如一个函数,voidfoo(float v)作为foo(a/b)调用其中说a和b也是float。调用函数foo时计算C表达式a/b是否违反MISRA C准则 附言:这个问题是从上周弱表述的前一个版本修订而来的。现在,这个问题确保它是一个单一的问题,而不是一个家庭作业问题,希望不会引发意见。MISRA C中没有任何东西可以阻止调用foo(a/b),只要类型正确 在MISRA
gcc\u optimization\u level
的大小为Level2。比如一个函数,voidfoo(float v)代码>作为foo(a/b)调用代码>其中说a
和b
也是float
。调用函数foo
时计算C表达式a/b
是否违反MISRA C准则
附言:这个问题是从上周弱表述的前一个版本修订而来的。现在,这个问题确保它是一个单一的问题,而不是一个家庭作业问题,希望不会引发意见。MISRA C中没有任何东西可以阻止调用foo(a/b)
,只要类型正确
在MISRA C中,基本类型
的概念是试图在C语言中引入更强的类型-这在MISRA C:2012的附录D中有详细说明,规则10.x指南是强制执行的
同样,在MISRA C中,除了第4.2节“理解编译器”和第5.3.1节“编译器配置”讨论必要的知识(未详细说明任何指南)之外,没有任何内容讨论优化级别。这些部分现在构成了本手册的一部分
免责声明:请参阅配置文件。为什么不编写此代码并通过MISRA检查器运行?MISRA是一个限制性很强的标准,我也不会感到惊讶,即使这些无辜的东西可能会被标记。无论如何,看看MISRA-C指南,我没有看到任何东西会限制函数调用中的表达式计算。“编译器优化”(标记,并提到一些特定的编译器)与MISRA有什么关系?我想说的是,代码违反了建议规则,即您应该使用float32\t
而不是float
。但是Misra2008PDF可以在谷歌上找到,你读过了吗?您是否尝试搜索可能违反的规则?你能展示真正完整的代码而不是片段吗?您担心这些代码可能会违反哪些具体规则?它与优化有什么关系?在除法a/b
中是否有检查溢出或被零除的要求?也许在函数调用表达式中这样做会使它更难遵守?亲爱的@EugeneSh。是否有任何MISRA检查器,我可以插入此代码并检查它?我曾经有一个IDE可以进行这些检查,但我不再拥有该IDE的许可证:(我的看法是,如果函数被声明为void foo(double);
a/b
应该是MISRA所称的“复合表达式”,那么这将是一个MISRA-C冲突)还有一条规则10.6反对将其分配给同一基本类型的更广泛变量。这假设函数调用被视为MISRA的赋值,因为这是C标准处理它们的方式。是的,但是OP有void foo(float)
那么我们没事了?谢谢@Andrew,我对你的回答很满意。感谢其他人的宝贵意见,我对你的评论感到充实!谢谢!