2011-01-08 11 views
1
// Returns a list of topic numbers found on the page 
vector<string> findTopics(char* rData, int rDataLen) { 
    pcre *re; 
    const char *error; 
    int erroffset; 
    re = pcre_compile(
     "topic/([0-9]+)", /* the pattern */ 
     0,   /* default options */ 
     &error,   /* for error message */ 
     &erroffset,  /* for error offset */ 
     NULL);   /* use default character tables */ 

    if(re == NULL) { 
    printf("Couldn't compile regex (%s)", error); 
     // exit(-1): 
    } 

    int regOf[2]; 
    vector<string> topics; 

    char *topic; 
    int offset = 0; 
    int rc = 1; 
    // Basically a preg_match_all() 
    while(true) { 
     rc = pcre_exec(re, NULL, rData, rDataLen, offset, 0, regOf, sizeof(regOf)); 
     if (rc < 2) { 
      break; 
     } 

     topic = new char[8]; 
     sprintf(topic, "%.*s\n", regOf[2*1+1] - regOf[2*1], rData + regOf[2*1]); 

     topics.push_back(topic); 
     offset = regOf[1]; 
    } 

    pcre_free(re); 

    return topics; 
} 

この機能は、私がrDataで、それを解析し、それはほとんど動作することを具体的な何かで見られる(topic/[0-9]+に一致する)「トピック」のリストを取得することになっています。 topicsは、それが想定しているトピック番号で満たされます。C/C++メモリリーク(PCREを使用)

私はVisual Studioでデバッグすると、関数の最後(戻り)の直後にこのエラーメッセージが表示されます。ランタイムチェック失敗#2 - 変数 'regOf'の周りのスタックが壊れていました。

私が間違っていることを理解できず、誰かが正しい方向で私を指し示すことができるかどうか疑問に思います。

答えて

2

regOfは2つの要素で定義します。次に、sizeof(regOf)をpcre_exec関数に渡しますが、配列の中にいくつの項目があるかを尋ねます。そのため、この関数は、8つのスロットがいっぱいであると考えています.2つしかないので、配列の最後から実行してメモリを破壊することができます。

+0

それはまた、あなたがトピックにスプリントを行うことについても注意する必要があることが消えて以来、別の答えで言及されました。 8文字しかないので、バッファの最後がオーバーフローする前に最大7文字の文字列を入力することができます。 –

+0

ありがとうございます。それは今、完璧に動作します。 – Savetheinternet

2

さらに、pcre_compilepcre_freeの間のステートメントのいずれかが例外をスローすると(少なくとも3つがそうであることがわかります)、メモリがリークします。

関連する問題