AdaCore

Product Roadmap

This roadmap represents the current state of AdaCore plans for its technology. It is not binding, and can change without notice.

Products marked as “Beta” can be made available to customers supported on the corresponding products by contacting AdaCore support (https://www.adacore.com/support).

Customers interested in trying out capabilities that they don’t have access to yet, or who are interested in discussing a more detailed status update can contact info@adacore.com.
Release27
GNAT Pro
GCC Compiler
Transition to GCC-15

The GCC back-end of GNAT Pro will migrate to GCC-15.

LLVM Compiler
32-bit support for the LLVM back-end

The LLVM back-end of GNAT Pro will support 32-bit Linux and Windows.

Upgrade to LLVM 21

The LLVM back-end of GNAT Pro will migrate to LLVM 21.

Productizing the GPR2 library

The GPR2 library (libgpr2) will be released in production.

Rust support in gprbuild2

gprbuild2 will include support for Rust language development.

GNAT Pro for Ada
Embedded and Real-Time OS Support
GNATcoll for VxWorks 7

GNATcoll is a library of Ada capabilities. It will be ported to VxWorks 7 on all supported architectures.

GNAT Pro Ada for Android

GNAT Pro Ada will support 64-bit Arm Android targets.

VxWorks 7 Ada Bindings

This release documents how to generate an Ada API that allows direct access to the VxWorks 7 C APIs, using h2ads.

LLVM Compiler
Ada compiler using LLVM

Add support for Ada compilation on 32-bit x86-Windows using LLVM

Shared Ada runtimes for Linux GNAT LLVM

GNAT Pro will include shared and static position-independent Ada runtimes for use with the LLVM back-end.

GNAT Pro for C/C++
LLVM Compiler
C compiler using LLVM

Support C compilation on 32-bit x86-Windows using LLVM

GNAT Pro for Rust
Embedded and Real-Time OS Support
Rust version 1.93.0

GNAT Pro for Rust will support Rust 1.93.0

New Ports
No-std target support for 32-bit ARM bare metal

GNAT Pro for Rust will support 32-bit Arm bare-metal as a no-std target. This new cross target is available on x86_64 Linux hosts.

Toolchain
Improved VxWorks Rust Debugging

GNAT Pro for Rust will support Rust debugging on VxWorks targets using vxlink and vxgdb, offering a seamless debugging experience for Rust developers.

Libtest support for no-std targets

Libtest-based testing will be available for no-std targets. This will make no-std embedded development much more similar to native Rust development, reducing development costs.

Rust MC/DC support

Rustc will generate coverage information up to and including Modified Condition / Decision Coverage (MC/DC). This support will integrate seamlessly with GNATcoverage, allowing Rust to be used for safety-critical software development at the highest levels.

CodeSonar for Ada
Checkers for CWE Top 25 Most Dangerous Software Weaknesses

The CWE Top 25 Most Dangerous Software Weaknesses List highlights the most severe and prevalent weaknesses behind the huge number of records in the Common Vulnerabilities and Exposures (CVE) dataset. Checking code for these weaknesses is a useful way to manage risk and build safe and secure code. In the 27 release, we will be adding checkers for CWE-400: Uncontrolled Resource Consumption and CWE-401: Missing Release of Memory after Effective Lifetime.

Extend taint API coverage

We are increasing the number of APIs we search during taint analysis. We will be able to recognize tainted data from more sources and track it to more sinks. The result will be more secure code with fewer threat surfaces for malicious actors to exploit.

Integrate GNAT SAS findings in CodeSonar

The power of GNAT SAS and CodeSonar, together. Analyze your Ada code with GNAT SAS, then manage and explore those findings in our web-based user interface.

Interprocedurality for Type State

We are working to provide insight into the state of a type that is an input to, or assigned in, a different procedure. Having this sort of insight will help developers write correct code.


LKQL static typing

LKQL will offer a static type system, allowing for easier maintenance over time.

LKQL will offer quick fixes

LKQL will offer quick fixes through GNATsas for common issues, when run from the command line.

LKQL will support more languages

LKQL will offer support for more languages, starting with languages that use the LangKit frontend.

Quick fixes for GNATcheck rules

Has GNAT SAS reported a style violation? Ask it to propose a possible remediation. If you agree with the suggestion, apply it to your code. This new feature can be accessed via an agentic workflow, or you can work interactively in VSCode.

Report GNATcheck findings in SARIF

GNATcheck findings will now be included in the SARIF report. This will increase the amount of information available in third-party tools that import SARIF.

CodeSonar for C/C++
Compiler Models
Modernize the SOFTUNE compiler model
Integrations
Bundle the CI/CD Integrations in CodeSonar

All the CI/CD tool integrations will be included in the CodeSonar installation. This will make it easier for your tools administrator to find the integrations and configure your DevSecOps pipeline.

Java/C#/Kotlin Improvements
Add support for Android 16 API

Analyze your Android code against the latest version.

MISRA, AUTOSAR, and CERT Standards Coverage
Complete MISRA C++:2023 Support

CodeSonar will check C++ code for violations of all MISRA C++:2023 coding guidelines developed by the Motor Industry Software Reliability Association. The MISRA C++:2023 helps teams write C++ that is safer, more portable, and more maintainable, particularly where failure has serious consequences.

Support for AI
AI-enabled Automation and Annotation Workflows

Enjoy the efficiency and cost-effectiveness of algorithmic static analysis with the power of an AI assisted workflow. We will be adding annotation and tool administration tasks to our powerful remediation and explanation capabilities.

Improve CERT-C Checker Accuracy

Improve the precision and recall for our CERT C checkers for EXP46-C, EXP34-C, FLP34-C, FLP36-C, PRE31-C, EXP36-C, DCL40-C, INT31-C, EXP30-C, MEM33-C, DCL36-C, MSC38-C, MSC39-C, EXP47-C, and DCL41-C.

GNAT DAS
GNATcoverage
Coverage origin reporting

GNATcoverage will be able to filter the report given a specific origin (e.g. report only coverage for a specific test).

Expanded build systems support for cross targets and Windows hosts

GNATcoverage support of non-gpr build systems such as make and cmake will be expanded to include Windows hosts and cross-compilation configurations.

Incremental instrumentation

GNATcoverage will no longer re-generate instrumented sources which have not changed and for which the dependencies have not changed, thus improving incremental instrumentation and build times.

Integrated coverage instrumentation support for cross targets and Windows

The integrated instrumentation process, which produces a wrapper to be used seamlessly instead of the original compiler in the build system, will support cross-target configurations and windows hosts.

Support for definition of finer-grained exemptions

GNATcoverage will allow defining of exemptions of specific conditions, outcomes, or branches of a decision when full MC/DC coverage cannot be achieved.

GNATfuzz
GNATfuzz Adaptive Fuzzing Engine Stabilization

The GNATfuzz Adaptive Fuzzing Engine extends on-target fuzzing to hardware platforms that are typically unsupported by traditional fuzzing engines.

GNATfuzz Atomic Commands

GNATfuzz will be re-shaped into a set of atomic commands
for greater modularity, which benefits power users who
need specific fuzzing setups.

GNATfuzz CI/CD pipelines support

GNATfuzz will be seamlessly integrated into Continuous
Integration (CI) and Continuous Delivery (CD) workflows.

GNATfuzz C Language Support

GNATfuzz will fully support the automated fuzzing of C applications.

This feature will be made available as beta, not intended for production.

GNATfuzz Windows Support

GNATfuzz was initially implemented for x86_64 Linux. It will be ported to x86_64 Windows.

GNATfuzz Workflow Fuzz-Everything Stabilization

Improved stability of the fuzz-everything workflow

GNATfuzz Workflow Hot-Spot

The Hot-Spot workflow bridges the gap between static and dynamic analysis by using GNATfuzz to automatically validate SARIF reports (like those from GNAT SAS and SPARK).

Integration of libFuzzer

GNATfuzz will integrate libFuzzer, a highly efficient, in-process fuzzing engine to its existing suite of fuzzing engines (AFL++, CmpLog, and SymCC). This enables the use of GNATfuzzer with GNAT Pro and LLVM.

GNATtest
Add Xunit test report format

GNATtest will be able to produce a test report in xUnit format, facilitating integration of GNATtest within CI/CD environments.

Enhanced external test case format

GNATtest will support ingesting external files describing full test case scenarios, including test inputs for the subprogram under test, expected outputs, and possibly stub configurations if applicable.

External subprogram stubbing support

GNATtest will have support for stubbing subprograms imported from another language, such as thin bindings

jUnit report format support

GNATtest will be able to generate test reports in the jUnit format, allowing simpler integration within CI/CD environments

Support for automatic test generation for class-wide types and access types

Limited support for test generation and test serialization for access types and class-wide tagged types will be available.

SPARK Pro
Language Evolution
Allow functions with side-effects in more locations

SPARK will allow calls to functions with side-effects in more contexts. In particular, it will be possible to call functions with side-effects:

  • in the conditions of if statements and elsif branches;

  • in case statements; and

  • in return statements.

Generalized finalization

SPARK developers will be able to use the Finalizable aspect, a GNAT extension, to specify that a record type provides the same level of control on the operations of initialization and finalization of objects as the controlled types. Since controlled types remain unsupported in SPARK, developers will be able to implement automated reclamation for their record types.

Precise global and parameter modes by proof

In SPARK's modular analysis, an in/out parameter of or global modifed by a called subprogram is assumed to be completely and unconditionally modified by the call; developers must therefore state explicitly everything that is not modified and when, whenever greater precision is desired.

In the Modifies aspect, developers will be able to state when a parameter or global is modified and which parts, for composite types. For example:

   type R is record
F1, F2 : Boolean;
end record;
type RR is record
G1, G2 : R;
end record;

procedure Write_G1_F1 (B : Boolean; X : in out RR) with
Modifies => X.G1.F1 when B;

procedure Write_G1_F1 (B : Boolean; X : in out RR) is
begin
if B then
X.G1.F1 := False;
end if;
end Write_G1_F1;
Precise support for overlays

Objects that share the same underlying memory region are referred to as overlays. SPARK will handle these objects precisely, in simple cases. As an example, we will be able to prove the following code:

with Interfaces; use Interfaces;
procedure Test with SPARK_Mode is
type Four_Small_Ints is record
F, G, H, I : Unsigned_8;
end record;
for Four_Small_Ints use record
F at 0 range 0 .. 7;
G at 0 range 8 .. 15;
H at 0 range 16 .. 23;
I at 0 range 24 .. 31;
end record;

X : Unsigned_32 := 256;
Y : Four_Small_Ints with Import, Address => X'Address;
begin
pragma Assert (Y = (0, 1, 0, 0));
end;

This feature will help to enable zero-copy provable parsing of binary data into simple record types.

Refer to loop index in for .. of loops

Ada provides array component iterators and container element iterators using the for .. of syntax, which yields cleaner loop bodies than for .. in without the need to capture the current element in a constant declaration inside the loop. However, since SPARK uses induction to prove loops, for .. of generally cannot be used as the loop index is typically required for induction.

SPARK and Ada will offer a new attribute 'Loop_Index that allows the current loop iteration to be retrieved from array component or container element. This allows induction to be performed while using for .. of.

For example, it will be possible to write:

   for E of S loop
if E = 0 then
C := C + 1;
end if;
pragma Loop_Invariant (C <= E'Loop_Index);
end loop;

where previously the loop would have required for .. in, instead, to establish the bound on C using induction.

Refer to values at labels

SPARK (and Ada) developers will be able to use 'At refer to the value of an object at a previous program point. Currently, Ada provides 'Old and 'Loop_Entry, which allow the initial value of a subprogram parameter or the initial value of an object at the time a loop was entered to be referenced, respectively. Using 'At, a developer will be able to refer to the value of an object at a specific label, like this:

X := 1;
<<My_Label>>
X := 2;
pragma Assert ((X-1)'At (My_Label) = 0);

which is equivalent to

X := 1;
declare
Compiler_Generated_Unique_Name : constant Integer := (X-1);
begin
X := 2;
pragma Assert (Compiler_Generated_Unique_Name = 0);
end;
User Experience
Access type conversions in the SPARKlib

Access-type conversions, like overlays, can be used to reinterpret a value of a given type as a value of another type. This is especially useful for providing a typed reinterpretation of binary data with zero copies. While overlays provide an effective means to accomplish this within a subprogram, access-type conversions allow the resulting typed reinterpretation to be exported for use by the rest of the program.

SPARK will support access-type conversions safely via the SPARKlib. The result of the conversion is a borrow or an observe.

Feedback on why provers stopped working on unproved checks

SPARK will provide information about why its provers stopped working on unproved checks.

Broadly speaking, provers stop working checks for one of two reasons:

  1. The provers reached configured resource limits. SPARK limits its provers with timeouts, step limits and memory limits. If a prover stopped working because a given limit was reached, increasing that limit might result in a proved check.

  2. The provers stopped working on the check even though resource limits were not reached. SPARK's provers have internal heuristics that sometimes cause the provers to stop work early. This does not necessary mean the check is proved false; it does mean that increasing timeout or step limit, for example, will not help.

SPARK will provide this information via new information appended to the check message:

  • [provers reached <limit> limit before completing the proof], where <limit> is one or more of time, step, and memory (e.g. [provers reached time and step limit before completing the proof]), or

  • [provers gave up before completing the proof]

In both cases, following the guidance in the section "How to Investigate Unproved Checks" of the SPARK User Guide remains our strong recommendation.

Show if proof comes from a cache

SPARK will offer insight into whether a proved check was (re)proved by the solvers on the current run or served from a cache (local or file-based memcached). This can help explain situations in which SPARK results appear to be nondeterministic and can aid in debugging memcached-based CI deployments of SPARK.

Tree container library in the SPARKlib

The SPARKlib will provide formal and functional generic trees. Like the other containers in the SPARKlib, developers can use these containers in their code and prove properties about the containers and the elements contained therein.