Unreachable code в release
От: Videoman Россия https://hts.tv/
Дата: 20.01.17 08:52
Оценка:
Хотелось бы обратиться к спецам по С++ и по компилятору VS2013 в частности:

Вот такой простой метод класса в конфигурации release выдает: warning C4702: unreachable code в release конфигурации. В debug конфигурации все Ок, Cрабатывают точки останова и метод гарантированно вызывается.
Предупреждение выдается пачкой, порядка 20-ти одинаковых записей, по ходу, на стадии линковки для каждого объектника где используется. Не пойму как интерпретировать это предупреждение? Если это нормально, то как можно подавить?

inline uint_t Buffer::Size() const
{
    return m_size;
}
Отредактировано 20.01.2017 8:53 Videoman . Предыдущая версия .
Re: Unreachable code в release
От: uzhas Ниоткуда  
Дата: 20.01.17 09:08
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Предупреждение выдается пачкой, порядка 20-ти одинаковых записей, по ходу, на стадии линковки для каждого объектника где используется. Не пойму как интерпретировать это предупреждение? Если это нормально, то как можно подавить?


https://msdn.microsoft.com/en-us/library/c26da40e(v=vs.120).aspx

ворнинг не от линкера, а от компилятора
давайте мин. пример и точную ошибку, чтобы знать на какую строчку в коде и как именно ругается
Re[2]: Unreachable code в release
От: Videoman Россия https://hts.tv/
Дата: 20.01.17 09:34
Оценка:
Здравствуйте, uzhas, Вы писали:

U>ворнинг не от линкера, а от компилятора

да, от него

U>давайте мин. пример и точную ошибку, чтобы знать на какую строчку в коде и как именно ругается

Не могу, так как проект очень большой. Могу класс скинуть весь. Класс обертка для буфера аналогично ASIO библиотеке:
// .h
class ConstBuffer
    {
    public:

        using pointer_type = const void*;

        ConstBuffer() noexcept = default;
        ConstBuffer(const ConstBuffer& that) = default;
        ConstBuffer(ConstBuffer&& that) noexcept;
        ConstBuffer(const ConstBuffer& that, uint_t maxSize);
        ConstBuffer(pointer_type data, uint_t size) noexcept;

        void swap(ConstBuffer& that) noexcept;
        ConstBuffer& operator=(ConstBuffer that) noexcept;
        ConstBuffer& operator+=(uint_t offset) noexcept;

        pointer_type Data() const noexcept;
        uint_t Size() const noexcept;

    protected:

        pointer_type m_data = nullptr;  // Buffer data reference
        uint_t m_size = 0;              // Buffer data size
    };

    // .cpp

    inline ConstBuffer::ConstBuffer(ConstBuffer&& that) noexcept
    :   m_data(std::move(that.m_data))
    ,   m_size(std::move(that.m_size))
    {
    }

    inline ConstBuffer::ConstBuffer(const ConstBuffer& that, uint_t maxSize)
    :   m_data(that.m_data)
    ,   m_size(std::min(that.m_size, maxSize))
    {
    }

    inline ConstBuffer::ConstBuffer(pointer_type data, uint_t size) noexcept 
    :   m_data(data)
    ,   m_size(size) 
    {
    }

    inline void ConstBuffer::swap(ConstBuffer& that) noexcept
    {
        std::swap(m_data, that.m_data);
        std::swap(m_size, that.m_size);
    }

    inline ConstBuffer& ConstBuffer::operator=(ConstBuffer that) noexcept
    {
        swap(that);

        return *this;
    }

    inline ConstBuffer& ConstBuffer::operator+=(uint_t offset) noexcept
    {
        assert(offset <= m_size); // Buffer offset must be set in buffer bounds

        offset = std::min(offset, m_size);
        const void* data = static_cast<const uint8_t*>(const_cast<const void*>(m_data)) + offset;
        
        ConstBuffer tmp(data, m_size - offset);
        std::swap(tmp, *this);
       
        return *this;
    }

    inline ConstBuffer::pointer_type ConstBuffer::Data() const noexcept
    {
        return static_cast<ConstBuffer::pointer_type>(m_data);
    }

    inline uint_t ConstBuffer::Size() const noexcept
    {
        return m_size; // Вот на ЭТУ строчку ругается!!!: warning C4702: unreachable code
    }
Отредактировано 20.01.2017 9:43 Videoman . Предыдущая версия .
Re: Unreachable code в release
От: Andrew.W Worobow https://github.com/Worobow
Дата: 20.01.17 09:39
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Хотелось бы обратиться к спецам по С++ и по компилятору VS2013 в частности:


