Указатель на локальную переменную покидает возможности переменной
Этот дефект возникает, когда указатель или ссылка на локальную переменную покидает возможности переменной. Для образца:
Функция возвращает указатель на локальную переменную.
Функция выполняет назначение globPtr = &locVar
. globPtr
является переменной глобального указателя и locVar
является локальной переменной.
Функция выполняет назначение *paramPtr = &locVar
. paramPtr
является параметром функции, который, для образца, является int**
указатель и locVar
является локальным int
переменная.
Метод C++ выполняет назначение memPtr = &locVar
. memPtr
является представителем данных указателя класса, которому принадлежит метод. locVar
является локальной переменной метода.
(C++ 11 и более поздние версии) Функция возвращает объект лямбда-выражения, который захватывает локальные переменные функции по ссылке.
Дефект также относится к памяти, выделенной с помощью alloca
функция. Дефект не применяется к статическим локальным переменным.
Локальным переменным выделяется адрес в стеке. Когда возможности локальной переменной заканчиваются, этот адрес доступен для повторного использования. Использование этого адреса для доступа к локальному значению переменных вне переменных возможностей может вызвать неожиданное поведение.
Если указатель на локальную переменную покидает возможности переменной, Polyspace® Bug Finder™ подсвечивает дефект. Дефект появляется, даже если вы не используете адрес, сохраненный в указателе. Для поддерживаемого кода рекомендуется не позволять указателю покидать возможности переменной. Даже если вы не используете адрес в указателе сейчас, кто-то другой, использующий вашу функцию, может использовать адрес, вызывая неопределенное поведение.
Не разрешайте указателю или ссылке на локальную переменную покидать возможности переменной.
Группа: Статическая память |
Язык: C | C++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки: LOCAL_ADDR_ESCAPE |
Влияние: Высокий |
ИДЕНТИФИКАТОР CWE: 562, 825 |