6

“具有自动存储持续时间的运行时大小的数组(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

我错过了什么吗?是否可以在不经过完整编译的情况下强制执行这样的限制?

可以以这样一种方式编写代码来简化不使用运行时边界的验证吗?

4

1 回答 1

1

如果我的任务是编写一个分析器来静态验证不使用运行时边界,我会拒绝上面的代码。我将要求所有数组声明要么使用整数文字作为边界,要么进行注释以使编译器拒绝运行时边界。

template<typename T>
inline void array_user( const T& x )
{
    int a[f(traits<T>::omega)];
    sizeof a;
}

但是,考虑到目前在 C++ 模式下提供 C99 样式 VLA 作为扩展的编译器的数量,我不确定它们是否真的符合 C++14 的 forbidding 行为sizeof

于 2013-08-01T20:50:37.373 回答