printf(3S)、sprintf(3S)、scanf(3S)、sscanf(3S) に対する書式文字列が long あるいは pointer 引数を受け付けられるようになっていることを確認してください。pointer 引数については、書式文字列中の変換操作を %p で指定して、32 ビットおよび 64 ビット両方のコンパイル環境で機能するようにします。
char *buf; struct dev_info *devi; ... (void) sprintf(buf, "di%x", (void *)devi); % 警告: 関数への引数の型と初期とが整合していません 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); % 警告: 64 ビット整数から 32 ビット整数にキャストしています 警告: 64 ビット整数から 32 ビット整数にキャストしています 警告: 64 ビット整数から 32 ビット整数にキャストしています |
修正版は次のようになります。
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); |