<div dir="auto"><div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Sep 5, 2020, 9:14 AM Maxim Dounin <<a href="mailto:mdounin@mdounin.ru">mdounin@mdounin.ru</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello!<br>
<br>
On Fri, Sep 04, 2020 at 11:12:30PM +0500, Илья Шипицин wrote:<br>
<br>
> для тестирования самодельного модуля, использовали такую методику<br>
> <br>
> взяли <a href="https://github.com/nginx/nginx-tests" rel="noreferrer noreferrer" target="_blank">https://github.com/nginx/nginx-tests</a><br>
> собрали nginx с самодельным модулем и gcc asan (не суть, могли бы взять<br>
> clang asan).<br>
> собрали кучу вариантов прохода по коду (это круто), нашли сколько-то<br>
> дефектов в своем модуле.<br>
> <br>
> интересные вещи возникают с asan, причем, воспроизводятся на оригинальном<br>
> nginx.<br>
> это непонятно. можете прокомментировать ?<br>
> <br>
> 1. беру nginx из официальной репы. смотрю "nginx -V", добавляю<br>
> -fsanitize=address к cc-opts<br>
> 2. выставляю ASAN_OPTIONS="log_path=asan.log"<br>
> 3. запукаю тесты, смотрю, что упало в asan.log (а там есть сработки, это<br>
> немного неожиданно)<br>
<br>
LeakSanitizer любит ругаться при выходе процесса на любую <br>
выделенную и не освобождённую явно память.  В результате ругани <br>
там достаточно в том числе на полностью корректном коде, причём <br>
она заметно варьируется в зависимости от используемых библиотек и <br>
операционной системы.  На macOS, например, вызов localtime_r() <br>
приводит к аллокациям в системных библиотеках и ругани при выходе <br>
всегда.<br>
<br>
Ну и с учётом используемой nginx'ом модели выделения памяти через <br>
пулы - поймать что-то реальное с помощью LeakSanitizer'а <br>
практически невозможно.<br>
<br>
Так что тесты с санитайзером мы гоняем, но вот на ругань от <br>
LeakSanitizer'а смотреть систематически даже и не пытаемся: мусора <br>
много, а толку никакого.<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">Вывод приведен, кстати, с bionic.</div><div dir="auto">Да, я тоже подумал, что скорее всего тесты с санитайзером запускаете. Ну и была надежда на бинарную логику "есть сработки - ура, смотрим, нет сработок - смотреть нечего"</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
[...]<br>
<br>
> Indirect leak of 16384 byte(s) in 1 object(s) allocated from:<br>
>     #0 0x7f36e86dbaa5 in posix_memalign<br>
> (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10eaa5)<br>
>     #1 0x5627781c130d in ngx_memalign src/os/unix/ngx_alloc.c:57<br>
>     #2 0x5627781225ac in ngx_create_pool src/core/ngx_palloc.c:23<br>
>     #3 0x562778169b2d in ngx_init_cycle src/core/ngx_cycle.c:69<br>
>     #4 0x5627781188ae in main src/core/nginx.c:291<br>
>     #5 0x7f36e7fa40b2 in __libc_start_main<br>
> (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)<br>
<br>
Ругань в этом файле (вся, но тут вот наиболее наглядно) как бы <br>
предполагает, что созданный в ngx_init_cycle() пул не освобождён.  <br>
Такое может быть при фатальных ошибках, скажем, если произошла <br>
ошибка при инициализации какого-то модуля в ngx_init_cycle().<br>
<br>
На вскидку я никаких подобных проблем в тестах не помню (даже при <br>
использовании TEST_NGINX_UNSAFE, хотя там вообще-то может быть <br>
всё, что угодно), и погоняв тесты на Ubuntu 18.04 никакой подобной <br>
ругани от ASAN'а не наблюдаю (другую - наблюдаю, но там всё <br>
понятно: неосвобождения пула init-цикла при ошибках парсинга <br>
конфигурации, per-worker аллокации в random-балансировщике и <br>
разное в OpenSSL).  Если воспроизводится - то стоит посмотреть, <br>
что конкретно за тест это триггерит, и что там происходит.<br>
<br>
Впрочем, шансов на то, что это таки утечка - никаких.  Скорее <br>
какая-нибудь проблема с конкретным тестом на конкретной платформе.<br>
<br>
-- <br>
Maxim Dounin<br>
<a href="http://mdounin.ru/" rel="noreferrer noreferrer" target="_blank">http://mdounin.ru/</a><br>
_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org" target="_blank" rel="noreferrer">nginx-ru@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx-ru" rel="noreferrer noreferrer" target="_blank">http://mailman.nginx.org/mailman/listinfo/nginx-ru</a></blockquote></div></div></div>