exponenta event banner

Разрешить неполное или частичное распределение структур (-size-in-bytes)

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

Описание

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

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

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

Задать опцию

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

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

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

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

Настройки

На

При отмене ссылки на указатель с недостаточным буфером программа Polyspace ® не выдает ошибку «Незаконно», если отмена ссылки происходит в пределах допустимого буфера.

Например, в следующем коде указатель p имеет достаточный буфер для первых двух полей структуры BIG. Поэтому при включенной опции Polyspace считает, что первые две отмены являются действительными. Третья передача занимает p за пределами разрешенного буфера. Следовательно, Polyspace создает ошибку указателя Legacly derefined на третьей dereference.

#include <stdlib.h>
 
typedef struct _little { int a; int b; } LITTLE;
typedef struct _big { int a; int b; int c; } BIG;
 
void main(void) {
   BIG *p = malloc(sizeof(LITTLE));
 
   if (p!= ((void *) 0) ) {
      p->a = 0 ;    
      p->b = 0 ;
      p->c = 0 ;   // Red IDP check
     }
}
Выкл. (по умолчанию)

Polyspace не позволяет отменить привязку указателя к структуре, если указатель не имеет достаточного буфера для всех полей структуры. При первом удалении указателя возникает ошибка «Незаконно».

Например, в следующем коде, даже если указатель p имеет достаточный буфер для первых двух полей структуры BIG, Polyspace считает, что дереференция p недопустим.

#include <stdlib.h>
 
typedef struct _little { int a; int b; } LITTLE;
typedef struct _big { int a; int b; int c; } BIG;
 
void main(void) {
   BIG *p = malloc(sizeof(LITTLE));
 
   if (p!= ((void *) 0) ) {
      p->a = 0 ;   // Red IDP check
      p->b = 0 ;
      p->c = 0 ;        
   }
}

Совет

  • Если этот параметр не включен, нельзя указывать на поле частично присвоенной структуры.

    Например, в предыдущем примере, если не включить опцию и выполнить присвоение

    int *ptr = &(p->a); 
    Polyspace считает назначение недопустимым. Если отменить привязку ptr, это приводит к ошибке нелегального удаления ссылки.

  • Использование этой опции может несколько увеличить количество оранжевых чеков.

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

Параметр: -size-in-bytes
По умолчанию: Откл.
Пример (проверка кода): polyspace-code-prover -sources file_name -size-in-bytes
Пример (сервер проверки кода): polyspace-code-prover-server -sources file_name -size-in-bytes