Доверчивый clang поверил, что структура выравнивается по 16 байтам. После того, как я перестал его обманывать, он подставил правильную версию memset.
Память, которую он должен зачищать, прилетает извне. При этом полученный блок оказывается выровнен по 8 байтам. То есть в половине случаев это окажется по 16 и всё сработает, а в половине - по 8, и получим SIGBUS.
Гранулировать выравнивание адресов из malloc-а вообще говоря нельзя. Точнее, есть несколько функций, в работоспособности которых я сомневаюсь, и тип max_align_t, который определяется как
// Define 'max_align_t' to match the GCC definition. typedef struct { long long __clang_max_align_nonce1 __attribute__((__aligned__(__alignof__(long long)))); long double __clang_max_align_nonce2 __attribute__((__aligned__(__alignof__(long double)))); } max_align_t;
а в GCC это __BIGGEST_ALIGNMENT__
То «извне», из которого прилетает это самое __BIGGEST_ALIGNMENT__, я могу и пересобрать. Но вообще печально я гляжу.
This entry was originally posted at https://beldmit.dreamwidth.org/875130.html. Your comment? (