Возможно ложное срабатывание для clang-анализатора (мусор или неопределенный) - PullRequest
4 голосов
/ 19 сентября 2019

Код, приведенный ниже, дает «Результат операции мусор или неопределенный» в анализаторе Clang, но только когда инициализация выполняется с помощью фигурных скобок.Это происходит с std = c ++ 17, но не с версиями ниже 17. Если посмотреть на проводник компилятора, выходные данные одинаковы как для фигурных скобок, так и для скобок.

Это похоже на ложное срабатывание илиэто не так?

#include <iostream>

//////////////////////////////////////////////////////////////////////////////
// build with:  
// scan-build -o results/scan-build --status-bugs clang++ -std=c++17 main.cpp

template<typename ValueType>
struct Enumeration 
{    
    Enumeration() = delete;
    Enumeration(const ValueType& value) : value_(value) 
    {
        std::cout << "Enumeration ValueType ctor" << std::endl;
    }

    ValueType value_;
};

enum class Literal 
{
    NullType,
    UndefinedType
};

struct DataType : Enumeration<Literal> 
{
    DataType () = delete;

    DataType(Literal literal) : Enumeration<Literal>(literal) 
    {
        std::cout << "DataType Literal ctor" << std::endl;
    }
    DataType(const DataType& dt) : Enumeration<Literal>(dt.value_) 
    {
        std::cout << "DataType copy ctor" << std::endl;
    }
    DataType(const DataType&& dt) : Enumeration<Literal>(dt.value_) 
    {
        std::cout << "DataType copy ctor" << std::endl;
    }

    inline bool operator==(const Literal& lit) const 
    { 
        return value_ == lit;
    }    
};

DataType getDataType()
{
    DataType retval{Literal::UndefinedType};
    std::cout << "getDataType(): constructed" << std::endl;    
    return retval;
}

int main(int, char**)
{
    const DataType type{getDataType()}; // <- gives garbage error
    //const DataType type(getDataType()); // <- no garbage error
    if (type == Literal::UndefinedType) {
        return 1;
    }

    return 0;
}
...