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