-permissive-function-pointer
)Разрешить несоответствие типов между указателями на функцию и функциями, на которые они указывают
Эта опция влияет только на анализ Code Prover.
Укажите, что верификация должна разрешать вызовы указателей на функцию, где тип указателя на функцию не совпадает с типом функции.
Пользовательский интерфейс (только для настольных продуктов): В строении проекта опция находится на узле Check Behavior. Смотрите Зависимость для других опций, которые вы также должны включить.
Командная строка и файл опций: Используйте опцию -permissive-function-pointer
. См. «Информация о командной строке».
По умолчанию Code Prover не распознает вызовы через указатели на функцию, когда происходит несоответствие типа. Исправьте несоответствие типов по возможности.
Используйте эту опцию, если:
Вы не можете исправить несоответствие типов, и
Анализ не охватывает значительный фрагмент вашего кода, потому что вызовы через указатели на функцию не распознаются.
Эта верификация должен разрешать вызовы указателей на функцию, где тип указателя на функцию не совпадает с типом функции. Для образца - функция, объявленная как int f(int*)
может вызываться указателем на функцию, объявленным как int (*fptr)(void*)
.
Допускаются только несоответствия типов между типами указателей. Несоответствия типов между типами неуказателей вызывают ошибки компиляции. Для образца - функция, объявленная как int f(int)
не может быть вызван указателем на функцию, объявленным как int (*fptr)(double)
.
Для верификации необходимо, чтобы аргументы и возвращаемые типы указателя на функцию и функции, которую он вызывает, были идентичными.
Несоответствия типов обнаруживаются при проверке Correctness condition
.
С источниками, которые широко используют указатели на функции, включение этой опции может привести к снижению эффективности. Эта потеря происходит из-за того, что при верификации необходимо учитывать больше путей выполнения.
Использование этой опции может увеличить количество оранжевых проверок. Некоторые из этих оранжевых чеков могут выявить реальную проблему с кодом.
Рассмотрим эти примеры, где несоответствие типов происходит между типом указателя на функцию и функцией, на которую она указывает:
В этом примере указатель на функцию obj_fptr
имеет аргумент, который является указателем на трехэлементный массив. Однако он указывает на функцию, чей соответствующий аргумент является указателем на массив с четырьмя элементами. В теле foo
четыре элемента массива считываются и приращиваются. Четвертый элемент не существует и ++
операция считывает бессмысленное значение.
typedef int array_three_elements[3]; typedef void (*fptr)(array_three_elements*); typedef int array_four_elements[4]; void foo(array_four_elements*); void main() { array_three_elements arr[3] = {0,0,0}; array_three_elements *ptr; fptr obj_fptr; ptr = &arr; obj_fptr = &foo; //Call via function pointer obj_fptr(&ptr); } void foo(array_four_elements* x) { int i = 0; int *current_pos; for(i = 0; i< 4; i++) { current_pos = (*x) + i; (*current_pos)++; } } |
Без этой опции оранжевый Correctness condition
чек появляется при вызове obj_fptr(&ptr)
и функции foo
не проверяется. Если вы используете эту опцию, тело foo
содержит несколько оранжевых чеков. Внимательно проверьте проверки и убедитесь, что несоответствие типов не вызывает проблем.
В этом примере указатель на функцию имеет аргумент, который является указателем на структуру с тремя float
представителей. Однако соответствующий аргумент функции является указателем на несвязанную структуру с одним представителем массива. В теле функции strlen
функция используется, принимая представителя массива. Вместо этого strlen
вызов читает float
Представители и могут считывать бессмысленные значения, для образца, значения, сохраненные в заполнении структуры.
#include <string.h> struct point { float x; float y; float z; }; struct message { char msg[10] ; }; void foo(struct message*); void main() { struct point pt = {3.14, 2048.0, -1.0} ; void (*obj_fptr)(struct point *) ; obj_fptr = &foo; //Call via function pointer obj_fptr(&pt); } void foo(struct message* x) { int y = strlen(x->msg) ; } |
Без этой опции оранжевый Correctness condition
чек появляется при вызове obj_fptr(&pt)
и функции foo
не проверяется. Если вы используете эту опцию, функция содержит оранжевый чек на strlen
вызов. Внимательно проверьте проверку и убедитесь, что несоответствие типов не вызывает проблем.
Эта опция доступна только при установке Source code language (-lang)
на C
.
Параметр: -permissive-function-pointer |
По умолчанию: Off |
Пример (Code Prover):
Polyspace Code Prover -sources file_name |
Пример (Код Prover Server):
Полипространство -code-prover-server -sources file_name |