Доступ к объекту не допускается вне срока его службы
Доступ к объекту не допускается вне срока его службы.
Время жизни объекта начинается, когда он создается его конструктором. Время жизни заканчивается, когда объект удаляется. Доступ к переменной до ее конструкции или после разрушения может привести к неопределенному поведению. В зависимости от контекста многие операции могут непреднамеренно получить доступ к объекту вне его жизненного цикла. Примеры таких операций включают:
Неинициализированный указатель: Вы можете непреднамеренно получить доступ к указателю перед назначением ему адреса. Эта операция обращается к объекту до его срока службы и приводит к доступу к непредсказуемому местоположению памяти. Лучшая практика состоит в том, чтобы инициировать указатель при помощи nullptr во время его объявления.
Неинициализированная переменная: Вы можете непреднамеренно считать переменную, прежде чем она будет инициализирована. Эта операция обращается к объекту до его срока службы и приводит к считыванию значения мусора, которое непредсказуемо и бесполезно. Лучшая практика состоит в том, чтобы инициировать переменную во время ее объявления.
Использование ранее отключенного указателя: Вы можете получить доступ к динамически выделенной памяти указателя после отмены выделения памяти. Попытка получить доступ к этому блоку памяти обращается к объекту после его жизни и приводит к непредсказуемому поведению или даже отказу сегментации. Чтобы решить эту проблему, установите освобожденный указатель на nullptr, а затем проверить, является ли указатель nullptr прежде чем обращаться к нему. Кроме того, используйте std::unique_ptr вместо необработанного указателя. Потому что вам не нужно освобождать выделенную память для std::unique_ptr явным образом можно избежать непреднамеренного доступа к освобожденной памяти.
Указатель или ссылка на переменную стека, оставляющую возможности: Вы можете назначить нелокальный указатель локальному объекту. Для образца:
Нелокальный или глобальный указатель назначается переменной, которая является локальной для функции.
Переданный по ссылке функциональный параметр, такой как указатель, присваивается переменной, которая локальна функции.
Представитель данных указателя класса назначается переменной, которая локальна для функции.
Когда локальная переменная выходит из возможностей, их соответствующие блоки памяти могут содержать мусор или непредсказуемые значения. Доступ к указателям на эти местоположения памяти обращается к объекту после его жизни и может привести к неопределенному или непредсказуемому поведению. Лучшая практика состоит в том, чтобы не назначать нелокальные указатели локальным объектам.
Изменение объекта с временным временем жизни: Вы можете попытаться изменить временный объект, возвращенный вызовом функции. Изменение временных объектов является неопределенным поведением, которое может привести к ненормальному завершению программы в зависимости от используемого оборудования и программного обеспечения. Лучшая практика состоит в том, чтобы назначить временные объекты в локальных переменных, а затем изменить локальные переменные.
Избегайте операций, которые могут получить доступ к объекту вне его срока службы.
Polyspace® проверяет эти сценарии, где к объекту можно получить доступ за пределами его жизненного цикла:
Неинициализированный указатель: Polyspace помечает указатель, если ему не назначен адрес перед его доступом.
Неинициализированная переменная: Polyspace помечает переменную, если она не инициализирована перед чтением ее значения.
Использование ранее отключенного указателя: Polyspace помечает операцию, где вы получаете доступ к блоку памяти после удаления блока, например, при помощи free() функцию или delete оператор.
Указатель или ссылка на переменную стека, покидающую возможности: Polyspace помечает локальную переменную, когда указатель или ссылка на нее покидает возможности. Для примера локальная переменная помечена, когда:
Функция возвращает указатель на локальную переменную
Глобальный указатель указан на локальную переменную
Параметр функции pass-by-reference, такой как указатель, указывает на локальную переменную
Представитель данных указателя класса указывается на локальную переменную
Доступ к объекту с временным временем жизни: Polyspace помечает операцию, где вы получаете доступ к временному объекту, который возвращается вызовом функции.
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
| Группа: Основные концепции |
| Категория: Необходимый, Неавтоматизированный |