0

I am Writing a program in c that relies heavily on regular expressions and my mechanism for executing them works 99% of the time but then it crashes the program every once in a while and I am stumped to why it would be.

New_Sifter() takes a String representation of its regex and a processing function that takes an array or strings and returns a single string.

Sifter* New_Sifter(const char* exp, const char*(*func)(const char**, size_t)){
    Sifter *sifter = malloc(sizeof(Sifter*));
    sifter->strRegEx = exp;
    if(regcomp(&(sifter->regEx), exp, REG_EXTENDED)){
        printf("Could not compile regular expression\n");
        exit(1);
    }
    sifter->Sift = &Base_;
    sifter->Custom = func;
    sifter->nGroups = sifter->regEx.re_nsub + 1;
    sifter->captures = malloc(sifter->nGroups * sizeof(regmatch_t));
    Register_Disposable(sifter->captures); //stores pointer in registry to be freed later
    Register_Disposable(sifter); //stores pointer in registry to be freed later
    return sifter;
}

const char* Base_(Sifter* self, const char* source){
    if(regexec(&(self->regEx), source, self->nGroups, self->captures, 
        REG_EXTENDED) != 0){
        printf("about to return null\n");
        return NULL;
    }
    return self->Custom(
        //Sift_() returns an array of the strings captured in the regexec
        Sift_(source, self->captures, self->nGroups), self->nGroups);
}

The error I get sometimes when I run this (and debug some with gdb) looks like:

Program received signal EXC_BAD_ACCESS, Could not access memory. Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000008 0x00007fff90d72b9f in tre_reset_last_matched_branches () (gdb) bt

  • 0x00007fff90d72b9f in tre_reset_last_matched_branches ()
  • 0x00007fff90d72a58 in tre_fill_pmatch ()
  • 0x00007fff90d72e56 in tre_match ()
  • 0x00007fff90d72d35 in regnexec ()
  • 0x00000001000030cf in Base_ (self=0x1001000e0, source=0x1000033ee "add 11111, 22222, 33333")
Charlie Lipford
  • 121
  • 1
  • 6

1 Answers1

3
 Sifter *sifter = malloc(sizeof(Sifter*));

This line has one * too many. You are allocating space for a pointer, not space for the struct. Take the * out of the sizeof.

bmargulies
  • 97,814
  • 39
  • 186
  • 310
  • Note that this winds down to a *defensive style* issue. Se my comment to the OP (mind the lack of capitalisation) , or here: http://stackoverflow.com/a/15527407/905902 – wildplasser Apr 10 '13 at 23:54