【问题标题】:Safe Versions of STL on LinuxLinux 上的 STL 安全版本
【发布时间】:2016-08-15 15:56:36
【问题描述】:

The C++ Standard Library - A Tutorial and Reference, 2nd Edition 指的是STL 的安全版本,它支持各种实用程序,例如operator [] 和其他运算符的运行时边界检查。例如,在 p247 上:

因此,使用“安全”STL 是一个好主意,至少在软件期间 发展。 Cary Horstmann 介绍了安全 STL 的第一个版本(参见 [SafeSTL])。另一个例子是“STLport”,它是 几乎所有平台均可免费使用 [STLPort]。此外, 图书馆供应商现在提供标志以启用“更安全”的模式, 尤其应该在开发过程中启用。

这两个建议的软件包似乎都比较过时(最后一次开发是在 2008 年),并且不包含更新的 C++11/14 功能。 Linux 上的一些主要编译器(gccclang)或作为独立库是否有更新的知名实现?

【问题讨论】:

  • 你能真正引用它所说的地方吗?我认为它可能建议使用at 而不是operator[],因为at 会检查operator[] 没有的地方。

标签: c++ gcc stl clang


【解决方案1】:

libstdc++有一个debug mode,可以通过在编译时定义_GLIBCXX_DEBUG来启用。

libstdc++ 调试模式对 C++ 标准的许多领域进行检查,但重点是检查标准迭代器、容器和算法之间的交互,包括:

  • 安全迭代器:迭代器跟踪它们所引用的元素的容器,因此诸如递增过去的迭代器或取消引用指向已被破坏的容器的迭代器之类的错误是立即确诊。

  • 算法前置条件:算法尝试验证其输入参数以尽早发现错误。例如,set_intersection 算法要求其迭代器参数first1last1 构成一个有效的迭代器范围,并且序列[first1, last1) 根据传递给set_intersection 的相同谓词进行排序;如果序列未排序或由不同的谓词排序,libstdc++ 调试模式将检测到错误。

边界检查operator[]is included

【讨论】:

  • 我在几个地方读到过enabled by defining _GLIBCXX_DEBUG,但确切地说是什么意思?我是否通过命令行将-D_GLIBCXX_DEBUG 传递给编译器?
  • @shuhalo 是的! -
猜你喜欢
  • 2017-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-14
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多