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