Типы обнаруживаемых дефектов
Типы дефектов, обнаруживаемых средством Aegis приведены в таблице. Для каждого типа дефектов приведено описание и пример программы на языке C, в котором содержится такой дефект.
Обнаружить эти дефекты Вы можете воспользовавшись открытым сервисом обнаружения дефектов. Для этого просто скопируйте пример в буфер обмена и запустите сервис обнаружения дефектов.
Тип | Название | Пример программы с дефектом |
---|---|---|
RES | Ошибки управления ресурсами | |
RES-01 | Утечка динамической памяти (обнаруживается в конце функции) | void f() { int* array; array = malloc(sizeof(int)*5);//RES-01 } void main(void) { f(); } |
RES-01A | Утечка динамической памяти (обнаруживается при завершении программы) | void main(void) { int* array; array = malloc(sizeof(int)*5);//RES-01A } |
RES-02 | Утечка дескрипторов (обнаруживается в конце функции) | #include <stdio.h> void f() { FILE* f; char buf[30]; f = fopen(buf, "w");//RES-02 } void main(void) { f(); } |
RES-02A | Утечка дескрипторов (обнаруживается при завершении программы) | #include <stdio.h> void main(void) { FILE* f; char buf[30]; f = fopen(buf, "w");//RES-02A } |
RES-03 | Множественное освобождение памяти | void main(void) { int* array; array = malloc(sizeof(int)*5); free(array); free(array);//RES-03 } |
RES-03A | Освобождение памяти для указателя, указывающего не в начало блока памяти | void main(void) { int* array; int size = 20; array = malloc(sizeof(int)*size); free(&array[size - size/2]);//RES-03A } |
RES-03B | Освобождение памяти для указателя на статический объект | void main(void) { int a = 10; int* p_a = &a; free(p_a);//RES-03B } |
RES-04 | Множественное освобождение дескриптора | #include <unistd.h> #include <fcntl.h> int main(void) { close(0); close(0);//RES-04 return 0; } |
RES-06 | Нарушение протокола работы с ресурсом (работа с закрытым, неоткрытым, неконтролируемым ресурсом и др.) | ------ |
BUF | Ошибки работы с буферами/массивами/строками | |
BUF-02 | Разыменование указателя, выведенного за границу объекта | int main(void) { int arr[10]; int *p_arr; p_arr = arr; p_arr += 10; printf("%d" , *p_arr);//BUF-02 } |
BUF-03 | Переполнение буфера (попытка чтения/записи в/из буфера недостаточного размера) | #include <string.h> int main(void) { char str1[] = "String"; char str2[] = "ExString"; strncpy(str1,str2,strlen(str2));//BUF-03 } |
BUF-05 | Вычитание и сравнение указателей на разные объекты | void main(void) { int a1[10]; int a2[15]; int *pa1 = a1; int *pa2=a2+7; int diff = (pa2 - pa1);//BUF-05 } |
INI | Ошибки отсутствия инициализации | |
INI-01 | Использование неинициализированной переменной | void main(void) { int a[4] = { 0, 1, 2, 3}; int d1,i; for(i=0;i<= d1;i++) {//INI-01 a[0] +=1; } } |
INI-03 | Разыменование неинициализированного, освобожденного или нулевого указателя | #include <stdlib.h> void main(void) { int* p = NULL; *p = 1;//INI-03 } |
FRM | Ошибки форматной строки | |
FRM-01 | Использование в качестве строки формата неконтролируемого значения | #include <stdio.h> void main(void) { char value[50]; scanf("%49s", value); printf(value);//FRM-01 } |
EXP | Ошибки в выражениях | |
EXP-04 | Ошибка использования переменных типа int для float -арифметики |
void main(void) { int a = 127; float c = a / 8;//EXP-04 } |
STR | Ошибки при строковых операциях | |
STR-01 | Переполнение буфера при строковой операции (копирования, конкатенации и др.) | #include <string.h> void main(void) { char src[10] = "Hello"; char dest[5]; strcpy(dest, src);//STR-01 } |
MATH | Математические ошибки | |
MATH-01 | Деление на ноль | #include <stdio.h> void main(void) { float t,k; scanf("%d",&t); k = 5/t;//MATH-01 } |
FUNC | Ошибки в объявлениях, определениях, вызовах функций | |
FUNC-01 | Вызов внешней функции без аннотации | extern int f(); void main(void) { int x; x = f();//FUNC-01 } |
FUNC-02 | Вызов функции через некорректный указатель | #include <stdlib.h> void main(void) { void (*pf)(void) = NULL; pf();//FUNC-02 } |
FUNC-03 | Отсутствует возвращаемое значение функции (в определении функции с возвращаемым значением не void отсутствует возвращаемое значение) |
int * g(int i) { i++; } void main(void) { int * k = g(1);//FUNC-03 } |