Безопасный c ++ в критически важных приложениях реального времени - PullRequest
7 голосов
/ 12 августа 2010

Я бы хотел услышать различные мнения о том, как безопасно использовать c ++ в критически важных приложениях реального времени.

Точнее, возможно, возможно создать некоторую библиотеку макросов / шаблонов / классов для безопасного манипулирования данными (запечатывание для переполнений, zerodivides создает значения бесконечности или деление возможно только для специальных «ненулевых» типов данных), массивы с проверкой границ и циклы foreach, безопасные интеллектуальные указатели (например, похожий на boost shared_ptr) и даже безопасная многопоточность / распределенная модель (передача сообщений и упрощенные процессы, подобные тем, которые определены в языке Erlang).

Затем мы запрещаем некоторые опасные конструкции c / c ++, такие как необработанные указатели, некоторые необработанные типы, собственные операторы «new» и собственные массивы c / c ++ (конечно, для программиста приложения, а не для автора библиотеки). В идеале, мы должны создать специальный препроцессор / средство проверки, по крайней мере, у нас должна быть некоторая формальная процедура проверки, которая может быть применена к источникам, использующим какой-либо инструмент или руководство каким-либо человеком.

Итак, мои вопросы:

1) Существуют ли какие-либо библиотеки / проекты, в которых используется такая идея? (Встроенный с ++ явно не желаемого вида)?

2) Это хорошая идея или нет? Или это может быть полезно только для прототипирования какого-то другого гипотетического языка? Или это совершенно непригодно?

3) Любые другие мысли (или ссылки) по этому вопросу также приветствуются

Извините, если этот вопрос на самом деле не является вопросом, оффтопом, дубликатом и т. Д., но я не нашел более подходящего места, чтобы спросить его

Ответы [ 3 ]

9 голосов
/ 12 августа 2010

Хорошие правила написания C ++ для критически важных приложений реального времени смотрите в стандартах Joint Strike Fighter . Многие из этих правил основаны на стандартах кодирования MISRA C , которые, я считаю, являются собственностью. PC-Lint - это средство проверки кода C ++ с наборами правил, такими как вы хотите (включая правила MISRA). Я считаю, что вы также можете настроить свои собственные правила.

2 голосов
/ 12 августа 2010

Если вы пишете критически важные высокопроизводительные S / W в реальном времени на C ++, вам, вероятно, потребуется каждая микросекунда, которую вы можете получить от аппаратного обеспечения.Поэтому я не обязательно предлагал бы реализовывать все дополнительные проверки, такие как упомянутые вами, по крайней мере те, которые имеют накладные последствия для выполнения программы.Очевидно, что вы можете замаскировать исключения с плавающей запятой, чтобы предотвратить сбой программы при делении на ноль.

Некоторые наблюдения:

  • Просмотр всех программ (возможно, несколькими рецензентами)Это значительно улучшит качество, не требуя большого количества проверок во время выполнения.
  • ДОЛЖНЫ использовать диагностические инструменты и утверждения только для выпуска.
  • Используйте системы моделирования для тестирования не встроенного оборудования.
  • C ++ был специально разработан без таких вещей, как проверка границ по соображениям производительности.

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

Кто-то еще отметил, чтоесли вы хотите Аду, просто используйте Аду.

2 голосов
/ 12 августа 2010

Мы используем C ++ в критически важных приложениях реального времени, хотя я полагаю, у нас это легко (теоретически), потому что мы должны предоставлять гарантии в реальном времени только в той мере, в которой это оборудование используется нашими клиентами. Таким образом, достаточное профилирование позволяет нам обходиться без mlockall () или предварительной загрузки стека или каких-либо других традиций RT. Что касается самого языка, я думаю, что повседневные современные практики кодирования C ++ (те, которые не поощряют концепции C) вполне достаточны для написания надежных приложений, которые могут использоваться в контекстах RT, учитывая аппаратное обеспечение 21-го века.

В центре внимания должны быть модульные тесты и контроль качества, а не внутренние библиотеки, которые дублируют существующие языковые функции.

...