如何在 GCC 中使用容器溢出错误检测?

Posted

技术标签:

【中文标题】如何在 GCC 中使用容器溢出错误检测?【英文标题】:How to use Container Overflow Bugs detection in GCC? 【发布时间】:2016-07-17 19:54:59 【问题描述】:

在EuroLLVM 2014 Kostya Serebryany presented 上进行矢量溢出检测。在幻灯片 12 上,他提供了一个指向 GCC revision 207517 的链接,在那里人们可以看到 branches/google/gcc-4_8/libstdc++-v3/。 我想知道我可以在哪个 GCC 版本上使用容器溢出错误检测? 如果它只在主干中,是在 Clang 3.9 版本中可用还是也在主干中?

【问题讨论】:

我有一个有趣的问题 - 在 MSVC 2015 中提出并强制执行某种容器溢出错误检测。在用它编译的版本中,我们所有的单元测试都失败了......所以我需要说服Linux(没有出现此错误的地方)开发人员认为这不是 Windows 问题,而是他们需要修复的代码错误。 您应该编辑问题以包含此信息,而不是在其下发表评论。 this 有帮助吗? @BaummitAugen: 没有信息与哪个最小 GCC 版本相关。 @DuckQueen 我没有使用谷歌的东西,而是链接中的东西(它还检查标准库容器上的越界访问等)。顺便说一句,你回复我的时候应该@ping我,我看到了纯属偶然。 【参考方案1】:

原始 gcc 中不提供消毒剂矢量注释,这些更改只是 google 的 gcc 分支的一部分(发布于 gcc.gnu.org)。分行说明:https://www.gnu.org/software/gcc/svn.html

google/main 这个分支包含谷歌本地补丁,这些补丁被分阶段贡献给主干。其中一些补丁要么处于审查过程中,要么尚未提出。这个分支的目的是作为一个登台平台,允许与外部开发人员协作。此分支中的补丁预计只会保留在这里,直到它们在主干中被审查和接受。该分支由 Diego Novillo 维护

提交向向量添加 AddressSanitizer 注释:

https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=207517 "对于 Google b/8513090,将 AddressSanitizer 注释添加到 std::vector":

https://gcc.gnu.org/viewcvs/gcc/branches/google/gcc-4_8/libstdc%2B%2B-v3/include/bits/vector.tcc?r1=207517&r2=207516&pathrev=207517

我们可以从提交中获取注解的名称:

 // When sanitizer annotataions are off, avoid bazillion of no-op
 // functions that blow up debug binary size.
 #define __sanitizer_vector_annotate_new()
 #define __sanitizer_vector_annotate_delete()
 #define __sanitizer_vector_annotate_increase(a)
 #define __sanitizer_vector_annotate_shrink(a)

现在 GNU 的主干版本 vector.tcc 或 stl_vector.h 中没有 sanitizer 注释(搜索“sanitizer”):

https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/vector.tcc https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/stl_vector.h

邮件列表 gcc-patches 中的线程:https://gcc.gnu.org/ml/gcc-patches/2014-05/msg02180.html“检测 std::vector 中的“容器溢出”错误”,来自:Konstantin Serebryany,2014 年 5 月 26 日。

【讨论】:

以上是关于如何在 GCC 中使用容器溢出错误检测?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 gcc 中检测 CPU id

如何在 c / c++ 程序中检测可能/潜在的堆栈溢出问题?

如何关闭 gcc 编译器优化以启用缓冲区溢出

如何在颤动中使用列中的文本时删除文本溢出

gcc地址清理程序核心转储出错

您如何在运行时使用 GCC 和内联 asm 检测 CPU 架构类型?