Mix Testing: Specifying and Testing ABI Compatibility of C/C++ Atomics Implementations

Fuente: arXiv
Guardado en:
Detalles Bibliográficos
Autores principales: Geeson, Luke, Brotherston, James, Dijkstra, Wilco, Donaldson, Alastair F., Smith, Lee, Sorensen, Tyler, Wickerson, John
Formato: Preprint
Publicado: 2024
Materias:
Acceso en línea:
Etiquetas: Agregar Etiqueta
Sin Etiquetas, Sea el primero en etiquetar este registro!
_version_ 1866912011034558464
author Geeson, Luke
Brotherston, James
Dijkstra, Wilco
Donaldson, Alastair F.
Smith, Lee
Sorensen, Tyler
Wickerson, John
author_facet Geeson, Luke
Brotherston, James
Dijkstra, Wilco
Donaldson, Alastair F.
Smith, Lee
Sorensen, Tyler
Wickerson, John
contents The correctness of complex software depends on the correctness of both the source code and the compilers that generate corresponding binary code. Compilers must do more than preserve the semantics of a single source file: they must ensure that generated binaries can be composed with other binaries to form a final executable. The compatibility of composition is ensured using an Application Binary Interface (ABI), which specifies details of calling conventions, exception handling, and so on. Unfortunately, there are no official ABIs for concurrent programs, so different atomics mappings, although correct in isolation, may induce bugs when composed. Indeed, today, mixing binaries generated by different compilers can lead to an erroneous resulting binary. We present mix testing: a new technique designed to find compiler bugs when the instructions of a C/C++ test are separately compiled for multiple compatible architectures and then mixed together. We define a class of compiler bugs, coined mixing bugs, that arise when parts of a program are compiled separately using different mappings from C/C++ atomic operations to assembly sequences. To demonstrate the generality of mix testing, we have designed and implemented a tool, atomic-mixer, which we have used: (a) to reproduce one existing non-mixing bug that state-of-the-art concurrency testing tools are limited to being able to find (showing that atomic-mixer at least meets the capabilities of these tools), and (b) to find four previously-unknown mixing bugs in LLVM and GCC, and one prospective mixing bug in mappings proposed for the Java Virtual Machine. Lastly, we have worked with engineers at Arm to specify, for the first time, an atomics ABI for Armv8, and have used atomic-mixer to validate the LLVM and GCC compilers against it.
format Preprint
id arxiv_https___arxiv_org_abs_2409_01161
institution arXiv
publishDate 2024
record_format arxiv
spellingShingle Mix Testing: Specifying and Testing ABI Compatibility of C/C++ Atomics Implementations
Geeson, Luke
Brotherston, James
Dijkstra, Wilco
Donaldson, Alastair F.
Smith, Lee
Sorensen, Tyler
Wickerson, John
Programming Languages
D.3.4; D.2.5
The correctness of complex software depends on the correctness of both the source code and the compilers that generate corresponding binary code. Compilers must do more than preserve the semantics of a single source file: they must ensure that generated binaries can be composed with other binaries to form a final executable. The compatibility of composition is ensured using an Application Binary Interface (ABI), which specifies details of calling conventions, exception handling, and so on. Unfortunately, there are no official ABIs for concurrent programs, so different atomics mappings, although correct in isolation, may induce bugs when composed. Indeed, today, mixing binaries generated by different compilers can lead to an erroneous resulting binary. We present mix testing: a new technique designed to find compiler bugs when the instructions of a C/C++ test are separately compiled for multiple compatible architectures and then mixed together. We define a class of compiler bugs, coined mixing bugs, that arise when parts of a program are compiled separately using different mappings from C/C++ atomic operations to assembly sequences. To demonstrate the generality of mix testing, we have designed and implemented a tool, atomic-mixer, which we have used: (a) to reproduce one existing non-mixing bug that state-of-the-art concurrency testing tools are limited to being able to find (showing that atomic-mixer at least meets the capabilities of these tools), and (b) to find four previously-unknown mixing bugs in LLVM and GCC, and one prospective mixing bug in mappings proposed for the Java Virtual Machine. Lastly, we have worked with engineers at Arm to specify, for the first time, an atomics ABI for Armv8, and have used atomic-mixer to validate the LLVM and GCC compilers against it.
title Mix Testing: Specifying and Testing ABI Compatibility of C/C++ Atomics Implementations
topic Programming Languages
D.3.4; D.2.5
url https://arxiv.org/abs/2409.01161