Условный прыжок или ход - Valgrind - PullRequest
0 голосов
/ 08 апреля 2020

Я пишу программу, которая читает команды из текстового файла и создает adt на их основе. При отладке с помощью valgrind я получаю много ошибок, говорящих о том, что я использую унифицированные переменные. Один из которых выглядит следующим образом

Conditional jump or move depends on uninitialised value(s)
==5189==    at 0x4838DD0: strcpy (vg_replace_strmem.c:512)
==5189==    by 0x109A28: reduce_space (in /home/jacob/CIS2500/Ass/Ass4/a4q2)
==5189==    by 0x10953A: main (in /home/jacob/CIS2500/Ass/Ass4/a4q2)
==5189==  Uninitialised value was created by a heap allocation
==5189==    at 0x483577F: malloc (vg_replace_malloc.c:299)
==5189==    by 0x109925: reduce_space (in /home/jacob/CIS2500/Ass/Ass4/a4q2)
==5189==    by 0x10953A: main (in /home/jacob/CIS2500/Ass/Ass4/a4q2)

Эта ошибка, похоже, указывает на функцию redu_space:

char* reduce_space(char** string){
    char* input = malloc(sizeof(char)*BUFFER);
    char* new=malloc(sizeof(char)*BUFFER);
    strcpy(input, *string);
    int space = 0;
    int i = 0;
    int j = 0;
    int count = 0;


    while(input[i]!='\0'){
        if(input[i]==32){
            j=i+1;
            if(input[j]!='\0'){
                while(input[j]==32&&input[j]!='\0'){
                    i++;
                    j++;
                }
            }
        }
        new[count]=input[i];
        i++;
        count++;
    }
    new[i]='\0';
    strcpy(*string, new);
    free(input);
    free(new);
    return(*string);
}

Я не совсем понимаю, где находится неинициализированная переменная. Я объявляю input и new неправильно?

Пример того, как это называется:

#include "header.h"

int main(){
    int i;

    FILE* input = fopen("inputfile.input", "r");

    int max = file_size(input);
    char** command = malloc((sizeof(char*)) * max);

    for(i=0;i<max;i++){
        command[i] = malloc((sizeof(char))*BUFFER);
        fgets(command[i], BUFFER, input);
    }

    i = 0;
    while(command[i][0]!='\0'){
        reduce_space(&command[i]);
        i++;
    }
    return(0);
}

1 Ответ

0 голосов
/ 08 апреля 2020

Когда fgets() читает строки, он не удаляет завершающие \n новые строки. Каждая строка в вашем файле, за исключением, возможно, последней, будет иметь \n в конце, даже пустые строки. Это означает, что command[i][0]!='\0' не обнаружит их пустыми, а l oop будет работать дольше, чем следовало.

Возможные исправления:

  • Проверьте и \n, и \0.
  • Обрезать символы новой строки в первом for l oop.
  • Остановить l oop, если i >= max.
  • Объединить два цикла , Вы можете позвонить reduce_space() сразу после fgets() в том же l oop.
...