2011-01-08 16 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; 
} 

Diese Funktion soll eine Liste von „Themen“ (passend topic/[0-9]+) in etwas gefunden holen spezifisch, dass ich es analysieren, in der rData, und es funktioniert fast. topics wird mit dem Thema Zahlen gefüllt, die es soll.C/C++ Speicherverlust (mit PCRE)

Wenn ich es in Visual Studio debuggen, bekomme ich diese Fehlermeldung direkt nach dem Ende der Funktion (die Rückkehr): Run-Time Check Failure # 2 - Stack um die Variable 'regOf' wurde beschädigt.

Ich kann nicht herausfinden, was ich falsch mache, und frage mich, ob vielleicht jemand mir in die richtige Richtung zeigen kann.

Antwort

2

Sie definieren regOf mit 2 Elementen. Anschließend übergeben Sie sizeof (regOf) an die Funktion pcre_exec, die Funktion fragt jedoch, wie viele Elemente sich im Array befinden und nicht wie viele Byte groß sind. Daher denkt die Funktion, dass sie 8 zu füllende Steckplätze hat, sie hat nur 2, kann also vom Ende des Arrays ablaufen und den Speicher beschädigen.

+0

Es wurde auch in einer anderen Antwort erwähnt, die seitdem verschwunden ist, dass Sie auch vorsichtig sein sollten, diesen Sprint zum Thema zu machen. Da es nur 8 Zeichen lang ist, können Sie höchstens eine 7-stellige Zeichenfolge einfügen, bevor das Ende des Puffers überläuft. –

+0

Vielen Dank. Es funktioniert jetzt perfekt. – Savetheinternet

2

Zusätzlich zu den anderen Antworten, wenn irgendwelche Ihrer Aussagen zwischen pcre_compile und pcre_free eine Ausnahme werfen (ich sehe mindestens drei von denen, die dies tun könnten), verlieren Sie Speicher.