Abstract

Modern concurrent and distributed software is highly complex. Techniques to reason about the correct behaviour of such software are essential to ensure its reliability. To be able to reason about realistic programs, these techniques must be modular and compositional as well as practical by being supported by automated tools. However, many existing approaches for concurrency verification are theoretical and focus primarily on expressivity and generality. This paper contributes a technique for verifying behavioural properties of concurrent and distributed programs that balances expressivity and usability. The key idea of the approach is that program behaviour is abstractly modelled using process algebra, and analysed separately. The main difficulty is presented by the typical abstraction gap between program implementations and their models. Our approach bridges this gap by providing a deductive technique for formally linking programs with their process-algebraic models. Our verification technique is modular and compositional, is proven sound with Coq, and has been implemented in the automated concurrency verifier VerCors. Moreover, our technique is demonstrated on multiple case studies, including the verification of a leader election protocol.

Highlights

  • Modern software is typically composed of multiple concurrent components that communicate via shared or distributed interfaces, for example via shared-memory or via message passing.The concurrent nature of the interactions betweencomponents makes such software highly complex as well as notoriously difficult to develop correctly

  • Even though verification of concurrent and distributed software is a very active research field [1,2,3,4,5,6], most work in this line of research is essentially theoretical, and tends to focus primarily on contributing expressive program logics specialised in reasoning about advanced concurrency features like relaxed or weak memory, fine-grained concurrency, message passing interaction, etc

  • The key idea of the approach rests in the use of concurrent separation logic (CSL) to reason about data races and memory safety, which is standard [23,24], and about process-algebraic models, viewing the latter as resources that can be split and consumed

Read more

Summary

Introduction

Modern software is typically composed of multiple concurrent components that communicate via shared or distributed interfaces, for example via shared-memory or via message passing. Even though verification of concurrent and distributed software is a very active research field [1,2,3,4,5,6], most work in this line of research is essentially theoretical, and tends to focus primarily on contributing expressive program logics specialised in reasoning about advanced concurrency features like relaxed or weak memory, fine-grained concurrency, message passing interaction, etc Even though expressive, it is very challenging for these logics to be integrated into SMT-based automated verifiers like for example VeriFast [7], VerCors [8] and Viper [9,10]. This combined unified framework is proven sound with Coq and is available online at [19]

Motivation
Contributions
Outline
Approach
Example Program
Step 1
Step 2
Step 3
Formalisation
Process-Algebraic
Action Contracts
Free Variables and Substitution
Operational Semantics
Process-Algebraic Verification
Bisimulation
Programs
Standard
Specification-Only
User Programs
Wellformedness
Fault Semantics
Assertions
Heap Ownership π
Models of the Program Logic
Fractional Permissions
Permission Heaps
Process Maps
Semantics of Assertions
Semantic Entailment
Proof System
Entailment Rules
Program Judgments
Soundness
Ghost Operational Semantics
Faulting
Preservation of Process Execution Safety
After computing
Semantics of Program Judgments
Implementation
Tool Support
Coq Formalisation
Behavioural
The behavioural
Protocol Implementation
Related Work
Conclusions
Full Text
Published version (Free)

Talk to us

Join us for a 30 min session where you can share your feedback and ask us any queries you have

Schedule a call