Re[12]: Достаточно ли знать С без знания С++ для устройства
От: eskimo82  
Дата: 07.09.14 01:39
Оценка:
E>>Как я понял из соседнего разговора — ты все смешал в кучу и не понимаеш, что SEH и плюсовые исключения — это совершенно разные вещи
E>>хотя, конкретно в виндах у микрософтовского компилятора С++ исключения реализуются на базе SEH.
CC>Напомню: мы вели разговор о практической примененимости С++ в ядре, что требует тесной интеграции с предоставляемым ОС функционалом. В винде такой функционал позволяет использовать С++ исключения в ядре, т.к. исключения виндовые компиляторы традиционно раелизуют через SEH.
CC>Рассматривать реализацию в отрыве от ОС просто не имеет смысла.
C++ традиционно не привязан к какой либо ОС.

E>> Причем, чтобы это работало, внутри ядра должн быть закреплен фильтр SEH из userspace runtime который знает про формат сгенерированных твой любимой студией стековых фреймов.

CC>Userspace тут вообще ни при делах, в DDK свой рантайм и свой компилятор. Драйвера собираются им.

E>> А надо сказать, этот формат для разных студий отличается.

CC>Да всё равно, unwind производится кодом этого же модуля, исключения наружу выпускать нельзя — будет совершенно законный BSOD.
Проблема в том что собственный unwind (а я так понял что у вас он собственный) невозможно сделать лучше чем сделал производитель компилятора (который более хорошо знаком с его особенностями). Тем более для виндусовых компиляторов практически всё остается недокументированым.

E>> Ты хоть понимаеш каким диким говнокодом тебе придется осуществлять поддержку ++ ?

CC>Ещё раз, у нас это вообще то уже лет пять назад работало в production.
То что это как-то работало в момент написания — нет сомнений. Более интересный вопрос — а сейчас то работает ? Если пересобрать другой версией компилятора — будет работать ?

E>>Что касается gcc то там С++ исключения реализованы по другому. Поэтому ты не сможеш просто-так собрать модуль ядра с поддержкой исключений.

CC>Кстати, а чем же так отличается GCC реализация что в линуксовом кернеле её нельзя использовать для бросания исключений внутри модуля?
Надо писать собственную реализацию раскрутки стека. Учитывая то, что ABI С++ постоянно нестабилен (как в винде, так и в линуксах), то поддержка этого кода для разных версий gcc становится проблемой. В тех же виндах стековый фрейм с информацией о catch меняется от версии к версии — каике-то поля добавляются, какие-то исчезают.
Вторая проблема, как я уже говорил, состоит в сопряжении уже существующего сишного кода с исключениями. Сишные код не предполагает что точка возврата может произойти в любом месте, и поэтому в нем изначально нет никакой exception-safety.

E>> Более того, если ты вдруг собереш свой приплюсный виндово-ядровый код другим компилятором, или даже другой версией студии у тебя будет масса интересных сюрпризов.

CC>В винде драйвера собираются с помощью DDK, там вообще свой компилятор идёт в комплекте.
Это компилятор С++ ? Он развивается ? У него одна единственая версия ?

E>> Ты вообще соображаеш какую говнояму ты таким образом выкапываеш для дальнейшей поддержки твоего кода ?

CC>Я прекрасно понимаю как оно внутри работает. 4 года поддерживали, никаких проблем.
А 10 лет сможете поддерживать ?

E>>Ты даже не понял о чем я говорю.

CC>Про макросы.
Про макросы, но про немного другие макросы, чем ты себе представляеш.

CC>>>Я в тот проект пришёл когда там линуксоиды со стажем все свои макросы уже написали. И занимались увлекательным делом — пытались с этим всем взлететь.

E>>И, пока ты там не появился, весь в белом и на коне, ничего взлететь не могло. Ага, унылый сказочник.
CC>Нет, я занимался другими вещами, попутно наблюдая за их танцами с саблями.
Т.е. ты не знаком с деталями танцев, а делаеш вывод глядя со стороны ?

E>>>>Ты просто не умееш с ними работать.

CC>>>Можно я буду так отвечать всем, кто кричит что С++ плохой?
E>>А кто-то кричит что С++ плохой?
CC>Ну вот например недалеко товарищ пишет:
CC>

Имеенно тогда увидел его уродливость С++. С++-кривое, уродливое безобразие.

Он пишет про уродливость (в каком-то его понимании), а не про то, что язык плохой.

E>>Ты опять мешаеш всё в кучу, толи по глупости, толи из-за не понимания. Аксес виолайшен — это SEH исключение, оно из более низкого уровня абстракции. В языке С++ нет никаких access violation.

