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.