我们有一个句柄类型,声明如下:
typedef void *config_h;
我们声明了一个函数,如下所示:
void func(config_h hConfig);
我是这样称呼的:
config_h hConfig;
func(&hConfig);
甚至没有警告。 关于这个项目,我无法改变的事情:它是C++11
的,并且用-fpermissive
编译。config_h
typedef 是在同样由 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 个句柄类型。 在我使用它时发现(并修复(了几个严重的错误,这些错误消耗了大部分时间。