Unreacheable code - как устранить
От: dmitry_npi Россия  
Дата: 05.06.08 07:43
Оценка:
Компилятор (VC++8.0) выдает предупреждение C4702: unreacheable code в такого вида функциях:
BOOL CADORecordset::SetSort(LPCTSTR strCriteria)
{
    _ASSERT(IsOpen());

    try
    {
        m_pRecordset->PutSort(strCriteria);
        return TRUE;
    }
    catch(_com_error &e)
    {
        dump_com_error(e); // С4702
        return FALSE;
    }
}


(Функция — известная обертка над Recordset из ADO)
Почему он считает что секция catch недостижима? Ведь метод m_pRecordset->PutSort не объявлен ни как __declspec(nothrow), ни как throw()
и, конечно, не является extern "C" функцией.
Переменная m_pRecordset является экземпляром класса, сгенерированным директивой #import.
Такие предупреждения появляются только в RELEASE-конфигурации, в DEBUG их нет, хотя в обоих случаях стоит /W4 и /EHsc.
Атмосферная музыка — www.aventuel.net
Re: Unreacheable code - как устранить
От: Erop Россия  
Дата: 05.06.08 08:08
Оценка: +1
Здравствуйте, dmitry_npi, Вы писали:

_>Такие предупреждения появляются только в RELEASE-конфигурации, в DEBUG их нет, хотя в обоих случаях стоит /W4 и /EHsc.

Возможно всё подставляется, и выясняется, что код недостижим?
Попробуй подавить подстановки в этом месте и посмотреть останется ли предупреждение?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Unreacheable code - как устранить
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 05.06.08 08:42
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

_>Компилятор (VC++8.0) выдает предупреждение C4702: unreacheable code в такого вида функциях:

_>
_>BOOL CADORecordset::SetSort(LPCTSTR strCriteria)
_>{
_>    _ASSERT(IsOpen());

_>    try
_>    {
_>        m_pRecordset->PutSort(strCriteria);
_>        return TRUE;
_>    }
_>    catch(_com_error &e)
_>    {
_>        dump_com_error(e); // С4702
_>        return FALSE;
_>    }
_>}
_>


Я бы попробовал return TRUE вынести из try и поставить после блока catch.
Re: Unreacheable code - как устранить
От: alsemm Россия  
Дата: 05.06.08 08:52
Оценка: +1
Здравствуйте, dmitry_npi, Вы писали:

...
_>(Функция — известная обертка над Recordset из ADO)
_>Почему он считает что секция catch недостижима? Ведь метод m_pRecordset->PutSort не объявлен ни как __declspec(nothrow), ни как throw()
_>и, конечно, не является extern "C" функцией.
offtopic: extern "C" функция может выбрасывать исключения. extern "C" говорит С++ компилятору только чтобы он не декорировал имя функции.

Алексей
Re[2]: Unreacheable code - как устранить
От: dmitry_npi Россия  
Дата: 05.06.08 09:52
Оценка:
Здравствуйте, alsemm, Вы писали:
A>offtopic: extern "C" функция может выбрасывать исключения. extern "C" говорит С++ компилятору только чтобы он не декорировал имя функции.

Я же не сам это придумал... здесь
Атмосферная музыка — www.aventuel.net
Re[3]: Unreacheable code - как устранить
От: Roman Odaisky Украина  
Дата: 05.06.08 15:00
Оценка:
Здравствуйте, dmitry_npi, Вы писали:

A>>offtopic: extern "C" функция может выбрасывать исключения. extern "C" говорит С++ компилятору только чтобы он не декорировал имя функции.


_>Я же не сам это придумал... здесь


rtfm /EHc.
До последнего не верил в пирамиду Лебедева.
Re[4]: Unreacheable code - как устранить
От: gear nuke  
Дата: 05.06.08 16:42
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>rtfm /EHc.


Там же всё и написано:

If you feel that this warning is not valid because a function can throw, compile with /EHa or /EHs, depending on the exception thrown

People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[4]: Unreacheable code - как устранить
От: dmitry_npi Россия  
Дата: 03.07.08 07:06
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>rtfm /EHc.


Однако, не помогают никакие варианты этого /EHxx. Но опытным путем я выяснил, что при отключенной оптимизации (которая в релизе стоит /O2), этих предупреждений нет. Точнее говоря, в появлении предупреждений повинна опция-компонент O2 — /Og. Но она deprecated в VC2005. И при ее устранении (/Og-) соответственно появляются предупреждения. Так что же делать?
Атмосферная музыка — www.aventuel.net
Re[5]: Unreacheable code - как устранить
От: Vamp Россия  
Дата: 03.07.08 11:41
Оценка:
А правда, убрать return из try не помогает?
Да здравствует мыло душистое и веревка пушистая.
Re[6]: Unreacheable code - как устранить
От: dmitry_npi Россия  
Дата: 03.07.08 13:36
Оценка:
Здравствуйте, Vamp, Вы писали:

V>А правда, убрать return из try не помогает?


Честно говоря, не пробовал... Но как return может повлиять на достижимость блока catch??
Атмосферная музыка — www.aventuel.net
Re: Unreacheable code - как устранить
От: Alex Alexandrov США  
Дата: 03.07.08 20:04
Оценка: +1
Здравствуйте, dmitry_npi, Вы писали:

_>Компилятор (VC++8.0) выдает предупреждение C4702: unreacheable code в такого вида функциях:


Имеет большой смысл посмотреть дизассемблер, чтобы понять, что компилятор выкинул. Я бы это так просто не оставлял, ибо обычно код компилятор выкидывает не просто так...
It's kind of fun to do the impossible (Walt Disney)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.