Summary: Using `Store_field` to initialize fields of blocks allocated with `caml_alloc_small` is unsafe. The fields of blocks allocated by `caml_alloc_small` are not initialized, and `Store_field` calls the OCaml GC write barrier. If the uninitialized value of a field happens to point into the OCaml heap, then it will e.g. be added to a conflict set or followed and have what the GC thinks are color bits changed. This leads to crashes or memory corruption. This diff fixes a few (I think all) instances of this problem. Some of these are creating option values. OCaml 4.12 has a dedicated `caml_alloc_some` function for this, so this diff adds a compatible function with a version check to avoid conflict. With that, macros for accessing option values are also added. Upstream Differential Revision: https://reviews.llvm.org/D99471 Reviewed By: ngorogiannis Differential Revision: D27564868 fbshipit-source-id: 1dfdd0530master
parent
bea3f3b439
commit
a7b44e6969
Loading…
Reference in new issue