【C言語】
プロトタイプ宣言と関数定義の違いをチェックするcppcheckの活用方法

(style): Function ‘my_memset’ argument 3 names different:
declaration ‘element’
definition ‘size’.

(スタイル):第三引数は要素数ではなくてサイズ[(style)funcArgNamesDifferent]


■この記事の概要

この記事では、C言語におけるプロトタイプ宣言と関数定義の引数名や順序が異なっていてもコンパイルエラーが発生しない問題について解説しています。

この問題は、cppcheckツールを使うことで検出でき、バグの防止に役立ちます。

■引数の名前が違う

#include    <string.h>
#include    <stdio.h>
//要素数
void    my_memset(void *p,int x,size_t element);
//サイズ
void    my_memset(void *p,int x,size_t size) {
    memset(p,x,size);
}
int main(void){
    int     buf[1024];
    my_memset(buf,0,1024);
}

プロトタイプ宣言と関数定義で関数引数の名前が違っても
コンパイラはエラーを出しません。
しかし
element(配列の要素数=1024)と
size(配列のサイズ=1024*sizeof(int)=4096)のように異なる名前を付けると人間の読者に誤解を与えます。

■引数の順番が違う

‘(warning) Function ‘my_strcpy’ argument order different: declaration ‘src, dst’
definition ‘dst, src’

警告:関数定義の引数の順番がプロトタイプ宣言と違う
[(warning)funcArgOrderDifferent]

#include    <string.h>
//プロトタイプ宣言
void    my_strcpy(char *src,char *dst);
//関数定義
void    my_strcpy(char *dst,char *src)
{
    strcpy(dst,src);
}
int main(void)
{
    char    dst[1024];
    my_strcpy("src",dst);//関数呼び出し
}

大規模なプログラム開発になると、
プログラマは
外部関数の関数定義を探すのがメンドクサイので
外部関数のプロトタイプ宣言を見て関数呼び出しを作ります。
このためプロトタイプ宣言の引数の順番が間違っていると
このプログラムのように異常終了してしまいます。

この問題はgccやclangでは見つけてくれません。
cppcheckと言う無料ツールが見つけてくれます。

参考:

API08-C. 関数プロトタイプでは引数に名前をつけない