问题标签 [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 - size_t foo = 0; 需要演员吗?
查看这个答案并知道0 是一个八进制常数:
对于十六进制[常量 [和八进制根据注释]],它是值可以适合的第一种类型:
int
,unsigned int
,long
,unsigned long
,long long
,unsigned long long
因此,我推断这不需要演员表:
但是,由于严格的 MISRA-C lint 工具,我收到一条关于非法隐式类型转换的消息 - MISRA-C:2004 Rule 10.1。
是我的理解有误,还是工具有误?
(注意:我已经改成这样,size_t foo = 0U;
因为这比与 QA 争论要简单得多,但我想满足我自己的好奇心。)
c - 为什么在一个序列点内不能有超过一个具有 volatile 限定类型的读取访问?
给定以下代码:
我发现MISRA C 2012 Rule-13.2存在问题,我决定进行一些研究。我在这里(http://archive.redlizards.com/docs/misrac2012-datasheet.pdf)发现:
在一个序列点内不得有超过一次具有 volatile 限定类型的读取访问
这里的问题是,我无法找到一个示例或解释来说明为什么在一个序列点内不能有超过一个具有 volatile 限定类型的读取访问。
我需要为违规代码找到解决方案,但我并不清楚该怎么做。
我现在知道在一个序列点内不应有超过一个具有 volatile 限定类型的读取访问。问题是,为什么?我需要知道为什么要实施解决方案并在这里向大家解释我为什么要更改代码。
问候。
c - 为什么匿名枚举未通过 MISRA C 2012 规则 10.3 而命名枚举却没有?
有问题:
为什么在 C 中将枚举元素分配给相同的枚举变量类型时必须强制转换它?
由于未通过MISRA C 2012 规则 10.3 ,我遇到了此代码的问题,该规则指出:
不应将表达式的值分配给具有较窄基本类型或不同基本类型类别的对象
代码是这样的:
我接受了一个暗示该工具可能存在缺陷的答案。我仍然相信,但在试图解决我为 typedef 枚举声明添加了一个名称时,现在是:
据我所知,两者完全相同。但是,惊喜!错误消失了!规则检查器不再将其标记为错误!
然后做了一些研究,我发现了这两个问题:
和
我意识到匿名 enum和命名 enum之间存在细微差别。但是没有什么能说明规则检查员抱怨另一种形式的原因是什么。
所以问题是:匿名枚举与命名枚举有什么区别,可能会违反 MISRA c 2012 的规则 10.3?
c - 在 C 中正确丢弃 volatile 变量内容的替代方法是什么?
在对微控制器进行编程时,有时需要读取寄存器以重置某些标志。这些寄存器是内存映射的,并在代码中声明为指向 volatile 的指针。
假设下一个片段作为示例:
这里必须读取reg才能重置它的位,除了读取它们之外,没有其他方法可以重置一些位,因此,MISRA 规则检查器抱怨有死代码,这是正确的。
我的问题是什么是读取和丢弃 **reg值以避免出现“死代码”的另一种方法?** 因为使用帖子中的方法将 volatile 表达式的结果转换为 void 具有非常相似的在这种情况下,我仍然违反了 MISRA c 2012 规则。我无法从#define MODULE_SCU或结构中更改任何内容,因此正确的替代方法是可行的方法。
当我从这个线程中读到时,我不想让编译器强制转换为 void:什么是 void 强制转换?因为如果我强制转换为 void,那么优化器可能会优化掉该读取,这是不可取的。
不要太在意片段的正确性,我只是为了说明问题而包含它
c - misra c 2004“记录实现定义的行为”规则 3.1 涵盖的问题
在此规则中,您必须转到 ISO/IEC 9899:1990 附录 G 并研究每个实施定义的行为案例以记录它们。
确定要在代码中执行哪些手动检查是一项艰巨的任务。
由于此规则,是否有某种手动检查列表?
c - 初始化枚举类型期间的 MISRA-C 警告
遵循我的代码中定义的枚举
现在下面的行已经用于初始化变量。
我得到了以下警告
基本类型“Essentially Enum”的表达式值分配给基本类型“Essentially Enum”的对象注释:MISRA 10.3 (C90-2012 req.)
有谁知道我该如何解决这个警告?
c - Misra C 规则 10.1 - 误报警告?
我的 CCS 6.1 ARM 编译器(用于 LM3Sxxxx Stellaris)会引发警告:
“MISRA 规则 10.1。如果表达式不是常量并且是函数参数,则整数类型表达式的值不应隐式转换为不同的基础类型”
对于以下代码:
我在我的代码中没有看到问题。是误报还是我的错误?
c - Misra C 规则 12.2 - 误报警告?
我的 CCS 6.1 ARM 编译器(用于 LM3Sxxxx Stellaris)抛出警告:
“MISRA 规则 12.2。在标准允许的任何评估顺序下,表达式的值应相同”
对于以下代码:
我在我的代码中没有看到问题。是误报还是我的错误?
c - 链表最合适的替代方案是什么?
我正在研究嵌入式 C,OS 中与任务相关的实现。我已经实现了Linked List。现在它需要最小化指针的使用以满足MISRA C,在我目前的实现中,我正在为任务操作在嵌入式操作系统中寻找链接列表的最佳替代方案。
c - MISRA 错误 10.1 复整数的隐式转换
我正在根据 MISRA 规则编写代码。我收到以下表达式的 MISRA 错误
check_Val = ( ~( 0x000Fu << Src_Data ) ); //其中 Src_Data 是 uint8,check_Val 是 uint32。
我分析了错误
违反 MISRA 2004 要求的规则 10.1,复杂整数表达式的隐式转换
因为 check_Val 是uint32
,所以 Lf 应该适合它。那么为什么它给出一个错误。