Skip to content

Challenge 10: Kani contracts for String memory safety - #645

Open
sankalpsthakur wants to merge 1 commit into
model-checking:mainfrom
sankalpsthakur:challenge/10-string
Open

Challenge 10: Kani contracts for String memory safety#645
sankalpsthakur wants to merge 1 commit into
model-checking:mainfrom
sankalpsthakur:challenge/10-string

Conversation

@sankalpsthakur

Copy link
Copy Markdown

Summary

Kani safety contracts and proof harnesses for this challenge. Runtime stdlib logic is unchanged; annotations are cfg(kani) / contract attributes.

String allocation/mutation safety contracts.

Validation

  • Local worktree on challenge/10-string
  • Kani CI on this PR is the authoritative run (scripts/run-kani.sh)

Fixes #61

AI/LLM disclosure

  • AI coding tools (including Grok and/or Codex agent-assisted editing) were used to help draft or modify code and this PR description.
  • I reviewed the complete change, understand the reasoning, and take responsibility for the contracts and harnesses.
  • This submission is original work of authorship under the project contributor terms; AI output was not pasted unreviewed.

@sankalpsthakur
sankalpsthakur requested a review from a team as a code owner August 20, 2026 12:08
@feliperodri feliperodri added the Challenge Used to tag a challenge label Aug 20, 2026
@sankalpsthakur

Copy link
Copy Markdown
Author

both ubuntu jobs die with a runner shutdown signal shortly after string::verify::check_from_utf16le_lossy starts, while the 3-thread macos jobs finish that same harness in 238s, so it was peaking the 16 gb runner's memory rather than failing a check. switched it to kissat, the same remedy core::ptr uses for check_align_offset_5; state space and check count are unchanged.

Add safety contracts and proof harnesses covering String allocation and
mutation. Runtime stdlib logic is unchanged: everything added here is
either a contract attribute or lives behind cfg(kani).

check_from_utf16le_lossy runs under the kissat solver. On a
little-endian target that harness keeps the align_to::<u16> arms of
from_utf16le_lossy live, two of which go through from_utf16_lossy with
symbolic RawVec growth, and the resulting solve peaks the memory of the
16 GB ubuntu runner while the same harness completes on macOS. Selecting
kissat follows the existing precedent for check_align_offset_5 in
core::ptr and leaves the state space and check count unchanged.

Fixes rust-lang#61
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Challenge Used to tag a challenge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Challenge 10: Memory safety of String

2 participants