我们有一个声明为以下类型的句柄类型:
typedef void *config_h;
我们有一个声明如下的函数:
void func(config_h hConfig);
我这样称呼它:
config_h hConfig;
func(&hConfig);
甚至没有警告。对于该项目,我无法更改的地方是:C++11
,并使用-fpermissive
进行了编译。 config_h
typedef在一个由C编译器btw编译的文件中完成。
我看过这里:https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
看起来像-Wstrict-aliasing
的票证,但事实并非如此。我收到许多有关各种指针转换的警告,但没有这一点。
问题是“我可以启用以防止出现此问题的最窄警告(最好是错误)是什么?”
红利问题:如果像这样的事情让我发疯,切换到clang
可能会带来红利吗?
答案 0 :(得分:1)
正如一些人在评论中向我指出的(谢谢所有人),在涉及void*
时,甚至不考虑不同级别的间接访问。我在其他编译器中对此进行了验证。因此,对于我的实际问题,我可以告诉我的答案是,没有警告或错误,无论编译器是什么。
也就是说,如果void*
实际指向一个具体类型,即使在清理该问题的大型解决方案中,它也相对没有问题。我继续声明了这些类型:
struct config_o;
typedef config_o* config_h;
//removed typedef void* config_h;
我能够在不到8小时的时间内清理200,000行代码中的大约40种句柄类型。在我使用时发现(并修复)了几个严重的错误,这些错误占用了大部分时间。