问题标签 [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 - Keil 中的 __wfi() 等特定于 Cortex 的函数在哪里定义?
我正在使用 uVision Keil 4.71.0.0 IDE 为 Cortex-M0 控制器编写工业代码。我们的代码应该遵守 MISRA 规则,并定期通过 QA-C 进行检查。
我的问题是,某些特定于控制器的功能,如等__wfi()
,__current_sp()
似乎没有在任何地方定义,并且 QA-C 抱怨它们:
在Keil中右击函数名,选择“Go to definition”确认该函数没有定义:
Keil 是否提供带有此类函数原型的官方头文件?在我们的项目代码中对此类原型进行硬编码或创建 QA-C 异常将需要一个我希望避免的正式审查过程。
c - MISRA C 2012 是否说不使用 bool
我正处于一个新项目框架的早期阶段。
我定义了一个返回类型为“bool”的函数
我从 PC-Lint 得到了这个输出
我继续在另一个标题中定义它以关闭 lint:
然后我开始想知道为什么我必须这样做以及为什么它改变了任何东西。我转向 MISRA 2012 Dir 4.6。它主要关注原始类型的宽度,如 short、int 和 long、它们的宽度以及它们是如何签名的。
该标准没有给出 bool 的任何放大、合理、例外或示例。
bool 在 C99 的 stdbool.h 中明确定义为 _Bool。那么这个标准真的适用于布尔吗?
根据 C99 的第 6.2.5 节,我认为 _Bool 始终是“足以存储值 0 和 1 的最小标准无符号整数类型”。所以我们知道 bool 是无符号的。那么 _Bool 不是固定宽度并且主题以某种方式被提升的事实是否只是问题所在?因为理性似乎与这个概念相矛盾。
遵守本指南并不能保证可移植性,因为 int 类型的大小可能决定表达式是否接受整数提升。
放置如何typedef bool bool_t;
改变任何东西 - 因为我没有做任何事情来表明这样做的宽度或签名?bool_t 的宽度也将取决于平台。有没有更好的方法来重新定义 bool?
除非实现的类型实际上具有该长度,否则不得以特定长度定义类型
所以typedef bool bool8_t;
应该是完全非法的。
Gimpel 对指令 4.6 的解释是错误的,还是他们发现了?
c - 在 c Linux 中替代 system() 在 linux 上执行终端命令
我想在 C 程序中执行 Linux 的终端命令。目前我正在使用system()
函数,但我想使用任何其他system()
函数,因为根据 MISRA 禁止了该函数。
例如,我该如何替换
c - 在符合 MISRA 的 C 中传递缓冲区
MISRA 让我们的开发人员感到沮丧。
我们收到有关“不要将指针算法应用于指针”和“指针不指向数组”的 MISRA 错误。
我们使用的语法是:
将缓冲区传递给将缓冲区写入 SPI 总线的函数。
给定一个示例代码片段:
有没有办法让一个指针指向数组中的一个单元格并增加它以满足 MISRA 的要求?
我的解释是 MISRA 想要增加数组的索引而不是指针:
许多开发人员都是老派,更喜欢使用指针uint8_t
而不是传递数组。
misra - 如何修复 MISRA 警告:MISRA 18.4 (C90-2012 adv.)
我使用了一个 API,它在正式争论中捕获了参数的地址。但是我使用了日志并将该地址用于打印目的,因为我收到了 MISRA 警告,如下所示:
MISRA.PTR.ARITH 指针用于算术或数组索引表达式
如何解决此警告?
代码片段(来自评论):
c - 结构数组初始化中的 MISRA-C 错误
我有以下内容:
这对我来说似乎很好,但是 MISRA-C 给出了以下错误:
MISRA C:2012 规则 10.3 违规:[R] 表达式的值不应分配给具有较窄基本类型或不同基本类型类别的对象
我试图弄清楚为什么会发生这种情况,但我只能看到它。在类似情况下,构建结果也受到此错误的困扰,我不知道为什么。
有人知道发生了什么吗?
编辑:我还尝试显式转换每个值,但仍然出现相同的错误:
casting - 为什么在 C 中将枚举元素分配给相同的枚举变量类型时必须强制转换它?
我有以下内容:
无辜的呃,但是在编译 MISRA C 时会出现错误:
不应将表达式的值分配给具有较窄基本类型或不同基本类型类别的对象
我发现我应该编写如下初始化:
这对我来说看起来不太好,就像 MISRA 想要我在所有代码中进行强制转换,这太过分了。
你知道这是为什么吗?我不认为这应该是一个问题,但我已经尝试了所有想到的东西,这是摆脱这个错误的唯一方法,但它根本没有任何意义,不是吗?
问候。
c - 使用(有符号)枚举值的按位运算
我正在为标志使用枚举器值:
根据 MISRA-C:2004 位操作不得使用有符号类型进行。不幸的是,我的编译器 IAR 使用有符号int(或 short 或 char)作为枚举的基础类型,我能找到的唯一选项与大小有关,而不是有符号性(“--enum-is-int”)。
c - 为什么此代码不符合 MISRA-C 2012 规则 11.3
我很难理解为什么下面的代码给了我关于规则 11.3 的两个错误
在这两种情况下,错误都是:不应在指向对象类型的指针和指向不同对象类型的指针之间执行强制转换
这里的问题是TaskParams和TaskConfig都是相同类型的指针,它们分别是结构元素Params和Tasks。我不明白为什么我不能将TaskParams分配给*Params如果它们具有完全相同的类型。我错过了什么吗?
非常感谢您的帮助,我希望这可以得到解释,因为我真的很沮丧。
编辑:如果有帮助的话,我已经包含了所有相关的数据类型。
问候。
c - 算术加法的 MISRA C 合规性
给定变量a
、b
和c
:
根据 MISRA-C 2012 标准,表达式a+b+c
是合规的,而b+c+a
不是不合规的。
为什么?