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

How to properly solve memset() function MISRA errors in C?

我编写了一个简单的函数来使用 memset() 初始化结构值。这些是我用C语言写的代码。

myfile.h

typedef struct{
 bool flag;
 bool check;
 int val_1;
 int val_2;
} MY_STRUCT;

myfile.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() 函数时修复此警告吗?也请解释一下,以避免将来出现此类警告。

memset function 的 return 值是一个 void* 指针,它是传递的第一个参数 (dest) 的副本。在您的情况下,这是 actual 变量的地址,因此它不可能是 NULL;因此,将 returned 值与 NULL 进行比较很可能会阻止 MISRA 警告(但该测试应该永远不会失败):

if (!memset(&mystruct, 0, sizeof(MY_STRUCT))) {
    (void)fputs("I'm sorry, but an impossible error has occurred!\n", stderr);
} 

如果要使用 MISRA-C,您需要了解规则背后的基本原理。

确实应该通过将结果转换为 (void) 来解决第一个问题。这条规则的原因是强制对函数的 returned 值进行错误检查,这在这种情况下不适用,因为 memset 公认的怪异 API 只是 returning 第一个参数.

您收到的其余警告似乎是您的工具误报。将任何函数的 return 值显式转换为 (void) 是合规的,参见 MISRA C:2012 17.7.

MISRA 合规性不需要 work-around,但如果您只是想使该工具静音,那么这也符合 MISRA 合规性,相当于 memset:

mystruct = (struct MY_STRUCT){ 0u };

引用代码:

static MY_STRUCT mystruct;

void Test()
{
  memset(&mystruct, 0, sizeof(MY_STRUCT)); 
}

违反了 MISRA C:2012 必需的 规则 17.7,该规则明确指出 return 由函数编辑的值应使用 non-void return 类型 .

memset() returns a void* 因此要遵守规则 17.7,必须 used 或按照规则的建议,投至 void.

虽然在 memset() 的特定情况下,可以说 the return value is pointless 语言就是语言,MISRA 规则也不例外。

(void) 添加强制转换应该没有开销...但如果您特别担心,您总是可以 偏离 规则。