VERIFIKACIJA SOFTVERA

Kurs verifikacija softvera je izborni kurs na master studijama za studente R i I smera. U okviru kursa proučavaju se različite tehnike verifikacije softvera, počevši od dinamičkih pristupa verifikaciji do naprednih tehnika statičke analize. Kurs je, u okviru vežbi, praktično orijentisan na savladavanje upotrebe različitih alata za verifikaciju softvera, a na predavanjima se prelaze osnovni koncepti i teorijske osnove oblasti. Neke od tema na kursu:

  • Tehnike testiranja
  • Alati za profajliranje i debagovanje
  • Statička analiza koda kroz preglede
  • Simboličko izvršavanje
  • SMT/SAT u verifikaciji softvera
  • Proveravanje modela
  • Semantika programskih jezika
  • Apstraktna interpretacija

Predmetni nastavnik:

Asistent:

U toku godine, sve rezultate možete da pratite preko naredne tabele.

Izborni predmet

  • 8 ESPB bodova
  • 2 časa predavanja
  • 3 časa vežbi

Obaveze studenata uključuju predispitne obaveze i ispit. Predispitne obaveze se mogu ispuniti u formi praktičnog seminarskog rada. Praktični seminarski rad može, po izboru, biti samostalni ili grupni. Da bi se uspesno položio ispit, neophodno je ispuniti prag na predispitnim obavezama i ispitu. Više detalja u nastavku.

Predispitne obaveze (od 45 do 60 poena):

Predispitne obaveze se sastoje od obaveznog praktičnog seminarskog rada (samostalnog ili grupnog). Praktični seminarski rad je neophodno prijaviti do 1. decembra tekuće godine. Pratiti obaveštenja radi blagovremenog izbora teme. Da bi se položio ispit minimalni broj poena na predispitnim obavezama je 20.

Praktični seminarski radovi se brane uz prisustvo nastavnika u terminu ispita sa prethodnom prijavom koja se obično objavljuje nedelju dana pred ispit. Očekuje se da student dođe pripremljen za prezentovanje seminarskog rada u svom okruženju (npr. tako što će doneti laptop), predstaviti projekat i odgovoriti na pitanja. Pitanja mogu uključiti i pokretanje alata korišćenih za izradu seminarskog rada ili korišćenih na vežbama, kao i pisanje dodatnih testova tokom odbrane ukoliko su testovi deo seminarskog rada. Praktični seminarski radovi se moraju raditi u repozitorijumima u okviru GitHub organizacije za kurs.

Praktični seminarski rad može biti:

  • Analiza projekta otvorenog koda (samostalni rad) (45 poena)
  • Istraživački projekat (preporuka 2+ člana) (60 poena)

Analiza projekta otvorenog koda (45 poena)

Izrada podrazumeva pokretanje alata za verifikaciju softvera ili pisanje testova nad jednim projektom otvorenog koda. Prilikom odabira projekta, uveriti se da je projekat u dobrom stanju za analizu (prevodi se, kod je citljiv i modularan itd.). Konsultovati FAQ repozitorijum prilikom odabira projekta, kao i za upoznavanje sa čestim problemima tokom analize. Nakon isteka roka za odabir projekta, biće kreirani repozitorijumi za izradu seminarskih radova. Odbrana je praktična, uz reprodukciju delova seminarskog rada.

Ciljevi i uslovi izrade praktičnog seminarskog rada:

  • Projekat koji se analizira mora biti otvorenog koda. Popularni kandidati su studentski projekti, u kom slučaju oni moraju biti projekti ranijih generacija (dakle, nije moguće odabrati svoj projekat) koji nisu već bili tema seminarskog rada iz ovog kursa. Ohrabrujemo odabir nestudentskih projekata.
  • Cilj projekta je pronalazak bagova ili uskih grla programa. Nije neophodno da se zapravo pronađu bagovi kako bi seminarski rad bio uspešan - analiza i izveštaji čine seminarski rad.
  • Neophodno je iskoristiti barem 5 alata/tehnika u okviru seminarskog rada. Pritom:
    • Testovi se zajedno broje kao jedna stavka, i mogu se pisati u bilo kom radnom okviru. Kategorije testova (jedinični, integracioni, i sl.) se računaju kao zasebni alati. Uz testove je neophodno pratiti pokrivenost koda proizvoljnim alatom, pri čemu je alat za pokrivenost deo podrške za testiranje i ne broji se kao zasebni alat. Praćenje pokrivenosti koda bez testova nema smisla i nije validna metrika.
    • Svaki Valgrind alat se broji zasebno s tim što je dozvoljeno koristiti maksimalno 2 Valgrind alata.
    • Maksimalno jedan od alata mora biti alat za formatiranje izvornog koda i stilske provere (npr. clang-format ili clang-tidy).
    • Jedan od alata mora biti alat koji nije rađen na vežbama.
  • Za svaki korišćeni alat treba da budu dodate i skripte koje reprodukuju dobijene rezultate.

