Функции управления памятью должны гарантировать следующее: (a) детерминированное поведение, заканчивающееся с существованием времени выполнения худшего случая, (b) предотвращение фрагментации памяти, (c) постарайтесь не заканчиваться память, (d) предотвращение несовпадающих выделений или освобождения, (e) никакая зависимость от недетерминированных вызовов ядра
Функции управления памятью должны гарантировать следующее: (a) детерминированное поведение, заканчивающееся с существованием времени выполнения худшего случая, (b) предотвращение фрагментации памяти, (c) постарайтесь не заканчиваться память, (d) предотвращение несовпадающих выделений или освобождения, (e) никакая зависимость от недетерминированных вызовов ядра.
Когда вы реализуете пользовательские функции управления памятью, убедитесь, что ваша реализация исправляет эти ошибки управления общей памятью, которые могут влиять на устойчивость и правильность вашего приложения:
Недетерминированное время выполнения худшего случая (WCET) операций выделения и освобождения.
Чтобы обеспечить детерминированный WCET, убедитесь, что функция может быть выполнена без контекстного переключения или системных вызовов. Предсказуемый WCET важен в определении соответствующей схемы планирования, которая соответствует ограничениям синхронизации в критических по отношению к безопасности встраиваемых системах.
Несовпадающие функции выделения и освобождения.
Освобождение памяти с функцией, которая не совпадает с функцией выделения, может вызвать повреждение памяти или неопределенное поведение.
Недопустимый доступ к памяти.
При попытке получить доступ к памяти, которая является логически или физически недопустима, результаты операции в неопределенном поведении или отказе сегментации.
Ошибки из памяти.
Чтобы постараться не исчерпывать память, ваш исполняемый файл должен выделить всю память, необходимую программе при запуске.
Фрагментация памяти.
Фрагментация происходит, когда память выделяется по блокам, состоящим из нескольких несмежных участков. Если освобожденные блоки не являются достаточно большими, чтобы вместить будущие запросы выделения, остающаяся свободная память не может быть применимой, и ваша система может отказать.
В дополнение к пользовательским реализациям для операторов new
и delete
, необходимо обеспечить пользовательские реализации для низкоуровневых функций выделения и освобождения (malloc/free
). Даже если вы не используете эти низкоуровневые функции в своем исходном коде, они могут произойти в соединенных библиотеках в вашем проекте.
Пользовательская реализация std::new_handler
должен выполнить одну из этих операций:
Сделайте больше память доступной для выделений и возвратитесь.
Отключите программу, не возвращаясь к вызываемому.
Выдайте исключение типа std::bad_alloc
или выведенный из std::bad_alloc
.
Polyspace® проверки на эти проблемы управления памятью, которые могут привести к недетерминированному поведению:
Использование библиотечной функции C (malloc/calloc/realloc/free
) выделить или освободить память в инициализациях локальной переменной.
Polyspace не отмечает использование этих функций при выделении или освобождении глобальных переменных.
Использование неразмещения new
и delete
операторы.
Использование функционального dlsym()
. Эта функциональная сила вызывает низкоуровневые функции выделения или освобождения, такие как malloc
или calloc
.
Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.
Группа: вспомогательная библиотека Языка |
Категория: Необходимый, Частично автоматизированный |
Check AUTOSAR C++ 14 (-autosar-cpp14)
| Invalid deletion of pointer
| Mismatched alloc/dealloc functions on Windows
| Invalid free of pointer