Static Data Race Analysis of Heap-Manipulating C Programs

Date

2010-11-09

Journal Title

Journal ISSN

Volume Title

Publisher

Abstract

Kaasaegsed arvutiarhitektuurid võimaldavad üheaegselt läbi viia mitmeid arvutusi. Programmide kirjutamine niisuguste süsteemide jaoks on äärmiselt raske, kuna paralleelselt käivitatavate lõimede vaheline koosmõju on ettearvamatu. Üks eriti raskesti tabatav viga mitmelõimelises süsteemis on andmejooks, s.o. olukord, kus mitu lõime üritavad samaaegselt ühele ja samale jagatud mäluasukohale ligi pääseda. See võib kaasa tuua andmete riknemise ja sellega süsteemi kokku jooksmise või muu ebakorrektse käitumise. Staatiline programmianalüüs on formaalne meetod, millega saab välja arvutada programmi kõigi võimalike käitumiste ülemhulga, lahendades teatava andmevoogu kirjeldava võrrandisüsteemi. Käesoleva doktoritöö põhiteesiks on väide, et staatilise programmianalüüsiga on võimalik kindlaks teha andmejooksude puudumine reaalsetes keerukates süsteemides, eriti operatsioonisüsteemide tuumamoodulites. Selliste süsteemide jaoks on analüüside arendamine raskendatud, sest nii andmestruktuurid kui ka neid kaitsvad lukud luuakse alles programmi täitmise ajal. Probleemi ületamiseks on töö raames arendatud kolm uudset meetodit: aadressavaldiste võrduste analüüs, dünaamilise mälu regioon-analüüs ja süsteemkoodile sobiv mälukuju analüüs. Mainitud meetodid on realiseeritud mitmelõimeliste C programmide analüsaatorite raamistikus Goblint ja nende praktilisust on demonstreeritud mitmete vabavaraliste rakenduste ja operatsioonisüsteemi Linux tuumamoodulite analüüsiga.
Modern computer architectures are capable of carrying out many computations at the same time. Writing and testing programs for such systems is notoriously difficult because the interaction between concurrently executing threads is unpredictable. A particularly elusive flaw in shared-memory concurrent systems is the data race, a situation where multiple threads may simultaneously attempt to update the same memory location. This may result in data corruption and ultimately system malfunction. Static program analysis is an automated formal method, which computes all possible run-time behaviours of a program by solving a system of data flow equations. This dissertation contends that static analysis can be used to verify the absence of data races in real-world systems, especially operating system modules like Linux device drivers. The challenge in developing static analyses for such code is that both data structures and locks protecting the data are created at run-time. To face this problem, three novel techniques were developed: an abstract domain for equalities between address expressions, a region-based heap abstraction, and a shape domain suitable for low-level programs. We have implemented these techniques in the Goblint analyzer and used it to experimentally validate the contention that verification of race-freedom in real-world systems is possible by means of static analysis.

Description

Keywords

dissertatsioonid, matemaatika

Citation