Почему использование шаблона C ++ не рекомендуется в космической / излучаемой среде? - PullRequest
65 голосов
/ 12 июня 2019

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

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

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

Ответы [ 3 ]

106 голосов
/ 12 июня 2019

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

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

Эта рекомендация представляет собой обобщение для C ++ правил кодирования MISRA C и правил Embedded C ++ и DO178C рекомендации , и это связано не с излучением, а со встроенными системами. Из-за радиационных и вибрационных ограничений встроенное аппаратное обеспечение любого ракетно-космического компьютера должно быть очень небольшим (например, по экономичным и по причинам, связанным с энергопотреблением, оно больше - по мощности компьютера - система Raspberry Pi-like чем большая система сервера x86). Космические закаленные чипы стоят в 1000 раз дороже, чем их гражданские аналоги. А вычисление WCET на компьютерах со встроенным пространством все еще остается технической проблемой (например, из-за проблем, связанных с кэш-памятью ЦП ). Следовательно, выделение кучи не одобряется в критически важных для безопасности встроенных программно-интенсивных системах (как бы вы справились с условиями нехватки памяти в этих? Или как бы вы доказали что у вас достаточно ОЗУ для всех случаев реального времени выполнения?)

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

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

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

Посмотрите также на Frama-Clang и CompCert и наблюдайтеследующее:

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

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

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

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

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

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

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

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


Моя личная рекомендация (но, пожалуйста, не принимайте ееслишком серьезно. В 2019 году это больше каламбур, чем что-либо еще) было бы рассмотреть кодирование вашего встроенного программного обеспечения в Rust .Потому что это немного безопаснее, чем C ++.Конечно, вам придется потратить от 5 до 10 млн. Евро (или MUS $) через 5 или 7 лет, чтобы получить прекрасный компилятор Rust, подходящий для космических компьютеров (опять же, пожалуйста, свяжитесь со мной профессионально, если вы способны потратить этомного на свободном программном обеспечении Compcert / Rust как компилятор).Но это всего лишь вопрос разработки программного обеспечения и управления программными проектами (подробнее см. Мифический человеко-месяц и Чушь заданий Также следует помнить о принципе Дильберта : он применим как к индустрии космического программного обеспечения, так и к индустрии встроенных компиляторов, как и ко всему прочему.следует финансировать (например, через Horizon Europe ) бесплатное программное обеспечение CompCert ++ (или даже лучше, Compcert / Rust), подобный проекту (и такой проект потребует более 5 лет и более5 топ-класса, PhD исследователи).Но в возрасте 60 лет, к сожалению, я знаю, что этого не произойдет (потому что идеология ЕС - главным образом вдохновленная политикой Германии по очевидным причинам - все еще является иллюзией Конца истории , поэтому H2020 и Horizon Europe на практике представляют собой в основном способ реализации налоговых оптимизаций для корпораций в Европе через европейские налоговые убежища ), и это после нескольких частных обсуждений с несколькими участниками проекта CompCert.К сожалению, я ожидаю, что DARPA или NASA * ​​1230 * с гораздо большей вероятностью будут финансировать какой-либо будущий проект CompCert / Rust (чем финансирует его ЕС).


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

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

8 голосов
/ 12 июня 2019

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

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

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

Вторая проблема заключается в том, что:

fun(b);

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

0 голосов
/ 19 июня 2019

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

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

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

...