Слышен звон адресов из malloc-а
Mar. 1st, 2019 05:26 pmПопробовал собрать наш продукт clang-ом под 32-битный arm. Получил несудьбу.
clang предлагает довольно агрессивную реализацию memset/memcpy и родственников, которая требует выравнивания памяти по 16 байтам минимум, иначе прилетает SIGBUS.
Доверчивый clang поверил, что структура выравнивается по 16 байтам. После того, как я перестал его обманывать, он подставил правильную версию memset.
Память, которую он должен зачищать, прилетает извне. При этом полученный блок оказывается выровнен по 8 байтам. То есть в половине случаев это окажется по 16 и всё сработает, а в половине - по 8, и получим SIGBUS.
Гранулировать выравнивание адресов из malloc-а вообще говоря нельзя. Точнее, есть несколько функций, в работоспособности которых я сомневаюсь, и тип max_align_t, который определяется как
а в GCC это __BIGGEST_ALIGNMENT__
То «извне», из которого прилетает это самое __BIGGEST_ALIGNMENT__, я могу и пересобрать. Но вообще печально я гляжу.
Доверчивый 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__, я могу и пересобрать. Но вообще печально я гляжу.
no subject
Date: 2019-03-01 02:42 pm (UTC)А нету у clang ручки "использовать работоспособную реализацию memset вместо оптимизированной"?
no subject
Date: 2019-03-01 02:47 pm (UTC)Ручку не нашёл.
no subject
Date: 2019-03-01 02:50 pm (UTC)no subject
Date: 2019-03-01 03:06 pm (UTC)no subject
Date: 2019-03-01 02:48 pm (UTC)clang-и они разные бывают.
И еще - а если между memcpy и скобочкой, заключающей список параметров, пробел поставить?
no subject
Date: 2019-03-01 03:07 pm (UTC)no subject
Date: 2019-03-01 02:55 pm (UTC)no subject
Date: 2019-03-01 08:58 pm (UTC)Но не нашёл. А к атрибуту __aligned__ он на ARM относится очень серьёзно. Так что косяк по любому был у меня.