Home > Blockchain >  C program in CLion runs perfectly in Debug mode but returns exit code -1073741819 (0xC0000005) when
C program in CLion runs perfectly in Debug mode but returns exit code -1073741819 (0xC0000005) when

Time:12-08

I am doing the Advent of Code, and I am trying to do it all in C. I am currently on day three, and I kind of solved it, but as the title says it behaves very strangely in my IDE CLion. Here is the objective. I would very much like to know why it is not running properly, and finding out why appears to be beyond my capability. This is my code:

//
// Created by gusta on 2022-12-06.
//
#include "aocio.h"
#include <string.h>

int cexists(char* cp, char c, int length);
char getDuplicate(char* line);

int main() {

    FILE* fptr = openFile("../Inputs/day3.txt");

    char* line;
    while (readLine(fptr, &line)) {
        char c = getDuplicate(line);
        putchar(c);
    }

    return 0;
}

char getDuplicate(char* line) {  // Returnerar STRING_END om ingen fanns

    unsigned int length = strlen(line);

    char letters[length/2];
    char* cp = &letters[0];

    for (int i = 0; i < length/2; i  ) {
        letters[i] = ' ';
    }

    for (int index = 0; line[index] != STRING_END; index  ) {

        if (index < length/2) {

            int i_char = cexists(letters, line[index], length/2);
            if (i_char == -1) {
                *cp = line[index];
                cp  ;
            }
        }
        else {
            if (cexists(letters, line[index], length/2) != -1) {
                return line[index];
            }
        }
    }

}

int cexists(char* cp, char c, int length) {

    for (int i = 0; i < length; i  ) {
        if (cp[i] == c) {
            return i;
        }
    }
    return -1;
}

Here is aocoi.h (advent of code input output.h):

//
// Created by gusta on 2022-12-01.
//

#ifndef ADVENTOFCODE_AOCIO_H
#define ADVENTOFCODE_AOCIO_H

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define SIGN_ASCII 45
#define TRUE 1
#define FALSE 0

#endif //ADVENTOFCODE_AOCIO_H
#define STRING_END '\0'
#define NUMBERS_ASCII 48



char* prompt(const char* question) {
    printf(question);

    char* string = malloc(1);
    int curChar = 0, index = 0;
    while (curChar != '\n') {
        curChar = getchar();
        if (curChar == '\n'){
            string[index] = STRING_END;
        }
        else{
            if (index > 0) {
                string = (char*) realloc(string, index 1);
            }
            string[index] = curChar;
        }
        index  ;
    }
    return string;

}

FILE* openFile(const char* fileName) {
    FILE *fptr;
    fptr = fopen(fileName, "r");
    if (fptr == NULL) {
        printf("Big fat file error!!\n");
        fclose(fptr);
        getchar();
        exit(-1);
    }

    return fptr;
}

char readLine(FILE* fptr, char** line) {
    int index = 0, end = 0;
    char* string = (char *) malloc(1);
    char curChar;

    do {
        end = fscanf(fptr, "%c", &curChar);

        if (end == EOF) {
            string[index] = STRING_END;
            fclose(fptr);
            *line = string;
            return FALSE;
        }

        if (curChar == '\n') {
            string[index] = STRING_END;
            *line = string;
            return TRUE;
        }
        else {
            if (index > 0) {
                string = (char *) realloc(string, index   1);
            }
            string[index] = curChar;
            index  ;
        }
    } while (end != EOF);
}

int parseToInt(char* string) {

    int numberLength = 0, number = 0;
    int sign = FALSE;

    for (int index = 0; string[index] != STRING_END; index  ) {
        numberLength  ;
    }

    for (int index = numberLength-1; index >= 0; index--) {

        char curChar = string[index];
        if (index == 0 && curChar - SIGN_ASCII == 0) {
            sign = TRUE;
            continue;
        }
        if (curChar - NUMBERS_ASCII >= 0 && curChar - NUMBERS_ASCII <= 9) {
            int num = (int) (curChar - NUMBERS_ASCII);
            num *= (int)(pow(10, numberLength-index-1));
            number  = num;
        }
        else {
            printf("Felaktig inmatning. parseInt kan bara ta in tal"); // Invalid input. parseInt can only take in numbers
            getchar();
            exit(-1);
        }
    }
    if (sign == TRUE) {
        number *= -1;
    }
    return number;
}

Through searching the web I found that the error code should mean stack overflow (ha!) or something like that, but I cannot for the life of me find any place in my code where that could occur. All pointers and stuff should be automatically freed - is there something I have missed?

CodePudding user response:

In readLine():

if (index > 0) {
    string = (char *) realloc(string, index   1);
}
string[index] = curChar;

After this section, the buffer has size index 1, therefore string[index] is the last element you can write to. Afterwards, you do

index  ;

Now, writing to string[index] is out of bounds, resulting in a buffer overflow. This is what happens when an EOF or EOL is detected.

  • Related