1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- Undefined Behavior
- ------------------
- In the C language, some operations are undefined, like signed integer overflow,
- dereferencing freed pointers, accessing outside allocated space, ...
- Undefined Behavior must not occur in a C program, it is not safe even if the
- output of undefined operations is unused. The unsafety may seem nit picking
- but Optimizing compilers have in fact optimized code on the assumption that
- no undefined Behavior occurs.
- Optimizing code based on wrong assumptions can and has in some cases lead to
- effects beyond the output of computations.
- The signed integer overflow problem in speed critical code
- ----------------------------------------------------------
- Code which is highly optimized and works with signed integers sometimes has the
- problem that some (invalid) inputs can trigger overflows (undefined behavior).
- In these cases, often the output of the computation does not matter (as it is
- from invalid input).
- In some cases the input can be checked easily in others checking the input is
- computationally too intensive.
- In these remaining cases a unsigned type can be used instead of a signed type.
- unsigned overflows are defined in C.
- SUINT
- -----
- As we have above established there is a need to use "unsigned" sometimes in
- computations which work with signed integers (which overflow).
- Using "unsigned" for signed integers has the very significant potential to
- cause confusion
- as in
- unsigned a,b,c;
- ...
- a+b*c;
- The reader does not expect b to be semantically -5 here and if the code is
- changed by maybe adding a cast, a division or other the signedness will almost
- certainly be mistaken.
- To avoid this confusion a new type was introduced, "SUINT" is the C "unsigned"
- type but it holds a signed "int".
- to use the same example
- SUINT a,b,c;
- ...
- a+b*c;
- here the reader knows that a,b,c are meant to be signed integers but for C
- standard compliance / to avoid undefined behavior they are stored in unsigned
- ints.
|