Merge pull request #635 from crytic/feature/parser-testing

comprehensive parser tests
bugfix/variabledeclaration
Feist Josselin 4 years ago committed by GitHub
commit 665d706625
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      .github/workflows/ci.yml
  2. 44
      .github/workflows/parser.yml
  3. 6
      slither/core/declarations/function.py
  4. 6
      slither/slither.py
  5. 17
      slither/solc_parsing/slitherSolc.py
  6. 11
      tests/ast-parsing/assembly-all.sol
  7. 15
      tests/ast-parsing/assignment-0.4.0.sol
  8. 17
      tests/ast-parsing/assignment-0.4.7.sol
  9. 22
      tests/ast-parsing/binaryoperation-0.4.0.sol
  10. 24
      tests/ast-parsing/binaryoperation-0.4.7.sol
  11. 21
      tests/ast-parsing/break-all.sol
  12. 9
      tests/ast-parsing/conditional-all.sol
  13. 21
      tests/ast-parsing/continue-all.sol
  14. 35
      tests/ast-parsing/contract-0.4.0.sol
  15. 35
      tests/ast-parsing/contract-0.4.22.sol
  16. 35
      tests/ast-parsing/contract-0.6.0.sol
  17. 1
      tests/ast-parsing/dowhile-0.4.0.sol
  18. 12
      tests/ast-parsing/dowhile-0.4.5.sol
  19. 13
      tests/ast-parsing/emit-0.4.0.sol
  20. 22
      tests/ast-parsing/emit-0.4.21.sol
  21. 14
      tests/ast-parsing/emit-0.4.8.sol
  22. 8
      tests/ast-parsing/emit-0.5.0.sol
  23. 29
      tests/ast-parsing/enum-all.sol
  24. 6
      tests/ast-parsing/event-all.sol
  25. 5
      tests/ast-parsing/expected/assembly-0.4.0-legacy.json
  26. 5
      tests/ast-parsing/expected/assembly-0.4.1-legacy.json
  27. 5
      tests/ast-parsing/expected/assembly-0.4.10-legacy.json
  28. 5
      tests/ast-parsing/expected/assembly-0.4.11-legacy.json
  29. 5
      tests/ast-parsing/expected/assembly-0.4.12-compact.json
  30. 5
      tests/ast-parsing/expected/assembly-0.4.12-legacy.json
  31. 5
      tests/ast-parsing/expected/assembly-0.4.13-compact.json
  32. 5
      tests/ast-parsing/expected/assembly-0.4.13-legacy.json
  33. 5
      tests/ast-parsing/expected/assembly-0.4.14-compact.json
  34. 5
      tests/ast-parsing/expected/assembly-0.4.14-legacy.json
  35. 5
      tests/ast-parsing/expected/assembly-0.4.15-compact.json
  36. 5
      tests/ast-parsing/expected/assembly-0.4.15-legacy.json
  37. 5
      tests/ast-parsing/expected/assembly-0.4.16-compact.json
  38. 5
      tests/ast-parsing/expected/assembly-0.4.16-legacy.json
  39. 5
      tests/ast-parsing/expected/assembly-0.4.17-compact.json
  40. 5
      tests/ast-parsing/expected/assembly-0.4.17-legacy.json
  41. 5
      tests/ast-parsing/expected/assembly-0.4.18-compact.json
  42. 5
      tests/ast-parsing/expected/assembly-0.4.18-legacy.json
  43. 5
      tests/ast-parsing/expected/assembly-0.4.19-compact.json
  44. 5
      tests/ast-parsing/expected/assembly-0.4.19-legacy.json
  45. 5
      tests/ast-parsing/expected/assembly-0.4.2-legacy.json
  46. 5
      tests/ast-parsing/expected/assembly-0.4.20-compact.json
  47. 5
      tests/ast-parsing/expected/assembly-0.4.20-legacy.json
  48. 5
      tests/ast-parsing/expected/assembly-0.4.21-compact.json
  49. 5
      tests/ast-parsing/expected/assembly-0.4.21-legacy.json
  50. 5
      tests/ast-parsing/expected/assembly-0.4.22-compact.json
  51. 5
      tests/ast-parsing/expected/assembly-0.4.22-legacy.json
  52. 5
      tests/ast-parsing/expected/assembly-0.4.23-compact.json
  53. 5
      tests/ast-parsing/expected/assembly-0.4.23-legacy.json
  54. 5
      tests/ast-parsing/expected/assembly-0.4.24-compact.json
  55. 5
      tests/ast-parsing/expected/assembly-0.4.24-legacy.json
  56. 5
      tests/ast-parsing/expected/assembly-0.4.25-compact.json
  57. 5
      tests/ast-parsing/expected/assembly-0.4.25-legacy.json
  58. 5
      tests/ast-parsing/expected/assembly-0.4.26-compact.json
  59. 5
      tests/ast-parsing/expected/assembly-0.4.26-legacy.json
  60. 5
      tests/ast-parsing/expected/assembly-0.4.3-legacy.json
  61. 5
      tests/ast-parsing/expected/assembly-0.4.4-legacy.json
  62. 5
      tests/ast-parsing/expected/assembly-0.4.5-legacy.json
  63. 5
      tests/ast-parsing/expected/assembly-0.4.6-legacy.json
  64. 5
      tests/ast-parsing/expected/assembly-0.4.7-legacy.json
  65. 5
      tests/ast-parsing/expected/assembly-0.4.8-legacy.json
  66. 5
      tests/ast-parsing/expected/assembly-0.4.9-legacy.json
  67. 5
      tests/ast-parsing/expected/assembly-0.5.0-compact.json
  68. 5
      tests/ast-parsing/expected/assembly-0.5.0-legacy.json
  69. 5
      tests/ast-parsing/expected/assembly-0.5.1-compact.json
  70. 5
      tests/ast-parsing/expected/assembly-0.5.1-legacy.json
  71. 5
      tests/ast-parsing/expected/assembly-0.5.10-compact.json
  72. 5
      tests/ast-parsing/expected/assembly-0.5.10-legacy.json
  73. 5
      tests/ast-parsing/expected/assembly-0.5.11-compact.json
  74. 5
      tests/ast-parsing/expected/assembly-0.5.11-legacy.json
  75. 5
      tests/ast-parsing/expected/assembly-0.5.12-compact.json
  76. 5
      tests/ast-parsing/expected/assembly-0.5.12-legacy.json
  77. 5
      tests/ast-parsing/expected/assembly-0.5.13-compact.json
  78. 5
      tests/ast-parsing/expected/assembly-0.5.13-legacy.json
  79. 5
      tests/ast-parsing/expected/assembly-0.5.14-compact.json
  80. 5
      tests/ast-parsing/expected/assembly-0.5.14-legacy.json
  81. 5
      tests/ast-parsing/expected/assembly-0.5.15-compact.json
  82. 5
      tests/ast-parsing/expected/assembly-0.5.15-legacy.json
  83. 5
      tests/ast-parsing/expected/assembly-0.5.16-compact.json
  84. 5
      tests/ast-parsing/expected/assembly-0.5.16-legacy.json
  85. 5
      tests/ast-parsing/expected/assembly-0.5.17-compact.json
  86. 5
      tests/ast-parsing/expected/assembly-0.5.17-legacy.json
  87. 5
      tests/ast-parsing/expected/assembly-0.5.2-compact.json
  88. 5
      tests/ast-parsing/expected/assembly-0.5.2-legacy.json
  89. 5
      tests/ast-parsing/expected/assembly-0.5.3-compact.json
  90. 5
      tests/ast-parsing/expected/assembly-0.5.3-legacy.json
  91. 5
      tests/ast-parsing/expected/assembly-0.5.4-compact.json
  92. 5
      tests/ast-parsing/expected/assembly-0.5.4-legacy.json
  93. 5
      tests/ast-parsing/expected/assembly-0.5.5-compact.json
  94. 5
      tests/ast-parsing/expected/assembly-0.5.5-legacy.json
  95. 5
      tests/ast-parsing/expected/assembly-0.5.6-compact.json
  96. 5
      tests/ast-parsing/expected/assembly-0.5.6-legacy.json
  97. 5
      tests/ast-parsing/expected/assembly-0.5.7-compact.json
  98. 5
      tests/ast-parsing/expected/assembly-0.5.7-legacy.json
  99. 5
      tests/ast-parsing/expected/assembly-0.5.8-compact.json
  100. 5
      tests/ast-parsing/expected/assembly-0.5.8-legacy.json
  101. Some files were not shown because too many files have changed in this diff Show More

