M.A. Costea
Please Note
17 records found
1
This work presents the most common Rayon usages across the top 1000 open-source Rust repositories on Github, measured by stargazer count and filtered for usage of Rayon. We perform a manual analysis on 5 repositories, identifying themes within selected instances.
We contextualise these themes to characterize how Rayon is used for complex workloads, where unsafe code is combined with Rayon, and where parallel iterators are insufficient. ...
This work presents the most common Rayon usages across the top 1000 open-source Rust repositories on Github, measured by stargazer count and filtered for usage of Rayon. We perform a manual analysis on 5 repositories, identifying themes within selected instances.
We contextualise these themes to characterize how Rayon is used for complex workloads, where unsafe code is combined with Rayon, and where parallel iterators are insufficient.
Message Passing in Rust Applications
An exploratory analysis of channel primitives, architectural patterns, and communication roles
Repositories were selected from the Awesome Rust applications collection and classified according to four communication categories. The resulting repositories were then analysed using an automated channel-count analysis to identify message-passing primitives, followed by template-guided manual analysis to identify communication structures and message-passing roles.
The results show that Rust applications employ a diverse range of message-passing primitives and communication patterns. Message passing is commonly organised around dedicated receiving components and is primarily used for data transport, event propagation, and coordination between concurrent tasks. Rather than relying on a single communication pattern, applications frequently combine multiple communication structures and roles within the same codebase.
This work provides an exploratory empirical analysis of message passing in Rust applications and introduces a structured methodology for analysing message-passing usage in software systems. ...
Repositories were selected from the Awesome Rust applications collection and classified according to four communication categories. The resulting repositories were then analysed using an automated channel-count analysis to identify message-passing primitives, followed by template-guided manual analysis to identify communication structures and message-passing roles.
The results show that Rust applications employ a diverse range of message-passing primitives and communication patterns. Message passing is commonly organised around dedicated receiving components and is primarily used for data transport, event propagation, and coordination between concurrent tasks. Rather than relying on a single communication pattern, applications frequently combine multiple communication structures and roles within the same codebase.
This work provides an exploratory empirical analysis of message passing in Rust applications and introduces a structured methodology for analysing message-passing usage in software systems.
Concurrency and Async Practices in Real-World Rust
How are lock-free and atomic-based concurrency techniques used in Rust crates?
Asynchronous Programming in Rust
An Empirical Analysis on the Usage of Asynchronous Code by Rust Developers
In this paper, we present Rustc-Analysis, an automated analysis tool for discovering and extracting underlying structural information of asynchronous Rust code. We subsequently use this tool to analyze runtime adoption and characterize the functionality provided by asynchronous APIs.
Our analysis shows that asynchronous APIs are mainly used for I/O-related tasks, particularly networking and file-system operations, as well as synchronization between concurrent tasks. Furthermore, we find tokio to be the most widely adopted runtime, followed by futures, async-std and smol. ...
In this paper, we present Rustc-Analysis, an automated analysis tool for discovering and extracting underlying structural information of asynchronous Rust code. We subsequently use this tool to analyze runtime adoption and characterize the functionality provided by asynchronous APIs.
Our analysis shows that asynchronous APIs are mainly used for I/O-related tasks, particularly networking and file-system operations, as well as synchronization between concurrent tasks. Furthermore, we find tokio to be the most widely adopted runtime, followed by futures, async-std and smol.
Understanding Shared-Memory Concurrency Usage in Rust Systems
A Qualitative Study of Concurrency Primitives, Thread Organisation Models, Workloads, and Functional Roles
The results show that a small set of primitives, namely Arc, Mutex, and RwLock, accounts for most observed concurrency usage, while specialised primitives appear comparatively rarely. Shared-state concurrency appeared to be the dominant thread organisation model, although actor/message-passing approaches were also commonly used. Across the analysed files, concurrency-related code was primarily used for coordination-heavy responsibilities such as runtime management, resource coordination, event dispatch, request handling, and state management rather than computational work. The findings further show that higher-level architectural patterns frequently rely on shared-memory mechanisms, even when message passing forms the primary organisational model. Several trade-offs were identified between simplicity, scalability, modularity, and coordination complexity. Overall, the study suggests that shared ownership in Rust is used primarily to coordinate access to shared state and resources, and that shared ownership and synchronised access remain foundational despite the availability of other concurrency abstractions. The findings provide insights into how shared-memory concurrency is applied in native Rust systems and provide a foundation for future research on concurrency design practices in Rust software. ...
The results show that a small set of primitives, namely Arc, Mutex, and RwLock, accounts for most observed concurrency usage, while specialised primitives appear comparatively rarely. Shared-state concurrency appeared to be the dominant thread organisation model, although actor/message-passing approaches were also commonly used. Across the analysed files, concurrency-related code was primarily used for coordination-heavy responsibilities such as runtime management, resource coordination, event dispatch, request handling, and state management rather than computational work. The findings further show that higher-level architectural patterns frequently rely on shared-memory mechanisms, even when message passing forms the primary organisational model. Several trade-offs were identified between simplicity, scalability, modularity, and coordination complexity. Overall, the study suggests that shared ownership in Rust is used primarily to coordinate access to shared state and resources, and that shared ownership and synchronised access remain foundational despite the availability of other concurrency abstractions. The findings provide insights into how shared-memory concurrency is applied in native Rust systems and provide a foundation for future research on concurrency design practices in Rust software.
Dataset: https://doi.org/10.4121/f0b3b808-51c3-4637-b6ff-3654506da71c ...
Dataset: https://doi.org/10.4121/f0b3b808-51c3-4637-b6ff-3654506da71c
To solve this problem we propose a novel mechanism for detecting memory safety violations across language boundaries. We implemented it in a tool called MiriPBT: a combination of MIRI, a tool that can enforce ownership rules at runtime, MiriLLI, an extension of MIRI that allows ownership rules to be enforced on the other side of the FFI boundary, and Property Based Testing, which allows us to greatly increase the size of the domain we can test. We use Rust's type system to generate inputs for the PBT and use the runtime checks of MIRI and MiriLLI to check if any ownership rules are violated. Finally we present the result of the PBT in a format an average Rust user can easily understand, helping them resolve any FFI related ownership bugs in their code. ...
To solve this problem we propose a novel mechanism for detecting memory safety violations across language boundaries. We implemented it in a tool called MiriPBT: a combination of MIRI, a tool that can enforce ownership rules at runtime, MiriLLI, an extension of MIRI that allows ownership rules to be enforced on the other side of the FFI boundary, and Property Based Testing, which allows us to greatly increase the size of the domain we can test. We use Rust's type system to generate inputs for the PBT and use the runtime checks of MIRI and MiriLLI to check if any ownership rules are violated. Finally we present the result of the PBT in a format an average Rust user can easily understand, helping them resolve any FFI related ownership bugs in their code.
Property-Based Testing in Haskell
An Analysis of QuickCheck usage in Open-Source Haskell Projects
QuickCheck properties and manually sample 217 of them to classify property types such as invariants, roundtrip checks, algorithm correctness, and idempotence. We also analyze all extracted properties to identify patterns in generator and shrinking strategies. Our Results show that invariants and test-oracle tests dominate the sampled properties, while custom generators are used in 55.8% of all properties and custom shrinkers in only 25%. We discuss how these patterns vary across different domains (data structures, text processing, optics, hashing) and highlight the tension between default and custom test infrastructure. Finally, we reflect on the implications for tool support, education, and future research particularly automatic generator inference and improved shrinking utilities to lower
the barrier to effective PBT in large codebases. ...
QuickCheck properties and manually sample 217 of them to classify property types such as invariants, roundtrip checks, algorithm correctness, and idempotence. We also analyze all extracted properties to identify patterns in generator and shrinking strategies. Our Results show that invariants and test-oracle tests dominate the sampled properties, while custom generators are used in 55.8% of all properties and custom shrinkers in only 25%. We discuss how these patterns vary across different domains (data structures, text processing, optics, hashing) and highlight the tension between default and custom test infrastructure. Finally, we reflect on the implications for tool support, education, and future research particularly automatic generator inference and improved shrinking utilities to lower
the barrier to effective PBT in large codebases.
Property Based Testing in Rust, How is it Used?
A case study of the ‘quickcheck‘ crate used in open source repositories
Programming Language Tooling for Hylo
Incremental Compilation and Analysis
Exploring Property-Based Testing in Java
An Analysis of jqwik Usage in Open-Source Repositories
Property-Based Testing in Practice using Hypothesis
In-depth study on how developers use Property-Based Testing in Python using Hypothesis
Our analysis reveals that while PBTs are relatively rare in these repositories, they are often simple in structure and highly effective at expressing functional properties. The most common patterns include round-trip checks and comparisons against test oracles, which account for a significant portion of the test suite. We also observed a high rate of custom generator usage (39.1%), but no use of custom shrinking, suggesting strong defaults in Hypothesis. The dataset was variable in stylistic and structural choices, ranging from single-assertion tests to complex hardware-dependent cases.
This study provides new insights into the practical use of PBT in Python, expands on prior quantitative work with qualitative findings, and identifies concrete implications for improving testing frameworks and educational resources. We conclude with recommendations for supporting broader adoption of PBT and outline directions for future research, including cross-language comparison, automated annotation, and temporal analysis of test evolution. ...
Our analysis reveals that while PBTs are relatively rare in these repositories, they are often simple in structure and highly effective at expressing functional properties. The most common patterns include round-trip checks and comparisons against test oracles, which account for a significant portion of the test suite. We also observed a high rate of custom generator usage (39.1%), but no use of custom shrinking, suggesting strong defaults in Hypothesis. The dataset was variable in stylistic and structural choices, ranging from single-assertion tests to complex hardware-dependent cases.
This study provides new insights into the practical use of PBT in Python, expands on prior quantitative work with qualitative findings, and identifies concrete implications for improving testing frameworks and educational resources. We conclude with recommendations for supporting broader adoption of PBT and outline directions for future research, including cross-language comparison, automated annotation, and temporal analysis of test evolution.
Debugging Hylo
Providing Debugging Support to a Modern, Natively-Compiled Programming Language
High-Fidelity C Interoperability in Hylo
A Principled Design for Safe and Idiomatic C Bindings
This paper presents a principled technical design for a C interoperability layer for Hylo that addresses these challenges. We propose an architecture that leverages Clang for high-fidelity parsing and correct ABI handling, and a semantic mapping framework based on sensible defaults with developer-driven customization. This approach allows ambiguous C constructs to be mapped to the most appropriate and idiomatic Hylo representation, balancing automation with developer control. The result is a complete roadmap for a powerful and usable interoperability solution. ...
This paper presents a principled technical design for a C interoperability layer for Hylo that addresses these challenges. We propose an architecture that leverages Clang for high-fidelity parsing and correct ABI handling, and a semantic mapping framework based on sensible defaults with developer-driven customization. This approach allows ambiguous C constructs to be mapped to the most appropriate and idiomatic Hylo representation, balancing automation with developer control. The result is a complete roadmap for a powerful and usable interoperability solution.
can be automatically generated from these rules, saving one from the burden of writing
it manually. One of the problems with these generated type checkers is performance;
handwritten type checkers usually outperform the generated ones. Statix uses the formalism of scope graphs to represent name binding, and querying these scope graphs is
known to be the main performance bottleneck. Improving the performance of queries
means improving the performance of the type checkers generated by Statix.
In this thesis, we propose a memoised variant of the current state-of-the-art query
resolution algorithm that memoises data encountered during graph traversal, reducing
future queries to a cache lookup. We also identify common patterns in real-world scope
graphs and link those to the name binding structure that created them. We construct a
synthetic dataset with these patterns that is used to evaluate query resolution algorithms
with microbenchmarks. This gives us more granular information on what name binding
structures benefit most, if at all, from memoisation.
The results of these benchmarks are the performance differences between the memoised algorithm and the current state-of-the-art algorithm per identified pattern. They
show that our proposed algorithm breaks even in terms of performance after only two
queries for most patterns. Furthermore, we demonstrate that our proposed algorithm
and the current state-of-the-art provide identical efficacy. The tradeoffs are twofold: the
cache increases the memory usage of query resolution significantly and the query resolution parameters were tweaked to make caching possible, but less versatile. The changed
query parameters’ limitations should only be theoretical however, the Statix specification
for Java 1.5 has 23 out of 25 fully compatible queries. ...
can be automatically generated from these rules, saving one from the burden of writing
it manually. One of the problems with these generated type checkers is performance;
handwritten type checkers usually outperform the generated ones. Statix uses the formalism of scope graphs to represent name binding, and querying these scope graphs is
known to be the main performance bottleneck. Improving the performance of queries
means improving the performance of the type checkers generated by Statix.
In this thesis, we propose a memoised variant of the current state-of-the-art query
resolution algorithm that memoises data encountered during graph traversal, reducing
future queries to a cache lookup. We also identify common patterns in real-world scope
graphs and link those to the name binding structure that created them. We construct a
synthetic dataset with these patterns that is used to evaluate query resolution algorithms
with microbenchmarks. This gives us more granular information on what name binding
structures benefit most, if at all, from memoisation.
The results of these benchmarks are the performance differences between the memoised algorithm and the current state-of-the-art algorithm per identified pattern. They
show that our proposed algorithm breaks even in terms of performance after only two
queries for most patterns. Furthermore, we demonstrate that our proposed algorithm
and the current state-of-the-art provide identical efficacy. The tradeoffs are twofold: the
cache increases the memory usage of query resolution significantly and the query resolution parameters were tweaked to make caching possible, but less versatile. The changed
query parameters’ limitations should only be theoretical however, the Statix specification
for Java 1.5 has 23 out of 25 fully compatible queries.