簡體   English   中英

我的數組程序中出現這個stack smashing錯誤的原因是什么?

[英]What is the reason for this stack smashing error in my array program?

我有一個數組,它插入一個值並移動元素。 雖然它可以編譯,但我有一些警告。 這是我的代碼:

#include <iostream>

void display_array(int arr[], int max_length = 10);
void insert_array(int arr[], int insert_num, int index_num, int max_length = 10);

int main() {
    
    int arr_length = 10;
    int new_score, index;
    int test_scores[arr_length] = {86, 71, 92, 84, 88, 96};

    display_array(test_scores);

    std::cout << "Enter new test score: ";
    std::cin >> new_score;

    std::cout << "\nEnter index position: ";
    std::cin >> index;

    insert_array(test_scores, new_score, index);
    display_array(test_scores);

    return 0;
}

void display_array(int arr[], int max_length) {
    std::cout << "Test scores in array: ";
    for(int i = 0; i < max_length; i++) {
        std::cout << arr[i] << " ";
    }
    std::cout << "\n";
}

void insert_array(int arr[], int insert_num, int index_num, int max_length) {
    for(int i = max_length; i > index_num; i--) {
        arr[i] = arr[i - 1];
    }
    arr[index_num] = insert_num;
}

在 VS Code 中,我收到警告:“變量“test_scores”可能未初始化 C/C++ (145)”

我將我的 'arr_length' 變量更改為常量並且它消失了,但是盡管我的代碼在更改后仍然可以編譯並執行其所有功能,但在我的程序結束時我得到

*** stack smashing detected ***: terminated
Aborted (core dumped)

gdb 給了我這樣的東西:

Program received signal SIGABRT, Aborted.
0x00007ffff7acd615 in raise () from /usr/lib/libc.so.6

我檢查了這個鏈接進程何時獲得 SIGABRT(信號 6)? 這似乎是一個 memory 問題。 但是當我查看我的數組和 for 循環的結構時,它們似乎在邊界內,而且看起來我並沒有嘗試訪問不存在的東西……是什么導致了這個錯誤?

你的代碼這樣做

for(int i = max_length; i > index_num; i--) {
    arr[i] = arr[i - 1];
}

其中max_length等於 10。但您的數組大小為 10,因此最大有效索引為 9。更改為

for(int i = max_length - 1; i > index_num; i--) {
    arr[i] = arr[i - 1];
}

當程序向位於堆棧上的緩沖區寫入比實際分配給該緩沖區的數據更多的數據時,就會導致堆棧緩沖區溢出錯誤。 gcc增加了檢測堆棧溢出錯誤的保護機制。

gcc編譯器添加了稱為金絲雀的保護變量,這些變量具有已知值。 如果您寫入超出分配的 memory,金絲雀的值會發生變化。這將觸發堆棧粉碎(修改金絲雀變量)。

for(int i = max_length; i > index_num; i--) 
{
    arr[i] = arr[i - 1];
}

在這里, max_length = 10 ,所以arr[i]意味着arr[10]超出了數組的大小。 您實際上是在越界訪問 memory。這將修改 canary 變量的值。 這就是為什么您遇到堆棧粉碎錯誤的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM