“具有自动存储持续时间的运行时大小的数组(N3639)”的(已接受)提案断言
堆栈溢出变得更有可能,特别是如果大小取决于外部输入并且没有正确检查。因此,某些环境可能会禁止使用该功能。使用静态分析工具可以轻松执行此类禁止。
如果需要分析器实现完整的 C++ 编译器,我认为执行起来并不容易。
考虑以下代码:
template<typename T>
inline void array_user( const T& x )
{
int a[f(traits<T>::omega)];
}
在我看来,每次使用都需要重复分析array_user<T>
并考虑:
traits<T>
在使用点可发现的适用专业化array_user<T>
- 是否
traits<T>::omega
是编译时常量表达式(通过constexpr
或 C++03 方法,例如enum
) - 的类型
traits<T>::omega
f()
(在使用点array_user<T>
并且可能通过 ADL 找到)的适用过载是否是constexpr
我错过了什么吗?是否可以在不经过完整编译的情况下强制执行这样的限制?
可以以这样一种方式编写代码来简化不使用运行时边界的验证吗?