Permissive function pointer calls (-permissive-function-pointer)

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

Описание

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

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

Задать опцию

Пользовательский интерфейс (только для настольных продуктов): В строении проекта опция находится на узле Check Behavior. Смотрите Зависимость для других опций, которые вы также должны включить.

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

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

По умолчанию Code Prover не распознает вызовы через указатели на функцию, когда происходит несоответствие типа. Исправьте несоответствие типов по возможности.

Используйте эту опцию, если:

  • Вы не можете исправить несоответствие типов, и

  • Анализ не охватывает значительный фрагмент вашего кода, потому что вызовы через указатели на функцию не распознаются.

Настройки

На

Эта верификация должен разрешать вызовы указателей на функцию, где тип указателя на функцию не совпадает с типом функции. Для образца - функция, объявленная как int f(int*) может вызываться указателем на функцию, объявленным как int (*fptr)(void*).

Допускаются только несоответствия типов между типами указателей. Несоответствия типов между типами неуказателей вызывают ошибки компиляции. Для образца - функция, объявленная как int f(int) не может быть вызван указателем на функцию, объявленным как int (*fptr)(double).

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

Для верификации необходимо, чтобы аргументы и возвращаемые типы указателя на функцию и функции, которую он вызывает, были идентичными.

Несоответствия типов обнаруживаются при проверке 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 -lang c -пермиссионный-function-указатель
Пример (Код Prover Server): Полипространство -code-prover-server -sources file_name -lang c -пермиссионный-function-указатель