exponenta event banner

Условие корректности

Несоответствие происходит во время приведения указателя или использования указателя функции

Описание

Эта проверка определяет, выполняется ли:

  • Массив сопоставляется с большим массивом посредством приведения указателя

  • Указатель функции указывает на функцию с допустимым прототипом

  • Глобальная переменная выходит за пределы диапазона, заданного в режиме Global Assert. См. также раздел Ограничение диапазона глобальных переменных.

Примеры

развернуть все

typedef int smallArray[10];
typedef int largeArray[100];


void main(void) {
    largeArray myLargeArray;
    smallArray *smallArrayPtr = (smallArray*) &myLargeArray;
    largeArray *largeArrayPtr = (largeArray*) smallArrayPtr;
}

В этом примере:

  • В первом приведении указателя указатель типа largeArray приводится к указателю типа smallArray. Потому что тип данных smallArray представляет меньший массив, проверка состояния корректности зеленая.

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

typedef void (*callBack) (float data);
typedef struct {
    char funcName[20];
    callBack func;
} funcStruct;

funcStruct myFuncStruct;

void main(void) {
    float val = 0.f;
    myFuncStruct.func(val);
}

В этом примере глобальная переменная myFuncStruct не инициализирован, поэтому указатель функции myFuncStruct.func содержит NULL. Когда указатель myFuncStruct.func отличается, проверка состояния корректности приводит к появлению красной ошибки.

#define MAX_MEMSEG 32764
typedef void (*ptrFunc)(int memseg);
ptrFunc operation = (ptrFunc)(0x003c);

void main(void) {
    for (int i=1; i <= MAX_MEMSEG; i++)
        operation(i);
}

В этом примере указатель функции operation приводится к содержимому ячейки памяти. Polyspace ® не может определить, содержит ли местоположение переменную или код функции и правильно ли введена функция. Следовательно, когда указательoperation используется в вызове функции, проверка состояния корректности - оранжевый.

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

  • Переменная, сохраняющая возвращаемое значение из вызова функции.

    В следующем примере программное обеспечение предполагает, что возвращаемое значение operation является полным диапазоном.

    typedef int (*ptrFunc)(int);
    ptrFunc operation = (ptrFunc)(0x003c);
    
    int main(void) {
      return operation(0);
    }
    

  • Переменные, которые могут быть изменены с помощью аргументов функции.

    В следующем примере указатель функции operation принимает аргумент указателя ptr указывает на переменную var. После звонка на operation, программное обеспечение предполагает, что var имеет значение полного диапазона.

    typedef void (*ptrFunc)(int*);
    ptrFunc operation = (ptrFunc)(0x003c);
    
    void main(void) {
      int var;
      int *ptr=&var;
      operation(ptr);
    }
    

typedef struct {
  double real;
  double imag;
} complex;

typedef int (*typeFuncPtr) (complex*);

int func(int* x);

void main() {
  typeFuncPtr funcPtr = (typeFuncPtr)&func;
  int arg = 0, result = funcPtr((complex*)&arg);
}

В этом примере указатель функции funcPtr указывает на функцию с типом аргумента complex*. Однако указателю присваивается адрес функции func чей тип аргумента - int*. Из-за несоответствия этого типа проверка состояния корректности имеет оранжевый цвет.

typedef int (*typeFuncPtr) (int, int);

int func(int);

void main() {
    typeFuncPtr funcPtr = (typeFuncPtr)&func;
    int arg1 = 0, arg2 = 0, result = funcPtr(arg1,arg2);
}

В этом примере указатель функции funcPtr указывает на функцию с двумя int аргументы. Однако ей присвоена функция func который имеет один int только аргумент. Из-за этого несоответствия в количестве аргументов проверка состояния Корректность имеет оранжевый цвет.

typedef double (*typeFuncPtr) (int);

int func(int);

void main() {
    typeFuncPtr funcPtr = (typeFuncPtr)&func;
    int arg = 0;
    double result = funcPtr(arg);
}

В этом примере указатель функции funcPtr указывает на функцию с возвращаемым типом double. Однако ей присвоена функция func тип возвращаемого значения int. Из-за этого несоответствия типов возврата проверка состояния Корректность (Correctness) имеет оранжевый цвет.

int glob = 0;
int func();

void main() {
    glob = 5;
    glob = func();
    glob+= 20;
}

В этом примере диапазон 0..10 был указан для глобальной переменной glob.

  • В заявлении glob=5;, зеленая проверка состояния корректности появляется на glob.

  • В заявлении glob=func();, появится оранжевая проверка состояния корректности glob потому что возвращаемое значение упорной функции func может быть снаружи 0..10.

    После этого заявления Полиспейс считает, что glob имеет значения в 0..10.

  • В заявлении glob+=20;, красная проверка состояния корректности появляется на glob потому что после добавления, glob имеет значения в 20..30.

См. также раздел Ограничение диапазона глобальных переменных.

Проверить информацию

Группа: Другое
Язык: C | C++
Акроним: COR