Сишный каст - зло?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.07.23 16:18
Оценка:
Здравствуйте!

Я тут решил немного пошмыгать.

Начитался тут тем про MSVC /Wall /WX, и решил тоже попробовать.

Повылезала куча всего, но в основном signed/unsigned mismatch, и вот это вот всё. Индексы в массивах и векторах — хочет size_t, а у меня часто int. Или исторически так сложилось, или требования какого-то API, или просто было пофигу, потому что я знаю, что у меня массив вообще никогда не вырастет до такого размера, чтобы знаковый бит стал проблемой (например, вектор из созданных HPEN/HBRUSH — система ляжет раньше, чем я только начну приближаться к проблемному размеру), и, часто, при этом, этот индекс если меньше нуля, то это инвалидный индекс, и я всегда проверяю инвалидность. Или битовые операторы и операторы сдвига — они, как оказалось, возвращают int/int64, а не тот тип, который изначально участвует в выражении. Полечил сишными кастами. Если бы лечить static_cast'ами, это каждое выражение становится пипец каким ужасным и нечитаемыми.

В целом, плюсовыми кастами пользуюсь иногда, когда надо явно сделать какое-то нетривиальное преобразование в критичном месте, и поиск таких мест по маске "_cast<" и выдаёт немного.

Почему сишным кастом пользоваться плохо?

Например, я убираю возможную знаковость у char переменной и конвертирую её в unsigned как-то так:
auto u = (unsigned)(std::uint8_t)ch;


Но можно и так:
auto u = static_cast<unsigned>(static_cast<std::uint8_t>(ch));


Во втором случае выражение гораздо менее наглядно, приходится скрипеть мозгами, чтобы понять, что там происходит.

Припоминаю аргументы:
1) Удобно искать cast'ы — но если на каждый чих их использовать, то любой поиск выдаст тонно-километры этих кастов. А если мы знаем точно, к какому типу ищем каст, то не всё ли равно, что искать — либо "_cast<TYPE>(", либо "(TYPE)"?
2) Сишный каст универсален, и беспринципно беспощаден — ну это есть, да, надо думать иногда, стоит ли использовать сишный каст или в узком месте использовать специализированный плюсовый каст. Может, просто стоит в код стайлах писать, в каких случаях надо использовать плюсовые касты, подразумевая, что в остальных случаях можно обойтись сишным кастом?

Да, для удобства поиска использую именно сишный каст, а не constructor style cast вида int(...)

ОбсудиПохоливарим?
Маньяк Робокряк колесит по городу
Re: Сишный каст - зло?
От: reversecode google
Дата: 27.07.23 17:32
Оценка: :)
вот они последователи шмыги, которые ни разу не бывали на собеседованиях
Re[2]: Сишный каст - зло?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.07.23 18:33
Оценка:
Здравствуйте, reversecode, Вы писали:

R>вот они последователи шмыги, которые ни разу не бывали на собеседованиях


Я в яндекс дзене немного посидел, там скукота, перекладывание из одной шляпы в другую. В НИИ я примерно тем же занимался, но там было веселее — там раз в несколько месяцев мой робот начинал летать/ползать, это драйвило.

Да, даже в НИИ в код стайле было прописано использование строго только плюсовых кастов. И нигде я не видел внятных обоснований для этого.


ЗЫ А ты зачем Шмыгу обижаешь, твой же побратим, не?
Маньяк Робокряк колесит по городу
Re[3]: Сишный каст - зло?
От: reversecode google
Дата: 27.07.23 18:46
Оценка:
расскажите когда побываете на С++ собеседовании

хотя вряд ли вы его пройдете

сможете вместе со шмыгой добивать очередной С++++++++ проект
Re[2]: Сишный каст - зло?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.07.23 18:56
Оценка:
Здравствуйте, reversecode, Вы писали:

R>вот они последователи шмыги, которые ни разу не бывали на собеседованиях


Кстати, ты бы мог, как сознательный украинец, взять шмыгу под свой патронаж, помочь побратиму, а заодно вы бы схлопнулись и аннигилировали, как частица и античастица, очистив профильные форумы от своего присутствия
Маньяк Робокряк колесит по городу
Re[4]: Сишный каст - зло?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.07.23 19:00
Оценка:
Здравствуйте, reversecode, Вы писали:

R>расскажите когда побываете на С++ собеседовании


Я прошел много собесов, яндексовые были не самые сложные


R>хотя вряд ли вы его пройдете


Это у тебя желчь разливается, от того, что сам никуда не смог пройти?


R>сможете вместе со шмыгой добивать очередной С++++++++ проект


