Solaris 64 ビット 開発ガイド

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

printf(3C)sprintf(3C)scanf(3C)sscanf(3C)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);

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

    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);