The format strings for printf(3S), sprintf(3S), scanf(3S), and sscanf(3S) might need to be changed for long
or pointer arguments. For pointer arguments, the conversion
operation given in the format string should be %p to work in both the 32-bit and 64-bit environments.
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
Suggested use:
char *buf; struct dev_info *devi; ... (void) sprintf(buf, `di%p", (void *)devi);
For long
arguments, the long
size specification, l, should be prepended to the conversion operation character in the format string. Furthermore, check to be sure that the storage pointed to by buf
is large enough to contain 16 digits.
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
Suggested use:
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);