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

constexpr构造函数不会显示覆盖率数据

  •  6
  • user2882307  · 技术社区  · 7 年前

    今天我重写了我的matrix课程 constexpr . 我已经(拥有)这个类的100%单元测试覆盖率,但我注意到,在我将几乎所有函数转换为constexpr之后,在lcov中,构造函数的一部分被标记为不再覆盖。

    这是一个只有构造函数的类。

    template<typename T, std::size_t m, std::size_t n>
    class Matrix
    {
    static_assert(std::is_arithmetic<T>::value,
                      "Matrix can only be declared with a type where "
                      "std::is_arithmetic is true.");
    
    public:
        constexpr Matrix(
            std::initializer_list<std::initializer_list<T>> matrix_data)
        {
            if (matrix_data.size() != m)
            {
                throw std::invalid_argument("Invalid amount of rows.");
            }
    
            for (const auto& col : matrix_data)
            {
                if (col.size() != n)
                {
                    throw std::invalid_argument("Invalid amount of columns.");
                }
            }
    
    
            std::size_t pos_i = 0;
            std::size_t pos_j = 0;
    
            for (auto i = matrix_data.begin(); i != matrix_data.end(); ++i)
            {
                for (auto j = i->begin(); j != i->end(); ++j)
                {
                    this->data[pos_i][pos_j] = *j;
                    ++pos_j;
                }
                ++pos_i;
                pos_j = 0;
            }
        }
    
    
    private:
        std::array<std::array<T, n>, m> data{};
    
    };
    
    
    int main()
    {
        Matrix<double, 2, 2> mat = {
            {1, 2},
            {3, 4}
        };
    
        return 0;
    }
    

    我使用gcc 7.2和lcov 1.13

    1 回复  |  直到 7 年前
        1
  •  3
  •   user0042    7 年前

    我对这个类进行了100%的单元测试,但在我将几乎所有函数转换为 constexpr 在lcov中,构造函数的一部分被标记为不再包含。

    lcov 的指示 非覆盖代码 意味着 gcov 没有安装仪器。

    任何标记的内容 常量表达式 评估时间为 编译时间 , 覆盖测试 覆盖率数据收集于 运行时 .

    所以这就是我怀疑的一个原因,为什么你没有得到任何 常量表达式 作用


    由于您已经模板化了代码,我不确定自己是否是最新的,但我经历了这一点 覆盖测试 无法很好地插入模板,您可能会留下零覆盖率数据。

    与我上面所说的理由相似 常量表达式 ,模板在编译时进行评估/实例化。至少很难以合理的方式对所有实际使用的模板实例化进行检测。

    推荐文章