自动检查std :: vector中的边界

时间:2017-12-30 15:43:42

标签: c++ stdvector undefined-behavior

在使用std::vector的类的主动开发期间,通常会发生索引超出范围的情况。 (有关实际示例,请参阅this code review question。)使用operator[]时,会导致未定义的行为。尽管如此,[]语法比编写.at()更容易阅读。

因此,我想使用[]运算符编写代码,但同时启用了边界检查。在测试代​​码之后,应该很容易删除边界检查。

我正在考虑以下代码:

util::bound_checked<std::vector<int>> numbers;

numbers.push_back(1);
numbers.push_back(2);
numbers.push_back(3);
numbers.push_back(4);
std::cout << numbers[17] << "\n";

对我来说,这个实用程序模板似乎是如此简单,以至于我希望它存在。可以?如果是这样,以哪个名字?

4 个答案:

答案 0 :(得分:7)

我不认为这样的事情存在,但创建相当容易:

result

[Live example]

请注意,上面实际上使用了一种不鼓励的做法,即从标准容器(为其设计)的公共继承。我对你的问题的理解是这个包装器只能用于测试目的,这很好。但是,如果您希望将其保留在生产中并且希望处于非常安全的一面,请使用非公共继承:

template <class Container>
struct bound_checked : public Container
{
  using Container::Container;

  auto operator[] (typename Container::size_type i) -> decltype(this->at(i))
  { return this->at(i); }

  auto operator[] (typename Container::size_type i) const -> decltype(this->at(i))
  { return this->at(i); }
};

答案 1 :(得分:3)

  

对我来说,这个实用工具模板似乎是如此直截了当   期待它存在

对于gcc它确实存在。 gcc libstdc ++有一组调试容器。对于std::vector,它具有__gnu_debug::vector调试容器。请参阅documentation

答案 2 :(得分:2)

如果您将GCC(或MinGW)与libstdc ++一起使用,#define _GLIBCXX_DEBUG将执行您想要的操作。

或者甚至更好,用旗帜定义它:-D_GLIBCXX_DEBUG

答案 3 :(得分:1)

  是吗?如果是这样,以哪个名字?

我很确定它确实存在。如果启用了编译器内部std::vector<T>::at()构建宏,许多编译器会将std::vector::operator[]()作为__DEBUG的实现。

  

因此,我想使用[]运算符编写代码,但同时启用了边界检查。在测试代​​码之后,应该很容易删除边界检查。

关于命名,我会说 debug release 构建。在没有__DEBUG定义的情况下编译代码时,将删除检查。