由于-fstack-protector-strong
gcc中有一个选项可以检测堆栈崩溃。但是,它不能总是检测堆栈缓冲区溢出。对于第一个函数func,当我输入多10个字符的字符串时,该程序并不总是崩溃。我的问题是哪里有办法检测堆栈缓冲区溢出。
void func()
{
char array[10];
gets(array);
}
void func2()
{
char buffer[10];
int n = sprintf(buffer, "%s", "abcdefghpapeas");
printf("aaaa [%d], [%s]\n", n, buffer);
}
int main ()
{
func();
func2();
}
堆栈上的溢出很难检测到,或者检测起来非常昂贵-选择毒药。
简而言之,当您拥有此功能时:
char a,b;
char *ptr=&a;
ptr[1] = 0;
那么这在技术上是合法的:在该函数的堆栈上分配了空间。只是非常危险。
因此,解决方案可能是在a
和之间添加一个间隙,并b
用某种模式填充该间隙。但是,好吧,实际上有些人如上所述编写代码。因此,您的编译器需要检测到这一点。
或者,我们可以创建代码已实际分配的所有字节的位图,然后检测所有代码以对照该图进行检查。非常安全,速度非常慢,会占用大量内存。从积极的方面来说,有一些工具可以帮助实现这一点(例如Valgrind)。
看看我要去哪里?
结论:在C语言中,没有自动检测许多内存问题的好方法,因为语言和API通常太草率。解决方案是将代码移入辅助函数,以严格检查其参数,始终正确无误,并具有良好的单元测试覆盖范围。
snprintf()
如果可以选择,请始终使用功能的版本。如果旧代码使用了不安全的版本,请对其进行更改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句