Конструктор constexpr не будет отображать данные покрытия

Сегодня я переписывал свой класс матрицы, чтобы быть 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 ответ

Решение

У меня (был) 100% охват модульным тестом в этом классе, но я заметил, после того как я преобразовал почти все функции в constexpr часть конструктора помечена в lcov как не покрытая вообще.

lcovУказание непокрытого кода означает, что gcov не инструмент это.

Все помечено constexpr оценивается во время компиляции, gcov данные покрытия собираются во время выполнения.

Так что это одна из причин, почему я подозреваю, почему вы не получаете данные о покрытии для каких-либо constexpr функция.


Поскольку у вас есть шаблонный код, я не уверен, что я в курсе, но я испытал это gcov шаблоны инструментов не очень хороши, и у вас могут остаться нулевые данные для них.

Схожи рассуждения с тем, что я сказал выше для constexprшаблоны оцениваются / создаются во время компиляции. Было бы, по крайней мере, трудно измерить все реально используемые экземпляры шаблона разумным способом.

Другие вопросы по тегам