2016-08-18 462 views
0

我运行的gcc 4.8.4,并与选项编译:如何避免__builtin___memset_chk警告?

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)', from'void sendMsgPduError(TMsgPduError *,uint32)'at ../MessageHandling.cpp:174:46:

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

return __builtin___memset_chk(__dest,__ch,__len,__bos0(__dest));

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

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

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

+1

此外,你为什么要投进去'INT *'? – ikh

+0

'g_errorIndBlock [16];'为什么16?你怎么知道的? –

回答

2

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

2

-std=c++11对于真正的C89代码来说,这是一个非常不寻常的标志。但我离题了。

正确的解决方法是只

TErrorInd p_msg { 0 }; 

没有char[](不当对齐),没有memset(不需要因为它已经归零)

+0

在原始文章中没有'TErrorInd'数据。 'p_msg'是'TErr​​orInd *'。 –

+0

@ n.m .:就是这一点。 – MSalters