V9 などの 64 ビットアーキテクチャーを移植する場合、データが切り捨てられることがあります。切り捨ては、初期化時に代入によって暗黙的に行われることもあれば、明示的なキャストによって行われることもあります。2 つのポインタの違いは typedef ptrdiff_t であり、32 ビットモードでは 32 ビット整数型、64 ビットモードでは 64 ビット整数型です。大きいサイズから小さいサイズの整数型に切り捨てると、次の例にあるような警告が生成されます。
example% cat test1.c int x[10]; int diff = &x[10] - &x[5]; //warn example% CC -c -xarch=v9 -Qoption ccfe -xport64=full test1.c "test1.c", line 3: Warning: Conversion of 64-bit type value to "int" causes truncation. 1 Warning(s) detected. example% |
明示的キャストによってデータが切り捨てられている場合に、64 ビットのパイルモードでの切り捨て警告を抑止するには、-xport64=implicit を使用します。
example% CC -c -xarch=v9 -Qoption ccfe -xport64=implicit test1.c "test1.c", line 3: Warning: Conversion of 64-bit type value to "int" causes truncation. 1 Warning(s) detected. example% |
64 ビットアーキテクチャーへの移植でよく発生するもう 1 つの問題として、ポインタの切り捨てがあります。これは常に、C++ におけるエラーです。切り捨てを引き起こす、ポインタのキャスティングなどの操作は、-xport64 を指定した場合に V9 ではエラー診断となります。
example% cat test2.c char* p; int main() { p =(char*) (((unsigned int)p) & 0xFF); // -xarch=v9 error return 0; } example% CC -c -xarch=v9 -Qoption ccfe -xport64=full test2.c "test2.c", line 3: Error: Cannot cast from char* to unsigned. 1 Error(s) detected. example% |