printf(3S)、sprintf(3S)、scanf(3S)、sscanf(3S) に対する書式文字列が long またはポインタ型引数を受け付けられるようになっていることを確認してください。pointer 引数については、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;
u_long 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;
u_long align, addr, raddr, alloc;
printf("kalloca:%lu%%%lu from heap got%lx.%lx returns%lx\n",
nbytes, align, raddr, raddr + alloc, addr);