Обнаружьте переполнение в расчете Buffer Size

Если вы вычисляете размер буфера от unsigned целые числа, для опции Overflow mode for unsigned integer, вместо значения по умолчанию allow, используйте forbid. Используя эту опцию помогает вам обнаружить переполнение на буферном этапе расчета. В противном случае вы можете видеть ошибку позже из-за недостаточного буфера. Эта опция доступна на узле Check Behavior под Code Prover Verification в панели Configuration.

В данном примере сохраните следующий код С в файле display.c:

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

int get_value(void);
 
void display(unsigned int num_items) {
 int *array;
 array = (int *) malloc(num_items * sizeof(int)); // overflow error
  if (array) {
    for (unsigned int ctr = 0; ctr < num_items; ctr++)     {       
      array[ctr] = get_value();
    }
    for (unsigned int ctr = 0; ctr < num_items; ctr++)     {       
      printf("Value is %d.\n", ctr, array[ctr]);
    }
    free(array);
  }
}

void main() {
  display(33000);
}

  1. Создайте проект Polyspace® и добавьте display.c к проекту.

  2. На панели Configuration выберите следующие опции:

    • Target & Compiler: От Target processor type выпадающий список выберите тип с 16-битным int такой как c167.

    • Check Behavior: От Overflow mode for unsigned integer выпадающий список выберите allow.

  3. Запустите верификацию и откройте результаты.

    Polyspace обнаруживает оранжевую ошибку Illegally dereferenced pointer на линии array[ctr] = get_value() и красная ошибка Non-terminating loop на for цикл.

    Эта ошибка следует из более ранней ошибки. Для 16-битного int, существует переполнение на расчете num_items * sizeof(int). Polyspace не обнаруживает переполнение, потому что это происходит в расчете с unsigned целые числа. Вместо этого Polyspace переносит результат расчета, вызывающего ошибку Illegally dereferenced pointer позже.

  4. От Overflow mode for unsigned integer выпадающий список выберите forbid.

  5. Polyspace обнаруживает красную ошибку Overflow в расчете num_items * sizeof(int).

Смотрите также

Аналитические опции Polyspace

Результаты Polyspace