代码之家  ›  专栏  ›  技术社区  ›  zzxyz

在GCC中启用“不同间接级别”警告/错误

  •  1
  • zzxyz  · 技术社区  · 6 年前

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

    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 可能支付股息?

    1 回复  |  直到 6 年前
        1
  •  1
  •   zzxyz    6 年前

    正如一些人在评论中向我指出的那样(谢谢大家),即使是不同程度的间接性也不会被考虑到。 void* . 我在其他编译器中验证了这一点。所以我实际问题的答案是 无论编译器如何,都没有可以启用的警告或错误。 .

    也就是说,如果 空洞* 实际上指的是一种混凝土类型,它比较无痛,即使是在非常大的解决方案中也要清理干净。我继续向前声明类型:

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

    我能在20万行代码中在8小时内清除大约40个句柄类型。在我工作期间发现(并修复)几个严重的错误,这消耗了大部分时间。