ブーリアンを引数とする変数にポインタをそのまま渡してはいけない

注意: この記事は1年以上前に掲載されたものです。情報が古い場合がありますのでお気を付け下さい。

これは当方が実際にやって気づいたことであるが、ブーリアンを引数とする関数にポインタをそのまま渡してしまうと意図せぬ動作になってしまう。特にポインタがNULLかどうかを判定して挙動を振り分けようとする際にはバグの原因となる。

例えば以下のようなコードがある(インクルード等は省略、また、実際に動かすことは想定していない)。

[code lang=”C”]void someFunction(_Bool trueOrFalse)
{
// anything to do
}

int main()
{
AnyObject *obj = (AnyObject *)calloc(1, sizeof(AnyObject));
someFunction(obj);
free(obj);
return 0;
}[/code]

この場合、someFunctionの処理はobjがNULLかどうかで処理を振り分けるように見えるかもしれないが、実際にはそうではなく、意図せぬ挙動になってしまう。

それを防ぐには、以下のように書けばよい

[code lang=”C”]void someFunction(_Bool trueOrFalse)
{
// anything to do
}

int main()
{
AnyObject *obj = (AnyObject *)calloc(1, sizeof(AnyObject));
someFunction(obj ? true : false);
free(obj);
return 0;
}[/code]

こうすればobjがNULLかどうかで(NULLでなければtrue、NULLであればfalse)で処理を振り分けることができるようになる。

記述を省略したくなることが往々にしてあるが、バグの原因となり得ることがあるので是非気をつけよう。

タイトルとURLをコピーしました