如何解决从头开始编写 heapify 函数,获得“基于堆栈的缓冲区溢出”
我是第一次尝试实现堆排序算法,但是我在使用 heapify 函数时遇到错误。
Unhandled exception at 0x0005369A in heapify.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.
控制台打开,输出为 999 10 5 11 1012398875 2 0 1
。
有人能帮我理解这里出了什么问题吗?谢谢。
#include <iostream>
// given the address of element 0 of an array,and a non-zero index k,heapify assumes that the L/R subtrees
// of node k are max heaps. But the subtrees combined with node k do not necesarily form
// a max heap. heapify interchanges the value at node k with the value of one of its children,// and then calls itself on the subtree in question
int heapify(int* n,int k,int sizeOfheap)
{
// terminate the function if the input "node" is not actually a node
if (k > sizeOfheap)
{
return 0;
}
int root = *(n + k); // value of kth node
int leftChild = *(n + 2 * k); // value of left chold
int rightChild = *(n + 2 * k + 1); // value of right child
if (root < leftChild)
{
// swap value of kth node with value of its left child
int temp = root;
*(n + k) = leftChild;
*(n + 2 * k) = root;
// call heapify on the left child
heapify(n,2 * k,sizeOfheap);
}
else
{
// swap value of kth node with value of its right child
int temp = root;
*(n + k) = rightChild;
*(n + 2 * k + 1) = root;
// call heapify on right child
heapify(n,2 * k + 1,sizeOfheap);
}
}
int main()
{
// arr is the array we will heapify. 999 is just a placeholder.
// The actual (almost) heap occupies indices 1 - 7
int arr[8] = {999,3,10,11,5,2,1};
int sizeOfheap = 8;
heapify(arr,1,sizeOfheap);
// print out arr
int i;
for (i = 0; i <= 7; i++)
{
std::cout << arr[i] << std::endl;
}
}
解决方法
Unhandled exception at 0x0005369A in heapify.exe: Stack cookie instrumentation code detected a stack-based buffer overrun.
控制台打开了,输出是999 10 5 11 1012398875 2 0 1。
有人能帮我理解这里出了什么问题吗?谢谢。
Stack 进程(stack data structure,FILO queue 的实际用途之一)是内存中用于静态分配的位置。对于所有进程,始终很小且大小基本相同。 在堆栈上,编译器仍然保存局部变量,即小的静态分配的缓冲区(发生这种情况时,堆栈指针在 Linux 上移动以扩展堆栈大小,编译器评估堆栈上的偏移量)。 它们(缓冲区)无法正确处理(不安全的库函数,例如 strcpy()),因此它们可能会溢出(溢出),从而导致 buffer overflow 漏洞。
Stack cookie AKA stack canary 是一种缓解技术,用于在攻击者尝试利用 stack buffer overflow 等漏洞时在堆栈上写入顺序数据,但不限于(如果您将堆栈从堆转回堆但严重覆盖保存的指令指针...没关系;))。 如果检测到溢出,则它们会引发 SegFault。 Example link with example of exploitation.
这回答了您的直接问题(了解出了什么问题)。
现在,您应该对其进行调试,然后缩小问题的范围。尤其要问下一个问题,不要再次编辑。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。