@ -35,7 +35,7 @@ jobs:
"simil",
"slither_config",
"truffle",
"upgradability",
"upgradability",
"prop"]
steps:
- uses: actions/checkout@v1

@ -0,0 +1,44 @@
---
name: Parser tests
defaults:
run:
# To load bashrc
shell: bash -ieo pipefail {0}
on:
pull_request:
branches: [master, dev]
schedule:
# run CI every day even if no PRs/merges occur
- cron: '0 12 * * *'
jobs:
build:
name: Parser tests
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v2
- name: Set up Python 3.6
uses: actions/setup-python@v2
with:
python-version: 3.6
- name: Install dependencies
run: |
python setup.py install
pip install deepdiff
pip install pytest
git clone https://github.com/crytic/solc-select.git
./solc-select/scripts/install.sh
export PATH=/home/runner/.solc-select:$PATH
echo "export PATH=/home/runner/.solc-select:$PATH" >> ~/.bashrc
- name: Test with pytest
run: |
pytest tests/test_ast_parsing.py

@ -1298,7 +1298,7 @@ class Function(
with open(filename, "w", encoding="utf8") as f:
f.write(content)
def slithir_cfg_to_dot_str(self) -> str:
def slithir_cfg_to_dot_str(self, skip_expressions=False) -> str:
"""
Export the CFG to a DOT format. The nodes includes the Solidity expressions and the IRs
:return: the DOT content
@ -1310,9 +1310,9 @@ class Function(
content += "digraph{\n"
for node in self.nodes:
label = "Node Type: {} {}\n".format(str(node.type), node.node_id)
if node.expression:
if node.expression and not skip_expressions:
label += "\nEXPRESSION:\n{}\n".format(node.expression)
if node.irs:
if node.irs and not skip_expressions:
label += "\nIRs:\n" + "\n".join([str(ir) for ir in node.irs])
content += '{}[label="{}"];\n'.format(node.node_id, label)
if node.type in [NodeType.IF, NodeType.IFLOOP]:

@ -97,7 +97,11 @@ class Slither(SlitherCore): # pylint: disable=too-many-instance-attributes
triage_mode = kwargs.get("triage_mode", False)
self._triage_mode = triage_mode
self._parser.analyze_contracts()
self._parser.parse_contracts()
# skip_analyze is only used for testing
if not kwargs.get("skip_analyze", False):
self._parser.analyze_contracts()
def _init_from_raw_json(self, filename):
if not os.path.isfile(filename):

@ -20,11 +20,12 @@ logger.setLevel(logging.INFO)
class SlitherSolc:
# pylint: disable=no-self-use
# pylint: disable=no-self-use,too-many-instance-attributes
def __init__(self, filename: str, core: SlitherCore):
super().__init__()
core.filename = filename
self._contracts_by_id: Dict[int, ContractSolc] = {}
self._parsed = False
self._analyzed = False
self._underlying_contract_to_parser: Dict[Contract, ContractSolc] = dict()
@ -233,16 +234,20 @@ class SlitherSolc:
###################################################################################
###################################################################################
@property
def parsed(self) -> bool:
return self._parsed
@property
def analyzed(self) -> bool:
return self._analyzed
def analyze_contracts(self): # pylint: disable=too-many-statements,too-many-branches
def parse_contracts(self): # pylint: disable=too-many-statements,too-many-branches
if not self._underlying_contract_to_parser:
logger.info(
f"No contract were found in {self._core.filename}, check the correct compilation"
)
if self._analyzed:
if self._parsed:
raise Exception("Contract analysis can be run only once!")
# First we save all the contracts in a dict
@ -348,12 +353,16 @@ Please rename it, this name is reserved for Slither's internals"""
# Then we analyse state variables, functions and modifiers
self._analyze_third_part(contracts_to_be_analyzed, libraries)
self._analyzed = True
self._parsed = True
def analyze_contracts(self): # pylint: disable=too-many-statements,too-many-branches
if not self._parsed:
raise SlitherException("Parse the contract before running analyses")
self._convert_to_slithir()
compute_dependency(self._core)
self._core.compute_storage_layout()
self._analyzed = True
def _analyze_all_enums(self, contracts_to_be_analyzed: List[ContractSolc]):
while contracts_to_be_analyzed:

@ -0,0 +1,11 @@
contract C {
function f() public {
assembly {
let x := 0
}
assembly "evmasm" {
let x := 0
}
}
}

@ -0,0 +1,15 @@
contract C {
function f() public {
uint assign;
assign = 10;
assign |= 10;
assign ^= 10;
assign &= 10;
assign += 10;
assign -= 10;
assign *= 10;
assign /= 10;
assign %= 10;
}
}

@ -0,0 +1,17 @@
contract C {
function f() public {
uint assign;
assign = 10;
assign |= 10;
assign ^= 10;
assign &= 10;
assign <<= 10;
assign >>= 10;
assign += 10;
assign -= 10;
assign *= 10;
assign /= 10;
assign %= 10;
}
}

@ -0,0 +1,22 @@
contract C {
function f() public {
1**2;
1*2;
1/2;
1&2;
1+2;
1-2;
1 & 2;
1 ^ 2;
1 | 2;
1 < 2;
1 > 2;
1 <= 2;
1 >= 2;
1 == 2;
1 != 2;
true && false;
true || false;
}
}

@ -0,0 +1,24 @@
contract C {
function f() public {
1**2;
1*2;
1/2;
1&2;
1+2;
1-2;
1 << 2;
1 >> 2;
1 & 2;
1 ^ 2;
1 | 2;
1 < 2;
1 > 2;
1 <= 2;
1 >= 2;
1 == 2;
1 != 2;
true && false;
true || false;
}
}

@ -0,0 +1,21 @@
contract C {
function f() public {
uint c;
for (uint i = 0; i < 10; i++) {
if (i % 2 == 0) {
break;
}
c++;
}
for (uint j = 0; j < 10; j++) {
for (uint k = 0; k < 10; k++) {
if (j % 2 == 0 && k % 3 == 0) {
break;
}
c++;
}
}
}
}

@ -0,0 +1,9 @@
contract C {
function f() public {
false ? 1 : 2;
5 == 6 ? 1 : 2;
1 + 2 == 3 ? 4 + 5 == 6 ? int8(0) : -1 : -2;
true ? "a" : "b";
false ? (1, 2) : (3, 4);
}
}

@ -0,0 +1,21 @@
contract C {
function f() public {
uint c;
for (uint i = 0; i < 10; i++) {
if (i % 2 == 0) {
continue;
}
c++;
}
for (uint j = 0; j < 10; j++) {
for (uint k = 0; k < 10; k++) {
if (j % 2 == 0 && k % 3 == 0) {
continue;
}
c++;
}
}
}
}

@ -0,0 +1,35 @@
// a simple contract
contract A {
}
// inheritance, no constructor
contract B is A {
function B(uint a) {
}
}
// inheritance, init in inheritance
contract C is B(4) {
}
// inheritance, init in constructor
contract D is B {
function D() B(2) {
}
}
// abstract contract
contract E is B {
}
// diamond inheritance
contract F is A {}
contract G is A {}
contract H is F, G {
}

@ -0,0 +1,35 @@
// a simple contract
contract A {
}
// inheritance, no constructor
contract B is A {
constructor(uint a) public {
}
}
// inheritance, init in inheritance
contract C is B(4) {
}
// inheritance, init in constructor
contract D is B {
constructor() B(2) public {
}
}
// abstract contract
contract E is B {
}
// diamond inheritance
contract F is A {}
contract G is A {}
contract H is F, G {
}

@ -0,0 +1,35 @@
// a simple contract
contract A {
}
// inheritance, no constructor
contract B is A {
constructor(uint a) public {
}
}
// inheritance, init in inheritance
contract C is B(4) {
}
// inheritance, init in constructor
contract D is B {
constructor() B(2) public {
}
}
// abstract contract
abstract contract E is B {
}
// diamond inheritance
contract F is A {}
contract G is A {}
contract H is F, G {
}

@ -0,0 +1,12 @@
contract C {
function f() public {
bool go = true;
do {
go = false;
} while (go);
go = true;
do go = false;
while (go);
}
}

@ -0,0 +1,13 @@
contract C {
event E(uint);
function emitNoKeyword() public {
E(1);
}
function cursed() public {
var x = E;
x(1);
x(2);
}
}

@ -0,0 +1,22 @@
contract C {
event E(uint);
function emitNoKeyword() public {
E(1);
C.E(1);
}
function emitWithKeyword() public {
emit E(1);
emit C.E(1);
}
function cursed() public {
var x = E;
x(1);
x(2);
emit x(1);
emit x(2);
}
}

@ -0,0 +1,14 @@
contract C {
event E(uint);
function emitNoKeyword() public {
E(1);
C.E(1);
}
function cursed() public {
var x = E;
x(1);
x(2);
}
}

@ -0,0 +1,8 @@
contract C {
event E(uint);
function emitWithKeyword() public {
emit E(1);
emit C.E(1);
}
}

@ -0,0 +1,29 @@
contract C {
enum E1 {
A,
B,
C
}
// this enum contains more than 256 elements
// which means it can't be stored in a uint8
enum E2 {
A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,A16,
A17,A18,A19,A20,A21,A22,A23,A24,A25,A26,A27,A28,A29,A30,A31,A32,
A33,A34,A35,A36,A37,A38,A39,A40,A41,A42,A43,A44,A45,A46,A47,A48,
A49,A50,A51,A52,A53,A54,A55,A56,A57,A58,A59,A60,A61,A62,A63,A64,
A65,A66,A67,A68,A69,A70,A71,A72,A73,A74,A75,A76,A77,A78,A79,A80,
A81,A82,A83,A84,A85,A86,A87,A88,A89,A90,A91,A92,A93,A94,A95,A96,
A97,A98,A99,A100,A101,A102,A103,A104,A105,A106,A107,A108,A109,A110,A111,A112,
A113,A114,A115,A116,A117,A118,A119,A120,A121,A122,A123,A124,A125,A126,A127,A128,
A129,A130,A131,A132,A133,A134,A135,A136,A137,A138,A139,A140,A141,A142,A143,A144,
A145,A146,A147,A148,A149,A150,A151,A152,A153,A154,A155,A156,A157,A158,A159,A160,
A161,A162,A163,A164,A165,A166,A167,A168,A169,A170,A171,A172,A173,A174,A175,A176,
A177,A178,A179,A180,A181,A182,A183,A184,A185,A186,A187,A188,A189,A190,A191,A192,
A193,A194,A195,A196,A197,A198,A199,A200,A201,A202,A203,A204,A205,A206,A207,A208,
A209,A210,A211,A212,A213,A214,A215,A216,A217,A218,A219,A220,A221,A222,A223,A224,
A225,A226,A227,A228,A229,A230,A231,A232,A233,A234,A235,A236,A237,A238,A239,A240,
A241,A242,A243,A244,A245,A246,A247,A248,A249,A250,A251,A252,A253,A254,A255,A256,
A257
}
}

@ -0,0 +1,6 @@
contract C {
event NoParams();
event Anonymous() anonymous;
event OneParam(address addr);
event OneParamIndexed(address indexed addr);
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

@ -0,0 +1,5 @@
{
"C": {
"f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: INLINE ASM 1\n\"];\n1->2;\n2[label=\"Node Type: INLINE ASM 2\n\"];\n}\n"
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save