-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[stack-safety] Analysis documentation
Summary: Basic documentation of the Stack Safety Analysis. It will be improved during review and upstream of an implementation. Reviewers: kcc, eugenis, vlad.tsyrklevich, glider Reviewed By: vlad.tsyrklevich Subscribers: arphaman, llvm-commits Differential Revision: https://reviews.llvm.org/D53336 llvm-svn: 347612
- Loading branch information
1 parent
42b0506
commit d313052
Showing
3 changed files
with
71 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
================================== | ||
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. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters