Безопасный c++ в критически важных приложениях реального времени
Я хотел бы услышать различные мнения о том, как безопасно использовать c++ в критически важных приложениях реального времени.
Точнее, вероятно, можно создать некоторые макросы/шаблоны/библиотеки классов для безопасной обработки данных (герметизация для переполнений, zerodivids производят бесконечные значения или разделение возможно только для специальных "ненулевых" типов данных), массивы с привязкой проверки и циклами foreach, безопасные smartpointers (подобные boost shared_ptr, например) и даже безопасные многопоточность / распределенная модель (передача сообщений и облегченные процессы, подобные этим, определяются на языке Erlang).
Затем мы запрещаем некоторые опасные конструкции c / c++, такие как необработанные указатели, некоторые необработанные типы, собственный оператор "new" и собственные массивы c/c++ (для прикладного программиста, а не для писателя библиотеки, конечно). В идеале мы должны создать специальный препроцессор / чекер, по крайней мере, у нас должна быть какая-то формальная процедура проверки, которая может быть применена к источникам с помощью какого-либо инструмента или вручную каким-то человеком.
Итак, мои вопросы:
1) Существуют ли какие-либо существующие библиотеки/проекты, использующие такую идею? (Встроенный c++, по-видимому, не является желаемым видом)?
2) это вообще хорошая идея или нет? Или он может быть полезен только для прототипирования какого-то другого гипотетического языка? Или он совершенно непригоден?3) любые другие мысли (или ссылки) по этому вопросу также приветствуются
Извините, если этот вопрос на самом деле не является вопросом, оффтопическим, дублирующим, и т.д., но я не нашел более подходящего места, чтобы спросить об этом
3 ответа:
Для хороших правил о том, как писать C++ для критически важных приложений реального времени, посмотрите на стандарты кодированияJoint Strike Fighter . Многие из правил основаны на стандартах кодированияMISRA C , которые, как я считаю, являются собственностью. PC-Lint - это средство проверки кода C++ с наборами правил, подобными тому, что вы хотите (включая правила MISRA). Я верю, что вы также можете настроить свои собственные правила.
Мы используем C++ в критически важных приложениях реального времени, хотя я предполагаю, что у нас это легко (теоретически), потому что мы должны предоставлять только гарантии в реальном времени, такие же хорошие, как оборудование, которое используют наши клиенты. Таким образом, достаточное профилирование позволяет нам обходиться без mlockall() или предварительной загрузки стека или любых других традиций RT. Что касается самого языка, я думаю, что каждодневные современные методы кодирования C++ (те, которые препятствуют концепциям C) вполне достаточны для написания надежных приложений, которые могут быть использованы в RT контексты, учитывая оборудование 21-го века.
Модульные тесты и контроль качества должны быть главным фокусом усилий, а не внутренние библиотеки, которые дублируют существующие языковые функции.
Если вы пишете критические высокопроизводительные S/W в реальном времени на языке C++, вам, вероятно, понадобится каждая микросекунда, которую вы можете извлечь из аппаратного обеспечения. Как таковой, я бы не обязательно предложил реализовать все дополнительные проверки, такие как те, о которых вы упомянули, по крайней мере те, которые имеют накладные расходы на выполнение программы. Вы, очевидно, можете маскировать исключения с плавающей запятой, чтобы предотвратить деление на ноль от сбоя программы.
Некоторые наблюдения:
- рецензирование всего кода (возможно несколько рецензентов). Это позволит значительно улучшить качество, не требуя большого количества проверок во время выполнения.
- Используйте диагностические инструменты и не-релиз-только утверждает.
- Используйте имитационные системы для тестирования на не встроенном оборудовании.
- C++ был специально разработан без таких вещей, как проверка границ по причинам производительности.
В целом я не предлагаю произвольно ограничивать язык, хотя и использую RAII и смарт-указатели должен иметь минимальные накладные расходы и обеспечивает приятное преимущество.
Кто-то еще заметил, что если вы хотите Ada, просто используйте Ada.