Detect stack pointer dereference outside scope (-detect-pointer-escape)

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

Описание

Эта опция влияет только на анализ Code Prover.

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

Задать опцию

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

Командная строка и файл опций: Используйте опцию -detect-pointer-escape. См. «Информация о командной строке».

Зачем использовать эту опцию

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

Настройки

На

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

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

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

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

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

В следующем коде, если вы включите эту опцию, Polyspace® Code Prover™ создает красную Illegally dereferenced pointer проверку *ptr. В противном случае Illegally dereferenced pointer проверьте *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 доступ к нему за пределами его возможностей.

Off (по умолчанию)

Когда вы высмеиваете указатель, проверка Illegally dereferenced pointer не проверяет, имеете ли вы доступ к переменной вне ее возможностей. Проверка зеленая, даже если разыменование указателя находится вне переменных возможностей, пока оно удовлетворяет этим требованиям:

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

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

Совет

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

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

Параметр: -detect-pointer-escape
По умолчанию: Off
Пример (Code Prover): Polyspace Code Prover -sources file_name -detect-pointer-escape
Пример (Код Prover Server): Полипространство -code-prover-server -sources file_name -detect-pointer-escape
Введенный в R2015a