-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) ; }
ret
доступ к нему за пределами его возможностей.
Когда вы высмеиваете указатель, проверка Illegally dereferenced pointer не проверяет, имеете ли вы доступ к переменной вне ее возможностей. Проверка зеленая, даже если разыменование указателя находится вне переменных возможностей, пока оно удовлетворяет этим требованиям:
Указатель не имеет значение NULL.
Указатель указывает в буфере памяти.
Обнаружение отклонения указателя на стек вне возможностей не применяется к определенным типам указателей. Конкретные ограничения см. в разделе Ограничения верификации Polyspace.
Параметр: -detect-pointer-escape |
По умолчанию: Off |
Пример (Code Prover): Polyspace Code Prover -sources |
Пример (Код Prover Server): Полипространство -code-prover-server -sources |