Cstruct is a library and syntax extension to make it easier to access C-like structures directly from OCaml. It supports both reading and writing to these structures, and they are accessed via Bigarray
.
Hot on the heels of cstruct 4.0.0, I am pleased to announce another major rev cstruct 5.0.0 that adds a new module with more sophisticated types to distinguish between different sorts of buffers. The full changelog is below:
Security: This release tightens bounds checks to ensure that data outside a given view (but still inside the underlying buffer) cannot be accessed.
-
sub
does more checks (mirage/ocaml-cstruct#244 mirage/ocaml-cstruct#245 @hannes @talex5 review by @dinosaure) -
add_len
andset_len
are now deprecated and will be removed in a future release. (mirage/ocaml-cstruct#251 @hannes) - do not add user-provided data for bounds checks (mirage/ocaml-cstruct#253 @hannes, report and review by @talex5)
- improve CI to add fuzzing (mirage/ocaml-cstruct#255 mirage/ocaml-cstruct#252 @avsm @yomimono @talex5)
Remove Unix dependency: cstruct now uses the new bigarray-compat
library instead of Bigarray directly, to avoid a dependency on Unix when using OCaml compilers less than 4.06.0. This will break downstream libraries that do not have a direct dependency on Bigarray
. Simply fix it in your library by adding a bigarray
dependency in your dune
file. (mirage/ocaml-cstruct#247 @TheLortex)
Capability module: To improve the safety of future code with stronger type checking, this release introduces a new Cstruct_cap
module which makes the underlying Cstruct an abstract type instead of a record. In return for this extra abstraction, the module can enforce read-only, write only, and read/write buffers by tracking them as phantom type variables. Although this library shares an implementation internally with classic Cstruct
, it is a significant revision and so we will be gradually migrating to it. Feedback on it is welcome! (mirage/ocaml-cstruct#237 @dinosaure and many excited reviewers)
Ppx compare functions: A new compare_X
function is generated for cenum
declarations. This respects custom ids supplied in the cenum declaration and so is more robust than polymorphic compare (mirage/ocaml-cstruct#248 @emillon)
The CI has also been switched over to both Azure Pipelines and Drone in addition to Travis, and as a result the tests all run on Windows, macOS, various Linux distributions, on x86 and arm64 machines, and runs AFL fuzz tests on the Drone cloud (mirage/ocaml-cstruct#255 @avsm).