Я использую библиотеку для регистрации некоторых структур во время компиляции.В этом случае это регистрация структуры, представляющей метод 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-я команда является действительным указателем (предположительно, из-за заполнения).
Теперь реальный вопрос: каков самый чистый способ исправить это?Должен ли я попытаться увеличить размер шага (в этом случае необходима инструкция препроцессора, чтобы отличить использование дезинфицирующего средства)?Или есть способ отключить этот отступ для вещей в разделе?