﻿# V2588\. MISRA\. All memory or resources allocated dynamically should be explicitly released\.

Данное диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Это правило актуально только для C\. Анализатор обнаружил потенциально возможную утечку памяти или ресурсов, выделенных такими функциями стандартной библиотеки, как: 'malloc', 'calloc', 'realloc' или 'fopen'\.

Рассмотрим пример:

```cpp
void foo()
{
  int *a = (int*)malloc(40 * sizeof(int));
  int *b = (int*)malloc(80 * sizeof(int));
  ....
  free(a);
}
```

Здесь в коде динамически выделено два буфера, а при выходе из функции освобожден только первый из них\. В результате возникла утечка памяти\. 

Данный фрагмент можно исправить следующим образом:

```cpp
void foo()
{
  int *a = (int*)malloc(40 * sizeof(int));
  int *b = (int*)malloc(80 * sizeof(int));
  ....
  free(a);
  free(b);
}
```

Рассмотрим ещё один пример:

```cpp
void bar(bool b) 
{
  FILE *f = fopen("tmp", "r");
  if (b)
  {
    return;
  }
  ....
  fclose(f);
}
```

В данном случае файл открывается для чтения, и на одном из путей выхода из функции он не закрывается\. В результате возникает утечка файлового дескриптора\. 

Корректный вариант кода:

```cpp
void bar(bool b) 
{
  FILE *f = fopen("tmp", "r");
  if (b)
  {
    fclose(f);
    return;
  }
  ....
  fclose(f);
}
```