2016-08-18 262 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