Merge pull request #673 from crytic/dev-min-max

Add support for type(X).min/max
pull/686/head
Feist Josselin 4 years ago committed by GitHub
commit 42545568ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 22
      slither/core/solidity_types/elementary_type.py
  2. 9
      slither/slithir/convert.py
  3. 27
      slither/visitors/slithir/expression_to_slithir.py
  4. 5
      tests/ast-parsing/expected/minmax-0.4.0-legacy.json
  5. 5
      tests/ast-parsing/expected/minmax-0.4.1-legacy.json
  6. 5
      tests/ast-parsing/expected/minmax-0.4.10-legacy.json
  7. 5
      tests/ast-parsing/expected/minmax-0.4.11-legacy.json
  8. 5
      tests/ast-parsing/expected/minmax-0.4.12-compact.json
  9. 5
      tests/ast-parsing/expected/minmax-0.4.12-legacy.json
  10. 5
      tests/ast-parsing/expected/minmax-0.4.13-compact.json
  11. 5
      tests/ast-parsing/expected/minmax-0.4.13-legacy.json
  12. 5
      tests/ast-parsing/expected/minmax-0.4.14-compact.json
  13. 5
      tests/ast-parsing/expected/minmax-0.4.14-legacy.json
  14. 5
      tests/ast-parsing/expected/minmax-0.4.15-compact.json
  15. 5
      tests/ast-parsing/expected/minmax-0.4.15-legacy.json
  16. 5
      tests/ast-parsing/expected/minmax-0.4.16-compact.json
  17. 5
      tests/ast-parsing/expected/minmax-0.4.16-legacy.json
  18. 5
      tests/ast-parsing/expected/minmax-0.4.17-compact.json
  19. 5
      tests/ast-parsing/expected/minmax-0.4.17-legacy.json
  20. 5
      tests/ast-parsing/expected/minmax-0.4.18-compact.json
  21. 5
      tests/ast-parsing/expected/minmax-0.4.18-legacy.json
  22. 5
      tests/ast-parsing/expected/minmax-0.4.19-compact.json
  23. 5
      tests/ast-parsing/expected/minmax-0.4.19-legacy.json
  24. 5
      tests/ast-parsing/expected/minmax-0.4.2-legacy.json
  25. 5
      tests/ast-parsing/expected/minmax-0.4.20-compact.json
  26. 5
      tests/ast-parsing/expected/minmax-0.4.20-legacy.json
  27. 5
      tests/ast-parsing/expected/minmax-0.4.21-compact.json
  28. 5
      tests/ast-parsing/expected/minmax-0.4.21-legacy.json
  29. 5
      tests/ast-parsing/expected/minmax-0.4.22-compact.json
  30. 5
      tests/ast-parsing/expected/minmax-0.4.22-legacy.json
  31. 5
      tests/ast-parsing/expected/minmax-0.4.23-compact.json
  32. 5
      tests/ast-parsing/expected/minmax-0.4.23-legacy.json
  33. 5
      tests/ast-parsing/expected/minmax-0.4.24-compact.json
  34. 5
      tests/ast-parsing/expected/minmax-0.4.24-legacy.json
  35. 5
      tests/ast-parsing/expected/minmax-0.4.25-compact.json
  36. 5
      tests/ast-parsing/expected/minmax-0.4.25-legacy.json
  37. 5
      tests/ast-parsing/expected/minmax-0.4.26-compact.json
  38. 5
      tests/ast-parsing/expected/minmax-0.4.26-legacy.json
  39. 5
      tests/ast-parsing/expected/minmax-0.4.3-legacy.json
  40. 5
      tests/ast-parsing/expected/minmax-0.4.4-legacy.json
  41. 5
      tests/ast-parsing/expected/minmax-0.4.5-legacy.json
  42. 5
      tests/ast-parsing/expected/minmax-0.4.6-legacy.json
  43. 5
      tests/ast-parsing/expected/minmax-0.4.7-legacy.json
  44. 5
      tests/ast-parsing/expected/minmax-0.4.8-legacy.json
  45. 5
      tests/ast-parsing/expected/minmax-0.4.9-legacy.json
  46. 5
      tests/ast-parsing/expected/minmax-0.5.0-compact.json
  47. 5
      tests/ast-parsing/expected/minmax-0.5.0-legacy.json
  48. 5
      tests/ast-parsing/expected/minmax-0.5.1-compact.json
  49. 5
      tests/ast-parsing/expected/minmax-0.5.1-legacy.json
  50. 5
      tests/ast-parsing/expected/minmax-0.5.10-compact.json
  51. 5
      tests/ast-parsing/expected/minmax-0.5.10-legacy.json
  52. 5
      tests/ast-parsing/expected/minmax-0.5.11-compact.json
  53. 5
      tests/ast-parsing/expected/minmax-0.5.11-legacy.json
  54. 5
      tests/ast-parsing/expected/minmax-0.5.12-compact.json
  55. 5
      tests/ast-parsing/expected/minmax-0.5.12-legacy.json
  56. 5
      tests/ast-parsing/expected/minmax-0.5.13-compact.json
  57. 5
      tests/ast-parsing/expected/minmax-0.5.13-legacy.json
  58. 5
      tests/ast-parsing/expected/minmax-0.5.14-compact.json
  59. 5
      tests/ast-parsing/expected/minmax-0.5.14-legacy.json
  60. 5
      tests/ast-parsing/expected/minmax-0.5.15-compact.json
  61. 5
      tests/ast-parsing/expected/minmax-0.5.15-legacy.json
  62. 5
      tests/ast-parsing/expected/minmax-0.5.16-compact.json
  63. 5
      tests/ast-parsing/expected/minmax-0.5.16-legacy.json
  64. 5
      tests/ast-parsing/expected/minmax-0.5.17-compact.json
  65. 5
      tests/ast-parsing/expected/minmax-0.5.17-legacy.json
  66. 5
      tests/ast-parsing/expected/minmax-0.5.2-compact.json
  67. 5
      tests/ast-parsing/expected/minmax-0.5.2-legacy.json
  68. 5
      tests/ast-parsing/expected/minmax-0.5.3-compact.json
  69. 5
      tests/ast-parsing/expected/minmax-0.5.3-legacy.json
  70. 5
      tests/ast-parsing/expected/minmax-0.5.4-compact.json
  71. 5
      tests/ast-parsing/expected/minmax-0.5.4-legacy.json
  72. 5
      tests/ast-parsing/expected/minmax-0.5.5-compact.json
  73. 5
      tests/ast-parsing/expected/minmax-0.5.5-legacy.json
  74. 5
      tests/ast-parsing/expected/minmax-0.5.6-compact.json
  75. 5
      tests/ast-parsing/expected/minmax-0.5.6-legacy.json
  76. 5
      tests/ast-parsing/expected/minmax-0.5.7-compact.json
  77. 5
      tests/ast-parsing/expected/minmax-0.5.7-legacy.json
  78. 5
      tests/ast-parsing/expected/minmax-0.5.8-compact.json
  79. 5
      tests/ast-parsing/expected/minmax-0.5.8-legacy.json
  80. 5
      tests/ast-parsing/expected/minmax-0.5.9-compact.json
  81. 5
      tests/ast-parsing/expected/minmax-0.5.9-legacy.json
  82. 5
      tests/ast-parsing/expected/minmax-0.6.0-compact.json
  83. 5
      tests/ast-parsing/expected/minmax-0.6.0-legacy.json
  84. 5
      tests/ast-parsing/expected/minmax-0.6.1-compact.json
  85. 5
      tests/ast-parsing/expected/minmax-0.6.1-legacy.json
  86. 5
      tests/ast-parsing/expected/minmax-0.6.10-compact.json
  87. 5
      tests/ast-parsing/expected/minmax-0.6.10-legacy.json
  88. 5
      tests/ast-parsing/expected/minmax-0.6.11-compact.json
  89. 5
      tests/ast-parsing/expected/minmax-0.6.11-legacy.json
  90. 5
      tests/ast-parsing/expected/minmax-0.6.12-compact.json
  91. 5
      tests/ast-parsing/expected/minmax-0.6.12-legacy.json
  92. 5
      tests/ast-parsing/expected/minmax-0.6.2-compact.json
  93. 5
      tests/ast-parsing/expected/minmax-0.6.2-legacy.json
  94. 5
      tests/ast-parsing/expected/minmax-0.6.3-compact.json
  95. 5
      tests/ast-parsing/expected/minmax-0.6.3-legacy.json
  96. 5
      tests/ast-parsing/expected/minmax-0.6.4-compact.json
  97. 5
      tests/ast-parsing/expected/minmax-0.6.4-legacy.json
  98. 5
      tests/ast-parsing/expected/minmax-0.6.5-compact.json
  99. 5
      tests/ast-parsing/expected/minmax-0.6.5-legacy.json
  100. 5
      tests/ast-parsing/expected/minmax-0.6.6-compact.json
  101. Some files were not shown because too many files have changed in this diff Show More

