Solaris(64 位)开发者指南

检查格式字符串转换操作

对于类型为 long 或指针的参数,可能需要更改 printf(3C)sprintf(3C)scanf(3C)sscanf(3C) 的格式字符串。对于要同时在 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);