我如何解决munmap_chunk():regfree上的无效指针(和正则表达式)[关闭]

你好我在munmap_chunk(): invalid pointer上获得regfree(&regexCompiled); regexCompiled已分配。

问题是只有在找到匹配时才会发生这种情况,否则它会正常工作

一步之后:

这是功能代码:

char * WebServer::get_db_query(char * line) {
  const char * regex = "<sql\\s+db=(.+?)\\s+query=(.+;)\\s*\\\\>";
  size_t maxGroups = 3;
  char * ret = (char * ) malloc(sizeof(char));
  regex_t regexCompiled;
  regmatch_t groupArray[maxGroups];

  if (regcomp( & regexCompiled, regex, REG_EXTENDED)) {
    printf("Could not compile regular expression.\n");
    fflush(stdout);
    return NULL;
  };

  if (!regexec( & regexCompiled, line, maxGroups, groupArray, 0)) {
    char copy[strlen(line) + 1];
    strcpy(copy, line);
    copy[groupArray[1].rm_eo] = '\0';
    copy[groupArray[2].rm_eo] = '\0';
    matched = true;
    sprintf(ret, "%s;%s", copy+ groupArray[1].rm_so, copy+ groupArray[2].rm_so);
    printf("Match %s\n",
      copy+ groupArray[1].rm_so);
    printf("Match %s\n",
      copy+ groupArray[2].rm_so);
    fflush(stdout);
  }

  regfree( & regexCompiled);
  return ret;
}
1
投票

使用reg*()函数是正确的。

通过释放regex_t程序崩溃,这通常意味着内存管理之前已经搞砸了。

这就是您展示的代码中发生的事情:

这条线

 char * ret = (char * ) malloc(sizeof(char));

恰好分配一个char,这使得ret只指向一个空字符串。

然后在这里

 sprintf(ret, "%s;%s", copy+ groupArray[1].rm_so, copy+ groupArray[2].rm_so);

代码复制大量数据为ret点。

根据需要为ret分配尽可能多的内存。肯定只有一个char很少。

2
投票

使用char * ret = (char * ) malloc(sizeof(char));,您只需分配一个字符。

当你以后再做sprintf(ret, "%s;%s", ..时,你会超越这一个字符,所以你会破坏记忆。

然后在任何以后的时刻,当堆检测到它已被破坏时,您可能会遇到问题。

分配多个char。