Proof of memory safety in main function.
This commit is contained in:
parent
09183f43e1
commit
e0c7116486
|
@ -0,0 +1,87 @@
|
||||||
|
# Proof that the compiler is working correctly
|
||||||
|
|
||||||
|
## The compiler is memory safe for all arguments and files.
|
||||||
|
|
||||||
|
The proof is partly inductive and therefore divided in multiple parts.
|
||||||
|
|
||||||
|
### Token extraction
|
||||||
|
|
||||||
|
### Code Analysis
|
||||||
|
|
||||||
|
### Assembling
|
||||||
|
|
||||||
|
### Compiling program
|
||||||
|
|
||||||
|
The memory safety is endangered on two ways.
|
||||||
|
|
||||||
|
1. Addressing unallocated memory in arrays, or based on pointers
|
||||||
|
2. Copying a pointer and change the values
|
||||||
|
|
||||||
|
#### Addressing unallocated memory
|
||||||
|
|
||||||
|
The first way is only possible in the parsing step of the command line arguments.
|
||||||
|
|
||||||
|
They are parsed in the following loop.
|
||||||
|
|
||||||
|
```c
|
||||||
|
for (int i = 1; i < argc; i++) {
|
||||||
|
if (argv[i][0] == '-' && ((i+1) < argc)) {
|
||||||
|
switch (argv[i][1]) {
|
||||||
|
case 'o': filename_compiled = argv[i+1];break;
|
||||||
|
case 'd': device = argv[i+1];break;
|
||||||
|
default: printf("ERROR: unknown argument: %c\n", argv[i][1]);exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
} else {
|
||||||
|
filename = argv[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The allowed range of the index is $(0, argc-1)$.
|
||||||
|
Note: The values $0$ and $argc-1$ are included.
|
||||||
|
In the loop, argv is indexed by i under the condition $0 < i < argc$ and $i+1$ with the additional condition $(i+1) < argc$.
|
||||||
|
|
||||||
|
The variable i is only incremented starting at 1.
|
||||||
|
This means, the lower border is always right.
|
||||||
|
The variable can't be raised higher than $argc-1$,
|
||||||
|
so the upper border can't be reached by i itself.
|
||||||
|
To avoid accessing undefined memory with $i+1$,
|
||||||
|
the value of $i+1$ is compared to argc and can't violate memory access.
|
||||||
|
Through this conditional constraints, the loop can be considered memory safe.
|
||||||
|
|
||||||
|
#### Changing the values of a cell accessed by multiple pointers
|
||||||
|
|
||||||
|
To identify memory leaks through assignment of the same address to multiple pointers, the manually allocated variables in the code are examined for such occasions and then for resulting errors:
|
||||||
|
|
||||||
|
|Variable name|Mutability|
|
||||||
|
|---|---|
|
||||||
|
|argv*||
|
||||||
|
|filename_compiled|reassigned, values immutable|
|
||||||
|
|filename|reassigned, values immutable|
|
||||||
|
|device|reassigned, values immutable|
|
||||||
|
|fd|reassigned, values immutable|
|
||||||
|
|buffer|expanded, writing values|
|
||||||
|
|tokens|reassigned, values immutable|
|
||||||
|
|binary||
|
||||||
|
|fout|reassigned, values immutable|
|
||||||
|
|
||||||
|
As suggested by the table above, the most pointers are just reassigned to a new space.
|
||||||
|
Even if connected to each other, none of them is changing the values in the addressed memory cells.
|
||||||
|
Only the buffer is changed, when filled with the content from the file with name *filename*.
|
||||||
|
As the buffer is not interfering with any other pointer, it can be considered memory safe.
|
||||||
|
|
||||||
|
This means, the main-function, and therefore the entire program, is memory safe if, as shown earlier, the argument-parsing loop and the functions
|
||||||
|
|
||||||
|
- extractTokens
|
||||||
|
- analyze
|
||||||
|
- assemble
|
||||||
|
|
||||||
|
are implemented memory safe.
|
||||||
|
|
||||||
|
## Every program, which is accepted by the compiler without error is working on the processor.
|
||||||
|
|
||||||
|
## The compiled binaries are working the same way as the provided code.
|
||||||
|
|
||||||
|
## The compiler is detecting any wrong argument or code.
|
Loading…
Reference in New Issue