LINUX.ORG.RU

юнионы в C++

 


2

4

Пишу телегу против плюсов. В связи с этим вопрос - насколько широко в плюсах используются нуль-терминированные строки, юнионы, неумные указатели и всё такое плохое, что делает Си опасным языком.

Даже интересует не столько то, насколько они используются в существующих программах, а есть ли примеры программ, где хорошие средства плюсов сконсолидировались и поставили заслон от опасных конструкций Си, позволив полностью избежать их использования и избавиться от типичных ошибок Си. Можно ли так написать что-то существенно сложное? Сделано ли это в любимых библиотеках (Буст, QT и иже с ними)? Вторая часть вопроса - это неопределённое поведение. В Си его много. Это подаётся как фича, но с точки зрения безопасности это дыра. Меньше ли неопределённого поведения в С++?

Есть две полярные точки зрения на вопрос:

а) С++ перекрывает Си, поэтому там всё сделано по-другому, поэтому безопасность выше б) С++ - наследник Си и в целом наследует его недостатки.

Поскольку я мало пишу на Си и ещё меньше на Си++, у меня нет сложившегося мнения на эту тему. А у ЛОРа наверняка есть мнение, даже несколько.

★★★★★

Последнее исправление: xaizek (всего исправлений: 4)
Ответ на: комментарий от byko3y

Все ходы записаны, как и Ваше «на с++ ничего работающего написать нельзя». Теперь Вы скатились до банальной лжи… Фу быть таким.

AntonI ★★★★★
()
Ответ на: комментарий от eao197

Пилить код на произвольные куски по единственному критерию «должно быть меньше 25 строк» — это, я так понимаю, критерий качественного кода?

Нет, вы в очередной раз понимаете не правильно

А типа это я писал про «Даже 133 строки – это в шесть раз больше приемлемого объема»?

byko3y ★★★★
()
Ответ на: комментарий от eao197

Возражать по сути вот этому:
Страуструп – это манагер-продажник;
Страуструп не умеет проектировать архитектуру сложных систем;
стандарты пишут кретины

Да, когда чел придумывает совершенно нежизнеспособные штуки просто по критерию «звучит прикольно» — это продажник, это не архитектор. Для второго тезиса я не приводил еще аргументов, каюсь. По третьему тезису сложно что-то добавить, когда челы принимают решения не по принципу «все согласны», а по принципу «никто не возражает», то есть «никто не понял, чо это вообще такое», когда стандарт доводится до настолько невменяемого состояния, что читая его мы до сих пор не можем понять, есть ли там правила strict aliasing или нет. Так было с алголом 68, так было с SQL, так было с Си и C++.

на C++ нельзя написать ничего работающего

Не писал такого.

byko3y ★★★★
()
Ответ на: комментарий от eao197

Не так пошло изучение языка, в частности, тот факт, что operator= должен обрабатывать случаи x=x. Либо через сравнивание указателей, либо через использование идиомы tmp+swap

Кому там кто должен? Что программист «должен» переступать через грабил на каждый шаг — это как бы да, согласен. То что const используется для обозначения переменных — тоже согласен.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Не писал такого.

«Даже сейчас, когда я пишу на плюсах, у меня не поменялось мнение — я понимаю, что был прав, и да, нельзя на этом писать что-то работоспособное» юнионы в C++ (комментарий)

«Уи-и-и, ЕПРСТ. Это будет диффура, которая, наверняка, в общем виде будет весьма труднорешаемой» ПО для SpaceX разработано на С++ (комментарий)

это сходу, остальное лень искать. То есть Вы сначала несете чушь, а когда Вас в эту чушь носом как кутенка в лужу тыкают, Вы переобуваетесь в воздухе и начинаете открыто врать что «не писал такого». То есть у Вас даже нет минимальных зачатков мужества и порядочности что бы признать свои ошибки… пичалька.

AntonI ★★★★★
()
Ответ на: комментарий от fsb4000

MSVC и clang нет, но в обоих из них есть санитайзеры, которые находят ошибку

Санитайзер — это средство последней надежды, это не какая-то гарантия, на которую всегда можно положиться. Та же история с тестами — на них нельзя полагаться, как на гарантию отсутствия ошибок в коде. И в данном случае не было никакой объективной причины для того, чтобы делать язык настолько плохим — разрабы языка на ровном месте создали проблему с неявным поведением областей жизни.

