首页 > 解决方案 > 你们能帮我用gcc调试一个简单的c程序并让它工作吗?(学生问题..)

问题描述

大家好,我的问题是你能帮我用 gcc 调试一个简单的 c 程序并让它工作吗?

老师给了我这段代码,我应该调试它并让它工作,我试过但没有任何帮助我做不到。

我用它编译了g++ -g double_free.c -o double_free

程序崩溃。

这是代码:

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

#define ARRAY_SIZE 100000
int main(int argc, char* argv[])
{
        int i, test=5;
        int* buf = new int[100000];
        for (i=0; i< ARRAY_SIZE; i++){
               buf[i] = i;
       }
       int result = 0;
       delete []buf;

       printf("result: %d\n", result);
       delete[] buf;
       printf("test %d\n", test);
       return 0;
}

在此处输入图像描述

标签: c++linuxdebugginggcc

解决方案


这是我对此代码的投诉清单:

  • 你删buf了两次。这确实是我能看到的唯一需要实际调试的项目。事实上,这个练习的名称对于有double_free经验的编码人员来说是一个致命的赠品,那就是这就是问题所在。

最重要的是:

  • 您应该是 C 编码器或 C++ 编码器,而不是 C+ 编码器(那个奇怪的变体似乎没有完全过渡)。除了要在 C 和 C++ 环境中编译的代码之外,没有理由 C++ 程序应该使用旧的 C 头文件和函数(例如stdio.hprintf)。

  • 您应该在需要该数组大小的所有地方使用ARRAY_SIZE否则您可能会在一个地方而不是另一个地方更改它。

  • 变量的范围应尽可能紧密。换句话说,摆脱当前的i声明,只使用for (int i = ....

  • 既没有result也没有test改变,也没有buf用于任何事情,所以你的整个程序归结为std::cout << "result: 0\ntest 5\n";.

  • 如果您不使用它们,那么argv/c在您的声明中添加它们几乎没有意义,只需使用.mainint main()

  • 摆脱原始指针并开始使用智能指针是个好主意——它们可以在超出范围时自动释放自己,从而更容易进行内存管理。


推荐阅读