在我们基于GCC的C嵌入式系统中,我们使用-ffunction-sections
和-fdata-sections
选项来允许链接器在链接最终可执行文件时删除未使用的(未引用的)部分。多年来这一直很有效。
在同一系统中,大多数数据结构和缓冲区都是静态分配的(通常是文件作用域的static
-变量)。
当然,我们有bug,有时是很糟糕的bug,我们希望快速排除缓冲区溢出的可能性。
我们的一个想法是在每个bss节和data节之间放置金丝雀--每个bss节只表示一个符号(因为-fdata-sections
)。就像编译器对函数所做的那样--当Stack-Smashing和StackProtection被激活时,堆栈。检查这些金丝雀可以通过从主机“不时”读取金丝雀地址来完成。
修改链接器脚本(手动放置部分并在中间添加一个金丝雀词)似乎是可行的,但这有意义吗?
野外到底有没有项目、有没有文章?使用我的关键字,我找不到任何东西。
金丝雀对堆栈很有用,因为它的扩展和折叠超出了程序员的直接控制。您在数据/BSS上拥有的东西并不是这样的。或者它们是静态变量,或者如果它们是缓冲区,它们应该保持在固定的大小内,这应该通过与算法一起进行的防御性编程来检查,而不是非正统的技巧。
此外,堆栈金丝雀专门用于基于RAM的、类似PC的系统,这些系统不知道更好的方法。在嵌入式系统中,它们并不是很有意义。您可以做一些有用的事情来代替:
if(X==good){...}else if(x==bad){...}
缺少else
。而开关(x)大小写a:{...}
缺少默认值
。“但理论上它去不了那里!”不是,但在实际操作中,当您由于错误(很有可能)、闪存的数据保留(100%有可能)或RAM上的EMI影响(很不可能)而导致代码失控时。问题内容: 我希望这些问题很简单:(NASM编译器,Linux,x86 Intel语法) 第1部分: 我试图弄清楚如何使用Assembly程序的.bss部分来找到一种将值(例如,从操作(+-* /)的值)存储到声明的变量的方法。例如: 因此,我知道有可能使用内核intterupt来读取用户输入(但这涉及字符串),但是有没有办法将此值复制到 变量 变量中,以便以后使用?这会容易得多而不是必须要在堆栈
问题内容: 我想指定两种略有不同的背景颜色,一种用于Mac OS,一种用于Windows。 问题答案: 没有用于指定用于查看网页的操作系统的属性,但是您可以使用javascript进行检测,这是一些用于检测操作系统的示例: 知道了吗?,现在您可以编写特定操作系统的下载样式表了。:) 另一个示例,我假设您正在使用jquery。
好吧,所以我正在做这个项目,你必须做一些来自用户的输入 让我们说如果他进入 "12 3" 但他没有输入第二个输入 如果我把它叫做 如果我打电话 我有错误。我如何检查是否没有第二次输入? 公共静态void main(String [] args)引发IOException{ 如果用户输入 "3 2" 但没有进入第二个...我得到nullpointerx0016
在最近的Android版本中,自Android8.1以来,操作系统得到了越来越多的主题支持。更具体地说是黑暗主题。 尽管从用户的角度对黑暗模式有很多讨论,但几乎没有为开发人员编写的内容。 从Android8.1开始,谷歌提供了某种黑暗主题。如果用户选择有一个深色的壁纸,OS的一些UI组件会变成黑色(本文在此)。 现在在Android Q上,它似乎走得更远,但具体到什么程度还不清楚。不知何故,一个名
我不熟悉使用selenium和java实现页面对象模型自动化。我使用页面对象模型,将每个页面作为一个类,并将该页面中的操作作为方法。使用excel保存读取的测试数据。我有一个测试,可以使用各种参数来搜索客户,如客户编号、政策编号、姓氏、名字、WebReference、电子邮件等等。。。。。。现在,我必须在方法签名中提供所有参数,否则测试将失败,并出现数据提供程序不匹配错误。我有一个GetData方
问题内容: 我有一个必须在用户界面上显示的双精度值。现在的条件是double的十进制值= 0,例如。-14.0在这种情况下,我必须仅在UI上显示14。另外,此处字符的最大限制为5。 例如:-12.34整数值不能大于2位,所以double的十进制值也不能大于2位。 最好的方法是什么? 问题答案: 你可以做 检查是否整体。