[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