byko3y ★★★★
()
Ответ на: комментарий от fluorite

Однажды Николас Вирт приехал в Италию.
– любите ли вы паскаль? - спросил Вирт
– Си, Си! - ответили итальянцы.
Вирт обиделся и больше в Италию не ездил.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от eao197

Стало понятно, что проблема в вашем ниасиляторстве и неспособности воспринимать реальность такой, какая она есть

Это называется «закрыть глаза на проблемы и сделать вид, что это фичи». Ноуп.

В примере явным образом создается объект типа std::string, никаких неявных приведений там нет

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

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Функция получается константную ссылку и меняет объект из поля.

А ещё в C++ есть const_cast… :)))

hobbit ★★★★★
()
Ответ на: комментарий от fsb4000

А как же код-ревью? Почему в проекте оказался код, который другие люди не понимают? Или это какая то шарага, где писал сначала один программист, потом наняли другого взамен первого. То есть работал лишь один человек, поэтому никаких код ревью не было?

Вот у нас сейчас код-ревью есть, и то не самый требовательный, но он все равно утомителен, потому что вместо просматривания по диагонали на предмет общего устройства и спорных фич приходится скурпулезно анализировать каждую строчку так, как если бы ты ее писал. Грубо говоря, для написания фич вместо одного программиста применяется труд полутора-двух программистов. Это не считая того, что на C/C++ программы в принципе не сильно быстро пишутся.

В самой терминальной стадии для внесения правок в проект нужно написать документацию и согласовать ее с ответственными лицами, что потребует примерно х5-20 трудозатрат по отношению к внесению правок одним програмистом.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Вот этого вообще не было.

Поздравляю вас соврамши: юнионы в C++ (комментарий)

Примерно в это время я знакомился с C++ и пришел к однозначному выводу, что на этом дерьмищи нельзя написать ничего работоспособного.

eao197 ★★★★★
()
Ответ на: комментарий от byko3y

Нормальная страховка от риска «Меньше всего меня колышет судьба человека, которого возьмут кодить вместо меня».

fluorite ★★★★★
()
Ответ на: комментарий от eao197

Во-вторых, если вам таки приходится писать на C++, то играть нужно по имеющимся правилам. С учетом того, что в C++ A<T*> и A<const T*> – это разные типы, нет GC и запросто получить повисший указатель. Если вам это не нравится, то см.пункт первый

Да, я играю по имеющимся правилам, по возможности не используя const. Можно хвалиться «смотрите, как я красиво решил проблему», а можно просто обойти проблему десятой дорогой, получив бонусом простоту кода. К сожалению, ЯП и стандартная библиотека настолько насквозь проедены констами, что полностью вывести эту гадость не представляется возможным.

Конкретный пример этой проблемы — список списков.

Так приведите уже конкретный пример. Хватит уже щеки надувать и трепать языком о каких-то абстрактных сложных системах

Список списков — что тут еще непонятно может быть? Мне конкретную задачу с работы взять или что ты мне предлагаешь?

byko3y ★★★★
()
Ответ на: комментарий от byko3y

А типа это я писал про «Даже 133 строки – это в шесть раз больше приемлемого объема»?

Из того, что «Даже 133 строки – это в шесть раз больше приемлемого объема» не следует «должно быть меньше 25 строк».

Как бы логика элементарная:

  • функции приемлемого размера – это необходимый, но недостаточный критерий хорошего кода;

  • длинные функции (да еще с большим количеством «мертвого» кода внутри) – это достаточный критерий для того, чтобы счесть код плохим.

Но когда в башке плещется известная субстанция, то проблемы с логикой возможны, да. Скорее всего даже неизбежны.

eao197 ★★★★★
()
Ответ на: комментарий от AntonI

Без оптимизаторов на том железе ариан бы просто не взлетел, бггг. Вы бы лучше молчали про космос, это не Ваша тема

Я в курсе, какое там железо. Больше удивляет, что его до сих пор запускают на том же железе. Кто-то их заставляет так делать? Космос и военка — это попильно-старперская тема не только в России.

byko3y ★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Там беда не в char*, а в повсеместном UB и templates driven coding

Ну в грамотных коллективах за шаблоны бьют по лапкам. В остальном — да, утро начинается с «на каком UB мы сегодня будем писать?».

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Да, когда чел придумывает

