[voikko] Suomi-malaga 1.8rc1, outo bugi

Harri Pitkänen hatapitk at iki.fi
Sun Nov 14 13:52:55 EET 2010


On Saturday 13 November 2010, Harri Pitkänen wrote:
> Suomi-malagaa voi silti testata, siihen tuskin tämän takia tulee muutoksia.
> Korjaus menee libvoikon puolelle.

Uusi libvoikko löytyy täältä:

  http://www.puimula.org/htp/testing/libvoikko-3.1rc3.tar.gz

Muutin libvoikossa olevaa Malaga-toteutusta niin, että heap-muisti 
tyhjennetään aina kun sanan analysointi saadaan valmiiksi. Tämä on hyödyllinen 
optimointi, koska tuossa vaiheessa Malagan pinomuisti (stack) on aina tyhjä, 
jolloin tiedetään, että heapissa ei oikeasti ole mitään säilyttämisen arvoista 
(mikään ei voi viitata sinne). Aikaisemmin heap siivottiin ainoastaan silloin 
kun se sattui tulemaan täyteen, mutta tämä tapahtui aina kesken analyysin, 
jolloin jouduttiin etsimään ja kopioimaan talteen käytössä oleva muistin 
sisältö. Tämä taas on verrattain hidasta.

Muutoksen varsinainen syy ei kuitenkaan ollut tuo optimointi vaan se, että nyt 
peräkkäiset analyysit ovat toisistaan riippumattomia. Tämä helpottaa bugien 
selvittelyä. Nyt kuitenkin on niin, että tämä bugi jota nyt tutkittiin, 
edellytti esiintyäkseen sen, että heapissa on vanhoja roskia analyysin alussa. 
Siispä bugi ei enää pysty toistamaan, enkä ole löytänyt muutakaan tapausta, 
jossa se esiintyisi. Melko varmasti bugi edelleen on olemassa, mutta jos se on 
näinkin harvinainen kuin se tuntuisi olevan ja vaikutukset näin vähäiset, en 
viitsi lykätä julkaisua enempää ellei joku tässä välissä onnistu löytämään 
uutta esimerkkisanaa, jolla sen voisi toistaa.

Teoriani bugista on se, että jossain kohdassa koodissa käsitellään heapissa 
olevaa muistilohkoa jonkin osoittimen kautta. Ja välissä laitetaan heapiin 
jotain muuta, tässä välissä roskien keruu aktivoituu ja heapin sisäinen 
järjestys muuttuu. Koodi kuitenkin jatkaa vanhan osoittimen käyttöä ja 
kirjoittaakin nullin eri paikkaan kuin piti. Tämä on siis vain arvailua, mutta 
jostain tällaisesta voisi olla oireiden perusteella kyse. Koska 
muistiosoitteet ajokertojen välillä eivät muutu, tätä pystyy periaatteessa 
jäljittämään gdb:llä muistiosoitteeseen kirjoituksesta aktivoituvan 
breakpointin avulla. Mutta aika työlästä se on, joten en taida nyt jaksaa 
tästä enempää jatkaa jos bugi ei edes enää toistu.

Harri



More information about the voikko mailing list