Типы обнаруживаемых дефектов

Типы дефектов, обнаруживаемых средством 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
}