Очиститель адреса и __attribute (section ("mysection")) не работают - PullRequest
0 голосов
/ 27 ноября 2018

Я использую библиотеку для регистрации некоторых структур во время компиляции.В этом случае это регистрация структуры, представляющей метод JSON-RPC, который я хотел бы представить.Библиотека помечает структуры __attribute(section("xautodata_" "somename")), так что она будет помещена в отдельный раздел, который впоследствии можно будет извлечь.Сгенерированный контент будет выглядеть следующим образом:

static const autodata_json_command_ *__attribute__((__used__)) __attribute__((section("xautodata_" "json_command"))) autodata_json_command_151 = (&help_command);;
static const autodata_json_command_ *__attribute__((__used__)) __attribute__((section("xautodata_" "json_command"))) autodata_json_command_173 = (&stop_command);;

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

size_t count;
struct json_command **commands = get_json_commands(&count);
for (size_t i=0; i<count; i++) {
  // Access commands[i];
}

Это прекрасно работает, если мы не компилируем с -fsanitize=address, но добавит заполнение при компиляции с -fsanitize=address.

Без адреса дезинфицирующее средство команды расположены рядом друг с другом, т. Е. commands[0] и commands[1] являются действительными указателями на структуры.С дезинфицирующим средством только каждая 8-я команда является действительным указателем (предположительно, из-за заполнения).

Теперь реальный вопрос: каков самый чистый способ исправить это?Должен ли я попытаться увеличить размер шага (в этом случае необходима инструкция препроцессора, чтобы отличить использование дезинфицирующего средства)?Или есть способ отключить этот отступ для вещей в разделе?

1 Ответ

0 голосов
/ 27 ноября 2018

GCC Asan намеренно избегает инструментальных переменных в пользовательских секциях по причинам, которые вы указали (т. Е. Для сохранения последовательности):

/* Don't protect if using user section, often vars placed
   into user section from multiple TUs are then assumed
   to be an array of such vars, putting padding in there
   breaks this assumption.  */
  || (DECL_SECTION_NAME (decl) != NULL
  && !symtab_node::get (decl)->implicit_section
  && !section_sanitized_p (DECL_SECTION_NAME (decl)))

(из gcc / asan.c ).В этом случае можно использовать специальный флаг -fsanitize-sections=wildcard1,wildcard2,... для принудительного инструментирования.

Clang Asan, с другой стороны, игнорирует аннотации пользовательских разделов (см. AddressSanitizer.cpp ).

Я предлагаю добавить PR к Asan tracker , чтобы либо заставить Clang вести себя как GCC, либо добавить специальный флаг для управления инструментарием пользовательских секций (в последнем случае нам также необходимо обновить Asan Clang / GCCнесовместимость вики ).

...