Skip to content

Commit 9d476f5

Browse files
committed
Add newsletters from march to july
1 parent 01d56d8 commit 9d476f5

5 files changed

+188
-0
lines changed
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
---
2+
layout: post
3+
title: "Aeneas-news: March 2025"
4+
date: 2025-03-07 01:07:29 +0100
5+
categories: newsletter
6+
---
7+
A brief update on what's happening in the Aeneas project at large.
8+
9+
## Charon
10+
* Support defaulted trait methods: when a trait has a method with a default implementation, impl blocks for this trait that don't override the method now get a copy of the default method.
11+
* Better error handling: Charon no longer tries to translate code that rustc would reject.
12+
* More parsimonious output: we no longer translate trait methods that aren't used; this greatly reduces the output when using traits like Iterator.
13+
* Added a charon --read-llbc <file.llbc> option that pretty-prints the contents of that llbc file.
14+
15+
16+
## Aeneas
17+
We dramatically improved Aeneas' extraction:
18+
* several changes were made to the code generation to improve its quality and make it more fit to proofs by mean of the progress tactic
19+
* Aeneas now makes use of Charon's option --remove-associated-types to lift the associated types so that they become parameters. In the short term, this will unlock support for a large class of traits, such as iterators.
20+
21+
The Lean backend underwent a massive revamp. This includes:
22+
* changes in the definitions of the machine scalars. There are now two separate definitions, for signed and unsigned integers, and they use bitvectors in their internal representation.
23+
* building on the previous change, we added support for many more operations, such as bitwise operations or wrapping operations, together with the necessary reasoning lemmas
24+
* several attributes such as progress_pure and progress_pure_tac were introduced to automatically lift lemmas so that progress can use them, or automatically introduce progress lemmas for pure definitions
25+
* natify and bvify, inspired by zify, now allow converting propositions to propositions manipulating either natural numbers (useful to convert from bit-vectors or ZMod) or bit-vectors. A zmodify tactic is planned to complement those.
26+
* bv_tac combines bvify and bv_decide to efficiently reason by using bit-vectors
27+
several bug fixes for the progress tactics and quality of life improvements. For instance, progress with ... can now be given a term rather than an identifier.
28+
* scalar_tac is now a lot faster than before, more reliable, and solves more goals.
29+
several range definitions (which can be used with the syntax for ... in ...) together with the necessary theorems have been added to the library, for the purpose of writing clean and concise specification.
30+
* the extract_goal now allows (optionally) minimizing a goal and extracting it as a lemma. extract_assert introduces an assertion which proves the current goal.
31+
32+
## Eurydice
33+
* Overhaul the initialization of arrays -- we should now avoid emitting 1000+ assignments for arrays that are initialized with zeroes.
34+
* Preliminary support for raw pointers
35+
* Allow recursion
36+
* Clean up the test suite to run faster
37+
* Do not hide translation failures anymore, and error out cleanly if something isn't supported (rather than silently generate no code)
38+
39+
## Scylla
40+
A new projet, Scylla, is now public! https://github.com/AeneasVerif/scylla
41+
42+
Scylla aims to translate very regular, data-oriented C code to safe Rust. The ambition is that the programmer should be actively involved in rewriting their C code until it is regular and understandable enough to become eligible to a translation to Safe Rust. This approach allows running performance benchmarks, regression, integration and unit tests in the same original C build environment. Once the programmer is confident that the rewrites introduced no errors, they can invoke Scylla to get clean, idiomatic Rust code with no unsafe blocks.
43+
44+
Naturally, this does not apply to very many pieces of C code. For now, our chief use-case in the HACL* library, where we can already translate all of the bignums, along with the chacha20 algorithm. Expect to see more and more programs supported in the near future.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
layout: post
3+
title: "Aeneas-news: April 2025"
4+
date: 2025-04-07 19:43:29 +0100
5+
categories: newsletter
6+
---
7+
A brief update on what's happening in the Aeneas project at large.
8+
9+
## Charon
10+
* The README has been updated. It's now a good reflection of where the project is at and where we plan to go;
11+
* Thanks to the welcome help of @Vague, Charon now works on Windows;
12+
* Thanks again to @Vague, the cli interface of Charon was modernized and cleaner up. We've replaced:
13+
- charon [OPTIONS] becomes charon cargo [OPTIONS] [-- CARGO_OPTIONS];
14+
- charon --no-cargo [OPTIONS] becomes charon rustc [OPTIONS] [-- RUSTC_OPTIONS];
15+
- charon --read-llbc <path> becomes charon pretty-print <path>.
16+
The old options are still available but will soon be deprecated.
17+
* The --no-cargo --crate <name> option was removed because it behaved inconsistently; use --rustc-arg=--crate-name=<name> instead;
18+
* Charon now translates the lang_item identifier for built-in definitions. This makes it easier to recognize a number of built-ins like Box, String, Copy, etc;
19+
* Progress is ongoing towards supporting later MIRs (https://github.com/AeneasVerif/charon/issues/543).
20+
21+
## Aeneas
22+
* the progress_pure and progress_pure_def attributes allow automatically lifting theorems and generating theorems from definitions so that progress can use them
23+
* several new tactics: zmodify (to convert propositions so that they manipulate elements of ZMod), simp_lists (to simplify expressions like List.get (List.set ...) - it uses scalar_tac to discharge the proof obligations), simp_ifs (to simplify if then else expressions by using scalar_tac)
24+
* thanks to the work of Fernando Leal, a new progress* tactic allows repeatedly applying
25+
split and progress, while its variant progress*? generates the corresponding proof
26+
script. progress*, progress*? and progress can now use the keyword by to use a
27+
custom discharger for the preconditions. A new syntax is also possible for progress:
28+
let* ⟨ ... ⟩ ← THM_NAME (with variants: let* ⟨ b, b_post ⟩ ← * and let* ⟨ b, b_post ⟩ ← *?).
29+
* simp procedures for elements of ZMod (that we intend to port to Mathlib), which simplify
30+
constants ((17 : ZMod 12) ~> (5 : ZMod 12)), inverses ((12⁻¹ : ZMod 7) ~> (3 : ZMod
31+
7)) and powers (((2 ^ 16)⁻¹ : ZMod 3329) ~> (169 : ZMod 3329)).
32+
* removal of inefficient scalar_tac and simp lemmas which drastically improved the proof performance
33+
* many bug fixes and improvements in the tactics of the Lean backend
34+
* minor improvements of the quality of the extracted code when it contains arrays and slices
35+
* better handling of multi-files Lean projects with the -split-files and -subdir options
36+
* following changes in Charon, default trait methods are now handled properly
37+
the extracted global constants are now marked as irreducible, as Lean would otherwise
38+
expand them when trying to unify. The constants are also all marked with the global_simps
39+
simpset attribute.
40+
41+
## Eurydice
42+
* Eurydice now demands that Charon be invoked with --remove-associated-types '*', which in turn enables support for a larger class of iterators, such as chunks, chunks_exact, or range-step_by iterators -- these are now all supported (but some implementations may be missing from eurydice_glue.h, please send PRs)
43+
* expand support for generating syntactic sugar for such iterators, notably, step_by iterators are now guaranteed to be emitted as for-loops
44+
* support for generating code that is C++17-compatible; by default, code generated by Eurydice requires either C11 or C++21 -- for users who must use older versions of C++, the new -fcxx17-compat option generates code that is incompatible with C (any version) but compatible with C++17
45+
46+
## Scylla
47+
Significant progress, as we are now able to extract large chunks of HACL* from C to Rust automatically, directly using concrete C syntax as opposed to relying on the Low* intermediate representation.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
---
2+
layout: post
3+
title: "Aeneas-news: May 2025"
4+
date: 2025-05-15 19:39:29 +0100
5+
categories: newsletter
6+
---
7+
## Charon
8+
* Significant progress on supporting later MIRs: most constant-related shanigans have been fixed;
9+
Added --mir elaborated which returns a MIR that includes drops. This works in common cases, open an issue if you encounter errors with this;
10+
* Progress towards better support for closures, thanks in particular to @Opale;
11+
* Added --start-from <name> to extract the given item instead of the whole current crate;
12+
@Opale added an experimental --monomorphize flag that monomorphizes the whole contents of the crate;
13+
* Upgraded the rustc used to build charon to a recent version.
14+
15+
## Aeneas
16+
* make Aeneas more resilient to errors happening either when extracting the crate with Charon or during the translation (because of unsupported features in particular)
17+
* add support for dynamically sized types
18+
* add support for blanket implementations (those used to trigger name collisions)
19+
* add support for definitions with name clashes (in particular, functions and constants
20+
defined inside function bodies) by taking the Rust discriminators into account
21+
* general improvement of the Lean backends (more lemmas, general improvements to the tactics) and update to Lean v4.19.0
22+
23+
## Eurydice
24+
* New internal library to facilitate authoring "peephole" optimizations that rewrite AST fragments; much better support for resugaring MIR loops as for-loops as a result, with more to come
25+
26+
## Scylla
27+
* Considerable progress on the libclang-based frontend that now supports a much larger subset of actual C; many rewrites to make the translation more modular, and to synthesize well-typed internal krml ASTs before translation to Rust
28+
* Take into account C integer promotion rules
29+
* Take into account C assignments returning values
30+
* Support for nested assignments
31+
* General support for for-loops
32+
* Usability improvements with more user options
33+
* Handling of multifile projects
34+
* Support for bundling and visibility analysis
35+
* Handle C typedefs properly since the translation from C to krml's AST is type-driven
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
layout: post
3+
title: "Aeneas-news: June 2025"
4+
date: 2025-06-03 09:35:29 +0100
5+
categories: newsletter
6+
---
7+
## Charon
8+
* The representation of closures was reworked in depth thanks to @Opale. They are now translated as plain structs with the appropriate Fn{Mut,Once,} impls which should require no special support from users.
9+
* Work is in progress to reconstruct the information for which code runs in drop in a polymorphic context.
10+
* ULLBC now contains details about what happens when unwinding from a function call. This doesn't yet contain all unwinding data (it's missing drop unwinds and asserts). We plan to keep this ULLBC-only short term.
11+
* Thanks to @FireFighterDuck, Charon now emits layout information for types whose layout does not depend on generic parameters!
12+
13+
## Aeneas
14+
* minor fixes and improvements of the Lean backend
15+
16+
## Eurydice
17+
* Improved support for globals
18+
* Fix issues related to phase ordering and empty struct types
19+
* Broader support for DSTs, now supporting user-defined DSTs (e.g. struct T<U: ?Sized>), built-in DSTs (e.g. Box<[T]>), and proper coercions between the two (experimental, still some issues to be ironed out)
20+
21+
## Scylla
22+
* Support for alignment directives
23+
* Properly implement integer conversion and integer promotion rules from C
24+
* Improved set of annotations to better control e.g. what goes to a Box type or not
25+
* Fixes related to post- vs pre-increment operators
26+
* Support for casts betwent uintN* and uint8* via scylla_lib
27+
* Add support for reconstructing tagged unions as ADTs
28+
* Add support for tuples
29+
* Add support for slice reconstruction
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
---
2+
layout: post
3+
title: "Aeneas-news: July 2025"
4+
date: 2025-07-02 18:40:29 +0100
5+
categories: newsletter
6+
---
7+
## Charon
8+
* @FireFighterDuck added more details to the type layouts, in particular for the representation of enums;
9+
* @Opale added support for closure-to-fn-ptr casts;
10+
* Charon names no longer contain disambiguators for impls; this makes them more stable across time;
11+
* Work is ongoing to rework monomorphisation to be able to handle monomorphized layouts and evaluated constants;
12+
* @Opale added an option that translates Box sa a normal type instead of a built-in;
13+
* @ssyram added pointer metadata information to types (for DSTs);
14+
* Added support for the unstable trait_alias feature;
15+
* Various improvements and bug fixes, in particular around handling of generics.
16+
17+
## Aeneas
18+
* the scalar_tac attribute can now be used on theorems with preconditions, such as:
19+
```
20+
@[scalar_tac x * y]
21+
theorem lt_mul_lt_le (x y a b : ℕ) (h0 : x < a) (h1 : y < b) :
22+
x * y ≤ (a - 1) * (b - 1) := by apply Nat.le_mul_le; omega
23+
```
24+
* the tactics based on conditional rewriting with scalar_tac (simp_scalar, simp_lists, etc.) are now a lot faster
25+
* attributes like progress and scalar_tac are now compatible with asynchronous execution
26+
27+
## Eurydice
28+
* Support for &str and &String (contribution by ssyram)
29+
* Support for u128 and i128 (contribution by ssyram)
30+
* Support for closures (multiple people, relying on upstream work in charon) via closure conversion
31+
* Improvements to the compilation scheme of reborrows (&*e)
32+
* Improvement: calls to array::from_fn may now be nested, and the closure passed to array::from_fn may now capture variables
33+
* Lots of improvements to handling of traits and the compilation of trait clauses -- several cases that were previously unsupported are now handled

0 commit comments

Comments
 (0)