Certo. Nel famoso risultato di Cohen, afferma che un rilevatore di virus perfetto dovrebbe emettere un allarme se e solo se il programma di input può mai agire come un virus (cioè infettare la macchina e causare danni).
Considera il seguente programma:
f();
infect_and_do_damage();
dove f()
è una funzione innocua, e infect_and_do_damage()
è un carico utile virale che infetta la tua macchina e provoca ogni tipo di danno (cancella il tuo disco rigido, ruba tutto il tuo denaro, qualunque cosa).
Consideriamo ciò che un rivelatore di virus perfetto dovrebbe dire su questo programma:
-
Se f()
può tornare, questo è un virus e il rilevatore di virus dovrebbe emettere un allarme.
-
D'altra parte, se f()
entra sempre in un ciclo infinito e non ritorna mai, la seconda riga è codice morto, infect_and_do_damage()
non sarà mai invocato, questo programma non agirà mai come un virus, e il rilevatore di virus non dovrebbe disattivare alcun allarme.
Quindi, il problema di determinare se questo codice è un virus è equivalente al problema di determinare se la funzione f()
può mai fermarsi. Questo è il famoso problema di arresto, che è noto per essere indecidibile.
In altre parole, rilevare se un programma è un virus è altrettanto difficile come rilevare se un programma si fermerà. Pertanto, entrambi i problemi sono indecidibili.
Si noti che questo è un risultato puramente teorico. L'indecidibilità è un costrutto puramente teorico. Il fatto che un problema sia indecidibile non è la fine della conversazione; è solo l'inizio della conversazione.
In pratica, ci sono vari modi per tentare di affrontare l'indecidibilità: ad esempio, prova a scrivere una soluzione che sia probabilisticamente corretta, anche se non è sempre corretta su tutti i programmi; prova a trovare una soluzione che funzioni per l'insieme di programmi che potresti trovare in pratica, anche se non funziona su tutti i programmi; consentire alla soluzione di rispondere occasionalmente "Non so" o di sbagliare dal dichiarare un programma un virus (o errare dalla parte dei falsi negativi); e così via.
Quindi non dovresti considerare questo come una dichiarazione definitiva che il rilevamento dei virus è impossibile - solo perché il problema è indecidibile non significa che sia necessariamente impossibile trovare una soluzione abbastanza buona nella pratica. Ma identifica alcune barriere fondamentali alla costruzione di un rilevatore di virus perfetto.