GCC 和 Clang 未对未使用的异常变量发出警告

Posted

技术标签:

【中文标题】GCC 和 Clang 未对未使用的异常变量发出警告【英文标题】:GCC and Clang not warning on unused exception variable 【发布时间】:2019-05-03 21:41:37 【问题描述】:

考虑以下无用的代码——特别是catch 子句中的int k

int main()

    try
    
        throw 0;
    
    catch(int k)
    
    

    return 0;

当使用 g++(8.3.0 版)和 clang++(8.0.0)和 -Wall -Wextra 编译时,尽管未使用 k 变量,但不会发出警告。 Visual Studio 确实会发出警告,这就是我在自己的项目中发现这种差异的方式。

这是 GCC 和 Clang 中的错误,还是我误解了 -Wunused 标志集?

【问题讨论】:

可能是有意的,类似于未使用的命名模板参数没有警告。 您是否启用了优化?有时这些警告只会在优化过程中出现。 @1201ProgramAlarm -O -O1 -O2 -O3 没有任何改变。 我看到“确保我们将 catch 参数标记为已使用,否则我们将收到关于未使用 ((anonymous)) 的警告。”。如果我删除以下行,我会收到警告“警告:未使用的变量 'k'”。评论很奇怪,我认为值得向 gcc 的 bugzilla 报告,除非你能找到以前关于同一问题的错误报告。 gcc.gnu.org/bugzilla/show_bug.cgi?id=90353 【参考方案1】:

叮当

错误报告:https://bugs.llvm.org/show_bug.cgi?id=41746

事实证明,clang 有警告 -Wunused-exception-parameter,尽管它没有被任何组 -Wall-Wextra-Wunused 激活。

海合会

错误报告:https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90353

正如对此问题的评论和错误报告中所述,所有 catch 参数始终标记为已使用。正在链接的错误报告中对此进行调查。

【讨论】:

以上是关于GCC 和 Clang 未对未使用的异常变量发出警告的主要内容,如果未能解决你的问题,请参考以下文章

clang 或 gcc 是不是利用引用限制进行别名分析

js数据类型,及内存存储学习笔记

你如何为 clang 和 gcc 编写一个 makefile?

我的 Linux 开发项目的 Clang vs GCC

从多个编译单元引用模板化静态变量时,Clang 链接到不同位置

使用 clang 与 gcc 的弱符号和 dlopen()