Почему использование шаблона C++ не рекомендуется в космической/излучаемой среде?

Прочитав этот вопрос, я понял, например , почему динамическое распределение или исключения не рекомендуются в средах с высоким уровнем радиации, например, в космосе или на атомной электростанции. Что касается шаблонов, я не понимаю, почему. Не могли бы вы объяснить это мне?

Учитывая этот ответ, он говорит, что он вполне безопасно использовать.

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


person Guillaume D    schedule 12.06.2019    source источник
comment
Я предполагаю, что это не из-за среды, а из-за запуска программы на встроенных системах с очень ограниченными ресурсами. Шаблоны имеют тенденцию создавать раздувание, поскольку шаблоны могут привести к дублированию кода для разных экземпляров.   -  person Some programmer dude    schedule 12.06.2019
comment
Опасения по поводу C++ на Марсе изложены на странице 34 презентации марсохода, и все они не связаны с радиацией. (Я думаю, что нижняя половина ответа, о котором вы говорите, не касается проблем с радиацией.)   -  person molbdnilo    schedule 12.06.2019
comment
В конце концов, шаблоны — это обычные классы и функции. Игнорируя другие причины, такие как возможное раздувание кода или длительное время компиляции, не должно быть причин не использовать их.   -  person One Man Monkey Squad    schedule 12.06.2019
comment
Это не имеет ничего общего с излучением или размером кода. Рекомендации по проектированию безопасности обычно пытаются уменьшить сложность кода (короткая функция, отсутствие косвенных вызовов, только статическое выделение памяти и т. д.). Многие из этих руководств были написаны в то время, когда LINT был лучшим средством для анализа кода. Так что не все эти правила по-прежнему имеют смысл.   -  person user6556709    schedule 12.06.2019
comment
Теоретически для таких систем можно использовать ограниченное подмножество C++. На практике вы избегаете C++ как чумы просто потому, что он слишком сложен, и вы никогда не можете доверять программистам C++ в том, что они придерживаются безопасного подмножества. Прежде чем вы это узнаете, по всей программе ад метапрограммирования шаблонов. Кроме того, многие новые функции из C++11 и выше, такие как поведение auto, снесут вам все ноги.   -  person Lundin    schedule 12.06.2019
comment
Вы смешиваете две проблемы. Вопрос был о радиоактивной среде, и, кстати, в ответе кто-то упомянул стандарты кодирования НАСА для приложений с защитой от космоса - стандарты кодирования были предназначены для решения проблем, отличных от радиационной защиты - есть и другие, более общие проблемы, которые следует учитывать при использовании С++ ( или любой другой язык) во встроенных системах, особенно в тех, которые трудно или даже невозможно обновить после развертывания. Вопрос о безопасности использования не относится к встроенным системам, но это не значит, что это небезопасно, но есть последствия, которые необходимо учитывать.   -  person Clifford    schedule 12.06.2019
comment
Проверьте ссылку this answer — она не указывает на конкретный ответ.   -  person Marc.2377    schedule 13.06.2019


Ответы (3)


Обратите внимание, что совместимые с пространством (стойкие к излучению, аэронавтике) вычислительные устройства очень дороги (в том числе для запуск в космос, так как их вес превышает килограммы), и что одна космическая миссия стоит, возможно, сотни миллионов евро или долларов США. Потеря миссии из-за проблем с программным обеспечением или компьютером, как правило, влечет за собой непомерно высокие затраты, поэтому неприемлема и оправдывает дорогостоящие методы и процедуры разработки, о которых вы даже не мечтаете использовать для разработки апплета для мобильного телефона, а также использование вероятностные рассуждения и инженерные подходы рекомендуются, поскольку космические лучи до сих пор являются каким-то "необычным" событием. С высокоуровневой точки зрения космические лучи и производимое ими переворачивание битов можно рассматривать как шум в некоторой абстрактной форме сигнала или входных данных. Вы можете рассматривать проблему «случайного переключения битов» как отношение сигнал/шум проблема, то рандомизированные алгоритмы могут обеспечить полезную концептуальную основу (особенно на метауровне, то есть при анализе критического для безопасности исходного кода или скомпилированного бинарного файла, а также во время критически важного времени выполнения системы в каком-либо сложном ядре или потоке планировщик), с теория информации точка зрения.

