这种攻击在大型项目中尤为隐蔽——攻击者可将 Deep 包装在一个看似合理的 trait 中,使之在 SFINAE 或类型列表中展开。
constexpr 循环与编译时 CPU 耗尽
constexpr 循环比模板递归更直接:它允许在编译期执行任意次数的迭代,编译器必须逐次求值,消耗 CPU 时间。
constexprunsignedlonglongbomb(){
unsignedlonglong sum = 0;
for (unsignedlonglong i = 0; i < 100000000ULL; ++i) {
sum += i;
}
return sum;
}
constexprauto x = bomb(); // 编译期计算,可能需要数分钟
若在头文件中放置此类 constexpr 变量,每个包含该头文件的翻译单元都会独立执行一次循环,将并行编译任务的总 CPU 时间推向不可接受的水平。