| ================================== |
| Stack Safety Analysis |
| ================================== |
| |
| |
| Introduction |
| ============ |
| |
| The Stack Safety Analysis determines if stack allocated variables can be |
| considered 'safe' from memory access bugs. |
| |
| The primary purpose of the analysis is to be used by sanitizers to avoid |
| unnecessary instrumentation of 'safe' variables. SafeStack is going to be the |
| first user. |
| |
| 'safe' variables can be defined as variables that can not be used out-of-scope |
| (e.g. use-after-return) or accessed out of bounds. In the future it can be |
| extended to track other variable properties. E.g. we plan to extend |
| implementation with a check to make sure that variable is always initialized |
| before every read to optimize use-of-uninitialized-memory checks. |
| |
| How it works |
| ============ |
| |
| The analysis is implemented in two stages: |
| |
| The intra-procedural, or 'local', stage performs a depth-first search inside |
| functions to collect all uses of each alloca, including loads/stores and uses as |
| arguments functions. After this stage we know which parts of the alloca are used |
| by functions itself but we don't know what happens after it is passed as |
| an argument to another function. |
| |
| The inter-procedural, or 'global', stage, resolves what happens to allocas after |
| they are passed as function arguments. This stage performs a depth-first search |
| on function calls inside a single module and propagates allocas usage through |
| functions calls. |
| |
| When used with ThinLTO, the global stage performs a whole program analysis over |
| the Module Summary Index. |
| |
| Testing |
| ======= |
| |
| The analysis is covered with lit tests. |
| |
| We expect that users can tolerate false classification of variables as |
| 'unsafe' when in-fact it's 'safe'. This may lead to inefficient code. However, we |
| can't accept false 'safe' classification which may cause sanitizers to miss actual |
| bugs in instrumented code. To avoid that we want additional validation tool. |
| |
| AddressSanitizer may help with this validation. We can instrument all variables |
| as usual but additionally store stack-safe information in the |
| ``ASanStackVariableDescription``. Then if AddressSanitizer detects a bug on |
| a 'safe' variable we can produce an additional report to let the user know that |
| probably Stack Safety Analysis failed and we should check for a bug in the |
| compiler. |