首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >if-constexpr混淆了LLVM覆盖范围

if-constexpr混淆了LLVM覆盖范围
EN

Stack Overflow用户
提问于 2018-08-29 02:39:18
回答 1查看 247关注 0票数 2

if-statement中使用常量表达式时,我遇到了一个奇怪的LLVM覆盖率问题。

代码语言:javascript
复制
template<typename T>
int foo(const T &val)
{
    int idx = 0;

    if constexpr(std::is_trivially_copyable<T>::value && sizeof(T) <= sizeof(int)
    {
        memcpy(&idx, &v, sizeof(T));
    }
    else
    {
        //store val and assign its index to idx
    }

    return idx;
}

执行的实例化:

代码语言:javascript
复制
int idx1 = foo<int>(10);
int idx2 = foo<long long>(10);
int idx3 = foo<std::string>(std::string("Hello"));
int idx4 = foo<std::vector<int>>(std::vector<int>{1,2,3,4,5});

在所有这些代码中,sizeof(T) <= sizeof(int)都没有显示为已执行。然而,在第一种情况实例化(int)中,第一个if的主体确实像它应该的那样被执行。在任何其他情况下,它都显示为已执行。

编译命令行的相关部分:

代码语言:javascript
复制
/usr/bin/clang++ -g -O0 -Wall -Wextra -fprofile-instr-generate -fcoverage-mapping -target x86_64-pc-linux-gnu -pipe -fexceptions -fvisibility=default -fPIC -DQT_CORE_LIB -DQT_TESTLIB_LIB -I(...) -std=c++17 -o test.o -c test.cpp

链接器命令行的相关部分:

代码语言:javascript
复制
/usr/bin/clang++ -Wl,-m,elf_x86_64,-rpath,/home/michael/Qt/5.11.2/gcc_64/lib -L/home/michael/Qt/5.11.2/gcc_64/lib -fprofile-instr-generate -fcoverage-mapping -target x86_64-pc-linux-gnu -o testd test.o -lpthread -fuse-ld=lld

当条件被提取到它自己的函数时,在执行sizeof(T) <= sizeof(int)部分时,intlong long实例化都会正确地显示在覆盖率中。是什么导致了这种行为,以及如何解决它?是Clang/LLVM中的bug吗?

有什么想法吗?

编辑:这似乎是LLVM中的一个已知错误(还不清楚是LLVM-cov还是Clang ):

https://bugs.llvm.org/show_bug.cgi?id=36086

https://bugs.chromium.org/p/chromium/issues/detail?id=845575

EN

回答 1

Stack Overflow用户

发布于 2018-08-29 03:49:21

首先,sizeof(T) <= sizeof(int)应该在编译时在代码中执行,所以很可能没有针对覆盖范围对编译进行分析。

接下来,在这三种类型中,只有long long看起来像trivially_copyable,但它的大小(很可能)大于int,因此不会为它们执行then-子句,甚至也不会对其进行编译。因为所有的事情都发生在一个模板化的函数中,所以不会编译未执行的分支。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52064372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档