Попробуйте обновить компилятор, в старом было такое ошибочное предупреждение.
МС теперь снова выпустила компилятор плюс библиотеки в виде отдельной инсталляции.

Скачать можно тут — http://landinghub.visualstudio.com/visual-cpp-build-tools

Новые компиляторы от MS можно ставить в старую студию.
Не все кто уехал, предал Россию.
Re[2]: Unreachable code в release
От: Videoman Россия https://hts.tv/
Дата: 20.01.17 09:49
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Попробуйте обновить компилятор, в старом было такое ошибочное предупреждение.

AWW>МС теперь снова выпустила компилятор плюс библиотеки в виде отдельной инсталляции.

AWW>Скачать можно тут — http://landinghub.visualstudio.com/visual-cpp-build-tools


AWW>Новые компиляторы от MS можно ставить в старую студию.


Спасибо за совет, но есть нюансы:
1. Хотелось бы точно понять, что это баг, а не реальная проблема в коде
2. Я не могу так просто менять toolset, так как код использую не я один и нужно иметь веские причины в включать административные процедуры для всех разработчиков, чего не хотелось бы делать пока.
Re[3]: Unreachable code в release
От: uzhas Ниоткуда  
Дата: 20.01.17 09:54
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Спасибо за совет, но есть нюансы:

V>1. Хотелось бы точно понять, что это баг, а не реальная проблема в коде

вспомнил. у нас такие ворнинги выплыли на VS2015 и тоже в релизе. в коде все окейно. глюк студии
багу на ms connect не нашел
Re[3]: Unreachable code в release
От: Andrew.W Worobow https://github.com/Worobow
Дата: 20.01.17 10:02
Оценка: 5 (2)
Здравствуйте, Videoman, Вы писали:

V>Спасибо за совет, но есть нюансы:

V>1. Хотелось бы точно понять, что это баг, а не реальная проблема в коде
V>2. Я не могу так просто менять toolset, так как код использую не я один и нужно иметь веские причины в включать административные процедуры для всех разработчиков, чего не хотелось бы делать пока.

Да это такой баг, вы можете его игнорировать. Его можно убрать если переписать декларацию класса и убрать (по-моему inline). То есть можете по-экперементировать — Ибо я просто не помню всех деталей.

По второму пункту — если проект большой то сильно не рекомендую вам менять на переправе 2013 тулсет, на 140-ой там вылезет миллион предупреждений. Но если все варнинги исправить то переезд легкий.
Не все кто уехал, предал Россию.
Re[3]: Unreachable code в release
От: VTT http://vtt.to
Дата: 20.01.17 10:29
Оценка:
А noexcept в этом коде что такое?
noexcept а студии 2013 не поддерживается, а конструкция = default поддерживается лишь частично.
Почему методы в cpp файле помечены как inline? Вообще зачем тут cpp файл?
Зачем сделан перемещающий конструктор, который копирует?
Еще const_cast бесполезен, так как m_data и так имеет тип const void*

Метод Size выглядит безвредно, однако стоит проверить еще все места его использования.
А статический анализатор студии на это место не ругается?
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[4]: Unreachable code в release
От: Videoman Россия https://hts.tv/
Дата: 20.01.17 13:07
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>Почему методы в cpp файле помечены как inline? Вообще зачем тут cpp файл?

Это я прогнал на автомате, все в .h файле конечно. Привычка от классов с реализацией в .cpp.

VTT>Зачем сделан перемещающий конструктор, который копирует?

Для отладки кода, на всякий случай. Такой подход ни на что не влияет.

VTT>Еще const_cast бесполезен, так как m_data и так имеет тип const void*

Принято, исправил. Была копи-паста из другого класса.

VTT>Метод Size выглядит безвредно, однако стоит проверить еще все места его использования.

Вот тут и весь вопрос??? Для кода есть куча юнит-тестов и по ним все работает как надо и в release-e.

VTT>А статический анализатор студии на это место не ругается?

Нет
Re[4]: Unreachable code в release
От: Videoman Россия https://hts.tv/
Дата: 20.01.17 13:13
Оценка:
Здравствуйте, uzhas, Вы писали:

U>вспомнил. у нас такие ворнинги выплыли на VS2015 и тоже в релизе. в коде все окейно. глюк студии

U>багу на ms connect не нашел

