exponenta event banner

Вызовы указателя разрешающей функции (-permissive-function-pointer)

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

Описание

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

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

Задать опцию

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

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

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

По умолчанию средство проверки кода не распознает вызовы через указатели функций при несоответствии типов. По возможности устраните несоответствие типов.

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

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

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

Настройки

На

Проверка должна разрешать вызовы указателя функции, если тип указателя функции не соответствует типу функции. Например, функция, объявленная как 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
По умолчанию: Откл.
Пример (проверка кода): polyspace-code-prover -sources file_name -lang c -permissive-function-pointer
Пример (сервер проверки кода): polyspace-code-prover-server -sources file_name -lang c -permissive-function-pointer