【问题标题】:How can i detect "out of bound error" in C program with GDB?如何使用 GDB 检测 C 程序中的“越界错误”?
【发布时间】:2015-01-19 19:26:16
【问题描述】:

我用 C 语言编写了这个程序,故意添加了一个错误。

程序计算用户输入的5个数字的总和,并将结果显示在屏幕上。

我用“gcc -Wall -Wextra -Werror -ansi -pedantic -g”编译它并且工作正常。

但它有一个错误。

在循环的最后一次重复中,程序计算 a[N],它没有定义!

我想知道如何使用 GDB 发现这种错误

当我使用“set check range on”时,我收到此消息“警告:当前范围检查设置与语言不匹配。”什么都没有发生...

这是要调试的代码:

#define N 5
#include <stdio.h>


void read(float*);


int main(void) {

    float a[N], s;

    int i;

    printf("Enter %d numbers: ", N);
    read(a);

    i = -1; 
    s = 0;

    while (i != N) {
        i = i + 1;
        s = s+a[i];
    }

    printf("The sum is : %.2f \n", s);

    return 0;
}


void read(float*a) {

    int n = 0;

    while (n!=N) { 
        scanf("%f",&a[n]);
        n++;
    }

}

【问题讨论】:

  • 我会给 valgrind 一个机会,听起来就像是钉子的锤子;)

标签: c arrays debugging gdb


【解决方案1】:

我认为这是你的问题:

while (i != N) {
    i = i + 1;
    s = s+a[i];
}

N定义为5,所以当i为4时,条件为真。然后i 增加到 5,并执行s += a[i];。只需使用for 循环,或使用do {} while

for (i=0;i<N;++i)
    s += a[i];
//or
i = 0;
do {
   s += a[i];
} while (++i != N);

无论如何。就个人而言,我发现for 循环更具可读性


回答您的问题(使用 gdb):

  • 您已使用 -g 标志进行编译,因此请运行 `gdb compiled_file_name
  • 在 gdb 中,在while 循环中设置断点 (b &lt;line-nr&gt; [condition])
  • 启动程序 (run)
  • 使用stepnext 单步调试代码
  • 每次遇到while条件时,使用p i检查i的值,每次使用i作为偏移量时(a[i]

如需了解更多详情,请联系docs for gdb。这需要一些时间,但非常值得。 gdb 是一个优秀的调试器

【讨论】:

  • 是的,我知道问题出在哪里。该错误是故意引入的。问题是如何使用 GDB 来检测它?
  • @JavierMoreno:在我的回答中添加了快速操作方法。这是基本的东西,设置断点,步进和查看变量
  • 谢谢!这就是我需要的:)
  • @JavierMoreno:添加了 gdb 文档的链接。 PS:如果您找到解决问题的答案(或回答您的实际问题),请不要发布 "thank you" cmets,而是 mark the answer as accepted。这是表达感谢的方式 + 你会得到额外的 2 个代表
【解决方案2】:

这个特定错误的答案是循环递增 i,然后在索引 i 处访问 a,而没有干预检查。因此,当 i 在开始循环时等于 N - 1 时,它会递增到 N 并在数组中使用。

一般来说,gcc 的 -fsanitize=bounds 选项应该有助于解决这些错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 2022-01-13
    • 2015-01-10
    • 2014-10-31
    • 2022-08-24
    相关资源
    最近更新 更多