U okviru repozitorijuma za izradu seminarskog rada, potrebno je da bude napisan README fajl koji sadrži:

  • Informacije o autoru seminarskog rada.
  • Opis projekta koji je analiziran i odgovarajući linkovi do izvornog koda projekta - grana koja je analizirana i heš kod commit-a.
  • Spisak alata koji su korišćeni za analizu i uputstva za reprodukciju rezultata.
  • Spisak zaključaka.

Pored README fajla, potrebno je da postoji i (markdown ili PDF) fajl ProjectAnalysisReport koji sadrži detaljan opis analize projekta i zaključcima koji su napravljeni. Referencu na projekat koji se analizira dodati kao git submodul. Svaki alat koji je korišćen treba da ima poseban direktorijum u kome se nalaze rezultati rada alata kao i opcione skripte za pokretanje.

Primer korektne organizacije repozitorijuma:

    .
    ├── .github               // CI konfiguracija: 
    │   └── workflows         // preuzeti sa: {{site.projects-ci}}
    │       ├── gate.yml
    │       └── tickets.yml
    ├── git-submodul-of-project-to-analyze @ commit-hash
    ├── custom.patch          // changes to the original project 
    ├── unit_tests
    │   ├── run_tests.py
    │   ├── RunningTests.md
    │   ├── RunningTests.pdf
    │   └── tests
    │       ├── MyUnitTests1.cpp
    │       └── MyUnitTests2.cpp
    ├── klee
    │   ├── run_klee.sh
    │   ├── failed-tests
    │   │   ├── test00001.ktest
    │   │   └── ...
    |   └── klee-test-corpus.zip
    ├── cbmc
    │   ├── run_cbmc.sh
    │   ├── cbmc-outputs
    │   │   ├── run1.stdout
    │   │   ├── run2.stdout
    │   │   ├── run3.stdout
    │   │   ├── run3.stderr
    │   │   └── ...
    │   └── counterexamples
    │       ├── counterexample1
    │       ├── counterexample2
    │       ├── counterexample3
    │       └── ...
    ├── valgrind
    │   ├── callgrind
    │   │   ├── callgrind.out.12312
    │   │   ├── callgrind.out.12313
    │   │   ├── callgrind.out.12314
    │   │   ├── callgrind.out.12315
    │   │   ├── kcachegrind_12315_1.png
    │   │   ├── kcachegrind_12315_2.png
    │   │   ├── kcachegrind_12315_3.png
    │   │   ├── kcachegrind_12315_4.png
    │   │   └── run_callgrind.sh
    │   └── massif
    │       ├── massif.out.12312
    │       ├── massif.out.12313
    │       ├── massif.out.12314
    │       ├── massif.out.12315
    │       └── run_massif.sh
    ├── .gitignore
    ├── .gitmodules
    ├── README
    ├── ProjectAnalysisReport.md
    └── ProjectAnalysisReport.pdf

Napomena: Repozitorijumi koji ne prate strukturu prikazanu iznad ili nemaju tražene informacije u README fajlu neće biti prihvaćeni! Svi repozitorijumi moraju imati instaliranu CI konfiguraciju.

Forma za prijavu samostalnih seminarskih radova se može naći na sledećem linku (odabrati opciju samostalni seminarski rad). Repozitorijumi koji su već bili tema za samostalni seminarski rad iz ovog kursa se mogu naći na sledećem linku (spisak se automatski ažurira i uključuje real-time izmene u formi za prijavu).

Istraživački projekat (60 poena)

Napomena: Iako zamišljen da se radi timski, moguće je ovaj tip seminarskog rada raditi samostalno ali pritom se obim projekta ne smanjuje.

Većeg obima, istraživačkog tipa. Teme za projekat su dostupne unapred. Izuzetno, ukoliko imate neku ideju možete da je predložite. Izrada podrazumeva kreiranje novih ili nadograđivanje postojećih alata za verifikaciju softvera, kao i njihovu verifikaciju koristeći barem alate pomenute na vežbama. Nakon odabira projekta, i odgovarajućeg odobrenja od strane nastavnika, biće kreirani repozitorijumi za izradu seminarskih radova. Odbrana je usmena, uz prikaz rada. Nakon odbrane istraživačkog seminarskog rada biće sa profesorkom dogovoren termin za prezentovanje rada.

