Указатель или ссылка, чтобы сложить переменный осциллограф отъезда

Указатель на локальную переменную оставляет переменную scope

Описание

Указатель или ссылка, чтобы сложить переменный осциллограф отъезда происходят, когда указатель или ссылка на локальную переменную оставляют осциллограф переменной. Например:

  • Функция возвращает указатель на локальную переменную.

  • Функция выполняет присвоение globPtr = &locVar. globPtr является глобальной переменной указателя, и locVar является локальной переменной.

  • Функция выполняет присвоение *paramPtr = &locVar. paramPtr является параметром функции то есть, например, указатель int** и locVar являются локальной переменной int.

  • Метод C++ выполняет присвоение memPtr = &locVar. memPtr является элементом данных указателя класса, которому принадлежит метод. locVar является переменной локальной переменной к методу.

Дефект также применяется к выделенному использованию памяти функции alloca. Дефект не применяется к статическим, локальным переменным.

Риск

Локальные переменные выделяются адрес на стеке. Если осциллограф локальной переменной заканчивается, этот адрес доступен для повторного использования. Используя этот адрес, чтобы получить доступ к значению локальной переменной вне переменной scope может вызвать неожиданное поведение.

Если указатель на локальную переменную оставляет осциллограф переменной, Polyspace® Bug Finder™ подсвечивает дефект. Дефект появляется, даже если вы не используете адрес, сохраненный в указателе. Для удобного в сопровождении кода это - хорошая практика, чтобы не позволить указателю оставлять переменную scope. Даже если вы не используете адрес в указателе теперь, кто-то еще использующий вашу функцию может использовать адрес, вызывая неопределенное поведение.

Фиксация

Не позволяйте указателю или ссылке на локальную переменную оставлять переменную scope.

Примеры

развернуть все

void func2(int *ptr) {
    *ptr = 0;
}

int* func1(void) {
    int ret = 0;
    return &ret ;
}
void main(void) {
    int* ptr = func1() ;
    func2(ptr) ;
}

В этом примере func1 возвращает указатель на локальную переменную ret.

В main ptr указывает на адрес локальной переменной. Когда к ptr получают доступ в func2, доступ недопустим, потому что осциллограф ret ограничивается func1,

Информация о результате

Группа: Статическое ЗУ
Язык: C | C++
Значение по умолчанию: на
Синтаксис командной строки: LOCAL_ADDR_ESCAPE
Влияние: высоко
ID CWE: 562, 825

Введенный в R2015b