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