Implement Arbitrary for Rc<T> and Arc<T> - #4697

Merged
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc
Jul 29, 2026
Merged

Implement Arbitrary for Rc<T> and Arc<T>#4697
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc

Conversation

@tautschnig

Copy link
Copy Markdown
Member

Description

Box<T> implements Arbitrary, but Rc<T> and Arc<T> did not, so functions taking reference-counted arguments could not be verified against nondeterministic inputs — and were skipped by kani autoharness with "Missing Arbitrary implementation" (smart-pointer receivers are among the largest skip classes in the top-100 crates.io evaluation). This PR adds the analogous implementations.

Note that unlike slice/container arguments (#4691/#4693), these need no bound and no opt-in flag: a smart pointer to T covers exactly the values of T, so the generated values retain Kani's usual full-coverage guarantee.

A follow-up will extend autoharness to smart pointers around types that only can-deriveArbitrary (compiler-synthesized implementations); that requires compiler-side models that depend on alloc and hence some optional-model plumbing for the no_core flow.

Testing

New test tests/kani/Arbitrary/rc_arc.rs with cover checks proving extreme values, specific values, and nested smart pointers (Rc<Arc<u8>>) are all generated (all SATISFIED). The Arbitrary suite and kani library unit/doc tests pass; verified via autoharness that Rc<T>/Arc<T>-taking functions are now selected and verified.

Towards #3832

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

Box<T> has an Arbitrary implementation, but Rc<T> and Arc<T> did not, so
functions taking reference-counted arguments could not be verified against
nondeterministic inputs (and were skipped by 'kani autoharness' with
'Missing Arbitrary implementation'). Add the analogous implementations.
Unlike slice or container arguments, these need no bound: a smart pointer
to T covers exactly the values of T, so the generated values retain Kani's
usual full-coverage guarantee.
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
@tautschnig
tautschnig requested a review from a team as a code ownerJuly 29, 2026 10:20
CopilotAI review requested due to automatic review settings July 29, 2026 10:20

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actionsgithub-actionsBot added Z-EndToEndBenchCI Tag a PR to run benchmark CI Z-CompilerBenchCI Tag a PR to run benchmark CI labels Jul 29, 2026

@feliperodrifeliperodri left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚢 it!

@feliperodri
feliperodri added this pull request to the merge queueJul 29, 2026
Merged via the queue into model-checking:main with commit 7ab3ddfJul 29, 2026
33 checks passed
feliperodri added a commit to tautschnig/kani that referenced this pull request Aug 24, 2026
…odel-checking#4698)
### Description
**Stacked on model-checking#4697** (only the last commit is new; review that one).
`Box<T>`/`Rc<T>`/`Arc<T>` arguments were only supported by autoharness
when `T` itself implements `Arbitrary` (resolving the blanket impls).
When `T` merely *can derive* `Arbitrary` — the common case for plain
structs without kani annotations — such arguments were skipped. This PR
adds three generation models (`any_box`/`any_rc`/`any_arc`) whose
internal `kani::any::<T>()` call gets the compiler-synthesized
`Arbitrary` implementation via `AutomaticArbitraryPass`, exactly as for
direct arguments of such types.
Two design points:
- **Optional models.** The models require `alloc`, so they exist only in
the `kani` library, not `core::kani`. This introduces
`KaniModel::is_optional()`: `validate_kani_functions` tolerates their
absence and the autoharness passes hold them as `Option<FnDef>`,
gracefully rejecting smart-pointer arguments in flows where they're
unavailable (`kani verify-std` re-validated with `--force-rerun` to make
sure the run wasn't cached).
- **Robust detection.** `Box` via `is_box()`, `Rc`/`Arc` via their rustc
diagnostic items (no name matching), plus a return-type equality check
on the resolved model instance — which also correctly rejects
non-default allocators (`Box<T, A>`); an arity-based check would have
wrongly rejected plain `Box<T>` (= `Box<T, Global>`).
Per the bounded-features policy (model-checking#4691/model-checking#4693): these values are
**unbounded** — a smart pointer to `T` covers exactly the values of `T`
— so they need no `--bounded-arguments` gating and retain the
full-coverage guarantee, demonstrated by a cover check in the test.
### Testing
New script-based test `cargo_autoharness_smart_pointers`:
`Box`/`Rc`/`Arc` of both implementing and only-derivable pointees (all
verified), a full-coverage cover check on the pointee (SATISFIED) with a
correctly failing assertion, and graceful skipping of a pointee that can
neither implement nor derive `Arbitrary`.
Full autoharness suite (14 tests), `verify_std_cmd`/`std_codegen`
(force-rerun), and `kani-compiler` unit tests pass.
Towards model-checking#3832
By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
---------
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
Co-authored-by: Felipe Monteiro <felisous@amazon.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Z-CompilerBenchCITag a PR to run benchmark CIZ-EndToEndBenchCITag a PR to run benchmark CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tautschnig@feliperodri
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Implement Arbitrary for Rc<T> and Arc<T> - #4697

Merged
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc
Jul 29, 2026
Merged

Implement Arbitrary for Rc<T> and Arc<T>#4697
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc

Conversation

@tautschnig

Copy link
Copy Markdown
Member

Description

Box<T> implements Arbitrary, but Rc<T> and Arc<T> did not, so functions taking reference-counted arguments could not be verified against nondeterministic inputs — and were skipped by kani autoharness with "Missing Arbitrary implementation" (smart-pointer receivers are among the largest skip classes in the top-100 crates.io evaluation). This PR adds the analogous implementations.

Note that unlike slice/container arguments (#4691/#4693), these need no bound and no opt-in flag: a smart pointer to T covers exactly the values of T, so the generated values retain Kani's usual full-coverage guarantee.

A follow-up will extend autoharness to smart pointers around types that only can-deriveArbitrary (compiler-synthesized implementations); that requires compiler-side models that depend on alloc and hence some optional-model plumbing for the no_core flow.

Testing

New test tests/kani/Arbitrary/rc_arc.rs with cover checks proving extreme values, specific values, and nested smart pointers (Rc<Arc<u8>>) are all generated (all SATISFIED). The Arbitrary suite and kani library unit/doc tests pass; verified via autoharness that Rc<T>/Arc<T>-taking functions are now selected and verified.

Towards #3832

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

Box<T> has an Arbitrary implementation, but Rc<T> and Arc<T> did not, so
functions taking reference-counted arguments could not be verified against
nondeterministic inputs (and were skipped by 'kani autoharness' with
'Missing Arbitrary implementation'). Add the analogous implementations.
Unlike slice or container arguments, these need no bound: a smart pointer
to T covers exactly the values of T, so the generated values retain Kani's
usual full-coverage guarantee.
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
@tautschnig
tautschnig requested a review from a team as a code ownerJuly 29, 2026 10:20
CopilotAI review requested due to automatic review settings July 29, 2026 10:20

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actionsgithub-actionsBot added Z-EndToEndBenchCI Tag a PR to run benchmark CI Z-CompilerBenchCI Tag a PR to run benchmark CI labels Jul 29, 2026

@feliperodrifeliperodri left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚢 it!

@feliperodri
feliperodri added this pull request to the merge queueJul 29, 2026
Merged via the queue into model-checking:main with commit 7ab3ddfJul 29, 2026
33 checks passed
feliperodri added a commit to tautschnig/kani that referenced this pull request Aug 24, 2026
…odel-checking#4698)
### Description
**Stacked on model-checking#4697** (only the last commit is new; review that one).
`Box<T>`/`Rc<T>`/`Arc<T>` arguments were only supported by autoharness
when `T` itself implements `Arbitrary` (resolving the blanket impls).
When `T` merely *can derive* `Arbitrary` — the common case for plain
structs without kani annotations — such arguments were skipped. This PR
adds three generation models (`any_box`/`any_rc`/`any_arc`) whose
internal `kani::any::<T>()` call gets the compiler-synthesized
`Arbitrary` implementation via `AutomaticArbitraryPass`, exactly as for
direct arguments of such types.
Two design points:
- **Optional models.** The models require `alloc`, so they exist only in
the `kani` library, not `core::kani`. This introduces
`KaniModel::is_optional()`: `validate_kani_functions` tolerates their
absence and the autoharness passes hold them as `Option<FnDef>`,
gracefully rejecting smart-pointer arguments in flows where they're
unavailable (`kani verify-std` re-validated with `--force-rerun` to make
sure the run wasn't cached).
- **Robust detection.** `Box` via `is_box()`, `Rc`/`Arc` via their rustc
diagnostic items (no name matching), plus a return-type equality check
on the resolved model instance — which also correctly rejects
non-default allocators (`Box<T, A>`); an arity-based check would have
wrongly rejected plain `Box<T>` (= `Box<T, Global>`).
Per the bounded-features policy (model-checking#4691/model-checking#4693): these values are
**unbounded** — a smart pointer to `T` covers exactly the values of `T`
— so they need no `--bounded-arguments` gating and retain the
full-coverage guarantee, demonstrated by a cover check in the test.
### Testing
New script-based test `cargo_autoharness_smart_pointers`:
`Box`/`Rc`/`Arc` of both implementing and only-derivable pointees (all
verified), a full-coverage cover check on the pointee (SATISFIED) with a
correctly failing assertion, and graceful skipping of a pointee that can
neither implement nor derive `Arbitrary`.
Full autoharness suite (14 tests), `verify_std_cmd`/`std_codegen`
(force-rerun), and `kani-compiler` unit tests pass.
Towards model-checking#3832
By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
---------
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
Co-authored-by: Felipe Monteiro <felisous@amazon.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Z-CompilerBenchCITag a PR to run benchmark CIZ-EndToEndBenchCITag a PR to run benchmark CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tautschnig@feliperodri
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement Arbitrary for Rc<T> and Arc<T> - #4697

Merged
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc
Jul 29, 2026
Merged

Implement Arbitrary for Rc<T> and Arc<T>#4697
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc

Conversation

@tautschnig

Copy link
Copy Markdown
Member

Description

Box<T> implements Arbitrary, but Rc<T> and Arc<T> did not, so functions taking reference-counted arguments could not be verified against nondeterministic inputs — and were skipped by kani autoharness with "Missing Arbitrary implementation" (smart-pointer receivers are among the largest skip classes in the top-100 crates.io evaluation). This PR adds the analogous implementations.

Note that unlike slice/container arguments (#4691/#4693), these need no bound and no opt-in flag: a smart pointer to T covers exactly the values of T, so the generated values retain Kani's usual full-coverage guarantee.

A follow-up will extend autoharness to smart pointers around types that only can-deriveArbitrary (compiler-synthesized implementations); that requires compiler-side models that depend on alloc and hence some optional-model plumbing for the no_core flow.

Testing

New test tests/kani/Arbitrary/rc_arc.rs with cover checks proving extreme values, specific values, and nested smart pointers (Rc<Arc<u8>>) are all generated (all SATISFIED). The Arbitrary suite and kani library unit/doc tests pass; verified via autoharness that Rc<T>/Arc<T>-taking functions are now selected and verified.

Towards #3832

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

Box<T> has an Arbitrary implementation, but Rc<T> and Arc<T> did not, so
functions taking reference-counted arguments could not be verified against
nondeterministic inputs (and were skipped by 'kani autoharness' with
'Missing Arbitrary implementation'). Add the analogous implementations.
Unlike slice or container arguments, these need no bound: a smart pointer
to T covers exactly the values of T, so the generated values retain Kani's
usual full-coverage guarantee.
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
@tautschnig
tautschnig requested a review from a team as a code ownerJuly 29, 2026 10:20
CopilotAI review requested due to automatic review settings July 29, 2026 10:20

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actionsgithub-actionsBot added Z-EndToEndBenchCI Tag a PR to run benchmark CI Z-CompilerBenchCI Tag a PR to run benchmark CI labels Jul 29, 2026

@feliperodrifeliperodri left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚢 it!

@feliperodri
feliperodri added this pull request to the merge queueJul 29, 2026
Merged via the queue into model-checking:main with commit 7ab3ddfJul 29, 2026
33 checks passed
feliperodri added a commit to tautschnig/kani that referenced this pull request Aug 24, 2026
…odel-checking#4698)
### Description
**Stacked on model-checking#4697** (only the last commit is new; review that one).
`Box<T>`/`Rc<T>`/`Arc<T>` arguments were only supported by autoharness
when `T` itself implements `Arbitrary` (resolving the blanket impls).
When `T` merely *can derive* `Arbitrary` — the common case for plain
structs without kani annotations — such arguments were skipped. This PR
adds three generation models (`any_box`/`any_rc`/`any_arc`) whose
internal `kani::any::<T>()` call gets the compiler-synthesized
`Arbitrary` implementation via `AutomaticArbitraryPass`, exactly as for
direct arguments of such types.
Two design points:
- **Optional models.** The models require `alloc`, so they exist only in
the `kani` library, not `core::kani`. This introduces
`KaniModel::is_optional()`: `validate_kani_functions` tolerates their
absence and the autoharness passes hold them as `Option<FnDef>`,
gracefully rejecting smart-pointer arguments in flows where they're
unavailable (`kani verify-std` re-validated with `--force-rerun` to make
sure the run wasn't cached).
- **Robust detection.** `Box` via `is_box()`, `Rc`/`Arc` via their rustc
diagnostic items (no name matching), plus a return-type equality check
on the resolved model instance — which also correctly rejects
non-default allocators (`Box<T, A>`); an arity-based check would have
wrongly rejected plain `Box<T>` (= `Box<T, Global>`).
Per the bounded-features policy (model-checking#4691/model-checking#4693): these values are
**unbounded** — a smart pointer to `T` covers exactly the values of `T`
— so they need no `--bounded-arguments` gating and retain the
full-coverage guarantee, demonstrated by a cover check in the test.
### Testing
New script-based test `cargo_autoharness_smart_pointers`:
`Box`/`Rc`/`Arc` of both implementing and only-derivable pointees (all
verified), a full-coverage cover check on the pointee (SATISFIED) with a
correctly failing assertion, and graceful skipping of a pointee that can
neither implement nor derive `Arbitrary`.
Full autoharness suite (14 tests), `verify_std_cmd`/`std_codegen`
(force-rerun), and `kani-compiler` unit tests pass.
Towards model-checking#3832
By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
---------
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
Co-authored-by: Felipe Monteiro <felisous@amazon.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Z-CompilerBenchCITag a PR to run benchmark CIZ-EndToEndBenchCITag a PR to run benchmark CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tautschnig@feliperodri
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement Arbitrary for Rc<T> and Arc<T> - #4697

Merged
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc
Jul 29, 2026
Merged

Implement Arbitrary for Rc<T> and Arc<T>#4697
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc

Conversation

@tautschnig

Copy link
Copy Markdown
Member

Description

Box<T> implements Arbitrary, but Rc<T> and Arc<T> did not, so functions taking reference-counted arguments could not be verified against nondeterministic inputs — and were skipped by kani autoharness with "Missing Arbitrary implementation" (smart-pointer receivers are among the largest skip classes in the top-100 crates.io evaluation). This PR adds the analogous implementations.

Note that unlike slice/container arguments (#4691/#4693), these need no bound and no opt-in flag: a smart pointer to T covers exactly the values of T, so the generated values retain Kani's usual full-coverage guarantee.

A follow-up will extend autoharness to smart pointers around types that only can-deriveArbitrary (compiler-synthesized implementations); that requires compiler-side models that depend on alloc and hence some optional-model plumbing for the no_core flow.

Testing

New test tests/kani/Arbitrary/rc_arc.rs with cover checks proving extreme values, specific values, and nested smart pointers (Rc<Arc<u8>>) are all generated (all SATISFIED). The Arbitrary suite and kani library unit/doc tests pass; verified via autoharness that Rc<T>/Arc<T>-taking functions are now selected and verified.

Towards #3832

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

Box<T> has an Arbitrary implementation, but Rc<T> and Arc<T> did not, so
functions taking reference-counted arguments could not be verified against
nondeterministic inputs (and were skipped by 'kani autoharness' with
'Missing Arbitrary implementation'). Add the analogous implementations.
Unlike slice or container arguments, these need no bound: a smart pointer
to T covers exactly the values of T, so the generated values retain Kani's
usual full-coverage guarantee.
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
@tautschnig
tautschnig requested a review from a team as a code ownerJuly 29, 2026 10:20
CopilotAI review requested due to automatic review settings July 29, 2026 10:20

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actionsgithub-actionsBot added Z-EndToEndBenchCI Tag a PR to run benchmark CI Z-CompilerBenchCI Tag a PR to run benchmark CI labels Jul 29, 2026

@feliperodrifeliperodri left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚢 it!

@feliperodri
feliperodri added this pull request to the merge queueJul 29, 2026
Merged via the queue into model-checking:main with commit 7ab3ddfJul 29, 2026
33 checks passed
feliperodri added a commit to tautschnig/kani that referenced this pull request Aug 24, 2026
…odel-checking#4698)
### Description
**Stacked on model-checking#4697** (only the last commit is new; review that one).
`Box<T>`/`Rc<T>`/`Arc<T>` arguments were only supported by autoharness
when `T` itself implements `Arbitrary` (resolving the blanket impls).
When `T` merely *can derive* `Arbitrary` — the common case for plain
structs without kani annotations — such arguments were skipped. This PR
adds three generation models (`any_box`/`any_rc`/`any_arc`) whose
internal `kani::any::<T>()` call gets the compiler-synthesized
`Arbitrary` implementation via `AutomaticArbitraryPass`, exactly as for
direct arguments of such types.
Two design points:
- **Optional models.** The models require `alloc`, so they exist only in
the `kani` library, not `core::kani`. This introduces
`KaniModel::is_optional()`: `validate_kani_functions` tolerates their
absence and the autoharness passes hold them as `Option<FnDef>`,
gracefully rejecting smart-pointer arguments in flows where they're
unavailable (`kani verify-std` re-validated with `--force-rerun` to make
sure the run wasn't cached).
- **Robust detection.** `Box` via `is_box()`, `Rc`/`Arc` via their rustc
diagnostic items (no name matching), plus a return-type equality check
on the resolved model instance — which also correctly rejects
non-default allocators (`Box<T, A>`); an arity-based check would have
wrongly rejected plain `Box<T>` (= `Box<T, Global>`).
Per the bounded-features policy (model-checking#4691/model-checking#4693): these values are
**unbounded** — a smart pointer to `T` covers exactly the values of `T`
— so they need no `--bounded-arguments` gating and retain the
full-coverage guarantee, demonstrated by a cover check in the test.
### Testing
New script-based test `cargo_autoharness_smart_pointers`:
`Box`/`Rc`/`Arc` of both implementing and only-derivable pointees (all
verified), a full-coverage cover check on the pointee (SATISFIED) with a
correctly failing assertion, and graceful skipping of a pointee that can
neither implement nor derive `Arbitrary`.
Full autoharness suite (14 tests), `verify_std_cmd`/`std_codegen`
(force-rerun), and `kani-compiler` unit tests pass.
Towards model-checking#3832
By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
---------
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
Co-authored-by: Felipe Monteiro <felisous@amazon.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Z-CompilerBenchCITag a PR to run benchmark CIZ-EndToEndBenchCITag a PR to run benchmark CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tautschnig@feliperodri
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Implement Arbitrary for Rc<T> and Arc<T> - #4697

Merged
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc
Jul 29, 2026
Merged

Implement Arbitrary for Rc<T> and Arc<T>#4697
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc

Conversation

@tautschnig

Copy link
Copy Markdown
Member

Description

Box<T> implements Arbitrary, but Rc<T> and Arc<T> did not, so functions taking reference-counted arguments could not be verified against nondeterministic inputs — and were skipped by kani autoharness with "Missing Arbitrary implementation" (smart-pointer receivers are among the largest skip classes in the top-100 crates.io evaluation). This PR adds the analogous implementations.

Note that unlike slice/container arguments (#4691/#4693), these need no bound and no opt-in flag: a smart pointer to T covers exactly the values of T, so the generated values retain Kani's usual full-coverage guarantee.

A follow-up will extend autoharness to smart pointers around types that only can-deriveArbitrary (compiler-synthesized implementations); that requires compiler-side models that depend on alloc and hence some optional-model plumbing for the no_core flow.

Testing

New test tests/kani/Arbitrary/rc_arc.rs with cover checks proving extreme values, specific values, and nested smart pointers (Rc<Arc<u8>>) are all generated (all SATISFIED). The Arbitrary suite and kani library unit/doc tests pass; verified via autoharness that Rc<T>/Arc<T>-taking functions are now selected and verified.

Towards #3832

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

Box<T> has an Arbitrary implementation, but Rc<T> and Arc<T> did not, so
functions taking reference-counted arguments could not be verified against
nondeterministic inputs (and were skipped by 'kani autoharness' with
'Missing Arbitrary implementation'). Add the analogous implementations.
Unlike slice or container arguments, these need no bound: a smart pointer
to T covers exactly the values of T, so the generated values retain Kani's
usual full-coverage guarantee.
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
@tautschnig
tautschnig requested a review from a team as a code ownerJuly 29, 2026 10:20
CopilotAI review requested due to automatic review settings July 29, 2026 10:20

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actionsgithub-actionsBot added Z-EndToEndBenchCI Tag a PR to run benchmark CI Z-CompilerBenchCI Tag a PR to run benchmark CI labels Jul 29, 2026

@feliperodrifeliperodri left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚢 it!

@feliperodri
feliperodri added this pull request to the merge queueJul 29, 2026
Merged via the queue into model-checking:main with commit 7ab3ddfJul 29, 2026
33 checks passed
feliperodri added a commit to tautschnig/kani that referenced this pull request Aug 24, 2026
…odel-checking#4698)
### Description
**Stacked on model-checking#4697** (only the last commit is new; review that one).
`Box<T>`/`Rc<T>`/`Arc<T>` arguments were only supported by autoharness
when `T` itself implements `Arbitrary` (resolving the blanket impls).
When `T` merely *can derive* `Arbitrary` — the common case for plain
structs without kani annotations — such arguments were skipped. This PR
adds three generation models (`any_box`/`any_rc`/`any_arc`) whose
internal `kani::any::<T>()` call gets the compiler-synthesized
`Arbitrary` implementation via `AutomaticArbitraryPass`, exactly as for
direct arguments of such types.
Two design points:
- **Optional models.** The models require `alloc`, so they exist only in
the `kani` library, not `core::kani`. This introduces
`KaniModel::is_optional()`: `validate_kani_functions` tolerates their
absence and the autoharness passes hold them as `Option<FnDef>`,
gracefully rejecting smart-pointer arguments in flows where they're
unavailable (`kani verify-std` re-validated with `--force-rerun` to make
sure the run wasn't cached).
- **Robust detection.** `Box` via `is_box()`, `Rc`/`Arc` via their rustc
diagnostic items (no name matching), plus a return-type equality check
on the resolved model instance — which also correctly rejects
non-default allocators (`Box<T, A>`); an arity-based check would have
wrongly rejected plain `Box<T>` (= `Box<T, Global>`).
Per the bounded-features policy (model-checking#4691/model-checking#4693): these values are
**unbounded** — a smart pointer to `T` covers exactly the values of `T`
— so they need no `--bounded-arguments` gating and retain the
full-coverage guarantee, demonstrated by a cover check in the test.
### Testing
New script-based test `cargo_autoharness_smart_pointers`:
`Box`/`Rc`/`Arc` of both implementing and only-derivable pointees (all
verified), a full-coverage cover check on the pointee (SATISFIED) with a
correctly failing assertion, and graceful skipping of a pointee that can
neither implement nor derive `Arbitrary`.
Full autoharness suite (14 tests), `verify_std_cmd`/`std_codegen`
(force-rerun), and `kani-compiler` unit tests pass.
Towards model-checking#3832
By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
---------
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
Co-authored-by: Felipe Monteiro <felisous@amazon.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Z-CompilerBenchCITag a PR to run benchmark CIZ-EndToEndBenchCITag a PR to run benchmark CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tautschnig@feliperodri
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement Arbitrary for Rc<T> and Arc<T> - #4697

Merged
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc
Jul 29, 2026
Merged

Implement Arbitrary for Rc<T> and Arc<T>#4697
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc

Conversation

@tautschnig

Copy link
Copy Markdown
Member

Description

Box<T> implements Arbitrary, but Rc<T> and Arc<T> did not, so functions taking reference-counted arguments could not be verified against nondeterministic inputs — and were skipped by kani autoharness with "Missing Arbitrary implementation" (smart-pointer receivers are among the largest skip classes in the top-100 crates.io evaluation). This PR adds the analogous implementations.

Note that unlike slice/container arguments (#4691/#4693), these need no bound and no opt-in flag: a smart pointer to T covers exactly the values of T, so the generated values retain Kani's usual full-coverage guarantee.

A follow-up will extend autoharness to smart pointers around types that only can-deriveArbitrary (compiler-synthesized implementations); that requires compiler-side models that depend on alloc and hence some optional-model plumbing for the no_core flow.

Testing

New test tests/kani/Arbitrary/rc_arc.rs with cover checks proving extreme values, specific values, and nested smart pointers (Rc<Arc<u8>>) are all generated (all SATISFIED). The Arbitrary suite and kani library unit/doc tests pass; verified via autoharness that Rc<T>/Arc<T>-taking functions are now selected and verified.

Towards #3832

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

Box<T> has an Arbitrary implementation, but Rc<T> and Arc<T> did not, so
functions taking reference-counted arguments could not be verified against
nondeterministic inputs (and were skipped by 'kani autoharness' with
'Missing Arbitrary implementation'). Add the analogous implementations.
Unlike slice or container arguments, these need no bound: a smart pointer
to T covers exactly the values of T, so the generated values retain Kani's
usual full-coverage guarantee.
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
@tautschnig
tautschnig requested a review from a team as a code ownerJuly 29, 2026 10:20
CopilotAI review requested due to automatic review settings July 29, 2026 10:20

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actionsgithub-actionsBot added Z-EndToEndBenchCI Tag a PR to run benchmark CI Z-CompilerBenchCI Tag a PR to run benchmark CI labels Jul 29, 2026

@feliperodrifeliperodri left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚢 it!

@feliperodri
feliperodri added this pull request to the merge queueJul 29, 2026
Merged via the queue into model-checking:main with commit 7ab3ddfJul 29, 2026
33 checks passed
feliperodri added a commit to tautschnig/kani that referenced this pull request Aug 24, 2026
…odel-checking#4698)
### Description
**Stacked on model-checking#4697** (only the last commit is new; review that one).
`Box<T>`/`Rc<T>`/`Arc<T>` arguments were only supported by autoharness
when `T` itself implements `Arbitrary` (resolving the blanket impls).
When `T` merely *can derive* `Arbitrary` — the common case for plain
structs without kani annotations — such arguments were skipped. This PR
adds three generation models (`any_box`/`any_rc`/`any_arc`) whose
internal `kani::any::<T>()` call gets the compiler-synthesized
`Arbitrary` implementation via `AutomaticArbitraryPass`, exactly as for
direct arguments of such types.
Two design points:
- **Optional models.** The models require `alloc`, so they exist only in
the `kani` library, not `core::kani`. This introduces
`KaniModel::is_optional()`: `validate_kani_functions` tolerates their
absence and the autoharness passes hold them as `Option<FnDef>`,
gracefully rejecting smart-pointer arguments in flows where they're
unavailable (`kani verify-std` re-validated with `--force-rerun` to make
sure the run wasn't cached).
- **Robust detection.** `Box` via `is_box()`, `Rc`/`Arc` via their rustc
diagnostic items (no name matching), plus a return-type equality check
on the resolved model instance — which also correctly rejects
non-default allocators (`Box<T, A>`); an arity-based check would have
wrongly rejected plain `Box<T>` (= `Box<T, Global>`).
Per the bounded-features policy (model-checking#4691/model-checking#4693): these values are
**unbounded** — a smart pointer to `T` covers exactly the values of `T`
— so they need no `--bounded-arguments` gating and retain the
full-coverage guarantee, demonstrated by a cover check in the test.
### Testing
New script-based test `cargo_autoharness_smart_pointers`:
`Box`/`Rc`/`Arc` of both implementing and only-derivable pointees (all
verified), a full-coverage cover check on the pointee (SATISFIED) with a
correctly failing assertion, and graceful skipping of a pointee that can
neither implement nor derive `Arbitrary`.
Full autoharness suite (14 tests), `verify_std_cmd`/`std_codegen`
(force-rerun), and `kani-compiler` unit tests pass.
Towards model-checking#3832
By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
---------
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
Co-authored-by: Felipe Monteiro <felisous@amazon.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Z-CompilerBenchCITag a PR to run benchmark CIZ-EndToEndBenchCITag a PR to run benchmark CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tautschnig@feliperodri
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Implement Arbitrary for Rc<T> and Arc<T> - #4697

Merged
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc
Jul 29, 2026
Merged

Implement Arbitrary for Rc<T> and Arc<T>#4697
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc

Conversation

@tautschnig

Copy link
Copy Markdown
Member

Description

Box<T> implements Arbitrary, but Rc<T> and Arc<T> did not, so functions taking reference-counted arguments could not be verified against nondeterministic inputs — and were skipped by kani autoharness with "Missing Arbitrary implementation" (smart-pointer receivers are among the largest skip classes in the top-100 crates.io evaluation). This PR adds the analogous implementations.

Note that unlike slice/container arguments (#4691/#4693), these need no bound and no opt-in flag: a smart pointer to T covers exactly the values of T, so the generated values retain Kani's usual full-coverage guarantee.

A follow-up will extend autoharness to smart pointers around types that only can-deriveArbitrary (compiler-synthesized implementations); that requires compiler-side models that depend on alloc and hence some optional-model plumbing for the no_core flow.

Testing

New test tests/kani/Arbitrary/rc_arc.rs with cover checks proving extreme values, specific values, and nested smart pointers (Rc<Arc<u8>>) are all generated (all SATISFIED). The Arbitrary suite and kani library unit/doc tests pass; verified via autoharness that Rc<T>/Arc<T>-taking functions are now selected and verified.

Towards #3832

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

Box<T> has an Arbitrary implementation, but Rc<T> and Arc<T> did not, so
functions taking reference-counted arguments could not be verified against
nondeterministic inputs (and were skipped by 'kani autoharness' with
'Missing Arbitrary implementation'). Add the analogous implementations.
Unlike slice or container arguments, these need no bound: a smart pointer
to T covers exactly the values of T, so the generated values retain Kani's
usual full-coverage guarantee.
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
@tautschnig
tautschnig requested a review from a team as a code ownerJuly 29, 2026 10:20
CopilotAI review requested due to automatic review settings July 29, 2026 10:20

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actionsgithub-actionsBot added Z-EndToEndBenchCI Tag a PR to run benchmark CI Z-CompilerBenchCI Tag a PR to run benchmark CI labels Jul 29, 2026

@feliperodrifeliperodri left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚢 it!

@feliperodri
feliperodri added this pull request to the merge queueJul 29, 2026
Merged via the queue into model-checking:main with commit 7ab3ddfJul 29, 2026
33 checks passed
feliperodri added a commit to tautschnig/kani that referenced this pull request Aug 24, 2026
…odel-checking#4698)
### Description
**Stacked on model-checking#4697** (only the last commit is new; review that one).
`Box<T>`/`Rc<T>`/`Arc<T>` arguments were only supported by autoharness
when `T` itself implements `Arbitrary` (resolving the blanket impls).
When `T` merely *can derive* `Arbitrary` — the common case for plain
structs without kani annotations — such arguments were skipped. This PR
adds three generation models (`any_box`/`any_rc`/`any_arc`) whose
internal `kani::any::<T>()` call gets the compiler-synthesized
`Arbitrary` implementation via `AutomaticArbitraryPass`, exactly as for
direct arguments of such types.
Two design points:
- **Optional models.** The models require `alloc`, so they exist only in
the `kani` library, not `core::kani`. This introduces
`KaniModel::is_optional()`: `validate_kani_functions` tolerates their
absence and the autoharness passes hold them as `Option<FnDef>`,
gracefully rejecting smart-pointer arguments in flows where they're
unavailable (`kani verify-std` re-validated with `--force-rerun` to make
sure the run wasn't cached).
- **Robust detection.** `Box` via `is_box()`, `Rc`/`Arc` via their rustc
diagnostic items (no name matching), plus a return-type equality check
on the resolved model instance — which also correctly rejects
non-default allocators (`Box<T, A>`); an arity-based check would have
wrongly rejected plain `Box<T>` (= `Box<T, Global>`).
Per the bounded-features policy (model-checking#4691/model-checking#4693): these values are
**unbounded** — a smart pointer to `T` covers exactly the values of `T`
— so they need no `--bounded-arguments` gating and retain the
full-coverage guarantee, demonstrated by a cover check in the test.
### Testing
New script-based test `cargo_autoharness_smart_pointers`:
`Box`/`Rc`/`Arc` of both implementing and only-derivable pointees (all
verified), a full-coverage cover check on the pointee (SATISFIED) with a
correctly failing assertion, and graceful skipping of a pointee that can
neither implement nor derive `Arbitrary`.
Full autoharness suite (14 tests), `verify_std_cmd`/`std_codegen`
(force-rerun), and `kani-compiler` unit tests pass.
Towards model-checking#3832
By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
---------
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
Co-authored-by: Felipe Monteiro <felisous@amazon.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Z-CompilerBenchCITag a PR to run benchmark CIZ-EndToEndBenchCITag a PR to run benchmark CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tautschnig@feliperodri
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Implement Arbitrary for Rc<T> and Arc<T> - #4697

Merged
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc
Jul 29, 2026
Merged

Implement Arbitrary for Rc<T> and Arc<T>#4697
feliperodri merged 1 commit into
model-checking:mainfrom
tautschnig:arbitrary-rc-arc

Conversation

@tautschnig

Copy link
Copy Markdown
Member

Description

Box<T> implements Arbitrary, but Rc<T> and Arc<T> did not, so functions taking reference-counted arguments could not be verified against nondeterministic inputs — and were skipped by kani autoharness with "Missing Arbitrary implementation" (smart-pointer receivers are among the largest skip classes in the top-100 crates.io evaluation). This PR adds the analogous implementations.

Note that unlike slice/container arguments (#4691/#4693), these need no bound and no opt-in flag: a smart pointer to T covers exactly the values of T, so the generated values retain Kani's usual full-coverage guarantee.

A follow-up will extend autoharness to smart pointers around types that only can-deriveArbitrary (compiler-synthesized implementations); that requires compiler-side models that depend on alloc and hence some optional-model plumbing for the no_core flow.

Testing

New test tests/kani/Arbitrary/rc_arc.rs with cover checks proving extreme values, specific values, and nested smart pointers (Rc<Arc<u8>>) are all generated (all SATISFIED). The Arbitrary suite and kani library unit/doc tests pass; verified via autoharness that Rc<T>/Arc<T>-taking functions are now selected and verified.

Towards #3832

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

Box<T> has an Arbitrary implementation, but Rc<T> and Arc<T> did not, so
functions taking reference-counted arguments could not be verified against
nondeterministic inputs (and were skipped by 'kani autoharness' with
'Missing Arbitrary implementation'). Add the analogous implementations.
Unlike slice or container arguments, these need no bound: a smart pointer
to T covers exactly the values of T, so the generated values retain Kani's
usual full-coverage guarantee.
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
@tautschnig
tautschnig requested a review from a team as a code ownerJuly 29, 2026 10:20
CopilotAI review requested due to automatic review settings July 29, 2026 10:20

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actionsgithub-actionsBot added Z-EndToEndBenchCI Tag a PR to run benchmark CI Z-CompilerBenchCI Tag a PR to run benchmark CI labels Jul 29, 2026

@feliperodrifeliperodri left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚢 it!

@feliperodri
feliperodri added this pull request to the merge queueJul 29, 2026
Merged via the queue into model-checking:main with commit 7ab3ddfJul 29, 2026
33 checks passed
feliperodri added a commit to tautschnig/kani that referenced this pull request Aug 24, 2026
…odel-checking#4698)
### Description
**Stacked on model-checking#4697** (only the last commit is new; review that one).
`Box<T>`/`Rc<T>`/`Arc<T>` arguments were only supported by autoharness
when `T` itself implements `Arbitrary` (resolving the blanket impls).
When `T` merely *can derive* `Arbitrary` — the common case for plain
structs without kani annotations — such arguments were skipped. This PR
adds three generation models (`any_box`/`any_rc`/`any_arc`) whose
internal `kani::any::<T>()` call gets the compiler-synthesized
`Arbitrary` implementation via `AutomaticArbitraryPass`, exactly as for
direct arguments of such types.
Two design points:
- **Optional models.** The models require `alloc`, so they exist only in
the `kani` library, not `core::kani`. This introduces
`KaniModel::is_optional()`: `validate_kani_functions` tolerates their
absence and the autoharness passes hold them as `Option<FnDef>`,
gracefully rejecting smart-pointer arguments in flows where they're
unavailable (`kani verify-std` re-validated with `--force-rerun` to make
sure the run wasn't cached).
- **Robust detection.** `Box` via `is_box()`, `Rc`/`Arc` via their rustc
diagnostic items (no name matching), plus a return-type equality check
on the resolved model instance — which also correctly rejects
non-default allocators (`Box<T, A>`); an arity-based check would have
wrongly rejected plain `Box<T>` (= `Box<T, Global>`).
Per the bounded-features policy (model-checking#4691/model-checking#4693): these values are
**unbounded** — a smart pointer to `T` covers exactly the values of `T`
— so they need no `--bounded-arguments` gating and retain the
full-coverage guarantee, demonstrated by a cover check in the test.
### Testing
New script-based test `cargo_autoharness_smart_pointers`:
`Box`/`Rc`/`Arc` of both implementing and only-derivable pointees (all
verified), a full-coverage cover check on the pointee (SATISFIED) with a
correctly failing assertion, and graceful skipping of a pointee that can
neither implement nor derive `Arbitrary`.
Full autoharness suite (14 tests), `verify_std_cmd`/`std_codegen`
(force-rerun), and `kani-compiler` unit tests pass.
Towards model-checking#3832
By submitting this pull request, I confirm that my contribution is made
under the terms of the Apache 2.0 and MIT licenses.
---------
Co-authored-by: Kiro <kiro-agent@users.noreply.github.com>
Co-authored-by: Felipe Monteiro <felisous@amazon.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Z-CompilerBenchCITag a PR to run benchmark CIZ-EndToEndBenchCITag a PR to run benchmark CI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@tautschnig@feliperodri