【C言語】
sizeof演算子のよくある間違い

warning: suspicious usage of ‘sizeof(sizeof(…))’

警告:’sizeof(sizeof(…))’ の疑わしい使用法。
[misc-sizeof-expression]


■1.失敗例:sizeof(sizeof(…))

#include <string.h>

void f(int ary[],int num){
    memset(ary,0,sizeof(num * sizeof(int)));
}

やりたい事がint型の配列をnum個0クリアしたい場合
memset(ary,0,sizeof(num * sizeof(int)));ではなくて
memset(ary,0,num * sizeof(int));のはずです。

■2.失敗例:sizeof*sizeof

(warning): Multiplying sizeof() with sizeof() indicates a logic error.

警告:sizeof()とsizeof()の掛け算は多分間違い
[(warning)multiplySizeof]

#include    <string.h>
void NG(void){  
    char    buf[1024];
    memset(buf,0,sizeof(char)*sizeof(buf));//ダメ
}

一個のサイズ X 全体のサイズ = 算数的に意味がない
一個のサイズ X 全体の要素数 = 全体のサイズ


●.修正例:sizeof*sizeof

#include    <string.h>
void OK(void){ 
    char    buf[1024];
    memset(buf,0,sizeof(buf)); //良い
}
void OKOK(void){  
    char    buf[1024]={0};//とても良い
}

■3.失敗例:sizeof(定数)

(warning) Suspicious usage of ‘sizeof’ with a numeric constant as parameter.

警告:sizeof(定数)
[(warning)sizeofwithnumericparameter]

#include    <string.h>
int main(void)
{
    char    buf[1024];
    memset(buf,0,sizeof(1024));
}

この間違いをあなたはどのように
修正しますか?

memset(buf,0,sizeof(1024));//間違いの例

修正案1:memset(buf,0,1024);

修正案2:memset(buf,0,sizeof(buf));

修正案3:memset(buf,0,sizeof(char)*1024);

修正案4:char buf[1024]={0};

この問題はgccやclangでは見つけてくれません。

cppcheckと言う無料ツールが見つけてくれます。

■4.失敗例:sizeof(配列[定数])

void    f(void)
{
    char    buf[1024];
    memset(buf,0,sizeof(buf[1024]));
}

似たような間違いで1024byte全部クリアしてくれそうですが、
1byteしかクリアしません。
この問題を見つけるツールは今のところ知りません。