[hunspell-fi-devel] libvoikko - Mahdollinen bugi, osoittimen käyttö free:n jälkeen

Harri Pitkänen hatapitk at cc.jyu.fi
Sun Apr 23 23:46:06 EEST 2006


On Sunday 23 April 2006 23:01, Reijo Tomperi wrote:
> libvoikko-0.2 kirjastossa, tiedostossa voikko_spell.c:36 käytetään
> buffer-osoitinta, vaikka minun nähdäkseni muistialue johon osoitin
> osoittaa, vapautettiin jo muutamaa riviä aikaisemmin.
> voikko_options.ignore_dot on ilmeisesti toistaiseksi aina false, joten
> tuo ehto ei yleensä toteudu. Mutta ajattelin huomauttaa tuosta silti jos
> se vaatii korjaamista jonkun mielestä. Patchia en osaa tehdä, kun en
> vielä ymmärrä täysin funktion toimintaa enkä ole varma onko
> tarkoituksena käyttää alkuperäistä buffer:ia, vai jotain muuta arvoa siinä.
>
> int voikko_do_spell(const char * word) {
>     char * buffer = malloc(strlen(word) + 1);
>     strcpy(buffer, word);
>     analyse_item(buffer, MORPHOLOGY);
>     free(buffer);  // <-- Muisti vapautetaan tässä
>     if (first_analysis_result()) return VOIKKO_SPELL_OK;
>     if (voikko_options.ignore_dot && strlen(word) > 1 &&
> word[strlen(word) - 1] == '.') {
>         buffer[strlen(word) - 1] = '\0';  // <-- Mutta sitä käytetään
> vielä täällä
>         analyse_item(buffer, MORPHOLOGY); // <-- Ja täällä
>         if (first_analysis_result()) return VOIKKO_SPELL_OK;
>     }
>     return VOIKKO_SPELL_FAILED;
> }

Hyvä huomio! Korjaan tuon saman tien. voikko_options.ignore_dot == 1 kun 
käytetään voikkoa OpenOfficessa mutta 0 kun käytetään voikkospelliä. Ja 
valgrindillä olin testannut ohjelman vain jälkimmäisessä tapauksessa.

Itse asiassa oli alunperin unohtanut free:n kokonaan tuosta funktiosta, ja 
havaitsin asian vasta kun tuo vuoto oli jo vienyt 600 megatavua muistia... Ja 
sitten tietysti lisäsin sen katsomatta tarkemmin missä kaikkialla tuota 
bufferia käytetään.

Harri



More information about the devel mailing list