Spisak predviđenih tema se može naći ovde.

U okviru repozitorijuma za izradu seminarskog rada, potrebno je da bude napisan detaljan README fajl koji sadrži:

  • Informacije o autorima
  • Na koji način se projekat može prevesti i pokrenuti (sve neophodne biblioteke, alati i zavisnosti)
  • Na koji način se izvršna verzija koristi (primeri upotrebe)
  • Koji ulazni primeri se mogu koristiti za upotrebu i testiranje programa.
  • Spisak alata koji su korišćeni za analizu.
  • Ukoliko su testovi deo projekta, testovi treba da bude unutar repozitorijuma zajedno sa opisom kako se pokreću. Uključiti potencijalne skripte za pokretanje testova ukoliko su korišćene.

Pored README fajla, potrebno je da postoji i fajl SystemDescription (PDF ili markdown fajl) koji sadrži:

  • imena autora
  • opis problema
  • opis arhitekture sistema (opis osnovnih modula implementacije),
  • opis rešenja problema (osnovne ideje, obrazloženja za ključne odluke, opis osnovnog algoritma)

Forma za prijavu samostalnih seminarskih radova se može naći na sledećem linku (ignorisati pitanja vezana za samostalne seminarske radove).

Završni ispit (50 poena)

Polaže se pismeno, izvlači se pet ispitnih pitanja sa spiska ispitnih pitanja.

Da bi se položio ispit, neophodno je imati 51 poen, pri čemu je neophodno ostvariti bar 20 poena na teoriji na završnom ispitu i bar 20 poena na predispitnim obavezama. Od poena na teoriji, neophodno je imati bar 3 poena po pitanju (tj. nije dozvoljeno preskakati oblasti).

U terminu ispitnog roka možete polagati sve delove ispita ili samo jedan deo. Pred izlazak na ispit potrebno je preko forme u okviru strane kursa prijaviti namere (odbrana seminarskog rada, teorijski ispit ili oba). Odbrana praktičnog seminarskog rada može i ne mora da prethodi izlasku na teorijski ispit.


Za sve potencijalne nejasnoće, javite se mejlom!

Ispitna pitanja za teorijski deo ispita

Spisak ispitnih pitanja možete naći ovde.

Studenti koji su zainteresovani za dodatnih 5 poena (za ukupan zbir 105) mogu da usmeno odgovaraju još jedno pitanje sa suženog spiska ispitnih pitanja za usmeni deo (u dodatnom terminu po dogovoru, nakon što završe sve druge ispitne obaveze).

Materijali

Predavanja - video materijali.
Predavanja - skripta.
Dodatni materijali

Materijali sa predavanja

Materijali

[Beleške sa vežbi]
[GitHub organizacija sa materijalima i studentskim projektima]

