LeakSanitizer использует простой алгоритм , который сканирует кадры стека, регистры, глобальные и локальные переменные потока и достижимые выделения кучи для данных, которые выглядят как адреса памяти. Это происходит без обратной связи с компилятором, поэтому несвязанные, случайные или устаревшие данные могут привести к тому, что потерянная память будет считаться достижимой. Таким образом, алгоритм является неточным и, как известно, генерирует ложные отрицания (см., Например, здесь или здесь ), которые на практике зависят от версии компилятора / библиотеки и / или флагов.
Обычно такие проблемы, как описанные вами, возникают, когда устаревшее содержимое кадра main
(gparray
в вашем случае) оказывается не перезаписанным при запуске сканирования LSan.
Как этопроблема дизайна, с этим мало что можно поделать.