如何修复 Visual Studio 中的堆栈溢出错误?

时间:2021-03-21 20:51:52

标签: c buffer-overflow

当我尝试在 Visual Studio 2019 中调试下面列出的代码时,我在 main 函数的系统暂停行之前收到堆栈 cookie 缓冲区溢出错误。我不知道如何解决它。我是编程新手,不知道该怎么做。有人可以帮我理解吗?

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <stdlib.h>

/************************************************************************************/
int Greater(int na, int nb);
void DisplayArray(int arr[], int asize);
/************************************************************************************/


/************************************************************************************/
int main(void)
{

    int myArray[10] = { 43, 24, 76, 11, 37, 34, 55, 49, 5 };  /* initialize an array */
    int asize = 10;  /* set the size of the above array */

    int na, nb;
    int result;

    printf("Enter 2 integers\n");
    scanf("%d %d", &na, &nb);/* the variables were missing the & in the scanf function call*/
    result = Greater(na, nb);

    fprintf(stdout, "na = %d nb = %d greater = %d\n", na, nb, result);

    ModifyArray(myArray, asize);
    fprintf(stdout, "Array after modification\n");
    DisplayArray(myArray, asize);


    system("pause");
    return 0;
}

/***************************************************************************************
This function returns the larger of its two arguments
***************************************************************************************/
int Greater(int na, int nb) {

    if (na >= nb)
        return na;
    else
        return nb;
}

/***************************************************************************************
This function modifies the elements of an array
***************************************************************************************/
int ModifyArray(int arr[], int asize) {
    int i;

    /* Add 5 to each element of array */
    for (i = 0; i <= asize; i++); {
        arr[i] += 5;
    }
}

/***************************************************************************************
Display function
/***************************************************************************************/
void DisplayArray(int arr[], int asize) {
    int i;

    for (i = 0; i < asize; i++) {
        fprintf(stdout, "i = %d arr[i] = %d\n", i, arr[i]);
    }

1 个答案:

答案 0 :(得分:0)

基于堆栈的 cookie 的问题通常意味着您试图在存储在堆栈中的缓冲区之外写入(通常,局部变量存储在堆栈中)并覆盖了 Visual Studio 插入的值检测这些类型的错误(因为堆栈中的缓冲区覆盖会导致应用程序中的可利用漏洞)。如果您的代码行为正确,则 cookie 不会被修改,您也不会遇到此错误。

正如 Ron 所评论的,问题出现是因为您正在访问 ModifyArray 中的 arr[10]。不是因为阅读它,而是因为您正在更新值。请记住,由于数组是基于 0 的,因此大小为 10 的数组在索引 10 处没有元素,因此 ModifyArray 中的循环走得太远并最终修改了 cookie。事实上,请注意您在 DisplayArray 中有一个不同的循环条件(这是正确的)。

相关问题