@ -5,6 +5,7 @@ from slither.core.solidity_types.type import Type
# see https://solidity.readthedocs.io/en/v0.4.24/miscellaneous.html?highlight=grammar # see https://solidity.readthedocs.io/en/v0.4.24/miscellaneous.html?highlight=grammar
from slither.exceptions import SlitherException
Int = [ Int = [
"int", "int",
@ -42,6 +43,9 @@ Int = [
"int256", "int256",
] ]
Max_Int = {k: 2 ** (8 * i - 1) - 1 if i > 0 else 2 ** 255 - 1 for i, k in enumerate(Int)}
Min_Int = {k: -(2 ** (8 * i - 1)) if i > 0 else -(2 ** 255) for i, k in enumerate(Int)}
Uint = [ Uint = [
"uint", "uint",
"uint8", "uint8",
@ -78,6 +82,12 @@ Uint = [
"uint256", "uint256",
] ]
Max_Uint = {k: 2 ** (8 * i) - 1 if i > 0 else 2 ** 256 - 1 for i, k in enumerate(Uint)}
Min_Uint = {k: 0 for k in Uint}
MaxValues = dict(Max_Int, **Max_Uint)
MinValues = dict(Min_Int, **Min_Uint)
Byte = [ Byte = [
"byte", "byte",
"bytes", "bytes",
@ -180,6 +190,18 @@ class ElementaryType(Type):
return 32, True return 32, True
return int(self.size / 8), False return int(self.size / 8), False
@property
def min(self) -> int:
if self.name in MinValues:
return MinValues[self.name]
raise SlitherException(f"{self.name} does not have a min value")
@property
def max(self) -> int:
if self.name in MaxValues:
return MaxValues[self.name]
raise SlitherException(f"{self.name} does not have a max value")
def __str__(self): def __str__(self):
return self._type return self._type

@ -455,6 +455,9 @@ def _convert_type_contract(ir, slither):
assignment.lvalue.set_type(ElementaryType("string")) assignment.lvalue.set_type(ElementaryType("string"))
return assignment return assignment
if isinstance(contract, ElementaryType):
print(contract.type)
raise SlithIRError(f"type({contract.name}).{ir.variable_right} is unknown") raise SlithIRError(f"type({contract.name}).{ir.variable_right} is unknown")
@ -1411,6 +1414,12 @@ def remove_unused(result):
if not ins.lvalue.name in to_keep and ins != last_elem: if not ins.lvalue.name in to_keep and ins != last_elem:
to_remove.append(ins) to_remove.append(ins)
removed = True removed = True
# Remove type(X) if X is an elementary type
# This assume that type(X) is only used with min/max
# If Solidity introduces other operation, we might remove this removal
if isinstance(ins, SolidityCall) and ins.function == SolidityFunction("type()"):
if isinstance(ins.arguments[0], ElementaryType):
to_remove.append(ins)
result = [i for i in result if not i in to_remove] result = [i for i in result if not i in to_remove]
return result return result

@ -4,11 +4,15 @@ from slither.core.declarations import (
Function, Function,
SolidityVariable, SolidityVariable,
SolidityVariableComposed, SolidityVariableComposed,
SolidityFunction,
) )
from slither.core.expressions import ( from slither.core.expressions import (
AssignmentOperationType, AssignmentOperationType,
UnaryOperationType, UnaryOperationType,
BinaryOperationType, BinaryOperationType,
ElementaryTypeNameExpression,
CallExpression,
Identifier,
) )
from slither.core.solidity_types import ArrayType, ElementaryType from slither.core.solidity_types import ArrayType, ElementaryType
from slither.core.solidity_types.type import Type from slither.core.solidity_types.type import Type
@ -350,6 +354,29 @@ class ExpressionToSlithIR(ExpressionVisitor):
def _post_member_access(self, expression): def _post_member_access(self, expression):
expr = get(expression.expression) expr = get(expression.expression)
# Look for type(X).max / min
# Because we looked at the AST structure, we need to look into the nested expression
# Hopefully this is always on a direct sub field, and there is no weird construction
if isinstance(expression.expression, CallExpression) and expression.member_name in [
"min",
"max",
]:
if isinstance(expression.expression.called, Identifier):
if expression.expression.called.value == SolidityFunction("type()"):
assert len(expression.expression.arguments) == 1
val = TemporaryVariable(self._node)
type_expression_found = expression.expression.arguments[0]
assert isinstance(type_expression_found, ElementaryTypeNameExpression)
type_found = type_expression_found.type
if expression.member_name == "min:":
op = Assignment(val, Constant(str(type_found.min), type_found), type_found,)
else:
op = Assignment(val, Constant(str(type_found.max), type_found), type_found,)
self._result.append(op)
set_val(expression, val)
return
val = ReferenceVariable(self._node) val = ReferenceVariable(self._node)
member = Member(expr, Constant(expression.member_name), val) member = Member(expr, Constant(expression.member_name), val)
member.set_expression(expression) member.set_expression(expression)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Loading…
Cancel
Save