使用GCC时clang-tidy的altera-struct-pack-align检查是否存在Bug?
altera-struct-pack-align Suggestion Conflicts with GCC Warning (Possible Bug) 我在GCC环境下测试clang-tidy的全量检查时,碰到了一个奇怪的矛盾情况——clang-tidy给出的修复建议居然和GCC的编译器警告冲突,我怀疑这是clang-tidy的一个bug。
最小复现代码
struct a{ virtual void func()=0; virtual void func2()=0; }; struct b:a{ void func() override {}; void func2() override {}; private: int x{}; }; int main(){ b b_item; }
clang-tidy的检查输出
/home/main.cpp:7:8: note: use "attribute((aligned(0)))" to align struct 'a' to 0 bytes
struct a{
^
/home/main.cpp:13:8: warning: accessing fields in struct 'b' is inefficient due to padding; only needs 4 bytes but is using 16 bytes [altera-struct-pack-align]
struct b:a{
^
修复后的代码及GCC警告
按照clang-tidy的建议添加属性后,关键代码变为:
struct a{ virtual void func()=0; virtual void func2()=0; } __attribute__((aligned(0)));
此时GCC立刻触发了属性警告:
warning: requested alignment ‘0’ is not a positive power of 2 [-Wattributes]
12 | } attribute((aligned(0)));
问题分析
GCC对__attribute__((aligned(n)))有明确要求:n必须是正的2的幂。但clang-tidy的altera-struct-pack-align检查却建议使用aligned(0),这完全不符合GCC的语法约束,导致修复后的代码反而出现编译器警告。显然这是clang-tidy该检查规则的一个疏漏,没有考虑GCC环境下对对齐属性的限制。
内容的提问来源于stack exchange,提问作者Spyros Mourelatos

