2014-11-21 1 views
0

Я написал эту программу на C, добавив намеренную ошибку по назначению.Как я могу обнаружить «вне связанной ошибки» в программе C с GDB?

Программа вычисляет сумму в 5 чисел, введенную пользователем, и отображает результат на экране.

Я скомпилировал его с помощью «gcc -Wall -Wextra -Werror -ansi -pedantic -g» и отлично работает.

Но у него есть ошибка.

В последнем повторении цикла программа оценивает значение [N], которое не определено!

Я хотел бы знать, как определить этот вид ошибки с помощью GDB

Когда я использую «заданный диапазон проверки на» я получаю эту messange «предупреждение: текущая настройка проверки диапазона не соответствует язык «. и ничего не происходит ...

Это код для отладки:

#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++; 
    } 

} 
+1

Я бы дал valgrind выстрел, звучит как молоток для этого гвоздя;) – SBI

ответ

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 <line-nr> [condition])
  • запустить программу (run)
  • использование step или next к шагу через код
  • использование p i, чтобы проверить значение i каждый раз, когда вы попали в состоянии while, и каждый раз, когда вы используете i, как смещение (a[i])

Для получения более подробной информации, docs for gdb являются доступный. Это занимает некоторое время, но это того стоит.gdb - отличный отладчик

+0

Да, я знаю, в чем проблема. Ошибка была введена намеренно. Вопрос в том, как его можно обнаружить с помощью GDB? –

+0

@JavierMoreno: добавил быстрый ответ на мой вопрос. Это основной материал, установка точек останова, степпинг и просмотр переменных. –

+0

Спасибо! Вот что мне нужно :) –

0

Ответ на данную ошибку является то, что приращения цикла I, а затем обращается к по индексу я, без промежуточной проверки. Поэтому, когда i равно N - 1, когда он запускает цикл, он увеличивается до N и используется в массиве.

В общем, параметр gcc -fsanitize = bounds должен быть полезен для этих ошибок.

Смежные вопросы