У меня есть функция в C, которая принимает параметр uint8_t *
, который должен указывать на 32-разрядную выровненную память. Возможно ли на C или C++ или с помощью макросов какой-либо конкретной платформы добавить некоторое украшение параметру, так что компилятор или компоновщик будут вызывать ошибку во время сборки, если она не выровнена по мере необходимости?Возможно принудительное выравнивание памяти в параметре указателя в C?
Идея здесь в том, что я хочу защитить функцию от неправильного использования другими пользователями (или мне через 6 месяцев). Я знаю, как выровнять материал, который я хочу передать ему. Я бы хотел, чтобы ни один не смог отправить.
Основываясь на this answer, я думаю, что ответ на мой вопрос «нет», это невозможно сделать во время сборки, но это похоже на полезную функцию, поэтому я решил проверить. Моя работа заключается в том, чтобы положить assert((((size_t)ptr) % 4) == 0);
в функцию, поэтому, по крайней мере, я мог бы захватить ее во время выполнения при отладке.
По моему опыту, результаты не определены, если вы нанесли несогласованный uint8_t*
на uint32_t*
на многие встроенные платформы, поэтому я не хочу рассчитывать на «правильный» результат, выходящий в конце. Плюс это используется в системе реального времени, поэтому замедление может быть неприемлемым.
Цитаты приветствуются, если они есть.
Несомненно, не проблема XY? Несогласованный доступ к Intel почти не имеет штрафов, а при строгой архитектуре выравнивания это вызовет SIGBUS. – SergeyA
Как вы ожидаете ошибку в * buld time * для этого? Это потребует довольно многого от компилятора, что если бы я сделал 'uint8_t * sneaky = (uint8_t *) 1; alignmentRequiringFunction (скрытый); '? Или если значение 'sneaky' исходило от' fgets() '? Один из способов, по крайней мере, указать вызывающим абонентам то, что вы ожидаете, - сделать аргумент 'uint32_t *', потому что это означает, что ожидается естественное выравнивание. – unwind
@SergeyA, я не думаю, что это [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Я спрашиваю о том, что я думаю о правильном решении. Кроме того, я редактировал вопрос повторно - остальная часть вашего комментария. –