C言語の拡張機能と移植性の課題

原題: C extensions, portability, and alternative compilers

なぜ重要か

C言語コンパイラの多様性とオープンソース開発における移植性確保の重要な課題を示している

C言語コンパイラ開発者が、GNU/LinuxのglibcヘッダーファイルがGCC、clang、tcc以外のコンパイラに対応していない問題を指摘。sys/cdefs.hでは他コンパイラの__attribute__を無効化し、limits.hでもGCC以外では標準定数を手動定義する必要がある状況を報告した。

C言語コンパイラを開発している開発者が、実際のCコードが非標準の動作や言語拡張に依存している現状について詳しく解説した。特にGNU/Linuxのglibcライブラリヘッダーファイルとの互換性問題を具体例として挙げている。

glibcはsys/cdefs.hファイル内でコンパイラ固有のマクロをチェックし、サポートされていない拡張機能を無効化しようとしている。しかし、Linux固有のstruct epoll_eventのような構造体では__attribute__((packed))が使用されており、これを無視するとABIが破綻する問題がある。

さらに深刻な問題として、sys/cdefs.h内のコードがGCC、clang、tinycc以外のコンパイラでは__attribute__構文を完全に無視するよう設定されている。これにより、新しいコンパイラでは必要な属性情報が失われ、正常な動作が困難になる。

また、stddef.h、stdint.h、limits.hなどの標準ヘッダーファイルはコンパイラが提供すべきものだが、POSIXはlimits.hに追加の定数定義を要求している。glibcのlimits.hはGCC 2以降でない場合、すべての記号を手動で定義する必要があり、移植性の課題が浮き彫りになっている。

出典

lemon.rip — 元記事を読む →