Как уже говорилось неоднократно, комментировать по сути потоки вашего бреда невозможно. В принципе.

eao197 ★★★★★
()
Ответ на: комментарий от byko3y

Кому там кто должен?

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

const здесь вообще не при делах.

eao197 ★★★★★
()
Ответ на: комментарий от byko3y

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

Потому что нанометры и гигагерцы и гигабайтами для таких задач не главное.

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

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

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Не писал такого.

«Даже сейчас, когда я пишу на плюсах, у меня не поменялось мнение — я понимаю, что был прав, и да, нельзя на этом писать что-то работоспособное» юнионы в C++ (комментарий)
«Уи-и-и, ЕПРСТ. Это будет диффура, которая, наверняка, в общем виде будет весьма труднорешаемой» ПО для SpaceX разработано на С++ (комментарий)

Ну? И как приписываемые мне фразы связаны с фактически написанным? Что слова похожие, лишь в немножко другом порядке и падеже? Вот так вот устроены русский язык, что в нём недостаточно просто присутствия слова.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

в грамотных коллективах за шаблоны бьют по лапкам.

В грамотных коллективах STL на STL-е стоит и STL-ью погоняет. В грамотных коллективах никто не пишет свои реализации векторов, списков и пр. без очень острой нужды. расскажите скорее как можно юзать STL без шаблонов? Что в STL значит букофка «T»?

AntonI ★★★★★
()
Ответ на: комментарий от byko3y

Да, я играю по имеющимся правилам,

Нет.

по возможности не используя const.

Отсюда приходим к уже озвученному ранее выводу:

  • вы будете местами терять эффективность;
  • вы будете плодить код, от которого пришедшие на ваше место будут плеваться. И, вероятно всего, вполне оправдано.

Но ваше отношение ко второму пункту уже понятно.

Список списков — что тут еще непонятно может быть?

Все.

что ты мне предлагаешь?

Предлагаю перестать надувать щеки, говорить об абстрактных сфероконях и перейти к конкретным примерам.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Вот этого вообще не было.

Поздравляю вас соврамши: юнионы в C++ (комментарий)

Примерно в это время я знакомился с C++ и пришел к однозначному выводу, что на этом дерьмищи нельзя написать ничего работоспособного

Я писал о человеке 2007 года. С мнением которого я, очевидно, не согласен. Но отвечать я, естественно, должен за то, за что ты захочешь. Потому что по сути-то больше сказать нечего.

byko3y ★★★★
()
Ответ на: комментарий от fluorite

Нормальная страховка от риска «Меньше всего меня колышет судьба человека, которого возьмут кодить вместо меня»

Полностью согласен. Другое дело, что ревью кода на C/C++ часто подразумевает намного больше, чем «за 20 секунд задетектить очевидный говнокод». У меня было такое, что я почти целый день тупо занимался одними ревью — вот настолько это «другое дело».

byko3y ★★★★
()
Ответ на: комментарий от byko3y

С мнением которого я, очевидно, не согласен.

Очевидно, что вы соврамши еще раз: юнионы в C++ (комментарий)

Даже сейчас, когда я пишу на плюсах, у меня не поменялось мнение — я понимаю, что был прав, и да, нельзя на этом писать что-то работоспособное за вменяемое время.

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

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Как бы логика элементарная:
длинные функции (да еще с большим количеством «мертвого» кода внутри) – это достаточный критерий для того, чтобы счесть код плохим

А расскажи мне, какая это «логика», если человек смотрит на функцию, в которой черным по белому написано комментарий про мертвый код и написан безусловный возврат, но всё, что он видит — это что в функции 350 строк кода?

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Фактически написано - «на С++ нельзя написать ничего работоспособного». Именно это Вам и вменяется.

Фактически написано «Это дифура … сложнорешаемая». Именно это Вам и вменяется.

Что слова похожие, лишь в немножко другом порядке и падеже?

Семантика сохранена 1:1. М.б. я немножко утрировал про суперкомпьютер (этого у Вас не было) - но остальное было и смысла это не меняет.

@hobbit, вот скажите пожалуйста - как нормальный человек должен реагировать на такое? Тут просто открытая ложь со стороны @byko3y и вопиющее оскорбление здравого смысла. Кроме того @byko3y де-факто обвиняет меня и @eao197 во лжи, а вот это 5.2 пострашнее чем диагнозы с дивана.

