Everything
11.1.5 K&R形式の関数定義(_Bool型の仮引数)

_Bool型の仮引数を含む関数定義をK&R形式で記述した場合,_Bool型の仮引数に実引数の値をそのまま代入するアセンブラコードを生成します。このため,_Bool型の実引数が0,1以外の場合は仮引数に0でも1でもない値を設定します。

void sub();
signed char c;
void func(void) {
        sub(2);
}
 
void sub(b)                     // 仮引数bに2を設定
_Bool b;
{
        if (b == 0 || b == 1) {
                c = b;
        } else {
                c = -1;
        }
}

 

【回避策】

_Bool型の引数を含む関数定義と関数宣言を関数原型形式で記述してください。

void sub(_Bool);                // 関数原型
signed char c;
void func(void) {
        sub(2);
}
 
void sub(_Bool b)               // 関数原型
{
        if (b == 0 || b == 1) {
                c = b;
        } else {
                c = -1;
        }
}