[hunspell-fi-devel] Yhdyssanat ja CVS:n käyttöönotto

Harri Pitkänen hatapitk at cc.jyu.fi
Fri Jan 27 11:53:19 EET 2006


On Friday 27 January 2006 01:13, Reijo Tomperi wrote:
> Harri Pitkänen wrote:
> > Ongelma on
> > siinä, että jos yhdyssanojen tunnistuksen ottaa käyttöön ja sitten kutsuu
> > Hunspellin morph-funktiota sellaisella yhdyssanalla, jonka jälkiosa on
> > taivutettu, Hunspell kaatuu.
>
> Kaatumiset on perinteisesti helppoja korjata ilman mitään ymmärrystä
> projektista. Korjaaminen onnistuu muokkaamalla affixmgr.cxx tiedostoa.
> Sieltä etsii kaksi paikkaa joissa on rivi:
> line_uniq(m);
>
> Ja muuttaa rivit:
>                           line_uniq(m);
>                           if (strchr(m, '\n')) {
>                                 strcat(*result, "(");
>                                 strcat(*result, line_join(m, '|'));
>                                 strcat(*result, ")");
>                           } else {
>                                 strcat(*result, m);
>                           }
>                           free(m);
>
> Tähän muotoon:
>                       if( m )
>                       {
>                           line_uniq(m);
>                           if (strchr(m, '\n')) {
>                                 strcat(*result, "(");
>                                 strcat(*result, line_join(m, '|'));
>                                 strcat(*result, ")");
>                           } else {
>                                 strcat(*result, m);
>                           }
>                           free(m);
>                       }
>
> Eli periaatteessa tarkistaa vain että onko m NULL ennenkuin käyttää
> sitä.Mutta en todellakaan tiedä pitäisikö resultille tehdä jotain siinä
> tapauksessa jos m on NULL. Enkä tiedä sitäkään saisiko m olla tuossa
> paikassa NULL vai onko virhe tapahtunut jo aikaisemmin. Mutta ainakaan
> se ei kaadu (tuohon) jos nuo korjaukset tekee. En raportoinut tästä
> hunspell-projektille. Jos joku pitää tuota hyvänä korjauksena, siitä voi
> minun puolestani kertoa kenelle haluaa.

Saattaahan tuo korjaus riittääkin, mutta mielestäni alkuperäisessä koodissa on 
myös jonkinlainen logiikkavirhe jonka haluan ymmärtää ennen kuin alan sitä 
korjaamaan. Tiedosto affixmgr.cxx, rivit 2103 - 2108:

char * m = NULL;
if (compoundflag) m = affix_check_morph((word+i),strlen(word+i), 
compoundflag);
if ((!m || *m == '\0') && compoundend)
    m = affix_check_morph((word+i),strlen(word+i), compoundend);
strcat(*result, presult);
line_uniq(m);

Funktiota affix_check_morph tutkimalla näyttää siltä, että se ei voi palauttaa 
nullia. Toisaalta line_uniq edellyttää, että m != NULL. Siispä tuossa on 
ajateltu, että jomman kumman if-lauseen ehdon olisi oltava tosi, mutta näin 
ei käytännössä näytä olevan.

Pitääkin katsella tuota tarkemmin, ehkä tähän sitenkin ratkaisu löytyy kun 
virhe on saatu rajattua.

Harri



More information about the devel mailing list