Почему использование шаблона C++ не рекомендуется в космической/радиоактивной среде?

Эта рекомендация является обобщением для C++ MISRA C правил кодирования и правил Embedded C++, а также Рекомендации DO178C, и это связано не с излучением, а со встроенными системами. Из-за ограничений по излучению и вибрации встроенное оборудование любого ракетно-космического компьютера должно быть очень небольшим (например, по экономическим причинам и причинам энергопотребления, оно более — по мощности компьютера — похоже на Raspberry Pi). системы, чем большая серверная система x86). Закаленные в космосе чипы стоят в 1000 раз дороже, чем их гражданские аналоги. И вычисление WCET на компьютерах, встроенных в космос, по-прежнему является технической проблемой (например, из-за < проблемы, связанные с href="https://en.wikipedia.org/wiki/CPU_cache" rel="noreferrer">кэшем ЦП). Следовательно, выделение кучи не одобряется в критически важные с точки зрения безопасности встроенные системы с интенсивным использованием программного обеспечения (как бы вы справились с нехваткой памяти в них? Или как бы вы доказали что у вас достаточно оперативной памяти для всех случаев реального времени выполнения?)

Помните, что в критическом мире программного обеспечения вы не только каким-то образом "гарантируете" или "обещаете" , и, конечно же, оценить (часто с некоторыми умными вероятностными рассуждениями) качество вашего собственного программного обеспечения, а также всех программных инструментов, используемых для его создания (в частности: вашего компилятора и вашего компоновщика; Boeing или Airbus не будут менять свою версию кросс-компилятора GCC, используемого для компиляции их программного обеспечения для управления полетом без предварительного письменного разрешения от например, FAA или DGAC). Большинство ваших программных инструментов должны быть так или иначе одобрены или сертифицированы.

Имейте в виду, что на практике большинство шаблонов C++ (но, конечно, не все) внутренне используют кучу. И стандартные C++ контейнеры, безусловно, подходят. Написание шаблонов, которые никогда не используют кучу, — сложное занятие. Если вы на это способны, вы можете безопасно использовать шаблоны (при условии, что вы доверяете своему компилятору C++ и его механизму расширения шаблонов, который является самой сложной частью внешнего интерфейса C++ большинства последних компиляторов C++, например, GCC или Клэнг).

Я предполагаю, что по аналогичным причинам (надежность набора инструментов) не одобряется использование многих генерации исходного кода инструменты (выполнение некоторых видов метапрограммирования, например создание кода C++ или C). Обратите внимание, например, что если вы используете bison (или RPCGEN) в некоторых важных для безопасности программах (составленных make и gcc) вам необходимо оценить (и, возможно, тщательно протестировать) не только gcc и make, но и bison. Это инженерная причина, а не научная. Обратите внимание, что некоторые встроенные системы могут использовать рандомизированные алгоритмы, в частности, для разумной работы с шумные входные сигналы (возможно, даже случайные перевороты битов из-за достаточно редких космических лучей). Доказательство, тестирование или анализ (или просто оценка) таких алгоритмов на основе случайных чисел — довольно сложная тема.

