Já jen doplním, to co už psal _pepak. Když budu mít kód typu:
// authenticate user do { username = GetUsername(); password = GetPassword(); } while (!UserValid(username, password)) // send money destinationAccountNumber = GetDestinationAccountNumber(); amountOfMoney = GetAmountOfMoney() SendMoney(destinationAccountNumber, amountOfMoney);
Tak musím řešit halting problem (skončí ten do while cyklus někdy? skončí jen pro platná data?), ale to je jen malá část problému. Musím navíc ověřit, že všechny funkce dělají to, co mají dělat. Vhodnou volbou jazyka lze omezit chyby typu buffer overflow (za předpokladu, že veříme kompilátoru/virtual machine) a možná i ten halting problem, pokud použiju něco ultimátně funkcionálního, ale jazyk sám o sobě nezaručí, že tam nebudou záměrné nebo náhodné chyby. Když bude ve funkci SendMoney podmínka typu:
if (date() == datumMojiCestyNaBahamy && amountOfMoney >= 1000000) { PosliPenizeNaMujUcetNaBahamach(amountOfMoney) }
Nezjistí to automatický test a je určitá pravděpodobnost (ne 100%), že to objeví auditor. Takových chyb ať už úmyslných nebo neúmyslných tam může být celá řada docela dobře schovaných. Takže ani po auditu kódu nelze nikdy na 100% prohlásit, že je to bezpečné.