ccs-patch-1.6.5-20081111.tar.gz にはアクセスログがメモリを浪費してしまうというバグが残っていました。
1.6.5 の開発中に ccs_can_save_audit_log() という関数の戻り値を int (上限に達していない場合には 0 を、達している場合には -ENOMEM を返す)から _Bool (上限に達していない場合には true を、達している場合には false を返す)に変更したのですが、その関数の呼び出し元の条件判断を if (ccs_can_save_audit_log(r->domain, is_granted) < 0) から if (!ccs_can_save_audit_log(r->domain, is_granted)) に変更するのを忘れてしまったのがバグの原因です。
_Bool 型は 0 と 1 しかとらないのですから、 _Bool 型の値が 0 より小さいかどうかを判断したら、常に「偽」となります。でしたら、コンパイラが warning: comparison is always false due to limited range of data type という警告を表示してくれるのではないでしょうか?
そこで、以下のようなプログラムを様々なディストリビューションで gcc -Wall でコンパイルしてみました。
$ cat test.c
static _Bool foo(void) {
return 0;
}
int main(int argc, char *argv[]) {
if (foo() < 0)
return 1;
return 0;
}
$ gcc -Wall test.c
test.c: In function `main':
test.c:6: warning: comparison is always false due to limited range of data type
|
以下に結果を示します。( gcc のバージョンは熊猫の環境でのものです。)
| Distribution | gcc --version | Warning printed? |
| RedHat Linux 9 | gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5) | Yes |
| Fedora Core 3 | gcc (GCC) 3.4.4 20050721 (Red Hat 3.4.4-2) | No |
| Fedora Core 4 | gcc (GCC) 4.0.2 20051125 (Red Hat 4.0.2-8) | No |
| Fedora Core 5 | gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-51) | No |
| Fedora Core 6 | gcc (GCC) 4.1.2 20070626 (Red Hat 4.1.2-13) | No |
| Fedora 7 | gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27) | No |
| Fedora 8 | gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-33) | No |
| Fedora 9 | gcc (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8) | No |
| Fedora 10 | gcc (GCC) 4.3.2 20081105 (Red Hat 4.3.2-7) | No |
| CentOS 3.9 | gcc (GCC) 3.2.3 20030502 (Red Hat Linux 3.2.3-59) | Yes |
| CentOS 4.7 | gcc (GCC) 3.4.6 20060404 (Red Hat 3.4.6-10) | No |
| CentOS 5.2 | gcc (GCC) 4.1.2 20071124 (Red Hat 4.1.2-42) | No |
| openSUSE 10.1 | gcc (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux) | No |
| openSUSE 10.2 | gcc (GCC) 4.1.2 20061115 (prerelease) (SUSE Linux) | No |
| openSUSE 10.3 | gcc (GCC) 4.2.1 (SUSE Linux) | No |
| openSUSE 11.0 | gcc (SUSE Linux) 4.3.1 20080507 (prerelease) [gcc-4_3-branch revision 135036] | No |
| openSUSE 11.1 | gcc (SUSE Linux) 4.3.2 [gcc-4_3-branch revision 141291] | No |
| VineLinux 4.2 | gcc (GCC) 3.3.6 release (Vine Linux 3.3.6-0vl7) | No |
| Asianux 2 | gcc (GCC) 3.4.6 20060404 (Asianux 2.0 3.4.6-8.1) | No |
| Asianux 3 | gcc (GCC) 4.1.1 20070105 (Asianux 3.0 4.1.1-52.2.1) | No |
| Debian Sarge | gcc (GCC) 3.3.5 (Debian 1:3.3.5-13) | No |
| Debian Etch | gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) | No |
| Debian Lenny | gcc (Debian 4.3.2-1) 4.3.2 | No |
| Ubuntu 6.06 | gcc (GCC) 4.0.3 (Ubuntu 4.0.3-1ubuntu5) | No |
| Ubuntu 6.10 | gcc (GCC) 4.1.2 20060928 (prerelease) (Ubuntu 4.1.1-13ubuntu5) | No |
| Ubuntu 7.04 | gcc (GCC) 4.1.2 (Ubuntu 4.1.2-0ubuntu4) | No |
| Ubuntu 7.10 | gcc (GCC) 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2) | No |
| Ubuntu 8.04 | gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu3) | No |
| Ubuntu 8.10 | gcc (Ubuntu 4.3.2-1ubuntu11) 4.3.2 | No |
| Gentoo | gcc (GCC) 4.1.2 (Gentoo 4.1.2 p1.0.2) | No |
どうやら、 gcc 3.2 以前では warning: comparison is always false due to limited range of data type という警告をしてくれるのに対し、 gcc 3.3 以降ではしてくれないようです。
熊猫が TOMOYO Linux の開発環境として使っている Debian Sarge は 3.3.5 ということで表示してくれませんでした。(泣)
普通は新しいほど高機能になって様々な警告を出してくれるものですが、 _Bool 型との大小比較に関しては逆なんですね。