Ознакомьтесь также с Frama-Clang и CompCert и обратите внимание на следующее:

  • C++11 (или последующие) это ужасно сложный язык программирования. У него нет полной формальной семантики. Людей, достаточно разбирающихся в C++, всего несколько десятков по всему миру (вероятно, большинство из них входит в его комитет по стандартизации). Я умею программировать на C++, но не могу объяснить все тонкости семантики перемещения или модель памяти. Кроме того, C++ на практике требует множества оптимизаций для эффективного использования.

  • Очень сложно сделать безошибочный компилятор C++, в частности потому, что C++ практически требует сложного оптимизации, а также из-за сложности спецификации C++. Но текущие (например, недавние GCC или Clang) на практике довольно хороши, и у них мало (но все же есть) остаточных ошибок компилятора. CompCert++ для C++ еще нет, и для его создания требуется несколько миллионов евро или долларов США (но если вы можете собрать такую ​​сумму денег, свяжитесь с меня по электронной почте, например, на [email protected], мой рабочий адрес). А индустрия космического программного обеспечения чрезвычайно консервативна.

  • Сложно создать хороший распределитель кучи памяти C или C++. Кодирование — это вопрос компромиссов. В шутку рассмотрите возможность адаптации этого распределителя кучи C к C++.

  • подтверждение свойств безопасности (в частности, отсутствие условий гонки или неопределенное поведение (например, переполнение буфера во время выполнения) кода C++, связанного с шаблонами, по-прежнему, во 2 квартале 2019 г., немного опережая уровень развития статического анализа программ C++ код. Мой черновик технического отчета Bismon (это черновик отчета H2020, поэтому пропустите страницы для европейских бюрократов) есть несколько страниц, объясняющих это более подробно. Знайте теорему Райса.

  • тестирование встроенного программного обеспечения C++ для всей системы может потребовать запуска ракеты (как Ariane 5 испытательный полет 501 или, по крайней мере, сложные и тяжелые эксперименты в лаборатории). Это очень дорого. Даже тестирование на Земле марсохода требует много денег. .

Подумайте об этом: вы пишете какое-то критичное для безопасности встроенное программное обеспечение (например, для торможения поездов, автономных транспортных средств, автономных дронов, большой нефтяной платформы или нефтеперерабатывающего завода, ракет и т. д.). Вы наивно используете стандартный контейнер С++, например. некоторые std::map<std::string,long>. Что должно произойти при нехватке памяти? Как вы «докажете» или, по крайней мере, «убедите» людей, работающих в организациях, финансирующих космическую ракету стоимостью 100 миллионов евро, что ваше встроенное программное обеспечение (включая компилятор, использованный для его создания) достаточно хорошо? Правило десятилетней давности запрещало любое динамическое выделение кучи.

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

Даже их трудно доказать или, в более общем плане, оценить их качество (и вы, вероятно, захотите использовать свои собственные распределитель внутри них). В космосе пространство кода является сильным ограничением. Таким образом, вы должны скомпилировать, например, g++ -Os -Wall или clang++ -Os -Wall. Но как вы доказали — или просто протестировали — все тонкие оптимизации, сделанные -Os (и они специфичны для вашей версии GCC или Clang)? Ваша космическая организация спросит вас об этом, поскольку любая ошибка во встроенном космическом программном обеспечении C++ может привести к сбою миссии (прочитайте еще раз о Первый полет Ariane 5 сбой - закодировано на каком-то диалекте Ады, которая в то время имела "лучшую" и "более безопасную" систему типов, чем C++17 сегодня), но не Не смейтесь слишком много над европейцами. Boeing 737 MAX с его MACS является похожий беспорядок).


Моя личная рекомендация (но, пожалуйста, не относитесь к этому слишком серьезно. В 2019 году это больше игра слов, чем что-либо еще) — рассмотреть возможность кодирования вашего встроенного программного обеспечения в Rust. Потому что он немного безопаснее, чем C++. Конечно, вам придется потратить от 5 до 10 миллионов евро (или миллионов долларов США) за 5 или 7 лет, чтобы получить хороший компилятор Rust, подходящий для космических компьютеров (опять же, пожалуйста, свяжитесь со мной как с профессионалом, если вы способны потратить эти деньги). много на бесплатном программном компиляторе Compcert/Rust). Но это всего лишь вопрос разработки программного обеспечения и управления программными проектами (читайте Мифический Месяц и Бредовые вакансии, чтобы узнать больше , помните также о принципе Дилберта: он применим как к индустрии космического программного обеспечения, так и к индустрии встроенных компиляторов. , как и все остальное).

