我運行的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?
此外,你爲什麼要投進去'INT *'? – ikh
'g_errorIndBlock [16];'爲什麼16?你怎麼知道的? –