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>Что то всё никак не помирает, что мы делаем не так?
Вы всё делаете так, просто надо удвоить усилия.