| 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. |
| |