Re[3]: C++ illegal instruction
От: serg_joker Украина  
Дата: 06.08.25 17:37
Оценка:
Здравствуйте, sergii.p, Вы писали:

SP> Но С++ рассчитан больше на людей, которые программируют под чайник или мусорное ведро.

Очень спорное утверждение. Я не знаю ни одного С++ программиста, программирующего под чайник или мусорное ведро, а знакомых плюсовиков у меня много. Но даже если бы и да, то это ни на что не влияет, см. ниже. Впрочем, боль людей, пишущих для чайников, я действительно могу не понимать в силу отсутствия такого опыта.

SP>Давайте посмотрим такой код:

<cut>
Давайте.

SP>здесь по вашей логике надо истошно кричать и материться: забыли default или return. Но с точки зрения программиста, у него не может прийти код 3.

Да, нужно истошно кричать и материться. Компилятор не должен думать, что там за логика у программиста. Программист у себя в голове держит мысль "мамой клянусь, не может быть (flag & 3) == 3". А вот если этот флаг прилетит из поломанного пакета или из файла, записанного несовместимой версией, или ещё откуда, или предыдущий парсинг сломан, и в месте, где мы ожидаем флаг, лежит что-то такое, у чего младшие биты 0b11, то окажется, что мамой клялись напрасно.

Более того, если таки провал в ветку без return не случится, то и invalid instruction не будет, т.к. мы до ud2 не дойдём. А если дошли, то программист имел в голове неверные допущения.

Если программист "зуб даёт", то у него в современном компиляторе (а мы ведь на них жалуемся) есть масса способов выразить эту мысль: assert, [assume]], std::unreachable, да хоть abort() позови в ветке default, можно хоть return Type::Unknown, мы же всё равно в эту ветку не попадём, правда?

SP>Может у него раньше стоит проверка и сразу делается вывод об ошибке.

Может. А может, и нет, компилятору об этом откуда знать?

SP> Зачем ему явно обрабатывать невозможный сценарий?

Затем, чтобы показать компилятору, что мы знаем, что делаем. std::unreachable убирает предупреждение и более на генерацию кода не влияет.

SP> Тем более что в результате добавления return мы получим вместо 2-х инструкций 4. А функцию с 4 инструкциями компилятор может уже не захотеть инлайнить, например. А если даже захочет, то это уже рост кода на n*2. Так зёрнышко по зёрнышку и мы не влезем в память нашего чайника.

Нет, не получим.см. здесь, например. Добавление std::unrechable() убирает предупреждение и никаким иным образом на выхлоп не влияет. Ну или приведите пример, где получим, не гипотетически, а на практике, у меня не получилось, может плохо старался.
А, нет, влияет: как раз-таки при вставке std::unrechable компилятор перестаёт генерировать ud2, т.к. программист не только себе, но и компилятору мамой клянётся, что 3 там никак не получится. По крайней мере, у меня так вышло, может, оно и не всегда так.

SP>Причём в С++ давно нашли решение этой дилеммы. Те, кому нужна безопасность, просто обвешиваются санитайзерами и не лезут в дела других. Но конечно человек так не умеет. Ему обязательно надо рассказать остальным почему они мудаки и поступают неправильно

Я уверен, что кто-то страдает и по отсутствию автоматического приведения указателей на что угодно в указатели на что угодно, как это было в C. Уверен, что немало было по этому поводу стонов ("мамой клянусь, я знаю, что за этим void* на самом деле лежит int*, не нужно от меня требовать явного преобразования). Или по тому, что const-correctness — это прямо боль("мамой клянусь, я не буду менять объект").
И я рад, что, несмотря на эту боль, компиляторщики дали мне и ворнинг, и генерацию ud2, и другую диагностику, которой раньше не было.
Санитайзеры — сильно более другой подход, хоть и важный. Сильно влияют на характеристики производительности, на CI/CD (нужно же как-то, чтобы санитайзер у нас отработал, а клиенту поехал продукт без оного).
Отредактировано 06.08.2025 21:09 serg_joker . Предыдущая версия . Еще …
Отредактировано 06.08.2025 19:37 serg_joker . Предыдущая версия .
Отредактировано 06.08.2025 19:35 serg_joker . Предыдущая версия .
Отредактировано 06.08.2025 17:48 serg_joker . Предыдущая версия .
Отредактировано 06.08.2025 17:46 serg_joker . Предыдущая версия .
Отредактировано 06.08.2025 17:43 serg_joker . Предыдущая версия .
Отредактировано 06.08.2025 17:42 serg_joker . Предыдущая версия .
Отредактировано 06.08.2025 17:39 serg_joker . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.