Мне кажется что за такие вещи надо вешать символический значок «лжец». Есть звезды, а это должна быть какая то антизвезда (пара бубенцов). Что бы все видели - с этим юзером в дискуссии не вступать, ничего кроме флейма не будет.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 2)
Ответ на: комментарий от byko3y

Ты всегда получишь «слегка сейф» на чем угодно

И опять ты занимаешься манипуляциями. Странно, что ещё не начал про космическое излучение, которая может бит в памяти переключить.

ввод-вывод — ансейф

А это вообще говорит о том, что понятие «ансейф» у тебя какое-то своё. Ну да, чтение или запись могут завершиться ошибкой, но никакого ансейфа, если интерфейс нормально спроектирован, тут нет.

Решил пооптимизировать — опять ансейф

Оптимизации так-то разные бывают. Это может быть и более удачный алгоритм, не обязательно сразу хаки с указателями.

DarkEld3r ★★★★★
()
Ответ на: комментарий от byko3y

В самой терминальной стадии для внесения правок в проект нужно написать документацию и согласовать ее с ответственными лицами, что потребует примерно х5-20 трудозатрат по отношению к внесению правок одним програмистом.

Два кубика аджайла внутривенно этим вотерфоллщикам

Crocodoom ★★★★★
()
Ответ на: комментарий от AntonI

Научитесь сначала признавать свои ошибки (это не слабость а нормальная реакция здорового человека), научитесь воспринимать отличную от Вашей точку зрения а не проявлять агрессию - тогда можно будет и про космос поговорить

Пишет мне человек, который меня преследует по тредам и напоминает про один и тот же тред. «Я гналась за вами три дня и три ночи, чтобы сказать вам, как вы мне безразличны». По крайней мере на LOR разговоры про космос мне чаще напоминают цирк, потому я с радостью проживу без них. В том числе потому, что неизбежно разговор скатывается к Маску, который на мой взгляд является жуликом, которому всё равно, зарабатывать ли на термоядерных доилках или многоразовых ракетах для лечения геморроя.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Человеку с мозгами я бы мог попробовать объяснить, что

a) есть факт того, что код функции занимает 350 строк. Ну вот тупо факт и все;

b) этот код же был написан. Человек, который его писал не дал себе труд изначально произвести декомпозицию на более мелкие фрагменты. Человек не дал себе труд избавиться от кусков мертвого кода.

Это все прямые намеки на то, что мы имеем дело с говнокодом. Разбираться с которым будет сложнее, чем с нормально написанным. Просто потому, что люди не способны удерживать большой контекст в поле своего внимания. И что в функции на 350 строк этого контекста будет в разы больше, чем в функции на 25 строк.

Но это все можно объяснить человеку с мозгами. А не Д’Артаньяну, который весь в белом.

eao197 ★★★★★
()
Ответ на: комментарий от byko3y

Пишет мне человек, который меня преследует по тредам

Ой-вэй… «даже если у вас паранойя, это не значит что за вами не следят»(с)

Научитесь отвечать за свои поступки, а за чужие поступки пусть отвечают те кто их совершает. Даже если Ваш сосед бьет свою жену, это не дает Вам право бить свою.

AntonI ★★★★★
()
Ответ на: комментарий от eao197

Программист должен писать корректный код. Показанный вами код оператора присваивания некорректен, т.к. не обрабатывает одно из граничных условий, а именно x=x.
const здесь вообще не при делах

Я написал, что это примитивный случай, и что есть сто способов, например, присвоить объекту его же поле, или скормить полю само себя посредством другой функции. Язык изначально не дает гарантии, что изменение данных не укусит себя за хвост, а значит это нужно проверять руками, а значит такой const никаких гарантий консистентности (я именно на это отвечал) не дает.

byko3y ★★★★
()
Ответ на: комментарий от Crocodoom

Вотерфолл - написать весь код, написать всю доку. Аджаил - написать чуть-чуть кода, чуть-чуть доки. Переписать и то, и другое на следующей итерации :)

fluorite ★★★★★
()
Ответ на: комментарий от eao197

Константа там где? Числовой литерал (вроде это так называется) есть, константы нет

