﻿# Использование неинициализированной памяти

Использование неинициализированной памяти — одна из наиболее часто совершаемых ошибок в языках с ручным управлением памятью\. Суть её состоит в чтении данных из буфера, который был выделен, но не заполнен начальными значениями\. Такое поведение программы является ошибкой, которую иногда трудно выявить\. Это так называемая "[плавающая ошибка](https://ru.wikipedia.org/wiki/%D0%93%D0%B5%D0%B9%D0%B7%D0%B5%D0%BD%D0%B1%D0%B0%D0%B3)"\. Её проявление может зависеть от используемой версии компилятора или операционной системы, а также от запуска "отладочной" или "релизной" сборки\.

Чаще всего причинами возникновения ошибки служат неправильный порядок инициализации или ошибки синхронизации в многопоточном приложении\. Независимо от конкретной причины, это приводит к тому, что данные начинают использоваться до того, как были инициализированы\.

Рассмотрим пример такой ошибки:

```cpp
dgCollisionCompoundBreakable::dgCollisionCompoundBreakable(....)
{
  ....
  dgInt32 faceOffsetHitogram[256];
  dgSubMesh* mainSegmenst[256];
  ....
  memset(faceOffsetHitogram, 0, sizeof(faceOffsetHitogram));
  memset(mainSegmenst, 0, sizeof(faceOffsetHitogram));
  ....
}
```

Ошибка заключается в неполной инициализации массива _mainSegmenst_\. Во втором вызове функции _memset_ ошиблись в третьем аргументе и передали размер массива _faceOffsetHitogram_\. В итоге код будет работать корректно только при его компиляции на 32\-битную платформу, где размер указателя совпадает с размером типа _dgInt32_\. При компиляции на 64\-битную платформу программа будет работать некорректно\.

**Список источников**

1. [Wikipedia\. Uninitialized variable](https://en.wikipedia.org/wiki/Uninitialized_variable)
1. [Неинициализированная переменная](https://pvs-studio.ru/ru/blog/terms/0078/)
1. [Исследование COVID\-19 и неинициализированная переменная](https://pvs-studio.ru/ru/blog/posts/cpp/0796/)