我编写了一个简单的函数,用memset()初始化 struct 值.这些是我用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

我已try 使用以下方法修复此警告

(void)memset(&mystruct, 0, sizeof(MY_STRUCT)); 

但不幸的是,我收到了两个新的警告

Cast between types that are not both pointers or not pointers

object of pointer type 'void*' cast to unrelated type 'void'

有人建议如何在使用memset()函数时修复此警告吗?此外,请解释,以避免今后出现此类警告.

推荐答案

如果你要与MISRA-C合作,你需要理解规则背后的基本原理.

第一个问题确实应该通过将结果转换为(void)来解决.这个规则的原因是对函数返回的值执行错误判断,这在本例中不适用,因为memset公认的怪异API只是返回第一个参数.

你收到的其他警告似乎是你的工具误报的.可以将任何函数的返回值显式转换为(void),请参见MISRA C:2012 17.7.

MISRA合规性不需要解决方法,但如果您只是想让工具静音,那么这也符合MISRA合规性,相当于memset:

mystruct = (struct MY_STRUCT){ 0u };

C++相关问答推荐

如何在C中从函数返回指向数组的指针?

在传统操作系统上可以在虚拟0x0写入吗?

从纯C中访问通用项对话框

C语言编译阶段与翻译阶段的关系

C中的指针增量和减量(*--*++p)

试图从CSV文件中获取双精度值,但在C++中始终为空

我的程序在收到SIGUSR1信号以从PAUSE()继续程序时总是崩溃()

在基本OpenGL纹理四边形中的一个三角形中进行渲染

防止C++中递归函数使用堆栈内存

如何在GET_STRING输入后对少数几个特定字符串进行C判断?

通过k&;r语法的c声明无效

如何在C中用bool进行文件I/O?

使用C++中的字符串初始化 struct 时,从‘char*’初始化‘char’使指针变为整数,而不进行强制转换

unions 的原子成员是个好主意吗?

Leet代码运行时错误:代码不会在Leet代码上编译,而是在其他编译器中编译,如netbeans和在线编译器

在C中交换字符串和数组的通用交换函数

Zig 中 C 的system函数的惯用替代方案

我们可以在不违反标准的情况下向标准函数声明添加属性吗?

React Native Android C++ TurboModules 静态 C 库链接问题

如何使 clangd 启用仅标头库实现