exponenta event banner

Обнаружить отклонение указателя стека вне области (-detect-pointer-escape)

Поиск случаев, когда функция возвращает указатель на одну из своих локальных переменных

Описание

Этот параметр влияет только на анализ программы проверки кода.

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

Задать опцию

Пользовательский интерфейс (только для настольных ПК): в конфигурации проекта параметр находится в узле Проверить поведение.

файл командной строки и параметров: Использовать параметр -detect-pointer-escape. См. раздел Сведения о командной строке.

Зачем использовать этот параметр

Используйте этот параметр, чтобы включить обнаружение утечки указателя.

Настройки

На

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

  • Красный, если все переменные, на которые указывает указатель, доступны вне их области.

    Например, вы отменяете привязку указателя ptr в функции func это вызывается дважды в вашем коде. В обоих вызовах при выполнении отмены связи *ptr, ptr указывает на переменные вне их области действия. Поэтому проверка указателя «Незаконно» имеет красный цвет.

  • Оранжевый, если только некоторые переменные, на которые указывает указатель, доступны вне их области.

  • Зеленый, если ни одна из переменных, на которые указывает указатель, не доступна за пределами их области действия, и другие требования проверки также удовлетворяются.

В следующем коде, если этот параметр включен, Polyspace ® Code Prover™ производит красную проверку на запрещенный указатель *ptr. В противном случае проверка указателя с запрещенной ссылкой *ptr зеленый.

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

int* func1(void) {
    int ret = 0;
    return &ret ;
}
void main(void) {
    int* ptr = func1() ;
    func2(ptr) ;
}
На панели Сведения о результате (Result Details) отображается сообщение о том, что ret доступен за пределами его области действия.

Выкл. (по умолчанию)

При отмене привязки указателя проверка «Незаконно» не проверяет, осуществляется ли доступ к переменной за пределами ее области. Проверка имеет зеленый цвет, даже если отмена привязки указателя находится за пределами области действия переменной, если она удовлетворяет этим требованиям:

  • Указатель не имеет значение NULL.

  • Указатель указывает в буфере памяти.

Совет

Обнаружение привязки указателя стека вне области действия не применяется к определенным типам указателей. Конкретные ограничения см. в разделе Ограничения проверки полиспейса.

Информация командной строки

Параметр: -detect-pointer-escape
По умолчанию: Откл.
Пример (проверка кода): polyspace-code-prover -sources file_name -detect-pointer-escape
Пример (сервер проверки кода): polyspace-code-prover-server -sources file_name -detect-pointer-escape
Представлен в R2015a