【问题标题】:Why doesn't clang warn of dead code in templates?为什么clang不警告模板中的死代码?
【发布时间】:2016-03-31 19:30:20
【问题描述】:

使用-Weverything编译时,为什么clang不在下面的模板中标记死代码,而是在函数中标记呢?请注意,在这两种情况下,它都会标记未使用的变量警告。

#include <iostream>

template <class Item> class ItemBase {
  public:
    bool performWork() {
        int i;
        std::cout << "foo" << std::endl;
        return true;
        std::cout << "dead code in template" << std::endl;
    }
};

bool badFunc();
bool badFunc() {
    int i;
    std::cout << "foo" << std::endl;
    return true;
    std::cout << "dead code in function" << std::endl;
}

int main() {
    ItemBase<float> tester;
    tester.performWork();

    badFunc();
}

叮当输出:

test.cpp:24:13: warning: unused variable 'i' [-Wunused-variable]
        int i;
            ^
test.cpp:33:9: warning: unused variable 'i' [-Wunused-variable]
    int i;
        ^
test.cpp:36:42: warning: code will never be executed [-Wunreachable-code]
    std::cout << "dead code in function" << std::endl;
                                         ^~
3 warnings generated.

【问题讨论】:

    标签: c++ templates clang warnings


    【解决方案1】:

    我看不出没有发出警告的任何原因(除了 clang 中的错误)。

    我猜 clang 对模板中的警告过于谨慎了,因为它无法判断模板的 any 实例化永远不会执行代码(即使很明显一个人),所以它只是没有警告。但这只是一个假设。

    【讨论】:

    • 这也是我的想法,尽管我们通常会看到参数实例化后生成的警告和错误。不过,这似乎不一致。注释掉上面对 tester.performWork() 的调用仍然会生成未使用的变量警告,但如果我将“int i”更改为“Item i”,则只有在模板上调用 performWork 时才会引发警告;显然,编译器确定一个函数在实例之间是否相同,并决定它是否可以执行一次传递而不是每个实例传递一次。但是,无论哪种情况,死代码都不会触发。
    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    相关资源
    最近更新 更多