Мое твердое и личное мнение состоит в том, что Европейская комиссия должна финансировать (например, через Horizon Europe) бесплатное программное обеспечение CompCert++ (или даже лучше, Compcert/Rust) как проект (и такой проект потребует больше более 5 лет и более 5 высококлассных, кандидатов наук). Но в возрасте 60 лет я, к сожалению, знаю, что этого не произойдет (поскольку идеология ЕС, по понятным причинам в основном вдохновленная политикой Германии, по-прежнему является иллюзией Конец истории, поэтому H2020 и Horizon Europe на практике в основном представляют собой способ оптимизации налогов для корпораций в Европе посредством Европейские налоговые гавани), и это после нескольких частных обсуждений с несколькими участниками проекта CompCert. К сожалению, я ожидаю, что DARPA или NASA с гораздо большей вероятностью будет финансировать какой-либо будущий проект CompCert/Rust (чем его финансирует ЕС).


NB. Европейская авиационная промышленность (в основном Airbus) использует гораздо больше формальных методов, чем североамериканская ( Боинг). Следовательно, некоторых (не всех) модульных тестов избегают (поскольку они заменяются формальными проверками исходного кода, возможно, с помощью таких инструментов, как Frama-C или Astrée — ни один из них не был сертифицирован для C++, только для подмножества C, запрещающего динамическое выделение памяти C и некоторые другие особенности языка C). И это разрешено DO-178C (а не предшественником DO-178B) и одобрен французским регулирующим органом, DGAC (и, я думаю, другими европейскими регулирующими органами).

Также обратите внимание, что многие конференции SIGPLAN косвенно связаны с вопросом ОП.

