Files
GopherGate/target/doc/zerocopy/derive.FromZeros.html
2026-02-26 12:00:21 -05:00

70 lines
7.4 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Analyzes whether a type is [`FromZeros`]."><title>FromZeros in zerocopy - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../" data-static-root-path="../static.files/" data-current-crate="zerocopy" data-themes="" data-resource-suffix="" data-rustdoc-version="1.93.1 (01f6ddf75 2026-02-11) (Arch Linux rust 1:1.93.1-1)" data-channel="1.93.1" data-search-js="search-9e2438ea.js" data-stringdex-js="stringdex-a3946164.js" data-settings-js="settings-c38705f0.js" ><script src="../static.files/storage-e2aeef58.js"></script><script defer src="sidebar-items.js"></script><script defer src="../static.files/main-a410ff4d.js"></script><noscript><link rel="stylesheet" href="../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../static.files/favicon-044be391.svg"></head><body class="rustdoc derive"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">FromZeros</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../zerocopy/index.html">zerocopy</a><span class="version">0.8.39</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">From<wbr>Zeros</a></h2><h3><a href="#">Sections</a></h3><ul class="block top-toc"><li><a href="#analysis" title="Analysis">Analysis</a><ul><li><a href="#why-isnt-an-explicit-representation-required-for-structs" title="Why isnt an explicit representation required for structs?">Why isnt an explicit representation required for structs?</a></li></ul></li></ul></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="index.html">In crate zerocopy</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="index.html">zerocopy</a></div><h1>Derive Macro <span class="derive">From<wbr>Zeros</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../src/zerocopy_derive/lib.rs.html#82">Source</a> </span></div><pre class="rust item-decl"><code>#[derive(FromZeros)]
{
<span class="comment">// Attributes available to this derive:</span>
#[zerocopy]
}
</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Analyzes whether a type is <a href="trait.FromZeros.html" title="trait zerocopy::FromZeros"><code>FromZeros</code></a>.</p>
<p>This derive analyzes, at compile time, whether the annotated type satisfies
the <a href="trait.FromZeros.html#safety" title="trait zerocopy::FromZeros">safety conditions</a> of <code>FromZeros</code> and implements <code>FromZeros</code> and its
supertraits if it is sound to do so. This derive can be applied to structs,
enums, and unions; e.g.:</p>
<div class="example-wrap"><pre class="rust rust-example-rendered"><code><span class="attr">#[derive(FromZeros)]
</span><span class="kw">struct </span>MyStruct {
...
}
<span class="attr">#[derive(FromZeros)]
#[repr(u8)]
</span><span class="kw">enum </span>MyEnum {
...
}
<span class="attr">#[derive(FromZeros, Immutable)]
</span><span class="kw">union </span>MyUnion {
...
}</code></pre></div><h2 id="analysis"><a class="doc-anchor" href="#analysis">§</a>Analysis</h2>
<p><em>This section describes, roughly, the analysis performed by this derive to
determine whether it is sound to implement <code>FromZeros</code> for a given type.
Unless you are modifying the implementation of this derive, or attempting to
manually implement <code>FromZeros</code> for a type yourself, you dont need to read
this section.</em></p>
<p>If a type has the following properties, then this derive can implement
<code>FromZeros</code> for that type:</p>
<ul>
<li>If the type is a struct, all of its fields must be <code>FromZeros</code>.</li>
<li>If the type is an enum:
<ul>
<li>It must have a defined representation (<code>repr</code>s <code>C</code>, <code>u8</code>, <code>u16</code>, <code>u32</code>,
<code>u64</code>, <code>usize</code>, <code>i8</code>, <code>i16</code>, <code>i32</code>, <code>i64</code>, or <code>isize</code>).</li>
<li>It must have a variant with a discriminant/tag of <code>0</code>, and its fields
must be <code>FromZeros</code>. See <a href="https://doc.rust-lang.org/reference/items/enumerations.html#custom-discriminant-values-for-fieldless-enumerations">the reference</a> for a description of
discriminant values are specified.</li>
<li>The fields of that variant must be <code>FromZeros</code>.</li>
</ul>
</li>
</ul>
<p>This analysis is subject to change. Unsafe code may <em>only</em> rely on the
documented <a href="trait.FromZeros.html#safety" title="trait zerocopy::FromZeros">safety conditions</a> of <code>FromZeros</code>, and must <em>not</em> rely on the
implementation details of this derive.</p>
<h3 id="why-isnt-an-explicit-representation-required-for-structs"><a class="doc-anchor" href="#why-isnt-an-explicit-representation-required-for-structs">§</a>Why isnt an explicit representation required for structs?</h3>
<p>Neither this derive, nor the <a href="trait.FromZeros.html#safety" title="trait zerocopy::FromZeros">safety conditions</a> of <code>FromZeros</code>, requires
that structs are marked with <code>#[repr(C)]</code>.</p>
<p>Per the <a href="https://doc.rust-lang.org/1.93.1/core/primitive.reference.html" title="primitive reference">Rust reference</a>,</p>
<blockquote>
<p>The representation of a type can change the padding between fields, but
does not change the layout of the fields themselves.</p>
</blockquote>
<p>Since the layout of structs only consists of padding bytes and field bytes,
a struct is soundly <code>FromZeros</code> if:</p>
<ol>
<li>its padding is soundly <code>FromZeros</code>, and</li>
<li>its fields are soundly <code>FromZeros</code>.</li>
</ol>
<p>The answer to the first question is always yes: padding bytes do not have
any validity constraints. A <a href="https://github.com/rust-lang/unsafe-code-guidelines/issues/174">discussion</a> of this question in the Unsafe Code
Guidelines Working Group concluded that it would be virtually unimaginable
for future versions of rustc to add validity constraints to padding bytes.</p>
<p>Whether a struct is soundly <code>FromZeros</code> therefore solely depends on whether
its fields are <code>FromZeros</code>.</p>
</div></details></section></div></main></body></html>