https://issuetracker.google.com/issues/74058603

аюсь собрать (с помощью clang) мое приложение с помощью дезинфицирующего устройства, описанного здесь (https://github.com/google/sanitizers/wiki/AddressSanitizerточнее здесь:https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroid), но у меня возникают проблемы с пониманием всего процесса, особенно с использованием gradle.

Похоже, есть как минимум 3 способа его включения:

1 °) После первой ссылки t говорит, что все, что вам нужно сделать, это сделать так:

добавление-fsanitize=address к cppFlags + необязательно-fno-omit-frame-pointer

добавление-fsanitize=address на флаги компоновщика (это необходимо?)

2 °) по второй ссылке кажется, что нужно сделать:

так же, как первыйroot устройство затем запустить на нем asan_device_setup через adbдобавитьLD_PRELOAD=libclang_rt.asan-arm-android.so где-то? Я предполагаю, что это должно быть помещено в 'аргументы' часть gradle externalNativeBuild? Но где приложение может найти эту библиотеку? Я должен связать это сам? Или это уже где-то на устройстве?

3 °) Я также нашел «новый» способ сделать это, который не должен требовать доступа к корням (хорошо, но это ошибка, которая должна быть исправлена ​​в какой-то момент):

https://virtualrealitypop.com/oreo-ndk-secrets-7d075a9b084

Этот метод фактически делает то, что делается в первой и второй точке, плюс запускает приложение, запуская скрипт оболочки, который экспортирует некоторые значения для работы asan.

Что касается моего расследования, я немного запутался в том, что является правильным методом, чтобы полностью дезинфицированное приложение (со статически связанными библиотеками) работало на моем рутированном эмуляторе.

Далее я фактически построил и запустил приложение (используя 2 °), но без указания флага LD_PRELOAD), но приложение вылетает с переполнением контейнера в какой-то функции eglMakeCurrent, которая даже не является частью моего кода, и Я не получаю стека за это:

02-19 16:26:21.553 28771-28789/com.mycompany.myapp I/zygote: Background concurrent copying GC freed 10159(1175KB) AllocSpace objects, 12(304KB) LOS objects, 50% free, 2MB/4MB, paused 144.861ms total 1.252s
[ 02-19 16:26:21.554 28771:28956 I/         ]
=================================================================
[ 02-19 16:26:21.554 28771:28956 I/         ]
[ 02-19 16:26:21.557 28771:28956 I/         ]
[ 02-19 16:26:21.563 28771:28956 I/         ]
==28771==ERROR: AddressSanitizer: container-overflow on address 0xa136e990 at pc 0xa49849e2 bp 0x82e60558 sp 0x82e60128
[ 02-19 16:26:21.563 28771:28956 I/         ]
[ 02-19 16:26:21.565 28771:28956 I/         ]
[ 02-19 16:26:21.566 28771:28956 I/         ]
WRITE of size 2 at 0xa136e990 thread T334 (GLThread 337)
[ 02-19 16:26:21.566 28771:28956 I/         ]

Я не уверен, что это реальное переполнение, потому что я не уверен, что все мое приложение построено с помощью дезинфицирующего средства (я собрал свой так + всю свою статику с ним, но достаточно ли этого?), Иhttps://github.com/google/sanitizers/wiki/AddressSanitizerContainerOverflow говорит, что если все ваше приложение не создано с помощью дезинфицирующего средства, вы можете получить ложные срабатывания.

Итак, мои вопросы:

А) кому-то удалось построить дезинфицированное приложение с помощью Android Studio?

B °) Если да, как правильно это сделать (имеется в виду тот, который будет поддерживаться)?

Ответы на вопрос(1)

Ваш ответ на вопрос