szó jelentését keresi. A DICTIOUS-ban nem csak a
szó összes szótári jelentését megtalálod, hanem megismerheted az etimológiáját, a jellemzőit és azt is, hogyan kell a
szót egyes és többes számban mondani. Minden, amit a
szóról tudni kell, itt található. A
szó meghatározása segít abban, hogy pontosabban és helyesebben fogalmazz, amikor beszélsz vagy írsz. A
és más szavak definíciójának ismerete gazdagítja a szókincsedet, és több és jobb nyelvi forráshoz juttat.
Főnév
program correctness (tsz. program correctnesses)
- (informatika) A programhelyesség (program correctness) az informatikában és szoftverfejlesztésben azt jelenti, hogy egy adott program a specifikációnak megfelelően viselkedik – vagyis pontosan azt csinálja, amit elvárunk tőle. Ez a fogalom a megbízható, hibamentes szoftverek készítésének alapja, különösen kritikus rendszerek esetén (pl. orvosi eszközök, repülőgépvezérlés, pénzügyi rendszerek).
1. A programhelyesség alapjai
A helyesség vizsgálata során általában két szintet különböztetünk meg:
- Részleges helyesség (Partial correctness): A program akkor tekinthető részlegesen helyesnek, ha a specifikáció szerinti bemenetekre az előírt eredményt adja – feltéve, hogy lefut (terminál).
- Teljes helyesség (Total correctness): A program akkor teljesen helyes, ha részlegesen helyes, és minden esetben be is fejezi a futását.
Példa:
int osszeg(int n) {
int s = 0;
for (int i = 1; i <= n; ++i) {
s += i;
}
return s;
}
Ez a függvény részlegesen helyes, ha n >= 1
és az eredmény valóban 1 + 2 + ... + n
. Akkor teljesen helyes, ha a ciklus mindig véget ér.
2. Helyességi módszerek
2.1 Tesztelés (Testing)
A leggyakoribb, de nem teljes bizonyítási forma. A programot különböző bemenetekkel futtatjuk, és ellenőrizzük, hogy a kimenet megfelel-e az elvárásoknak. A tesztelés segít hibák felfedezésében, de nem garantálja, hogy a program minden esetre helyes.
Teszttípusok:
- Egységtesztelés (unit testing): Egyes függvények, osztályok külön-külön.
- Integrációs tesztelés: Komponensek együttműködésének ellenőrzése.
- Rendszertesztelés: Teljes rendszer működésének validálása.
Matematikai módszerekkel, logikai eszközökkel bizonyítjuk, hogy a program mindig helyesen működik.
Eszközök:
- Hoare-hármasok:
{P} C {Q}
alakban írjuk le a programhelyességet. Itt P
az előfeltétel, C
a kód, Q
az utófeltétel.
- Invariánsok: Olyan tulajdonságok, amelyek minden cikluslépés után igazak maradnak.
- Dijkstra weakest precondition kalkulus: Visszavezethető formális számítás a helyességhez.
Példa:
// Cél: s = 1 + 2 + ... + n
int s = 0;
int i = 1;
while (i <= n) {
s += i;
i++;
}
Itt a ciklusinvariáns lehet: s = 1 + 2 + ... + (i - 1)
.
2.3 Statikus analízis
A forráskód elemzése a futtatás nélkül. Olyan eszközök használják, mint a clang-tidy
, Coverity
, SonarQube
. Ellenőrizhetik a típushibákat, memóriaszivárgásokat, elérhetetlen kódot stb.
3. Hibák és bizonytalanság
A program helyessége nem garantálja a hibátlan működést minden környezetben. Lehetnek:
- Fordítási hibák (compile-time errors): pl. szintaktikai hiba, típushiba.
- Futásidejű hibák (runtime errors): pl. osztás 0-val, memóriakezelési hiba.
- Logikai hibák: A program szintaktikailag helyes, de rossz eredményt ad (pl. ciklus rosszul van beállítva).
Véletlenszerű hibák:
Ezek gyakran versenyhelyzetekben fordulnak elő (többszálúság), vagy nem determinisztikus bemenetek esetén.
4. Szoftvermérnöki nézőpont
A helyes működés nem csak a kódtól, hanem a következőktől is függ:
- Specifikáció minősége: Ha az igények homályosak vagy félreérthetőek, a program sem lehet biztosan helyes.
- Verifikációs lefedettség: Nem lehet minden bemenetet tesztelni, kivéve nagyon kis programokat.
- Helyesség és robusztusság: Egy helyes program is lehet gyenge vagy érzékeny pl. bemeneti hibákra. Ezért fontos a hibakezelés.
5. Példák a gyakorlatból
Fordítási időben ellenőrzött nyelvek
Pl. Haskell, Ada, Rust – ezekben erős típusellenőrzés van, amely már fordításkor kiszűr sok hibát.
Kritikus rendszerek
Repülésirányító rendszerek, vasúti biztonsági rendszerek, nukleáris vezérlők formális verifikáción alapulnak (pl. SPARK/Ada nyelv használata).
Bugos programok hatásai
- NASA Mars Climate Orbiter: a metrikus és angolszász mértékegységek keverése miatt hibás pályára állt.
- Ariane 5 rakéta: túlcsordulás miatt robbant fel – nem megfelelő adattípusválasztás.
6. Modern megközelítések
Típusbiztos programozás
A modern nyelvek (pl. Rust) célja, hogy már fordítási időben garantálják, hogy bizonyos hibák nem fordulhatnak elő.
Egyszerűség és modularitás
A jól strukturált, kis modulokra bontott kód jobban tesztelhető, elemezhető és verifikálható.
Az automatizált követelmény-ellenőrzés révén a specifikáció és a kód szinkronban marad (pl. model checking).
TL;DR
A programhelyesség annak matematikai vagy gyakorlati igazolása, hogy egy program azt csinálja, amit elvárunk tőle. Teszteléssel, statikus analízissel vagy formális módszerekkel vizsgálható. A szoftver akkor teljesen helyes, ha mindig helyes eredményt ad, és biztosan terminál. Kritikus rendszerek esetén a formális bizonyítás elengedhetetlen. A modern szoftverfejlesztés egyre inkább a típusbiztos, hibabiztos, jól specifikált és moduláris rendszerekre épít a helyesség eléréséhez.