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