CC>Ты ж сам только что писал что в винде вся исплементация рантайма для исключений сделана через SEH, забыл? Поэтому что SEH что С++ исключение в ядре суть одно и то же, только с разными параметрами.
Нет. Ты допускаеш грубую ошибку — путая уровни абстракции — либо ты пишеш на С++ и не знаеш ни о каких access violation, либо ты пишеш на каком-то другом, своем собственном, языке.
Это тоже самое, например, что в коде на С++ исилено использовать низкоуровневые функции Си, с соответсвующими следствиями.

E>>_CxxThrowException — это функция из рантайма С++ предназначена для выполнения в user space mode.

CC>Если пишешь в кернеле — там свой рантайм.
Может быть. По памяти — студия вообще может дергать несколько вариантов, что-то вроде _CxxThrowException, _CxxThrowExcept3, etc..

E>>RtlRaiseException — это опять же функция рантайма (но уже системного) и она предназначена для выполнения в user space mode.

CC>ZwRaiseException. Писал по памяти.

E>>При этом у С++ исключений есть специальный идентификатор, по которому его внутри фильтра можно отличить и разобрать фрейм сгенерированой студией.

CC>В случае когда пишешь драйвер используется компилятор и его либы из DDK. Сама студия уже особой роли не играет.
Это не зависит от используемого компилятора, т.к. этот идентификатор стандартизирован внутри микрософта. А вот сгенерированые фреймы имеют кучу различных версий свой структуры.

CC>>>Можно прикрутить RTTI, можно сделать свои классы с блекджеком и всем что к нему прилагается.

E>>Тебе это придется делать в любом случае — что бы понять что за исключение ты поймал и надо ли продолжать раскрутку стека.
CC>__except позволяет решать этот вопрос без RTTI.
Этот вариант даже еще хуже чем собственый unwind. В первом случае — у тебя хотя бы весь бойлерплайтный код вынесен в одно место. В этом же случае — он размазан тонким слоем по всему телу драйвера. Причем получаемый вариант — это совсем даже не С++, а непонятный набор костыликов и веревочек, играть с которыми нужно по нестандартным правилам, известным лишь только автору. Отладка макросов, даже криво написанных, по сравнению с отладкой такого спагети может оказаться милым цветочком.

E>>Ты хоть понимаеш сколько малокоректного говнокда из полухаков это стоит ? Такое достойно только зеленого юнца воображающего себя кулхацкером. На самом деле — это даже не смех, а сплошные слезы глядя на этого горе-кулхакера.

CC>На сколько поинтов выросло твоё ЧСВ при написании этой фразы?
Ни на сколько, просто констатирую факт.

E>>>>Особбенно совмещение неопределенных точек возврата с сишным кодом ядра.

CC>>>Не понял про что ты?
E>>У сишного кода есть четко обозначеные точки возврата "наверх". Использование исключений дает неопределенныые точки возврата — раскрутка стека может произойти в любом месте. Сишный код такого эээ несколько не ожидает.
CC>Ещё раз, исключение не должно покинуть модуль.

E>>Для начала тебе надо самому понять почему так, как ты описал выше, делать нельзя. К сожалению, ты неквалифицирован.

CC>+10 к ЧСВ?
Архитектура, которую ты описал, состоит из костылей и палочек. И это совсем даже не С++.

E>>Потому что в винде — это хак

CC>Т.е. решение использовать готовый и прекрасно работающий системный механизм исключений для реализации поддержки языковых исключений в рантайме это хак?
Хаком является пришитые белыми нитками С++ исключения внутри ядра. Причем в твоем варианте пришиты очень безобразно.

CC>Ах ну да, надо было написать свой, ни с чем не совместимый.

Трудолюбивый дурак порой даже хуже диверсанта.

E>>в основе которого лежит использование того факта, что один единственый компилятор поддерживает механизм С++ исключений на основе системного механизма SEH.

CC>В линуксе же таких возможностей и вовсе нету.
См. выше.

E>>Это у тебя руки из задницы.

CC>+10 к ЧСВ?
Просто констатирую факт.

E>>Нормальным разработчикам.

CC>Под нормальным разработчиком ты явно понимаешь себя.
CC>+100 к ЧСВ?

CC>>>Дада, она уже чёрти сколько лет вот вот помрёт. Осталось подождать ещё совсем немного.

E>>А помрет она из-за таких вот горе-программистов.
CC>Что то всё никак не помирает, что мы делаем не так?
Вы всё делаете так, просто надо удвоить усилия.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.