[英]How to remove MISRA C errors/warnings on bitwise operations in firmware?
[英]How to properly solve memset() function MISRA errors in C?
我写了一个简单的 function 来使用memset()
初始化结构值。 这些是我用 C 语言编写的代码。
我的文件.h
typedef struct{
bool flag;
bool check;
int val_1;
int val_2;
} MY_STRUCT;
我的文件.c
static MY_STRUCT mystruct;
void Test()
{
memset(&mystruct, 0, sizeof(MY_STRUCT));
}
当我运行 MISRA 时,出现这种错误
The return value of non-void function 'memset' shall be used
我尝试使用以下方法修复此警告
(void)memset(&mystruct, 0, sizeof(MY_STRUCT));
但不幸的是,我收到了 2 个新警告
Cast between types that are not both pointers or not pointers
object of pointer type 'void*' cast to unrelated type 'void'
有人建议如何在使用memset()
function 时修复此警告? 还请解释以避免将来出现此类警告。
如果您要使用 MISRA-C,则需要了解规则背后的基本原理。
第一个问题确实应该通过将结果转换为(void)
来解决。 这条规则的原因是强制对函数的返回值进行错误检查,这在这种情况下不适用,因为 memset 公认的怪异 API 只是返回第一个参数。
您收到的警告 rest 似乎是您的工具误报。 将任何 function 的返回值显式转换为(void)
是合规的,请参阅 MISRA C:2012 17.7。
MISRA 合规性不需要变通方法,但如果您只是想使该工具静音,那么这也符合 MISRA 标准,并且等同于 memset:
mystruct = (struct MY_STRUCT){ 0u };
memset
function的返回值是一个void*
指针,它是传递的第一个参数 ( dest
) 的副本。 在您的情况下,这是一个实际变量的地址,因此它不可能是NULL
; 因此,将返回值与NULL
进行比较很可能会阻止 MISRA 警告(但该测试应该永远不会失败):
if (!memset(&mystruct, 0, sizeof(MY_STRUCT))) {
(void)fputs("I'm sorry, but an impossible error has occurred!\n", stderr);
}
引用代码:
static MY_STRUCT mystruct;
void Test()
{
memset(&mystruct, 0, sizeof(MY_STRUCT));
}
违反了 MISRA C:2012 Required Rule 17.7,该规则明确指出The value returned by a function having non-void return type shall be used 。
memset()
返回一个void*
,因此为了遵守规则 17.7,必须使用它或按照规则的建议转换为void
。
虽然在memset()
的特定情况下,可以说返回值毫无意义,但语言就是语言,MISRA 规则也不例外。
向(void)
添加强制转换应该没有开销......但是如果你特别关心,你总是可以偏离规则。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.