Skip to content

Add support for anonymous nested statics #3953

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Mar 22, 2025

Conversation

carolynzech
Copy link
Contributor

@carolynzech carolynzech commented Mar 21, 2025

rust-lang/rust#121644 added support for anonymous nested allocations to statics. This PR adds support for such statics to Kani.

The idea is to treat an anonymous GlobalAlloc::Static the same as we would treat a GlobalAlloc::Memory, since an anonymous static is a nested memory allocation. To frame this change in terms of the tests:

pointer_to_const_alloc.rs contains a test for the GlobalAlloc::Memory case, which we could already handle prior to this PR. The MIR looks like:

alloc3 (size: 4, align: 4) {
    2a 00 00 00                                     │ *...
}

alloc1 (static: FOO, size: 16, align: 8) {
    ╾─────alloc3<imm>─────╼ 01 00 00 00 00 00 00 00 │ ╾──────╼........
}

meaning that FOO contains a pointer to the immutable allocation alloc3 (note the alloc3<imm>, imm standing for "immutable").

anon_static.rs tests the code introduced in this PR. The MIR from example_1 looks almost identical:

alloc2 (static: FOO::{constant#0}, size: 4, align: 4) {
    2a 00 00 00                                     │ *...
}

alloc1 (static: FOO, size: 16, align: 8) {
    ╾───────alloc2────────╼ 01 00 00 00 00 00 00 00 │ ╾──────╼........
}

Note, however, that alloc2 is mutable, and is thus an anonymous nested static rather than a constant allocation.
But we can just call codegen_const_allocation anyway, since it ends up checking if the allocation is indeed constant before declaring the global variable in the symbol table:

alloc.mutability == Mutability::Not && !has_interior_mutabity,

Resolves #3904

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 and MIT licenses.

@github-actions github-actions bot added the Z-BenchCI Tag a PR to run benchmark CI label Mar 21, 2025
@carolynzech carolynzech marked this pull request as ready for review March 21, 2025 19:15
@carolynzech carolynzech requested a review from a team as a code owner March 21, 2025 19:15
This isn't related to issue 3904. In codegen_alloc_pointer, the GlobalAlloc::from call returns GlobalAlloc::Memory, so we already codegened it as a constant allocation prior to this PR.
But I thought it would be good to have a test that exercises this case explicitly, and that demonstrates the difference between this case and the nested statics case, so I added it in this PR.
@carolynzech carolynzech enabled auto-merge March 21, 2025 22:34
@carolynzech carolynzech added this pull request to the merge queue Mar 22, 2025
Merged via the queue into model-checking:main with commit 2c972fb Mar 22, 2025
24 of 25 checks passed
@carolynzech carolynzech deleted the issue-3904 branch March 22, 2025 01:37
github-merge-queue bot pushed a commit that referenced this pull request Apr 4, 2025
Bump Kani version to 0.61.0.

Github-generated release notes:

## What's Changed
* Fix CHANGELOG of 0.60.0 by @qinheping in
#3925
* Bump tests/perf/s2n-quic from `d88faa4` to `8670e83` by @dependabot in
#3928
* Update toolchain to 2025-03-04 by @qinheping in
#3927
* Install the right toolchain for HEAD and BASE checks in
`verify-std-check.yml` by @remi-delmas-3000 in
#3920
* Automatic cargo update to 2025-03-10 by @github-actions in
#3926
* Automatic toolchain upgrade to nightly-2025-03-05 by @github-actions
in #3929
* Upgrade toolchain to nightly-2025-03-07 by @tautschnig in
#3931
* Upgrade toolchain to nightly-2025-03-12 by @tautschnig in
#3933
* Automatic toolchain upgrade to nightly-2025-03-13 by @github-actions
in #3934
* Update CBMC dependency to 6.5.0 by @tautschnig in
#3936
* Automatic toolchain upgrade to nightly-2025-03-14 by @github-actions
in #3937
* Automatic toolchain upgrade to nightly-2025-03-15 by @github-actions
in #3938
* Automatic toolchain upgrade to nightly-2025-03-16 by @github-actions
in #3939
* Automatic toolchain upgrade to nightly-2025-03-17 by @github-actions
in #3940
* Automatic cargo update to 2025-03-17 by @github-actions in
#3941
* Autoharness: Don't panic on `_` argument and add `_autoharness` suffix
to GOTO files by @carolynzech in
#3942
* Implement `f16` and `f128` cases in `codegen_float_type` by
@carolynzech in #3943
* Support function implementations of known built-ins by @tautschnig in
#3945
* Autoharness: metadata improvements and enable standard library
application by @carolynzech in
#3948
* Autoharness: `--list` option by @carolynzech in
#3952
* Add support for anonymous nested statics by @carolynzech in
#3953
* Automatic cargo update to 2025-03-24 by @github-actions in
#3954
* Bump tests/perf/s2n-quic from `8670e83` to `324cf31` by @dependabot in
#3955
* Document behavior of checked_size_of_raw and is_inbounds by @rajath-mk
in #3956
* Upgrade toolchain to 2025-03-18 by @zhassan-aws in
#3959
* Remove unstable-features from code formatting script by @zhassan-aws
in #3962
* Remove CI job to update features/verify-rust-std by @tautschnig in
#3963
* Make is_inbounds public by @rajath-mk in
#3958
* Enable Kani to work with a stable toolchain by @zhassan-aws in
#3964
* Automatic cargo update to 2025-03-31 by @github-actions in
#3966
* Add support for struct field accessing in loop contracts by
@thanhnguyen-aws in #3970
* Bump tests/perf/s2n-quic from `324cf31` to `d0aff82` by @dependabot in
#3968
* Clarify `is_inbounds` docs by @carolynzech in
#3974
* Upgrade toolchain to 2025-04-01 by @carolynzech in
#3973
* Remove remaining `--enable-unstable` mentions by @carolynzech in
#3978
* Clean up unused dependencies by @zhassan-aws in
#3981
* Automatic toolchain upgrade to nightly-2025-04-02 by @github-actions
in #3983
* Update dependencies per `cargo-outdated` by @carolynzech in
#3982
* Fix `autoharness` termination test & print metadata in alphabetical
order by @carolynzech in
#3971
* Fix cargo invocations to only use `pkg_args` where appropriate by
@carolynzech in #3984


**Full Changelog**:
kani-0.60.0...kani-0.61.0

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
zhassan-aws added a commit that referenced this pull request Apr 23, 2025
rust-lang/rust#121644 added support for
anonymous nested allocations to statics. This PR adds support for such
statics to Kani.

The idea is to treat an anonymous `GlobalAlloc::Static` the same as we
would treat a `GlobalAlloc::Memory`, since an anonymous static is a
nested memory allocation. To frame this change in terms of the tests:

`pointer_to_const_alloc.rs` contains a test for the
`GlobalAlloc::Memory` case, which we could already handle prior to this
PR. The MIR looks like:
```
alloc3 (size: 4, align: 4) {
    2a 00 00 00                                     │ *...
}

alloc1 (static: FOO, size: 16, align: 8) {
    ╾─────alloc3<imm>─────╼ 01 00 00 00 00 00 00 00 │ ╾──────╼........
}
```

meaning that `FOO` contains a pointer to the *immutable* allocation
alloc3 (note the `alloc3<imm>`, imm standing for "immutable").

`anon_static.rs` tests the code introduced in this PR. The MIR from
`example_1` looks almost identical:
```
alloc2 (static: FOO::{constant#0}, size: 4, align: 4) {
    2a 00 00 00                                     │ *...
}

alloc1 (static: FOO, size: 16, align: 8) {
    ╾───────alloc2────────╼ 01 00 00 00 00 00 00 00 │ ╾──────╼........
}
```
Note, however, that `alloc2` is mutable, and is thus an anonymous nested
static rather than a constant allocation.
But we can just call `codegen_const_allocation` anyway, since it ends up
checking if the allocation is indeed constant before declaring the
global variable in the symbol table:

https://github.com/model-checking/kani/blob/319040b8cd2cb72ec0603653fad7a8d934857d57/kani-compiler/src/codegen_cprover_gotoc/codegen/operand.rs#L556

Resolves #3904

By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Z-BenchCI Tag a PR to run benchmark CI
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Crash in Kani compiler on chrono crate
3 participants