Все языки докрествого времени называли числовой литерал константой, а именованный вариант — именованной константой.

byko3y ★★★★
()
Ответ на: комментарий от fluorite

Аджаил - написать чуть-чуть кода, чуть-чуть доки.

Мне кажется, что что-то одно здесь лишнее :) Либо «чуть-чуть кода», либо «чуть-чуть доки», либо «аджайл» :))

eao197 ★★★★★
()
Ответ на: комментарий от AntonI

В грамотных коллективах STL на STL-е стоит и STL-ью погоняет. В грамотных коллективах никто не пишет свои реализации векторов, списков и пр. без очень острой нужды. расскажите скорее как можно юзать STL без шаблонов? Что в STL значит букофка «T»?

Ну вот в гугле неграмотный коллектив. Вообще не представляю, как они что-то пишут. Дикие люди, не то что на LOR-е.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Язык изначально не дает гарантии

Его за это и выбирают, т.к. отсутствие гарантий обеспечивает a) высокую скорость работы кода и b) возможность работать напрямую с железом.

что изменение данных не укусит себя за хвост, а значит это нужно проверять руками, а значит такой const никаких гарантий консистентности (я именно на это отвечал) не дает

А в огороде бузина, а в Киеве дядька.

eao197 ★★★★★
()
Ответ на: комментарий от byko3y

А во времена Блеза Паскаля константы писали на бумашке. Пером. Вот это была реальная константа! Впрочем не-константы тоже.

Что там с шаблонами во вменяемых коллективах? И что значит буква «T» в STL?

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от byko3y

Все языки докрествого времени называли числовой литерал константой, а именованный вариант — именованной константой.

Как уже говорилось ранее, бесполезно приплетать в разговоре про особенности C++ другие языки.

eao197 ★★★★★
()
Ответ на: комментарий от byko3y

Ну вот в гугле неграмотный коллектив. Вообще не представляю, как они что-то пишут. Дикие люди, не то что на LOR-е.

Они пишут с применением STL. Например

Или abseil – это уже и не Google?

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Да, я играю по имеющимся правилам,

Нет

по возможности не используя const.

Отсюда приходим к уже озвученному ранее выводу:

Э, секунду, можно цитату на стандарт, где написано «применение модификатора const в коде обязательно?». Я пролистал, но почему-то не нашел.

вы будете местами терять эффективность

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

Список списков — что тут еще непонятно может быть?

Все.

list<list<char*>>. Всё, приехали, ты уже не сможешь написать шаблонный код template <typename T> function(list<list<T>>), чтобы поместить в список и list<char *>, и list<const char*>. Но на самом деле проблема может выстрелить даже раньше, если потребуется list<char *> * хранить в банальной переменной, чтобы с этой переменной работать из двух удаленных частей системы. Да, в случае переменной можно отмазаться в духе «сделай дополнительный тэг, по которому будет выполняться специализация в list<char *> или list<const char*>», потому я сразу привел пример списка списков, для которого уже не так очевиден workaround.

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

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Защитились? Защитились. Что могло пойти не так? Я подчеркиваю, что сейчас речь идет не про какую-то отдельную проблему конкретных операторов, а про фундаментальный изъян модификатора const при использовании его для переменных, который может точно так же проявиться в сотне других мест. не говоря уже о том, что в отдельных местах докатываются аж до const_cast.

Картина маслом - рассуждая о всякого рода UB и небезопасных крестах ты своими руками наговнокодил логическую ошибку - size некорректен. Твой паскаль/лисп/раст конечно же не дадут тебе посчитать неправильно условную площадь круга. Так вот возможностей для логических ошибок многократно больше, чем условное обращение по невалидному указателю, которое легко отлавливается. Безопасность только в проповедях свидетелей unsafe.

И ты совсем не понял о чём я тебе толковал и по привычке опять начал про безопасность. Я же тебе говорил, что без константности не написать дешевый (в смысле производительности) интерфейс, давая возможность смотреть кишки и не ломать при этом консистентность внутри объекта, иначе бы пришлось делать дорого с копированием. Это ни разу не про безопасность история, героем которой ты назначил const.

kvpfs ★★
()
Ответ на: комментарий от byko3y

list<list<char*>>

list<list<std::string>>

Не благодарите, и можете даже не делиться со мной своей ЗП.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.