Solaris 64 ビット 開発ガイド

書式文字列の変換をチェックする

printf(3S)sprintf(3S)scanf(3S)sscanf(3S)long またはポインタ引数に対して使用されている場合、それらを long またはポインタ引数用に変更する必要がある場合があります。ポインタ引数を 32 ビットおよび 64 ビット環境で動作させるためには、書式文字列に指定する変換操作を %p にしてください。次に例を示します。


char *buf;
struct dev_info *devi;
...
(void) sprintf(buf, "di%x", (void *)devi);

この場合、次の警告が出ます。


warning: function argument (number) type inconsistent with format
  sprintf (arg 3)     void *: (format) int

次のコードを使用すると、正しい結果が出ます。


char *buf;
struct dev_info *devi;
...
(void) sprintf(buf, `di%p", (void *)devi);

long 引数の場合は、long サイズ指定子 l を書式化文字列の変換操作文字の前に追加してください。さらに、buf によって示される記憶領域に 16 桁を格納できる大きさが十分にあることを確認してください。次に例を示します。


size_t nbytes;
ulong_t align, addr, raddr, alloc;
printf("kalloca:%d%%%d from heap got%x.%x returns%x¥n", 
nbytes, align, (int)raddr, (int)(raddr + alloc), (int)addr);

この場合、次の警告が出ます。


warning: cast of 64-bit integer to 32-bit integer
warning: cast of 64-bit integer to 32-bit integer
warning: cast of 64-bit integer to 32-bit integer

次のコードを使用すると、正しい結果が出ます。


size_t nbytes;
ulong_t align, addr, raddr, alloc;
printf("kalloca:%lu%%%lu from heap got%lx.%lx returns%lx¥n", 
nbytes, align, raddr, raddr + alloc, addr);