问题标签 [misra]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 如何删除固件中按位操作的 MISRA C 错误/警告?
我在Code Composer Studio中使用 MISRA C 2004 标准。在外围设备的初始化过程中,我总是收到有关按位运算的错误。
在编译器.h文件中,定义是这样的。
现在在我的代码中,如果我使用
MISRA C 弹出这些错误:
位运算符不应应用于基础类型已签名的操作数 - #1393-D (MISRA-C:2004 10.1/R)
如果整数类型的表达式的值不是转换为具有相同符号的整数类型,则不应将其隐式转换为不同的基础类型。
我不想更改编译器 .h 文件,我想消除这些警告。
c - 整数类型是如何隐式转换的?
以下代码在 MISRA 检查中失败。具体的错误信息是:
(MISRA-C:2004 10.1/R) 如果整数类型表达式的值不是转换为具有相同符号的更广泛的整数类型,则它的值不应隐式转换为不同的基础类型
- 为什么要转换逻辑表达式?
- 这里转换了什么?
One
当我交换和时,为什么代码通过 MISRA 检查MyVariable
?
编辑:编译器是 TI“MSP430 C/C++ Compiler v4.0.0”,包含 MISRA 规则检查。
c - MISRA 违反规则 10.1 和枚举
首先,这类似于:整数类型如何隐式转换?但有不同的 MISRA 警告。
编译器不会生成 MISRA 错误,但静态分析工具会生成。我正在处理工具制造商的票。
鉴于:
if
静态分析工具正在为语句生成 MISRA 违规:
编译器是否正确(未识别缺陷)或静态分析工具?
c - 为什么“继续”在 MISRA C:2004 中被视为 C 违规?
MISRA 14.5 说不能使用 continue 语句。谁能解释原因?谢谢你。
c - 我可以要求返回值是指向常量的指针吗
说我有两个“模块”。例如,RS-232 端口的硬件接口层及其上方的一层使其更加抽象。
我有一个这样的接收缓冲区:U8BIT myBuffer[MAX]
. U8BIT
是类型化的:typedef unsigned char
然而,可以接收两种类型的消息。一个有标题,另一个没有标题。这个逻辑已经写好了。
“上面的层”将访问此缓冲区,但它不应该知道这是一个标头还是无标头消息。
因此我有这样的功能:
如何确保调用此函数的任何函数都无法更改返回指针的内容?
是的,我知道这将永远是可能的。不要试图让其他人更难尝试修改它。我希望它是“不可能的”,这样就不会更容易出错,因为如果你尝试修改const
.
我可以将函数声明如下:const U8BIT * fooBuffer(U8BIT * maxLength)
c - 从函数中的数组参数存储指向文件范围内的数组的指针
我正在重建一个应用程序以符合 MISRA 规则并使用 QA-C 来分析我的代码。
这些烦人的规则之一涉及指针和数组。你不能说:
你也不能这样做:
我的问题涉及两个函数和一个文件范围变量。
最初此代码执行以下操作(类似于位伪代码):
我试图将其重写为以下内容:
但是随后 misra 和我的编译器(softune,由 Fujitsu)都抱怨。编译器说:
从 CHAR (*)[]' 分配不兼容的指针类型
CHAR **' to
:运算符 `='
米斯拉 说:
[C] 赋值的右操作数不是兼容的指针类型。导出到具有链接或更广泛范围的指针的自动对象的地址。
但是我确实需要能够在 foo_c 函数中索引一个数组。或者还有其他方法可以遵循 misra 并使我的代码正常工作。
如果我在同一个文件中执行以下操作:
然后,Misra 和我的编译器都没有抱怨任何事情。
c - 为什么 MISRA 规则禁止使用“#undef”?
为什么 MISRA 规则禁止#undef
在程序中使用?如果我想限制任何宏的范围,如何在不使用的情况下做到这一点#undef
?
c - 关于 MISRA 的 C 中联合的想法
米斯拉说要禁止所有工会。我也知道,只要彻底讨论和记录偏差是允许的。
我们有一个微控制器和一个外部 eeprom 来存储统计数据(事件/错误记录、参数设置等等)。
事件日志由大约 80 多个事件计数器组成,其中一些是 8、16 和 32 位(全部无符号)。参数存储由大约 200 个参数组成,还混合有 8、16 和 32 位值(无符号)。
我们正在重写所有代码以符合 MISRA,并且这些值之前定义如下:
现在这并不真正符合 MISRA。参数日志也是如此。然而,这是从 eeprom 读取和写入的最简单方法,因为我只需通过数组读取/写入即可从 eeprom 读取/写入。
我们还有一些其他规则是不允许我们违反的。没有全局(外部)变量(通过头文件)。如果需要,所有局部变量只能通过 get/set 函数访问。
这意味着,如果我们需要完全写出所有这些参数,那么这些参数都应该有自己的 get/set 函数,以便在整个应用程序中更改它们。
我考虑过的解决方案如下:
但是,如果添加或删除值,这会带来繁琐的重构。这也意味着不能使用数组类型的值(并且有一些),如果使用或多或少的某种类型(例如传感器),可以通过定义长度来改变这些值。
你对这个具体问题有什么看法。在这种特定情况下,我/我们是否会更好地记录我们与 MISRA 标准的偏差,并且只在这个特定的地方使用这种偏差,还是有更好的解决方案来解决这个问题?
c - C中的积分提升和平衡有什么区别?
积分提升和平衡有什么区别。我们是否可以总结这两条规则,即任何类型在执行任何操作之前都转换为至少 int 或 unsigned int 类型(逻辑运算符 &&、||、! 除外),如果任何操作数的类型更大,则转换为更大的类型比 int ?
c - 用布尔值告诉 VX-Tasking “bool”?
我正在使用 Tasking VX 工具集(基于 Eclipse)并且有一个我无法解决的相当基本但基本的问题......我已经 RTFMed 并且仍然完全不明智。
想象一下简单的代码片段:
如果我启用 MISRA-C 检查,我会得到以下信息:
Eclipse 设置为 C99 实现,根据标准库定义,stdbool.h
定义为:
我假设这个错误是因为#define false 0
该工具隐式转换为 bool?
注意:如果我进行分配,则错误将被删除:
但是(恕我直言)这是在掩盖问题,而不是解决它,我真的不想放弃每一项任务。
诸如 LINT 之类的工具允许您指定 bool 类型来阻止这些误报......我需要 Eclipse/Tasking 的等价物
所以我的问题是:
我怀疑某处有一个工具选项可以告诉 TASKING 那bool
是布尔类型,因此false
可以true
使用吗?
有没有?
{请不要在 [on this thread] 讨论 MISRA 的优点(或其他方面)}