person Basile Starynkevitch    schedule 12.06.2019
comment
верно для стандартных библиотечных шаблонов и сложных функций (однажды я использовал лямбда-выражения в проекте, который удвоил размер моего кода), но я больше думал о сделанных на заказ. Если вы делаете свои собственные шаблоны, вы должны знать, что делаете, верно? Я имею в виду, что если вы не знаете, что вы кодируете, это довольно большая проблема. - person Guillaume D; 12.06.2019
comment
Но как вы докажете людям, которые платят 100 миллионов евро за космическую миссию, что ваше программное обеспечение не содержит ошибок? - person Basile Starynkevitch; 12.06.2019
comment
шаблоны - это просто способ написания. Например, если я создаю функцию шаблона, которую можно использовать с двумя классами, я модульный тест 2 использования и третье использование с другим классом, чтобы убедиться, что все правильно. - person Guillaume D; 12.06.2019
comment
это все еще немного косвенно связано с шаблонами. Не могли бы вы подробнее остановиться на вопросах конкретной проблемы: шаблоны. - person Tarick Welling; 12.06.2019
comment
поскольку любая ошибка времени выполнения во встроенном космическом программном обеспечении C++ может привести к сбою миссии (прочитайте еще раз об отказе первого полета Ariane 5, это не аргумент в пользу C во встроенном космическом пространстве. C++ имеет более сильную проверку типов, которая помогла бы в этом случае. - person Tarick Welling; 12.06.2019
comment
АФАИК, это неправда. Потому что Ariane 5 был закодирован на каком-то диалекте Ады, которая в то время имела лучшую систему типов, чем сегодняшняя C++17. - person Basile Starynkevitch; 12.06.2019
comment
Арианна много обсуждалась. Они использовали довольно стандартную Аду, но отключили некоторые ненужные проверки границ, чтобы сэкономить циклы ЦП. Это отлично сработало. Затем они перенесли тот же код на более позднюю Arianne 5, у которой были другие спецификации, и никогда не переадресовывали, нужно ли снова включать эти проверки или переадресовывать границы. Это была человеческая ошибка, и, скорее всего, это произошло бы и в C++ (поскольку по умолчанию в нем нет проверок границ для начала), но это не имеет ничего общего с шаблонами или сложностью языка. - person T.E.D.; 12.06.2019
comment
Ариана была ошибкой менеджмента. Я дал несколько рекомендаций относительно управления - person Basile Starynkevitch; 12.06.2019
comment
При определенных разумных значениях безошибочности не очень сложно создать безошибочный компилятор C++, но доказуемо невозможно сделать безошибочный компилятор C++. Полнота по Тьюрингу системы метапрограммирования шаблонов означает, что для того, чтобы принять все правильно сформированные программы на C++ и отклонить все неправильно сформированные, вам необходимо решить проблему остановки. - person Mark; 12.06.2019
comment
По-прежнему очень сложно создать эффективный, оптимизирующий компилятор C++. - person Basile Starynkevitch; 12.06.2019
comment
К сожалению, ваш ответ действительно отвечает, почему бы не использовать STL, а не использовать шаблоны, предоставленные разработчиком. - person Joshua; 12.06.2019
comment
Комментарии не для расширенного обсуждения; этот разговор был перенесено в чат. - person Samuel Liew♦; 13.06.2019
comment
Я нахожу эти аргументы о сложности языка C++ неубедительными. Если бы язык выбора был C, они были бы действительными. Но я где-то читал, что Ada является их предпочтительным языком, и это также сложный язык, я думаю, сравнимый с C++ (хотя я признаю, что никогда не использовал его, я только читал спецификации еще в 80-х, когда он разрабатывался ). - person Barmar; 13.06.2019
comment
Я нахожу подозрительным, что ваш пример шаблона C++ был std::map<std::string,long>, а затем вы возражаете против него по причинам динамического распределения, а не потому, что это шаблон. Я предполагаю, что вы хотели подробно рассказать о динамическом распределении, так как OP также упомянул об этом, после того, как рассмотрел шаблоны для раздувания кода и как часть общей сложности, которая может усложнить проверку. Можно безопасно использовать шаблоны, если вы думаете о том, что делаете, но, конечно, легко получить раздутый код. - person Peter Cordes; 13.06.2019
comment
@Barmar Если это убедит комитет по стандартам C++, это должно убедить и вас. В C существует довольно ограниченное количество областей неопределенного поведения, и они явно не определены в стандарте. (Носовые демоны и т. д.) В C++ комитет по стандартам буквально перестал считать, потому что их было слишком много, чтобы отслеживать. - person Graham; 13.06.2019
comment
Неопределенное поведение не является мерой сложности, ИМХО. - person Barmar; 13.06.2019
comment
Re: Rust в критически важных для безопасности системах: ferrous-systems.com/blog/ запечатанная ржавчина - person Sebastian Redl; 13.06.2019
comment
1. Такие термины, как «ужасно сложный язык, плохо смотрятся в технической дискуссии/аргументе. 2. Я не понимаю, как это важно, что компилятор не проверен/не сертифицирован. Вам нужно протестировать вашу реальную программу в любом случае, даже если ваш компилятор формально проверен. И хороший набор тестов не заботится о том, исходит ли ошибка от компилятора или от программиста. - person Violet Giraffe; 13.06.2019
comment
@VioletGiralle: это ваше мнение, но Airbus избегает нескольких (не всех) юнит-тестов с помощью формальных методов, и это возможно в DO178C. Я знаю, что Боинги делают по-другому. IIRC, это основное различие между европейским и североамериканским подходом к безопасности программного обеспечения в авионике. Даже если бы я мог знать больше, я не чувствую себя вправе говорить об этом. Тем не менее, я слышал выступления квалифицированных сотрудников Airbus и DGAC, объясняющих все это в больших Детали. - person Basile Starynkevitch; 13.06.2019
comment
@VioletGiralle: Если вы знаете какую-либо формальную семантику, например. денотационная семантика или аксиоматическая семантика или операционная семантика очень большое подмножество C++17 (включая модель памяти и аспекты многопоточности), пожалуйста, поделитесь им с нами. Поскольку я ничего не знаю, я стою на своей позиции: C++17 — ужасно сложный язык. - person Basile Starynkevitch; 13.06.2019
comment
@VioletGiraffe: даже формальное доказательство некоторой конкретной реализации C++ стандартных контейнеров меня интересует. Насколько я знаю, такие доказательства действительно неполны, но мне любопытно, знаете ли вы их лучше, чем я. Пожалуйста, поделитесь ссылкой с нами - person Basile Starynkevitch; 13.06.2019
comment
Как все это связано с шаблонами? - person Reuven Abliyev; 16.06.2019
comment
@Reuven: Это тоже то, что я хотел бы знать. Большая часть этого поста и многие комментарии говорят о вещах, совершенно не связанных с шаблонами. - person MikeMB; 18.06.2019
comment
Я обратился к этому, добавив два абзаца - person Basile Starynkevitch; 18.06.2019
comment
@ReuvenAbliyev: ИМО, эти смещенные комментарии связаны с тем, что ОП - довольно пустая тема. Есть ли связь между использованием шаблонов и устойчивостью к радиации? Или между Camel Casing и огнестойкостью? :-) - person Yves Daoust; 19.06.2019

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

template<class T>  fun(T t){
   do_some_thing(t);
}

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

Вторая проблема вот в чем:

fun(b);

Эта линия не является автономной линией. Вам нужно найти тип b, чтобы узнать, какая функция на самом деле вызывается. Здесь помогает правильный инструментарий, понимающий шаблоны. Но в данном случае это действительно затрудняет проверку кода вручную.

person user6556709    schedule 12.06.2019
comment
Согласен, но мой ответ подсказал это до вашего ответа. А ручное тестирование встроенного программного обеспечения на C++ действительно слишком дорого. Вы не можете позволить себе много испытательных полетов Ariane 5, таких как 501. - person Basile Starynkevitch; 12.06.2019
comment
Аргумент против использования шаблонов в коде безопасности состоит в том, что считается, что они увеличивают сложность вашего кода без реальной пользы. Нет, это аргумент против использования шаблонов во встраиваемых системах в целом. Аргумент против использования шаблонов в безопасном коде состоит в том, что в 100% детерминированном коде шаблоны бесполезны. В таких системах нигде нет универсального программирования. Вы не можете использовать такие вещи, как std::vector, потому что вы вряд ли найдете стандартную библиотеку, соответствующую стандартам безопасности. Или, если вы это сделаете, это будет стоить много денег. - person Lundin; 12.06.2019
comment
@Lundin Общее программирование во встроенном мире - это вещь. Вплоть до глубоко встроенных вещей. По той же причине, по которой это стало актуально и на других уровнях: хорошо протестированные алгоритмы — это хорошо. - person user6556709; 12.06.2019
comment
@user6556709 user6556709 Да, вы используете драйверы + HAL, но вы не используете универсальное программирование типов. - person Lundin; 12.06.2019
comment
@uset6556709 uset6556709 Но если вы измените тип данных или измените диапазоны внутри типа данных, алгоритм очень легко может работать неправильно. Ариана-501 была потеряна именно по этой причине. Поэтому, если вы измените что-нибудь, у вас больше не будет хорошо проверенного алгоритма. - person Graham; 13.06.2019
comment
@Graham Алгоритм все еще хорошо протестирован, в отличие от того, что вы пишете с нуля. Вы всегда должны проверять, можете ли вы его использовать, но это совсем другая история. - person user6556709; 13.06.2019
comment
@Lundin: Шаблоны не имеют ничего общего с детерминированным или недетерминированным кодом. В конце концов, это просто способ повторного использования кода без динамической диспетчеризации (виртуальные функции или указатели на функции) и без копирования и вставки кода, при этом они немного безопаснее, чем макросы. Например. повторное использование одного и того же алгоритма сортировки для сортировки массива целых чисел и массива коротких чисел. И тот факт, что std::vector не подходит для критически важного для безопасности кода реального времени, не имеет ничего общего с тем, что он является шаблоном. - person MikeMB; 18.06.2019
comment
@MikeMB Объясните это программистам C ++, которые также должны позволить одной и той же функции обрабатывать сортировку Foo и Bar, несмотря на то, что такие типы не имеют отношения к самому приложению. - person Lundin; 18.06.2019
comment
Кто делает? Это может иметь место для автора библиотеки алгоритмов общего назначения, но когда мы говорим о критичном для безопасности коде реального времени, мы все равно оставили домен общего назначения, а также ОП явно говорил о специально созданных пользовательских шаблонах. - person MikeMB; 18.06.2019
comment
Это означает, что вы должны дать полное описание функциональности шаблона в его общей форме. Разве недостаточно явно создать экземпляр каждого типа шаблона, который будет использоваться, а затем предоставить полное описание функциональности каждого типа таким образом? созданный? - person odougs; 11.09.2020

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

  • шаблоны «компилируются», т. е. создаются и генерируются кодом, как и любая другая функция/член, и для них нет поведения, характерного для них. Как будто их никогда не существовало;

  • ни одна конструкция ни в одном языке не является ни безопасной, ни уязвимой; если ионизирующая частица изменяет один бит памяти, будь то в коде или в данных, возможно все (от отсутствия заметной проблемы до сбоя процессора). Способ защиты системы от этого — добавление возможностей аппаратного обнаружения/исправления ошибок памяти. Не изменяя код!

