[rust-dev] Integer overflow checking
Patrick Walton
pwalton at mozilla.com
Fri Apr 15 23:20:27 PDT 2011
Hi everyone,
I've been wondering for a while whether it's feasible from a performance
standpoint for a systems language to detect and abort on
potentially-dangerous integer overflows by default. Overflow is an
insidious problem for several reasons:
(1) It can happen practically anywhere; anytime the basic arithmetic
operators are used, an overflow or underflow could occur.
(2) To reason about overflow, the programmer has to solve a global data
flow problem. An expression as simple as "a + b" necessitates an answer
to the question "could the program input have influenced a or b such
that the operation could overflow?"
(3) Overflow checking is rarely used in practice due to the performance
costs associated with it. ISAs aren't that well-suited for overflow
checking. For example, on the x86 one has to test for the overflow
and/or carry flag after every integer operation that could possibly set
it. Contrast this with the floating-point situation, in which a SIGFPE
is raised on overflow without having to explicitly test after each
instruction.
(4) It can be catastrophic from a memory safety and security standpoint
when overflow errors creep in, especially when unsafe operations such as
memory allocation and unchecked array copying are performed. We do
permit unsafe operations in Rust (although we certainly hope they're
going to be rare!)
I did a quick survey of the available literature and there isn't too
much out there*, but there is a recent gem of a paper from CERT:
http://www.cert.org/archive/pdf/09tn023.pdf
They managed to get quite impressive numbers: under 6% slowdown using
their As-If-Infinitely-Ranged model on GCC -O3. The trick is to delay
overflow checking to "observation points", which roughly correspond to
state being updated or I/O being performed (there's an interesting
connection between this and the operations that made a function "impure"
in the previous effect system).
This area seems promising enough that I was wondering if there was
interest in something like this for Rust. There's no harm in having the
programmer explicitly be able to turn off the checking at the block or
item level; some algorithms, such as hashing algorithms, rely on the
overflow semantics, after all. But it seems in the spirit of Rust (at
the risk of relying on a nebulous term) to be as safe as possible by
default, and so I'd like to propose exploring opt-out overflow checking
for integers at some point in the future.
Thoughts?
Patrick
* That said, Microsoft seems to have put more effort than most into
detecting integer overflows in its huge C++ codebases, both through
fairly sophisticated static analysis [1] and through dynamic checks with
the SafeInt library [2]. Choice quote: "SafeInt is currently used
extensively throughout Microsoft, with substantial adoption within
Office and Windows."
[1]: http://research.microsoft.com/pubs/80722/z3prefix.pdf
[2]: http://safeint.codeplex.com/
More information about the Rust-dev
mailing list