mirror of https://github.com/FFmpeg/FFmpeg.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.9 KiB
47 lines
1.9 KiB
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. |
|
|
|
|