История изменений
Исправление firkax, (текущая версия) :
В стандарте, чувак!
Повторю: для x86 не бывает никаких incorrect alignment, проц умеет читать/писать по любому адресу (про sse см. ниже). То что про это написано в стандарте - это на случай архитектур которые так не умеют. В самом деле: ты написал код на Си с невыровненным доступом, всё прекрасно работает, даёшь его своему другу с какой-то ембеддед-архитектурой и у него оно падает с alignment trap или, ещё хуже, игнорирует младший бит адреса int16-переменной, читая её на 1 байт ниже чем она расположена по задумке программиста. Это и правда в общем случае UB - мы не можем заранее знать что там за проц будет итд. Но если речь идёт про компиляцию с уже известной x86 архитектурой, и линкуется оно к libc, написанному именно под x86, то невыравнивание указателей никакого UB не создаёт: libc знает что так можно, компилятор тоже знает, а программиста это вообще не задевает. А gcc-шный packed struct вообще получается UB by design тогда.
Но если хочешь, можешь интерпретировать это по-своему типа там страшное UB.
В любом случае, это ни на что не влияет, поскольку glibc malloc даже на 32 битах выравнивает указатели по 16 байт по другим причинам. А аллокатор 16-битного Турбо-Паскаля выравнивал по 8 (16-битный Си не видел).
Причём тут SSE?
При том что это единственная сущность в x86 процах, которая зависит от выравнивания. И то не везде, а на современных процах нет смысла генерить align-зависимый асм (на старых align-зависимая инструкция выполнялась чуть быстрее чем универсальная) так что считай уже тоже не зависит.
Как мне в стандартном C99 или C89 получить тип, у которого выравнивание больше 8?
Думаю никак.
P.S. Ты там в каком году застрял? -msse это умолчание на x86-64, SSE2 это часть описания архитектуры и SysV ABI.
Я и написал: "-msse или 64 бита". Т.к. второе включает в себя первое.
А почему эти «параноидальные настройки» включаются при -fsanitize=undefined? Выходит, что и GCC, и Clang считают, что это UB?
Не знаю. Формальности. У шланга так точно, они злостные фанаты стандартов и наверно скрипели зубами от злости когда приходилось gcc-расширения реализовывать (иначе б их компилятор ни для чего не годился).
Исходная версия firkax, :
В стандарте, чувак!
Повторю: для x86 не бывает никаких incorrect alignment, проц умеет читать/писать по любому адресу (про sse см. ниже). То что про это написано в стандарте - это на случай архитектур которые так не умеют. В самом деле: ты написал код на Си с невыровненным доступом, всё прекрасно работает, даёшь его своему другу с какой-то ембеддед-архитектурой и у него оно падает с alignment trap или, ещё хуже, игнорирует младший бит адреса int16-переменной, читая её на 1 байт ниже чем она расположена по задумке программиста. Это и правда в общем случае UB - мы не можем заранее знать что там за проц будет итд. Но если речь идёт про компиляцию с уже известной x86 архитектурой, и линкуется оно к libc, написанному именно под x86, но невыравнивание указателей никакого UB не создаёт: libc знает что так можно, компилятор тоже знает, а программиста это вообще не задевает. А gcc-шный packed struct вообще получается UB by design тогда.
Но если хочешь, можешь интерпретировать это по-своему тип там страшное UB.
В любом случае, это ни на что не влияет, поскольку glibc malloc даже на 32 битах выравнивает указатели по 16 байт по другим причинам. А аллокатор 16-битного Турбо-Паскаля выравнивал по 8 (16-битный Си не видел).
Причём тут SSE?
При том что это единственная сущность в x86 процах, которая зависит от выравнивания. И то не везде, а на современных процах нет смысла генерить align-зависимый асм (на старых align-зависимая инструкция выполнялась чуть быстрее чем универсальная) так что считай уже тоже не зависит.
Как мне в стандартном C99 или C89 получить тип, у которого выравнивание больше 8?
Думаю никак.
P.S. Ты там в каком году застрял? -msse это умолчание на x86-64, SSE2 это часть описания архитектуры и SysV ABI.
Я и написал: "-msse или 64 бита". Т.к. второе включает в себя первое.
А почему эти «параноидальные настройки» включаются при -fsanitize=undefined? Выходит, что и GCC, и Clang считают, что это UB?
Не знаю. Формальности. У шланга так точно, они злостные фанаты стандартов и наверно скрипели зубами от злости когда приходилось gcc-расширения реализовывать (иначе б их компилятор ни для чего не годился).