e420.c

書き条件


Review-C 側の既知の問題 int buf[MAX]; int i; for(i = 0 ; i < MAX ; i++) { buf[i] = 0; } 上記問題のないコードでも、本警告が発生します。
解説: ●本警告は、配列オーバーランをしないための条件です。 問題指摘精度が低いため問題がない場合でも警告を出しています。 ●ループをmemset() , memcpy() に置き換えると、警告を消せる場合がありますので 処理速度と保守性の面で、こちらを推奨します。 例: memset(buf,0,sizeof(buf)); ● memset() / memcpy() でも警告が出る場合があります。 この場合ポインタを介在させない事で、警告を抑止できる場合があります。
応用修正前: #include typedef unsigned char uint8; typedef unsigned long int uint32; #define BUFFER_SIZE (1024) #define RECORD_LENGTH (16) static struct { int Stored_Num ; uint8 Log_Buffer[ BUFFER_SIZE ]; }dbg_Message ; void pre( uint32 ulSize, void *ptMsg ) { uint8 *mp; mp = dbg_Message.Log_Buffer; mp += (uint8)(dbg_Message.Stored_Num * RECORD_LENGTH); if ( ulSize > RECORD_LENGTH ) { ulSize = RECORD_LENGTH; } /********************************/ /* 過剰警告発生箇所 */ /********************************/ memcpy( mp, ptMsg, ulSize ); return; }
応用修正例 void aft( uint32 ulSize, void *ptMsg ) { if ( ulSize > RECORD_LENGTH ) { ulSize = RECORD_LENGTH; } if((dbg_Message.Stored_Num*RECORD_LENGTH+ulSize)> BUFFER_SIZE) { /*パンク */ return ; } /****************************************************************/ /* ポインタを介在させない事で、警告を抑止できる場合があります */ /****************************************************************/ memcpy(&dbg_Message.Log_Buffer[ dbg_Message.Stored_Num * RECORD_LENGTH], ptMsg, ulSize ); return; }