const reference nullptr
От: Dair Россия  
Дата: 19.05.17 21:19
Оценка:
Коллеги,

Есть ли смысл в подобном коде:

const SomeClass& Class::getSomeClassVariable() const
{
    return *(SomeClass*)0;
}


Или это яркий пример так называемого говнокода, как мне и показалось с первого взгляда?
Re: const reference nullptr
От: MT-Wizard Украина  
Дата: 19.05.17 21:27
Оценка: +4
Здравствуйте, Dair, Вы писали:

D>Коллеги,


D>Есть ли смысл в подобном коде:


D>[/ccode]


D>Или это яркий пример так называемого говнокода, как мне и показалось с первого взгляда?


Это Undefined Behavior со всеми вытекающими. Но от лени его пишут — например, когда у SomeClass есть методы, не требующие this для работы или когда нет контроля над интерфейсом а NULL вернуть надо
Но всё равно UB
А ти, москалику, вже приїхав (с)
Re: const reference nullptr
От: jazzer Россия Skype: enerjazzer
Дата: 20.05.17 06:50
Оценка: -1
Здравствуйте, Dair, Вы писали:

D>Есть ли смысл в подобном коде


с С++11 — нет, так как для этого в Стандарте есть std::declval<const SomeClass>()

используется во всяких вычислениях типов, SFINAE, noexcept и т.д.
например:
decltype( std::declval<X>() + std::declval<Y>() )
noexcept( std::declval<X>().foo() + std::declval<Y>().bar() )
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: const reference nullptr
От: Evgeny.Panasyuk Россия  
Дата: 20.05.17 09:59
Оценка:
Здравствуйте, jazzer, Вы писали:

D>>Есть ли смысл в подобном коде

J>с С++11 — нет, так как для этого в Стандарте есть std::declval<const SomeClass>()

declval для случая ТС не подходит, у него другой контекст.
Re[3]: const reference nullptr
От: jazzer Россия Skype: enerjazzer
Дата: 20.05.17 11:43
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


D>>>Есть ли смысл в подобном коде

J>>с С++11 — нет, так как для этого в Стандарте есть std::declval<const SomeClass>()

EP>declval для случая ТС не подходит, у него другой контекст.


Ну он же не показал, как оно используется. У меня такая конструкция была только в местах, где сейчас надо использовать declval.
Хотя вру, еще она у меня использовалась, чтобы узнать смещение члена класса в объекте. Но сейчас offsetof тоже есть в Стандарте (правда там куча оговорок).
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: const reference nullptr
От: Evgeny.Panasyuk Россия  
Дата: 20.05.17 12:52
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Ну он же не показал, как оно используется.


Тем не менее, если в том коде использовать declval — то программа не соберётся.

J>У меня такая конструкция была только в местах, где сейчас надо использовать declval.


Это да.

J>Но сейчас offsetof тоже есть в Стандарте (правда там куча оговорок).


offsetof есть начиная с C++98, а пришёл он ЕМНИП из C.
Re[5]: const reference nullptr
От: jazzer Россия Skype: enerjazzer
Дата: 20.05.17 13:30
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

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


J>>Ну он же не показал, как оно используется.


EP>Тем не менее, если в том коде использовать declval — то программа не соберётся.


В каком "в том"? там же нету кода, там есть функция, которая заменяется (с упомянутыми оговорками) на declval...


J>>Но сейчас offsetof тоже есть в Стандарте (правда там куча оговорок).


EP>offsetof есть начиная с C++98, а пришёл он ЕМНИП из C.


но он только для standard layout и всякое такое, там куча ограничений. А хак с нулевым указателем будет работать везде (и на древних компиляторах тоже)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[6]: const reference nullptr
От: Evgeny.Panasyuk Россия  
Дата: 20.05.17 13:41
Оценка:
Здравствуйте, jazzer, Вы писали:

J>>>Ну он же не показал, как оно используется.

EP>>Тем не менее, если в том коде использовать declval — то программа не соберётся.
J>В каком "в том"? там же нету кода, там есть функция, которая заменяется (с упомянутыми оговорками) на declval...

А, ты о том чтобы заменить весь метод declval'ом. В таком случае, если там действительно declval был бы уместен то и тело метода в изначальном варианте было бы не нужно (достаточно было бы декларации) — но это уже всё размышление на тему "что хотел сказать автор".
Re[2]: const reference nullptr
От: Evgeny.Panasyuk Россия  
Дата: 20.05.17 13:54
Оценка: 2 (2)
Здравствуйте, MT-Wizard, Вы писали:

MW>или когда нет контроля над интерфейсом а NULL вернуть надо


Главное потом аккуратно это всё использовать, ибо UB. Некоторое время назад ловил баг в сторонней библиотеке связанный как раз с этим — в ссылках передавался nullptr, и в одном из мест был тест ссылки на этот самый nullptr, который компилятор безусловно выкидывал пользуясь правом UB, и код ниже соответственно падал понадеявшись на проверку.
Re[7]: const reference nullptr
От: jazzer Россия Skype: enerjazzer
Дата: 22.05.17 12:31
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>А, ты о том чтобы заменить весь метод declval'ом.


Да, именно.
Как-то даже и в голову не пришло, что это кто-то собирается вызывать в рантайме
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re: const reference nullptr
От: Кодт Россия  
Дата: 22.05.17 12:58
Оценка: 13 (3)
Здравствуйте, Dair, Вы писали:

D>Или это яркий пример так называемого говнокода, как мне и показалось с первого взгляда?