Похоже на глюк, причем, все-таки, когда линкер делает whole-optimization, потому-что на стадии компиляции все Ок, а вот перед линковкой, сразу пачка предупреждений подряд.
Re[4]: Unreachable code в release
От: Videoman Россия https://hts.tv/
Дата: 20.01.17 13:17
Оценка:
Здравствуйте, Andrew.W Worobow, Вы писали:

AWW>Да это такой баг, вы можете его игнорировать. Его можно убрать если переписать декларацию класса и убрать (по-моему inline). То есть можете по-экперементировать — Ибо я просто не помню всех деталей.


AWW>По второму пункту — если проект большой то сильно не рекомендую вам менять на переправе 2013 тулсет, на 140-ой там вылезет миллион предупреждений. Но если все варнинги исправить то переезд легкий.


Пришлось подавить предупреждение, но вообще печально, что он перекочевал и в VS2015, а может уже и дальше.
Re[5]: Unreachable code в release
От: VTT http://vtt.to
Дата: 20.01.17 13:30
Оценка:
VTT>>Метод Size выглядит безвредно, однако стоит проверить еще все места его использования.
V>Вот тут и весь вопрос??? Для кода есть куча юнит-тестов и по ним все работает как надо и в release-e.

Можно попробовать в лоб закомментировать использование этого метода и выявить проблемное место в вызывающем коде.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re[6]: Unreachable code в release
От: Videoman Россия https://hts.tv/
Дата: 20.01.17 13:39
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>Можно попробовать в лоб закомментировать использование этого метода и выявить проблемное место в вызывающем коде.


Не уверен что правильно вас понял. Если закоментировать использование этого метода, то выдается 100500 мест с ошибками, где это метод вызывается. Более того, метод как бы работает правильно, т.к. по логике внешним классам получить размер не от куда, кроме как через этот метод, и написанные юнит-тесты проходятся.
Re[5]: Unreachable code в release
От: uzhas Ниоткуда  
Дата: 20.01.17 13:42
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Похоже на глюк, причем, все-таки, когда линкер делает whole-optimization, потому-что на стадии компиляции все Ок, а вот перед линковкой, сразу пачка предупреждений подряд.


когда линкер делает whole-optimization, то вызывает компилятор, чтобы что-нибудь докомпилировать для своих нужд (можно увидеть в процессах cl.exe)
Re[6]: Unreachable code в release
От: Videoman Россия https://hts.tv/
Дата: 20.01.17 14:12
Оценка:
Здравствуйте, uzhas, Вы писали:

U>когда линкер делает whole-optimization, то вызывает компилятор, чтобы что-нибудь докомпилировать для своих нужд (можно увидеть в процессах cl.exe)


Да я не спорю про "кишки" (реализацию). Я просто уточнил, что по времени вывода предупреждений, что похоже на время линкера или перед ним. Это просто чтобы уточнить стадию сборки, без деталей.
Re[7]: Unreachable code в release
От: VTT http://vtt.to
Дата: 20.01.17 14:22
Оценка:
Здравствуйте, Videoman, Вы писали:

V>Здравствуйте, VTT, Вы писали:


VTT>>Можно попробовать в лоб закомментировать использование этого метода и выявить проблемное место в вызывающем коде.


V>Не уверен что правильно вас понял. Если закоментировать использование этого метода, то выдается 100500 мест с ошибками, где это метод вызывается. Более того, метод как бы работает правильно, т.к. по логике внешним классам получить размер не от куда, кроме как через этот метод, и написанные юнит-тесты проходятся.


Мне кажется, что это предупреждение выдается из-за проблемы в вызывающем коде.
Например, где-то вылезает неопределенное поведение, этот вызов выкидывается, но дигностика указывает в сам метод, так как точнее не получилось.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re: Unreachable code в release
От: Erop Россия  
Дата: 20.01.17 14:40
Оценка:
Здравствуйте, Videoman, Вы писали:

V>
V>inline uint_t Buffer::Size() const
V>{
V>    return m_size;
V>}
V>



А чем у тебя дебаг сборка от релиза отличается?
Скорее всего у тебя где-то есть код, который эквивадленьтен чему-то вроде:
if( isDebug() ) {
    check( buffer.Size() >= mySize );
}


на первом проходе всей этой компиляции isDebug() от чего-то не разрешается, а Size() подставляется, а на втором, когда линкер запускает cl докомпилировать что там получилось isDebug() уже разрешается, но из-за подстановки предупреждают не там.

Вообще минимальный пример рулит. Если сделаешь его, например методом комминтирования половины кода в TU, в которой выдаётся предупреждение, то скорее всего и сам поймёшь, что происходит...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.