ANN: cstruct 5.0.0 with new capability types

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 and set_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).

6 Likes