繁体   English   中英

如何正确解决C中的memset() function MISRA错误?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM