Я изучаю разработку критически важного для безопасности программного обеспечения, и в частности, что влияет на выбор языка программирования для такого развития.
Пожалуйста, объясните, какие языки обычно используются, и почему.
Я изучаю разработку критически важного для безопасности программного обеспечения, и в частности, что влияет на выбор языка программирования для такого развития.
Пожалуйста, объясните, какие языки обычно используются, и почему.
Ada и SPARK (который это диалект Ады с некоторыми крючками для статической проверки) используются в аэрокосмических кругах для создания высоконадежного программного обеспечения, такого как системы авионики. Существует что-то вроде экосистемы инструментов проверки кода для этих языков, хотя эта технология существует и для больше основных языков.
Erlang был разработан с нуля для написания высоконадежного телекоммуникационного кода. Он предназначен для облегчения разделения проблем для восстановления ошибок (т.е. Подсистема, генерирующая ошибку, отличается от подсистемы, которая обрабатывает ошибку). Он также может быть подвергнут формальным доказательствам, хотя эта способность действительно не вышла далеко за пределы исследовательских кругов.
Функциональные языки, такие как Haskell могут быть подвергается формальным доказательствам автоматическими системами из-за декларативного характера. Это позволяет использовать код с побочными эффектами в монадических функциях. Для доказательства формальной корректности остальная часть кода может быть принята только для того, что указано.
Однако эти языки собираются с мусором, и сбор мусора прозрачен для кода, поэтому его невозможно объяснить таким образом. Собранные с мусором языки обычно не предсказуемы для жестких приложений реального времени, хотя существует множество текущих исследований в ограниченных по времени инкрементальных сборщиках мусора.
Eiffel, и его потомки имеют встроенную поддержку метода под названием Дизайн по контракту ", который обеспечивает надежный механизм выполнения для включения предварительных и пост-проверок для инвариантов. Пока Эйфель никогда не был пойман разработка программного обеспечения с высокой степенью надежности, как правило, состоит из написания проверок и обработчиков для режимов сбоев, прежде чем на самом деле писать функциональность.
Хотя C и С++ не были конкретно предназначенные для этого типа приложений, они широко используются для встроенного и критически важного программного обеспечения по нескольким причинам. Основными признаками являются управление управлением памятью (что позволяет избежать сбора мусора, например), простые, хорошо отлаженные библиотеки времени выполнения и зрелую поддержку инструмента. Многие внедренные в настоящее время инструменты инструментальных средств разработки были впервые разработаны в 1980-х и 1990-х годах, когда это была современная технология и происходила из культуры Unix, которая была распространена в то время, поэтому эти инструменты остаются популярными для такого рода работ.
В то время как код ручного управления памятью должен быть тщательно проверен, чтобы избежать ошибок, он позволяет контролировать время отклика приложения, которое не доступно на языках, которые зависят от . основные библиотеки времени выполнения на языках C и С++ относительно просты, зрелы и понятны, поэтому они относятся к Доступны самые стабильные платформы. Большинство, если не все инструменты статического анализа, используемые для Ada, также поддерживают C и С++, и существует много других таких инструментов, доступных для C. Есть также несколько широко используется C/С++ ; большинство цепей инструментов, используемых для Ada, также входят в версии, поддерживающие C и/или С++.
Формальные методы, такие как Аксиоматическая семантика (PDF), Обозначение Z или Коммуникация последовательных процессовпозволяют математически проверять программную логику и часто используются при разработке критически важного для безопасности программного обеспечения, где приложение достаточно простое для их применения (обычно встроенные системы управления). Например, один из моих бывших преподавателей сделал официальное подтверждение корректности системы сигнализации для немецкой железнодорожной сети.
Основным недостатком формальных методов является их тенденция к экспоненциальному росту по сложности в отношении доказанной базовой системы. Это означает, что существует значительный риск ошибок в доказательстве, поэтому они практически ограничены довольно простыми приложениями. Формальные методы довольно широко используются для проверки правильности аппаратного обеспечения, поскольку аппаратные ошибки очень дороги для исправления, особенно для продуктов массового рынка. Поскольку ошибка Pentium FDIV, формальные методы получили довольно много внимания и были используется для проверки правильности FPU на всех процессорах Intel с Pentium Pro.
Для разработки высоконадежного программного обеспечения использовались многие другие языки. Было проведено много исследований по этому вопросу. Можно обоснованно утверждать, что методология важнее, чем платформу, хотя существуют такие принципы, как простота и выбор и контроль зависимостей, которые могут исключать использование определенных платформ.
Как отмечают другие, некоторые платформы O/S имеют функции для повышения надежности и предсказуемого поведения, такие как таймеры сторожевого таймера и гарантированное время отклика прерываний. Простота также является надежным драйвером надежности, и многие системы RT намеренно сохраняются очень просто и компактно. QNX (единственный такой O/S, с которым я знаком, когда-то работал с бетонная система дозирования, основанная на ней) очень мала и будет вписываться в одну дискету. По аналогичным причинам люди, которые делают OpenBSD, который известен своей надежной безопасностью и тщательным аудитом кода, также уходят с пути система проста.
EDIT: В этой публикации есть ссылки на хорошие статьи о критическом для безопасности программном обеспечении, в частности Здесь и Здесь. Поддержки для С.Лотта и Адама Дэвиса для источника. История THERAC-25 - это немного классическая работа в этой области.
Для С++ стандартное кодирование С++ (F-35) стандарта С++ хорошо читается:
Я полагаю, что Ada по-прежнему используется в некоторых правительственных проектах, которые являются безопасными и/или критическими. Я никогда не использовал этот язык, но это в моем списке "учиться" вместе с Эйфелем. Eiffel предлагает Design By Contract, который призван повысить надежность и безопасность.
Во-первых, программное обеспечение, критичное к безопасности, придерживается тех же принципов, что и в классических областях механики и электротехники. Резервирование, отказоустойчивость и отказоустойчивость.
Как и в сторону, и поскольку предыдущий плакат, на который ссылался (и почему-то был пропущен), единственным наиболее важным фактором в достижении этого является то, что ваша команда должна иметь твердое представление о всем, что есть продолжается. Само собой разумеется, что хороший дизайн программного обеспечения с вашей стороны является ключевым. Но это также подразумевает доступный, зрелый, хорошо поддерживаемый язык, для которого имеется много общих знаний и опытных разработчиков.
Многие плакаты уже прокомментировали, что ОС является ключевым элементом в этом отношении, что очень верно, потому что оно должно быть детерминированным (см. QNX или VxWorks). Это исключает большинство интерпретируемых языков, которые делают вещи за кулисами для вас.
ADA - это возможность, но есть меньше инструментов и поддержки там, и, что более важно, звездные люди не так легко доступны.
С++ - это возможность, но только если вы строго соблюдаете подмножество. В этом отношении это инструмент дьявола, обещая сделать нашу жизнь проще, но часто делая слишком много,
C идеально. Он очень зрелый, быстрый, имеет разнообразный набор инструментов и поддержки, многие опытные разработчики, кросс-платформенные и чрезвычайно гибкие, могут работать рядом с оборудованием.
Я разработал все, начиная от smalltalk и заканчивая ruby, и ценю и наслаждаюсь всем, что могут предложить более высокие языки. Но когда я занимаюсь разработкой критических систем, я укушу пулю и придерживаюсь C. В моем опыте (защита и многие медицинские устройства класса II и III) меньше.
Я бы забрал haskell, если бы это было безопасно во всем остальном. Я предлагаю haskell, потому что он имеет очень жесткую статическую проверку типов, и это способствует программированию, где вы создаете детали таким образом, чтобы их было очень легко проверить.
Но тогда мне было бы неинтересно говорить о языке. Вы можете получить гораздо большую безопасность, не ставя под угрозу столько, сколько ваш проект в состоянии и работать без крайних сроков. В целом, как и при наличии всего основного управления проектами. Я, возможно, сосредоточусь на тщательном тестировании, чтобы все работало так, как должно, тесты, которые охватывают все угловые случаи и многое другое.
Язык и ОС очень важны, но также и дизайн. Постарайтесь, чтобы он был голым, опустив голову.
Я бы начал с того, что имел минимальную информацию о состоянии (данные времени выполнения), чтобы свести к минимуму вероятность его непоследовательности. Затем, если вы хотите иметь избыточность с целью отказоустойчивости, убедитесь, что у вас есть надежные способы восстановления из-за непоследовательности данных. Резервирование без возможности восстановления от непоследовательности - это просто просить о неприятностях.
Всегда иметь резервную копию, если запрошенные действия не выполняются в разумные сроки. Как говорится в управлении воздушным движением, непризнанный зазор не является зазором.
Не бойтесь методов опроса. Они просты и надежны, даже если они могут потратить несколько циклов. Откажитесь от обработки, которая зависит исключительно от событий или уведомлений, потому что их можно легко отбросить или продублировать или неправильно настроить. Как дополнение к опросу, они в порядке.
Один из моих друзей в проекте APOLLO однажды заметил, что он знал, что они становятся серьезными, когда они решили полагаться на опрос, а не на события, хотя компьютер был ужасно медленным.
P.S. Я просто прочитал стандарты C + + Air Vehicle. Они в порядке, но они, похоже, предполагают, что будет много классов, данных, указателей и динамического распределения памяти. Это именно то, что должно быть не более, чем абсолютно необходимо. Должна быть структура данных czar с большой косой.
ОС более важна, чем язык. Используйте ядро реального времени, такое как VxWorks или QNX. Мы смотрели как на управление промышленными роботами, так и на решение VxWorks. Мы используем C для реального управления роботом.
Для действительно критического программного обеспечения, такого как системы автозапуска самолетов, вы хотите, чтобы несколько процессоров работали независимо друг от друга, чтобы перекрестно проверить результаты.
В средах реального времени обычно есть "критически важные для безопасности" требования. Для такого рода вещей вы можете посмотреть VxWorks, популярную операционную систему реального времени. В настоящее время он используется на многих различных аренах, таких как самолеты Boeing, внутренние части BMW iDrive, RAID-контроллеры и различные космические корабли. (Проверьте это.)
Разработка для платформы VxWorks может быть выполнена с помощью нескольких инструментов, среди которых Eclipse, Workbench, SCORE и другие. C, С++, Ada и Fortran (да, Fortran), а также некоторые другие.
Поскольку вы не даете платформу, я должен сказать C/С++. На большинстве платформ реального времени вы все равно ограничены в настройках.
Недостатки тенденции C, позволяющие вам стрелять в ногу, компенсируются количеством инструментов для проверки кода и стабильности и прямого сопоставления кода с аппаратными возможностями платформы. Кроме того, для чего-либо критического вам не удастся опираться на стороннее программное обеспечение, которое не подвергалось всестороннему анализу - это включает большинство библиотек - даже многие из тех, которые предоставляются поставщиками оборудования.
Поскольку все будет вашей ответственностью, вы хотите стабильный компилятор, предсказуемое поведение и близкое сопоставление с оборудованием.
Вот несколько обновлений для некоторых инструментов, которые я еще не видел, еще обсуждали, что я играл с ними в последнее время, которые довольно хороши.
Инфраструктура компилятора LLVM, короткая публикация на главной странице (включает в себя интерфейсы для C и С++. Front-end для Java, Схема и другие языки находятся в разработке);
Инфраструктура компилятора - LLVM также представляет собой набор исходных кодов, который реализует язык и сбор стратегия. Главная компоненты инфраструктуры LLVM являются интерфейсом C и С++ на основе GCC, схема оптимизации времени соединения с растущий набор глобальных и межпроцедурный анализ и преобразования, статические обратные X86, X86-64, PowerPC 32/64, ARM, Thumb, IA-64, Alpha, SPARC, MIPS и Архитектуры CellSPU, back-end который испускает переносимый код C, и Компилятор Just-In-Time для X86, X86-64, Процессоры PowerPC 32/64 и эмиттер для MSIL.
VCC;
VCC - это инструмент, который доказывает правильность аннотированных параллельных программ на С или находит в них проблемы. VCC расширяет C с дизайном по функциям контракта, например до и послесловие, а также тип инварианты. Аннотированные программы: переводится в логические формулы, используя инструмент Буги, который передает их автоматический SMT-решатель Z3 для проверки их действительность.
VCC использует недавно выпущенную Common Compiler Infrastructure.
Оба этих инструментария, LLVM или VCC предназначены для поддержки нескольких языков и архитектур, я думаю, что их рост в кодировании по контракту и другим формальным методам проверки.
WPF (а не MS framework:), это хорошее место для начала, если вы пытаетесь оценить некоторые из недавних исследований и инструментов в пространстве проверки программы.
WG23 является основным ресурсом, однако для довольно актуальных и конкретных критических системных деталей языка. Они охватывают все, начиная от Ada, C, С++, Java, С#, Scripting и т.д.... и, по крайней мере, представляют собой достойный набор ссылок и руководств для обновления информации о специфических недостатках и уязвимостях языка.
Язык, который накладывает тщательные шаблоны, может помочь, но вы можете навязывать осторожные шаблоны с использованием любого языка, даже ассемблера. Каждое предположение о каждом значении требует кода, который проверяет предположение. Например, всегда делиться делителем для нуля перед делением.
Чем больше вы можете доверять компонентам многократного использования, тем легче задача, но многоразовые компоненты редко сертифицируются для критического использования и не будут получать вас через процессы нормативной безопасности. Вы должны использовать крошечное ядро ОС, а затем создавать крошечные модули, которые будут протестированы модулем со случайным вводом. Такой язык, как Эйфель, может помочь, но нет серебряной пули.
Есть много хороших ссылок на http://www.dwheeler.com ( "программное обеспечение с высокой степенью уверенности" ).
Для автомобильной промышленности см. стандарт MISRA C. C, но вы не можете использовать более двух уровней указателей и некоторых других подобных вещей.
У adahome.com есть хорошая информация о Ada. Мне понравился этот С++ для учебника Ada: http://adahome.com/Ammo/cpp2ada.html
Для жесткого реального времени Том Хокинс сделал несколько интересных вещей в Haskell. См.: ImProve (язык включает в себя решение SMT для проверки условий проверки) и Atom (EDSL для жесткого параллельного программирования в реальном времени без использования реальных потоков или задач).
Любой программный продукт может пройти процесс сертификации DO-178b с помощью любого инструмента, но вопросы в том, насколько это сложно. Если компилятор не сертифицирован, вам может потребоваться продемонстрировать, что ваш код отслеживается на уровне сборки. Поэтому полезно, чтобы ваш компилятор был сертифицирован. Мы использовали C в наших проектах, но нам приходилось проверять на уровне сборки и использовать стандарт кода, который включал отключение оптимизатора, ограниченное использование стека, ограниченное использование прерываний, прозрачные сертифицируемые библиотеки и т.д. ADA не является пылью в пикселях, но делает План PSAC выглядит более достижимым.
По мере того как аппликаты становятся больше, код сборки становится менее жизнеспособным выбором. Процессор ARM просто приглашает С++, но если вы спросите таких компаний, как Kiel, их инструмент сертифицирован, они вернутся с "да?". И не забывайте, что инструменты проверки также должны быть сертифицированы. Попробуйте проверить тестовую программу LabView.
В настоящее время разрабатывается новый безопасный для безопасности стандарт для Java - JSR 302: критически важная технология Java.
Безопасная критическая Java (SCJ) основана на подмножестве RTSJ. Цель состоит в том, чтобы иметь структуру, подходящую для разработки и анализа критически важных для безопасности программ для критической сертификации безопасности (DO-178B, уровень A и другие критически важные для безопасности стандарты).
SCJ, например, удаляет кучу, которая все еще присутствует в RTSJ, она также определяет три уровня соответствия, которым могут соответствовать как приложения, так и виртуальная машина, уровни соответствия определены для упрощения сертификации различных сложных приложений.
Ресурсы
HAL/S используется для космического челнока.
Я не знаю, какой язык я бы использовал, но я знаю, на каком языке я бы не хотел:
ПРИМЕЧАНИЕ ПО ПОДДЕРЖКЕ JAVA. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ МОЖЕТ СОДЕРЖАТЬ ПОДДЕРЖКУ ПРОГРАММ, ЗАПИСАННЫХ В JAVA. ТЕХНОЛОГИЯ JAVA НЕ ОПАСНО, НЕ ПРОИЗВОДИТСЯ, НЕ ПРЕДНАЗНАЧЕНА ИЛИ ПРЕДНАЗНАЧЕНА ДЛЯ ИСПОЛЬЗОВАНИЯ ИЛИ ПЕРЕСЫЛКИ КАК ОБОРУДОВАНИЕ ДЛЯ КОНТРОЛЯ НА ОСНОВЕ ОПАСНЫХ СРЕДСТВ, ТРЕБУЮЩИХ НЕИСПРАВНОСТИ, НЕОБХОДИМЫЕ С ЭКСПЛУАТАЦИЕЙ, ТАКИМ КАК В ЭКСПЛУАТАЦИИ ЯДЕРНЫХ ОБЪЕКТОВ, СИСТЕМАМИ АВИАЦИОННОЙ НАВИГАЦИИ ИЛИ СВЯЗИ, ВОЗДУХА УПРАВЛЕНИЕ ДВИЖЕНИЕМ, ПРЯМОЕ ОБОРУДОВАНИЕ ДЛЯ ЖИЗНЕННОЙ ЖИЗНИ ИЛИ СИСТЕМЫ ОРУЖИЯ, В ОТНОШЕНИИ НЕИСПРАВНОСТИ ТЕХНОЛОГИИ JAVA МОЖЕТ ПРИВЕСТИ К СМЕРТИ, ЛИЧНОЙ ТРАВМЕ ИЛИ СЕРЬЕЗНОМУ ФИЗИЧЕСКОМУ ИЛИ УСЛОВИЯ ОКРУЖАЮЩЕЙ СРЕДЫ.
Java - это язык без границ для многих причин. Он был разработан идиотом, который неправильно понял проекты Паскаля и Оберона профессора Вирта.
ADA был языком, разработанным крупным комитетом, и получившееся растяжение напоминает мне так много PL/1, что было замечательно, но так сложно написать компилятор, что никто его не поднял.
Modula-2 - это, пожалуй, самый простой язык, который когда-либо разрабатывался, и вместо C я использовал модулу-2 с размером кода половину строк (и поэтому работает в два раза быстрее). C всего на один шаг выше ассемблера, и просто слишком тяжело дыша, вы можете создать неприятную ошибку.
Pascal и basic - очень надежные языки. На самом деле, компилятор/инструментарий Visual Basic 6, вероятно, является лучшей вещью MS, когда-либо созданной, и люди все еще используют ее через 15 лет после ее отказа от MS. Не заставляйте меня начинать с мерзости, которая является .NET, самой ужасно сложной дымящейся кучей дерьма, чтобы выйти из MS, которая хотела создать проприетарную систему, которую никто никогда не мог бы клонировать. Жаль, что никто не хочет клонировать его! они преуспевают слишком хорошо в создании чего-то неясного.
Eiffel искробезопасен, потому что он использует крошечные подпроцессы со своими собственными стеками и кучами, которые собираются при завершении подзадачи, поэтому вы не фрагментируете память. Но удача в понимании Эйфеля, это была работа сумасшедшего. То же самое касается Миранды и многих академических языков, которые были разработаны математическими уродами, а не людьми, которые привыкли к чему-то практическому.
Я бы сказал, что Python - один из лучших языков. Легко читается, быстро и просто. Это не особенно безопасно, но для скриптинга он бьет штаны с Bash скриптов оболочки, или не дай бог, жестокого языка с записью, называемого Perl.