анигилируйся лучше со шмыгой, всем всяко лучше будет, чем политоту тащить в профильный форум
Маньяк Робокряк колесит по городу
Re[3]: Сишный каст - зло?
От: reversecode google
Дата: 27.07.23 19:05
Оценка:
считаю надо зреть в корень, правда ?
учитывая что женская днк у всех присутствующих на форуме общая

поэтому все тоже самое со шмыгой можете проделать и вы
Re[4]: Сишный каст - зло?
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 27.07.23 19:35
Оценка:
Здравствуйте, reversecode, Вы писали:

R>поэтому все тоже самое со шмыгой можете проделать и вы


Это твой побратим

ЗЫ Модераторы, снесите плс эту подветку в политоту
Маньяк Робокряк колесит по городу
Re: Сишный каст - зло?
От: Pzz Россия https://github.com/alexpevzner
Дата: 27.07.23 20:18
Оценка: +2
Здравствуйте, Marty, Вы писали:

M>Почему сишным кастом пользоваться плохо?


Потому, что grep static_cast сказать можно, а в случае сишного каста грепать нечего.

Но это не очень сильный аргумент IMHO
Re: Сишный каст - зло?
От: T4r4sB Россия  
Дата: 27.07.23 21:39
Оценка: 9 (1)
Здравствуйте, Marty, Вы писали:

M> Индексы в массивах и векторах — хочет size_t, а у меня часто int. Или исторически так сложилось, или требования какого-то API, или просто было пофигу, потому что я знаю, что у меня массив вообще никогда не вырастет до такого размера, чтобы знаковый бит стал проблемой (например, вектор из созданных HPEN/HBRUSH — система ляжет раньше, чем я только начну приближаться к проблемному размеру), и, часто, при этом, этот индекс если меньше нуля, то это инвалидный индекс, и я всегда проверяю инвалидность.


Добро пожаловать в клуб
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p1428r0.pdf
Re: Сишный каст - зло?
От: andyp  
Дата: 27.07.23 23:18
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>ОбсудиПохоливарим?


За использование static_cast:
1. Пастухи джунов и языковые пуристы тебя сожрут
2. Тебе платят за набранные буквы



Уж для integral conversions я использую сишный каст, меньше писать и ничем имхо не опаснее чем static_cast.
Re: Сишный каст - зло?
От: Alekzander  
Дата: 28.07.23 04:44
Оценка:
Здравствуйте, Marty, Вы писали:

M>Например, я убираю возможную знаковость у char переменной


Для чего? Любой практически полезный сценарий надо прописывать в явном виде, с if'ами, а не неявно через типопреобразование.

Если я правильно понял, тебе лень нормально написать bound checking, и ты заменил его кастами.

M>ОбсудиПохоливарим?


Я следую прямо противоположному правилу: кроме сишных кастов ничего не использовать, чтобы было меньше говнокода. Логика очень простая и железобетонная: ЛЮБОЙ КАСТ ЭТО СИТУАЦИЯ, КОГДА *ТЫ* ЗНАЕШЬ О НАСТОЯЩЕМ ТИПЕ, А КОМПИЛЯТОР — ПОЧЕМУ-ТО НЕТ. Таких ситуаций надо избегать, потому, что они говорят о неправильной архитектуре и/или неверно написанном коде. Есть, конечно, ситуации, когда имеешь дело с историческими артефактами типа WinAPI, но там и Си-каста хватает.
Отредактировано 28.07.2023 5:13 Alekzander . Предыдущая версия . Еще …
Отредактировано 28.07.2023 4:50 Alekzander . Предыдущая версия .
Re[2]: Сишный каст - зло?
От: so5team https://stiffstream.com
Дата: 28.07.23 05:17
Оценка: +1
Здравствуйте, Alekzander, Вы писали:

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


M>>Например, я убираю возможную знаковость у char переменной


A>Для чего? Любой практически полезный сценарий надо прописывать в явном виде, с if'ами, а не неявно через типопреобразование.


A>Если я правильно понял, тебе лень нормально написать bound checking, и ты заменил его кастами.


Бывают случаи, когда бинарные данные приходят тупо в виде const char* или std::string, а собрать их нужно, скажем, в std::vector<std::uint8_t>. Повлиять на источник данных нельзя, это может быть сторонняя библиотека или кусок кода, написанный 100500 лет назад.
Re: Сишный каст - зло?
От: so5team https://stiffstream.com
Дата: 28.07.23 05:24
Оценка: +2 -2
Здравствуйте, Marty, Вы писали:

M>ОбсудиПохоливарим?


За использование сишного каста в C++ном коде нужно отрывать руки, а затем выгонять на мороз (ну или в обратной последовательности).

Любителям оправдываться по типу "ну тут же все очевидно и так проще, да и писать меньше" для лучшего усвоения еще и ноги прострелить.

И нечего тут холиварить.
Re: Сишный каст - зло?
От: Maniacal Россия  
Дата: 28.07.23 06:40
Оценка:
Здравствуйте, Marty, Вы писали:

M>Например, я убираю возможную знаковость у char переменной и конвертирую её в unsigned как-то так:

M>
M>auto u = (unsigned)(std::uint8_t)ch;
M>


Achtung! unsigned это unsigned int, а не unsigned char. Тут один байт в четыре превращается.

M>Но можно и так:

M>
M>auto u = static_cast<unsigned>(static_cast<std::uint8_t>(ch));
M>


static_cast, dynamic_cast, reinterpret_cast это в первую очередь инструменты для преобразования указателей базовых классов в унаследованные с контролем или в случае reinterpret_cast явное указание, что не в наследуемый.
Хотя в рекомендациях пишут, что static_cast можно и нужно использовать даже для встроенных типов.
Re[2]: Сишный каст - зло?
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 28.07.23 11:07
Оценка: +1
Здравствуйте, so5team, Вы писали:

S>За использование сишного каста в C++ном коде нужно отрывать руки, а затем выгонять на мороз (ну или в обратной последовательности).

Евангелизм как он есть.
Sic luceat lux!
Re[3]: Сишный каст - зло?
От: Alekzander  
Дата: 28.07.23 11:10
Оценка:
Здравствуйте, so5team, Вы писали:

M>>>Например, я убираю возможную знаковость у char переменной


A>>Для чего? Любой практически полезный сценарий надо прописывать в явном виде, с if'ами, а не неявно через типопреобразование.


A>>Если я правильно понял, тебе лень нормально написать bound checking, и ты заменил его кастами.


S>Бывают случаи, когда бинарные данные приходят тупо в виде const char* или std::string, а собрать их нужно, скажем, в std::vector<std::uint8_t>. Повлиять на источник данных нельзя, это может быть сторонняя библиотека или кусок кода, написанный 100500 лет назад.


Я же написал, что иногда приходится иметь дело с историческими артефактами, но там и Си-каста хватает. Речь идёт о том, что всё, что сложнее, лично для меня детектор.
Re[3]: Сишный каст - зло?
От: so5team https://stiffstream.com
Дата: 28.07.23 11:29
Оценка: +4 -2
Здравствуйте, Kernan, Вы писали:

S>>За использование сишного каста в C++ном коде нужно отрывать руки, а затем выгонять на мороз (ну или в обратной последовательности).

K>Евангелизм как он есть.

Или слишком много набитых в C++ шишек, которых можно было бы избежать, если бы программисты думали о том, как написать нормальный код, а не о том, чтобы сэкономить несколько символов.

Далеко не глупые люди посмотрели к тему приводит C-шный каст, внедрили в C++ специальные конструкции, которые если не делают код безопаснее, то уж точно явно отмечают подозрительные места... Но нет, всегда есть кто-то шибко умный, который скажет, что у него-то уж точно все нормально.
Re[4]: Сишный каст - зло?
От: so5team https://stiffstream.com
Дата: 28.07.23 11:32
Оценка: +2 -1
Здравствуйте, Alekzander, Вы писали:

A>Я же написал, что иногда приходится иметь дело с историческими артефактами, но там и Си-каста хватает.


Си-каст? Прострелить ноги, оторвать руки и на мороз шагом марш!

Но вообще, конечно, забавно. Сперва рассуждения о "Любой практически полезный сценарий надо прописывать в явном виде, с if'ами, а не неявно через типопреобразование", а потом бах, и Си-каст, который на все типопреобразования кладет с прибором. Вот что в головах у людей?
Re[4]: Сишный каст - зло?
От: sergii.p  
Дата: 28.07.23 11:37
Оценка: +2
Здравствуйте, so5team, Вы писали:

S>Далеко не глупые люди посмотрели к тему приводит C-шный каст, внедрили в C++ специальные конструкции, которые если не делают код безопаснее, то уж точно явно отмечают подозрительные места...


тут вопрос как раз о конструкциях, которые приводят к простреленным конечностям с C и C++ кастом. Я вот как-то придумать такие конструкции с ходу не могу.
Просто "пометить подозрительные места" — мне кажется слишком слабый аргумент для ввода 4 новых слов в язык.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.