首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对bss或数据段使用金丝雀来检测溢出/破坏有用吗?

对bss或数据段使用金丝雀来检测溢出/破坏有用吗?
EN

Stack Overflow用户
提问于 2020-01-28 22:58:44
回答 1查看 101关注 0票数 0

在基于GCC的C嵌入式系统中,我们使用-ffunction-sections-fdata-sections选项来允许链接器在链接最终可执行文件时删除未使用(未引用)的部分。多年来,这种方法运行得很好。

在同一系统中,大多数数据结构和缓冲区都是静态分配的(通常作为文件范围内的static-variables )。

当然,我们有bug,有时很糟糕,我们希望快速排除缓冲区溢出的可能性。

我们的一个想法是在每个bss-section和data-section之间放置金丝雀-每个金丝雀只表示一个符号(因为-fdata-sections)。就像当堆栈粉碎和StackProtection被激活时,编译器对函数堆栈所做的那样。通过“不时”读取金丝雀地址,可以从主机检查这些金丝雀。

似乎修改链接器脚本(手动放置部分并在其间添加一个金丝雀单词)似乎是可行的,但它有意义吗?

有没有一个项目或一篇文章?使用我的关键字,我什么也找不到。

EN

回答 1

Stack Overflow用户

发布于 2020-01-29 00:14:14

金丝雀对堆栈最有用,因为它的展开和折叠超出了程序员的直接控制。你在data/bss上的东西并不是这样的。它们要么是静态变量,要么是缓冲区,它们应该保持在固定的大小内,这应该通过防御性编程与算法就地进行检查,而不是非正统的技巧。

此外,堆栈金丝雀专门用于基于RAM的、类似PC的系统中,这些系统不知道更好的方法。在嵌入式系统中,它们没有多大意义。你可以做一些有用的事情:

  • Memory映射堆栈,以便堆栈增长为写入会产生硬件异常的内存区域。例如,如果您的MCU有能力将可执行内存与数据内存分开,并在您尝试在数据区域执行代码或写入可执行区域时产生异常。
  • 确保程序中处理缓冲区的所有内容都执行错误检查,而不是写入越界。静态分析工具通常可以很好地发现边界外的bug。甚至一些编译器也能做到这一点。
  • 增加了很多带有静态断言的防御性编程。在编译时检查结构、缓冲区等的大小,这是免费的。
  • 运行时防御性编程。例如,if(x==good) {...} else if(x == bad) {... }缺少else。而且switch(x) case A: { ... }少了一个default。“但从理论上讲,它不能去那里!”不是,但在实践中,当错误(很可能)、闪存的数据保留(100%可能)或内存上的电磁干扰影响(相当于unlikely).
  • And so on.

)导致代码失控时

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59951505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档