在 GCC 中启用"differing levels of indirection"警告/错误



我们有一个句柄类型,声明如下:

typedef void *config_h;

我们声明了一个函数,如下所示:

void func(config_h hConfig);

我是这样称呼的:

config_h hConfig;
func(&hConfig);

甚至没有警告。 关于这个项目,我无法改变的事情:它是C++11的,并且用-fpermissive编译。config_htypedef 是在同样由 C 编译器编译的文件中完成的,顺便说一句。

我看了看这里:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

看起来-Wstrict-aliasing可能是门票,但事实并非如此。 我收到大量关于各种指针转换的警告,但不是这个。

问题是"我可以启用的最窄的警告(或最好是错误(是什么来防止此问题?

奖金问题:如果这样的事情让我发疯,那么改用clang可能会带来红利吗?

正如评论中的几个人向我指出的那样(谢谢大家(,在涉及void*时,甚至不考虑不同级别的间接性。 我在其他编译器中验证了这一点。 因此,我能说的最好的实际问题的答案是,无论编译器如何,都没有可以启用的警告或错误

也就是说,如果void*实际上指向混凝土类型,那么即使在非常大的解决方案中清理它,它也是相对轻松的。 我去向前声明类型:

struct config_o;
typedef config_o* config_h;
//removed typedef void* config_h;

我能够在不到 8 小时的时间内清理 200,000 行代码中的大约 40 个句柄类型。 在我使用它时发现(并修复(了几个严重的错误,这些错误消耗了大部分时间。

最新更新