Frequently Reported Non-Bugs
The behaviors listed below are reported as compiler bugs on a regular basis, but are either intentional, documented, or explicitly not guaranteed by the language.
The list of actual bugs is tracked in the list of known bugs.
Non-canonical ABI-encoded calldata is accepted
Offsets that point backwards, overlap, or leave gaps are not necessarily rejected,
and trailing data past the encoded arguments is ignored.
The Solidity decoder does not enforce strict encoding mode;
the invariant we uphold is that decoding must not read beyond calldatasize().
Different results between the evmasm and the IR pipeline
The two pipelines have some semantic differences. Known and intentional divergences are listed in Solidity IR-based Codegen Changes, in particular cleanup behavior differs.
Order of evaluation
The evaluation order of expressions is unspecified and this includes the components of tuple assignments and returns (see also Tuples are not proper types). Only statement order and short-circuiting of boolean operators are guaranteed. Note that assignments involving reference types copy or alias depending on data location, which is documented behavior and not an aliasing bug by itself.
Stale references into storage
A reference to a storage array element can be left dangling by anything that resizes or relocates the
containing array, for example a .pop(), a .push() that switches a bytes array
from short to long layout, or an assignment to the array itself as in (s[0], s) = (x, y).
Writing through such a reference is not rejected and may write outside the data area of the array.
This is documented behavior, and code containing dangling references is explicitly considered to have undefined behavior.