Skip to content

Commit 0a89373

Browse files
Explain typos in asm! can be unsound
1 parent 3c47807 commit 0a89373

File tree

1 file changed

+10
-0
lines changed

1 file changed

+10
-0
lines changed

src/inline-assembly.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ asm := "asm!(" format_string *("," format_string) *("," operand) [","] ")"
5252
global_asm := "global_asm!(" format_string *("," format_string) *("," operand) [","] ")"
5353
```
5454

55+
## Correctness and Validity
56+
57+
In addition to all of the rules that follow, the string argument to `asm!` must ultimately become; after all other arguments are evaluated, formatting is performed, and operands are translated; assembly that is both syntactically correct and semantically valid for the target architecture. The formatting rules allow Rust to generate assembly with correct syntax. Rules concerning operands permit valid translation of Rust operands into and out of `asm!`. Adherence to these rules is necessary, but not sufficient, for the final assembly to be correct and valid. For instance:
58+
59+
- arguments may be placed in positions which are syntactically incorrect after formatting
60+
- an instruction may be correctly written, but given architecturally invalid operands
61+
- an architecturally unspecified instruction may be assembled into unspecified code
62+
- a set of instructions, each correct and valid in isolation, may cause undefined behavior when placed in sequence
63+
64+
As a result, the following rules are _non-exhaustive_. Rust is not required to check the correctness and validity of the initial string nor the final assembly that is generated. The assembler may check for correctness and validity but is not required to do so. When using `asm!`, a typographical error may be sufficient to make a program unsound, and the rules for assembly may include thousands of pages architectural reference manuals. Programmers should exercise appropriate care.
5565

5666
## Scope
5767

0 commit comments

Comments
 (0)