Oblasti pokrivene vežbama

  • Dijagnoziranje problema
    • Alati za analizu performansi Linux sistema
    • Analiza ponašanja programa metodom crne kutije
  • Debagovanje koristeći alate za debagovanje i razvojna okruženja
  • Testiranje jedinica koda
  • Praćenje pokrivenosti koda testovima
  • Testiranje pomoću objekata imitatora
    • Ručno pisanje imitator klasa (C++)
    • Imitatori baza podataka (C#)
    • Biblioteke za testiranje koristeći objekte imitatore - Mockito (Java), Moq (C#)
  • Fuzz testiranje
  • Profajliranje
  • Statička analiza
  • Alati i jezici za formalnu verifikaciju softvera

Literatura za predavanja

Navedeni matarijali su dosutupni besplatno na internetu (potražite):
  • Materijali koji se mogu naći u okviru kartice za predavanja (slajdovi i tekstovi sa predavanja i razni dodatni materijali)
  • Izabrani naučni radovi, seminarski radovi, master radovi (linkovi dostupni u okviru kartice za predavanja)
  • J. Laski, W. Stanley: Software Verification and Analysis. Springer - Verlag, London, 2009.
  • J. B. Almeida, M. J. Frade, J. S. Pinto, S. M. de Sousa: Rigorous Software Development (An introduction to Program Verification). Springer - Verlag, London 2011.
  • Biere A, Cimatti A, Clarke EM, Strichman O, Zhu Y. Bounded model checking. Advances in computers. 2003 Dec;58(11):117-48.
  • Cristian Cadar, Daniel Dunbar, Dawson Engler. KLEE: Unassisted and Automatic Generation of High-Coverage Tests for Complex Systems Programs, In OSDI, 2008.
  • Christel Baier, Joost-Pieter Katoen. Principles of Model Checking.
  • Kolekcija naprednih materijala

Literatura za vežbe

Dodatni materijali za predavanja

Polaganje ispita

Spisak ispitnih pitanja je redukovan u delu za koji nije držana nastava. Pokrivene su sve oblasti, ali se očekuje manji nivo detaljnosti u odgovorima za poslednjih 7 pitanja.

Novi spisak ispitnih pitanja možete da nađete ovde. Umesto odgovaranja na 5 ispitnih pitanja po 10 poena, odgovaraćete na 4 ispitna pitanja po 12.5 poena. Studentima koji su radili testove poeni su skalirani u tabeli. Raspodela ispitnih pitanja:

  • Prvo ispitno pitanje - pitanja sa spiska ispitnih pitanja vezana za testiranje (5-19)
  • Drugo ispitno pitanje - pitanja sa spiska ispitnih pitanja vezana za kvalitet softvera (1-3), debagovanje, profajliranje, analizu binarnog koda (22-34)
  • Treće ispitno pitanje - pitanja sa spiska ispitnih pitanja vezana za simboličko izvršavanje (41-56)
  • Četvrto ispitno pitanje - pitanja sa spiska ispitnih pitanja vezana za proveravanje modela, semantiku programskih jezika i apstraktnu interpretaciju (57-63) kao i pitanja 4, 20-21, 35-40
Za deo gradiva za koji nisu držana predavanja (pitanja 57-63) možete koristiti video materijale i materijale sa strane kursa.

Za praktični deo ispita, neophodni broj alata je smanjen sa 5 na 4, a broj poena za svaki alat je adekvatno skaliran.

Za sve nejasnoće, javite se mejlom.

02.02.2025.

Testovi

U skladu sa tekućim dešavanjima, do daljnjeg nećemo imati nikakve aktivnosti, pa ni testove.

08.12.2024.

Seminarski radovi - Kreiranje repozitorijuma za rad

Molimo studente koji nisu prihvatili pozivnice na GitHub-u da to urade do subote, 7. decembra u 20h. Pozivnice se mogu prihvatiti tako što sa ulogovanim nalogom posetite glavnu stranicu GitHub organizacije za kurs. Alternativno, moguće je naći pozivnicu unutar "Your organizations" menija (uputstvo).

U subotu uveče će biti automatski kreirani timovi i repozitorijumi za izradu seminarskih radova, i dodaljene odgovarajuće permisije prijavljenim GitHub nalozima. GitHub nalozi koji nisu članovi organizaciju nemaju pristup repozitorijumima za izradu seminarskih radova. Uputstva za organizaciju i izradu seminarskih radova se mogu naći unutar kartice sa obavezama studenata.

05. 12. 2024.

Otkazivanje trećeg testa

U skladu sa tekućim dešavanjima i kako bismo izbegli potencijalne neprijatnosti, test koji je zakazan za četvrtak 5. decembar ćemo odložiti za četvrtak 12. decembar. Za sva obaveštenja, pratite stranu kursa.

04.12.2024.

Treći test

Po zvaničnim informacijama, nastava se obustavlja do kraja ove nedelje. Zbog toga nećemo imati časove predavanja. Kako test nije nastava, smatram da test koji je zakazan za četvrtak 5. decembar treba da se održi. Time se ne remeti blokada nastave.

Dakle, u četvrtak 5. decembra ćemo imati treći test u učionici 718 u 10h. Ko želi, može da radi dva pitanja po izboru. Specijalno, pošto nemamo nastavu posle toga, možete da radite i sva tri pitanja. Test nije obavezan.

04.12.2024.

Pristup organizaciji

Svim studentima koji su prijavili projekat poslate su pozivnice za pristup organizaciji. Poziv je neophodno prihvatiti kako bi kasnije bili kreirani odgovarajući repozitorijumi.

Ukoliko ste prijavili projekat a niste dobili pozivnicu, javite se na mejl predmetnom asistentu.

01. 12. 2024.

Održavanje vežbi do kraja semestra

Vežbe će se održavati u jednom terminu i to:

  • sa početkom u 17h na Studentskom trgu - učionica RLAB (20.11, 27.11, 04.12)
  • sa početkom u 18h na Studentskom trgu - učionica RLAB (11.12, 18.12, 25.12)

18. 11. 2024.

Drugi test

U četvrtak 21. novembra ćemo imati drugi test u učionici 718 u 10h. Ko želi, može da radi i samo prvo ispitno pitanje, prvo i drugo ispitno pitanje, ili samo drugo ispitno pitanje. Test nije obavezan.

18. 11. 2024.

Promena lokacije održavanja vežbi

Vežbe za grupu 5IB će se održavati po rasporedu časova u učionici N252 umesto u učionici JAG1.

05. 11. 2024.

Praktični seminarski radovi

Anketa za prijavu praktičnog seminarskog rada se nalazi na linku. Anketa važi i za grupne i za samostalne radove.

Praktični radovi iz prethodnih školskih godina se mogu naći ovde.

Rok za prijavu teme je 1. decembar.

05. 11. 2024.

Prvi test i časovi predavanja u četvrtak 7. novembra

U četvrtak 7. novembra ćemo imati četiri časa predavanja na kursu Verifikacija softvera (od 9h do 13h), pošto časovi kursa Konstrukcija i analiza algoritama 2 neće biti držani. Neke naredne nedelje imaćete Konstrukciju i analizu algoritama 2 umesto Verifikacije softvera (bićete na tu temu blagovremeno obavešteni). Prva dva časa biće održana u 718, a druga dva u 704.

Imaćemo najpre jedan čas predavanja, završićemo temu testiranja softvera i onda ćemo imati test u 718, sa poćetkom u 10h. I naredne testove verovatno ćemo organizovati u 718. u 10h (o čemu ćete biti svaki put obavešteni na vreme). Nakon testa, nastavićemo dalje sa gradivom. Moguće je da će biti potrebno i da vas podelim u dve grupe za test, ali to ćemo odlučiti na licu mesta (kako trenutno stoje stvari po broju prijavljenih, na granici smo za dve grupe).

05. 11. 2024.

Izmena rasporeda časova

Studenti su podeljeni na dve grupe za vežbe. Obratite pažnju na izmene u rasporedu časova i proverite u Hipatiji u kojoj ste grupi.

29. 10. 2024.

Polaganje teorije u toku godine

Studenti zainteresovani da deo teorije polože u terminima predavanja u toku semestra mogu da rade ispitna pitanja okvirno u narednim terminima (proveravajte termine u toku godine):

  • Prvo ispitno pitanje - 7. novembar (pitanja sa spiska ispitnih pitanja vezana za testiranje (5-19))
  • Drugo ispitno pitanje - 21. novembar (pitanja sa spiska ispitnih pitanja vezana za kvalitet softvera (1-3), debagovanje, profajliranje, analizu binarnog koda (22-34))
  • Treće ispitno pitanje - 5. decembar (pitanja sa spiska ispitnih pitanja vezana za simboličko izvršavanje (41-56))
  • Četvrto ispitno pitanje - 19. decembar (pitanja sa spiska ispitnih pitanja vezana za proveravanje modela (57-72))
  • Peto ispitno pitanje - 26. decembar ili u terminu polaganja ispita (pitanja sa spiska ispitnih pitanja: 4, 20-21, 35-40, 73-79)
Svaka provera znanja trajaće 15-20 minuta. Jedno ispitno pitanje vredi 10 poena.

Možete izaći na jedno ili više ispitnih pitanja, nezavisno. U jednom terminu možete polagati i više ispitnih pitanja (npr nadoknaditi ako niste polagali neko prethodno pitanje). U slučaju polaganja više ispitnih pitanja, nije zagarantovana tišina (predavanje može da bude u toku).

Ako izađete, poeni su konačni i ne možete ponovo da polažete to ispitno pitanje na ispitu. Ako ne izađete, onda ćete to polagati u regularnom terminu ispita. Za sve nejasnoće, javite se mejlom. Ako izvučete ispitno pitanje koje niste spremili, možete da izvučete drugo ispitno pitanje, ali onda je maksimalni broj poena 6.

25. 10. 2024.

Nastava u prvoj nedelji

U prvoj nedelji neće biti održane vežbe (sreda 09.10.2024).

Predavanja će se održati po rasporedu časova, u četvrtak od 11h.
Zbog upisa studenata na master studije koji se poklapa sa terminom predavanja, ni predavanja u prvoj nedelji neće biti održana.

08. 10. 2024.

Početak semestra

Svim studentima želimo uspešan početak godine!

27. 09. 2024.

Matematički fakultet, Univerzitet u Beogradu
školska 2020/21. godina