person Yves Daoust    schedule 19.06.2019
comment
Таким образом, вы доверяете как самой сложной части внешнего интерфейса компилятора C++, так и коду, определяющему шаблоны. Как вы всесторонне протестируете их оба? Конечно, не связанный с каким-либо переключением космических лучей немного - person Basile Starynkevitch; 19.06.2019
comment
Кстати, это больше комментарий (довольно интересный), чем ответ - person Basile Starynkevitch; 19.06.2019
comment
@BasileStarynkevitch: нет, это четкий ответ, что шаблоны не имеют ничего общего с космическими лучами. А также циклы, небезопасные приведения, отсутствие документации и возраст программиста. - person Yves Daoust; 20.06.2019
comment
Могу не согласиться со вторым пунктом. Я помню, как читал некоторые академические статьи, в которых утверждалось, что они обнаруживают изменения битов в коде ядра. Я действительно забыл подробности, потому что эта тема меня не интересует. Кстати, Гийом Д. понимание связи между радиационно-стойкими встроенными системами и динамическим распределением слишком упрощенно (и мы оба согласны с этим, я надеюсь) - person Basile Starynkevitch; 20.06.2019
comment
@BasileStarynkevitch: в этом мало смысла. Когда жизненно важные части ядра повреждены, скажем, планировщик, ядро ​​больше не работает. - person Yves Daoust; 20.06.2019
comment
Эти документы дублируют наиболее важный код и время от времени проверяют его достоверность. Опять же, я забыл подробности, потому что они меня не очень интересуют. И, конечно же, у них есть вероятностный подход (например, предполагается не более 1 случайного переворота бита в секунду). - person Basile Starynkevitch; 20.06.2019
comment
Я проголосовал против, потому что вы игнорируете вероятностные подходы. Имеет смысл спроектировать систему, которая выходит из строя только 1 раз из миллиарда каждую минуту, при условии, что частота переключения битов составляет менее 1 случайного переворота бита в секунду. - person Basile Starynkevitch; 20.06.2019
comment
@BasileStarynkevitch: значение отрицательного голоса в том, что этот ответ бесполезен. - person Yves Daoust; 20.06.2019
comment
Но это даже не ответ, это длинный и содержательный комментарий к моему ответу. - person Basile Starynkevitch; 20.06.2019
comment
@BasileStarynkevitch: вовсе нет, это касается ОП. - person Yves Daoust; 20.06.2019
comment
Тогда вы забыли умные вероятностные подходы (и это достаточно веская причина, чтобы понизить голосование). И они существуют (даже если я их не понимаю, потому что они не в моей компетенции). Любая хорошая книга по рандомизированным алгоритмам разъяснит соответствующие концепции и подходы. - person Basile Starynkevitch; 20.06.2019
comment
@BasileStarynkevitch: извините, я не заметил, что ОП была сосредоточена на рандомизации. (Кстати, рандомизация — это алгоритмическая техника для достижения хорошей ожидаемой сложности и не имеет ничего общего с надежностью ядра.) - person Yves Daoust; 20.06.2019
comment
Как я предполагаю, есть некоторая косвенная связь. Но у меня не так много времени, чтобы болтать об этом. Прочитайте некоторые документы или конференции, связанные с SIGPLAN, а также TACO, TAAS, ... - person Basile Starynkevitch; 20.06.2019
comment
... и JETC, PACMPL, TCPS, TECS, TOCS - person Basile Starynkevitch; 20.06.2019
comment
Рандомизированные алгоритмы очень хорошо подходят для обработки сигнала (в смысле теории информации, а не в смысле Unix) с шумом, а надежность ядра, например, случайные перевороты битов из-за космических излучений - это пример сигнала с обработкой шума - person Basile Starynkevitch; 23.06.2019
comment
@BasileStarynkevitch: вы дезинформированы, рандомизированные алгоритмы не подходят для обработки шума. И обработка сигналов не имеет абсолютно никакого отношения к дизайну ядра. - person Yves Daoust; 24.06.2019
comment
@BasileStarynkevitch: кстати, ты забыл упомянуть квантовые вычисления, это так модно. - person Yves Daoust; 24.06.2019
comment
Но пока не используется во встроенных вычислениях. И я даже слышал разговор, в котором объяснялось, что квантовые вычисления не имеют практического применения (кроме моделирования квантовой химии) перед моей ожидаемой смертью. Дело в том, что практические квантовые компьютеры имеют очень мало кубитов. И да, обработка сигналов (на математическом уровне, а не в кодировании) имеет косвенное отношение к методам обеспечения надежности ядра ОС. - person Basile Starynkevitch; 24.06.2019
comment
@BasileStarynkevitch: да, но они требуют средств робастификации, потому что часть вычислений ошибочна. Я уверен, что вы найдете непрямой путь. - person Yves Daoust; 24.06.2019
comment
Меня совершенно не интересуют квантовые вычисления. Я оставляю это следующему поколению разработчиков программного обеспечения. В 60 лет я слишком стар для квантовых вычислений. Я никогда не видел квантовый компьютер (в реальной жизни) и даже не ожидаю увидеть - person Basile Starynkevitch; 24.06.2019
comment
@BasileStarynkevitch: мы обсуждаем не ваши личные интересы, а способ помочь ОП справиться с радиацией. - person Yves Daoust; 24.06.2019
comment
И я понимаю, что квантовые вычисления не подходят для этой цели в ближайшие 20 лет. Но актуальны статистические и вероятностные методы (включая рандомизированные алгоритмы). Как для статического анализа исходного кода программы, так и даже для радиационной защиты ядра (например, умным дублированием его кода планировщика). Конечно, все это косвенно, как вы упоминаете - person Basile Starynkevitch; 24.06.2019
comment
@BasileStarynkevitch: я сказал косвенно, разве ты не помнишь? - person Yves Daoust; 24.06.2019