Без контекста непонятно, до какой степени это говнокод.
Но говнокод в любом случае, т.к. это эксплуатация неопределённого поведения.

Перечень бомб, которые здесь заложены:
— оптимизатор может бодро повыкидывать куски рабочего кода
— AV, если вдруг потребуется разыменовать указатель, — например, какая-то функция из невиртуальной будет переделана в виртуальную, или если оптимизатор заменит статический вызов виртуальной функции на динамический
— ненулевой адрес базы/наследника при сдвиге базы (при работе с указателями создаётся специальный код, превращающий нуль в нуль; при работе со ссылками этих проверок нет)
— последующее AV при работе с ненулевыми же адресами!
— в параноидном режиме программа просто не скомпилируется
Перекуём баги на фичи!
Re[2]: const reference nullptr
От: Dair Россия  
Дата: 22.05.17 14:25
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Без контекста непонятно, до какой степени это говнокод.

Контекста я не застал, потому что [см.ниже]
Посмотрел по коду немного — это заглушка виртуальной функции.

К>- в параноидном режиме программа просто не скомпилируется

есть у нас либА, которая делается в соседнем отделе. Эта либа перестала собираться с обновлением Xcode (и clang, видимо), именно на вот этом месте.

Коллеги переделали функцию, теперь она возвращает указатель, а не константную ссылку.
Re[3]: const reference nullptr
От: Кодт Россия  
Дата: 22.05.17 14:32
Оценка:
Здравствуйте, Dair, Вы писали:

К>>- в параноидном режиме программа просто не скомпилируется

D>есть у нас либА, которая делается в соседнем отделе. Эта либа перестала собираться с обновлением Xcode (и clang, видимо), именно на вот этом месте.

Вот за это я люблю шланг! Хотя, местами, он параноит больше, чем надо. Но эта паранойя регулируется.

D>Коллеги переделали функцию, теперь она возвращает указатель, а не константную ссылку.


Ага, и перенесли эпицентр взрыва с места пуска в место попадания. Ма-лай-цы.
Срочно скажи им, чтобы засунули в заглушку ассерт. И/или написали в документации, что виртуальная функция может возвращать нуль.
Перекуём баги на фичи!
Re[4]: const reference nullptr
От: Dair Россия  
Дата: 22.05.17 15:17
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Срочно скажи им, чтобы засунули в заглушку ассерт. И/или написали в документации, что виртуальная функция может возвращать нуль.

А вот просто написать virtual someFunction() == 0, не?
Re[5]: const reference nullptr
От: Кодт Россия  
Дата: 22.05.17 18:27
Оценка:
Здравствуйте, Dair, Вы писали:

D>А вот просто написать virtual someFunction() == 0, не?


Это же не заглушка, не?
Перекуём баги на фичи!
Re[6]: const reference nullptr
От: Dair Россия  
Дата: 22.05.17 21:07
Оценка:
Здравствуйте, Кодт, Вы писали:

D>>А вот просто написать virtual someFunction() == 0, не?

К>Это же не заглушка, не?

я уточню в офисе

Я проверю в коде. Чисто из любопытства. Завтра отпишусь.
Re: const reference nullptr
От: MasterZiv СССР  
Дата: 25.05.17 08:50
Оценка: +2
Здравствуйте, Dair, Вы писали:

D>
D>const SomeClass& Class::getSomeClassVariable() const
D>{
D>    return *(SomeClass*)0;
D>}
D>


D>Или это яркий пример так называемого говнокода, как мне и показалось с первого взгляда?


Это -- яркий пример говнокода.
И мне стыдно, но я когда-то такой код писал сам

НАДО КИДАТЬ ИСКЛЮЧЕНИЕ!
Re[2]: const reference nullptr
От: MNZ Россия  
Дата: 29.05.17 09:30
Оценка: +1 -1
Здравствуйте, MasterZiv, Вы писали:

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


D>>
D>>const SomeClass& Class::getSomeClassVariable() const
D>>{
D>>    return *(SomeClass*)0;
D>>}
D>>


D>>Или это яркий пример так называемого говнокода, как мне и показалось с первого взгляда?


MZ>Это -- яркий пример говнокода.

MZ>И мне стыдно, но я когда-то такой код писал сам

MZ>НАДО КИДАТЬ ИСКЛЮЧЕНИЕ!


Нет, не надо Исключение надо бросать тогда, когда ошибку невозможно исправить после внимательного прочтения кода. То есть, когда ошибка вызвана какими-то внешними факторами. Здесь же будет достаточно ассерта или что-то в этом роде.
Re[3]: const reference nullptr
От: N. I.  
Дата: 31.05.17 09:16
Оценка:
MNZ:

MZ>>НАДО КИДАТЬ ИСКЛЮЧЕНИЕ!


MNZ>Нет, не надо Исключение надо бросать тогда, когда ошибку невозможно исправить после внимательного прочтения кода. То есть, когда ошибка вызвана какими-то внешними факторами. Здесь же будет достаточно ассерта или что-то в этом роде.


Прально, std::terminate рулит
Re[2]: const reference nullptr
От: ομικρον  
Дата: 27.06.17 16:15
Оценка:
Здравствуйте, Кодт, Вы писали:

К>- ненулевой адрес базы/наследника при сдвиге базы (при работе с указателями создаётся специальный код, превращающий нуль в нуль; при работе со ссылками этих проверок нет)


Вроде как и для ссылок есть проверки. Правда, говорят, не во всех случаях
Автор: Кодт
Дата: 28.10.09
.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.