User assertion

assert сбои оператора

Описание

Эта проверка определяет ли аргумент к assert макрос верен.

Аргумент к assert макрос должен быть верным, когда макрос выполняется. В противном случае прерывания выполнения программы и печать сообщение об ошибке. Polyspace® моделирует это поведение путем обработки не пройдено assert оператор как ошибка времени выполнения. Эта проверка позволяет вам обнаруживать отказавший assert операторы перед выполнением программы.

Примеры

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

#include<stdio.h>
#define size 20

int getArrayElement();

void initialize(int* array) {
 for(int i=0;i<size;i++)
   array[i] = getArrayElement();
} 

void printElement(int* array,int index) {
 assert(index < size);
 printf("%d", array[index]);
}

int getIndex() {
 int i = size;
 return i;
}

void main() {
 int array[size];
 int index; 
 
 initialize(array);
 index = getIndex();
 printElement(array,index);
 
}

В этом примере, assert оператор в printElement прерывание выполнения программы причин, если index >= size. assert оператор убеждается, что индекс массива не является внешними границами массивов. Если код не содержит исключительные ситуации, assert оператор должен быть зеленым. В этом примере, getIndex возвращает индекс, равный size. Поэтому assert оператор кажется красным.

Коррекция — Правильная причина assert отказ

Когда assert оператор является красным, исследуйте причину исключительной ситуации. В этом примере одна возможная коррекция должна обеспечить getIndex чтобы возвратить индекс равняются size-1.

#include<stdio.h>
#define size 20

int getArrayElement();

void initialize(int* array) {
 for(int i=0;i<size;i++)
  array[i] = getArrayElement();
} 

void printElement(int* array,int index) {
 assert(index < size);
 printf("%d", array[index]);
}

int getIndex() {
 int i = size;
 return (i-1);
}

void main() {
 int array[size];
 int index;
 
 initialize(array);
 index = getIndex();
 printElement(array,index);
 
}
#include <stdlib.h>

void initialize(int*);
int getNumberOfElements();

void main() {
 int numberOfElements, *myArray;
 
 numberOfElements = getNumberOfElements();
 
 myArray = (int*)malloc(numberOfElements);
 assert(myArray!=NULL);
 
 initialize(myArray);
}

В этом примере, malloc может возвратить NULL к myArray. Поэтому myArray может иметь два возможных значения:

  • myArray == NULL: assert условие является ложным.

  • myArray != NULL: assert условие верно.

Комбинирование этих двух случаев, User assertion проверяет assert оператор является оранжевым. После оранжевого assert, Polyspace рассматривает тот myArray не равно NULL.

Коррекция — возвращаемое значение Проверки для NULL

Одна возможная коррекция должна записать индивидуально настраиваемый функциональный myMalloc где вы всегда проверяете возвращаемое значение malloc для NULL.

#include <stdio.h>
#include <stdlib.h>

void initialize(int*);
int getNumberOfElements();

void myMalloc(int **ptr, int num) {
 *ptr = (int*)malloc(num);
 if(*ptr==NULL) {
    printf("Memory allocation error");
    exit(1);
  }
}

void main() {
 int numberOfElements, *myArray=NULL;
 
 numberOfElements = getNumberOfElements();
 
 myMalloc(&myArray,numberOfElements);
 assert(myArray!=NULL);
 
 initialize(myArray);
}
#include<stdio.h>
#include<math.h>

float getNumber();
void squareRootOfDifference(float firstNumber, float secondNumber) {
   assert(firstNumber > secondNumber);
   if(firstNumber > 0 && secondNumber > 0)
   printf("Square root = %.2f",sqrt(firstNumber-secondNumber));
}

void main() {
   double firstNumber = getNumber(), secondNumber = getNumber();
   squareRootOfDifference(firstNumber,secondNumber);
}

В этом примере, assert оператор в squareRootOfDifference() прерывание выполнения программы причин, если firstNumber меньше secondNumber. Поскольку Polyspace не имеет достаточной информации о firstNumber и secondNumber, assert является оранжевым.

После assert, все пути к выполнению, которые вызывают оконечный отказ утверждения. Поэтому после assert, Polyspace рассматривает тот firstNumber >= secondNumber. Invalid use of standard library routine проверяет sqrt является зеленым.

Используйте assert операторы, чтобы помочь Polyspace определить:

  • Отношения между переменными

  • Ограничения на переменные диапазоны

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

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