如何避免__builtin___memset_chk警告?

时间:2016-08-18 10:21:14

标签: c++ gcc

我正在运行gcc 4.8.4并使用选项进行编译:

CXXFLAGS+= -Wall -std=c++11 -pedantic -lpthread

我想使用memset将结构归零:

typedef struct
{
    TSfMsgHeader    errorHeader;
    TErrorHeader    errorType;
    TErrorDetails   errorDetails;
}TErrorInd;

uint8 g_errorIndBlock[16];

TErrorInd* p_msg = (TErrorInd *)&g_errorIndBlock[0];
memset((int*)p_msg, 0, sizeof(TErrorInd));

这会导致警告:

  

在函数'void * memset(void *,int,size_t)'中,       内容来自'void sendMsgPduError(TMsgPduError *,uint32)',来自../ MessageHandling.cpp:174:46:

     

/usr/include/x86_64-linux-gnu/bits/string3.h:84:70:警告:调用void * __builtin ___ memset_chk(void *,int,long unsigned int,long unsigned int)将始终溢出目标缓冲区[默认启用]

     

返回__builtin___memset_chk(__dest,__ ch,__ len,__ bos0(__ first));

我意识到这是一个明智的警告,但我不知道如何修改代码来修复它。

我读到std :: fill_n比memset更受欢迎。这是对的吗?

如果是这样,我将如何用fill_n替换memset?

2 个答案:

答案 0 :(得分:2)

检查sizeof(TErrorInd)的值,由于某种原因,gcc认为它大于sizeof(uint8)* 16.也许你没有计算对齐字节,计算结构大小。

答案 1 :(得分:2)

对于真正的C89代码来说,

-std=c++11是一个相当不寻常的标志。但我离题了。

正确的修复只是

TErrorInd p_msg { 0 };

char[](不正确的对齐),没有memset(因为它已经归零所以不需要)