Incrementing one number crashes my JSON Interpreter, written in C

Viewed 34

I am making my own JSON interpreter, but when adding values to a struct, as soon as I increment pairsSize, the whole thing crashes as a segmentation fault. I tried looking through my code and it turns out, as soon as i reallocate in case KEYPAIR_DELIM with json->pairsSize++ uncommented, the whole thing will crash. Here is my code.

Part of my json.c interpret() function

    size_t jsonContentLen = strlen(jsonContent);
    char * placeHolder = malloc(1);
    unsigned int placeHolderPtr = 0;
    bool isArray = false;

    for (size_t i = 0; i < jsonContentLen; i++) {
        switch(jsonContent[i]) {
            case KEYPAIR_DELIM: {
                placeHolder[placeHolderPtr] = '\0';

                // When `json->pairsSize++` is uncommented, this will immediately result in segmentation fault
                json->pairs = realloc(json->pairs, sizeof(struct Pair *) * (json->pairsSize+1));
                json->pairs[json->pairsSize] = init_pair();
                json->pairs[json->pairsSize]->key = realloc(json->pairs[json->pairsSize]->key, placeHolderPtr+1);
                strncpy(json->pairs[json->pairsSize]->key, placeHolder, placeHolderPtr+1);
                printf("%s\n", json->pairs[json->pairsSize]->key);

                placeHolder[0] = '\0';
                placeHolderPtr = 0;

            }
            case NEXT_PAIR: {
                placeHolder[placeHolderPtr] = '\0';
                size_t placeHolderLen = strlen(placeHolder);

                json->pairs[json->pairsSize]->values = realloc(json->pairs[json->pairsSize]->values, sizeof(void *) * (json->pairs[json->pairsSize]->valuesSize+1));

                // OMG THIS LOOKS SO BAD AHHHHHHH
                json->pairs[json->pairsSize]->values[json->pairs[json->pairsSize]->valuesSize] = malloc(placeHolderLen+1);
                
                strncpy(json->pairs[json->pairsSize]->values[json->pairs[json->pairsSize]->valuesSize], placeHolder, placeHolderLen+1);
                printf("%s\n", json->pairs[json->pairsSize]->values[json->pairs[json->pairsSize]->valuesSize]);

                placeHolder[0] = '\0';
                placeHolderPtr = 0;
                json->pairs[json->pairsSize]->valuesSize++;
                
                if (isArray == false) {

                    // Causes a segmentation fault for some reason, can't figure it out
                    //json->pairsSize++;
                }
                break;
            }
        }
    }

Part of my json.h code

#define DOUBLE_QUOTE '"'
#define KEYPAIR_DELIM ':'
#define OBJECT_OPEN '{'
#define OBJECT_CLOSE '}'
#define ARRAY_OPEN '['
#define ARRAY_CLOSE ']'
#define NEXT_PAIR ','

struct Pair {
    char * key;
    void ** values;
    unsigned int valuesSize;
};

struct JSON {
    char * objectName;

    struct Pair ** pairs;
    unsigned int pairsSize;

    struct JSON ** objects;
    unsigned int objectsSize;
    struct JSON * prev;
};

struct JSON * init_json();
struct Pair * init_pair();

I know the code looks like a mess, and you are probably gonna ask that I should just use a pointer to the memory address in another variable to make the code more readable, but I tried that, and it keeps giving me errors. If you can help with this end of the code as well, that would be greatly appreciated.

0 Answers
Related