从头开始编写 heapify 函数,得到 "stack-based buffer overrun"

Writing heapify function from scratch, getting a "stack-based buffer overrun"

我是第一次尝试实现堆排序算法,但是我在使用 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, 0, 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.

The console does open, and the output is 999 10 5 11 1012398875 2 0 1.

Could someone help me understand what is going wrong here? Thank you.

Stack of process (one of real-live uses of stack data structure, FILO queue)是内存中静态分配的地方。对于所有流程,始终很小且几乎相同。 在堆栈上,编译器仍然保存局部变量,即小的静态分配缓冲区(发生这种情况然后堆栈指针在 Linux 上移动以扩展堆栈大小,并且编译器评估堆栈上的偏移量)。 它们(缓冲区)无法正确处理(不安全的库函数,如 strcpy()) so they could be potentially overflowed (overrunned) leading to buffer overflow 漏洞。

Stack cookie AKA stack canary 是一种缓解技术,用于在攻击者尝试利用 stack buffer overflow 之类的漏洞时将顺序数据写入堆栈,但不限于(如果您从堆返回堆的堆栈枢轴但严重覆盖保存的指令指针...没关系 ;))。 如果检测到溢出,则它们会引发 SegFault。 Example link with example of exploitation.

这回答了您的直接问题(了解出了什么问题)。

现在,您应该对其进行调试,然后缩小问题范围。特问下一个问题,不再编辑