(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と言う無料ツールが見つけてくれます。
参考: