使用 printf 格式说明符为不正确的符号生成警告
Generate warnings for incorrect sign with printf format specifier
是否有任何方法可以让 gcc 或 clang 生成警告,以针对带有 printf() 格式说明符的有符号变量与无符号变量不匹配?
我知道使用 -Wformat
,但是它只会在数据类型的大小不正确时报告警告。如果只是符号不正确,它不会产生警告。
例如,即使将 unsigned int 打印为 signed 不匹配,以下内容也不会生成警告:
uint32_t x = UINT_MAX;
printf("%d", x);
这将打印出-1。
这似乎是一个有用的警告,但我还没有找到启用它的方法。
使用:-Wformat
和 -Wformat-signedness
(-Wformat 必须存在)。
如果参数对 printf 说明符的符号不正确,后一个警告选项将发出警告。
gcc 6.2 将产生此警告:警告:格式“%d”需要类型为 'int' 的参数,但参数 2 的类型为 'uint32_t {aka unsigned int}' [-Wformat=]
另外uint32_t x = UINT_MAX;
应该是uint32_t x = UINT32_MAX;
由于用户 2501 正确回答,-Wformat
将启用错误签名警告。但是对于 uint32_t
使用 "%u"
没有必要这样做,当您将目标更改为 sizeof(int)<sizeof(uint32_t)
.
的系统时,这是不正确的
uint32_t
的正确格式说明符是 "%"PRIu32
、"%"PRIx32
、"%"PRIX32
和 "%"PRIo32
,带有零个或多个可选标志。但是,这是扩展为字符串的宏。在具有 32 位 int
的系统上,"%"PRIu32"
可能会扩展为 "%""d"
。在其他系统上,int
可能只有 16 位长,而 "%"PRIu32"
扩展为 "%""lu"
。在预处理器之后,编译器不知道你是手写了格式说明符还是使用了缩进宏。因此,编译器不会在 32 位系统上生成使用 "%u"
而不是 "%"PRIu32"
的警告,但是当您将目标体系结构更改为具有较小 int
的体系结构时,它会生成警告,您将当您忽略此警告时,此系统上有 UB。
是否有任何方法可以让 gcc 或 clang 生成警告,以针对带有 printf() 格式说明符的有符号变量与无符号变量不匹配?
我知道使用 -Wformat
,但是它只会在数据类型的大小不正确时报告警告。如果只是符号不正确,它不会产生警告。
例如,即使将 unsigned int 打印为 signed 不匹配,以下内容也不会生成警告:
uint32_t x = UINT_MAX;
printf("%d", x);
这将打印出-1。
这似乎是一个有用的警告,但我还没有找到启用它的方法。
使用:-Wformat
和 -Wformat-signedness
(-Wformat 必须存在)。
如果参数对 printf 说明符的符号不正确,后一个警告选项将发出警告。
gcc 6.2 将产生此警告:警告:格式“%d”需要类型为 'int' 的参数,但参数 2 的类型为 'uint32_t {aka unsigned int}' [-Wformat=]
另外uint32_t x = UINT_MAX;
应该是uint32_t x = UINT32_MAX;
由于用户 2501 正确回答,-Wformat
将启用错误签名警告。但是对于 uint32_t
使用 "%u"
没有必要这样做,当您将目标更改为 sizeof(int)<sizeof(uint32_t)
.
uint32_t
的正确格式说明符是 "%"PRIu32
、"%"PRIx32
、"%"PRIX32
和 "%"PRIo32
,带有零个或多个可选标志。但是,这是扩展为字符串的宏。在具有 32 位 int
的系统上,"%"PRIu32"
可能会扩展为 "%""d"
。在其他系统上,int
可能只有 16 位长,而 "%"PRIu32"
扩展为 "%""lu"
。在预处理器之后,编译器不知道你是手写了格式说明符还是使用了缩进宏。因此,编译器不会在 32 位系统上生成使用 "%u"
而不是 "%"PRIu32"
的警告,但是当您将目标体系结构更改为具有较小 int
的体系结构时,它会生成警告,您将当您忽略此警告时,此系统上有 UB。