抑制特定代码行的-Wconversion

时间:2014-01-10 17:27:34

标签: c++ c gcc gcc-warning integer-overflow

我使用提供内联函数的头文件。对于GCC -Wconversion检查,这些功能并不总是保存。

现在我想对我的代码使用-Wconversion检查,但是想要取消对包含文件的警告。 编辑当我只是将转换检查添加到编译器选项时,我得到诊断,省略-Wconversion为我提供了一个干净的编译器运行。

对应于this question我用一些pragma包围了include:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#include <lpc177x_8x_crc.h>
#pragma GCC diagnostic pop

不幸的是,这并没有抑制警告。

warning: conversion to 'int32_t' from 'uint32_t' may change the sign of the result [-Wsign-conversion]

如果您没有CMSIS,可以轻松检查:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
int32_t foo(void)
{
    uint32_t result;
    return result;
}
#pragma GCC diagnostic pop

编译器命令行参数为:

arm-none-eabi-gcc.exe -mthumb -Wshadow -Winit-self -Wredundant-decls -Wcast-align -Wunreachable-code -W -Wextra -Wall -Wformat=0 -Wconversion -g -O0 -ffunction-sections -fdata-sections -g3 -mcpu=cortex-m3 -c foo.c -o foo.o

我使用arm-none-abi-gcc版本:

gcc version 4.7.3 20121207 (release) [ARM/embedded-4_7-branch revision 194305] (GNU Tools for ARM Embedded Processors)

1 个答案:

答案 0 :(得分:2)

由于警告消息将相关标志标识为-Wsign-conversion,因此您应将其添加到pragma中。

#include <stdint.h>
extern int32_t foo(void);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
#pragma GCC diagnostic ignored "-Wsign-conversion"
int32_t foo(void)
{
    uint32_t result = 0;
    return result;
}
#pragma GCC diagnostic pop

如果您注释掉第二个ignored并使用-Wconversion进行编译,则会收到错误消息:

$ gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Werror -Wconversion -c cvt.c
cvt.c: In function ‘foo’:
cvt.c:9:5: error: conversion to ‘int32_t’ from ‘uint32_t’ may change the sign of the result [-Werror=sign-conversion]
     return result;
     ^
cc1: all warnings being treated as errors
$

如果您取消注释该编译指示,则不会收到任何警告或错误。

(使用GCC 4.8.2测试Mac OS X 10.9.1 Mavericks - YMMV!)我注意到Apple提供的clang(版本'Apple LLVM版本5.0(clang-500.2.79)(基于在LLVM 3.3svn)')不反对第ignored个pragma注释掉,-Wconversion-Wsign-conversion,我尝试用代码传递uint32_t参数并在返回之前将其分配给结果等(所以它不是简单的优化,认识到0是特殊的,或者返回未初始化的变量是未定义的行为等):

#include <stdint.h>
extern int32_t foo(uint32_t v);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wconversion"
//#pragma GCC diagnostic ignored "-Wsign-conversion"
int32_t foo(uint32_t v)
{
    uint32_t result = v;
    return result;
}
#pragma GCC diagnostic pop