misra相关内容
我主要知道两种方法(有许多变体,使用双字段,每个外围设备的数据结构,等等)使用GCC声明内存映射寄存器: 使用以右地址开头的指针,如volatile uint32_t *pMyRegister = (uint32_t *)0xDEADBEEFUL; 或定义一个变量并手动映射它,如volatile uint32_t MyRegister __attribute((section(".regi
..
我目前对 C 结构的信息隐藏概念有些困惑. 这个问题的背景是一个嵌入式 c 项目,对 OOP 的了解几乎为零. 到目前为止,我总是在相应模块的头文件中声明我的 typedef 结构.所以每个想要使用这个结构体的模块都知道结构体类型. 但经过 MISRA-C 检查后,我发现了中等严重性警告:MISRAC2012-Dir-4.8- 结构的实现不必要地暴露给翻译单元. 经过一番研
..
MISRA强制对无符号整数常量使用 U 后缀 uint32_t the_answer = 0x42U; 我觉得 U 有点像样板,因为没有它,这行很容易理解. 所以我想知道这个规则有多重要,以及 unsigned int x = 1 是否真的是隐式整数提升的错误示例. 解决方案 您是正确的,根据规则10.3的例外,此特定示例中的U是多余的: “如果一个基本符号类型的非负整
..
MISRA C ++规则18-4-1说: 不得使用动态堆内存分配. 请参阅: http://dist.sonarsource.com/reports/coverage/misra_c++_2008.html 根据此规则,MISRA C ++规则允许使用 std :: string ,因为随着字符串变大, std :: string 确实会分配内存.还有,像 std :: stri
..
在我当前使用MISRA 2004标准的项目中,我们使用了三个GCC编译器,版本3.2.3、4.4.2和5.4.0. 我们使用脚踏开关和c89标准以及大量其他限制运行构建检查.限制之一是必须在声明时初始化所有数据. 我有一个问题,在GCC 3.2.3上,通用零初始化程序{0}仅针对基本单一类型的数组进行编译.如果我有一个结构数组,那么我会得到一个缺失的大括号警告,并且仅当我将{0}更改为
..
我正面临着违反规则9.1的情况. 我想在初始化之前读取一个自动变量(在声明时具有垃圾值),并在不为null的情况下分配null.如果为null,则使用不同的值. 示例代码: { int8_t reg_num; uint64_t var1[NUM]; for (reg_num = 0; reg_num
..
我有以下代码部分: ----------header--------------------- typedef volatile struct REG_Base{ a; b; }REG_t #define address (0xFFF45556) ------------------------------------ --------Source--------------
..
首先,这类似于:如何隐式转换整数类型?,但带有不同的MISRA警告. 编译器不会生成MISRA错误,但是静态分析工具会生成.我正在与工具制造商取得票证. 给出: #include enum Color {RED, VIOLET, BLUE, GREEN, YELLOW, ORANGE}; int main(void) { enum Color my_co
..
我正在使用PC-Lint将MISRA C:2012标准验证为我的MCU代码. 我遇到了以下错误.在这里发布了示例代码,其中条件语句出现了错误. 1]无符号整数文字,不带'U'后缀[MISRA 2012 Rule 7.2,必填] S_LCB_100, 2]逻辑运算符'&&'右侧的副作用[MISRA 2012规则13.5,必填] while(((0x00000000!= List [Loo
..
我猜答案是否.但是,我想知道是否有人对此主题有所了解. BLAS和LAPACK库是否符合MISRA标准? MISRA标准(MISRA C:1998,MISRA C:2004,MISRA C:2012)要求极高,我相信BLAS和LAPACK库不符合该标准.因此,如果我的软件项目要求符合MISRA,则不应使用此类库. 对此问题的任何见识都将得到极端的赞赏:) 解决方案 除非该库被积
..
我正在尝试读取以前写在NVM闪存上的变量的值. 我的代码是: uintptr_t address = getAddress(); //[MISRA C++ Rule 5-2-8] cast from unsigned int to pointer uint16_t value = *(reinterpret_cast(address)); 问题是在MISRA
..
我想知道为什么MISRA:2012需要功能原型.在下面的示例中,这两个原型并不是必需的. #include #include // >>> Truly useless in my opinion void display(void); int main(void); //
..
为什么MISRA规则禁止在程序中使用#undef?如果我想限制任何宏的范围,如何在不使用#undef的情况下做到这一点? 解决方案 基本上,由于MISRA过于偏执并且不信任程序员不知道自己在做什么:-)认真地说,MISRA试图防止某些错误并受到指导相信如果您禁止潜在的有问题的代码构造,软件的可靠性就会突然提高.这是否成立尚有争议.在#undef的情况下,可能的原因是,一旦定义了宏,它的扩展
..
我有以下内容: typedef struct { uint8_t BlockID; uint32_t Copies; uint16_t Size; }NVMM_ConfigType; const NVMM_ConfigType NvmmCnf_Layout[6] = { { 1, 1, 4}, { 2, 3, 4}, { 5, 5, 16
..
当名称空间为“警告1573"(“在与类型相关联的名称空间中声明的通用函数模板的名称")是否确实相关吗? 匿名名称空间?我测试的大多数辅助函数都放在未命名的命名空间中,这违反了上述规则. 示例: namespace { template T template_func(T arg) { return arg; } class foo
..
我们的公司现在是ISO-13485(医疗设备),并且希望使用MISRAC2012.我阅读了该标准,但是如果我认为它可以提高稳定性和可读性,则无法确定是否可以禁用某些规则. 两个示例: MISRA每个函数仅允许1个返回语句.这通常会导致嵌套的条件结构看起来像圣诞树.我真的不认为这条规则会增加安全性,因为它会使代码的可读性降低并且更容易出错. MISRA仅接受具有原型的功能,即使是静
..
我的静态分析器抛出以下警告: MCPP规则5-0-3:此复杂表达式被隐式转换为 不同的基本类型 对于以下代码: void func(const uint32_t arg) { //32U has underlying type uint8_t const uint32_t u32a = arg % 32U; //warning issued in this lin
..
我在项目中切换到定长整数类型的主要原因是,它们在使用它们时帮助我更清楚地考虑整数大小.通过#include 包括它们还包括许多其他宏,例如打印宏PRIu32,PRIu64,... 要将常量值分配给固定长度的变量,我可以使用UINT32_C()和INT32_C()之类的宏.每当我分配一个恒定值时,我就开始使用它们. 这导致类似于以下代码: uint64_t
..
这个问题可能太宽泛或偏见,但我知道这个站点充满了经验丰富的程序员,我认为这可能会鼓励进行很好的讨论. 我正在用C实现嵌入式应用程序,其中我使用了一个包含结构的链表: struct my { uint16_t x; uint16_t y; char *text; struct my *next; struct my *prev; }; 总
..
我目前正在从事一个项目,该项目要求代码与Misra 2012兼容.在整个项目中,我们有很多要求的错误警告,告诉我们我们不能将一种类型的指针转换为另一种类型的指针.像void *memcpy(void *to, const void *from, size_t n)这样简单的事情会产生两个Misra Required警告,因为to和from都需要分别类型转换为void *和const void
..