From e42002e1d74840e82f4ff4456b8eb383ac34e67b Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 17 Jul 2025 11:08:56 +0100 Subject: [PATCH 01/49] Promote IncorrectExceptOrder. However, we lose some results due to not considering builtin/stdlib types. --- .../src/Exceptions/IncorrectExceptOrder.qhelp | 8 +++--- .../ql/src/Exceptions/IncorrectExceptOrder.ql | 25 +++++++++++-------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/python/ql/src/Exceptions/IncorrectExceptOrder.qhelp b/python/ql/src/Exceptions/IncorrectExceptOrder.qhelp index d2854af6ca6..9d78350bcd2 100644 --- a/python/ql/src/Exceptions/IncorrectExceptOrder.qhelp +++ b/python/ql/src/Exceptions/IncorrectExceptOrder.qhelp @@ -25,11 +25,11 @@ is a super class of Error.

Reorganize the except blocks so that the more specific except is defined first. Alternatively, if the more specific except block is -no longer required then it should be deleted.

+no longer required, then it should be deleted.

-

In this example the except Exception: will handle AttributeError preventing the +

In the following example, the except Exception: will handle AttributeError preventing the subsequent handler from ever executing.

@@ -37,8 +37,8 @@ subsequent handler from ever executing.

-
  • Python Language Reference: The try statement, -Exceptions.
  • +
  • Python Language Reference: The try statement, +Exceptions.
  • diff --git a/python/ql/src/Exceptions/IncorrectExceptOrder.ql b/python/ql/src/Exceptions/IncorrectExceptOrder.ql index 3c0c90b36d3..6838a9bc2ae 100644 --- a/python/ql/src/Exceptions/IncorrectExceptOrder.ql +++ b/python/ql/src/Exceptions/IncorrectExceptOrder.ql @@ -14,22 +14,27 @@ */ import python +import semmle.python.dataflow.new.internal.DataFlowDispatch -predicate incorrect_except_order(ExceptStmt ex1, ClassValue cls1, ExceptStmt ex2, ClassValue cls2) { +predicate incorrectExceptOrder(ExceptStmt ex1, Class cls1, ExceptStmt ex2, Class cls2) { exists(int i, int j, Try t | ex1 = t.getHandler(i) and ex2 = t.getHandler(j) and i < j and - cls1 = except_class(ex1) and - cls2 = except_class(ex2) and - cls1 = cls2.getASuperType() + cls1 = exceptClass(ex1) and + cls2 = exceptClass(ex2) and + cls1 = getADirectSuperclass*(cls2) ) } -ClassValue except_class(ExceptStmt ex) { ex.getType().pointsTo(result) } +Class exceptClass(ExceptStmt ex) { ex.getType() = classTracker(result).asExpr() } -from ExceptStmt ex1, ClassValue cls1, ExceptStmt ex2, ClassValue cls2 -where incorrect_except_order(ex1, cls1, ex2, cls2) -select ex2, - "Except block for $@ is unreachable; the more general $@ for $@ will always be executed in preference.", - cls2, cls2.getName(), ex1, "except block", cls1, cls1.getName() +from ExceptStmt ex1, Class cls1, ExceptStmt ex2, Class cls2, string msg +where + incorrectExceptOrder(ex1, cls1, ex2, cls2) and + if cls1 = cls2 + then msg = "This except block handling $@ is unreachable; as $@ also handles $@." + else + msg = + "This except block handling $@ is unreachable; as $@ for the more general $@ always subsumes it." +select ex2, msg, cls2, cls2.getName(), ex1, "this except block", cls1, cls1.getName() From f24f7d5146032f8d611eed53b23f688c2511dc5d Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 21 Aug 2025 13:50:26 +0100 Subject: [PATCH 02/49] Add builtin subclass models, incorporate into query --- .../python/frameworks/builtins.model.yml | 249 ++++++++++++++++++ .../ql/src/Exceptions/IncorrectExceptOrder.ql | 76 +++++- 2 files changed, 321 insertions(+), 4 deletions(-) create mode 100644 python/ql/lib/semmle/python/frameworks/builtins.model.yml diff --git a/python/ql/lib/semmle/python/frameworks/builtins.model.yml b/python/ql/lib/semmle/python/frameworks/builtins.model.yml new file mode 100644 index 00000000000..9789b547903 --- /dev/null +++ b/python/ql/lib/semmle/python/frameworks/builtins.model.yml @@ -0,0 +1,249 @@ +extensions: + - addsTo: + pack: codeql/python-all + extensible: typeModel + data: + - ['builtins.PendingDeprecationWarning~Subclass', 'builtins.PendingDeprecationWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.PendingDeprecationWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.PendingDeprecationWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.PendingDeprecationWarning', ''] + - ['builtins.UnicodeWarning~Subclass', 'builtins.UnicodeWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.UnicodeWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.UnicodeWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.UnicodeWarning', ''] + - ['builtins.StopAsyncIteration~Subclass', 'builtins.StopAsyncIteration', ''] + - ['builtins.Exception~Subclass', 'builtins.StopAsyncIteration', ''] + - ['builtins.BaseException~Subclass', 'builtins.StopAsyncIteration', ''] + - ['builtins.KeyboardInterrupt~Subclass', 'builtins.KeyboardInterrupt', ''] + - ['builtins.BaseException~Subclass', 'builtins.KeyboardInterrupt', ''] + - ['builtins.ConnectionError~Subclass', 'builtins.ConnectionError', ''] + - ['builtins.OSError~Subclass', 'builtins.ConnectionError', ''] + - ['builtins.Exception~Subclass', 'builtins.ConnectionError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ConnectionError', ''] + - ['builtins.ConnectionResetError~Subclass', 'builtins.ConnectionResetError', ''] + - ['builtins.ConnectionError~Subclass', 'builtins.ConnectionResetError', ''] + - ['builtins.OSError~Subclass', 'builtins.ConnectionResetError', ''] + - ['builtins.Exception~Subclass', 'builtins.ConnectionResetError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ConnectionResetError', ''] + - ['builtins.InterruptedError~Subclass', 'builtins.InterruptedError', ''] + - ['builtins.OSError~Subclass', 'builtins.InterruptedError', ''] + - ['builtins.Exception~Subclass', 'builtins.InterruptedError', ''] + - ['builtins.BaseException~Subclass', 'builtins.InterruptedError', ''] + - ['builtins.RuntimeError~Subclass', 'builtins.RuntimeError', ''] + - ['builtins.Exception~Subclass', 'builtins.RuntimeError', ''] + - ['builtins.BaseException~Subclass', 'builtins.RuntimeError', ''] + - ['builtins.AttributeError~Subclass', 'builtins.AttributeError', ''] + - ['builtins.Exception~Subclass', 'builtins.AttributeError', ''] + - ['builtins.BaseException~Subclass', 'builtins.AttributeError', ''] + - ['builtins.IndexError~Subclass', 'builtins.IndexError', ''] + - ['builtins.LookupError~Subclass', 'builtins.IndexError', ''] + - ['builtins.Exception~Subclass', 'builtins.IndexError', ''] + - ['builtins.BaseException~Subclass', 'builtins.IndexError', ''] + - ['builtins.UnicodeDecodeError~Subclass', 'builtins.UnicodeDecodeError', ''] + - ['builtins.UnicodeError~Subclass', 'builtins.UnicodeDecodeError', ''] + - ['builtins.ValueError~Subclass', 'builtins.UnicodeDecodeError', ''] + - ['builtins.Exception~Subclass', 'builtins.UnicodeDecodeError', ''] + - ['builtins.BaseException~Subclass', 'builtins.UnicodeDecodeError', ''] + - ['builtins.OverflowError~Subclass', 'builtins.OverflowError', ''] + - ['builtins.ArithmeticError~Subclass', 'builtins.OverflowError', ''] + - ['builtins.Exception~Subclass', 'builtins.OverflowError', ''] + - ['builtins.BaseException~Subclass', 'builtins.OverflowError', ''] + - ['builtins.BufferError~Subclass', 'builtins.BufferError', ''] + - ['builtins.Exception~Subclass', 'builtins.BufferError', ''] + - ['builtins.BaseException~Subclass', 'builtins.BufferError', ''] + - ['builtins.SyntaxWarning~Subclass', 'builtins.SyntaxWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.SyntaxWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.SyntaxWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.SyntaxWarning', ''] + - ['builtins.BytesWarning~Subclass', 'builtins.BytesWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.BytesWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.BytesWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.BytesWarning', ''] + - ['builtins.StopIteration~Subclass', 'builtins.StopIteration', ''] + - ['builtins.Exception~Subclass', 'builtins.StopIteration', ''] + - ['builtins.BaseException~Subclass', 'builtins.StopIteration', ''] + - ['builtins.ImportError~Subclass', 'builtins.ImportError', ''] + - ['builtins.Exception~Subclass', 'builtins.ImportError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ImportError', ''] + - ['builtins.ChildProcessError~Subclass', 'builtins.ChildProcessError', ''] + - ['builtins.OSError~Subclass', 'builtins.ChildProcessError', ''] + - ['builtins.Exception~Subclass', 'builtins.ChildProcessError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ChildProcessError', ''] + - ['builtins.FileExistsError~Subclass', 'builtins.FileExistsError', ''] + - ['builtins.OSError~Subclass', 'builtins.FileExistsError', ''] + - ['builtins.Exception~Subclass', 'builtins.FileExistsError', ''] + - ['builtins.BaseException~Subclass', 'builtins.FileExistsError', ''] + - ['builtins.PermissionError~Subclass', 'builtins.PermissionError', ''] + - ['builtins.OSError~Subclass', 'builtins.PermissionError', ''] + - ['builtins.Exception~Subclass', 'builtins.PermissionError', ''] + - ['builtins.BaseException~Subclass', 'builtins.PermissionError', ''] + - ['builtins.RecursionError~Subclass', 'builtins.RecursionError', ''] + - ['builtins.RuntimeError~Subclass', 'builtins.RecursionError', ''] + - ['builtins.Exception~Subclass', 'builtins.RecursionError', ''] + - ['builtins.BaseException~Subclass', 'builtins.RecursionError', ''] + - ['builtins.SyntaxError~Subclass', 'builtins.SyntaxError', ''] + - ['builtins.Exception~Subclass', 'builtins.SyntaxError', ''] + - ['builtins.BaseException~Subclass', 'builtins.SyntaxError', ''] + - ['builtins.ExceptionGroup~Subclass', 'builtins.ExceptionGroup', ''] + - ['builtins.BaseExceptionGroup~Subclass', 'builtins.ExceptionGroup', ''] + - ['builtins.Exception~Subclass', 'builtins.ExceptionGroup', ''] + - ['builtins.BaseException~Subclass', 'builtins.ExceptionGroup', ''] + - ['builtins.KeyError~Subclass', 'builtins.KeyError', ''] + - ['builtins.LookupError~Subclass', 'builtins.KeyError', ''] + - ['builtins.Exception~Subclass', 'builtins.KeyError', ''] + - ['builtins.BaseException~Subclass', 'builtins.KeyError', ''] + - ['builtins.UnicodeTranslateError~Subclass', 'builtins.UnicodeTranslateError', ''] + - ['builtins.UnicodeError~Subclass', 'builtins.UnicodeTranslateError', ''] + - ['builtins.ValueError~Subclass', 'builtins.UnicodeTranslateError', ''] + - ['builtins.Exception~Subclass', 'builtins.UnicodeTranslateError', ''] + - ['builtins.BaseException~Subclass', 'builtins.UnicodeTranslateError', ''] + - ['builtins.ZeroDivisionError~Subclass', 'builtins.ZeroDivisionError', ''] + - ['builtins.ArithmeticError~Subclass', 'builtins.ZeroDivisionError', ''] + - ['builtins.Exception~Subclass', 'builtins.ZeroDivisionError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ZeroDivisionError', ''] + - ['builtins.Warning~Subclass', 'builtins.Warning', ''] + - ['builtins.Exception~Subclass', 'builtins.Warning', ''] + - ['builtins.BaseException~Subclass', 'builtins.Warning', ''] + - ['builtins.RuntimeWarning~Subclass', 'builtins.RuntimeWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.RuntimeWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.RuntimeWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.RuntimeWarning', ''] + - ['builtins.EncodingWarning~Subclass', 'builtins.EncodingWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.EncodingWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.EncodingWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.EncodingWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.BaseException', ''] + - ['builtins.GeneratorExit~Subclass', 'builtins.GeneratorExit', ''] + - ['builtins.BaseException~Subclass', 'builtins.GeneratorExit', ''] + - ['builtins.ModuleNotFoundError~Subclass', 'builtins.ModuleNotFoundError', ''] + - ['builtins.ImportError~Subclass', 'builtins.ModuleNotFoundError', ''] + - ['builtins.Exception~Subclass', 'builtins.ModuleNotFoundError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ModuleNotFoundError', ''] + - ['builtins.BrokenPipeError~Subclass', 'builtins.BrokenPipeError', ''] + - ['builtins.ConnectionError~Subclass', 'builtins.BrokenPipeError', ''] + - ['builtins.OSError~Subclass', 'builtins.BrokenPipeError', ''] + - ['builtins.Exception~Subclass', 'builtins.BrokenPipeError', ''] + - ['builtins.BaseException~Subclass', 'builtins.BrokenPipeError', ''] + - ['builtins.FileNotFoundError~Subclass', 'builtins.FileNotFoundError', ''] + - ['builtins.OSError~Subclass', 'builtins.FileNotFoundError', ''] + - ['builtins.Exception~Subclass', 'builtins.FileNotFoundError', ''] + - ['builtins.BaseException~Subclass', 'builtins.FileNotFoundError', ''] + - ['builtins.ProcessLookupError~Subclass', 'builtins.ProcessLookupError', ''] + - ['builtins.OSError~Subclass', 'builtins.ProcessLookupError', ''] + - ['builtins.Exception~Subclass', 'builtins.ProcessLookupError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ProcessLookupError', ''] + - ['builtins.NotImplementedError~Subclass', 'builtins.NotImplementedError', ''] + - ['builtins.RuntimeError~Subclass', 'builtins.NotImplementedError', ''] + - ['builtins.Exception~Subclass', 'builtins.NotImplementedError', ''] + - ['builtins.BaseException~Subclass', 'builtins.NotImplementedError', ''] + - ['builtins.IndentationError~Subclass', 'builtins.IndentationError', ''] + - ['builtins.SyntaxError~Subclass', 'builtins.IndentationError', ''] + - ['builtins.Exception~Subclass', 'builtins.IndentationError', ''] + - ['builtins.BaseException~Subclass', 'builtins.IndentationError', ''] + - ['builtins.ValueError~Subclass', 'builtins.ValueError', ''] + - ['builtins.Exception~Subclass', 'builtins.ValueError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ValueError', ''] + - ['builtins.AssertionError~Subclass', 'builtins.AssertionError', ''] + - ['builtins.Exception~Subclass', 'builtins.AssertionError', ''] + - ['builtins.BaseException~Subclass', 'builtins.AssertionError', ''] + - ['builtins.SystemError~Subclass', 'builtins.SystemError', ''] + - ['builtins.Exception~Subclass', 'builtins.SystemError', ''] + - ['builtins.BaseException~Subclass', 'builtins.SystemError', ''] + - ['builtins.UserWarning~Subclass', 'builtins.UserWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.UserWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.UserWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.UserWarning', ''] + - ['builtins.FutureWarning~Subclass', 'builtins.FutureWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.FutureWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.FutureWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.FutureWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.Exception', ''] + - ['builtins.BaseException~Subclass', 'builtins.Exception', ''] + - ['builtins.ResourceWarning~Subclass', 'builtins.ResourceWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.ResourceWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.ResourceWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.ResourceWarning', ''] + - ['builtins.SystemExit~Subclass', 'builtins.SystemExit', ''] + - ['builtins.BaseException~Subclass', 'builtins.SystemExit', ''] + - ['builtins.OSError~Subclass', 'builtins.OSError', ''] + - ['builtins.Exception~Subclass', 'builtins.OSError', ''] + - ['builtins.BaseException~Subclass', 'builtins.OSError', ''] + - ['builtins.ConnectionAbortedError~Subclass', 'builtins.ConnectionAbortedError', ''] + - ['builtins.ConnectionError~Subclass', 'builtins.ConnectionAbortedError', ''] + - ['builtins.OSError~Subclass', 'builtins.ConnectionAbortedError', ''] + - ['builtins.Exception~Subclass', 'builtins.ConnectionAbortedError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ConnectionAbortedError', ''] + - ['builtins.IsADirectoryError~Subclass', 'builtins.IsADirectoryError', ''] + - ['builtins.OSError~Subclass', 'builtins.IsADirectoryError', ''] + - ['builtins.Exception~Subclass', 'builtins.IsADirectoryError', ''] + - ['builtins.BaseException~Subclass', 'builtins.IsADirectoryError', ''] + - ['builtins.TimeoutError~Subclass', 'builtins.TimeoutError', ''] + - ['builtins.OSError~Subclass', 'builtins.TimeoutError', ''] + - ['builtins.Exception~Subclass', 'builtins.TimeoutError', ''] + - ['builtins.BaseException~Subclass', 'builtins.TimeoutError', ''] + - ['builtins.NameError~Subclass', 'builtins.NameError', ''] + - ['builtins.Exception~Subclass', 'builtins.NameError', ''] + - ['builtins.BaseException~Subclass', 'builtins.NameError', ''] + - ['builtins.TabError~Subclass', 'builtins.TabError', ''] + - ['builtins.IndentationError~Subclass', 'builtins.TabError', ''] + - ['builtins.SyntaxError~Subclass', 'builtins.TabError', ''] + - ['builtins.Exception~Subclass', 'builtins.TabError', ''] + - ['builtins.BaseException~Subclass', 'builtins.TabError', ''] + - ['builtins.UnicodeError~Subclass', 'builtins.UnicodeError', ''] + - ['builtins.ValueError~Subclass', 'builtins.UnicodeError', ''] + - ['builtins.Exception~Subclass', 'builtins.UnicodeError', ''] + - ['builtins.BaseException~Subclass', 'builtins.UnicodeError', ''] + - ['builtins.ArithmeticError~Subclass', 'builtins.ArithmeticError', ''] + - ['builtins.Exception~Subclass', 'builtins.ArithmeticError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ArithmeticError', ''] + - ['builtins.ReferenceError~Subclass', 'builtins.ReferenceError', ''] + - ['builtins.Exception~Subclass', 'builtins.ReferenceError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ReferenceError', ''] + - ['builtins.DeprecationWarning~Subclass', 'builtins.DeprecationWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.DeprecationWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.DeprecationWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.DeprecationWarning', ''] + - ['builtins.ImportWarning~Subclass', 'builtins.ImportWarning', ''] + - ['builtins.Warning~Subclass', 'builtins.ImportWarning', ''] + - ['builtins.Exception~Subclass', 'builtins.ImportWarning', ''] + - ['builtins.BaseException~Subclass', 'builtins.ImportWarning', ''] + - ['builtins.TypeError~Subclass', 'builtins.TypeError', ''] + - ['builtins.Exception~Subclass', 'builtins.TypeError', ''] + - ['builtins.BaseException~Subclass', 'builtins.TypeError', ''] + - ['builtins.BaseExceptionGroup~Subclass', 'builtins.BaseExceptionGroup', ''] + - ['builtins.BaseException~Subclass', 'builtins.BaseExceptionGroup', ''] + - ['builtins.BlockingIOError~Subclass', 'builtins.BlockingIOError', ''] + - ['builtins.OSError~Subclass', 'builtins.BlockingIOError', ''] + - ['builtins.Exception~Subclass', 'builtins.BlockingIOError', ''] + - ['builtins.BaseException~Subclass', 'builtins.BlockingIOError', ''] + - ['builtins.ConnectionRefusedError~Subclass', 'builtins.ConnectionRefusedError', ''] + - ['builtins.ConnectionError~Subclass', 'builtins.ConnectionRefusedError', ''] + - ['builtins.OSError~Subclass', 'builtins.ConnectionRefusedError', ''] + - ['builtins.Exception~Subclass', 'builtins.ConnectionRefusedError', ''] + - ['builtins.BaseException~Subclass', 'builtins.ConnectionRefusedError', ''] + - ['builtins.NotADirectoryError~Subclass', 'builtins.NotADirectoryError', ''] + - ['builtins.OSError~Subclass', 'builtins.NotADirectoryError', ''] + - ['builtins.Exception~Subclass', 'builtins.NotADirectoryError', ''] + - ['builtins.BaseException~Subclass', 'builtins.NotADirectoryError', ''] + - ['builtins.EOFError~Subclass', 'builtins.EOFError', ''] + - ['builtins.Exception~Subclass', 'builtins.EOFError', ''] + - ['builtins.BaseException~Subclass', 'builtins.EOFError', ''] + - ['builtins.UnboundLocalError~Subclass', 'builtins.UnboundLocalError', ''] + - ['builtins.NameError~Subclass', 'builtins.UnboundLocalError', ''] + - ['builtins.Exception~Subclass', 'builtins.UnboundLocalError', ''] + - ['builtins.BaseException~Subclass', 'builtins.UnboundLocalError', ''] + - ['builtins.LookupError~Subclass', 'builtins.LookupError', ''] + - ['builtins.Exception~Subclass', 'builtins.LookupError', ''] + - ['builtins.BaseException~Subclass', 'builtins.LookupError', ''] + - ['builtins.UnicodeEncodeError~Subclass', 'builtins.UnicodeEncodeError', ''] + - ['builtins.UnicodeError~Subclass', 'builtins.UnicodeEncodeError', ''] + - ['builtins.ValueError~Subclass', 'builtins.UnicodeEncodeError', ''] + - ['builtins.Exception~Subclass', 'builtins.UnicodeEncodeError', ''] + - ['builtins.BaseException~Subclass', 'builtins.UnicodeEncodeError', ''] + - ['builtins.FloatingPointError~Subclass', 'builtins.FloatingPointError', ''] + - ['builtins.ArithmeticError~Subclass', 'builtins.FloatingPointError', ''] + - ['builtins.Exception~Subclass', 'builtins.FloatingPointError', ''] + - ['builtins.BaseException~Subclass', 'builtins.FloatingPointError', ''] + - ['builtins.MemoryError~Subclass', 'builtins.MemoryError', ''] + - ['builtins.Exception~Subclass', 'builtins.MemoryError', ''] + - ['builtins.BaseException~Subclass', 'builtins.MemoryError', ''] \ No newline at end of file diff --git a/python/ql/src/Exceptions/IncorrectExceptOrder.ql b/python/ql/src/Exceptions/IncorrectExceptOrder.ql index 6838a9bc2ae..5637c9e3b61 100644 --- a/python/ql/src/Exceptions/IncorrectExceptOrder.ql +++ b/python/ql/src/Exceptions/IncorrectExceptOrder.ql @@ -15,21 +15,89 @@ import python import semmle.python.dataflow.new.internal.DataFlowDispatch +import semmle.python.ApiGraphs +import semmle.python.frameworks.data.internal.ApiGraphModels -predicate incorrectExceptOrder(ExceptStmt ex1, Class cls1, ExceptStmt ex2, Class cls2) { +predicate builtinException(string name) { + typeModel("builtins.BaseException~Subclass", "builtins." + name, "") +} + +predicate builtinExceptionSubclass(string base, string sub) { + typeModel("builtins." + base + "~Subclass", sub, "") +} + +newtype TExceptType = + TClass(Class c) or + TBuiltin(string name) { builtinException(name) } + +class ExceptType extends TExceptType { + Class asClass() { this = TClass(result) } + + string asBuiltinName() { this = TBuiltin(result) } + + predicate isBuiltin() { this = TBuiltin(_) } + + string getName() { + result = this.asClass().getName() + or + result = this.asBuiltinName() + } + + string toString() { result = this.getName() } + + DataFlow::Node getAUse() { + result = classTracker(this.asClass()) + or + result = API::builtin(this.asBuiltinName()).asSource() + } + + ExceptType getADirectSuperclass() { + result.asClass() = getADirectSuperclass(this.asClass()) + or + result.isBuiltin() and + result.getAUse().asExpr() = this.asClass().getABase() + or + builtinExceptionSubclass(result.asBuiltinName(), this.asBuiltinName()) and + this != result + } + + /** + * Holds if this element is at the specified location. + * The location spans column `startColumn` of line `startLine` to + * column `endColumn` of line `endLine` in file `filepath`. + * For more information, see + * [Providing locations in CodeQL queries](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/). + */ + predicate hasLocationInfo( + string filePath, int startLine, int startColumn, int endLine, int endColumn + ) { + this.asClass() + .getLocation() + .hasLocationInfo(filePath, startLine, startColumn, endLine, endColumn) + or + this.isBuiltin() and + filePath = "" and + startLine = 0 and + startColumn = 0 and + endLine = 0 and + endColumn = 0 + } +} + +predicate incorrectExceptOrder(ExceptStmt ex1, ExceptType cls1, ExceptStmt ex2, ExceptType cls2) { exists(int i, int j, Try t | ex1 = t.getHandler(i) and ex2 = t.getHandler(j) and i < j and cls1 = exceptClass(ex1) and cls2 = exceptClass(ex2) and - cls1 = getADirectSuperclass*(cls2) + cls1 = cls2.getADirectSuperclass*() ) } -Class exceptClass(ExceptStmt ex) { ex.getType() = classTracker(result).asExpr() } +ExceptType exceptClass(ExceptStmt ex) { ex.getType() = result.getAUse().asExpr() } -from ExceptStmt ex1, Class cls1, ExceptStmt ex2, Class cls2, string msg +from ExceptStmt ex1, ExceptType cls1, ExceptStmt ex2, ExceptType cls2, string msg where incorrectExceptOrder(ex1, cls1, ex2, cls2) and if cls1 = cls2 From 9edfd7a6fbbbc66ca609e2de1007306a9034c0b8 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Thu, 21 Aug 2025 14:01:24 +0100 Subject: [PATCH 03/49] Use generator script directly --- .../python/frameworks/builtins.model.yml | 985 +++++++++++++----- .../process-builtin-exceptions.py | 31 + 2 files changed, 768 insertions(+), 248 deletions(-) create mode 100644 python/ql/src/meta/ClassHierarchy/process-builtin-exceptions.py diff --git a/python/ql/lib/semmle/python/frameworks/builtins.model.yml b/python/ql/lib/semmle/python/frameworks/builtins.model.yml index 9789b547903..da976cb40bb 100644 --- a/python/ql/lib/semmle/python/frameworks/builtins.model.yml +++ b/python/ql/lib/semmle/python/frameworks/builtins.model.yml @@ -1,249 +1,738 @@ +# process-builtin-exceptions 0.0.1; Python 3.11.0rc2 extensions: - - addsTo: - pack: codeql/python-all - extensible: typeModel - data: - - ['builtins.PendingDeprecationWarning~Subclass', 'builtins.PendingDeprecationWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.PendingDeprecationWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.PendingDeprecationWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.PendingDeprecationWarning', ''] - - ['builtins.UnicodeWarning~Subclass', 'builtins.UnicodeWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.UnicodeWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.UnicodeWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.UnicodeWarning', ''] - - ['builtins.StopAsyncIteration~Subclass', 'builtins.StopAsyncIteration', ''] - - ['builtins.Exception~Subclass', 'builtins.StopAsyncIteration', ''] - - ['builtins.BaseException~Subclass', 'builtins.StopAsyncIteration', ''] - - ['builtins.KeyboardInterrupt~Subclass', 'builtins.KeyboardInterrupt', ''] - - ['builtins.BaseException~Subclass', 'builtins.KeyboardInterrupt', ''] - - ['builtins.ConnectionError~Subclass', 'builtins.ConnectionError', ''] - - ['builtins.OSError~Subclass', 'builtins.ConnectionError', ''] - - ['builtins.Exception~Subclass', 'builtins.ConnectionError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ConnectionError', ''] - - ['builtins.ConnectionResetError~Subclass', 'builtins.ConnectionResetError', ''] - - ['builtins.ConnectionError~Subclass', 'builtins.ConnectionResetError', ''] - - ['builtins.OSError~Subclass', 'builtins.ConnectionResetError', ''] - - ['builtins.Exception~Subclass', 'builtins.ConnectionResetError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ConnectionResetError', ''] - - ['builtins.InterruptedError~Subclass', 'builtins.InterruptedError', ''] - - ['builtins.OSError~Subclass', 'builtins.InterruptedError', ''] - - ['builtins.Exception~Subclass', 'builtins.InterruptedError', ''] - - ['builtins.BaseException~Subclass', 'builtins.InterruptedError', ''] - - ['builtins.RuntimeError~Subclass', 'builtins.RuntimeError', ''] - - ['builtins.Exception~Subclass', 'builtins.RuntimeError', ''] - - ['builtins.BaseException~Subclass', 'builtins.RuntimeError', ''] - - ['builtins.AttributeError~Subclass', 'builtins.AttributeError', ''] - - ['builtins.Exception~Subclass', 'builtins.AttributeError', ''] - - ['builtins.BaseException~Subclass', 'builtins.AttributeError', ''] - - ['builtins.IndexError~Subclass', 'builtins.IndexError', ''] - - ['builtins.LookupError~Subclass', 'builtins.IndexError', ''] - - ['builtins.Exception~Subclass', 'builtins.IndexError', ''] - - ['builtins.BaseException~Subclass', 'builtins.IndexError', ''] - - ['builtins.UnicodeDecodeError~Subclass', 'builtins.UnicodeDecodeError', ''] - - ['builtins.UnicodeError~Subclass', 'builtins.UnicodeDecodeError', ''] - - ['builtins.ValueError~Subclass', 'builtins.UnicodeDecodeError', ''] - - ['builtins.Exception~Subclass', 'builtins.UnicodeDecodeError', ''] - - ['builtins.BaseException~Subclass', 'builtins.UnicodeDecodeError', ''] - - ['builtins.OverflowError~Subclass', 'builtins.OverflowError', ''] - - ['builtins.ArithmeticError~Subclass', 'builtins.OverflowError', ''] - - ['builtins.Exception~Subclass', 'builtins.OverflowError', ''] - - ['builtins.BaseException~Subclass', 'builtins.OverflowError', ''] - - ['builtins.BufferError~Subclass', 'builtins.BufferError', ''] - - ['builtins.Exception~Subclass', 'builtins.BufferError', ''] - - ['builtins.BaseException~Subclass', 'builtins.BufferError', ''] - - ['builtins.SyntaxWarning~Subclass', 'builtins.SyntaxWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.SyntaxWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.SyntaxWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.SyntaxWarning', ''] - - ['builtins.BytesWarning~Subclass', 'builtins.BytesWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.BytesWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.BytesWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.BytesWarning', ''] - - ['builtins.StopIteration~Subclass', 'builtins.StopIteration', ''] - - ['builtins.Exception~Subclass', 'builtins.StopIteration', ''] - - ['builtins.BaseException~Subclass', 'builtins.StopIteration', ''] - - ['builtins.ImportError~Subclass', 'builtins.ImportError', ''] - - ['builtins.Exception~Subclass', 'builtins.ImportError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ImportError', ''] - - ['builtins.ChildProcessError~Subclass', 'builtins.ChildProcessError', ''] - - ['builtins.OSError~Subclass', 'builtins.ChildProcessError', ''] - - ['builtins.Exception~Subclass', 'builtins.ChildProcessError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ChildProcessError', ''] - - ['builtins.FileExistsError~Subclass', 'builtins.FileExistsError', ''] - - ['builtins.OSError~Subclass', 'builtins.FileExistsError', ''] - - ['builtins.Exception~Subclass', 'builtins.FileExistsError', ''] - - ['builtins.BaseException~Subclass', 'builtins.FileExistsError', ''] - - ['builtins.PermissionError~Subclass', 'builtins.PermissionError', ''] - - ['builtins.OSError~Subclass', 'builtins.PermissionError', ''] - - ['builtins.Exception~Subclass', 'builtins.PermissionError', ''] - - ['builtins.BaseException~Subclass', 'builtins.PermissionError', ''] - - ['builtins.RecursionError~Subclass', 'builtins.RecursionError', ''] - - ['builtins.RuntimeError~Subclass', 'builtins.RecursionError', ''] - - ['builtins.Exception~Subclass', 'builtins.RecursionError', ''] - - ['builtins.BaseException~Subclass', 'builtins.RecursionError', ''] - - ['builtins.SyntaxError~Subclass', 'builtins.SyntaxError', ''] - - ['builtins.Exception~Subclass', 'builtins.SyntaxError', ''] - - ['builtins.BaseException~Subclass', 'builtins.SyntaxError', ''] - - ['builtins.ExceptionGroup~Subclass', 'builtins.ExceptionGroup', ''] - - ['builtins.BaseExceptionGroup~Subclass', 'builtins.ExceptionGroup', ''] - - ['builtins.Exception~Subclass', 'builtins.ExceptionGroup', ''] - - ['builtins.BaseException~Subclass', 'builtins.ExceptionGroup', ''] - - ['builtins.KeyError~Subclass', 'builtins.KeyError', ''] - - ['builtins.LookupError~Subclass', 'builtins.KeyError', ''] - - ['builtins.Exception~Subclass', 'builtins.KeyError', ''] - - ['builtins.BaseException~Subclass', 'builtins.KeyError', ''] - - ['builtins.UnicodeTranslateError~Subclass', 'builtins.UnicodeTranslateError', ''] - - ['builtins.UnicodeError~Subclass', 'builtins.UnicodeTranslateError', ''] - - ['builtins.ValueError~Subclass', 'builtins.UnicodeTranslateError', ''] - - ['builtins.Exception~Subclass', 'builtins.UnicodeTranslateError', ''] - - ['builtins.BaseException~Subclass', 'builtins.UnicodeTranslateError', ''] - - ['builtins.ZeroDivisionError~Subclass', 'builtins.ZeroDivisionError', ''] - - ['builtins.ArithmeticError~Subclass', 'builtins.ZeroDivisionError', ''] - - ['builtins.Exception~Subclass', 'builtins.ZeroDivisionError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ZeroDivisionError', ''] - - ['builtins.Warning~Subclass', 'builtins.Warning', ''] - - ['builtins.Exception~Subclass', 'builtins.Warning', ''] - - ['builtins.BaseException~Subclass', 'builtins.Warning', ''] - - ['builtins.RuntimeWarning~Subclass', 'builtins.RuntimeWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.RuntimeWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.RuntimeWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.RuntimeWarning', ''] - - ['builtins.EncodingWarning~Subclass', 'builtins.EncodingWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.EncodingWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.EncodingWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.EncodingWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.BaseException', ''] - - ['builtins.GeneratorExit~Subclass', 'builtins.GeneratorExit', ''] - - ['builtins.BaseException~Subclass', 'builtins.GeneratorExit', ''] - - ['builtins.ModuleNotFoundError~Subclass', 'builtins.ModuleNotFoundError', ''] - - ['builtins.ImportError~Subclass', 'builtins.ModuleNotFoundError', ''] - - ['builtins.Exception~Subclass', 'builtins.ModuleNotFoundError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ModuleNotFoundError', ''] - - ['builtins.BrokenPipeError~Subclass', 'builtins.BrokenPipeError', ''] - - ['builtins.ConnectionError~Subclass', 'builtins.BrokenPipeError', ''] - - ['builtins.OSError~Subclass', 'builtins.BrokenPipeError', ''] - - ['builtins.Exception~Subclass', 'builtins.BrokenPipeError', ''] - - ['builtins.BaseException~Subclass', 'builtins.BrokenPipeError', ''] - - ['builtins.FileNotFoundError~Subclass', 'builtins.FileNotFoundError', ''] - - ['builtins.OSError~Subclass', 'builtins.FileNotFoundError', ''] - - ['builtins.Exception~Subclass', 'builtins.FileNotFoundError', ''] - - ['builtins.BaseException~Subclass', 'builtins.FileNotFoundError', ''] - - ['builtins.ProcessLookupError~Subclass', 'builtins.ProcessLookupError', ''] - - ['builtins.OSError~Subclass', 'builtins.ProcessLookupError', ''] - - ['builtins.Exception~Subclass', 'builtins.ProcessLookupError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ProcessLookupError', ''] - - ['builtins.NotImplementedError~Subclass', 'builtins.NotImplementedError', ''] - - ['builtins.RuntimeError~Subclass', 'builtins.NotImplementedError', ''] - - ['builtins.Exception~Subclass', 'builtins.NotImplementedError', ''] - - ['builtins.BaseException~Subclass', 'builtins.NotImplementedError', ''] - - ['builtins.IndentationError~Subclass', 'builtins.IndentationError', ''] - - ['builtins.SyntaxError~Subclass', 'builtins.IndentationError', ''] - - ['builtins.Exception~Subclass', 'builtins.IndentationError', ''] - - ['builtins.BaseException~Subclass', 'builtins.IndentationError', ''] - - ['builtins.ValueError~Subclass', 'builtins.ValueError', ''] - - ['builtins.Exception~Subclass', 'builtins.ValueError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ValueError', ''] - - ['builtins.AssertionError~Subclass', 'builtins.AssertionError', ''] - - ['builtins.Exception~Subclass', 'builtins.AssertionError', ''] - - ['builtins.BaseException~Subclass', 'builtins.AssertionError', ''] - - ['builtins.SystemError~Subclass', 'builtins.SystemError', ''] - - ['builtins.Exception~Subclass', 'builtins.SystemError', ''] - - ['builtins.BaseException~Subclass', 'builtins.SystemError', ''] - - ['builtins.UserWarning~Subclass', 'builtins.UserWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.UserWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.UserWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.UserWarning', ''] - - ['builtins.FutureWarning~Subclass', 'builtins.FutureWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.FutureWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.FutureWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.FutureWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.Exception', ''] - - ['builtins.BaseException~Subclass', 'builtins.Exception', ''] - - ['builtins.ResourceWarning~Subclass', 'builtins.ResourceWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.ResourceWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.ResourceWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.ResourceWarning', ''] - - ['builtins.SystemExit~Subclass', 'builtins.SystemExit', ''] - - ['builtins.BaseException~Subclass', 'builtins.SystemExit', ''] - - ['builtins.OSError~Subclass', 'builtins.OSError', ''] - - ['builtins.Exception~Subclass', 'builtins.OSError', ''] - - ['builtins.BaseException~Subclass', 'builtins.OSError', ''] - - ['builtins.ConnectionAbortedError~Subclass', 'builtins.ConnectionAbortedError', ''] - - ['builtins.ConnectionError~Subclass', 'builtins.ConnectionAbortedError', ''] - - ['builtins.OSError~Subclass', 'builtins.ConnectionAbortedError', ''] - - ['builtins.Exception~Subclass', 'builtins.ConnectionAbortedError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ConnectionAbortedError', ''] - - ['builtins.IsADirectoryError~Subclass', 'builtins.IsADirectoryError', ''] - - ['builtins.OSError~Subclass', 'builtins.IsADirectoryError', ''] - - ['builtins.Exception~Subclass', 'builtins.IsADirectoryError', ''] - - ['builtins.BaseException~Subclass', 'builtins.IsADirectoryError', ''] - - ['builtins.TimeoutError~Subclass', 'builtins.TimeoutError', ''] - - ['builtins.OSError~Subclass', 'builtins.TimeoutError', ''] - - ['builtins.Exception~Subclass', 'builtins.TimeoutError', ''] - - ['builtins.BaseException~Subclass', 'builtins.TimeoutError', ''] - - ['builtins.NameError~Subclass', 'builtins.NameError', ''] - - ['builtins.Exception~Subclass', 'builtins.NameError', ''] - - ['builtins.BaseException~Subclass', 'builtins.NameError', ''] - - ['builtins.TabError~Subclass', 'builtins.TabError', ''] - - ['builtins.IndentationError~Subclass', 'builtins.TabError', ''] - - ['builtins.SyntaxError~Subclass', 'builtins.TabError', ''] - - ['builtins.Exception~Subclass', 'builtins.TabError', ''] - - ['builtins.BaseException~Subclass', 'builtins.TabError', ''] - - ['builtins.UnicodeError~Subclass', 'builtins.UnicodeError', ''] - - ['builtins.ValueError~Subclass', 'builtins.UnicodeError', ''] - - ['builtins.Exception~Subclass', 'builtins.UnicodeError', ''] - - ['builtins.BaseException~Subclass', 'builtins.UnicodeError', ''] - - ['builtins.ArithmeticError~Subclass', 'builtins.ArithmeticError', ''] - - ['builtins.Exception~Subclass', 'builtins.ArithmeticError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ArithmeticError', ''] - - ['builtins.ReferenceError~Subclass', 'builtins.ReferenceError', ''] - - ['builtins.Exception~Subclass', 'builtins.ReferenceError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ReferenceError', ''] - - ['builtins.DeprecationWarning~Subclass', 'builtins.DeprecationWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.DeprecationWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.DeprecationWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.DeprecationWarning', ''] - - ['builtins.ImportWarning~Subclass', 'builtins.ImportWarning', ''] - - ['builtins.Warning~Subclass', 'builtins.ImportWarning', ''] - - ['builtins.Exception~Subclass', 'builtins.ImportWarning', ''] - - ['builtins.BaseException~Subclass', 'builtins.ImportWarning', ''] - - ['builtins.TypeError~Subclass', 'builtins.TypeError', ''] - - ['builtins.Exception~Subclass', 'builtins.TypeError', ''] - - ['builtins.BaseException~Subclass', 'builtins.TypeError', ''] - - ['builtins.BaseExceptionGroup~Subclass', 'builtins.BaseExceptionGroup', ''] - - ['builtins.BaseException~Subclass', 'builtins.BaseExceptionGroup', ''] - - ['builtins.BlockingIOError~Subclass', 'builtins.BlockingIOError', ''] - - ['builtins.OSError~Subclass', 'builtins.BlockingIOError', ''] - - ['builtins.Exception~Subclass', 'builtins.BlockingIOError', ''] - - ['builtins.BaseException~Subclass', 'builtins.BlockingIOError', ''] - - ['builtins.ConnectionRefusedError~Subclass', 'builtins.ConnectionRefusedError', ''] - - ['builtins.ConnectionError~Subclass', 'builtins.ConnectionRefusedError', ''] - - ['builtins.OSError~Subclass', 'builtins.ConnectionRefusedError', ''] - - ['builtins.Exception~Subclass', 'builtins.ConnectionRefusedError', ''] - - ['builtins.BaseException~Subclass', 'builtins.ConnectionRefusedError', ''] - - ['builtins.NotADirectoryError~Subclass', 'builtins.NotADirectoryError', ''] - - ['builtins.OSError~Subclass', 'builtins.NotADirectoryError', ''] - - ['builtins.Exception~Subclass', 'builtins.NotADirectoryError', ''] - - ['builtins.BaseException~Subclass', 'builtins.NotADirectoryError', ''] - - ['builtins.EOFError~Subclass', 'builtins.EOFError', ''] - - ['builtins.Exception~Subclass', 'builtins.EOFError', ''] - - ['builtins.BaseException~Subclass', 'builtins.EOFError', ''] - - ['builtins.UnboundLocalError~Subclass', 'builtins.UnboundLocalError', ''] - - ['builtins.NameError~Subclass', 'builtins.UnboundLocalError', ''] - - ['builtins.Exception~Subclass', 'builtins.UnboundLocalError', ''] - - ['builtins.BaseException~Subclass', 'builtins.UnboundLocalError', ''] - - ['builtins.LookupError~Subclass', 'builtins.LookupError', ''] - - ['builtins.Exception~Subclass', 'builtins.LookupError', ''] - - ['builtins.BaseException~Subclass', 'builtins.LookupError', ''] - - ['builtins.UnicodeEncodeError~Subclass', 'builtins.UnicodeEncodeError', ''] - - ['builtins.UnicodeError~Subclass', 'builtins.UnicodeEncodeError', ''] - - ['builtins.ValueError~Subclass', 'builtins.UnicodeEncodeError', ''] - - ['builtins.Exception~Subclass', 'builtins.UnicodeEncodeError', ''] - - ['builtins.BaseException~Subclass', 'builtins.UnicodeEncodeError', ''] - - ['builtins.FloatingPointError~Subclass', 'builtins.FloatingPointError', ''] - - ['builtins.ArithmeticError~Subclass', 'builtins.FloatingPointError', ''] - - ['builtins.Exception~Subclass', 'builtins.FloatingPointError', ''] - - ['builtins.BaseException~Subclass', 'builtins.FloatingPointError', ''] - - ['builtins.MemoryError~Subclass', 'builtins.MemoryError', ''] - - ['builtins.Exception~Subclass', 'builtins.MemoryError', ''] - - ['builtins.BaseException~Subclass', 'builtins.MemoryError', ''] \ No newline at end of file +- addsTo: + extensible: typeModel + pack: codeql/python-all + data: + - - builtins.PendingDeprecationWarning~Subclass + - builtins.PendingDeprecationWarning + - '' + - - builtins.Warning~Subclass + - builtins.PendingDeprecationWarning + - '' + - - builtins.Exception~Subclass + - builtins.PendingDeprecationWarning + - '' + - - builtins.BaseException~Subclass + - builtins.PendingDeprecationWarning + - '' + - - builtins.UnicodeWarning~Subclass + - builtins.UnicodeWarning + - '' + - - builtins.Warning~Subclass + - builtins.UnicodeWarning + - '' + - - builtins.Exception~Subclass + - builtins.UnicodeWarning + - '' + - - builtins.BaseException~Subclass + - builtins.UnicodeWarning + - '' + - - builtins.StopAsyncIteration~Subclass + - builtins.StopAsyncIteration + - '' + - - builtins.Exception~Subclass + - builtins.StopAsyncIteration + - '' + - - builtins.BaseException~Subclass + - builtins.StopAsyncIteration + - '' + - - builtins.KeyboardInterrupt~Subclass + - builtins.KeyboardInterrupt + - '' + - - builtins.BaseException~Subclass + - builtins.KeyboardInterrupt + - '' + - - builtins.ConnectionError~Subclass + - builtins.ConnectionError + - '' + - - builtins.OSError~Subclass + - builtins.ConnectionError + - '' + - - builtins.Exception~Subclass + - builtins.ConnectionError + - '' + - - builtins.BaseException~Subclass + - builtins.ConnectionError + - '' + - - builtins.ConnectionResetError~Subclass + - builtins.ConnectionResetError + - '' + - - builtins.ConnectionError~Subclass + - builtins.ConnectionResetError + - '' + - - builtins.OSError~Subclass + - builtins.ConnectionResetError + - '' + - - builtins.Exception~Subclass + - builtins.ConnectionResetError + - '' + - - builtins.BaseException~Subclass + - builtins.ConnectionResetError + - '' + - - builtins.InterruptedError~Subclass + - builtins.InterruptedError + - '' + - - builtins.OSError~Subclass + - builtins.InterruptedError + - '' + - - builtins.Exception~Subclass + - builtins.InterruptedError + - '' + - - builtins.BaseException~Subclass + - builtins.InterruptedError + - '' + - - builtins.RuntimeError~Subclass + - builtins.RuntimeError + - '' + - - builtins.Exception~Subclass + - builtins.RuntimeError + - '' + - - builtins.BaseException~Subclass + - builtins.RuntimeError + - '' + - - builtins.AttributeError~Subclass + - builtins.AttributeError + - '' + - - builtins.Exception~Subclass + - builtins.AttributeError + - '' + - - builtins.BaseException~Subclass + - builtins.AttributeError + - '' + - - builtins.IndexError~Subclass + - builtins.IndexError + - '' + - - builtins.LookupError~Subclass + - builtins.IndexError + - '' + - - builtins.Exception~Subclass + - builtins.IndexError + - '' + - - builtins.BaseException~Subclass + - builtins.IndexError + - '' + - - builtins.UnicodeDecodeError~Subclass + - builtins.UnicodeDecodeError + - '' + - - builtins.UnicodeError~Subclass + - builtins.UnicodeDecodeError + - '' + - - builtins.ValueError~Subclass + - builtins.UnicodeDecodeError + - '' + - - builtins.Exception~Subclass + - builtins.UnicodeDecodeError + - '' + - - builtins.BaseException~Subclass + - builtins.UnicodeDecodeError + - '' + - - builtins.ExceptionGroup~Subclass + - builtins.ExceptionGroup + - '' + - - builtins.BaseExceptionGroup~Subclass + - builtins.ExceptionGroup + - '' + - - builtins.Exception~Subclass + - builtins.ExceptionGroup + - '' + - - builtins.BaseException~Subclass + - builtins.ExceptionGroup + - '' + - - builtins.OverflowError~Subclass + - builtins.OverflowError + - '' + - - builtins.ArithmeticError~Subclass + - builtins.OverflowError + - '' + - - builtins.Exception~Subclass + - builtins.OverflowError + - '' + - - builtins.BaseException~Subclass + - builtins.OverflowError + - '' + - - builtins.BufferError~Subclass + - builtins.BufferError + - '' + - - builtins.Exception~Subclass + - builtins.BufferError + - '' + - - builtins.BaseException~Subclass + - builtins.BufferError + - '' + - - builtins.SyntaxWarning~Subclass + - builtins.SyntaxWarning + - '' + - - builtins.Warning~Subclass + - builtins.SyntaxWarning + - '' + - - builtins.Exception~Subclass + - builtins.SyntaxWarning + - '' + - - builtins.BaseException~Subclass + - builtins.SyntaxWarning + - '' + - - builtins.BytesWarning~Subclass + - builtins.BytesWarning + - '' + - - builtins.Warning~Subclass + - builtins.BytesWarning + - '' + - - builtins.Exception~Subclass + - builtins.BytesWarning + - '' + - - builtins.BaseException~Subclass + - builtins.BytesWarning + - '' + - - builtins.StopIteration~Subclass + - builtins.StopIteration + - '' + - - builtins.Exception~Subclass + - builtins.StopIteration + - '' + - - builtins.BaseException~Subclass + - builtins.StopIteration + - '' + - - builtins.ImportError~Subclass + - builtins.ImportError + - '' + - - builtins.Exception~Subclass + - builtins.ImportError + - '' + - - builtins.BaseException~Subclass + - builtins.ImportError + - '' + - - builtins.ChildProcessError~Subclass + - builtins.ChildProcessError + - '' + - - builtins.OSError~Subclass + - builtins.ChildProcessError + - '' + - - builtins.Exception~Subclass + - builtins.ChildProcessError + - '' + - - builtins.BaseException~Subclass + - builtins.ChildProcessError + - '' + - - builtins.FileExistsError~Subclass + - builtins.FileExistsError + - '' + - - builtins.OSError~Subclass + - builtins.FileExistsError + - '' + - - builtins.Exception~Subclass + - builtins.FileExistsError + - '' + - - builtins.BaseException~Subclass + - builtins.FileExistsError + - '' + - - builtins.PermissionError~Subclass + - builtins.PermissionError + - '' + - - builtins.OSError~Subclass + - builtins.PermissionError + - '' + - - builtins.Exception~Subclass + - builtins.PermissionError + - '' + - - builtins.BaseException~Subclass + - builtins.PermissionError + - '' + - - builtins.RecursionError~Subclass + - builtins.RecursionError + - '' + - - builtins.RuntimeError~Subclass + - builtins.RecursionError + - '' + - - builtins.Exception~Subclass + - builtins.RecursionError + - '' + - - builtins.BaseException~Subclass + - builtins.RecursionError + - '' + - - builtins.SyntaxError~Subclass + - builtins.SyntaxError + - '' + - - builtins.Exception~Subclass + - builtins.SyntaxError + - '' + - - builtins.BaseException~Subclass + - builtins.SyntaxError + - '' + - - builtins.KeyError~Subclass + - builtins.KeyError + - '' + - - builtins.LookupError~Subclass + - builtins.KeyError + - '' + - - builtins.Exception~Subclass + - builtins.KeyError + - '' + - - builtins.BaseException~Subclass + - builtins.KeyError + - '' + - - builtins.UnicodeTranslateError~Subclass + - builtins.UnicodeTranslateError + - '' + - - builtins.UnicodeError~Subclass + - builtins.UnicodeTranslateError + - '' + - - builtins.ValueError~Subclass + - builtins.UnicodeTranslateError + - '' + - - builtins.Exception~Subclass + - builtins.UnicodeTranslateError + - '' + - - builtins.BaseException~Subclass + - builtins.UnicodeTranslateError + - '' + - - builtins.ZeroDivisionError~Subclass + - builtins.ZeroDivisionError + - '' + - - builtins.ArithmeticError~Subclass + - builtins.ZeroDivisionError + - '' + - - builtins.Exception~Subclass + - builtins.ZeroDivisionError + - '' + - - builtins.BaseException~Subclass + - builtins.ZeroDivisionError + - '' + - - builtins.Warning~Subclass + - builtins.Warning + - '' + - - builtins.Exception~Subclass + - builtins.Warning + - '' + - - builtins.BaseException~Subclass + - builtins.Warning + - '' + - - builtins.RuntimeWarning~Subclass + - builtins.RuntimeWarning + - '' + - - builtins.Warning~Subclass + - builtins.RuntimeWarning + - '' + - - builtins.Exception~Subclass + - builtins.RuntimeWarning + - '' + - - builtins.BaseException~Subclass + - builtins.RuntimeWarning + - '' + - - builtins.EncodingWarning~Subclass + - builtins.EncodingWarning + - '' + - - builtins.Warning~Subclass + - builtins.EncodingWarning + - '' + - - builtins.Exception~Subclass + - builtins.EncodingWarning + - '' + - - builtins.BaseException~Subclass + - builtins.EncodingWarning + - '' + - - builtins.BaseException~Subclass + - builtins.BaseException + - '' + - - builtins.GeneratorExit~Subclass + - builtins.GeneratorExit + - '' + - - builtins.BaseException~Subclass + - builtins.GeneratorExit + - '' + - - builtins.ModuleNotFoundError~Subclass + - builtins.ModuleNotFoundError + - '' + - - builtins.ImportError~Subclass + - builtins.ModuleNotFoundError + - '' + - - builtins.Exception~Subclass + - builtins.ModuleNotFoundError + - '' + - - builtins.BaseException~Subclass + - builtins.ModuleNotFoundError + - '' + - - builtins.BrokenPipeError~Subclass + - builtins.BrokenPipeError + - '' + - - builtins.ConnectionError~Subclass + - builtins.BrokenPipeError + - '' + - - builtins.OSError~Subclass + - builtins.BrokenPipeError + - '' + - - builtins.Exception~Subclass + - builtins.BrokenPipeError + - '' + - - builtins.BaseException~Subclass + - builtins.BrokenPipeError + - '' + - - builtins.FileNotFoundError~Subclass + - builtins.FileNotFoundError + - '' + - - builtins.OSError~Subclass + - builtins.FileNotFoundError + - '' + - - builtins.Exception~Subclass + - builtins.FileNotFoundError + - '' + - - builtins.BaseException~Subclass + - builtins.FileNotFoundError + - '' + - - builtins.ProcessLookupError~Subclass + - builtins.ProcessLookupError + - '' + - - builtins.OSError~Subclass + - builtins.ProcessLookupError + - '' + - - builtins.Exception~Subclass + - builtins.ProcessLookupError + - '' + - - builtins.BaseException~Subclass + - builtins.ProcessLookupError + - '' + - - builtins.NotImplementedError~Subclass + - builtins.NotImplementedError + - '' + - - builtins.RuntimeError~Subclass + - builtins.NotImplementedError + - '' + - - builtins.Exception~Subclass + - builtins.NotImplementedError + - '' + - - builtins.BaseException~Subclass + - builtins.NotImplementedError + - '' + - - builtins.IndentationError~Subclass + - builtins.IndentationError + - '' + - - builtins.SyntaxError~Subclass + - builtins.IndentationError + - '' + - - builtins.Exception~Subclass + - builtins.IndentationError + - '' + - - builtins.BaseException~Subclass + - builtins.IndentationError + - '' + - - builtins.ValueError~Subclass + - builtins.ValueError + - '' + - - builtins.Exception~Subclass + - builtins.ValueError + - '' + - - builtins.BaseException~Subclass + - builtins.ValueError + - '' + - - builtins.AssertionError~Subclass + - builtins.AssertionError + - '' + - - builtins.Exception~Subclass + - builtins.AssertionError + - '' + - - builtins.BaseException~Subclass + - builtins.AssertionError + - '' + - - builtins.SystemError~Subclass + - builtins.SystemError + - '' + - - builtins.Exception~Subclass + - builtins.SystemError + - '' + - - builtins.BaseException~Subclass + - builtins.SystemError + - '' + - - builtins.UserWarning~Subclass + - builtins.UserWarning + - '' + - - builtins.Warning~Subclass + - builtins.UserWarning + - '' + - - builtins.Exception~Subclass + - builtins.UserWarning + - '' + - - builtins.BaseException~Subclass + - builtins.UserWarning + - '' + - - builtins.FutureWarning~Subclass + - builtins.FutureWarning + - '' + - - builtins.Warning~Subclass + - builtins.FutureWarning + - '' + - - builtins.Exception~Subclass + - builtins.FutureWarning + - '' + - - builtins.BaseException~Subclass + - builtins.FutureWarning + - '' + - - builtins.Exception~Subclass + - builtins.Exception + - '' + - - builtins.BaseException~Subclass + - builtins.Exception + - '' + - - builtins.ResourceWarning~Subclass + - builtins.ResourceWarning + - '' + - - builtins.Warning~Subclass + - builtins.ResourceWarning + - '' + - - builtins.Exception~Subclass + - builtins.ResourceWarning + - '' + - - builtins.BaseException~Subclass + - builtins.ResourceWarning + - '' + - - builtins.SystemExit~Subclass + - builtins.SystemExit + - '' + - - builtins.BaseException~Subclass + - builtins.SystemExit + - '' + - - builtins.OSError~Subclass + - builtins.OSError + - '' + - - builtins.Exception~Subclass + - builtins.OSError + - '' + - - builtins.BaseException~Subclass + - builtins.OSError + - '' + - - builtins.ConnectionAbortedError~Subclass + - builtins.ConnectionAbortedError + - '' + - - builtins.ConnectionError~Subclass + - builtins.ConnectionAbortedError + - '' + - - builtins.OSError~Subclass + - builtins.ConnectionAbortedError + - '' + - - builtins.Exception~Subclass + - builtins.ConnectionAbortedError + - '' + - - builtins.BaseException~Subclass + - builtins.ConnectionAbortedError + - '' + - - builtins.IsADirectoryError~Subclass + - builtins.IsADirectoryError + - '' + - - builtins.OSError~Subclass + - builtins.IsADirectoryError + - '' + - - builtins.Exception~Subclass + - builtins.IsADirectoryError + - '' + - - builtins.BaseException~Subclass + - builtins.IsADirectoryError + - '' + - - builtins.TimeoutError~Subclass + - builtins.TimeoutError + - '' + - - builtins.OSError~Subclass + - builtins.TimeoutError + - '' + - - builtins.Exception~Subclass + - builtins.TimeoutError + - '' + - - builtins.BaseException~Subclass + - builtins.TimeoutError + - '' + - - builtins.NameError~Subclass + - builtins.NameError + - '' + - - builtins.Exception~Subclass + - builtins.NameError + - '' + - - builtins.BaseException~Subclass + - builtins.NameError + - '' + - - builtins.TabError~Subclass + - builtins.TabError + - '' + - - builtins.IndentationError~Subclass + - builtins.TabError + - '' + - - builtins.SyntaxError~Subclass + - builtins.TabError + - '' + - - builtins.Exception~Subclass + - builtins.TabError + - '' + - - builtins.BaseException~Subclass + - builtins.TabError + - '' + - - builtins.UnicodeError~Subclass + - builtins.UnicodeError + - '' + - - builtins.ValueError~Subclass + - builtins.UnicodeError + - '' + - - builtins.Exception~Subclass + - builtins.UnicodeError + - '' + - - builtins.BaseException~Subclass + - builtins.UnicodeError + - '' + - - builtins.ArithmeticError~Subclass + - builtins.ArithmeticError + - '' + - - builtins.Exception~Subclass + - builtins.ArithmeticError + - '' + - - builtins.BaseException~Subclass + - builtins.ArithmeticError + - '' + - - builtins.ReferenceError~Subclass + - builtins.ReferenceError + - '' + - - builtins.Exception~Subclass + - builtins.ReferenceError + - '' + - - builtins.BaseException~Subclass + - builtins.ReferenceError + - '' + - - builtins.DeprecationWarning~Subclass + - builtins.DeprecationWarning + - '' + - - builtins.Warning~Subclass + - builtins.DeprecationWarning + - '' + - - builtins.Exception~Subclass + - builtins.DeprecationWarning + - '' + - - builtins.BaseException~Subclass + - builtins.DeprecationWarning + - '' + - - builtins.ImportWarning~Subclass + - builtins.ImportWarning + - '' + - - builtins.Warning~Subclass + - builtins.ImportWarning + - '' + - - builtins.Exception~Subclass + - builtins.ImportWarning + - '' + - - builtins.BaseException~Subclass + - builtins.ImportWarning + - '' + - - builtins.TypeError~Subclass + - builtins.TypeError + - '' + - - builtins.Exception~Subclass + - builtins.TypeError + - '' + - - builtins.BaseException~Subclass + - builtins.TypeError + - '' + - - builtins.BaseExceptionGroup~Subclass + - builtins.BaseExceptionGroup + - '' + - - builtins.BaseException~Subclass + - builtins.BaseExceptionGroup + - '' + - - builtins.BlockingIOError~Subclass + - builtins.BlockingIOError + - '' + - - builtins.OSError~Subclass + - builtins.BlockingIOError + - '' + - - builtins.Exception~Subclass + - builtins.BlockingIOError + - '' + - - builtins.BaseException~Subclass + - builtins.BlockingIOError + - '' + - - builtins.ConnectionRefusedError~Subclass + - builtins.ConnectionRefusedError + - '' + - - builtins.ConnectionError~Subclass + - builtins.ConnectionRefusedError + - '' + - - builtins.OSError~Subclass + - builtins.ConnectionRefusedError + - '' + - - builtins.Exception~Subclass + - builtins.ConnectionRefusedError + - '' + - - builtins.BaseException~Subclass + - builtins.ConnectionRefusedError + - '' + - - builtins.NotADirectoryError~Subclass + - builtins.NotADirectoryError + - '' + - - builtins.OSError~Subclass + - builtins.NotADirectoryError + - '' + - - builtins.Exception~Subclass + - builtins.NotADirectoryError + - '' + - - builtins.BaseException~Subclass + - builtins.NotADirectoryError + - '' + - - builtins.EOFError~Subclass + - builtins.EOFError + - '' + - - builtins.Exception~Subclass + - builtins.EOFError + - '' + - - builtins.BaseException~Subclass + - builtins.EOFError + - '' + - - builtins.UnboundLocalError~Subclass + - builtins.UnboundLocalError + - '' + - - builtins.NameError~Subclass + - builtins.UnboundLocalError + - '' + - - builtins.Exception~Subclass + - builtins.UnboundLocalError + - '' + - - builtins.BaseException~Subclass + - builtins.UnboundLocalError + - '' + - - builtins.LookupError~Subclass + - builtins.LookupError + - '' + - - builtins.Exception~Subclass + - builtins.LookupError + - '' + - - builtins.BaseException~Subclass + - builtins.LookupError + - '' + - - builtins.UnicodeEncodeError~Subclass + - builtins.UnicodeEncodeError + - '' + - - builtins.UnicodeError~Subclass + - builtins.UnicodeEncodeError + - '' + - - builtins.ValueError~Subclass + - builtins.UnicodeEncodeError + - '' + - - builtins.Exception~Subclass + - builtins.UnicodeEncodeError + - '' + - - builtins.BaseException~Subclass + - builtins.UnicodeEncodeError + - '' + - - builtins.FloatingPointError~Subclass + - builtins.FloatingPointError + - '' + - - builtins.ArithmeticError~Subclass + - builtins.FloatingPointError + - '' + - - builtins.Exception~Subclass + - builtins.FloatingPointError + - '' + - - builtins.BaseException~Subclass + - builtins.FloatingPointError + - '' + - - builtins.MemoryError~Subclass + - builtins.MemoryError + - '' + - - builtins.Exception~Subclass + - builtins.MemoryError + - '' + - - builtins.BaseException~Subclass + - builtins.MemoryError + - '' diff --git a/python/ql/src/meta/ClassHierarchy/process-builtin-exceptions.py b/python/ql/src/meta/ClassHierarchy/process-builtin-exceptions.py new file mode 100644 index 00000000000..fc0266a5b99 --- /dev/null +++ b/python/ql/src/meta/ClassHierarchy/process-builtin-exceptions.py @@ -0,0 +1,31 @@ +from shared_subclass_functions import wrap_in_template +import sys +import yaml +from pathlib import Path + +py_version = sys.version.split()[0] +VERSION = f"process-builtin-exceptions 0.0.1; Python {py_version}" + +builtins_model_path = Path(__file__).parent.parent.parent.parent / "lib/semmle/python/frameworks/builtins.model.yml" + +def write_data(data, path: Path): + f = path.open("w+") + f.write(f"# {VERSION}\n") + yaml.dump(data, indent=2, stream=f, Dumper=yaml.CDumper) + +builtin_names = dir(__builtins__) +builtin_dict = {x: getattr(__builtins__,x) for x in builtin_names} + + +builtin_exceptions = {v for v in builtin_dict.values() if type(v) is type and issubclass(v, BaseException)} + +data = [] +for sub in builtin_exceptions: + for base in sub.__mro__: + if issubclass(base, BaseException): + basename = base.__name__ + subname = sub.__name__ + row = [f"builtins.{basename}~Subclass", f"builtins.{subname}", ""] + data.append(row) + +write_data(wrap_in_template(data), builtins_model_path) From eb4841230ab72ce3dc77d66127d0dada993f248b Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Mon, 25 Aug 2025 13:30:45 +0100 Subject: [PATCH 04/49] Add tests (WIP) --- .../ql/src/Exceptions/IncorrectExceptOrder.ql | 6 ++-- .../general/IncorrectExceptOrder.qlref | 3 +- .../Exceptions/general/exceptions_test.py | 28 ++++++++++++++++++- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/python/ql/src/Exceptions/IncorrectExceptOrder.ql b/python/ql/src/Exceptions/IncorrectExceptOrder.ql index 5637c9e3b61..6eb1b39b0e6 100644 --- a/python/ql/src/Exceptions/IncorrectExceptOrder.ql +++ b/python/ql/src/Exceptions/IncorrectExceptOrder.ql @@ -1,5 +1,5 @@ /** - * @name Unreachable 'except' block + * @name Unreachable `except` block * @description Handling general exceptions before specific exceptions means that the specific * handlers are never executed. * @kind problem @@ -23,7 +23,7 @@ predicate builtinException(string name) { } predicate builtinExceptionSubclass(string base, string sub) { - typeModel("builtins." + base + "~Subclass", sub, "") + typeModel("builtins." + base + "~Subclass", "builtins." + sub, "") } newtype TExceptType = @@ -48,7 +48,7 @@ class ExceptType extends TExceptType { DataFlow::Node getAUse() { result = classTracker(this.asClass()) or - result = API::builtin(this.asBuiltinName()).asSource() + API::builtin(this.asBuiltinName()).asSource().flowsTo(result) } ExceptType getADirectSuperclass() { diff --git a/python/ql/test/query-tests/Exceptions/general/IncorrectExceptOrder.qlref b/python/ql/test/query-tests/Exceptions/general/IncorrectExceptOrder.qlref index bc4c3a07081..5844968f9d6 100644 --- a/python/ql/test/query-tests/Exceptions/general/IncorrectExceptOrder.qlref +++ b/python/ql/test/query-tests/Exceptions/general/IncorrectExceptOrder.qlref @@ -1 +1,2 @@ -Exceptions/IncorrectExceptOrder.ql +query: Exceptions/IncorrectExceptOrder.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Exceptions/general/exceptions_test.py b/python/ql/test/query-tests/Exceptions/general/exceptions_test.py index d3f782f874f..291b3cb30e0 100644 --- a/python/ql/test/query-tests/Exceptions/general/exceptions_test.py +++ b/python/ql/test/query-tests/Exceptions/general/exceptions_test.py @@ -61,8 +61,34 @@ try: val.attr except Exception: print (2) -except AttributeError: +except AttributeError: # $Alert[py/unreachable-except] print (3) + +class MyExc(ValueError): + pass + +try: + pass +except ValueError: + pass +except MyExc: # $Alert[py/unreachable-except] + pass + +class MyBaseExc(Exception): + pass + +class MySubExc(MyBaseExc): + pass + +try: + pass +except MyBaseExc: + pass +except MySubExc: # $Alert[py/unreachable-except] + pass +except Exception: + pass + #Catch BaseException def catch_base_exception(): From bd3fa7fb21d5f2a4c61e7f75b09a3e7f9a4aeb48 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 5 Sep 2025 16:03:55 +0100 Subject: [PATCH 05/49] Switch to dataflow check for guards exceptions This reduces some confusing FPs, though appears to introduce another --- .../ql/src/Resources/FileNotAlwaysClosed.ql | 12 ++-- .../Resources/FileNotAlwaysClosedQuery.qll | 28 +++------ .../FileNotAlwaysClosed.expected | 10 +++ .../FileNotAlwaysClosed.qlref | 2 + .../FileNotAlwaysClosed/resources_test.py | 62 +++++++++++++++---- .../FileNotAlwaysClosed/test.expected | 0 .../Resources/FileNotAlwaysClosed/test.ql | 25 -------- 7 files changed, 76 insertions(+), 63 deletions(-) create mode 100644 python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected create mode 100644 python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.qlref delete mode 100644 python/ql/test/query-tests/Resources/FileNotAlwaysClosed/test.expected delete mode 100644 python/ql/test/query-tests/Resources/FileNotAlwaysClosed/test.ql diff --git a/python/ql/src/Resources/FileNotAlwaysClosed.ql b/python/ql/src/Resources/FileNotAlwaysClosed.ql index f639bc4aa91..4e0b897c9bb 100644 --- a/python/ql/src/Resources/FileNotAlwaysClosed.ql +++ b/python/ql/src/Resources/FileNotAlwaysClosed.ql @@ -15,12 +15,14 @@ import python import FileNotAlwaysClosedQuery +import codeql.util.Option -from FileOpen fo, string msg +from FileOpen fo, string msg, LocatableOption::Option exec where fileNotClosed(fo) and - msg = "File is opened but is not closed." + msg = "File is opened but is not closed." and + exec.isNone() or - fileMayNotBeClosedOnException(fo, _) and - msg = "File may not be closed if an exception is raised." -select fo, msg + fileMayNotBeClosedOnException(fo, exec.asSome()) and + msg = "File may not be closed if $@ raises an exception." +select fo, msg, exec, "this operation" diff --git a/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll b/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll index 0122344d370..94d34d9abc5 100644 --- a/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll +++ b/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll @@ -34,6 +34,8 @@ class FileWrapperCall extends DataFlow::CallCfgNode { DataFlow::Node wrapped; FileWrapperCall() { + // Approximation: Treat any passing of a file object to a class constructor as potentially a wrapper + // This could be made more precise by checking that the constructor writes the file to a field. wrapped = this.getArg(_).getALocalSource() and this.getFunction() = classTracker(_) or @@ -51,21 +53,14 @@ class FileWrapperCall extends DataFlow::CallCfgNode { /** A node where a file is closed. */ abstract class FileClose extends DataFlow::CfgNode { /** Holds if this file close will occur if an exception is raised at `raises`. */ - predicate guardsExceptions(DataFlow::CfgNode raises) { + predicate guardsExceptions(DataFlow::CfgNode fileRaises) { // The close call occurs after an exception edge in the cfg (a catch or finally) - bbReachableRefl(raises.asCfgNode().getBasicBlock().getAnExceptionalSuccessor(), + bbReachableRefl(fileRaises.asCfgNode().getBasicBlock().getAnExceptionalSuccessor(), this.asCfgNode().getBasicBlock()) or // The exception is after the close call. - // A full cfg reachability check is not in general feasible for performance, so we approximate it with: - // - A basic block reachability check (here) that works if the expression and close call are in different basic blocks - // - A check (in the `WithStatement` override of `guardsExceptions`) for the case where the exception call - // is lexically contained in the body of a `with` statement that closes the file. - // This may cause FPs in a case such as: - // f.close() - // f.write("...") - // We presume this to not be very common. - bbReachableStrict(this.asCfgNode().getBasicBlock(), raises.asCfgNode().getBasicBlock()) + // A full cfg reachability check is not feasible for performance, instead we use local dataflow + fileLocalFlow(this, fileRaises) } } @@ -93,13 +88,6 @@ class WithStatement extends FileClose { With w; WithStatement() { this.asExpr() = w.getContextExpr() } - - override predicate guardsExceptions(DataFlow::CfgNode raises) { - super.guardsExceptions(raises) - or - // Check whether the exception is raised in the body of the with statement. - raises.asExpr().getParent*() = w.getBody().getAnItem() - } } /** Holds if an exception may be raised at `raises` if `file` is a file object. */ @@ -131,7 +119,7 @@ private predicate fileLocalFlowHelper1( /** Holds if data flows from `source` to `sink`, including file wrapper classes. */ pragma[inline] -private predicate fileLocalFlow(FileOpen source, DataFlow::Node sink) { +private predicate fileLocalFlow(DataFlow::Node source, DataFlow::Node sink) { exists(DataFlow::LocalSourceNode mid | fileLocalFlowHelper1(source, mid) and mid.flowsTo(sink)) } @@ -171,7 +159,7 @@ predicate fileMayNotBeClosedOnException(FileOpen fo, DataFlow::Node raises) { fileLocalFlow(fo, fileRaised) and not exists(FileClose fc | fileLocalFlow(fo, fc) and - fc.guardsExceptions(raises) + fc.guardsExceptions(fileRaised) ) ) } diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected new file mode 100644 index 00000000000..f5527589f80 --- /dev/null +++ b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected @@ -0,0 +1,10 @@ +| resources_test.py:4:10:4:25 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:5:5:5:33 | ControlFlowNode for Attribute() | this operation | +| resources_test.py:9:10:9:25 | ControlFlowNode for open() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | +| resources_test.py:108:11:108:20 | ControlFlowNode for open() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | +| resources_test.py:112:11:112:28 | ControlFlowNode for opener_func2() | File may not be closed if $@ raises an exception. | resources_test.py:113:5:113:22 | ControlFlowNode for Attribute() | this operation | +| resources_test.py:123:11:123:24 | ControlFlowNode for opener_func2() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | +| resources_test.py:129:15:129:24 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:130:9:130:26 | ControlFlowNode for Attribute() | this operation | +| resources_test.py:248:11:248:25 | ControlFlowNode for open() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | +| resources_test.py:269:10:269:27 | ControlFlowNode for Attribute() | File may not be closed if $@ raises an exception. | resources_test.py:271:5:271:19 | ControlFlowNode for Attribute() | this operation | +| resources_test.py:285:11:285:20 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:287:5:287:31 | ControlFlowNode for Attribute() | this operation | +| resources_test.py:305:10:305:19 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:308:5:308:24 | ControlFlowNode for Attribute() | this operation | diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.qlref b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.qlref new file mode 100644 index 00000000000..57ffce32b8b --- /dev/null +++ b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.qlref @@ -0,0 +1,2 @@ +query: Resources/FileNotAlwaysClosed.ql +postprocess: utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py index 244c6f73c13..1eb380013c3 100644 --- a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py +++ b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py @@ -1,12 +1,12 @@ #File not always closed def not_close1(): - f1 = open("filename") # $ notClosedOnException + f1 = open("filename") # $ Alert # not closed on exception f1.write("Error could occur") f1.close() def not_close2(): - f2 = open("filename") # $ notClosed + f2 = open("filename") # $ Alert def closed3(): f3 = open("filename") @@ -46,7 +46,7 @@ def closed7(): def not_closed8(): f8 = None try: - f8 = open("filename") # $ MISSING:notClosedOnException + f8 = open("filename") # $ MISSING:Alert # not closed on exception f8.write("Error could occur") finally: if f8 is None: # We don't precisely consider this condition, so this result is MISSING. However, this seems uncommon. @@ -105,11 +105,11 @@ def opener_func2(name): return t1 def not_closed13(name): - f13 = open(name) # $ notClosed + f13 = open(name) # $ Alert f13.write("Hello") def may_not_be_closed14(name): - f14 = opener_func2(name) # $ notClosedOnException + f14 = opener_func2(name) # $ Alert # not closed on exception f14.write("Hello") f14.close() @@ -120,13 +120,13 @@ def closer2(t3): closer1(t3) def closed15(): - f15 = opener_func2() # $ SPURIOUS:notClosed + f15 = opener_func2() # $ SPURIOUS:Alert closer2(f15) # We don't detect that this call closes the file, so this result is SPURIOUS. def may_not_be_closed16(name): try: - f16 = open(name) # $ notClosedOnException + f16 = open(name) # $ Alert # not closed on exception f16.write("Hello") f16.close() except IOError: @@ -138,7 +138,7 @@ def may_raise(): #Not handling all exceptions, but we'll tolerate the false negative def not_closed17(): - f17 = open("filename") # $ MISSING:notClosedOnException + f17 = open("filename") # $ MISSING:Alert # not closed on exception try: f17.write("IOError could occur") f17.write("IOError could occur") @@ -234,7 +234,7 @@ def closed21(path): def not_closed22(path): - f22 = open(path, "wb") # $ MISSING:notClosedOnException + f22 = open(path, "wb") # $ MISSING:Alert # not closed on exception try: f22.write(b"foo") may_raise() @@ -245,7 +245,7 @@ def not_closed22(path): f22.close() def not_closed23(path): - f23 = open(path, "w") # $ notClosed + f23 = open(path, "w") # $ Alert wr = FileWrapper(f23) def closed24(path): @@ -266,7 +266,7 @@ def closed26(path): os.close(fd) def not_closed27(path): - fd = os.open(path, "w") # $notClosedOnException + fd = os.open(path, "w") # $Alert # not closed on exception f27 = os.fdopen(fd, "w") f27.write("hi") f27.close() @@ -282,6 +282,42 @@ def closed28(path): def closed29(path): # Due to an approximation in CFG reachability for performance, it is not detected that the `write` call that may raise occurs after the file has already been closed. # We presume this case to be uncommon. - f28 = open(path) # $SPURIOUS:notClosedOnException + f28 = open(path) # $SPURIOUS:Alert # not closed on exception f28.close() - f28.write("already closed") \ No newline at end of file + f28.write("already closed") + +# False positive: + +class NotWrapper: + def __init__(self, fp): + self.data = fp.read() + fp.close() + + def do_something(): + pass + +def closed30(path): + # Combination of approximations resulting in this FP: + # - NotWrapper is treated as a wrapper class as a file handle is passed to it + # - thing.do_something() is treated as a call that can raise an exception while a file is open + # - this call is treated as occurring after the open but not as being guarded by the with statement, as it is in the same basic block + + with open(path) as fp: # $SPURIOUS:Alert # not closed on exception + thing = NotWrapper(fp) + + thing.do_something() + + +def closed31(path): + with open(path) as fp: + data = fp.readline() + data2 = fp.readline() + + +class FlowReader(): + def __init__(self, f): + pass +def test_cannot_convert(tdata): + with open(tdata, "rb") as f: + flow_reader = FlowReader(f) + list(flow_reader.stream()) \ No newline at end of file diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/test.expected b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/test.expected deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/test.ql b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/test.ql deleted file mode 100644 index f176172d078..00000000000 --- a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/test.ql +++ /dev/null @@ -1,25 +0,0 @@ -import python -import Resources.FileNotAlwaysClosedQuery -import utils.test.InlineExpectationsTest - -module MethodArgTest implements TestSig { - string getARelevantTag() { result = ["notClosed", "notClosedOnException"] } - - predicate hasActualResult(Location location, string element, string tag, string value) { - exists(DataFlow::CfgNode el, FileOpen fo | - el = fo and - element = el.toString() and - location = el.getLocation() and - value = "" and - ( - fileNotClosed(fo) and - tag = "notClosed" - or - fileMayNotBeClosedOnException(fo, _) and - tag = "notClosedOnException" - ) - ) - } -} - -import MakeTest From 0b293eaba515ef2da98aa1d976a6ed7166f8412a Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Fri, 5 Sep 2025 22:43:21 +0100 Subject: [PATCH 06/49] Update test output --- .../FileNotAlwaysClosed.expected | 2 +- .../FileNotAlwaysClosed/resources_test.py | 31 +++++++++++++------ 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected index f5527589f80..ffa392b03f1 100644 --- a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected +++ b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected @@ -4,7 +4,7 @@ | resources_test.py:112:11:112:28 | ControlFlowNode for opener_func2() | File may not be closed if $@ raises an exception. | resources_test.py:113:5:113:22 | ControlFlowNode for Attribute() | this operation | | resources_test.py:123:11:123:24 | ControlFlowNode for opener_func2() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | | resources_test.py:129:15:129:24 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:130:9:130:26 | ControlFlowNode for Attribute() | this operation | +| resources_test.py:154:15:154:24 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:159:9:159:18 | ControlFlowNode for Attribute() | this operation | | resources_test.py:248:11:248:25 | ControlFlowNode for open() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | | resources_test.py:269:10:269:27 | ControlFlowNode for Attribute() | File may not be closed if $@ raises an exception. | resources_test.py:271:5:271:19 | ControlFlowNode for Attribute() | this operation | | resources_test.py:285:11:285:20 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:287:5:287:31 | ControlFlowNode for Attribute() | this operation | -| resources_test.py:305:10:305:19 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:308:5:308:24 | ControlFlowNode for Attribute() | this operation | diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py index 1eb380013c3..d0aba731182 100644 --- a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py +++ b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py @@ -151,11 +151,11 @@ def not_closed17(): #With statement will close the fp def closed18(path): try: - f18 = open(path) + f18 = open(path) # $SPURIOUS: Alert # Dataflow appears to not detect this with statement as guarding the exceptions produced by the `read()` call. except IOError as ex: print(ex) raise ex - with f18: + with f18: f18.read() class Closed19(object): @@ -286,7 +286,7 @@ def closed29(path): f28.close() f28.write("already closed") -# False positive: +# False positive in a previous implementation: class NotWrapper: def __init__(self, fp): @@ -297,12 +297,13 @@ class NotWrapper: pass def closed30(path): - # Combination of approximations resulting in this FP: + # Combination of approximations resulted in this FP: # - NotWrapper is treated as a wrapper class as a file handle is passed to it # - thing.do_something() is treated as a call that can raise an exception while a file is open # - this call is treated as occurring after the open but not as being guarded by the with statement, as it is in the same basic block + # - - this behaviour has been changed fixing the FP - with open(path) as fp: # $SPURIOUS:Alert # not closed on exception + with open(path) as fp: # No longer spurious alert here. thing = NotWrapper(fp) thing.do_something() @@ -314,10 +315,20 @@ def closed31(path): data2 = fp.readline() -class FlowReader(): +class Wrapper(): def __init__(self, f): + self.f = f + def read(self): + return self.f.read() + def __enter__(self): pass -def test_cannot_convert(tdata): - with open(tdata, "rb") as f: - flow_reader = FlowReader(f) - list(flow_reader.stream()) \ No newline at end of file + def __exit__(self): + self.f.close() + +def closed32(path): + with open(path, "rb") as f: # No longer spurious alert here. + wrap = Wrapper(f) + # This resulted in an FP in a previous implementation, + # due to a check that an operation is lexically contained within a `with` block (with `expr.getParent*()`) + # not detecting this case. + return list(wrap.read()) \ No newline at end of file From ff4c11f503755f0cbaddedd13df875eb5596ee7a Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Sat, 6 Sep 2025 00:45:15 +0100 Subject: [PATCH 07/49] Update test output. Accepting some FNs due to dataflow issue. --- .../Exceptions/general/CatchingBaseException.expected | 2 +- .../test/query-tests/Exceptions/general/EmptyExcept.expected | 3 +++ .../Exceptions/general/IllegalExceptionHandlerType.expected | 2 +- .../Exceptions/general/IncorrectExceptOrder.expected | 2 +- .../general/NotImplementedIsNotAnException.expected | 4 ++-- .../ql/test/query-tests/Exceptions/general/exceptions_test.py | 4 ++-- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/python/ql/test/query-tests/Exceptions/general/CatchingBaseException.expected b/python/ql/test/query-tests/Exceptions/general/CatchingBaseException.expected index 8cbb6d9c961..dbc838a90be 100644 --- a/python/ql/test/query-tests/Exceptions/general/CatchingBaseException.expected +++ b/python/ql/test/query-tests/Exceptions/general/CatchingBaseException.expected @@ -1,2 +1,2 @@ | exceptions_test.py:7:5:7:11 | ExceptStmt | Except block directly handles BaseException. | -| exceptions_test.py:71:5:71:25 | ExceptStmt | Except block directly handles BaseException. | +| exceptions_test.py:97:5:97:25 | ExceptStmt | Except block directly handles BaseException. | diff --git a/python/ql/test/query-tests/Exceptions/general/EmptyExcept.expected b/python/ql/test/query-tests/Exceptions/general/EmptyExcept.expected index 57c50449af8..f9d9c69dd87 100644 --- a/python/ql/test/query-tests/Exceptions/general/EmptyExcept.expected +++ b/python/ql/test/query-tests/Exceptions/general/EmptyExcept.expected @@ -1,2 +1,5 @@ | exceptions_test.py:7:5:7:11 | ExceptStmt | 'except' clause does nothing but pass and there is no explanatory comment. | | exceptions_test.py:13:5:13:21 | ExceptStmt | 'except' clause does nothing but pass and there is no explanatory comment. | +| exceptions_test.py:72:1:72:18 | ExceptStmt | 'except' clause does nothing but pass and there is no explanatory comment. | +| exceptions_test.py:85:1:85:17 | ExceptStmt | 'except' clause does nothing but pass and there is no explanatory comment. | +| exceptions_test.py:89:1:89:17 | ExceptStmt | 'except' clause does nothing but pass and there is no explanatory comment. | diff --git a/python/ql/test/query-tests/Exceptions/general/IllegalExceptionHandlerType.expected b/python/ql/test/query-tests/Exceptions/general/IllegalExceptionHandlerType.expected index 0864dd0fe30..5ba0c716371 100644 --- a/python/ql/test/query-tests/Exceptions/general/IllegalExceptionHandlerType.expected +++ b/python/ql/test/query-tests/Exceptions/general/IllegalExceptionHandlerType.expected @@ -1,4 +1,4 @@ | exceptions_test.py:51:5:51:25 | ExceptStmt | Non-exception $@ in exception handler which will never match raised exception. | exceptions_test.py:33:1:33:28 | ControlFlowNode for ClassExpr | class 'NotException1' | | exceptions_test.py:54:5:54:25 | ExceptStmt | Non-exception $@ in exception handler which will never match raised exception. | exceptions_test.py:36:1:36:28 | ControlFlowNode for ClassExpr | class 'NotException2' | -| exceptions_test.py:112:5:112:22 | ExceptStmt | Non-exception $@ in exception handler which will never match raised exception. | exceptions_test.py:107:12:107:14 | ControlFlowNode for FloatLiteral | instance of 'float' | +| exceptions_test.py:138:5:138:22 | ExceptStmt | Non-exception $@ in exception handler which will never match raised exception. | exceptions_test.py:133:12:133:14 | ControlFlowNode for FloatLiteral | instance of 'float' | | pypy_test.py:14:5:14:14 | ExceptStmt | Non-exception $@ in exception handler which will never match raised exception. | pypy_test.py:14:12:14:13 | ControlFlowNode for IntegerLiteral | instance of 'int' | diff --git a/python/ql/test/query-tests/Exceptions/general/IncorrectExceptOrder.expected b/python/ql/test/query-tests/Exceptions/general/IncorrectExceptOrder.expected index 160d5176724..3fab57be376 100644 --- a/python/ql/test/query-tests/Exceptions/general/IncorrectExceptOrder.expected +++ b/python/ql/test/query-tests/Exceptions/general/IncorrectExceptOrder.expected @@ -1 +1 @@ -| exceptions_test.py:64:1:64:22 | ExceptStmt | Except block for $@ is unreachable; the more general $@ for $@ will always be executed in preference. | file://:0:0:0:0 | builtin-class AttributeError | AttributeError | exceptions_test.py:62:1:62:17 | ExceptStmt | except block | file://:0:0:0:0 | builtin-class Exception | Exception | +| exceptions_test.py:64:1:64:22 | ExceptStmt | This except block handling $@ is unreachable; as $@ for the more general $@ always subsumes it. | file://:0:0:0:0 | AttributeError | AttributeError | exceptions_test.py:62:1:62:17 | ExceptStmt | this except block | file://:0:0:0:0 | Exception | Exception | diff --git a/python/ql/test/query-tests/Exceptions/general/NotImplementedIsNotAnException.expected b/python/ql/test/query-tests/Exceptions/general/NotImplementedIsNotAnException.expected index 7c5ee490b4e..0bb863ccfed 100644 --- a/python/ql/test/query-tests/Exceptions/general/NotImplementedIsNotAnException.expected +++ b/python/ql/test/query-tests/Exceptions/general/NotImplementedIsNotAnException.expected @@ -1,2 +1,2 @@ -| exceptions_test.py:170:11:170:24 | NotImplemented | NotImplemented is not an Exception. Did you mean NotImplementedError? | -| exceptions_test.py:173:11:173:26 | NotImplemented() | NotImplemented is not an Exception. Did you mean NotImplementedError? | +| exceptions_test.py:196:11:196:24 | NotImplemented | NotImplemented is not an Exception. Did you mean NotImplementedError? | +| exceptions_test.py:199:11:199:26 | NotImplemented() | NotImplemented is not an Exception. Did you mean NotImplementedError? | diff --git a/python/ql/test/query-tests/Exceptions/general/exceptions_test.py b/python/ql/test/query-tests/Exceptions/general/exceptions_test.py index 291b3cb30e0..cf197683f15 100644 --- a/python/ql/test/query-tests/Exceptions/general/exceptions_test.py +++ b/python/ql/test/query-tests/Exceptions/general/exceptions_test.py @@ -71,7 +71,7 @@ try: pass except ValueError: pass -except MyExc: # $Alert[py/unreachable-except] +except MyExc: # $MISSING:Alert[py/unreachable-except] # Missing due to dataflow limitiation preventing MyExc from being tracked here. pass class MyBaseExc(Exception): @@ -84,7 +84,7 @@ try: pass except MyBaseExc: pass -except MySubExc: # $Alert[py/unreachable-except] +except MySubExc: # $MISSING:Alert[py/unreachable-except] # Missing due to dataflow limitation preventing MyExc from being tracked here. pass except Exception: pass From e382f7cd43fc5417e59cdda5ff9032f65109febb Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Tue, 9 Sep 2025 11:26:17 +0100 Subject: [PATCH 08/49] Improve check for containment in with statement --- python/ql/src/Resources/FileNotAlwaysClosedQuery.qll | 6 ++++++ .../Resources/FileNotAlwaysClosed/resources_test.py | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll b/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll index 94d34d9abc5..36807ca39f1 100644 --- a/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll +++ b/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll @@ -88,6 +88,12 @@ class WithStatement extends FileClose { With w; WithStatement() { this.asExpr() = w.getContextExpr() } + + override predicate guardsExceptions(DataFlow::CfgNode fileRaises) { + super.guardsExceptions(fileRaises) + or + w.getBody().contains(fileRaises.asExpr()) + } } /** Holds if an exception may be raised at `raises` if `file` is a file object. */ diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py index d0aba731182..0f9edc02803 100644 --- a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py +++ b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py @@ -151,7 +151,7 @@ def not_closed17(): #With statement will close the fp def closed18(path): try: - f18 = open(path) # $SPURIOUS: Alert # Dataflow appears to not detect this with statement as guarding the exceptions produced by the `read()` call. + f18 = open(path) # $Alert except IOError as ex: print(ex) raise ex @@ -301,7 +301,7 @@ def closed30(path): # - NotWrapper is treated as a wrapper class as a file handle is passed to it # - thing.do_something() is treated as a call that can raise an exception while a file is open # - this call is treated as occurring after the open but not as being guarded by the with statement, as it is in the same basic block - # - - this behaviour has been changed fixing the FP + # - - this behavior has been changed fixing the FP with open(path) as fp: # No longer spurious alert here. thing = NotWrapper(fp) From b01b40b51b8b55a72c50a477d187fdd3e557550b Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Tue, 9 Sep 2025 13:44:03 +0100 Subject: [PATCH 09/49] Update test output --- .../FileNotAlwaysClosed/FileNotAlwaysClosed.expected | 4 +++- .../Resources/FileNotAlwaysClosed/resources_test.py | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected index ffa392b03f1..579424e9318 100644 --- a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected +++ b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected @@ -1,10 +1,12 @@ +#select | resources_test.py:4:10:4:25 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:5:5:5:33 | ControlFlowNode for Attribute() | this operation | | resources_test.py:9:10:9:25 | ControlFlowNode for open() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | | resources_test.py:108:11:108:20 | ControlFlowNode for open() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | | resources_test.py:112:11:112:28 | ControlFlowNode for opener_func2() | File may not be closed if $@ raises an exception. | resources_test.py:113:5:113:22 | ControlFlowNode for Attribute() | this operation | | resources_test.py:123:11:123:24 | ControlFlowNode for opener_func2() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | | resources_test.py:129:15:129:24 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:130:9:130:26 | ControlFlowNode for Attribute() | this operation | -| resources_test.py:154:15:154:24 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:159:9:159:18 | ControlFlowNode for Attribute() | this operation | | resources_test.py:248:11:248:25 | ControlFlowNode for open() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | | resources_test.py:269:10:269:27 | ControlFlowNode for Attribute() | File may not be closed if $@ raises an exception. | resources_test.py:271:5:271:19 | ControlFlowNode for Attribute() | this operation | | resources_test.py:285:11:285:20 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:287:5:287:31 | ControlFlowNode for Attribute() | this operation | +testFailures +| resources_test.py:154:26:154:154 | Comment # $SPURIOUS: Alert # Dataflow appears to not detect this with statement as guarding the exceptions produced by the `read()` call. | Fixed spurious result: Alert | diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py index 0f9edc02803..972cc3a7be2 100644 --- a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py +++ b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py @@ -293,7 +293,7 @@ class NotWrapper: self.data = fp.read() fp.close() - def do_something(): + def do_something(self): pass def closed30(path): @@ -322,7 +322,7 @@ class Wrapper(): return self.f.read() def __enter__(self): pass - def __exit__(self): + def __exit__(self,exc_type, exc_value,traceback): self.f.close() def closed32(path): From ec40ea800d37886764f27b2af3f633f9675e3471 Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Tue, 9 Sep 2025 13:46:52 +0100 Subject: [PATCH 10/49] Update qldoc --- python/ql/src/Resources/FileNotAlwaysClosedQuery.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll b/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll index 36807ca39f1..9d91e4f523c 100644 --- a/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll +++ b/python/ql/src/Resources/FileNotAlwaysClosedQuery.qll @@ -52,7 +52,7 @@ class FileWrapperCall extends DataFlow::CallCfgNode { /** A node where a file is closed. */ abstract class FileClose extends DataFlow::CfgNode { - /** Holds if this file close will occur if an exception is raised at `raises`. */ + /** Holds if this file close will occur if an exception is raised at `fileRaises`. */ predicate guardsExceptions(DataFlow::CfgNode fileRaises) { // The close call occurs after an exception edge in the cfg (a catch or finally) bbReachableRefl(fileRaises.asCfgNode().getBasicBlock().getAnExceptionalSuccessor(), From ea562de3e6fa57ea279729b8cfc9f7d68e9530fe Mon Sep 17 00:00:00 2001 From: Joe Farebrother Date: Tue, 9 Sep 2025 15:17:16 +0100 Subject: [PATCH 11/49] Fix tests --- .../Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected | 3 --- .../Resources/FileNotAlwaysClosed/resources_test.py | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected index 579424e9318..7f48feb72eb 100644 --- a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected +++ b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/FileNotAlwaysClosed.expected @@ -1,4 +1,3 @@ -#select | resources_test.py:4:10:4:25 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:5:5:5:33 | ControlFlowNode for Attribute() | this operation | | resources_test.py:9:10:9:25 | ControlFlowNode for open() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | | resources_test.py:108:11:108:20 | ControlFlowNode for open() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | @@ -8,5 +7,3 @@ | resources_test.py:248:11:248:25 | ControlFlowNode for open() | File is opened but is not closed. | file://:0:0:0:0 | (none) | this operation | | resources_test.py:269:10:269:27 | ControlFlowNode for Attribute() | File may not be closed if $@ raises an exception. | resources_test.py:271:5:271:19 | ControlFlowNode for Attribute() | this operation | | resources_test.py:285:11:285:20 | ControlFlowNode for open() | File may not be closed if $@ raises an exception. | resources_test.py:287:5:287:31 | ControlFlowNode for Attribute() | this operation | -testFailures -| resources_test.py:154:26:154:154 | Comment # $SPURIOUS: Alert # Dataflow appears to not detect this with statement as guarding the exceptions produced by the `read()` call. | Fixed spurious result: Alert | diff --git a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py index 972cc3a7be2..15ba9393715 100644 --- a/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py +++ b/python/ql/test/query-tests/Resources/FileNotAlwaysClosed/resources_test.py @@ -151,7 +151,7 @@ def not_closed17(): #With statement will close the fp def closed18(path): try: - f18 = open(path) # $Alert + f18 = open(path) except IOError as ex: print(ex) raise ex From 459f00ab415e1263c0756a03516e51e9963adc52 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:25:11 +0000 Subject: [PATCH 12/49] Initial plan From e630bf86bdd0f9a678b234f04f11f4ba883b5571 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 15 Sep 2025 11:44:05 +0000 Subject: [PATCH 13/49] Implement Rust non-HTTPS URL query (CWE-319) Co-authored-by: geoffw0 <40627776+geoffw0@users.noreply.github.com> --- .../rust-code-scanning.qls.expected | 1 + .../rust-security-and-quality.qls.expected | 1 + .../rust-security-extended.qls.expected | 1 + .../rust/security/UseOfHttpExtensions.qll | 60 + .../change-notes/2025-09-15-non-https-url.md | 4 + .../queries/security/CWE-319/UseOfHttp.qhelp | 48 + .../src/queries/security/CWE-319/UseOfHttp.ql | 42 + .../queries/security/CWE-319/UseOfHttpBad.rs | 10 + .../queries/security/CWE-319/UseOfHttpGood.rs | 10 + rust/ql/src/queries/summary/Stats.qll | 1 + .../query-tests/security/CWE-319/Cargo.lock | 1574 +++++++++++++++++ .../security/CWE-319/UseOfHttp.expected | 78 + .../security/CWE-319/UseOfHttp.qlref | 4 + .../test/query-tests/security/CWE-319/main.rs | 65 + .../query-tests/security/CWE-319/options.yml | 3 + 15 files changed, 1902 insertions(+) create mode 100644 rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll create mode 100644 rust/ql/src/change-notes/2025-09-15-non-https-url.md create mode 100644 rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp create mode 100644 rust/ql/src/queries/security/CWE-319/UseOfHttp.ql create mode 100644 rust/ql/src/queries/security/CWE-319/UseOfHttpBad.rs create mode 100644 rust/ql/src/queries/security/CWE-319/UseOfHttpGood.rs create mode 100644 rust/ql/test/query-tests/security/CWE-319/Cargo.lock create mode 100644 rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected create mode 100644 rust/ql/test/query-tests/security/CWE-319/UseOfHttp.qlref create mode 100644 rust/ql/test/query-tests/security/CWE-319/main.rs create mode 100644 rust/ql/test/query-tests/security/CWE-319/options.yml diff --git a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected index b601905e6a3..1b8e1015a1f 100644 --- a/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-code-scanning.qls.expected @@ -14,6 +14,7 @@ ql/rust/ql/src/queries/security/CWE-089/SqlInjection.ql ql/rust/ql/src/queries/security/CWE-311/CleartextTransmission.ql ql/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql ql/rust/ql/src/queries/security/CWE-312/CleartextStorageDatabase.ql +ql/rust/ql/src/queries/security/CWE-319/UseOfHttp.ql ql/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.ql ql/rust/ql/src/queries/security/CWE-328/WeakSensitiveDataHashing.ql ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected index 074cb2ec888..a2d2e2b820c 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-and-quality.qls.expected @@ -15,6 +15,7 @@ ql/rust/ql/src/queries/security/CWE-117/LogInjection.ql ql/rust/ql/src/queries/security/CWE-311/CleartextTransmission.ql ql/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql ql/rust/ql/src/queries/security/CWE-312/CleartextStorageDatabase.ql +ql/rust/ql/src/queries/security/CWE-319/UseOfHttp.ql ql/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.ql ql/rust/ql/src/queries/security/CWE-328/WeakSensitiveDataHashing.ql ql/rust/ql/src/queries/security/CWE-696/BadCtorInitialization.ql diff --git a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected index 38846e281eb..9000990ad84 100644 --- a/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected +++ b/rust/ql/integration-tests/query-suite/rust-security-extended.qls.expected @@ -15,6 +15,7 @@ ql/rust/ql/src/queries/security/CWE-117/LogInjection.ql ql/rust/ql/src/queries/security/CWE-311/CleartextTransmission.ql ql/rust/ql/src/queries/security/CWE-312/CleartextLogging.ql ql/rust/ql/src/queries/security/CWE-312/CleartextStorageDatabase.ql +ql/rust/ql/src/queries/security/CWE-319/UseOfHttp.ql ql/rust/ql/src/queries/security/CWE-327/BrokenCryptoAlgorithm.ql ql/rust/ql/src/queries/security/CWE-328/WeakSensitiveDataHashing.ql ql/rust/ql/src/queries/security/CWE-770/UncontrolledAllocationSize.ql diff --git a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll new file mode 100644 index 00000000000..026880785b6 --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll @@ -0,0 +1,60 @@ +/** + * Provides classes and predicates for reasoning about the use of + * non-HTTPS URLs in Rust code. + */ + +import rust +private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.FlowSink +private import codeql.rust.elements.LiteralExprExt +private import codeql.rust.Concepts + +/** + * Provides default sources, sinks and barriers for detecting use of + * non-HTTPS URLs, as well as extension points for adding your own. + */ +module UseOfHttp { + /** + * A data flow source for use of non-HTTPS URLs. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for use of non-HTTPS URLs. + */ + abstract class Sink extends QuerySink::Range { + override string getSinkType() { result = "UseOfHttp" } + } + + /** + * A barrier for use of non-HTTPS URLs. + */ + abstract class Barrier extends DataFlow::Node { } + + /** + * A string containing an HTTP URL. + */ + class HttpStringLiteral extends StringLiteralExpr { + HttpStringLiteral() { + exists(string s | this.getTextValue() = s | + // Match HTTP URLs that are not private/local + s.regexpMatch("\"http://.*\"") and + not s.regexpMatch("\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.16\\.[0-9]+\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"") + ) + } + } + + /** + * An HTTP string literal as a source. + */ + private class HttpStringLiteralAsSource extends Source { + HttpStringLiteralAsSource() { this.asExpr().getExpr() instanceof HttpStringLiteral } + } + + /** + * A sink for use of HTTP URLs from model data. + */ + private class ModelsAsDataSink extends Sink { + ModelsAsDataSink() { sinkNode(this, "request-url") } + } +} diff --git a/rust/ql/src/change-notes/2025-09-15-non-https-url.md b/rust/ql/src/change-notes/2025-09-15-non-https-url.md new file mode 100644 index 00000000000..c4ab664f732 --- /dev/null +++ b/rust/ql/src/change-notes/2025-09-15-non-https-url.md @@ -0,0 +1,4 @@ +--- +category: newQuery +--- +* Added a new query, `rust/non-https-url`, for detecting the use of non-HTTPS URLs that can be intercepted by third parties. \ No newline at end of file diff --git a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp new file mode 100644 index 00000000000..a8ca1d9c7c7 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp @@ -0,0 +1,48 @@ + + + + +

    Constructing URLs with the HTTP protocol can lead to unsecured connections.

    + +

    Furthermore, constructing URLs with the HTTP protocol can create problems if other parts of the +code expect HTTPS URLs. A typical pattern is to use libraries that expect secure connections, +which may fail or fall back to insecure behavior when provided with HTTP URLs instead of HTTPS URLs.

    + +
    + + +

    When you construct a URL for network requests, ensure that you use an HTTPS URL rather than an HTTP URL. +Then, any connections that are made using that URL are secure SSL/TLS connections.

    + +
    + + +

    The following example shows two ways of making a network request using a URL. When the request is +made using an HTTP URL rather than an HTTPS URL, the connection is unsecured and can be intercepted +by attackers. When the request is made using an HTTPS URL, the connection is a secure SSL/TLS connection.

    + + + +

    A better approach is to use HTTPS:

    + + + +
    + + +
  • +OWASP: +Transport Layer Protection Cheat Sheet. +
  • +
  • +OWASP Top 10: +A08:2021 - Software and Data Integrity Failures. +
  • +
  • Rust reqwest documentation: +reqwest crate. +
  • + +
    +
    \ No newline at end of file diff --git a/rust/ql/src/queries/security/CWE-319/UseOfHttp.ql b/rust/ql/src/queries/security/CWE-319/UseOfHttp.ql new file mode 100644 index 00000000000..4a464d90bbe --- /dev/null +++ b/rust/ql/src/queries/security/CWE-319/UseOfHttp.ql @@ -0,0 +1,42 @@ +/** + * @name Failure to use HTTPS URLs + * @description Non-HTTPS connections can be intercepted by third parties. + * @kind path-problem + * @problem.severity warning + * @security-severity 8.1 + * @precision high + * @id rust/non-https-url + * @tags security + * external/cwe/cwe-319 + * external/cwe/cwe-345 + */ + +import rust +import codeql.rust.dataflow.DataFlow +import codeql.rust.dataflow.TaintTracking +import codeql.rust.security.UseOfHttpExtensions + +/** + * A taint configuration for HTTP URL strings that flow to URL-using sinks. + */ +module UseOfHttpConfig implements DataFlow::ConfigSig { + import UseOfHttp + + predicate isSource(DataFlow::Node node) { node instanceof Source } + + predicate isSink(DataFlow::Node node) { node instanceof Sink } + + predicate isBarrier(DataFlow::Node barrier) { barrier instanceof Barrier } + + predicate observeDiffInformedIncrementalMode() { any() } +} + +module UseOfHttpFlow = TaintTracking::Global; + +import UseOfHttpFlow::PathGraph + +from UseOfHttpFlow::PathNode sourceNode, UseOfHttpFlow::PathNode sinkNode +where UseOfHttpFlow::flowPath(sourceNode, sinkNode) +select sinkNode.getNode(), sourceNode, sinkNode, + "This URL may be constructed with the HTTP protocol, from $@.", sourceNode.getNode(), + "this HTTP URL" diff --git a/rust/ql/src/queries/security/CWE-319/UseOfHttpBad.rs b/rust/ql/src/queries/security/CWE-319/UseOfHttpBad.rs new file mode 100644 index 00000000000..ada466cae5c --- /dev/null +++ b/rust/ql/src/queries/security/CWE-319/UseOfHttpBad.rs @@ -0,0 +1,10 @@ +// BAD: Using HTTP URL which can be intercepted +use reqwest; + +fn main() { + let url = "http://example.com/sensitive-data"; + + // This makes an insecure HTTP request that can be intercepted + let response = reqwest::blocking::get(url).unwrap(); + println!("Response: {}", response.text().unwrap()); +} \ No newline at end of file diff --git a/rust/ql/src/queries/security/CWE-319/UseOfHttpGood.rs b/rust/ql/src/queries/security/CWE-319/UseOfHttpGood.rs new file mode 100644 index 00000000000..22b94235fa1 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-319/UseOfHttpGood.rs @@ -0,0 +1,10 @@ +// GOOD: Using HTTPS URL which provides encryption +use reqwest; + +fn main() { + let url = "https://example.com/sensitive-data"; + + // This makes a secure HTTPS request that is encrypted + let response = reqwest::blocking::get(url).unwrap(); + println!("Response: {}", response.text().unwrap()); +} \ No newline at end of file diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 7a1de4f1314..d49e1fdde5d 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -27,6 +27,7 @@ private import codeql.rust.security.LogInjectionExtensions private import codeql.rust.security.SqlInjectionExtensions private import codeql.rust.security.TaintedPathExtensions private import codeql.rust.security.UncontrolledAllocationSizeExtensions +private import codeql.rust.security.UseOfHttpExtensions private import codeql.rust.security.WeakSensitiveDataHashingExtensions private import codeql.rust.security.HardcodedCryptographicValueExtensions diff --git a/rust/ql/test/query-tests/security/CWE-319/Cargo.lock b/rust/ql/test/query-tests/security/CWE-319/Cargo.lock new file mode 100644 index 00000000000..ad4b5cebd22 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-319/Cargo.lock @@ -0,0 +1,1574 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "2.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65193589c6404eb80b450d618eaf9a2cafaaafd57ecce47370519ef674a7bd44" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.0", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "find-msvc-tools" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd99930f64d146689264c637b5af2f0233a933bef0d8570e2526bf9e083192d" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.5+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +dependencies = [ + "base64", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206a8042aec68fa4a62e8d3f7aa4ceb508177d9324faf261e1959e495b7a1921" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0b063578492ceec17683ef2f8c5e89121fbd0b172cbc280635ab7567db2738" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "log" +version = "0.4.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "reqwest" +version = "0.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.0", +] + +[[package]] +name = "rustls" +version = "0.23.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5a37813727b78798e53c2bec3f5e8fe12a6d6f8389bf9ca7802add4c9905ad8" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.0", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.223" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a505d71960adde88e293da5cb5eda57093379f64e61cf77bf0e6a63af07a7bac" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.223" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20f57cbd357666aa7b3ac84a90b4ea328f1d4ddb6772b430caa5d9e1309bb9e9" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.223" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d428d07faf17e306e699ec1e91996e5a165ba5d6bce5b5155173e91a8a01a56" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.61.0", +] + +[[package]] +name = "test" +version = "0.0.1" +dependencies = [ + "reqwest", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes", + "io-uring", + "libc", + "mio", + "pin-project-lite", + "slab", + "socket2", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.5+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4494f6290a82f5fe584817a676a34b9d6763e8d9d18204009fb31dceca98fd4" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.0+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03fa2761397e5bd52002cd7e73110c71af2109aca4e521a9f40473fe685b0a24" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e14915cadd45b529bb8d1f343c4ed0ac1de926144b746e2710f9cd05df6603b" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28d1ba982ca7923fd01448d5c30c6864d0a14109560296a162f80f305fb93bb" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ca85039a9b469b38336411d6d6ced91f3fc87109a2a27b0c197663f5144dffe" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c3d463ae3eff775b0c45df9da45d68837702ac35af998361e2c84e7c5ec1b0d" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bb4ce89b08211f923caf51d527662b75bdc9c9c7aab40f86dcb9fb85ac552aa" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f143854a3b13752c6950862c906306adb27c7e839f7414cec8fea35beab624c1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e4b637749ff0d92b8fad63aa1f7cff3cbe125fd49c175cd6345e7272638b12" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-sys" +version = "0.61.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" +dependencies = [ + "windows-link 0.2.0", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "wit-bindgen" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c573471f125075647d03df72e026074b7203790d41351cd6edc96f46bcccd36" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected new file mode 100644 index 00000000000..53cc8606cc8 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected @@ -0,0 +1,78 @@ +#select +| main.rs:12:22:12:43 | ...::get | main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:22:12:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:12:45:12:68 | "http://example.com/api" | this HTTP URL | +| main.rs:13:22:13:43 | ...::get | main.rs:13:45:13:73 | "http://api.example.com/data" | main.rs:13:22:13:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:13:45:13:73 | "http://api.example.com/data" | this HTTP URL | +| main.rs:25:21:25:42 | ...::get | main.rs:22:20:22:39 | "http://example.com" | main.rs:25:21:25:42 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:22:20:22:39 | "http://example.com" | this HTTP URL | +| main.rs:36:30:36:51 | ...::get | main.rs:33:20:33:28 | "http://" | main.rs:36:30:36:51 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:33:20:33:28 | "http://" | this HTTP URL | +| main.rs:60:21:60:42 | ...::get | main.rs:59:15:59:49 | "http://example.com/sensitive-... | main.rs:60:21:60:42 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:59:15:59:49 | "http://example.com/sensitive-... | this HTTP URL | +edges +| main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:22:12:43 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:13:45:13:73 | "http://api.example.com/data" | main.rs:13:22:13:43 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:22:9:22:16 | base_url | main.rs:24:28:24:53 | MacroExpr | provenance | | +| main.rs:22:20:22:39 | "http://example.com" | main.rs:22:9:22:16 | base_url | provenance | | +| main.rs:24:9:24:16 | full_url | main.rs:25:45:25:52 | full_url | provenance | | +| main.rs:24:20:24:26 | res | main.rs:24:28:24:53 | { ... } | provenance | | +| main.rs:24:28:24:53 | ...::format(...) | main.rs:24:20:24:26 | res | provenance | | +| main.rs:24:28:24:53 | ...::must_use(...) | main.rs:24:9:24:16 | full_url | provenance | | +| main.rs:24:28:24:53 | MacroExpr | main.rs:24:28:24:53 | ...::format(...) | provenance | MaD:2 | +| main.rs:24:28:24:53 | { ... } | main.rs:24:28:24:53 | ...::must_use(...) | provenance | MaD:3 | +| main.rs:25:44:25:52 | &full_url [&ref] | main.rs:25:21:25:42 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:25:45:25:52 | full_url | main.rs:25:44:25:52 | &full_url [&ref] | provenance | | +| main.rs:33:9:33:16 | protocol | main.rs:35:32:35:53 | MacroExpr | provenance | | +| main.rs:33:20:33:28 | "http://" | main.rs:33:9:33:16 | protocol | provenance | | +| main.rs:35:9:35:20 | insecure_url | main.rs:36:54:36:65 | insecure_url | provenance | | +| main.rs:35:24:35:30 | res | main.rs:35:32:35:53 | { ... } | provenance | | +| main.rs:35:32:35:53 | ...::format(...) | main.rs:35:24:35:30 | res | provenance | | +| main.rs:35:32:35:53 | ...::must_use(...) | main.rs:35:9:35:20 | insecure_url | provenance | | +| main.rs:35:32:35:53 | MacroExpr | main.rs:35:32:35:53 | ...::format(...) | provenance | MaD:2 | +| main.rs:35:32:35:53 | { ... } | main.rs:35:32:35:53 | ...::must_use(...) | provenance | MaD:3 | +| main.rs:36:53:36:65 | &insecure_url [&ref] | main.rs:36:30:36:51 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:36:54:36:65 | insecure_url | main.rs:36:53:36:65 | &insecure_url [&ref] | provenance | | +| main.rs:59:9:59:11 | url | main.rs:60:44:60:46 | url | provenance | | +| main.rs:59:15:59:49 | "http://example.com/sensitive-... | main.rs:59:9:59:11 | url | provenance | | +| main.rs:60:44:60:46 | url | main.rs:60:21:60:42 | ...::get | provenance | MaD:1 Sink:MaD:1 | +models +| 1 | Sink: reqwest::blocking::get; Argument[0]; request-url | +| 2 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 3 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +nodes +| main.rs:12:22:12:43 | ...::get | semmle.label | ...::get | +| main.rs:12:45:12:68 | "http://example.com/api" | semmle.label | "http://example.com/api" | +| main.rs:13:22:13:43 | ...::get | semmle.label | ...::get | +| main.rs:13:45:13:73 | "http://api.example.com/data" | semmle.label | "http://api.example.com/data" | +| main.rs:22:9:22:16 | base_url | semmle.label | base_url | +| main.rs:22:20:22:39 | "http://example.com" | semmle.label | "http://example.com" | +| main.rs:24:9:24:16 | full_url | semmle.label | full_url | +| main.rs:24:20:24:26 | res | semmle.label | res | +| main.rs:24:28:24:53 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:24:28:24:53 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:24:28:24:53 | MacroExpr | semmle.label | MacroExpr | +| main.rs:24:28:24:53 | { ... } | semmle.label | { ... } | +| main.rs:25:21:25:42 | ...::get | semmle.label | ...::get | +| main.rs:25:44:25:52 | &full_url [&ref] | semmle.label | &full_url [&ref] | +| main.rs:25:45:25:52 | full_url | semmle.label | full_url | +| main.rs:33:9:33:16 | protocol | semmle.label | protocol | +| main.rs:33:20:33:28 | "http://" | semmle.label | "http://" | +| main.rs:35:9:35:20 | insecure_url | semmle.label | insecure_url | +| main.rs:35:24:35:30 | res | semmle.label | res | +| main.rs:35:32:35:53 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:35:32:35:53 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:35:32:35:53 | MacroExpr | semmle.label | MacroExpr | +| main.rs:35:32:35:53 | { ... } | semmle.label | { ... } | +| main.rs:36:30:36:51 | ...::get | semmle.label | ...::get | +| main.rs:36:53:36:65 | &insecure_url [&ref] | semmle.label | &insecure_url [&ref] | +| main.rs:36:54:36:65 | insecure_url | semmle.label | insecure_url | +| main.rs:59:9:59:11 | url | semmle.label | url | +| main.rs:59:15:59:49 | "http://example.com/sensitive-... | semmle.label | "http://example.com/sensitive-... | +| main.rs:60:21:60:42 | ...::get | semmle.label | ...::get | +| main.rs:60:44:60:46 | url | semmle.label | url | +subpaths +testFailures +| main.rs:22:20:22:39 | "http://example.com" | Unexpected result: Source | +| main.rs:22:42:22:71 | //... | Missing result: Alert[rust/non-https-url] | +| main.rs:25:21:25:42 | ...::get | Unexpected result: Alert | +| main.rs:33:20:33:28 | "http://" | Unexpected result: Source | +| main.rs:33:31:33:60 | //... | Missing result: Alert[rust/non-https-url] | +| main.rs:36:30:36:51 | ...::get | Unexpected result: Alert | +| main.rs:59:15:59:49 | "http://example.com/sensitive-... | Unexpected result: Source | +| main.rs:59:52:59:81 | //... | Missing result: Alert[rust/non-https-url] | +| main.rs:60:21:60:42 | ...::get | Unexpected result: Alert | diff --git a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.qlref b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.qlref new file mode 100644 index 00000000000..90b53330019 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-319/UseOfHttp.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql \ No newline at end of file diff --git a/rust/ql/test/query-tests/security/CWE-319/main.rs b/rust/ql/test/query-tests/security/CWE-319/main.rs new file mode 100644 index 00000000000..ae58967a49b --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-319/main.rs @@ -0,0 +1,65 @@ +use reqwest; +use std::env; + +fn main() { + test_direct_literals(); + test_dynamic_urls(); + test_localhost_exemptions(); +} + +fn test_direct_literals() { + // BAD: Direct HTTP URLs that should be flagged + let _response1 = reqwest::blocking::get("http://example.com/api").unwrap(); // $ Alert[rust/non-https-url] + let _response2 = reqwest::blocking::get("http://api.example.com/data").unwrap(); // $ Alert[rust/non-https-url] + + // GOOD: HTTPS URLs that should not be flagged + let _response3 = reqwest::blocking::get("https://example.com/api").unwrap(); + let _response4 = reqwest::blocking::get("https://api.example.com/data").unwrap(); +} + +fn test_dynamic_urls() { + // BAD: HTTP URLs constructed dynamically + let base_url = "http://example.com"; // $ Alert[rust/non-https-url] + let endpoint = "/api/users"; + let full_url = format!("{}{}", base_url, endpoint); + let _response = reqwest::blocking::get(&full_url).unwrap(); + + // GOOD: HTTPS URLs constructed dynamically + let secure_base = "https://example.com"; + let secure_full = format!("{}{}", secure_base, endpoint); + let _secure_response = reqwest::blocking::get(&secure_full).unwrap(); + + // BAD: HTTP protocol string + let protocol = "http://"; // $ Alert[rust/non-https-url] + let host = "api.example.com"; + let insecure_url = format!("{}{}", protocol, host); + let _insecure_response = reqwest::blocking::get(&insecure_url).unwrap(); + + // GOOD: HTTPS protocol string + let secure_protocol = "https://"; + let secure_url = format!("{}{}", secure_protocol, host); + let _secure_response2 = reqwest::blocking::get(&secure_url).unwrap(); +} + +fn test_localhost_exemptions() { + // GOOD: localhost URLs should not be flagged (local development) + let _local1 = reqwest::blocking::get("http://localhost:8080/api").unwrap(); + let _local2 = reqwest::blocking::get("http://127.0.0.1:3000/test").unwrap(); + let _local3 = reqwest::blocking::get("http://192.168.1.100/internal").unwrap(); + let _local4 = reqwest::blocking::get("http://10.0.0.1/admin").unwrap(); + + // Test IPv6 localhost variants + let _local5 = reqwest::blocking::get("http://[::1]:8080/api").unwrap(); + let _local6 = reqwest::blocking::get("http://[0:0:0:0:0:0:0:1]/test").unwrap(); +} + +// Additional test cases that mirror the Bad/Good examples +fn test_examples() { + // From UseOfHttpBad.rs - BAD case + let url = "http://example.com/sensitive-data"; // $ Alert[rust/non-https-url] + let _response = reqwest::blocking::get(url).unwrap(); + + // From UseOfHttpGood.rs - GOOD case + let secure_url = "https://example.com/sensitive-data"; + let _secure_response = reqwest::blocking::get(secure_url).unwrap(); +} \ No newline at end of file diff --git a/rust/ql/test/query-tests/security/CWE-319/options.yml b/rust/ql/test/query-tests/security/CWE-319/options.yml new file mode 100644 index 00000000000..aa57719603d --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-319/options.yml @@ -0,0 +1,3 @@ +qltest_cargo_check: true +qltest_dependencies: + - reqwest = { version = "0.12.9", features = ["blocking"] } \ No newline at end of file From 8442146a0fe0ec65aa9649a746045d8a209560d4 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Mon, 15 Sep 2025 16:40:58 +0100 Subject: [PATCH 14/49] Rust: Add a couple of simple data flow test cases. --- .../dataflow/local/DataFlowStep.expected | 2041 +++++++++-------- .../dataflow/local/inline-flow.expected | 1051 ++++----- .../test/library-tests/dataflow/local/main.rs | 12 + 3 files changed, 1573 insertions(+), 1531 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 86bd270ba93..b395948f420 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -97,1031 +97,1050 @@ localStep | main.rs:70:5:70:5 | [SSA] i | main.rs:71:10:71:10 | i | | main.rs:70:5:70:5 | i | main.rs:70:5:70:5 | [SSA] i | | main.rs:70:9:70:17 | source(...) | main.rs:70:5:70:5 | i | -| main.rs:75:9:75:9 | [SSA] a | main.rs:76:5:76:5 | a | -| main.rs:75:9:75:9 | a | main.rs:75:9:75:9 | [SSA] a | -| main.rs:75:9:75:9 | a | main.rs:75:9:75:9 | a | -| main.rs:75:13:75:17 | { ... } | main.rs:75:9:75:9 | a | -| main.rs:75:15:75:15 | 0 | main.rs:75:13:75:17 | { ... } | -| main.rs:76:5:76:5 | a | main.rs:74:31:77:1 | { ... } | -| main.rs:79:22:79:22 | [SSA] b | main.rs:81:12:81:12 | b | -| main.rs:79:22:79:22 | b | main.rs:79:22:79:22 | [SSA] b | -| main.rs:79:22:79:22 | b | main.rs:79:22:79:22 | b | -| main.rs:79:22:79:28 | ...: bool | main.rs:79:22:79:22 | b | -| main.rs:80:9:80:9 | [SSA] a | main.rs:86:5:86:5 | a | -| main.rs:80:9:80:9 | a | main.rs:80:9:80:9 | [SSA] a | -| main.rs:80:9:80:9 | a | main.rs:80:9:80:9 | a | -| main.rs:80:13:85:5 | 'block: { ... } | main.rs:80:9:80:9 | a | -| main.rs:82:13:82:26 | break 'block 1 | main.rs:80:13:85:5 | 'block: { ... } | -| main.rs:82:26:82:26 | 1 | main.rs:82:13:82:26 | break 'block 1 | -| main.rs:84:9:84:9 | 2 | main.rs:80:13:85:5 | 'block: { ... } | -| main.rs:86:5:86:5 | a | main.rs:79:38:87:1 | { ... } | -| main.rs:89:22:89:22 | [SSA] b | main.rs:91:12:91:12 | b | -| main.rs:89:22:89:22 | b | main.rs:89:22:89:22 | [SSA] b | -| main.rs:89:22:89:22 | b | main.rs:89:22:89:22 | b | -| main.rs:89:22:89:28 | ...: bool | main.rs:89:22:89:22 | b | -| main.rs:90:9:90:9 | [SSA] a | main.rs:96:5:96:5 | a | -| main.rs:90:9:90:9 | a | main.rs:90:9:90:9 | [SSA] a | -| main.rs:90:9:90:9 | a | main.rs:90:9:90:9 | a | -| main.rs:90:13:95:5 | 'block: { ... } | main.rs:90:9:90:9 | a | -| main.rs:92:13:92:26 | break 'block 1 | main.rs:90:13:95:5 | 'block: { ... } | -| main.rs:92:26:92:26 | 1 | main.rs:92:13:92:26 | break 'block 1 | -| main.rs:94:9:94:22 | break 'block 2 | main.rs:90:13:95:5 | 'block: { ... } | -| main.rs:94:22:94:22 | 2 | main.rs:94:9:94:22 | break 'block 2 | -| main.rs:96:5:96:5 | a | main.rs:89:38:97:1 | { ... } | -| main.rs:103:9:103:9 | [SSA] i | main.rs:104:11:104:11 | i | -| main.rs:103:9:103:9 | i | main.rs:103:9:103:9 | [SSA] i | -| main.rs:103:9:103:9 | i | main.rs:103:9:103:9 | i | -| main.rs:103:13:103:31 | ...::new(...) | main.rs:103:9:103:9 | i | -| main.rs:104:11:104:11 | [post] receiver for i | main.rs:104:11:104:11 | [post] i | -| main.rs:104:11:104:11 | i | main.rs:104:11:104:11 | receiver for i | -| main.rs:111:9:111:9 | [SSA] a | main.rs:112:10:112:10 | a | -| main.rs:111:9:111:9 | a | main.rs:111:9:111:9 | [SSA] a | -| main.rs:111:9:111:9 | a | main.rs:111:9:111:9 | a | -| main.rs:111:13:111:26 | TupleExpr | main.rs:111:9:111:9 | a | -| main.rs:112:10:112:10 | [post] a | main.rs:113:10:113:10 | a | -| main.rs:112:10:112:10 | a | main.rs:113:10:113:10 | a | -| main.rs:117:9:117:9 | [SSA] a | main.rs:118:24:118:24 | a | -| main.rs:117:9:117:9 | a | main.rs:117:9:117:9 | [SSA] a | -| main.rs:117:9:117:9 | a | main.rs:117:9:117:9 | a | -| main.rs:117:13:117:30 | TupleExpr | main.rs:117:9:117:9 | a | -| main.rs:118:10:118:11 | [SSA] a0 | main.rs:119:10:119:11 | a0 | -| main.rs:118:10:118:11 | a0 | main.rs:118:10:118:11 | [SSA] a0 | -| main.rs:118:10:118:11 | a0 | main.rs:118:10:118:11 | a0 | -| main.rs:118:14:118:15 | [SSA] a1 | main.rs:120:10:120:11 | a1 | -| main.rs:118:14:118:15 | a1 | main.rs:118:14:118:15 | [SSA] a1 | -| main.rs:118:14:118:15 | a1 | main.rs:118:14:118:15 | a1 | -| main.rs:118:18:118:19 | [SSA] a2 | main.rs:121:10:121:11 | a2 | -| main.rs:118:18:118:19 | a2 | main.rs:118:18:118:19 | [SSA] a2 | -| main.rs:118:18:118:19 | a2 | main.rs:118:18:118:19 | a2 | -| main.rs:118:24:118:24 | a | main.rs:118:9:118:20 | TuplePat | -| main.rs:125:9:125:13 | mut a | main.rs:125:13:125:13 | a | -| main.rs:125:13:125:13 | [SSA] a | main.rs:126:10:126:10 | a | -| main.rs:125:13:125:13 | a | main.rs:125:13:125:13 | [SSA] a | -| main.rs:125:17:125:31 | TupleExpr | main.rs:125:9:125:13 | mut a | -| main.rs:126:10:126:10 | [post] a | main.rs:127:10:127:10 | a | -| main.rs:126:10:126:10 | a | main.rs:127:10:127:10 | a | -| main.rs:127:10:127:10 | [post] a | main.rs:128:5:128:5 | a | -| main.rs:127:10:127:10 | a | main.rs:128:5:128:5 | a | -| main.rs:128:5:128:5 | [post] a | main.rs:129:5:129:5 | a | -| main.rs:128:5:128:5 | a | main.rs:129:5:129:5 | a | -| main.rs:128:11:128:20 | source(...) | main.rs:128:5:128:7 | a.0 | -| main.rs:129:5:129:5 | [post] a | main.rs:130:10:130:10 | a | -| main.rs:129:5:129:5 | a | main.rs:130:10:130:10 | a | -| main.rs:129:11:129:11 | 2 | main.rs:129:5:129:7 | a.1 | -| main.rs:130:10:130:10 | [post] a | main.rs:131:10:131:10 | a | -| main.rs:130:10:130:10 | a | main.rs:131:10:131:10 | a | -| main.rs:135:9:135:9 | [SSA] a | main.rs:136:14:136:14 | a | -| main.rs:135:9:135:9 | a | main.rs:135:9:135:9 | [SSA] a | -| main.rs:135:9:135:9 | a | main.rs:135:9:135:9 | a | -| main.rs:135:13:135:27 | TupleExpr | main.rs:135:9:135:9 | a | -| main.rs:136:9:136:9 | [SSA] b | main.rs:137:10:137:10 | b | -| main.rs:136:9:136:9 | b | main.rs:136:9:136:9 | [SSA] b | -| main.rs:136:9:136:9 | b | main.rs:136:9:136:9 | b | -| main.rs:136:13:136:18 | TupleExpr | main.rs:136:9:136:9 | b | -| main.rs:137:10:137:10 | [post] b | main.rs:138:10:138:10 | b | -| main.rs:137:10:137:10 | b | main.rs:138:10:138:10 | b | -| main.rs:138:10:138:10 | [post] b | main.rs:139:10:139:10 | b | -| main.rs:138:10:138:10 | b | main.rs:139:10:139:10 | b | -| main.rs:151:9:151:9 | [SSA] p | main.rs:152:10:152:10 | p | -| main.rs:151:9:151:9 | p | main.rs:151:9:151:9 | [SSA] p | -| main.rs:151:9:151:9 | p | main.rs:151:9:151:9 | p | -| main.rs:151:13:151:40 | Point {...} | main.rs:151:9:151:9 | p | -| main.rs:152:10:152:10 | [post] p | main.rs:153:10:153:10 | p | -| main.rs:152:10:152:10 | p | main.rs:153:10:153:10 | p | -| main.rs:157:9:157:13 | mut p | main.rs:157:13:157:13 | p | -| main.rs:157:13:157:13 | [SSA] p | main.rs:158:10:158:10 | p | -| main.rs:157:13:157:13 | p | main.rs:157:13:157:13 | [SSA] p | -| main.rs:157:17:157:44 | Point {...} | main.rs:157:9:157:13 | mut p | -| main.rs:158:10:158:10 | [post] p | main.rs:159:5:159:5 | p | -| main.rs:158:10:158:10 | p | main.rs:159:5:159:5 | p | -| main.rs:159:5:159:5 | [post] p | main.rs:160:10:160:10 | p | -| main.rs:159:5:159:5 | p | main.rs:160:10:160:10 | p | -| main.rs:159:11:159:20 | source(...) | main.rs:159:5:159:7 | p.y | -| main.rs:164:9:164:9 | [SSA] p | main.rs:168:32:168:32 | p | -| main.rs:164:9:164:9 | p | main.rs:164:9:164:9 | [SSA] p | -| main.rs:164:9:164:9 | p | main.rs:164:9:164:9 | p | -| main.rs:164:13:167:5 | Point {...} | main.rs:164:9:164:9 | p | -| main.rs:168:20:168:20 | [SSA] a | main.rs:169:10:169:10 | a | -| main.rs:168:20:168:20 | a | main.rs:168:20:168:20 | [SSA] a | -| main.rs:168:20:168:20 | a | main.rs:168:20:168:20 | a | -| main.rs:168:26:168:26 | [SSA] b | main.rs:170:10:170:10 | b | -| main.rs:168:26:168:26 | b | main.rs:168:26:168:26 | [SSA] b | -| main.rs:168:26:168:26 | b | main.rs:168:26:168:26 | b | -| main.rs:168:32:168:32 | p | main.rs:168:9:168:28 | Point {...} | -| main.rs:179:9:179:9 | [SSA] p | main.rs:186:10:186:10 | p | -| main.rs:179:9:179:9 | p | main.rs:179:9:179:9 | [SSA] p | -| main.rs:179:9:179:9 | p | main.rs:179:9:179:9 | p | -| main.rs:179:13:185:5 | Point3D {...} | main.rs:179:9:179:9 | p | -| main.rs:186:10:186:10 | [post] p | main.rs:187:10:187:10 | p | -| main.rs:186:10:186:10 | p | main.rs:187:10:187:10 | p | -| main.rs:187:10:187:10 | [post] p | main.rs:188:10:188:10 | p | -| main.rs:187:10:187:10 | p | main.rs:188:10:188:10 | p | -| main.rs:192:9:192:9 | [SSA] y | main.rs:194:30:194:30 | y | -| main.rs:192:9:192:9 | y | main.rs:192:9:192:9 | [SSA] y | -| main.rs:192:9:192:9 | y | main.rs:192:9:192:9 | y | -| main.rs:192:13:192:22 | source(...) | main.rs:192:9:192:9 | y | -| main.rs:193:9:193:9 | [SSA] p | main.rs:197:11:197:11 | p | -| main.rs:193:9:193:9 | p | main.rs:193:9:193:9 | [SSA] p | -| main.rs:193:9:193:9 | p | main.rs:193:9:193:9 | p | -| main.rs:193:13:196:5 | Point3D {...} | main.rs:193:9:193:9 | p | -| main.rs:197:5:206:5 | match p { ... } | main.rs:191:26:207:1 | { ... } | -| main.rs:197:11:197:11 | p | main.rs:198:9:201:9 | Point3D {...} | -| main.rs:199:28:199:28 | [SSA] x | main.rs:202:18:202:18 | x | -| main.rs:199:28:199:28 | x | main.rs:199:28:199:28 | [SSA] x | -| main.rs:199:28:199:28 | x | main.rs:199:28:199:28 | x | -| main.rs:199:31:199:31 | [SSA] y | main.rs:203:18:203:18 | y | -| main.rs:199:31:199:31 | y | main.rs:199:31:199:31 | [SSA] y | -| main.rs:199:31:199:31 | y | main.rs:199:31:199:31 | y | -| main.rs:200:13:200:13 | [SSA] z | main.rs:204:18:204:18 | z | -| main.rs:200:13:200:13 | z | main.rs:200:13:200:13 | [SSA] z | -| main.rs:200:13:200:13 | z | main.rs:200:13:200:13 | z | -| main.rs:201:14:205:9 | { ... } | main.rs:197:5:206:5 | match p { ... } | -| main.rs:212:9:212:9 | [SSA] s | main.rs:213:10:213:10 | s | -| main.rs:212:9:212:9 | s | main.rs:212:9:212:9 | [SSA] s | -| main.rs:212:9:212:9 | s | main.rs:212:9:212:9 | s | -| main.rs:212:13:212:40 | MyTupleStruct(...) | main.rs:212:9:212:9 | s | -| main.rs:213:10:213:10 | [post] s | main.rs:214:10:214:10 | s | -| main.rs:213:10:213:10 | s | main.rs:214:10:214:10 | s | -| main.rs:214:10:214:10 | [post] s | main.rs:216:11:216:11 | s | -| main.rs:214:10:214:10 | s | main.rs:216:11:216:11 | s | -| main.rs:216:5:221:5 | match s { ... } | main.rs:211:19:222:1 | { ... } | -| main.rs:216:11:216:11 | s | main.rs:217:9:217:27 | MyTupleStruct(...) | -| main.rs:217:23:217:23 | [SSA] x | main.rs:218:18:218:18 | x | -| main.rs:217:23:217:23 | x | main.rs:217:23:217:23 | [SSA] x | -| main.rs:217:23:217:23 | x | main.rs:217:23:217:23 | x | -| main.rs:217:26:217:26 | [SSA] y | main.rs:219:18:219:18 | y | -| main.rs:217:26:217:26 | y | main.rs:217:26:217:26 | [SSA] y | -| main.rs:217:26:217:26 | y | main.rs:217:26:217:26 | y | -| main.rs:217:32:220:9 | { ... } | main.rs:216:5:221:5 | match s { ... } | -| main.rs:228:9:228:10 | [SSA] s1 | main.rs:230:11:230:12 | s1 | -| main.rs:228:9:228:10 | s1 | main.rs:228:9:228:10 | [SSA] s1 | -| main.rs:228:9:228:10 | s1 | main.rs:228:9:228:10 | s1 | -| main.rs:228:14:228:37 | ...::Some(...) | main.rs:228:9:228:10 | s1 | -| main.rs:229:9:229:10 | [SSA] s2 | main.rs:234:11:234:12 | s2 | -| main.rs:229:9:229:10 | s2 | main.rs:229:9:229:10 | [SSA] s2 | -| main.rs:229:9:229:10 | s2 | main.rs:229:9:229:10 | s2 | -| main.rs:229:14:229:28 | ...::Some(...) | main.rs:229:9:229:10 | s2 | -| main.rs:230:11:230:12 | s1 | main.rs:231:9:231:23 | ...::Some(...) | -| main.rs:230:11:230:12 | s1 | main.rs:232:9:232:20 | ...::None | -| main.rs:231:22:231:22 | [SSA] n | main.rs:231:33:231:33 | n | -| main.rs:231:22:231:22 | n | main.rs:231:22:231:22 | [SSA] n | -| main.rs:231:22:231:22 | n | main.rs:231:22:231:22 | n | -| main.rs:231:28:231:34 | sink(...) | main.rs:230:5:233:5 | match s1 { ... } | -| main.rs:232:25:232:31 | sink(...) | main.rs:230:5:233:5 | match s1 { ... } | -| main.rs:234:5:237:5 | match s2 { ... } | main.rs:227:37:238:1 | { ... } | -| main.rs:234:11:234:12 | s2 | main.rs:235:9:235:23 | ...::Some(...) | -| main.rs:234:11:234:12 | s2 | main.rs:236:9:236:20 | ...::None | -| main.rs:235:22:235:22 | [SSA] n | main.rs:235:33:235:33 | n | -| main.rs:235:22:235:22 | n | main.rs:235:22:235:22 | [SSA] n | -| main.rs:235:22:235:22 | n | main.rs:235:22:235:22 | n | -| main.rs:235:28:235:34 | sink(...) | main.rs:234:5:237:5 | match s2 { ... } | -| main.rs:236:25:236:31 | sink(...) | main.rs:234:5:237:5 | match s2 { ... } | -| main.rs:241:9:241:10 | [SSA] s1 | main.rs:243:11:243:12 | s1 | -| main.rs:241:9:241:10 | s1 | main.rs:241:9:241:10 | [SSA] s1 | -| main.rs:241:9:241:10 | s1 | main.rs:241:9:241:10 | s1 | -| main.rs:241:14:241:29 | Some(...) | main.rs:241:9:241:10 | s1 | -| main.rs:242:9:242:10 | [SSA] s2 | main.rs:247:11:247:12 | s2 | -| main.rs:242:9:242:10 | s2 | main.rs:242:9:242:10 | [SSA] s2 | -| main.rs:242:9:242:10 | s2 | main.rs:242:9:242:10 | s2 | -| main.rs:242:14:242:20 | Some(...) | main.rs:242:9:242:10 | s2 | -| main.rs:243:11:243:12 | s1 | main.rs:244:9:244:15 | Some(...) | -| main.rs:243:11:243:12 | s1 | main.rs:245:9:245:12 | None | -| main.rs:244:14:244:14 | [SSA] n | main.rs:244:25:244:25 | n | -| main.rs:244:14:244:14 | n | main.rs:244:14:244:14 | [SSA] n | -| main.rs:244:14:244:14 | n | main.rs:244:14:244:14 | n | -| main.rs:244:20:244:26 | sink(...) | main.rs:243:5:246:5 | match s1 { ... } | -| main.rs:245:17:245:23 | sink(...) | main.rs:243:5:246:5 | match s1 { ... } | -| main.rs:247:5:250:5 | match s2 { ... } | main.rs:240:39:251:1 | { ... } | -| main.rs:247:11:247:12 | s2 | main.rs:248:9:248:15 | Some(...) | -| main.rs:247:11:247:12 | s2 | main.rs:249:9:249:12 | None | -| main.rs:248:14:248:14 | [SSA] n | main.rs:248:25:248:25 | n | -| main.rs:248:14:248:14 | n | main.rs:248:14:248:14 | [SSA] n | -| main.rs:248:14:248:14 | n | main.rs:248:14:248:14 | n | -| main.rs:248:20:248:26 | sink(...) | main.rs:247:5:250:5 | match s2 { ... } | -| main.rs:249:17:249:23 | sink(...) | main.rs:247:5:250:5 | match s2 { ... } | -| main.rs:254:9:254:10 | [SSA] s1 | main.rs:255:22:255:23 | s1 | -| main.rs:254:9:254:10 | s1 | main.rs:254:9:254:10 | [SSA] s1 | -| main.rs:254:9:254:10 | s1 | main.rs:254:9:254:10 | s1 | -| main.rs:254:14:254:29 | Some(...) | main.rs:254:9:254:10 | s1 | -| main.rs:255:5:262:5 | if ... {...} | main.rs:253:25:263:1 | { ... } | -| main.rs:255:17:255:17 | [SSA] n | main.rs:257:18:257:18 | n | -| main.rs:255:17:255:17 | n | main.rs:255:17:255:17 | [SSA] n | -| main.rs:255:17:255:17 | n | main.rs:255:17:255:17 | n | -| main.rs:255:22:255:23 | s1 | main.rs:255:12:255:18 | Some(...) | -| main.rs:257:18:257:18 | [post] n | main.rs:261:14:261:14 | n | -| main.rs:257:18:257:18 | n | main.rs:261:14:261:14 | n | -| main.rs:258:13:258:16 | true | main.rs:256:12:259:9 | { ... } | -| main.rs:260:5:262:5 | { ... } | main.rs:255:5:262:5 | if ... {...} | -| main.rs:266:9:266:10 | [SSA] s1 | main.rs:267:10:267:11 | s1 | +| main.rs:72:5:72:5 | [SSA] i | main.rs:73:10:73:10 | i | +| main.rs:72:5:72:5 | i | main.rs:72:5:72:5 | [SSA] i | +| main.rs:72:9:72:9 | 2 | main.rs:72:5:72:5 | i | +| main.rs:75:9:75:13 | mut j | main.rs:75:13:75:13 | j | +| main.rs:75:17:75:17 | 3 | main.rs:75:9:75:13 | mut j | +| main.rs:76:9:76:9 | [SSA] k | main.rs:77:9:77:9 | k | +| main.rs:76:9:76:9 | k | main.rs:76:9:76:9 | [SSA] k | +| main.rs:76:9:76:9 | k | main.rs:76:9:76:9 | k | +| main.rs:76:13:76:21 | source(...) | main.rs:76:9:76:9 | k | +| main.rs:77:5:77:5 | [SSA] j | main.rs:78:10:78:10 | j | +| main.rs:77:5:77:5 | j | main.rs:77:5:77:5 | [SSA] j | +| main.rs:77:9:77:9 | k | main.rs:77:5:77:5 | j | +| main.rs:77:9:77:9 | k | main.rs:79:10:79:10 | k | +| main.rs:81:9:81:13 | mut l | main.rs:81:13:81:13 | l | +| main.rs:81:17:81:25 | source(...) | main.rs:81:9:81:13 | mut l | +| main.rs:82:5:82:5 | [SSA] l | main.rs:82:9:82:9 | l | +| main.rs:82:5:82:5 | l | main.rs:82:5:82:5 | [SSA] l | +| main.rs:82:9:82:9 | l | main.rs:82:5:82:5 | l | +| main.rs:82:9:82:9 | l | main.rs:83:10:83:10 | l | +| main.rs:87:9:87:9 | [SSA] a | main.rs:88:5:88:5 | a | +| main.rs:87:9:87:9 | a | main.rs:87:9:87:9 | [SSA] a | +| main.rs:87:9:87:9 | a | main.rs:87:9:87:9 | a | +| main.rs:87:13:87:17 | { ... } | main.rs:87:9:87:9 | a | +| main.rs:87:15:87:15 | 0 | main.rs:87:13:87:17 | { ... } | +| main.rs:88:5:88:5 | a | main.rs:86:31:89:1 | { ... } | +| main.rs:91:22:91:22 | [SSA] b | main.rs:93:12:93:12 | b | +| main.rs:91:22:91:22 | b | main.rs:91:22:91:22 | [SSA] b | +| main.rs:91:22:91:22 | b | main.rs:91:22:91:22 | b | +| main.rs:91:22:91:28 | ...: bool | main.rs:91:22:91:22 | b | +| main.rs:92:9:92:9 | [SSA] a | main.rs:98:5:98:5 | a | +| main.rs:92:9:92:9 | a | main.rs:92:9:92:9 | [SSA] a | +| main.rs:92:9:92:9 | a | main.rs:92:9:92:9 | a | +| main.rs:92:13:97:5 | 'block: { ... } | main.rs:92:9:92:9 | a | +| main.rs:94:13:94:26 | break 'block 1 | main.rs:92:13:97:5 | 'block: { ... } | +| main.rs:94:26:94:26 | 1 | main.rs:94:13:94:26 | break 'block 1 | +| main.rs:96:9:96:9 | 2 | main.rs:92:13:97:5 | 'block: { ... } | +| main.rs:98:5:98:5 | a | main.rs:91:38:99:1 | { ... } | +| main.rs:101:22:101:22 | [SSA] b | main.rs:103:12:103:12 | b | +| main.rs:101:22:101:22 | b | main.rs:101:22:101:22 | [SSA] b | +| main.rs:101:22:101:22 | b | main.rs:101:22:101:22 | b | +| main.rs:101:22:101:28 | ...: bool | main.rs:101:22:101:22 | b | +| main.rs:102:9:102:9 | [SSA] a | main.rs:108:5:108:5 | a | +| main.rs:102:9:102:9 | a | main.rs:102:9:102:9 | [SSA] a | +| main.rs:102:9:102:9 | a | main.rs:102:9:102:9 | a | +| main.rs:102:13:107:5 | 'block: { ... } | main.rs:102:9:102:9 | a | +| main.rs:104:13:104:26 | break 'block 1 | main.rs:102:13:107:5 | 'block: { ... } | +| main.rs:104:26:104:26 | 1 | main.rs:104:13:104:26 | break 'block 1 | +| main.rs:106:9:106:22 | break 'block 2 | main.rs:102:13:107:5 | 'block: { ... } | +| main.rs:106:22:106:22 | 2 | main.rs:106:9:106:22 | break 'block 2 | +| main.rs:108:5:108:5 | a | main.rs:101:38:109:1 | { ... } | +| main.rs:115:9:115:9 | [SSA] i | main.rs:116:11:116:11 | i | +| main.rs:115:9:115:9 | i | main.rs:115:9:115:9 | [SSA] i | +| main.rs:115:9:115:9 | i | main.rs:115:9:115:9 | i | +| main.rs:115:13:115:31 | ...::new(...) | main.rs:115:9:115:9 | i | +| main.rs:116:11:116:11 | [post] receiver for i | main.rs:116:11:116:11 | [post] i | +| main.rs:116:11:116:11 | i | main.rs:116:11:116:11 | receiver for i | +| main.rs:123:9:123:9 | [SSA] a | main.rs:124:10:124:10 | a | +| main.rs:123:9:123:9 | a | main.rs:123:9:123:9 | [SSA] a | +| main.rs:123:9:123:9 | a | main.rs:123:9:123:9 | a | +| main.rs:123:13:123:26 | TupleExpr | main.rs:123:9:123:9 | a | +| main.rs:124:10:124:10 | [post] a | main.rs:125:10:125:10 | a | +| main.rs:124:10:124:10 | a | main.rs:125:10:125:10 | a | +| main.rs:129:9:129:9 | [SSA] a | main.rs:130:24:130:24 | a | +| main.rs:129:9:129:9 | a | main.rs:129:9:129:9 | [SSA] a | +| main.rs:129:9:129:9 | a | main.rs:129:9:129:9 | a | +| main.rs:129:13:129:30 | TupleExpr | main.rs:129:9:129:9 | a | +| main.rs:130:10:130:11 | [SSA] a0 | main.rs:131:10:131:11 | a0 | +| main.rs:130:10:130:11 | a0 | main.rs:130:10:130:11 | [SSA] a0 | +| main.rs:130:10:130:11 | a0 | main.rs:130:10:130:11 | a0 | +| main.rs:130:14:130:15 | [SSA] a1 | main.rs:132:10:132:11 | a1 | +| main.rs:130:14:130:15 | a1 | main.rs:130:14:130:15 | [SSA] a1 | +| main.rs:130:14:130:15 | a1 | main.rs:130:14:130:15 | a1 | +| main.rs:130:18:130:19 | [SSA] a2 | main.rs:133:10:133:11 | a2 | +| main.rs:130:18:130:19 | a2 | main.rs:130:18:130:19 | [SSA] a2 | +| main.rs:130:18:130:19 | a2 | main.rs:130:18:130:19 | a2 | +| main.rs:130:24:130:24 | a | main.rs:130:9:130:20 | TuplePat | +| main.rs:137:9:137:13 | mut a | main.rs:137:13:137:13 | a | +| main.rs:137:13:137:13 | [SSA] a | main.rs:138:10:138:10 | a | +| main.rs:137:13:137:13 | a | main.rs:137:13:137:13 | [SSA] a | +| main.rs:137:17:137:31 | TupleExpr | main.rs:137:9:137:13 | mut a | +| main.rs:138:10:138:10 | [post] a | main.rs:139:10:139:10 | a | +| main.rs:138:10:138:10 | a | main.rs:139:10:139:10 | a | +| main.rs:139:10:139:10 | [post] a | main.rs:140:5:140:5 | a | +| main.rs:139:10:139:10 | a | main.rs:140:5:140:5 | a | +| main.rs:140:5:140:5 | [post] a | main.rs:141:5:141:5 | a | +| main.rs:140:5:140:5 | a | main.rs:141:5:141:5 | a | +| main.rs:140:11:140:20 | source(...) | main.rs:140:5:140:7 | a.0 | +| main.rs:141:5:141:5 | [post] a | main.rs:142:10:142:10 | a | +| main.rs:141:5:141:5 | a | main.rs:142:10:142:10 | a | +| main.rs:141:11:141:11 | 2 | main.rs:141:5:141:7 | a.1 | +| main.rs:142:10:142:10 | [post] a | main.rs:143:10:143:10 | a | +| main.rs:142:10:142:10 | a | main.rs:143:10:143:10 | a | +| main.rs:147:9:147:9 | [SSA] a | main.rs:148:14:148:14 | a | +| main.rs:147:9:147:9 | a | main.rs:147:9:147:9 | [SSA] a | +| main.rs:147:9:147:9 | a | main.rs:147:9:147:9 | a | +| main.rs:147:13:147:27 | TupleExpr | main.rs:147:9:147:9 | a | +| main.rs:148:9:148:9 | [SSA] b | main.rs:149:10:149:10 | b | +| main.rs:148:9:148:9 | b | main.rs:148:9:148:9 | [SSA] b | +| main.rs:148:9:148:9 | b | main.rs:148:9:148:9 | b | +| main.rs:148:13:148:18 | TupleExpr | main.rs:148:9:148:9 | b | +| main.rs:149:10:149:10 | [post] b | main.rs:150:10:150:10 | b | +| main.rs:149:10:149:10 | b | main.rs:150:10:150:10 | b | +| main.rs:150:10:150:10 | [post] b | main.rs:151:10:151:10 | b | +| main.rs:150:10:150:10 | b | main.rs:151:10:151:10 | b | +| main.rs:163:9:163:9 | [SSA] p | main.rs:164:10:164:10 | p | +| main.rs:163:9:163:9 | p | main.rs:163:9:163:9 | [SSA] p | +| main.rs:163:9:163:9 | p | main.rs:163:9:163:9 | p | +| main.rs:163:13:163:40 | Point {...} | main.rs:163:9:163:9 | p | +| main.rs:164:10:164:10 | [post] p | main.rs:165:10:165:10 | p | +| main.rs:164:10:164:10 | p | main.rs:165:10:165:10 | p | +| main.rs:169:9:169:13 | mut p | main.rs:169:13:169:13 | p | +| main.rs:169:13:169:13 | [SSA] p | main.rs:170:10:170:10 | p | +| main.rs:169:13:169:13 | p | main.rs:169:13:169:13 | [SSA] p | +| main.rs:169:17:169:44 | Point {...} | main.rs:169:9:169:13 | mut p | +| main.rs:170:10:170:10 | [post] p | main.rs:171:5:171:5 | p | +| main.rs:170:10:170:10 | p | main.rs:171:5:171:5 | p | +| main.rs:171:5:171:5 | [post] p | main.rs:172:10:172:10 | p | +| main.rs:171:5:171:5 | p | main.rs:172:10:172:10 | p | +| main.rs:171:11:171:20 | source(...) | main.rs:171:5:171:7 | p.y | +| main.rs:176:9:176:9 | [SSA] p | main.rs:180:32:180:32 | p | +| main.rs:176:9:176:9 | p | main.rs:176:9:176:9 | [SSA] p | +| main.rs:176:9:176:9 | p | main.rs:176:9:176:9 | p | +| main.rs:176:13:179:5 | Point {...} | main.rs:176:9:176:9 | p | +| main.rs:180:20:180:20 | [SSA] a | main.rs:181:10:181:10 | a | +| main.rs:180:20:180:20 | a | main.rs:180:20:180:20 | [SSA] a | +| main.rs:180:20:180:20 | a | main.rs:180:20:180:20 | a | +| main.rs:180:26:180:26 | [SSA] b | main.rs:182:10:182:10 | b | +| main.rs:180:26:180:26 | b | main.rs:180:26:180:26 | [SSA] b | +| main.rs:180:26:180:26 | b | main.rs:180:26:180:26 | b | +| main.rs:180:32:180:32 | p | main.rs:180:9:180:28 | Point {...} | +| main.rs:191:9:191:9 | [SSA] p | main.rs:198:10:198:10 | p | +| main.rs:191:9:191:9 | p | main.rs:191:9:191:9 | [SSA] p | +| main.rs:191:9:191:9 | p | main.rs:191:9:191:9 | p | +| main.rs:191:13:197:5 | Point3D {...} | main.rs:191:9:191:9 | p | +| main.rs:198:10:198:10 | [post] p | main.rs:199:10:199:10 | p | +| main.rs:198:10:198:10 | p | main.rs:199:10:199:10 | p | +| main.rs:199:10:199:10 | [post] p | main.rs:200:10:200:10 | p | +| main.rs:199:10:199:10 | p | main.rs:200:10:200:10 | p | +| main.rs:204:9:204:9 | [SSA] y | main.rs:206:30:206:30 | y | +| main.rs:204:9:204:9 | y | main.rs:204:9:204:9 | [SSA] y | +| main.rs:204:9:204:9 | y | main.rs:204:9:204:9 | y | +| main.rs:204:13:204:22 | source(...) | main.rs:204:9:204:9 | y | +| main.rs:205:9:205:9 | [SSA] p | main.rs:209:11:209:11 | p | +| main.rs:205:9:205:9 | p | main.rs:205:9:205:9 | [SSA] p | +| main.rs:205:9:205:9 | p | main.rs:205:9:205:9 | p | +| main.rs:205:13:208:5 | Point3D {...} | main.rs:205:9:205:9 | p | +| main.rs:209:5:218:5 | match p { ... } | main.rs:203:26:219:1 | { ... } | +| main.rs:209:11:209:11 | p | main.rs:210:9:213:9 | Point3D {...} | +| main.rs:211:28:211:28 | [SSA] x | main.rs:214:18:214:18 | x | +| main.rs:211:28:211:28 | x | main.rs:211:28:211:28 | [SSA] x | +| main.rs:211:28:211:28 | x | main.rs:211:28:211:28 | x | +| main.rs:211:31:211:31 | [SSA] y | main.rs:215:18:215:18 | y | +| main.rs:211:31:211:31 | y | main.rs:211:31:211:31 | [SSA] y | +| main.rs:211:31:211:31 | y | main.rs:211:31:211:31 | y | +| main.rs:212:13:212:13 | [SSA] z | main.rs:216:18:216:18 | z | +| main.rs:212:13:212:13 | z | main.rs:212:13:212:13 | [SSA] z | +| main.rs:212:13:212:13 | z | main.rs:212:13:212:13 | z | +| main.rs:213:14:217:9 | { ... } | main.rs:209:5:218:5 | match p { ... } | +| main.rs:224:9:224:9 | [SSA] s | main.rs:225:10:225:10 | s | +| main.rs:224:9:224:9 | s | main.rs:224:9:224:9 | [SSA] s | +| main.rs:224:9:224:9 | s | main.rs:224:9:224:9 | s | +| main.rs:224:13:224:40 | MyTupleStruct(...) | main.rs:224:9:224:9 | s | +| main.rs:225:10:225:10 | [post] s | main.rs:226:10:226:10 | s | +| main.rs:225:10:225:10 | s | main.rs:226:10:226:10 | s | +| main.rs:226:10:226:10 | [post] s | main.rs:228:11:228:11 | s | +| main.rs:226:10:226:10 | s | main.rs:228:11:228:11 | s | +| main.rs:228:5:233:5 | match s { ... } | main.rs:223:19:234:1 | { ... } | +| main.rs:228:11:228:11 | s | main.rs:229:9:229:27 | MyTupleStruct(...) | +| main.rs:229:23:229:23 | [SSA] x | main.rs:230:18:230:18 | x | +| main.rs:229:23:229:23 | x | main.rs:229:23:229:23 | [SSA] x | +| main.rs:229:23:229:23 | x | main.rs:229:23:229:23 | x | +| main.rs:229:26:229:26 | [SSA] y | main.rs:231:18:231:18 | y | +| main.rs:229:26:229:26 | y | main.rs:229:26:229:26 | [SSA] y | +| main.rs:229:26:229:26 | y | main.rs:229:26:229:26 | y | +| main.rs:229:32:232:9 | { ... } | main.rs:228:5:233:5 | match s { ... } | +| main.rs:240:9:240:10 | [SSA] s1 | main.rs:242:11:242:12 | s1 | +| main.rs:240:9:240:10 | s1 | main.rs:240:9:240:10 | [SSA] s1 | +| main.rs:240:9:240:10 | s1 | main.rs:240:9:240:10 | s1 | +| main.rs:240:14:240:37 | ...::Some(...) | main.rs:240:9:240:10 | s1 | +| main.rs:241:9:241:10 | [SSA] s2 | main.rs:246:11:246:12 | s2 | +| main.rs:241:9:241:10 | s2 | main.rs:241:9:241:10 | [SSA] s2 | +| main.rs:241:9:241:10 | s2 | main.rs:241:9:241:10 | s2 | +| main.rs:241:14:241:28 | ...::Some(...) | main.rs:241:9:241:10 | s2 | +| main.rs:242:11:242:12 | s1 | main.rs:243:9:243:23 | ...::Some(...) | +| main.rs:242:11:242:12 | s1 | main.rs:244:9:244:20 | ...::None | +| main.rs:243:22:243:22 | [SSA] n | main.rs:243:33:243:33 | n | +| main.rs:243:22:243:22 | n | main.rs:243:22:243:22 | [SSA] n | +| main.rs:243:22:243:22 | n | main.rs:243:22:243:22 | n | +| main.rs:243:28:243:34 | sink(...) | main.rs:242:5:245:5 | match s1 { ... } | +| main.rs:244:25:244:31 | sink(...) | main.rs:242:5:245:5 | match s1 { ... } | +| main.rs:246:5:249:5 | match s2 { ... } | main.rs:239:37:250:1 | { ... } | +| main.rs:246:11:246:12 | s2 | main.rs:247:9:247:23 | ...::Some(...) | +| main.rs:246:11:246:12 | s2 | main.rs:248:9:248:20 | ...::None | +| main.rs:247:22:247:22 | [SSA] n | main.rs:247:33:247:33 | n | +| main.rs:247:22:247:22 | n | main.rs:247:22:247:22 | [SSA] n | +| main.rs:247:22:247:22 | n | main.rs:247:22:247:22 | n | +| main.rs:247:28:247:34 | sink(...) | main.rs:246:5:249:5 | match s2 { ... } | +| main.rs:248:25:248:31 | sink(...) | main.rs:246:5:249:5 | match s2 { ... } | +| main.rs:253:9:253:10 | [SSA] s1 | main.rs:255:11:255:12 | s1 | +| main.rs:253:9:253:10 | s1 | main.rs:253:9:253:10 | [SSA] s1 | +| main.rs:253:9:253:10 | s1 | main.rs:253:9:253:10 | s1 | +| main.rs:253:14:253:29 | Some(...) | main.rs:253:9:253:10 | s1 | +| main.rs:254:9:254:10 | [SSA] s2 | main.rs:259:11:259:12 | s2 | +| main.rs:254:9:254:10 | s2 | main.rs:254:9:254:10 | [SSA] s2 | +| main.rs:254:9:254:10 | s2 | main.rs:254:9:254:10 | s2 | +| main.rs:254:14:254:20 | Some(...) | main.rs:254:9:254:10 | s2 | +| main.rs:255:11:255:12 | s1 | main.rs:256:9:256:15 | Some(...) | +| main.rs:255:11:255:12 | s1 | main.rs:257:9:257:12 | None | +| main.rs:256:14:256:14 | [SSA] n | main.rs:256:25:256:25 | n | +| main.rs:256:14:256:14 | n | main.rs:256:14:256:14 | [SSA] n | +| main.rs:256:14:256:14 | n | main.rs:256:14:256:14 | n | +| main.rs:256:20:256:26 | sink(...) | main.rs:255:5:258:5 | match s1 { ... } | +| main.rs:257:17:257:23 | sink(...) | main.rs:255:5:258:5 | match s1 { ... } | +| main.rs:259:5:262:5 | match s2 { ... } | main.rs:252:39:263:1 | { ... } | +| main.rs:259:11:259:12 | s2 | main.rs:260:9:260:15 | Some(...) | +| main.rs:259:11:259:12 | s2 | main.rs:261:9:261:12 | None | +| main.rs:260:14:260:14 | [SSA] n | main.rs:260:25:260:25 | n | +| main.rs:260:14:260:14 | n | main.rs:260:14:260:14 | [SSA] n | +| main.rs:260:14:260:14 | n | main.rs:260:14:260:14 | n | +| main.rs:260:20:260:26 | sink(...) | main.rs:259:5:262:5 | match s2 { ... } | +| main.rs:261:17:261:23 | sink(...) | main.rs:259:5:262:5 | match s2 { ... } | +| main.rs:266:9:266:10 | [SSA] s1 | main.rs:267:22:267:23 | s1 | | main.rs:266:9:266:10 | s1 | main.rs:266:9:266:10 | [SSA] s1 | | main.rs:266:9:266:10 | s1 | main.rs:266:9:266:10 | s1 | | main.rs:266:14:266:29 | Some(...) | main.rs:266:9:266:10 | s1 | -| main.rs:267:10:267:11 | [post] receiver for s1 | main.rs:267:10:267:11 | [post] s1 | -| main.rs:267:10:267:11 | s1 | main.rs:267:10:267:11 | receiver for s1 | -| main.rs:271:9:271:10 | [SSA] s1 | main.rs:272:10:272:11 | s1 | -| main.rs:271:9:271:10 | s1 | main.rs:271:9:271:10 | [SSA] s1 | -| main.rs:271:9:271:10 | s1 | main.rs:271:9:271:10 | s1 | -| main.rs:271:14:271:29 | Some(...) | main.rs:271:9:271:10 | s1 | -| main.rs:272:10:272:11 | [post] receiver for s1 | main.rs:272:10:272:11 | [post] s1 | -| main.rs:272:10:272:11 | s1 | main.rs:272:10:272:11 | receiver for s1 | -| main.rs:274:9:274:10 | [SSA] s2 | main.rs:275:10:275:11 | s2 | -| main.rs:274:9:274:10 | s2 | main.rs:274:9:274:10 | [SSA] s2 | -| main.rs:274:9:274:10 | s2 | main.rs:274:9:274:10 | s2 | -| main.rs:274:14:274:20 | Some(...) | main.rs:274:9:274:10 | s2 | -| main.rs:275:10:275:11 | [post] receiver for s2 | main.rs:275:10:275:11 | [post] s2 | -| main.rs:275:10:275:11 | s2 | main.rs:275:10:275:11 | receiver for s2 | -| main.rs:279:9:279:10 | [SSA] s1 | main.rs:280:10:280:11 | s1 | -| main.rs:279:9:279:10 | s1 | main.rs:279:9:279:10 | [SSA] s1 | -| main.rs:279:9:279:10 | s1 | main.rs:279:9:279:10 | s1 | -| main.rs:279:14:279:29 | Some(...) | main.rs:279:9:279:10 | s1 | -| main.rs:280:10:280:11 | [post] receiver for s1 | main.rs:280:10:280:11 | [post] s1 | -| main.rs:280:10:280:11 | s1 | main.rs:280:10:280:11 | receiver for s1 | -| main.rs:282:9:282:10 | [SSA] s2 | main.rs:283:10:283:11 | s2 | -| main.rs:282:9:282:10 | s2 | main.rs:282:9:282:10 | [SSA] s2 | -| main.rs:282:9:282:10 | s2 | main.rs:282:9:282:10 | s2 | -| main.rs:282:14:282:17 | None | main.rs:282:9:282:10 | s2 | -| main.rs:283:10:283:11 | [post] receiver for s2 | main.rs:283:10:283:11 | [post] s2 | -| main.rs:283:10:283:11 | s2 | main.rs:283:10:283:11 | receiver for s2 | -| main.rs:287:9:287:10 | [SSA] s1 | main.rs:289:14:289:15 | s1 | -| main.rs:287:9:287:10 | s1 | main.rs:287:9:287:10 | [SSA] s1 | -| main.rs:287:9:287:10 | s1 | main.rs:287:9:287:10 | s1 | -| main.rs:287:14:287:29 | Some(...) | main.rs:287:9:287:10 | s1 | -| main.rs:288:9:288:10 | [SSA] s2 | main.rs:291:10:291:11 | s2 | -| main.rs:288:9:288:10 | s2 | main.rs:288:9:288:10 | [SSA] s2 | -| main.rs:288:9:288:10 | s2 | main.rs:288:9:288:10 | s2 | -| main.rs:288:14:288:20 | Some(...) | main.rs:288:9:288:10 | s2 | -| main.rs:289:9:289:10 | [SSA] i1 | main.rs:290:10:290:11 | i1 | -| main.rs:289:9:289:10 | i1 | main.rs:289:9:289:10 | [SSA] i1 | -| main.rs:289:9:289:10 | i1 | main.rs:289:9:289:10 | i1 | -| main.rs:289:14:289:16 | TryExpr | main.rs:289:9:289:10 | i1 | -| main.rs:292:5:292:11 | Some(...) | main.rs:286:41:293:1 | { ... } | -| main.rs:296:9:296:10 | [SSA] r1 | main.rs:297:28:297:29 | r1 | -| main.rs:296:9:296:10 | r1 | main.rs:296:9:296:10 | [SSA] r1 | -| main.rs:296:9:296:10 | r1 | main.rs:296:9:296:10 | r1 | -| main.rs:296:32:296:45 | Ok(...) | main.rs:296:9:296:10 | r1 | -| main.rs:297:9:297:11 | [SSA] o1a | main.rs:299:10:299:12 | o1a | -| main.rs:297:9:297:11 | o1a | main.rs:297:9:297:11 | [SSA] o1a | -| main.rs:297:9:297:11 | o1a | main.rs:297:9:297:11 | o1a | -| main.rs:297:28:297:29 | [post] r1 | main.rs:298:28:298:29 | r1 | -| main.rs:297:28:297:29 | [post] receiver for r1 | main.rs:297:28:297:29 | [post] r1 | -| main.rs:297:28:297:29 | r1 | main.rs:297:28:297:29 | receiver for r1 | -| main.rs:297:28:297:29 | r1 | main.rs:298:28:298:29 | r1 | -| main.rs:297:28:297:34 | r1.ok() | main.rs:297:9:297:11 | o1a | -| main.rs:298:9:298:11 | [SSA] o1b | main.rs:300:10:300:12 | o1b | -| main.rs:298:9:298:11 | o1b | main.rs:298:9:298:11 | [SSA] o1b | -| main.rs:298:9:298:11 | o1b | main.rs:298:9:298:11 | o1b | -| main.rs:298:28:298:29 | [post] receiver for r1 | main.rs:298:28:298:29 | [post] r1 | -| main.rs:298:28:298:29 | r1 | main.rs:298:28:298:29 | receiver for r1 | -| main.rs:298:28:298:35 | r1.err() | main.rs:298:9:298:11 | o1b | -| main.rs:299:10:299:12 | [post] receiver for o1a | main.rs:299:10:299:12 | [post] o1a | -| main.rs:299:10:299:12 | o1a | main.rs:299:10:299:12 | receiver for o1a | -| main.rs:300:10:300:12 | [post] receiver for o1b | main.rs:300:10:300:12 | [post] o1b | -| main.rs:300:10:300:12 | o1b | main.rs:300:10:300:12 | receiver for o1b | -| main.rs:302:9:302:10 | [SSA] r2 | main.rs:303:28:303:29 | r2 | -| main.rs:302:9:302:10 | r2 | main.rs:302:9:302:10 | [SSA] r2 | -| main.rs:302:9:302:10 | r2 | main.rs:302:9:302:10 | r2 | -| main.rs:302:32:302:46 | Err(...) | main.rs:302:9:302:10 | r2 | -| main.rs:303:9:303:11 | [SSA] o2a | main.rs:305:10:305:12 | o2a | -| main.rs:303:9:303:11 | o2a | main.rs:303:9:303:11 | [SSA] o2a | -| main.rs:303:9:303:11 | o2a | main.rs:303:9:303:11 | o2a | -| main.rs:303:28:303:29 | [post] r2 | main.rs:304:28:304:29 | r2 | -| main.rs:303:28:303:29 | [post] receiver for r2 | main.rs:303:28:303:29 | [post] r2 | -| main.rs:303:28:303:29 | r2 | main.rs:303:28:303:29 | receiver for r2 | -| main.rs:303:28:303:29 | r2 | main.rs:304:28:304:29 | r2 | -| main.rs:303:28:303:34 | r2.ok() | main.rs:303:9:303:11 | o2a | -| main.rs:304:9:304:11 | [SSA] o2b | main.rs:306:10:306:12 | o2b | -| main.rs:304:9:304:11 | o2b | main.rs:304:9:304:11 | [SSA] o2b | -| main.rs:304:9:304:11 | o2b | main.rs:304:9:304:11 | o2b | -| main.rs:304:28:304:29 | [post] receiver for r2 | main.rs:304:28:304:29 | [post] r2 | -| main.rs:304:28:304:29 | r2 | main.rs:304:28:304:29 | receiver for r2 | -| main.rs:304:28:304:35 | r2.err() | main.rs:304:9:304:11 | o2b | -| main.rs:305:10:305:12 | [post] receiver for o2a | main.rs:305:10:305:12 | [post] o2a | -| main.rs:305:10:305:12 | o2a | main.rs:305:10:305:12 | receiver for o2a | -| main.rs:306:10:306:12 | [post] receiver for o2b | main.rs:306:10:306:12 | [post] o2b | -| main.rs:306:10:306:12 | o2b | main.rs:306:10:306:12 | receiver for o2b | -| main.rs:310:9:310:10 | [SSA] s1 | main.rs:313:14:313:15 | s1 | -| main.rs:310:9:310:10 | s1 | main.rs:310:9:310:10 | [SSA] s1 | -| main.rs:310:9:310:10 | s1 | main.rs:310:9:310:10 | s1 | -| main.rs:310:32:310:45 | Ok(...) | main.rs:310:9:310:10 | s1 | -| main.rs:311:9:311:10 | [SSA] s2 | main.rs:314:14:314:15 | s2 | -| main.rs:311:9:311:10 | s2 | main.rs:311:9:311:10 | [SSA] s2 | -| main.rs:311:9:311:10 | s2 | main.rs:311:9:311:10 | s2 | -| main.rs:311:32:311:36 | Ok(...) | main.rs:311:9:311:10 | s2 | -| main.rs:312:9:312:10 | [SSA] s3 | main.rs:317:14:317:15 | s3 | -| main.rs:312:9:312:10 | s3 | main.rs:312:9:312:10 | [SSA] s3 | -| main.rs:312:9:312:10 | s3 | main.rs:312:9:312:10 | s3 | -| main.rs:312:32:312:46 | Err(...) | main.rs:312:9:312:10 | s3 | -| main.rs:313:9:313:10 | [SSA] i1 | main.rs:315:10:315:11 | i1 | -| main.rs:313:9:313:10 | i1 | main.rs:313:9:313:10 | [SSA] i1 | -| main.rs:313:9:313:10 | i1 | main.rs:313:9:313:10 | i1 | -| main.rs:313:14:313:16 | TryExpr | main.rs:313:9:313:10 | i1 | -| main.rs:314:9:314:10 | [SSA] i2 | main.rs:316:10:316:11 | i2 | -| main.rs:314:9:314:10 | i2 | main.rs:314:9:314:10 | [SSA] i2 | -| main.rs:314:9:314:10 | i2 | main.rs:314:9:314:10 | i2 | -| main.rs:314:14:314:16 | TryExpr | main.rs:314:9:314:10 | i2 | -| main.rs:317:9:317:10 | [SSA] i3 | main.rs:318:10:318:11 | i3 | -| main.rs:317:9:317:10 | i3 | main.rs:317:9:317:10 | [SSA] i3 | -| main.rs:317:9:317:10 | i3 | main.rs:317:9:317:10 | i3 | -| main.rs:317:14:317:16 | TryExpr | main.rs:317:9:317:10 | i3 | -| main.rs:319:5:319:9 | Ok(...) | main.rs:309:46:320:1 | { ... } | -| main.rs:323:9:323:10 | [SSA] s1 | main.rs:324:10:324:11 | s1 | -| main.rs:323:9:323:10 | s1 | main.rs:323:9:323:10 | [SSA] s1 | -| main.rs:323:9:323:10 | s1 | main.rs:323:9:323:10 | s1 | -| main.rs:323:32:323:45 | Ok(...) | main.rs:323:9:323:10 | s1 | -| main.rs:324:10:324:11 | [post] receiver for s1 | main.rs:324:10:324:11 | [post] s1 | -| main.rs:324:10:324:11 | [post] s1 | main.rs:325:10:325:11 | s1 | -| main.rs:324:10:324:11 | s1 | main.rs:324:10:324:11 | receiver for s1 | -| main.rs:324:10:324:11 | s1 | main.rs:325:10:325:11 | s1 | -| main.rs:325:10:325:11 | [post] receiver for s1 | main.rs:325:10:325:11 | [post] s1 | -| main.rs:325:10:325:11 | s1 | main.rs:325:10:325:11 | receiver for s1 | -| main.rs:327:9:327:10 | [SSA] s2 | main.rs:328:10:328:11 | s2 | -| main.rs:327:9:327:10 | s2 | main.rs:327:9:327:10 | [SSA] s2 | -| main.rs:327:9:327:10 | s2 | main.rs:327:9:327:10 | s2 | -| main.rs:327:32:327:46 | Err(...) | main.rs:327:9:327:10 | s2 | -| main.rs:328:10:328:11 | [post] receiver for s2 | main.rs:328:10:328:11 | [post] s2 | -| main.rs:328:10:328:11 | [post] s2 | main.rs:329:10:329:11 | s2 | -| main.rs:328:10:328:11 | s2 | main.rs:328:10:328:11 | receiver for s2 | -| main.rs:328:10:328:11 | s2 | main.rs:329:10:329:11 | s2 | -| main.rs:329:10:329:11 | [post] receiver for s2 | main.rs:329:10:329:11 | [post] s2 | -| main.rs:329:10:329:11 | s2 | main.rs:329:10:329:11 | receiver for s2 | -| main.rs:338:9:338:10 | [SSA] s1 | main.rs:340:11:340:12 | s1 | -| main.rs:338:9:338:10 | s1 | main.rs:338:9:338:10 | [SSA] s1 | -| main.rs:338:9:338:10 | s1 | main.rs:338:9:338:10 | s1 | -| main.rs:338:14:338:39 | ...::A(...) | main.rs:338:9:338:10 | s1 | -| main.rs:339:9:339:10 | [SSA] s2 | main.rs:347:11:347:12 | s2 | +| main.rs:267:5:274:5 | if ... {...} | main.rs:265:25:275:1 | { ... } | +| main.rs:267:17:267:17 | [SSA] n | main.rs:269:18:269:18 | n | +| main.rs:267:17:267:17 | n | main.rs:267:17:267:17 | [SSA] n | +| main.rs:267:17:267:17 | n | main.rs:267:17:267:17 | n | +| main.rs:267:22:267:23 | s1 | main.rs:267:12:267:18 | Some(...) | +| main.rs:269:18:269:18 | [post] n | main.rs:273:14:273:14 | n | +| main.rs:269:18:269:18 | n | main.rs:273:14:273:14 | n | +| main.rs:270:13:270:16 | true | main.rs:268:12:271:9 | { ... } | +| main.rs:272:5:274:5 | { ... } | main.rs:267:5:274:5 | if ... {...} | +| main.rs:278:9:278:10 | [SSA] s1 | main.rs:279:10:279:11 | s1 | +| main.rs:278:9:278:10 | s1 | main.rs:278:9:278:10 | [SSA] s1 | +| main.rs:278:9:278:10 | s1 | main.rs:278:9:278:10 | s1 | +| main.rs:278:14:278:29 | Some(...) | main.rs:278:9:278:10 | s1 | +| main.rs:279:10:279:11 | [post] receiver for s1 | main.rs:279:10:279:11 | [post] s1 | +| main.rs:279:10:279:11 | s1 | main.rs:279:10:279:11 | receiver for s1 | +| main.rs:283:9:283:10 | [SSA] s1 | main.rs:284:10:284:11 | s1 | +| main.rs:283:9:283:10 | s1 | main.rs:283:9:283:10 | [SSA] s1 | +| main.rs:283:9:283:10 | s1 | main.rs:283:9:283:10 | s1 | +| main.rs:283:14:283:29 | Some(...) | main.rs:283:9:283:10 | s1 | +| main.rs:284:10:284:11 | [post] receiver for s1 | main.rs:284:10:284:11 | [post] s1 | +| main.rs:284:10:284:11 | s1 | main.rs:284:10:284:11 | receiver for s1 | +| main.rs:286:9:286:10 | [SSA] s2 | main.rs:287:10:287:11 | s2 | +| main.rs:286:9:286:10 | s2 | main.rs:286:9:286:10 | [SSA] s2 | +| main.rs:286:9:286:10 | s2 | main.rs:286:9:286:10 | s2 | +| main.rs:286:14:286:20 | Some(...) | main.rs:286:9:286:10 | s2 | +| main.rs:287:10:287:11 | [post] receiver for s2 | main.rs:287:10:287:11 | [post] s2 | +| main.rs:287:10:287:11 | s2 | main.rs:287:10:287:11 | receiver for s2 | +| main.rs:291:9:291:10 | [SSA] s1 | main.rs:292:10:292:11 | s1 | +| main.rs:291:9:291:10 | s1 | main.rs:291:9:291:10 | [SSA] s1 | +| main.rs:291:9:291:10 | s1 | main.rs:291:9:291:10 | s1 | +| main.rs:291:14:291:29 | Some(...) | main.rs:291:9:291:10 | s1 | +| main.rs:292:10:292:11 | [post] receiver for s1 | main.rs:292:10:292:11 | [post] s1 | +| main.rs:292:10:292:11 | s1 | main.rs:292:10:292:11 | receiver for s1 | +| main.rs:294:9:294:10 | [SSA] s2 | main.rs:295:10:295:11 | s2 | +| main.rs:294:9:294:10 | s2 | main.rs:294:9:294:10 | [SSA] s2 | +| main.rs:294:9:294:10 | s2 | main.rs:294:9:294:10 | s2 | +| main.rs:294:14:294:17 | None | main.rs:294:9:294:10 | s2 | +| main.rs:295:10:295:11 | [post] receiver for s2 | main.rs:295:10:295:11 | [post] s2 | +| main.rs:295:10:295:11 | s2 | main.rs:295:10:295:11 | receiver for s2 | +| main.rs:299:9:299:10 | [SSA] s1 | main.rs:301:14:301:15 | s1 | +| main.rs:299:9:299:10 | s1 | main.rs:299:9:299:10 | [SSA] s1 | +| main.rs:299:9:299:10 | s1 | main.rs:299:9:299:10 | s1 | +| main.rs:299:14:299:29 | Some(...) | main.rs:299:9:299:10 | s1 | +| main.rs:300:9:300:10 | [SSA] s2 | main.rs:303:10:303:11 | s2 | +| main.rs:300:9:300:10 | s2 | main.rs:300:9:300:10 | [SSA] s2 | +| main.rs:300:9:300:10 | s2 | main.rs:300:9:300:10 | s2 | +| main.rs:300:14:300:20 | Some(...) | main.rs:300:9:300:10 | s2 | +| main.rs:301:9:301:10 | [SSA] i1 | main.rs:302:10:302:11 | i1 | +| main.rs:301:9:301:10 | i1 | main.rs:301:9:301:10 | [SSA] i1 | +| main.rs:301:9:301:10 | i1 | main.rs:301:9:301:10 | i1 | +| main.rs:301:14:301:16 | TryExpr | main.rs:301:9:301:10 | i1 | +| main.rs:304:5:304:11 | Some(...) | main.rs:298:41:305:1 | { ... } | +| main.rs:308:9:308:10 | [SSA] r1 | main.rs:309:28:309:29 | r1 | +| main.rs:308:9:308:10 | r1 | main.rs:308:9:308:10 | [SSA] r1 | +| main.rs:308:9:308:10 | r1 | main.rs:308:9:308:10 | r1 | +| main.rs:308:32:308:45 | Ok(...) | main.rs:308:9:308:10 | r1 | +| main.rs:309:9:309:11 | [SSA] o1a | main.rs:311:10:311:12 | o1a | +| main.rs:309:9:309:11 | o1a | main.rs:309:9:309:11 | [SSA] o1a | +| main.rs:309:9:309:11 | o1a | main.rs:309:9:309:11 | o1a | +| main.rs:309:28:309:29 | [post] r1 | main.rs:310:28:310:29 | r1 | +| main.rs:309:28:309:29 | [post] receiver for r1 | main.rs:309:28:309:29 | [post] r1 | +| main.rs:309:28:309:29 | r1 | main.rs:309:28:309:29 | receiver for r1 | +| main.rs:309:28:309:29 | r1 | main.rs:310:28:310:29 | r1 | +| main.rs:309:28:309:34 | r1.ok() | main.rs:309:9:309:11 | o1a | +| main.rs:310:9:310:11 | [SSA] o1b | main.rs:312:10:312:12 | o1b | +| main.rs:310:9:310:11 | o1b | main.rs:310:9:310:11 | [SSA] o1b | +| main.rs:310:9:310:11 | o1b | main.rs:310:9:310:11 | o1b | +| main.rs:310:28:310:29 | [post] receiver for r1 | main.rs:310:28:310:29 | [post] r1 | +| main.rs:310:28:310:29 | r1 | main.rs:310:28:310:29 | receiver for r1 | +| main.rs:310:28:310:35 | r1.err() | main.rs:310:9:310:11 | o1b | +| main.rs:311:10:311:12 | [post] receiver for o1a | main.rs:311:10:311:12 | [post] o1a | +| main.rs:311:10:311:12 | o1a | main.rs:311:10:311:12 | receiver for o1a | +| main.rs:312:10:312:12 | [post] receiver for o1b | main.rs:312:10:312:12 | [post] o1b | +| main.rs:312:10:312:12 | o1b | main.rs:312:10:312:12 | receiver for o1b | +| main.rs:314:9:314:10 | [SSA] r2 | main.rs:315:28:315:29 | r2 | +| main.rs:314:9:314:10 | r2 | main.rs:314:9:314:10 | [SSA] r2 | +| main.rs:314:9:314:10 | r2 | main.rs:314:9:314:10 | r2 | +| main.rs:314:32:314:46 | Err(...) | main.rs:314:9:314:10 | r2 | +| main.rs:315:9:315:11 | [SSA] o2a | main.rs:317:10:317:12 | o2a | +| main.rs:315:9:315:11 | o2a | main.rs:315:9:315:11 | [SSA] o2a | +| main.rs:315:9:315:11 | o2a | main.rs:315:9:315:11 | o2a | +| main.rs:315:28:315:29 | [post] r2 | main.rs:316:28:316:29 | r2 | +| main.rs:315:28:315:29 | [post] receiver for r2 | main.rs:315:28:315:29 | [post] r2 | +| main.rs:315:28:315:29 | r2 | main.rs:315:28:315:29 | receiver for r2 | +| main.rs:315:28:315:29 | r2 | main.rs:316:28:316:29 | r2 | +| main.rs:315:28:315:34 | r2.ok() | main.rs:315:9:315:11 | o2a | +| main.rs:316:9:316:11 | [SSA] o2b | main.rs:318:10:318:12 | o2b | +| main.rs:316:9:316:11 | o2b | main.rs:316:9:316:11 | [SSA] o2b | +| main.rs:316:9:316:11 | o2b | main.rs:316:9:316:11 | o2b | +| main.rs:316:28:316:29 | [post] receiver for r2 | main.rs:316:28:316:29 | [post] r2 | +| main.rs:316:28:316:29 | r2 | main.rs:316:28:316:29 | receiver for r2 | +| main.rs:316:28:316:35 | r2.err() | main.rs:316:9:316:11 | o2b | +| main.rs:317:10:317:12 | [post] receiver for o2a | main.rs:317:10:317:12 | [post] o2a | +| main.rs:317:10:317:12 | o2a | main.rs:317:10:317:12 | receiver for o2a | +| main.rs:318:10:318:12 | [post] receiver for o2b | main.rs:318:10:318:12 | [post] o2b | +| main.rs:318:10:318:12 | o2b | main.rs:318:10:318:12 | receiver for o2b | +| main.rs:322:9:322:10 | [SSA] s1 | main.rs:325:14:325:15 | s1 | +| main.rs:322:9:322:10 | s1 | main.rs:322:9:322:10 | [SSA] s1 | +| main.rs:322:9:322:10 | s1 | main.rs:322:9:322:10 | s1 | +| main.rs:322:32:322:45 | Ok(...) | main.rs:322:9:322:10 | s1 | +| main.rs:323:9:323:10 | [SSA] s2 | main.rs:326:14:326:15 | s2 | +| main.rs:323:9:323:10 | s2 | main.rs:323:9:323:10 | [SSA] s2 | +| main.rs:323:9:323:10 | s2 | main.rs:323:9:323:10 | s2 | +| main.rs:323:32:323:36 | Ok(...) | main.rs:323:9:323:10 | s2 | +| main.rs:324:9:324:10 | [SSA] s3 | main.rs:329:14:329:15 | s3 | +| main.rs:324:9:324:10 | s3 | main.rs:324:9:324:10 | [SSA] s3 | +| main.rs:324:9:324:10 | s3 | main.rs:324:9:324:10 | s3 | +| main.rs:324:32:324:46 | Err(...) | main.rs:324:9:324:10 | s3 | +| main.rs:325:9:325:10 | [SSA] i1 | main.rs:327:10:327:11 | i1 | +| main.rs:325:9:325:10 | i1 | main.rs:325:9:325:10 | [SSA] i1 | +| main.rs:325:9:325:10 | i1 | main.rs:325:9:325:10 | i1 | +| main.rs:325:14:325:16 | TryExpr | main.rs:325:9:325:10 | i1 | +| main.rs:326:9:326:10 | [SSA] i2 | main.rs:328:10:328:11 | i2 | +| main.rs:326:9:326:10 | i2 | main.rs:326:9:326:10 | [SSA] i2 | +| main.rs:326:9:326:10 | i2 | main.rs:326:9:326:10 | i2 | +| main.rs:326:14:326:16 | TryExpr | main.rs:326:9:326:10 | i2 | +| main.rs:329:9:329:10 | [SSA] i3 | main.rs:330:10:330:11 | i3 | +| main.rs:329:9:329:10 | i3 | main.rs:329:9:329:10 | [SSA] i3 | +| main.rs:329:9:329:10 | i3 | main.rs:329:9:329:10 | i3 | +| main.rs:329:14:329:16 | TryExpr | main.rs:329:9:329:10 | i3 | +| main.rs:331:5:331:9 | Ok(...) | main.rs:321:46:332:1 | { ... } | +| main.rs:335:9:335:10 | [SSA] s1 | main.rs:336:10:336:11 | s1 | +| main.rs:335:9:335:10 | s1 | main.rs:335:9:335:10 | [SSA] s1 | +| main.rs:335:9:335:10 | s1 | main.rs:335:9:335:10 | s1 | +| main.rs:335:32:335:45 | Ok(...) | main.rs:335:9:335:10 | s1 | +| main.rs:336:10:336:11 | [post] receiver for s1 | main.rs:336:10:336:11 | [post] s1 | +| main.rs:336:10:336:11 | [post] s1 | main.rs:337:10:337:11 | s1 | +| main.rs:336:10:336:11 | s1 | main.rs:336:10:336:11 | receiver for s1 | +| main.rs:336:10:336:11 | s1 | main.rs:337:10:337:11 | s1 | +| main.rs:337:10:337:11 | [post] receiver for s1 | main.rs:337:10:337:11 | [post] s1 | +| main.rs:337:10:337:11 | s1 | main.rs:337:10:337:11 | receiver for s1 | +| main.rs:339:9:339:10 | [SSA] s2 | main.rs:340:10:340:11 | s2 | | main.rs:339:9:339:10 | s2 | main.rs:339:9:339:10 | [SSA] s2 | | main.rs:339:9:339:10 | s2 | main.rs:339:9:339:10 | s2 | -| main.rs:339:14:339:30 | ...::B(...) | main.rs:339:9:339:10 | s2 | -| main.rs:340:11:340:12 | s1 | main.rs:341:9:341:25 | ...::A(...) | -| main.rs:340:11:340:12 | s1 | main.rs:342:9:342:25 | ...::B(...) | -| main.rs:340:11:340:12 | s1 | main.rs:344:11:344:12 | s1 | -| main.rs:341:24:341:24 | [SSA] n | main.rs:341:35:341:35 | n | -| main.rs:341:24:341:24 | n | main.rs:341:24:341:24 | [SSA] n | -| main.rs:341:24:341:24 | n | main.rs:341:24:341:24 | n | -| main.rs:341:30:341:36 | sink(...) | main.rs:340:5:343:5 | match s1 { ... } | -| main.rs:342:24:342:24 | [SSA] n | main.rs:342:35:342:35 | n | -| main.rs:342:24:342:24 | n | main.rs:342:24:342:24 | [SSA] n | -| main.rs:342:24:342:24 | n | main.rs:342:24:342:24 | n | -| main.rs:342:30:342:36 | sink(...) | main.rs:340:5:343:5 | match s1 { ... } | -| main.rs:344:11:344:12 | s1 | main.rs:345:9:345:45 | ... \| ... | -| main.rs:345:9:345:45 | ... \| ... | main.rs:345:9:345:25 | ...::A(...) | -| main.rs:345:9:345:45 | ... \| ... | main.rs:345:29:345:45 | ...::B(...) | -| main.rs:345:24:345:24 | [SSA] n | main.rs:345:55:345:55 | n | -| main.rs:345:24:345:24 | n | main.rs:345:24:345:24 | [SSA] n | -| main.rs:345:24:345:24 | n | main.rs:345:24:345:24 | n | -| main.rs:345:44:345:44 | [SSA] n | main.rs:345:55:345:55 | n | -| main.rs:345:44:345:44 | n | main.rs:345:44:345:44 | [SSA] n | -| main.rs:345:44:345:44 | n | main.rs:345:44:345:44 | n | -| main.rs:345:50:345:56 | sink(...) | main.rs:344:5:346:5 | match s1 { ... } | -| main.rs:347:5:350:5 | match s2 { ... } | main.rs:337:48:351:1 | { ... } | -| main.rs:347:11:347:12 | s2 | main.rs:348:9:348:25 | ...::A(...) | -| main.rs:347:11:347:12 | s2 | main.rs:349:9:349:25 | ...::B(...) | -| main.rs:348:24:348:24 | [SSA] n | main.rs:348:35:348:35 | n | -| main.rs:348:24:348:24 | n | main.rs:348:24:348:24 | [SSA] n | -| main.rs:348:24:348:24 | n | main.rs:348:24:348:24 | n | -| main.rs:348:30:348:36 | sink(...) | main.rs:347:5:350:5 | match s2 { ... } | -| main.rs:349:24:349:24 | [SSA] n | main.rs:349:35:349:35 | n | -| main.rs:349:24:349:24 | n | main.rs:349:24:349:24 | [SSA] n | -| main.rs:349:24:349:24 | n | main.rs:349:24:349:24 | n | -| main.rs:349:30:349:36 | sink(...) | main.rs:347:5:350:5 | match s2 { ... } | -| main.rs:356:9:356:10 | [SSA] s1 | main.rs:358:11:358:12 | s1 | -| main.rs:356:9:356:10 | s1 | main.rs:356:9:356:10 | [SSA] s1 | -| main.rs:356:9:356:10 | s1 | main.rs:356:9:356:10 | s1 | -| main.rs:356:14:356:26 | A(...) | main.rs:356:9:356:10 | s1 | -| main.rs:357:9:357:10 | [SSA] s2 | main.rs:365:11:365:12 | s2 | -| main.rs:357:9:357:10 | s2 | main.rs:357:9:357:10 | [SSA] s2 | -| main.rs:357:9:357:10 | s2 | main.rs:357:9:357:10 | s2 | -| main.rs:357:14:357:17 | B(...) | main.rs:357:9:357:10 | s2 | -| main.rs:358:11:358:12 | s1 | main.rs:359:9:359:12 | A(...) | -| main.rs:358:11:358:12 | s1 | main.rs:360:9:360:12 | B(...) | -| main.rs:358:11:358:12 | s1 | main.rs:362:11:362:12 | s1 | -| main.rs:359:11:359:11 | [SSA] n | main.rs:359:22:359:22 | n | -| main.rs:359:11:359:11 | n | main.rs:359:11:359:11 | [SSA] n | -| main.rs:359:11:359:11 | n | main.rs:359:11:359:11 | n | -| main.rs:359:17:359:23 | sink(...) | main.rs:358:5:361:5 | match s1 { ... } | -| main.rs:360:11:360:11 | [SSA] n | main.rs:360:22:360:22 | n | -| main.rs:360:11:360:11 | n | main.rs:360:11:360:11 | [SSA] n | -| main.rs:360:11:360:11 | n | main.rs:360:11:360:11 | n | -| main.rs:360:17:360:23 | sink(...) | main.rs:358:5:361:5 | match s1 { ... } | -| main.rs:362:11:362:12 | s1 | main.rs:363:9:363:19 | ... \| ... | -| main.rs:363:9:363:19 | ... \| ... | main.rs:363:9:363:12 | A(...) | -| main.rs:363:9:363:19 | ... \| ... | main.rs:363:16:363:19 | B(...) | -| main.rs:363:11:363:11 | [SSA] n | main.rs:363:29:363:29 | n | -| main.rs:363:11:363:11 | n | main.rs:363:11:363:11 | [SSA] n | -| main.rs:363:11:363:11 | n | main.rs:363:11:363:11 | n | -| main.rs:363:18:363:18 | [SSA] n | main.rs:363:29:363:29 | n | -| main.rs:363:18:363:18 | n | main.rs:363:18:363:18 | [SSA] n | -| main.rs:363:18:363:18 | n | main.rs:363:18:363:18 | n | -| main.rs:363:24:363:30 | sink(...) | main.rs:362:5:364:5 | match s1 { ... } | -| main.rs:365:5:368:5 | match s2 { ... } | main.rs:355:50:369:1 | { ... } | -| main.rs:365:11:365:12 | s2 | main.rs:366:9:366:12 | A(...) | -| main.rs:365:11:365:12 | s2 | main.rs:367:9:367:12 | B(...) | -| main.rs:366:11:366:11 | [SSA] n | main.rs:366:22:366:22 | n | -| main.rs:366:11:366:11 | n | main.rs:366:11:366:11 | [SSA] n | -| main.rs:366:11:366:11 | n | main.rs:366:11:366:11 | n | -| main.rs:366:17:366:23 | sink(...) | main.rs:365:5:368:5 | match s2 { ... } | -| main.rs:367:11:367:11 | [SSA] n | main.rs:367:22:367:22 | n | -| main.rs:367:11:367:11 | n | main.rs:367:11:367:11 | [SSA] n | -| main.rs:367:11:367:11 | n | main.rs:367:11:367:11 | n | -| main.rs:367:17:367:23 | sink(...) | main.rs:365:5:368:5 | match s2 { ... } | -| main.rs:377:9:377:10 | [SSA] s1 | main.rs:381:11:381:12 | s1 | -| main.rs:377:9:377:10 | s1 | main.rs:377:9:377:10 | [SSA] s1 | -| main.rs:377:9:377:10 | s1 | main.rs:377:9:377:10 | s1 | -| main.rs:377:14:379:5 | ...::C {...} | main.rs:377:9:377:10 | s1 | -| main.rs:380:9:380:10 | [SSA] s2 | main.rs:388:11:388:12 | s2 | -| main.rs:380:9:380:10 | s2 | main.rs:380:9:380:10 | [SSA] s2 | -| main.rs:380:9:380:10 | s2 | main.rs:380:9:380:10 | s2 | -| main.rs:380:14:380:43 | ...::D {...} | main.rs:380:9:380:10 | s2 | -| main.rs:381:11:381:12 | s1 | main.rs:382:9:382:38 | ...::C {...} | -| main.rs:381:11:381:12 | s1 | main.rs:383:9:383:38 | ...::D {...} | -| main.rs:381:11:381:12 | s1 | main.rs:385:11:385:12 | s1 | -| main.rs:382:36:382:36 | [SSA] n | main.rs:382:48:382:48 | n | -| main.rs:382:36:382:36 | n | main.rs:382:36:382:36 | [SSA] n | -| main.rs:382:36:382:36 | n | main.rs:382:36:382:36 | n | -| main.rs:382:43:382:49 | sink(...) | main.rs:381:5:384:5 | match s1 { ... } | -| main.rs:383:36:383:36 | [SSA] n | main.rs:383:48:383:48 | n | -| main.rs:383:36:383:36 | n | main.rs:383:36:383:36 | [SSA] n | -| main.rs:383:36:383:36 | n | main.rs:383:36:383:36 | n | -| main.rs:383:43:383:49 | sink(...) | main.rs:381:5:384:5 | match s1 { ... } | -| main.rs:385:11:385:12 | s1 | main.rs:386:9:386:71 | ... \| ... | -| main.rs:386:9:386:71 | ... \| ... | main.rs:386:9:386:38 | ...::C {...} | -| main.rs:386:9:386:71 | ... \| ... | main.rs:386:42:386:71 | ...::D {...} | -| main.rs:386:36:386:36 | [SSA] n | main.rs:386:81:386:81 | n | -| main.rs:386:36:386:36 | n | main.rs:386:36:386:36 | [SSA] n | -| main.rs:386:36:386:36 | n | main.rs:386:36:386:36 | n | -| main.rs:386:69:386:69 | [SSA] n | main.rs:386:81:386:81 | n | -| main.rs:386:69:386:69 | n | main.rs:386:69:386:69 | [SSA] n | -| main.rs:386:69:386:69 | n | main.rs:386:69:386:69 | n | -| main.rs:386:76:386:82 | sink(...) | main.rs:385:5:387:5 | match s1 { ... } | -| main.rs:388:5:391:5 | match s2 { ... } | main.rs:376:49:392:1 | { ... } | -| main.rs:388:11:388:12 | s2 | main.rs:389:9:389:38 | ...::C {...} | -| main.rs:388:11:388:12 | s2 | main.rs:390:9:390:38 | ...::D {...} | -| main.rs:389:36:389:36 | [SSA] n | main.rs:389:48:389:48 | n | -| main.rs:389:36:389:36 | n | main.rs:389:36:389:36 | [SSA] n | -| main.rs:389:36:389:36 | n | main.rs:389:36:389:36 | n | -| main.rs:389:43:389:49 | sink(...) | main.rs:388:5:391:5 | match s2 { ... } | -| main.rs:390:36:390:36 | [SSA] n | main.rs:390:48:390:48 | n | -| main.rs:390:36:390:36 | n | main.rs:390:36:390:36 | [SSA] n | -| main.rs:390:36:390:36 | n | main.rs:390:36:390:36 | n | -| main.rs:390:43:390:49 | sink(...) | main.rs:388:5:391:5 | match s2 { ... } | -| main.rs:397:9:397:10 | [SSA] s1 | main.rs:401:11:401:12 | s1 | -| main.rs:397:9:397:10 | s1 | main.rs:397:9:397:10 | [SSA] s1 | -| main.rs:397:9:397:10 | s1 | main.rs:397:9:397:10 | s1 | -| main.rs:397:14:399:5 | C {...} | main.rs:397:9:397:10 | s1 | -| main.rs:400:9:400:10 | [SSA] s2 | main.rs:408:11:408:12 | s2 | -| main.rs:400:9:400:10 | s2 | main.rs:400:9:400:10 | [SSA] s2 | -| main.rs:400:9:400:10 | s2 | main.rs:400:9:400:10 | s2 | -| main.rs:400:14:400:29 | D {...} | main.rs:400:9:400:10 | s2 | -| main.rs:401:11:401:12 | s1 | main.rs:402:9:402:24 | C {...} | -| main.rs:401:11:401:12 | s1 | main.rs:403:9:403:24 | D {...} | -| main.rs:401:11:401:12 | s1 | main.rs:405:11:405:12 | s1 | -| main.rs:402:22:402:22 | [SSA] n | main.rs:402:34:402:34 | n | -| main.rs:402:22:402:22 | n | main.rs:402:22:402:22 | [SSA] n | -| main.rs:402:22:402:22 | n | main.rs:402:22:402:22 | n | -| main.rs:402:29:402:35 | sink(...) | main.rs:401:5:404:5 | match s1 { ... } | -| main.rs:403:22:403:22 | [SSA] n | main.rs:403:34:403:34 | n | -| main.rs:403:22:403:22 | n | main.rs:403:22:403:22 | [SSA] n | -| main.rs:403:22:403:22 | n | main.rs:403:22:403:22 | n | -| main.rs:403:29:403:35 | sink(...) | main.rs:401:5:404:5 | match s1 { ... } | -| main.rs:405:11:405:12 | s1 | main.rs:406:9:406:43 | ... \| ... | -| main.rs:406:9:406:43 | ... \| ... | main.rs:406:9:406:24 | C {...} | -| main.rs:406:9:406:43 | ... \| ... | main.rs:406:28:406:43 | D {...} | -| main.rs:406:22:406:22 | [SSA] n | main.rs:406:53:406:53 | n | -| main.rs:406:22:406:22 | n | main.rs:406:22:406:22 | [SSA] n | -| main.rs:406:22:406:22 | n | main.rs:406:22:406:22 | n | -| main.rs:406:41:406:41 | [SSA] n | main.rs:406:53:406:53 | n | -| main.rs:406:41:406:41 | n | main.rs:406:41:406:41 | [SSA] n | -| main.rs:406:41:406:41 | n | main.rs:406:41:406:41 | n | -| main.rs:406:48:406:54 | sink(...) | main.rs:405:5:407:5 | match s1 { ... } | -| main.rs:408:5:411:5 | match s2 { ... } | main.rs:396:51:412:1 | { ... } | -| main.rs:408:11:408:12 | s2 | main.rs:409:9:409:24 | C {...} | -| main.rs:408:11:408:12 | s2 | main.rs:410:9:410:24 | D {...} | -| main.rs:409:22:409:22 | [SSA] n | main.rs:409:34:409:34 | n | -| main.rs:409:22:409:22 | n | main.rs:409:22:409:22 | [SSA] n | -| main.rs:409:22:409:22 | n | main.rs:409:22:409:22 | n | -| main.rs:409:29:409:35 | sink(...) | main.rs:408:5:411:5 | match s2 { ... } | -| main.rs:410:22:410:22 | [SSA] n | main.rs:410:34:410:34 | n | -| main.rs:410:22:410:22 | n | main.rs:410:22:410:22 | [SSA] n | -| main.rs:410:22:410:22 | n | main.rs:410:22:410:22 | n | -| main.rs:410:29:410:35 | sink(...) | main.rs:408:5:411:5 | match s2 { ... } | -| main.rs:418:9:418:12 | [SSA] arr1 | main.rs:419:14:419:17 | arr1 | -| main.rs:418:9:418:12 | arr1 | main.rs:418:9:418:12 | [SSA] arr1 | -| main.rs:418:9:418:12 | arr1 | main.rs:418:9:418:12 | arr1 | -| main.rs:418:16:418:33 | [...] | main.rs:418:9:418:12 | arr1 | -| main.rs:419:9:419:10 | [SSA] n1 | main.rs:420:10:420:11 | n1 | -| main.rs:419:9:419:10 | n1 | main.rs:419:9:419:10 | [SSA] n1 | -| main.rs:419:9:419:10 | n1 | main.rs:419:9:419:10 | n1 | -| main.rs:419:14:419:20 | arr1[2] | main.rs:419:9:419:10 | n1 | -| main.rs:422:9:422:12 | [SSA] arr2 | main.rs:423:14:423:17 | arr2 | -| main.rs:422:9:422:12 | arr2 | main.rs:422:9:422:12 | [SSA] arr2 | -| main.rs:422:9:422:12 | arr2 | main.rs:422:9:422:12 | arr2 | -| main.rs:422:16:422:31 | [...; 10] | main.rs:422:9:422:12 | arr2 | -| main.rs:423:9:423:10 | [SSA] n2 | main.rs:424:10:424:11 | n2 | -| main.rs:423:9:423:10 | n2 | main.rs:423:9:423:10 | [SSA] n2 | -| main.rs:423:9:423:10 | n2 | main.rs:423:9:423:10 | n2 | -| main.rs:423:14:423:20 | arr2[4] | main.rs:423:9:423:10 | n2 | -| main.rs:426:9:426:12 | [SSA] arr3 | main.rs:427:14:427:17 | arr3 | -| main.rs:426:9:426:12 | arr3 | main.rs:426:9:426:12 | [SSA] arr3 | -| main.rs:426:9:426:12 | arr3 | main.rs:426:9:426:12 | arr3 | -| main.rs:426:16:426:24 | [...] | main.rs:426:9:426:12 | arr3 | -| main.rs:427:9:427:10 | [SSA] n3 | main.rs:428:10:428:11 | n3 | -| main.rs:427:9:427:10 | n3 | main.rs:427:9:427:10 | [SSA] n3 | -| main.rs:427:9:427:10 | n3 | main.rs:427:9:427:10 | n3 | -| main.rs:427:14:427:20 | arr3[2] | main.rs:427:9:427:10 | n3 | -| main.rs:432:9:432:12 | [SSA] arr1 | main.rs:433:15:433:18 | arr1 | -| main.rs:432:9:432:12 | arr1 | main.rs:432:9:432:12 | [SSA] arr1 | -| main.rs:432:9:432:12 | arr1 | main.rs:432:9:432:12 | arr1 | -| main.rs:432:16:432:33 | [...] | main.rs:432:9:432:12 | arr1 | -| main.rs:433:9:433:10 | [SSA] n1 | main.rs:434:14:434:15 | n1 | -| main.rs:433:9:433:10 | n1 | main.rs:433:9:433:10 | [SSA] n1 | -| main.rs:433:9:433:10 | n1 | main.rs:433:9:433:10 | n1 | -| main.rs:437:9:437:12 | [SSA] arr2 | main.rs:438:15:438:18 | arr2 | -| main.rs:437:9:437:12 | arr2 | main.rs:437:9:437:12 | [SSA] arr2 | -| main.rs:437:9:437:12 | arr2 | main.rs:437:9:437:12 | arr2 | -| main.rs:437:16:437:24 | [...] | main.rs:437:9:437:12 | arr2 | -| main.rs:438:5:440:5 | for ... in ... { ... } | main.rs:431:21:441:1 | { ... } | -| main.rs:438:9:438:10 | [SSA] n2 | main.rs:439:14:439:15 | n2 | -| main.rs:438:9:438:10 | n2 | main.rs:438:9:438:10 | [SSA] n2 | -| main.rs:438:9:438:10 | n2 | main.rs:438:9:438:10 | n2 | -| main.rs:444:9:444:12 | [SSA] arr1 | main.rs:445:11:445:14 | arr1 | +| main.rs:339:32:339:46 | Err(...) | main.rs:339:9:339:10 | s2 | +| main.rs:340:10:340:11 | [post] receiver for s2 | main.rs:340:10:340:11 | [post] s2 | +| main.rs:340:10:340:11 | [post] s2 | main.rs:341:10:341:11 | s2 | +| main.rs:340:10:340:11 | s2 | main.rs:340:10:340:11 | receiver for s2 | +| main.rs:340:10:340:11 | s2 | main.rs:341:10:341:11 | s2 | +| main.rs:341:10:341:11 | [post] receiver for s2 | main.rs:341:10:341:11 | [post] s2 | +| main.rs:341:10:341:11 | s2 | main.rs:341:10:341:11 | receiver for s2 | +| main.rs:350:9:350:10 | [SSA] s1 | main.rs:352:11:352:12 | s1 | +| main.rs:350:9:350:10 | s1 | main.rs:350:9:350:10 | [SSA] s1 | +| main.rs:350:9:350:10 | s1 | main.rs:350:9:350:10 | s1 | +| main.rs:350:14:350:39 | ...::A(...) | main.rs:350:9:350:10 | s1 | +| main.rs:351:9:351:10 | [SSA] s2 | main.rs:359:11:359:12 | s2 | +| main.rs:351:9:351:10 | s2 | main.rs:351:9:351:10 | [SSA] s2 | +| main.rs:351:9:351:10 | s2 | main.rs:351:9:351:10 | s2 | +| main.rs:351:14:351:30 | ...::B(...) | main.rs:351:9:351:10 | s2 | +| main.rs:352:11:352:12 | s1 | main.rs:353:9:353:25 | ...::A(...) | +| main.rs:352:11:352:12 | s1 | main.rs:354:9:354:25 | ...::B(...) | +| main.rs:352:11:352:12 | s1 | main.rs:356:11:356:12 | s1 | +| main.rs:353:24:353:24 | [SSA] n | main.rs:353:35:353:35 | n | +| main.rs:353:24:353:24 | n | main.rs:353:24:353:24 | [SSA] n | +| main.rs:353:24:353:24 | n | main.rs:353:24:353:24 | n | +| main.rs:353:30:353:36 | sink(...) | main.rs:352:5:355:5 | match s1 { ... } | +| main.rs:354:24:354:24 | [SSA] n | main.rs:354:35:354:35 | n | +| main.rs:354:24:354:24 | n | main.rs:354:24:354:24 | [SSA] n | +| main.rs:354:24:354:24 | n | main.rs:354:24:354:24 | n | +| main.rs:354:30:354:36 | sink(...) | main.rs:352:5:355:5 | match s1 { ... } | +| main.rs:356:11:356:12 | s1 | main.rs:357:9:357:45 | ... \| ... | +| main.rs:357:9:357:45 | ... \| ... | main.rs:357:9:357:25 | ...::A(...) | +| main.rs:357:9:357:45 | ... \| ... | main.rs:357:29:357:45 | ...::B(...) | +| main.rs:357:24:357:24 | [SSA] n | main.rs:357:55:357:55 | n | +| main.rs:357:24:357:24 | n | main.rs:357:24:357:24 | [SSA] n | +| main.rs:357:24:357:24 | n | main.rs:357:24:357:24 | n | +| main.rs:357:44:357:44 | [SSA] n | main.rs:357:55:357:55 | n | +| main.rs:357:44:357:44 | n | main.rs:357:44:357:44 | [SSA] n | +| main.rs:357:44:357:44 | n | main.rs:357:44:357:44 | n | +| main.rs:357:50:357:56 | sink(...) | main.rs:356:5:358:5 | match s1 { ... } | +| main.rs:359:5:362:5 | match s2 { ... } | main.rs:349:48:363:1 | { ... } | +| main.rs:359:11:359:12 | s2 | main.rs:360:9:360:25 | ...::A(...) | +| main.rs:359:11:359:12 | s2 | main.rs:361:9:361:25 | ...::B(...) | +| main.rs:360:24:360:24 | [SSA] n | main.rs:360:35:360:35 | n | +| main.rs:360:24:360:24 | n | main.rs:360:24:360:24 | [SSA] n | +| main.rs:360:24:360:24 | n | main.rs:360:24:360:24 | n | +| main.rs:360:30:360:36 | sink(...) | main.rs:359:5:362:5 | match s2 { ... } | +| main.rs:361:24:361:24 | [SSA] n | main.rs:361:35:361:35 | n | +| main.rs:361:24:361:24 | n | main.rs:361:24:361:24 | [SSA] n | +| main.rs:361:24:361:24 | n | main.rs:361:24:361:24 | n | +| main.rs:361:30:361:36 | sink(...) | main.rs:359:5:362:5 | match s2 { ... } | +| main.rs:368:9:368:10 | [SSA] s1 | main.rs:370:11:370:12 | s1 | +| main.rs:368:9:368:10 | s1 | main.rs:368:9:368:10 | [SSA] s1 | +| main.rs:368:9:368:10 | s1 | main.rs:368:9:368:10 | s1 | +| main.rs:368:14:368:26 | A(...) | main.rs:368:9:368:10 | s1 | +| main.rs:369:9:369:10 | [SSA] s2 | main.rs:377:11:377:12 | s2 | +| main.rs:369:9:369:10 | s2 | main.rs:369:9:369:10 | [SSA] s2 | +| main.rs:369:9:369:10 | s2 | main.rs:369:9:369:10 | s2 | +| main.rs:369:14:369:17 | B(...) | main.rs:369:9:369:10 | s2 | +| main.rs:370:11:370:12 | s1 | main.rs:371:9:371:12 | A(...) | +| main.rs:370:11:370:12 | s1 | main.rs:372:9:372:12 | B(...) | +| main.rs:370:11:370:12 | s1 | main.rs:374:11:374:12 | s1 | +| main.rs:371:11:371:11 | [SSA] n | main.rs:371:22:371:22 | n | +| main.rs:371:11:371:11 | n | main.rs:371:11:371:11 | [SSA] n | +| main.rs:371:11:371:11 | n | main.rs:371:11:371:11 | n | +| main.rs:371:17:371:23 | sink(...) | main.rs:370:5:373:5 | match s1 { ... } | +| main.rs:372:11:372:11 | [SSA] n | main.rs:372:22:372:22 | n | +| main.rs:372:11:372:11 | n | main.rs:372:11:372:11 | [SSA] n | +| main.rs:372:11:372:11 | n | main.rs:372:11:372:11 | n | +| main.rs:372:17:372:23 | sink(...) | main.rs:370:5:373:5 | match s1 { ... } | +| main.rs:374:11:374:12 | s1 | main.rs:375:9:375:19 | ... \| ... | +| main.rs:375:9:375:19 | ... \| ... | main.rs:375:9:375:12 | A(...) | +| main.rs:375:9:375:19 | ... \| ... | main.rs:375:16:375:19 | B(...) | +| main.rs:375:11:375:11 | [SSA] n | main.rs:375:29:375:29 | n | +| main.rs:375:11:375:11 | n | main.rs:375:11:375:11 | [SSA] n | +| main.rs:375:11:375:11 | n | main.rs:375:11:375:11 | n | +| main.rs:375:18:375:18 | [SSA] n | main.rs:375:29:375:29 | n | +| main.rs:375:18:375:18 | n | main.rs:375:18:375:18 | [SSA] n | +| main.rs:375:18:375:18 | n | main.rs:375:18:375:18 | n | +| main.rs:375:24:375:30 | sink(...) | main.rs:374:5:376:5 | match s1 { ... } | +| main.rs:377:5:380:5 | match s2 { ... } | main.rs:367:50:381:1 | { ... } | +| main.rs:377:11:377:12 | s2 | main.rs:378:9:378:12 | A(...) | +| main.rs:377:11:377:12 | s2 | main.rs:379:9:379:12 | B(...) | +| main.rs:378:11:378:11 | [SSA] n | main.rs:378:22:378:22 | n | +| main.rs:378:11:378:11 | n | main.rs:378:11:378:11 | [SSA] n | +| main.rs:378:11:378:11 | n | main.rs:378:11:378:11 | n | +| main.rs:378:17:378:23 | sink(...) | main.rs:377:5:380:5 | match s2 { ... } | +| main.rs:379:11:379:11 | [SSA] n | main.rs:379:22:379:22 | n | +| main.rs:379:11:379:11 | n | main.rs:379:11:379:11 | [SSA] n | +| main.rs:379:11:379:11 | n | main.rs:379:11:379:11 | n | +| main.rs:379:17:379:23 | sink(...) | main.rs:377:5:380:5 | match s2 { ... } | +| main.rs:389:9:389:10 | [SSA] s1 | main.rs:393:11:393:12 | s1 | +| main.rs:389:9:389:10 | s1 | main.rs:389:9:389:10 | [SSA] s1 | +| main.rs:389:9:389:10 | s1 | main.rs:389:9:389:10 | s1 | +| main.rs:389:14:391:5 | ...::C {...} | main.rs:389:9:389:10 | s1 | +| main.rs:392:9:392:10 | [SSA] s2 | main.rs:400:11:400:12 | s2 | +| main.rs:392:9:392:10 | s2 | main.rs:392:9:392:10 | [SSA] s2 | +| main.rs:392:9:392:10 | s2 | main.rs:392:9:392:10 | s2 | +| main.rs:392:14:392:43 | ...::D {...} | main.rs:392:9:392:10 | s2 | +| main.rs:393:11:393:12 | s1 | main.rs:394:9:394:38 | ...::C {...} | +| main.rs:393:11:393:12 | s1 | main.rs:395:9:395:38 | ...::D {...} | +| main.rs:393:11:393:12 | s1 | main.rs:397:11:397:12 | s1 | +| main.rs:394:36:394:36 | [SSA] n | main.rs:394:48:394:48 | n | +| main.rs:394:36:394:36 | n | main.rs:394:36:394:36 | [SSA] n | +| main.rs:394:36:394:36 | n | main.rs:394:36:394:36 | n | +| main.rs:394:43:394:49 | sink(...) | main.rs:393:5:396:5 | match s1 { ... } | +| main.rs:395:36:395:36 | [SSA] n | main.rs:395:48:395:48 | n | +| main.rs:395:36:395:36 | n | main.rs:395:36:395:36 | [SSA] n | +| main.rs:395:36:395:36 | n | main.rs:395:36:395:36 | n | +| main.rs:395:43:395:49 | sink(...) | main.rs:393:5:396:5 | match s1 { ... } | +| main.rs:397:11:397:12 | s1 | main.rs:398:9:398:71 | ... \| ... | +| main.rs:398:9:398:71 | ... \| ... | main.rs:398:9:398:38 | ...::C {...} | +| main.rs:398:9:398:71 | ... \| ... | main.rs:398:42:398:71 | ...::D {...} | +| main.rs:398:36:398:36 | [SSA] n | main.rs:398:81:398:81 | n | +| main.rs:398:36:398:36 | n | main.rs:398:36:398:36 | [SSA] n | +| main.rs:398:36:398:36 | n | main.rs:398:36:398:36 | n | +| main.rs:398:69:398:69 | [SSA] n | main.rs:398:81:398:81 | n | +| main.rs:398:69:398:69 | n | main.rs:398:69:398:69 | [SSA] n | +| main.rs:398:69:398:69 | n | main.rs:398:69:398:69 | n | +| main.rs:398:76:398:82 | sink(...) | main.rs:397:5:399:5 | match s1 { ... } | +| main.rs:400:5:403:5 | match s2 { ... } | main.rs:388:49:404:1 | { ... } | +| main.rs:400:11:400:12 | s2 | main.rs:401:9:401:38 | ...::C {...} | +| main.rs:400:11:400:12 | s2 | main.rs:402:9:402:38 | ...::D {...} | +| main.rs:401:36:401:36 | [SSA] n | main.rs:401:48:401:48 | n | +| main.rs:401:36:401:36 | n | main.rs:401:36:401:36 | [SSA] n | +| main.rs:401:36:401:36 | n | main.rs:401:36:401:36 | n | +| main.rs:401:43:401:49 | sink(...) | main.rs:400:5:403:5 | match s2 { ... } | +| main.rs:402:36:402:36 | [SSA] n | main.rs:402:48:402:48 | n | +| main.rs:402:36:402:36 | n | main.rs:402:36:402:36 | [SSA] n | +| main.rs:402:36:402:36 | n | main.rs:402:36:402:36 | n | +| main.rs:402:43:402:49 | sink(...) | main.rs:400:5:403:5 | match s2 { ... } | +| main.rs:409:9:409:10 | [SSA] s1 | main.rs:413:11:413:12 | s1 | +| main.rs:409:9:409:10 | s1 | main.rs:409:9:409:10 | [SSA] s1 | +| main.rs:409:9:409:10 | s1 | main.rs:409:9:409:10 | s1 | +| main.rs:409:14:411:5 | C {...} | main.rs:409:9:409:10 | s1 | +| main.rs:412:9:412:10 | [SSA] s2 | main.rs:420:11:420:12 | s2 | +| main.rs:412:9:412:10 | s2 | main.rs:412:9:412:10 | [SSA] s2 | +| main.rs:412:9:412:10 | s2 | main.rs:412:9:412:10 | s2 | +| main.rs:412:14:412:29 | D {...} | main.rs:412:9:412:10 | s2 | +| main.rs:413:11:413:12 | s1 | main.rs:414:9:414:24 | C {...} | +| main.rs:413:11:413:12 | s1 | main.rs:415:9:415:24 | D {...} | +| main.rs:413:11:413:12 | s1 | main.rs:417:11:417:12 | s1 | +| main.rs:414:22:414:22 | [SSA] n | main.rs:414:34:414:34 | n | +| main.rs:414:22:414:22 | n | main.rs:414:22:414:22 | [SSA] n | +| main.rs:414:22:414:22 | n | main.rs:414:22:414:22 | n | +| main.rs:414:29:414:35 | sink(...) | main.rs:413:5:416:5 | match s1 { ... } | +| main.rs:415:22:415:22 | [SSA] n | main.rs:415:34:415:34 | n | +| main.rs:415:22:415:22 | n | main.rs:415:22:415:22 | [SSA] n | +| main.rs:415:22:415:22 | n | main.rs:415:22:415:22 | n | +| main.rs:415:29:415:35 | sink(...) | main.rs:413:5:416:5 | match s1 { ... } | +| main.rs:417:11:417:12 | s1 | main.rs:418:9:418:43 | ... \| ... | +| main.rs:418:9:418:43 | ... \| ... | main.rs:418:9:418:24 | C {...} | +| main.rs:418:9:418:43 | ... \| ... | main.rs:418:28:418:43 | D {...} | +| main.rs:418:22:418:22 | [SSA] n | main.rs:418:53:418:53 | n | +| main.rs:418:22:418:22 | n | main.rs:418:22:418:22 | [SSA] n | +| main.rs:418:22:418:22 | n | main.rs:418:22:418:22 | n | +| main.rs:418:41:418:41 | [SSA] n | main.rs:418:53:418:53 | n | +| main.rs:418:41:418:41 | n | main.rs:418:41:418:41 | [SSA] n | +| main.rs:418:41:418:41 | n | main.rs:418:41:418:41 | n | +| main.rs:418:48:418:54 | sink(...) | main.rs:417:5:419:5 | match s1 { ... } | +| main.rs:420:5:423:5 | match s2 { ... } | main.rs:408:51:424:1 | { ... } | +| main.rs:420:11:420:12 | s2 | main.rs:421:9:421:24 | C {...} | +| main.rs:420:11:420:12 | s2 | main.rs:422:9:422:24 | D {...} | +| main.rs:421:22:421:22 | [SSA] n | main.rs:421:34:421:34 | n | +| main.rs:421:22:421:22 | n | main.rs:421:22:421:22 | [SSA] n | +| main.rs:421:22:421:22 | n | main.rs:421:22:421:22 | n | +| main.rs:421:29:421:35 | sink(...) | main.rs:420:5:423:5 | match s2 { ... } | +| main.rs:422:22:422:22 | [SSA] n | main.rs:422:34:422:34 | n | +| main.rs:422:22:422:22 | n | main.rs:422:22:422:22 | [SSA] n | +| main.rs:422:22:422:22 | n | main.rs:422:22:422:22 | n | +| main.rs:422:29:422:35 | sink(...) | main.rs:420:5:423:5 | match s2 { ... } | +| main.rs:430:9:430:12 | [SSA] arr1 | main.rs:431:14:431:17 | arr1 | +| main.rs:430:9:430:12 | arr1 | main.rs:430:9:430:12 | [SSA] arr1 | +| main.rs:430:9:430:12 | arr1 | main.rs:430:9:430:12 | arr1 | +| main.rs:430:16:430:33 | [...] | main.rs:430:9:430:12 | arr1 | +| main.rs:431:9:431:10 | [SSA] n1 | main.rs:432:10:432:11 | n1 | +| main.rs:431:9:431:10 | n1 | main.rs:431:9:431:10 | [SSA] n1 | +| main.rs:431:9:431:10 | n1 | main.rs:431:9:431:10 | n1 | +| main.rs:431:14:431:20 | arr1[2] | main.rs:431:9:431:10 | n1 | +| main.rs:434:9:434:12 | [SSA] arr2 | main.rs:435:14:435:17 | arr2 | +| main.rs:434:9:434:12 | arr2 | main.rs:434:9:434:12 | [SSA] arr2 | +| main.rs:434:9:434:12 | arr2 | main.rs:434:9:434:12 | arr2 | +| main.rs:434:16:434:31 | [...; 10] | main.rs:434:9:434:12 | arr2 | +| main.rs:435:9:435:10 | [SSA] n2 | main.rs:436:10:436:11 | n2 | +| main.rs:435:9:435:10 | n2 | main.rs:435:9:435:10 | [SSA] n2 | +| main.rs:435:9:435:10 | n2 | main.rs:435:9:435:10 | n2 | +| main.rs:435:14:435:20 | arr2[4] | main.rs:435:9:435:10 | n2 | +| main.rs:438:9:438:12 | [SSA] arr3 | main.rs:439:14:439:17 | arr3 | +| main.rs:438:9:438:12 | arr3 | main.rs:438:9:438:12 | [SSA] arr3 | +| main.rs:438:9:438:12 | arr3 | main.rs:438:9:438:12 | arr3 | +| main.rs:438:16:438:24 | [...] | main.rs:438:9:438:12 | arr3 | +| main.rs:439:9:439:10 | [SSA] n3 | main.rs:440:10:440:11 | n3 | +| main.rs:439:9:439:10 | n3 | main.rs:439:9:439:10 | [SSA] n3 | +| main.rs:439:9:439:10 | n3 | main.rs:439:9:439:10 | n3 | +| main.rs:439:14:439:20 | arr3[2] | main.rs:439:9:439:10 | n3 | +| main.rs:444:9:444:12 | [SSA] arr1 | main.rs:445:15:445:18 | arr1 | | main.rs:444:9:444:12 | arr1 | main.rs:444:9:444:12 | [SSA] arr1 | | main.rs:444:9:444:12 | arr1 | main.rs:444:9:444:12 | arr1 | | main.rs:444:16:444:33 | [...] | main.rs:444:9:444:12 | arr1 | -| main.rs:445:5:451:5 | match arr1 { ... } | main.rs:443:26:452:1 | { ... } | -| main.rs:445:11:445:14 | arr1 | main.rs:446:9:446:17 | SlicePat | -| main.rs:446:10:446:10 | [SSA] a | main.rs:447:18:447:18 | a | -| main.rs:446:10:446:10 | a | main.rs:446:10:446:10 | [SSA] a | -| main.rs:446:10:446:10 | a | main.rs:446:10:446:10 | a | -| main.rs:446:13:446:13 | [SSA] b | main.rs:448:18:448:18 | b | -| main.rs:446:13:446:13 | b | main.rs:446:13:446:13 | [SSA] b | -| main.rs:446:13:446:13 | b | main.rs:446:13:446:13 | b | -| main.rs:446:16:446:16 | [SSA] c | main.rs:449:18:449:18 | c | -| main.rs:446:16:446:16 | c | main.rs:446:16:446:16 | [SSA] c | -| main.rs:446:16:446:16 | c | main.rs:446:16:446:16 | c | -| main.rs:446:22:450:9 | { ... } | main.rs:445:5:451:5 | match arr1 { ... } | -| main.rs:455:9:455:19 | mut mut_arr | main.rs:455:13:455:19 | mut_arr | -| main.rs:455:13:455:19 | [SSA] mut_arr | main.rs:456:10:456:16 | mut_arr | -| main.rs:455:13:455:19 | mut_arr | main.rs:455:13:455:19 | [SSA] mut_arr | -| main.rs:455:23:455:31 | [...] | main.rs:455:9:455:19 | mut mut_arr | -| main.rs:456:10:456:16 | [post] mut_arr | main.rs:458:5:458:11 | mut_arr | -| main.rs:456:10:456:16 | mut_arr | main.rs:458:5:458:11 | mut_arr | -| main.rs:458:5:458:11 | [post] mut_arr | main.rs:459:13:459:19 | mut_arr | -| main.rs:458:5:458:11 | mut_arr | main.rs:459:13:459:19 | mut_arr | -| main.rs:458:18:458:27 | source(...) | main.rs:458:5:458:14 | mut_arr[1] | -| main.rs:459:9:459:9 | [SSA] d | main.rs:460:10:460:10 | d | -| main.rs:459:9:459:9 | d | main.rs:459:9:459:9 | [SSA] d | -| main.rs:459:9:459:9 | d | main.rs:459:9:459:9 | d | -| main.rs:459:13:459:19 | [post] mut_arr | main.rs:461:10:461:16 | mut_arr | -| main.rs:459:13:459:19 | mut_arr | main.rs:461:10:461:16 | mut_arr | -| main.rs:459:13:459:22 | mut_arr[1] | main.rs:459:9:459:9 | d | -| main.rs:466:39:466:43 | [SSA] names | main.rs:468:25:468:29 | names | -| main.rs:466:39:466:43 | names | main.rs:466:39:466:43 | [SSA] names | -| main.rs:466:39:466:43 | names | main.rs:466:39:466:43 | names | -| main.rs:466:39:466:72 | ...: Vec::<...> | main.rs:466:39:466:43 | names | -| main.rs:467:9:467:20 | default_name | main.rs:467:9:467:20 | [SSA] default_name | -| main.rs:467:9:467:20 | default_name | main.rs:467:9:467:20 | default_name | -| main.rs:467:24:467:33 | [post] receiver for source(...) | main.rs:467:24:467:33 | [post] source(...) | -| main.rs:467:24:467:33 | source(...) | main.rs:467:24:467:33 | receiver for source(...) | -| main.rs:467:24:467:45 | ... .to_string() | main.rs:467:9:467:20 | default_name | -| main.rs:467:24:467:45 | ... .to_string() | main.rs:468:9:468:20 | SSA phi read(default_name) | -| main.rs:468:5:474:5 | for ... in ... { ... } | main.rs:466:75:475:1 | { ... } | -| main.rs:468:9:468:20 | SSA phi read(default_name) | main.rs:470:41:470:67 | default_name | -| main.rs:468:10:468:13 | [SSA] cond | main.rs:469:12:469:15 | cond | -| main.rs:468:10:468:13 | cond | main.rs:468:10:468:13 | [SSA] cond | -| main.rs:468:10:468:13 | cond | main.rs:468:10:468:13 | cond | -| main.rs:468:16:468:19 | [SSA] name | main.rs:470:21:470:24 | name | -| main.rs:468:16:468:19 | name | main.rs:468:16:468:19 | [SSA] name | -| main.rs:468:16:468:19 | name | main.rs:468:16:468:19 | name | -| main.rs:469:9:473:9 | if cond {...} | main.rs:468:31:474:5 | { ... } | -| main.rs:470:17:470:17 | [SSA] n | main.rs:471:18:471:18 | n | -| main.rs:470:17:470:17 | n | main.rs:470:17:470:17 | [SSA] n | -| main.rs:470:17:470:17 | n | main.rs:470:17:470:17 | n | -| main.rs:470:21:470:24 | [post] receiver for name | main.rs:470:21:470:24 | [post] name | -| main.rs:470:21:470:24 | name | main.rs:470:21:470:24 | receiver for name | -| main.rs:470:21:470:68 | name.unwrap_or_else(...) | main.rs:470:17:470:17 | n | -| main.rs:470:41:470:67 | [post] default_name | main.rs:468:9:468:20 | SSA phi read(default_name) | -| main.rs:470:41:470:67 | closure self in \|...\| ... | main.rs:470:44:470:55 | this | -| main.rs:470:41:470:67 | default_name | main.rs:468:9:468:20 | SSA phi read(default_name) | -| main.rs:470:44:470:55 | [post] receiver for default_name | main.rs:470:44:470:55 | [post] default_name | -| main.rs:470:44:470:55 | default_name | main.rs:470:44:470:55 | receiver for default_name | -| main.rs:471:18:471:18 | [post] receiver for n | main.rs:471:18:471:18 | [post] n | -| main.rs:471:18:471:18 | n | main.rs:471:18:471:18 | receiver for n | -| main.rs:484:9:484:9 | [SSA] s | main.rs:485:10:485:10 | s | -| main.rs:484:9:484:9 | s | main.rs:484:9:484:9 | [SSA] s | -| main.rs:484:9:484:9 | s | main.rs:484:9:484:9 | s | -| main.rs:484:13:484:27 | MacroExpr | main.rs:484:9:484:9 | s | -| main.rs:484:25:484:26 | source(...) | main.rs:484:13:484:27 | MacroExpr | -| main.rs:488:16:488:16 | [SSA] s | main.rs:489:20:489:20 | s | -| main.rs:488:16:488:16 | s | main.rs:488:16:488:16 | [SSA] s | -| main.rs:488:16:488:16 | s | main.rs:488:16:488:16 | s | -| main.rs:488:16:488:24 | ...: String | main.rs:488:16:488:16 | s | -| main.rs:489:14:489:20 | FormatArgsExpr | main.rs:489:14:489:20 | MacroExpr | -| main.rs:489:14:489:20 | MacroBlockExpr | main.rs:489:5:489:21 | MacroExpr | -| main.rs:489:14:489:20 | [post] MacroExpr | main.rs:489:14:489:20 | [post] FormatArgsExpr | -| main.rs:489:14:489:20 | { ... } | main.rs:489:14:489:20 | MacroBlockExpr | -| main.rs:493:9:493:9 | [SSA] a | main.rs:494:13:494:13 | a | -| main.rs:493:9:493:9 | a | main.rs:493:9:493:9 | [SSA] a | -| main.rs:493:9:493:9 | a | main.rs:493:9:493:9 | a | -| main.rs:493:13:493:22 | source(...) | main.rs:493:9:493:9 | a | -| main.rs:494:9:494:9 | [SSA] b | main.rs:495:13:495:13 | b | -| main.rs:494:9:494:9 | b | main.rs:494:9:494:9 | [SSA] b | -| main.rs:494:9:494:9 | b | main.rs:494:9:494:9 | b | -| main.rs:494:13:494:13 | [post] a | main.rs:498:10:498:10 | a | -| main.rs:494:13:494:13 | [post] receiver for a | main.rs:494:13:494:13 | [post] a | -| main.rs:494:13:494:13 | a | main.rs:494:13:494:13 | receiver for a | -| main.rs:494:13:494:13 | a | main.rs:498:10:498:10 | a | -| main.rs:494:13:494:25 | a.to_string() | main.rs:494:9:494:9 | b | -| main.rs:495:9:495:9 | [SSA] c | main.rs:500:10:500:10 | c | -| main.rs:495:9:495:9 | c | main.rs:495:9:495:9 | [SSA] c | -| main.rs:495:9:495:9 | c | main.rs:495:9:495:9 | c | -| main.rs:495:13:495:13 | [post] b | main.rs:496:18:496:18 | b | -| main.rs:495:13:495:13 | [post] receiver for b | main.rs:495:13:495:13 | [post] b | -| main.rs:495:13:495:13 | b | main.rs:495:13:495:13 | receiver for b | -| main.rs:495:13:495:13 | b | main.rs:496:18:496:18 | b | -| main.rs:495:13:495:28 | [post] receiver for b.parse() | main.rs:495:13:495:28 | [post] b.parse() | -| main.rs:495:13:495:28 | b.parse() | main.rs:495:13:495:28 | receiver for b.parse() | -| main.rs:495:13:495:37 | ... .unwrap() | main.rs:495:9:495:9 | c | -| main.rs:496:9:496:9 | [SSA] d | main.rs:501:10:501:10 | d | -| main.rs:496:9:496:9 | d | main.rs:496:9:496:9 | [SSA] d | -| main.rs:496:9:496:9 | d | main.rs:496:9:496:9 | d | -| main.rs:496:18:496:18 | [post] b | main.rs:499:17:499:17 | b | -| main.rs:496:18:496:18 | [post] receiver for b | main.rs:496:18:496:18 | [post] b | -| main.rs:496:18:496:18 | b | main.rs:496:18:496:18 | receiver for b | -| main.rs:496:18:496:18 | b | main.rs:499:17:499:17 | b | -| main.rs:496:18:496:26 | [post] receiver for b.parse() | main.rs:496:18:496:26 | [post] b.parse() | -| main.rs:496:18:496:26 | b.parse() | main.rs:496:18:496:26 | receiver for b.parse() | -| main.rs:496:18:496:35 | ... .unwrap() | main.rs:496:9:496:9 | d | -| main.rs:505:9:505:10 | [SSA] vs | main.rs:507:10:507:11 | vs | -| main.rs:505:9:505:10 | vs | main.rs:505:9:505:10 | [SSA] vs | -| main.rs:505:9:505:10 | vs | main.rs:505:9:505:10 | vs | -| main.rs:505:14:505:34 | [...] | main.rs:505:9:505:10 | vs | -| main.rs:507:10:507:11 | [post] vs | main.rs:508:11:508:12 | vs | -| main.rs:507:10:507:11 | vs | main.rs:508:11:508:12 | vs | -| main.rs:508:11:508:12 | [post] receiver for vs | main.rs:508:11:508:12 | [post] vs | -| main.rs:508:11:508:12 | [post] vs | main.rs:509:11:509:12 | vs | -| main.rs:508:11:508:12 | vs | main.rs:508:11:508:12 | receiver for vs | -| main.rs:508:11:508:12 | vs | main.rs:509:11:509:12 | vs | -| main.rs:508:11:508:19 | [post] receiver for vs.iter() | main.rs:508:11:508:19 | [post] vs.iter() | -| main.rs:508:11:508:19 | vs.iter() | main.rs:508:11:508:19 | receiver for vs.iter() | -| main.rs:508:11:508:26 | ... .next() | main.rs:508:11:508:26 | receiver for ... .next() | -| main.rs:508:11:508:26 | [post] receiver for ... .next() | main.rs:508:11:508:26 | [post] ... .next() | -| main.rs:508:11:508:35 | ... .unwrap() | main.rs:508:11:508:35 | receiver for ... .unwrap() | -| main.rs:508:11:508:35 | [post] receiver for ... .unwrap() | main.rs:508:11:508:35 | [post] ... .unwrap() | -| main.rs:509:11:509:12 | [post] receiver for vs | main.rs:509:11:509:12 | [post] vs | -| main.rs:509:11:509:12 | [post] vs | main.rs:511:14:511:15 | vs | -| main.rs:509:11:509:12 | vs | main.rs:509:11:509:12 | receiver for vs | -| main.rs:509:11:509:12 | vs | main.rs:511:14:511:15 | vs | -| main.rs:509:11:509:19 | [post] receiver for vs.iter() | main.rs:509:11:509:19 | [post] vs.iter() | -| main.rs:509:11:509:19 | vs.iter() | main.rs:509:11:509:19 | receiver for vs.iter() | -| main.rs:509:11:509:26 | ... .nth(...) | main.rs:509:11:509:26 | receiver for ... .nth(...) | -| main.rs:509:11:509:26 | [post] receiver for ... .nth(...) | main.rs:509:11:509:26 | [post] ... .nth(...) | -| main.rs:509:11:509:35 | ... .unwrap() | main.rs:509:11:509:35 | receiver for ... .unwrap() | -| main.rs:509:11:509:35 | [post] receiver for ... .unwrap() | main.rs:509:11:509:35 | [post] ... .unwrap() | -| main.rs:511:9:511:9 | [SSA] v | main.rs:512:14:512:14 | v | -| main.rs:511:9:511:9 | v | main.rs:511:9:511:9 | [SSA] v | -| main.rs:511:9:511:9 | v | main.rs:511:9:511:9 | v | -| main.rs:511:14:511:15 | vs | main.rs:514:15:514:16 | vs | -| main.rs:514:10:514:10 | [SSA] v | main.rs:515:14:515:14 | v | -| main.rs:514:10:514:10 | v | main.rs:514:10:514:10 | [SSA] v | -| main.rs:514:10:514:10 | v | main.rs:514:10:514:10 | v | -| main.rs:514:15:514:16 | [post] receiver for vs | main.rs:514:15:514:16 | [post] vs | -| main.rs:514:15:514:16 | [post] vs | main.rs:518:26:518:27 | vs | -| main.rs:514:15:514:16 | vs | main.rs:514:15:514:16 | receiver for vs | -| main.rs:514:15:514:16 | vs | main.rs:518:26:518:27 | vs | -| main.rs:518:9:518:11 | [SSA] vs2 | main.rs:519:15:519:17 | vs2 | -| main.rs:518:9:518:11 | vs2 | main.rs:518:9:518:11 | [SSA] vs2 | -| main.rs:518:9:518:11 | vs2 | main.rs:518:9:518:11 | vs2 | -| main.rs:518:26:518:27 | [post] receiver for vs | main.rs:518:26:518:27 | [post] vs | -| main.rs:518:26:518:27 | [post] vs | main.rs:523:5:523:6 | vs | -| main.rs:518:26:518:27 | vs | main.rs:518:26:518:27 | receiver for vs | -| main.rs:518:26:518:27 | vs | main.rs:523:5:523:6 | vs | -| main.rs:518:26:518:34 | [post] receiver for vs.iter() | main.rs:518:26:518:34 | [post] vs.iter() | -| main.rs:518:26:518:34 | vs.iter() | main.rs:518:26:518:34 | receiver for vs.iter() | -| main.rs:518:26:518:44 | ... .collect() | main.rs:518:9:518:11 | vs2 | -| main.rs:519:10:519:10 | [SSA] v | main.rs:520:14:520:14 | v | -| main.rs:519:10:519:10 | v | main.rs:519:10:519:10 | [SSA] v | -| main.rs:519:10:519:10 | v | main.rs:519:10:519:10 | v | -| main.rs:523:5:523:6 | [post] receiver for vs | main.rs:523:5:523:6 | [post] vs | -| main.rs:523:5:523:6 | [post] vs | main.rs:524:5:524:6 | vs | -| main.rs:523:5:523:6 | vs | main.rs:523:5:523:6 | receiver for vs | -| main.rs:523:5:523:6 | vs | main.rs:524:5:524:6 | vs | -| main.rs:523:5:523:13 | [post] receiver for vs.iter() | main.rs:523:5:523:13 | [post] vs.iter() | -| main.rs:523:5:523:13 | vs.iter() | main.rs:523:5:523:13 | receiver for vs.iter() | -| main.rs:523:20:523:20 | ... | main.rs:523:20:523:20 | x | -| main.rs:523:20:523:20 | [SSA] x | main.rs:523:29:523:29 | x | -| main.rs:523:20:523:20 | x | main.rs:523:20:523:20 | [SSA] x | -| main.rs:523:20:523:20 | x | main.rs:523:20:523:20 | x | -| main.rs:523:29:523:29 | [post] receiver for x | main.rs:523:29:523:29 | [post] x | -| main.rs:523:29:523:29 | x | main.rs:523:29:523:29 | receiver for x | -| main.rs:524:5:524:6 | [post] receiver for vs | main.rs:524:5:524:6 | [post] vs | -| main.rs:524:5:524:6 | [post] vs | main.rs:526:14:526:15 | vs | -| main.rs:524:5:524:6 | vs | main.rs:524:5:524:6 | receiver for vs | -| main.rs:524:5:524:6 | vs | main.rs:526:14:526:15 | vs | -| main.rs:524:5:524:13 | [post] receiver for vs.iter() | main.rs:524:5:524:13 | [post] vs.iter() | -| main.rs:524:5:524:13 | vs.iter() | main.rs:524:5:524:13 | receiver for vs.iter() | -| main.rs:524:25:524:25 | ... | main.rs:524:25:524:25 | x | -| main.rs:524:25:524:25 | [SSA] x | main.rs:524:34:524:34 | x | -| main.rs:524:25:524:25 | x | main.rs:524:25:524:25 | [SSA] x | -| main.rs:524:25:524:25 | x | main.rs:524:25:524:25 | x | -| main.rs:524:34:524:34 | [post] receiver for x | main.rs:524:34:524:34 | [post] x | -| main.rs:524:34:524:34 | x | main.rs:524:34:524:34 | receiver for x | -| main.rs:526:9:526:9 | [SSA] v | main.rs:527:14:527:14 | v | -| main.rs:526:9:526:9 | v | main.rs:526:9:526:9 | [SSA] v | -| main.rs:526:9:526:9 | v | main.rs:526:9:526:9 | v | -| main.rs:526:14:526:15 | [post] receiver for vs | main.rs:526:14:526:15 | [post] vs | -| main.rs:526:14:526:15 | vs | main.rs:526:14:526:15 | receiver for vs | -| main.rs:530:9:530:18 | mut vs_mut | main.rs:530:13:530:18 | vs_mut | -| main.rs:530:13:530:18 | [SSA] vs_mut | main.rs:532:10:532:15 | vs_mut | -| main.rs:530:13:530:18 | vs_mut | main.rs:530:13:530:18 | [SSA] vs_mut | -| main.rs:530:22:530:42 | [...] | main.rs:530:9:530:18 | mut vs_mut | -| main.rs:532:10:532:15 | [post] vs_mut | main.rs:533:11:533:16 | [SSA] vs_mut | -| main.rs:532:10:532:15 | [post] vs_mut | main.rs:533:11:533:16 | vs_mut | -| main.rs:532:10:532:15 | vs_mut | main.rs:533:11:533:16 | [SSA] vs_mut | -| main.rs:532:10:532:15 | vs_mut | main.rs:533:11:533:16 | vs_mut | -| main.rs:533:11:533:16 | [SSA] vs_mut | main.rs:534:11:534:16 | [SSA] vs_mut | -| main.rs:533:11:533:16 | [SSA] vs_mut | main.rs:534:11:534:16 | vs_mut | -| main.rs:533:11:533:16 | [post] receiver for vs_mut | main.rs:533:11:533:16 | [post] vs_mut | -| main.rs:533:11:533:16 | [post] vs_mut | main.rs:534:11:534:16 | [SSA] vs_mut | -| main.rs:533:11:533:16 | [post] vs_mut | main.rs:534:11:534:16 | vs_mut | -| main.rs:533:11:533:16 | vs_mut | main.rs:533:11:533:16 | receiver for vs_mut | -| main.rs:533:11:533:16 | vs_mut | main.rs:534:11:534:16 | [SSA] vs_mut | -| main.rs:533:11:533:16 | vs_mut | main.rs:534:11:534:16 | vs_mut | -| main.rs:533:11:533:23 | [post] receiver for vs_mut.iter() | main.rs:533:11:533:23 | [post] vs_mut.iter() | -| main.rs:533:11:533:23 | vs_mut.iter() | main.rs:533:11:533:23 | receiver for vs_mut.iter() | -| main.rs:533:11:533:30 | ... .next() | main.rs:533:11:533:30 | receiver for ... .next() | -| main.rs:533:11:533:30 | [post] receiver for ... .next() | main.rs:533:11:533:30 | [post] ... .next() | -| main.rs:533:11:533:39 | ... .unwrap() | main.rs:533:11:533:39 | receiver for ... .unwrap() | -| main.rs:533:11:533:39 | [post] receiver for ... .unwrap() | main.rs:533:11:533:39 | [post] ... .unwrap() | -| main.rs:534:11:534:16 | [SSA] vs_mut | main.rs:536:19:536:24 | vs_mut | -| main.rs:534:11:534:16 | [post] receiver for vs_mut | main.rs:534:11:534:16 | [post] vs_mut | -| main.rs:534:11:534:16 | [post] vs_mut | main.rs:536:19:536:24 | vs_mut | -| main.rs:534:11:534:16 | vs_mut | main.rs:534:11:534:16 | receiver for vs_mut | -| main.rs:534:11:534:16 | vs_mut | main.rs:536:19:536:24 | vs_mut | -| main.rs:534:11:534:23 | [post] receiver for vs_mut.iter() | main.rs:534:11:534:23 | [post] vs_mut.iter() | -| main.rs:534:11:534:23 | vs_mut.iter() | main.rs:534:11:534:23 | receiver for vs_mut.iter() | -| main.rs:534:11:534:30 | ... .nth(...) | main.rs:534:11:534:30 | receiver for ... .nth(...) | -| main.rs:534:11:534:30 | [post] receiver for ... .nth(...) | main.rs:534:11:534:30 | [post] ... .nth(...) | -| main.rs:534:11:534:39 | ... .unwrap() | main.rs:534:11:534:39 | receiver for ... .unwrap() | -| main.rs:534:11:534:39 | [post] receiver for ... .unwrap() | main.rs:534:11:534:39 | [post] ... .unwrap() | -| main.rs:536:5:538:5 | for ... in ... { ... } | main.rs:504:16:539:1 | { ... } | -| main.rs:536:14:536:14 | [SSA] v | main.rs:537:14:537:14 | v | -| main.rs:536:14:536:14 | v | main.rs:536:14:536:14 | [SSA] v | -| main.rs:536:14:536:14 | v | main.rs:536:14:536:14 | v | -| main.rs:536:19:536:24 | [post] receiver for vs_mut | main.rs:536:19:536:24 | [post] vs_mut | -| main.rs:536:19:536:24 | vs_mut | main.rs:536:19:536:24 | receiver for vs_mut | -| main.rs:542:9:542:9 | [SSA] a | main.rs:547:10:547:10 | a | -| main.rs:542:9:542:9 | a | main.rs:542:9:542:9 | [SSA] a | -| main.rs:542:9:542:9 | a | main.rs:542:9:542:9 | a | -| main.rs:542:13:542:22 | source(...) | main.rs:542:9:542:9 | a | -| main.rs:543:9:543:9 | [SSA] b | main.rs:548:15:548:15 | b | -| main.rs:543:9:543:9 | b | main.rs:543:9:543:9 | [SSA] b | -| main.rs:543:9:543:9 | b | main.rs:543:9:543:9 | b | -| main.rs:543:13:543:22 | source(...) | main.rs:543:9:543:9 | b | -| main.rs:544:9:544:9 | [SSA] c | main.rs:545:18:545:18 | c | -| main.rs:544:9:544:9 | c | main.rs:544:9:544:9 | [SSA] c | -| main.rs:544:9:544:9 | c | main.rs:544:9:544:9 | c | -| main.rs:544:13:544:22 | source(...) | main.rs:544:9:544:9 | c | -| main.rs:545:9:545:13 | [SSA] c_ref | main.rs:549:14:549:18 | c_ref | -| main.rs:545:9:545:13 | c_ref | main.rs:545:9:545:13 | [SSA] c_ref | -| main.rs:545:9:545:13 | c_ref | main.rs:545:9:545:13 | c_ref | -| main.rs:545:17:545:18 | &c | main.rs:545:9:545:13 | c_ref | -| main.rs:549:14:549:18 | [post] c_ref | main.rs:550:11:550:15 | c_ref | -| main.rs:549:14:549:18 | c_ref | main.rs:550:11:550:15 | c_ref | -| main.rs:550:11:550:15 | [post] receiver for c_ref | main.rs:550:11:550:15 | [post] c_ref | -| main.rs:550:11:550:15 | c_ref | main.rs:550:11:550:15 | receiver for c_ref | -| main.rs:554:9:554:9 | [SSA] a | main.rs:556:10:556:10 | a | +| main.rs:445:9:445:10 | [SSA] n1 | main.rs:446:14:446:15 | n1 | +| main.rs:445:9:445:10 | n1 | main.rs:445:9:445:10 | [SSA] n1 | +| main.rs:445:9:445:10 | n1 | main.rs:445:9:445:10 | n1 | +| main.rs:449:9:449:12 | [SSA] arr2 | main.rs:450:15:450:18 | arr2 | +| main.rs:449:9:449:12 | arr2 | main.rs:449:9:449:12 | [SSA] arr2 | +| main.rs:449:9:449:12 | arr2 | main.rs:449:9:449:12 | arr2 | +| main.rs:449:16:449:24 | [...] | main.rs:449:9:449:12 | arr2 | +| main.rs:450:5:452:5 | for ... in ... { ... } | main.rs:443:21:453:1 | { ... } | +| main.rs:450:9:450:10 | [SSA] n2 | main.rs:451:14:451:15 | n2 | +| main.rs:450:9:450:10 | n2 | main.rs:450:9:450:10 | [SSA] n2 | +| main.rs:450:9:450:10 | n2 | main.rs:450:9:450:10 | n2 | +| main.rs:456:9:456:12 | [SSA] arr1 | main.rs:457:11:457:14 | arr1 | +| main.rs:456:9:456:12 | arr1 | main.rs:456:9:456:12 | [SSA] arr1 | +| main.rs:456:9:456:12 | arr1 | main.rs:456:9:456:12 | arr1 | +| main.rs:456:16:456:33 | [...] | main.rs:456:9:456:12 | arr1 | +| main.rs:457:5:463:5 | match arr1 { ... } | main.rs:455:26:464:1 | { ... } | +| main.rs:457:11:457:14 | arr1 | main.rs:458:9:458:17 | SlicePat | +| main.rs:458:10:458:10 | [SSA] a | main.rs:459:18:459:18 | a | +| main.rs:458:10:458:10 | a | main.rs:458:10:458:10 | [SSA] a | +| main.rs:458:10:458:10 | a | main.rs:458:10:458:10 | a | +| main.rs:458:13:458:13 | [SSA] b | main.rs:460:18:460:18 | b | +| main.rs:458:13:458:13 | b | main.rs:458:13:458:13 | [SSA] b | +| main.rs:458:13:458:13 | b | main.rs:458:13:458:13 | b | +| main.rs:458:16:458:16 | [SSA] c | main.rs:461:18:461:18 | c | +| main.rs:458:16:458:16 | c | main.rs:458:16:458:16 | [SSA] c | +| main.rs:458:16:458:16 | c | main.rs:458:16:458:16 | c | +| main.rs:458:22:462:9 | { ... } | main.rs:457:5:463:5 | match arr1 { ... } | +| main.rs:467:9:467:19 | mut mut_arr | main.rs:467:13:467:19 | mut_arr | +| main.rs:467:13:467:19 | [SSA] mut_arr | main.rs:468:10:468:16 | mut_arr | +| main.rs:467:13:467:19 | mut_arr | main.rs:467:13:467:19 | [SSA] mut_arr | +| main.rs:467:23:467:31 | [...] | main.rs:467:9:467:19 | mut mut_arr | +| main.rs:468:10:468:16 | [post] mut_arr | main.rs:470:5:470:11 | mut_arr | +| main.rs:468:10:468:16 | mut_arr | main.rs:470:5:470:11 | mut_arr | +| main.rs:470:5:470:11 | [post] mut_arr | main.rs:471:13:471:19 | mut_arr | +| main.rs:470:5:470:11 | mut_arr | main.rs:471:13:471:19 | mut_arr | +| main.rs:470:18:470:27 | source(...) | main.rs:470:5:470:14 | mut_arr[1] | +| main.rs:471:9:471:9 | [SSA] d | main.rs:472:10:472:10 | d | +| main.rs:471:9:471:9 | d | main.rs:471:9:471:9 | [SSA] d | +| main.rs:471:9:471:9 | d | main.rs:471:9:471:9 | d | +| main.rs:471:13:471:19 | [post] mut_arr | main.rs:473:10:473:16 | mut_arr | +| main.rs:471:13:471:19 | mut_arr | main.rs:473:10:473:16 | mut_arr | +| main.rs:471:13:471:22 | mut_arr[1] | main.rs:471:9:471:9 | d | +| main.rs:478:39:478:43 | [SSA] names | main.rs:480:25:480:29 | names | +| main.rs:478:39:478:43 | names | main.rs:478:39:478:43 | [SSA] names | +| main.rs:478:39:478:43 | names | main.rs:478:39:478:43 | names | +| main.rs:478:39:478:72 | ...: Vec::<...> | main.rs:478:39:478:43 | names | +| main.rs:479:9:479:20 | default_name | main.rs:479:9:479:20 | [SSA] default_name | +| main.rs:479:9:479:20 | default_name | main.rs:479:9:479:20 | default_name | +| main.rs:479:24:479:33 | [post] receiver for source(...) | main.rs:479:24:479:33 | [post] source(...) | +| main.rs:479:24:479:33 | source(...) | main.rs:479:24:479:33 | receiver for source(...) | +| main.rs:479:24:479:45 | ... .to_string() | main.rs:479:9:479:20 | default_name | +| main.rs:479:24:479:45 | ... .to_string() | main.rs:480:9:480:20 | SSA phi read(default_name) | +| main.rs:480:5:486:5 | for ... in ... { ... } | main.rs:478:75:487:1 | { ... } | +| main.rs:480:9:480:20 | SSA phi read(default_name) | main.rs:482:41:482:67 | default_name | +| main.rs:480:10:480:13 | [SSA] cond | main.rs:481:12:481:15 | cond | +| main.rs:480:10:480:13 | cond | main.rs:480:10:480:13 | [SSA] cond | +| main.rs:480:10:480:13 | cond | main.rs:480:10:480:13 | cond | +| main.rs:480:16:480:19 | [SSA] name | main.rs:482:21:482:24 | name | +| main.rs:480:16:480:19 | name | main.rs:480:16:480:19 | [SSA] name | +| main.rs:480:16:480:19 | name | main.rs:480:16:480:19 | name | +| main.rs:481:9:485:9 | if cond {...} | main.rs:480:31:486:5 | { ... } | +| main.rs:482:17:482:17 | [SSA] n | main.rs:483:18:483:18 | n | +| main.rs:482:17:482:17 | n | main.rs:482:17:482:17 | [SSA] n | +| main.rs:482:17:482:17 | n | main.rs:482:17:482:17 | n | +| main.rs:482:21:482:24 | [post] receiver for name | main.rs:482:21:482:24 | [post] name | +| main.rs:482:21:482:24 | name | main.rs:482:21:482:24 | receiver for name | +| main.rs:482:21:482:68 | name.unwrap_or_else(...) | main.rs:482:17:482:17 | n | +| main.rs:482:41:482:67 | [post] default_name | main.rs:480:9:480:20 | SSA phi read(default_name) | +| main.rs:482:41:482:67 | closure self in \|...\| ... | main.rs:482:44:482:55 | this | +| main.rs:482:41:482:67 | default_name | main.rs:480:9:480:20 | SSA phi read(default_name) | +| main.rs:482:44:482:55 | [post] receiver for default_name | main.rs:482:44:482:55 | [post] default_name | +| main.rs:482:44:482:55 | default_name | main.rs:482:44:482:55 | receiver for default_name | +| main.rs:483:18:483:18 | [post] receiver for n | main.rs:483:18:483:18 | [post] n | +| main.rs:483:18:483:18 | n | main.rs:483:18:483:18 | receiver for n | +| main.rs:496:9:496:9 | [SSA] s | main.rs:497:10:497:10 | s | +| main.rs:496:9:496:9 | s | main.rs:496:9:496:9 | [SSA] s | +| main.rs:496:9:496:9 | s | main.rs:496:9:496:9 | s | +| main.rs:496:13:496:27 | MacroExpr | main.rs:496:9:496:9 | s | +| main.rs:496:25:496:26 | source(...) | main.rs:496:13:496:27 | MacroExpr | +| main.rs:500:16:500:16 | [SSA] s | main.rs:501:20:501:20 | s | +| main.rs:500:16:500:16 | s | main.rs:500:16:500:16 | [SSA] s | +| main.rs:500:16:500:16 | s | main.rs:500:16:500:16 | s | +| main.rs:500:16:500:24 | ...: String | main.rs:500:16:500:16 | s | +| main.rs:501:14:501:20 | FormatArgsExpr | main.rs:501:14:501:20 | MacroExpr | +| main.rs:501:14:501:20 | MacroBlockExpr | main.rs:501:5:501:21 | MacroExpr | +| main.rs:501:14:501:20 | [post] MacroExpr | main.rs:501:14:501:20 | [post] FormatArgsExpr | +| main.rs:501:14:501:20 | { ... } | main.rs:501:14:501:20 | MacroBlockExpr | +| main.rs:505:9:505:9 | [SSA] a | main.rs:506:13:506:13 | a | +| main.rs:505:9:505:9 | a | main.rs:505:9:505:9 | [SSA] a | +| main.rs:505:9:505:9 | a | main.rs:505:9:505:9 | a | +| main.rs:505:13:505:22 | source(...) | main.rs:505:9:505:9 | a | +| main.rs:506:9:506:9 | [SSA] b | main.rs:507:13:507:13 | b | +| main.rs:506:9:506:9 | b | main.rs:506:9:506:9 | [SSA] b | +| main.rs:506:9:506:9 | b | main.rs:506:9:506:9 | b | +| main.rs:506:13:506:13 | [post] a | main.rs:510:10:510:10 | a | +| main.rs:506:13:506:13 | [post] receiver for a | main.rs:506:13:506:13 | [post] a | +| main.rs:506:13:506:13 | a | main.rs:506:13:506:13 | receiver for a | +| main.rs:506:13:506:13 | a | main.rs:510:10:510:10 | a | +| main.rs:506:13:506:25 | a.to_string() | main.rs:506:9:506:9 | b | +| main.rs:507:9:507:9 | [SSA] c | main.rs:512:10:512:10 | c | +| main.rs:507:9:507:9 | c | main.rs:507:9:507:9 | [SSA] c | +| main.rs:507:9:507:9 | c | main.rs:507:9:507:9 | c | +| main.rs:507:13:507:13 | [post] b | main.rs:508:18:508:18 | b | +| main.rs:507:13:507:13 | [post] receiver for b | main.rs:507:13:507:13 | [post] b | +| main.rs:507:13:507:13 | b | main.rs:507:13:507:13 | receiver for b | +| main.rs:507:13:507:13 | b | main.rs:508:18:508:18 | b | +| main.rs:507:13:507:28 | [post] receiver for b.parse() | main.rs:507:13:507:28 | [post] b.parse() | +| main.rs:507:13:507:28 | b.parse() | main.rs:507:13:507:28 | receiver for b.parse() | +| main.rs:507:13:507:37 | ... .unwrap() | main.rs:507:9:507:9 | c | +| main.rs:508:9:508:9 | [SSA] d | main.rs:513:10:513:10 | d | +| main.rs:508:9:508:9 | d | main.rs:508:9:508:9 | [SSA] d | +| main.rs:508:9:508:9 | d | main.rs:508:9:508:9 | d | +| main.rs:508:18:508:18 | [post] b | main.rs:511:17:511:17 | b | +| main.rs:508:18:508:18 | [post] receiver for b | main.rs:508:18:508:18 | [post] b | +| main.rs:508:18:508:18 | b | main.rs:508:18:508:18 | receiver for b | +| main.rs:508:18:508:18 | b | main.rs:511:17:511:17 | b | +| main.rs:508:18:508:26 | [post] receiver for b.parse() | main.rs:508:18:508:26 | [post] b.parse() | +| main.rs:508:18:508:26 | b.parse() | main.rs:508:18:508:26 | receiver for b.parse() | +| main.rs:508:18:508:35 | ... .unwrap() | main.rs:508:9:508:9 | d | +| main.rs:517:9:517:10 | [SSA] vs | main.rs:519:10:519:11 | vs | +| main.rs:517:9:517:10 | vs | main.rs:517:9:517:10 | [SSA] vs | +| main.rs:517:9:517:10 | vs | main.rs:517:9:517:10 | vs | +| main.rs:517:14:517:34 | [...] | main.rs:517:9:517:10 | vs | +| main.rs:519:10:519:11 | [post] vs | main.rs:520:11:520:12 | vs | +| main.rs:519:10:519:11 | vs | main.rs:520:11:520:12 | vs | +| main.rs:520:11:520:12 | [post] receiver for vs | main.rs:520:11:520:12 | [post] vs | +| main.rs:520:11:520:12 | [post] vs | main.rs:521:11:521:12 | vs | +| main.rs:520:11:520:12 | vs | main.rs:520:11:520:12 | receiver for vs | +| main.rs:520:11:520:12 | vs | main.rs:521:11:521:12 | vs | +| main.rs:520:11:520:19 | [post] receiver for vs.iter() | main.rs:520:11:520:19 | [post] vs.iter() | +| main.rs:520:11:520:19 | vs.iter() | main.rs:520:11:520:19 | receiver for vs.iter() | +| main.rs:520:11:520:26 | ... .next() | main.rs:520:11:520:26 | receiver for ... .next() | +| main.rs:520:11:520:26 | [post] receiver for ... .next() | main.rs:520:11:520:26 | [post] ... .next() | +| main.rs:520:11:520:35 | ... .unwrap() | main.rs:520:11:520:35 | receiver for ... .unwrap() | +| main.rs:520:11:520:35 | [post] receiver for ... .unwrap() | main.rs:520:11:520:35 | [post] ... .unwrap() | +| main.rs:521:11:521:12 | [post] receiver for vs | main.rs:521:11:521:12 | [post] vs | +| main.rs:521:11:521:12 | [post] vs | main.rs:523:14:523:15 | vs | +| main.rs:521:11:521:12 | vs | main.rs:521:11:521:12 | receiver for vs | +| main.rs:521:11:521:12 | vs | main.rs:523:14:523:15 | vs | +| main.rs:521:11:521:19 | [post] receiver for vs.iter() | main.rs:521:11:521:19 | [post] vs.iter() | +| main.rs:521:11:521:19 | vs.iter() | main.rs:521:11:521:19 | receiver for vs.iter() | +| main.rs:521:11:521:26 | ... .nth(...) | main.rs:521:11:521:26 | receiver for ... .nth(...) | +| main.rs:521:11:521:26 | [post] receiver for ... .nth(...) | main.rs:521:11:521:26 | [post] ... .nth(...) | +| main.rs:521:11:521:35 | ... .unwrap() | main.rs:521:11:521:35 | receiver for ... .unwrap() | +| main.rs:521:11:521:35 | [post] receiver for ... .unwrap() | main.rs:521:11:521:35 | [post] ... .unwrap() | +| main.rs:523:9:523:9 | [SSA] v | main.rs:524:14:524:14 | v | +| main.rs:523:9:523:9 | v | main.rs:523:9:523:9 | [SSA] v | +| main.rs:523:9:523:9 | v | main.rs:523:9:523:9 | v | +| main.rs:523:14:523:15 | vs | main.rs:526:15:526:16 | vs | +| main.rs:526:10:526:10 | [SSA] v | main.rs:527:14:527:14 | v | +| main.rs:526:10:526:10 | v | main.rs:526:10:526:10 | [SSA] v | +| main.rs:526:10:526:10 | v | main.rs:526:10:526:10 | v | +| main.rs:526:15:526:16 | [post] receiver for vs | main.rs:526:15:526:16 | [post] vs | +| main.rs:526:15:526:16 | [post] vs | main.rs:530:26:530:27 | vs | +| main.rs:526:15:526:16 | vs | main.rs:526:15:526:16 | receiver for vs | +| main.rs:526:15:526:16 | vs | main.rs:530:26:530:27 | vs | +| main.rs:530:9:530:11 | [SSA] vs2 | main.rs:531:15:531:17 | vs2 | +| main.rs:530:9:530:11 | vs2 | main.rs:530:9:530:11 | [SSA] vs2 | +| main.rs:530:9:530:11 | vs2 | main.rs:530:9:530:11 | vs2 | +| main.rs:530:26:530:27 | [post] receiver for vs | main.rs:530:26:530:27 | [post] vs | +| main.rs:530:26:530:27 | [post] vs | main.rs:535:5:535:6 | vs | +| main.rs:530:26:530:27 | vs | main.rs:530:26:530:27 | receiver for vs | +| main.rs:530:26:530:27 | vs | main.rs:535:5:535:6 | vs | +| main.rs:530:26:530:34 | [post] receiver for vs.iter() | main.rs:530:26:530:34 | [post] vs.iter() | +| main.rs:530:26:530:34 | vs.iter() | main.rs:530:26:530:34 | receiver for vs.iter() | +| main.rs:530:26:530:44 | ... .collect() | main.rs:530:9:530:11 | vs2 | +| main.rs:531:10:531:10 | [SSA] v | main.rs:532:14:532:14 | v | +| main.rs:531:10:531:10 | v | main.rs:531:10:531:10 | [SSA] v | +| main.rs:531:10:531:10 | v | main.rs:531:10:531:10 | v | +| main.rs:535:5:535:6 | [post] receiver for vs | main.rs:535:5:535:6 | [post] vs | +| main.rs:535:5:535:6 | [post] vs | main.rs:536:5:536:6 | vs | +| main.rs:535:5:535:6 | vs | main.rs:535:5:535:6 | receiver for vs | +| main.rs:535:5:535:6 | vs | main.rs:536:5:536:6 | vs | +| main.rs:535:5:535:13 | [post] receiver for vs.iter() | main.rs:535:5:535:13 | [post] vs.iter() | +| main.rs:535:5:535:13 | vs.iter() | main.rs:535:5:535:13 | receiver for vs.iter() | +| main.rs:535:20:535:20 | ... | main.rs:535:20:535:20 | x | +| main.rs:535:20:535:20 | [SSA] x | main.rs:535:29:535:29 | x | +| main.rs:535:20:535:20 | x | main.rs:535:20:535:20 | [SSA] x | +| main.rs:535:20:535:20 | x | main.rs:535:20:535:20 | x | +| main.rs:535:29:535:29 | [post] receiver for x | main.rs:535:29:535:29 | [post] x | +| main.rs:535:29:535:29 | x | main.rs:535:29:535:29 | receiver for x | +| main.rs:536:5:536:6 | [post] receiver for vs | main.rs:536:5:536:6 | [post] vs | +| main.rs:536:5:536:6 | [post] vs | main.rs:538:14:538:15 | vs | +| main.rs:536:5:536:6 | vs | main.rs:536:5:536:6 | receiver for vs | +| main.rs:536:5:536:6 | vs | main.rs:538:14:538:15 | vs | +| main.rs:536:5:536:13 | [post] receiver for vs.iter() | main.rs:536:5:536:13 | [post] vs.iter() | +| main.rs:536:5:536:13 | vs.iter() | main.rs:536:5:536:13 | receiver for vs.iter() | +| main.rs:536:25:536:25 | ... | main.rs:536:25:536:25 | x | +| main.rs:536:25:536:25 | [SSA] x | main.rs:536:34:536:34 | x | +| main.rs:536:25:536:25 | x | main.rs:536:25:536:25 | [SSA] x | +| main.rs:536:25:536:25 | x | main.rs:536:25:536:25 | x | +| main.rs:536:34:536:34 | [post] receiver for x | main.rs:536:34:536:34 | [post] x | +| main.rs:536:34:536:34 | x | main.rs:536:34:536:34 | receiver for x | +| main.rs:538:9:538:9 | [SSA] v | main.rs:539:14:539:14 | v | +| main.rs:538:9:538:9 | v | main.rs:538:9:538:9 | [SSA] v | +| main.rs:538:9:538:9 | v | main.rs:538:9:538:9 | v | +| main.rs:538:14:538:15 | [post] receiver for vs | main.rs:538:14:538:15 | [post] vs | +| main.rs:538:14:538:15 | vs | main.rs:538:14:538:15 | receiver for vs | +| main.rs:542:9:542:18 | mut vs_mut | main.rs:542:13:542:18 | vs_mut | +| main.rs:542:13:542:18 | [SSA] vs_mut | main.rs:544:10:544:15 | vs_mut | +| main.rs:542:13:542:18 | vs_mut | main.rs:542:13:542:18 | [SSA] vs_mut | +| main.rs:542:22:542:42 | [...] | main.rs:542:9:542:18 | mut vs_mut | +| main.rs:544:10:544:15 | [post] vs_mut | main.rs:545:11:545:16 | [SSA] vs_mut | +| main.rs:544:10:544:15 | [post] vs_mut | main.rs:545:11:545:16 | vs_mut | +| main.rs:544:10:544:15 | vs_mut | main.rs:545:11:545:16 | [SSA] vs_mut | +| main.rs:544:10:544:15 | vs_mut | main.rs:545:11:545:16 | vs_mut | +| main.rs:545:11:545:16 | [SSA] vs_mut | main.rs:546:11:546:16 | [SSA] vs_mut | +| main.rs:545:11:545:16 | [SSA] vs_mut | main.rs:546:11:546:16 | vs_mut | +| main.rs:545:11:545:16 | [post] receiver for vs_mut | main.rs:545:11:545:16 | [post] vs_mut | +| main.rs:545:11:545:16 | [post] vs_mut | main.rs:546:11:546:16 | [SSA] vs_mut | +| main.rs:545:11:545:16 | [post] vs_mut | main.rs:546:11:546:16 | vs_mut | +| main.rs:545:11:545:16 | vs_mut | main.rs:545:11:545:16 | receiver for vs_mut | +| main.rs:545:11:545:16 | vs_mut | main.rs:546:11:546:16 | [SSA] vs_mut | +| main.rs:545:11:545:16 | vs_mut | main.rs:546:11:546:16 | vs_mut | +| main.rs:545:11:545:23 | [post] receiver for vs_mut.iter() | main.rs:545:11:545:23 | [post] vs_mut.iter() | +| main.rs:545:11:545:23 | vs_mut.iter() | main.rs:545:11:545:23 | receiver for vs_mut.iter() | +| main.rs:545:11:545:30 | ... .next() | main.rs:545:11:545:30 | receiver for ... .next() | +| main.rs:545:11:545:30 | [post] receiver for ... .next() | main.rs:545:11:545:30 | [post] ... .next() | +| main.rs:545:11:545:39 | ... .unwrap() | main.rs:545:11:545:39 | receiver for ... .unwrap() | +| main.rs:545:11:545:39 | [post] receiver for ... .unwrap() | main.rs:545:11:545:39 | [post] ... .unwrap() | +| main.rs:546:11:546:16 | [SSA] vs_mut | main.rs:548:19:548:24 | vs_mut | +| main.rs:546:11:546:16 | [post] receiver for vs_mut | main.rs:546:11:546:16 | [post] vs_mut | +| main.rs:546:11:546:16 | [post] vs_mut | main.rs:548:19:548:24 | vs_mut | +| main.rs:546:11:546:16 | vs_mut | main.rs:546:11:546:16 | receiver for vs_mut | +| main.rs:546:11:546:16 | vs_mut | main.rs:548:19:548:24 | vs_mut | +| main.rs:546:11:546:23 | [post] receiver for vs_mut.iter() | main.rs:546:11:546:23 | [post] vs_mut.iter() | +| main.rs:546:11:546:23 | vs_mut.iter() | main.rs:546:11:546:23 | receiver for vs_mut.iter() | +| main.rs:546:11:546:30 | ... .nth(...) | main.rs:546:11:546:30 | receiver for ... .nth(...) | +| main.rs:546:11:546:30 | [post] receiver for ... .nth(...) | main.rs:546:11:546:30 | [post] ... .nth(...) | +| main.rs:546:11:546:39 | ... .unwrap() | main.rs:546:11:546:39 | receiver for ... .unwrap() | +| main.rs:546:11:546:39 | [post] receiver for ... .unwrap() | main.rs:546:11:546:39 | [post] ... .unwrap() | +| main.rs:548:5:550:5 | for ... in ... { ... } | main.rs:516:16:551:1 | { ... } | +| main.rs:548:14:548:14 | [SSA] v | main.rs:549:14:549:14 | v | +| main.rs:548:14:548:14 | v | main.rs:548:14:548:14 | [SSA] v | +| main.rs:548:14:548:14 | v | main.rs:548:14:548:14 | v | +| main.rs:548:19:548:24 | [post] receiver for vs_mut | main.rs:548:19:548:24 | [post] vs_mut | +| main.rs:548:19:548:24 | vs_mut | main.rs:548:19:548:24 | receiver for vs_mut | +| main.rs:554:9:554:9 | [SSA] a | main.rs:559:10:559:10 | a | | main.rs:554:9:554:9 | a | main.rs:554:9:554:9 | [SSA] a | | main.rs:554:9:554:9 | a | main.rs:554:9:554:9 | a | -| main.rs:554:18:554:27 | source(...) | main.rs:554:9:554:9 | a | -| main.rs:556:10:556:10 | [post] a | main.rs:557:10:557:10 | a | -| main.rs:556:10:556:10 | a | main.rs:557:10:557:10 | a | -| main.rs:557:10:557:10 | [post] a | main.rs:558:20:558:20 | a | -| main.rs:557:10:557:10 | [post] receiver for a | main.rs:557:10:557:10 | [post] a | -| main.rs:557:10:557:10 | a | main.rs:557:10:557:10 | receiver for a | -| main.rs:557:10:557:10 | a | main.rs:558:20:558:20 | a | -| main.rs:560:9:560:9 | [SSA] b | main.rs:562:10:562:10 | b | -| main.rs:560:9:560:9 | b | main.rs:560:9:560:9 | [SSA] b | -| main.rs:560:9:560:9 | b | main.rs:560:9:560:9 | b | -| main.rs:560:18:560:34 | ... as i32 | main.rs:560:9:560:9 | b | -| main.rs:562:10:562:10 | [post] b | main.rs:563:10:563:10 | b | -| main.rs:562:10:562:10 | b | main.rs:563:10:563:10 | b | -| main.rs:563:10:563:10 | [post] b | main.rs:564:20:564:20 | b | -| main.rs:563:10:563:10 | [post] receiver for b | main.rs:563:10:563:10 | [post] b | -| main.rs:563:10:563:10 | b | main.rs:563:10:563:10 | receiver for b | -| main.rs:563:10:563:10 | b | main.rs:564:20:564:20 | b | -| main.rs:592:13:592:33 | result_questionmark(...) | main.rs:592:9:592:9 | _ | -| main.rs:604:36:604:39 | ...::new(...) | main.rs:604:36:604:41 | MacroExpr | -| main.rs:604:36:604:41 | [post] MacroExpr | main.rs:604:36:604:39 | [post] ...::new(...) | +| main.rs:554:13:554:22 | source(...) | main.rs:554:9:554:9 | a | +| main.rs:555:9:555:9 | [SSA] b | main.rs:560:15:560:15 | b | +| main.rs:555:9:555:9 | b | main.rs:555:9:555:9 | [SSA] b | +| main.rs:555:9:555:9 | b | main.rs:555:9:555:9 | b | +| main.rs:555:13:555:22 | source(...) | main.rs:555:9:555:9 | b | +| main.rs:556:9:556:9 | [SSA] c | main.rs:557:18:557:18 | c | +| main.rs:556:9:556:9 | c | main.rs:556:9:556:9 | [SSA] c | +| main.rs:556:9:556:9 | c | main.rs:556:9:556:9 | c | +| main.rs:556:13:556:22 | source(...) | main.rs:556:9:556:9 | c | +| main.rs:557:9:557:13 | [SSA] c_ref | main.rs:561:14:561:18 | c_ref | +| main.rs:557:9:557:13 | c_ref | main.rs:557:9:557:13 | [SSA] c_ref | +| main.rs:557:9:557:13 | c_ref | main.rs:557:9:557:13 | c_ref | +| main.rs:557:17:557:18 | &c | main.rs:557:9:557:13 | c_ref | +| main.rs:561:14:561:18 | [post] c_ref | main.rs:562:11:562:15 | c_ref | +| main.rs:561:14:561:18 | c_ref | main.rs:562:11:562:15 | c_ref | +| main.rs:562:11:562:15 | [post] receiver for c_ref | main.rs:562:11:562:15 | [post] c_ref | +| main.rs:562:11:562:15 | c_ref | main.rs:562:11:562:15 | receiver for c_ref | +| main.rs:566:9:566:9 | [SSA] a | main.rs:568:10:568:10 | a | +| main.rs:566:9:566:9 | a | main.rs:566:9:566:9 | [SSA] a | +| main.rs:566:9:566:9 | a | main.rs:566:9:566:9 | a | +| main.rs:566:18:566:27 | source(...) | main.rs:566:9:566:9 | a | +| main.rs:568:10:568:10 | [post] a | main.rs:569:10:569:10 | a | +| main.rs:568:10:568:10 | a | main.rs:569:10:569:10 | a | +| main.rs:569:10:569:10 | [post] a | main.rs:570:20:570:20 | a | +| main.rs:569:10:569:10 | [post] receiver for a | main.rs:569:10:569:10 | [post] a | +| main.rs:569:10:569:10 | a | main.rs:569:10:569:10 | receiver for a | +| main.rs:569:10:569:10 | a | main.rs:570:20:570:20 | a | +| main.rs:572:9:572:9 | [SSA] b | main.rs:574:10:574:10 | b | +| main.rs:572:9:572:9 | b | main.rs:572:9:572:9 | [SSA] b | +| main.rs:572:9:572:9 | b | main.rs:572:9:572:9 | b | +| main.rs:572:18:572:34 | ... as i32 | main.rs:572:9:572:9 | b | +| main.rs:574:10:574:10 | [post] b | main.rs:575:10:575:10 | b | +| main.rs:574:10:574:10 | b | main.rs:575:10:575:10 | b | +| main.rs:575:10:575:10 | [post] b | main.rs:576:20:576:20 | b | +| main.rs:575:10:575:10 | [post] receiver for b | main.rs:575:10:575:10 | [post] b | +| main.rs:575:10:575:10 | b | main.rs:575:10:575:10 | receiver for b | +| main.rs:575:10:575:10 | b | main.rs:576:20:576:20 | b | +| main.rs:604:13:604:33 | result_questionmark(...) | main.rs:604:9:604:9 | _ | +| main.rs:616:36:616:39 | ...::new(...) | main.rs:616:36:616:41 | MacroExpr | +| main.rs:616:36:616:41 | [post] MacroExpr | main.rs:616:36:616:39 | [post] ...::new(...) | readStep | main.rs:50:9:50:15 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:50:14:50:14 | _ | -| main.rs:104:11:104:11 | [post] receiver for i | file://:0:0:0:0 | &ref | main.rs:104:11:104:11 | [post] i | -| main.rs:104:11:104:11 | i | file://:0:0:0:0 | &ref | main.rs:104:10:104:11 | * ... | -| main.rs:112:10:112:10 | a | file://:0:0:0:0 | tuple.0 | main.rs:112:10:112:12 | a.0 | -| main.rs:113:10:113:10 | a | file://:0:0:0:0 | tuple.1 | main.rs:113:10:113:12 | a.1 | -| main.rs:118:9:118:20 | TuplePat | file://:0:0:0:0 | tuple.0 | main.rs:118:10:118:11 | a0 | -| main.rs:118:9:118:20 | TuplePat | file://:0:0:0:0 | tuple.1 | main.rs:118:14:118:15 | a1 | -| main.rs:118:9:118:20 | TuplePat | file://:0:0:0:0 | tuple.2 | main.rs:118:18:118:19 | a2 | -| main.rs:126:10:126:10 | a | file://:0:0:0:0 | tuple.0 | main.rs:126:10:126:12 | a.0 | -| main.rs:127:10:127:10 | a | file://:0:0:0:0 | tuple.1 | main.rs:127:10:127:12 | a.1 | -| main.rs:128:5:128:5 | a | file://:0:0:0:0 | tuple.0 | main.rs:128:5:128:7 | a.0 | -| main.rs:129:5:129:5 | a | file://:0:0:0:0 | tuple.1 | main.rs:129:5:129:7 | a.1 | -| main.rs:130:10:130:10 | a | file://:0:0:0:0 | tuple.0 | main.rs:130:10:130:12 | a.0 | -| main.rs:131:10:131:10 | a | file://:0:0:0:0 | tuple.1 | main.rs:131:10:131:12 | a.1 | -| main.rs:137:10:137:10 | b | file://:0:0:0:0 | tuple.0 | main.rs:137:10:137:12 | b.0 | -| main.rs:137:10:137:12 | b.0 | file://:0:0:0:0 | tuple.0 | main.rs:137:10:137:15 | ... .0 | -| main.rs:138:10:138:10 | b | file://:0:0:0:0 | tuple.0 | main.rs:138:10:138:12 | b.0 | -| main.rs:138:10:138:12 | b.0 | file://:0:0:0:0 | tuple.1 | main.rs:138:10:138:15 | ... .1 | -| main.rs:139:10:139:10 | b | file://:0:0:0:0 | tuple.1 | main.rs:139:10:139:12 | b.1 | -| main.rs:152:10:152:10 | p | main.rs:146:5:146:10 | Point.x | main.rs:152:10:152:12 | p.x | -| main.rs:153:10:153:10 | p | main.rs:147:5:147:10 | Point.y | main.rs:153:10:153:12 | p.y | -| main.rs:158:10:158:10 | p | main.rs:147:5:147:10 | Point.y | main.rs:158:10:158:12 | p.y | -| main.rs:159:5:159:5 | p | main.rs:147:5:147:10 | Point.y | main.rs:159:5:159:7 | p.y | -| main.rs:160:10:160:10 | p | main.rs:147:5:147:10 | Point.y | main.rs:160:10:160:12 | p.y | -| main.rs:168:9:168:28 | Point {...} | main.rs:146:5:146:10 | Point.x | main.rs:168:20:168:20 | a | -| main.rs:168:9:168:28 | Point {...} | main.rs:147:5:147:10 | Point.y | main.rs:168:26:168:26 | b | -| main.rs:186:10:186:10 | p | main.rs:174:5:174:16 | Point3D.plane | main.rs:186:10:186:16 | p.plane | -| main.rs:186:10:186:16 | p.plane | main.rs:146:5:146:10 | Point.x | main.rs:186:10:186:18 | ... .x | -| main.rs:187:10:187:10 | p | main.rs:174:5:174:16 | Point3D.plane | main.rs:187:10:187:16 | p.plane | -| main.rs:187:10:187:16 | p.plane | main.rs:147:5:147:10 | Point.y | main.rs:187:10:187:18 | ... .y | -| main.rs:188:10:188:10 | p | main.rs:175:5:175:10 | Point3D.z | main.rs:188:10:188:12 | p.z | -| main.rs:198:9:201:9 | Point3D {...} | main.rs:174:5:174:16 | Point3D.plane | main.rs:199:20:199:33 | Point {...} | -| main.rs:198:9:201:9 | Point3D {...} | main.rs:175:5:175:10 | Point3D.z | main.rs:200:13:200:13 | z | -| main.rs:199:20:199:33 | Point {...} | main.rs:146:5:146:10 | Point.x | main.rs:199:28:199:28 | x | -| main.rs:199:20:199:33 | Point {...} | main.rs:147:5:147:10 | Point.y | main.rs:199:31:199:31 | y | -| main.rs:213:10:213:10 | s | file://:0:0:0:0 | tuple.0 | main.rs:213:10:213:12 | s.0 | -| main.rs:213:10:213:10 | s | main.rs:209:22:209:24 | MyTupleStruct(0) | main.rs:213:10:213:12 | s.0 | -| main.rs:214:10:214:10 | s | file://:0:0:0:0 | tuple.1 | main.rs:214:10:214:12 | s.1 | -| main.rs:214:10:214:10 | s | main.rs:209:27:209:29 | MyTupleStruct(1) | main.rs:214:10:214:12 | s.1 | -| main.rs:217:9:217:27 | MyTupleStruct(...) | main.rs:209:22:209:24 | MyTupleStruct(0) | main.rs:217:23:217:23 | x | -| main.rs:217:9:217:27 | MyTupleStruct(...) | main.rs:209:27:209:29 | MyTupleStruct(1) | main.rs:217:26:217:26 | y | -| main.rs:231:9:231:23 | ...::Some(...) | {EXTERNAL LOCATION} | Some | main.rs:231:22:231:22 | n | -| main.rs:235:9:235:23 | ...::Some(...) | {EXTERNAL LOCATION} | Some | main.rs:235:22:235:22 | n | -| main.rs:244:9:244:15 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:244:14:244:14 | n | -| main.rs:248:9:248:15 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:248:14:248:14 | n | -| main.rs:255:12:255:18 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:255:17:255:17 | n | -| main.rs:289:14:289:15 | s1 | {EXTERNAL LOCATION} | Some | main.rs:289:14:289:16 | TryExpr | -| main.rs:289:14:289:15 | s1 | {EXTERNAL LOCATION} | Ok | main.rs:289:14:289:16 | TryExpr | -| main.rs:291:10:291:11 | s2 | {EXTERNAL LOCATION} | Some | main.rs:291:10:291:12 | TryExpr | -| main.rs:291:10:291:11 | s2 | {EXTERNAL LOCATION} | Ok | main.rs:291:10:291:12 | TryExpr | -| main.rs:313:14:313:15 | s1 | {EXTERNAL LOCATION} | Some | main.rs:313:14:313:16 | TryExpr | -| main.rs:313:14:313:15 | s1 | {EXTERNAL LOCATION} | Ok | main.rs:313:14:313:16 | TryExpr | -| main.rs:314:14:314:15 | s2 | {EXTERNAL LOCATION} | Some | main.rs:314:14:314:16 | TryExpr | -| main.rs:314:14:314:15 | s2 | {EXTERNAL LOCATION} | Ok | main.rs:314:14:314:16 | TryExpr | -| main.rs:317:14:317:15 | s3 | {EXTERNAL LOCATION} | Some | main.rs:317:14:317:16 | TryExpr | -| main.rs:317:14:317:15 | s3 | {EXTERNAL LOCATION} | Ok | main.rs:317:14:317:16 | TryExpr | -| main.rs:341:9:341:25 | ...::A(...) | main.rs:333:7:333:9 | A | main.rs:341:24:341:24 | n | -| main.rs:342:9:342:25 | ...::B(...) | main.rs:334:7:334:9 | B | main.rs:342:24:342:24 | n | -| main.rs:345:9:345:25 | ...::A(...) | main.rs:333:7:333:9 | A | main.rs:345:24:345:24 | n | -| main.rs:345:29:345:45 | ...::B(...) | main.rs:334:7:334:9 | B | main.rs:345:44:345:44 | n | -| main.rs:348:9:348:25 | ...::A(...) | main.rs:333:7:333:9 | A | main.rs:348:24:348:24 | n | -| main.rs:349:9:349:25 | ...::B(...) | main.rs:334:7:334:9 | B | main.rs:349:24:349:24 | n | -| main.rs:359:9:359:12 | A(...) | main.rs:333:7:333:9 | A | main.rs:359:11:359:11 | n | -| main.rs:360:9:360:12 | B(...) | main.rs:334:7:334:9 | B | main.rs:360:11:360:11 | n | -| main.rs:363:9:363:12 | A(...) | main.rs:333:7:333:9 | A | main.rs:363:11:363:11 | n | -| main.rs:363:16:363:19 | B(...) | main.rs:334:7:334:9 | B | main.rs:363:18:363:18 | n | -| main.rs:366:9:366:12 | A(...) | main.rs:333:7:333:9 | A | main.rs:366:11:366:11 | n | -| main.rs:367:9:367:12 | B(...) | main.rs:334:7:334:9 | B | main.rs:367:11:367:11 | n | -| main.rs:382:9:382:38 | ...::C {...} | main.rs:372:9:372:20 | C | main.rs:382:36:382:36 | n | -| main.rs:383:9:383:38 | ...::D {...} | main.rs:373:9:373:20 | D | main.rs:383:36:383:36 | n | -| main.rs:386:9:386:38 | ...::C {...} | main.rs:372:9:372:20 | C | main.rs:386:36:386:36 | n | -| main.rs:386:42:386:71 | ...::D {...} | main.rs:373:9:373:20 | D | main.rs:386:69:386:69 | n | -| main.rs:389:9:389:38 | ...::C {...} | main.rs:372:9:372:20 | C | main.rs:389:36:389:36 | n | -| main.rs:390:9:390:38 | ...::D {...} | main.rs:373:9:373:20 | D | main.rs:390:36:390:36 | n | -| main.rs:402:9:402:24 | C {...} | main.rs:372:9:372:20 | C | main.rs:402:22:402:22 | n | -| main.rs:403:9:403:24 | D {...} | main.rs:373:9:373:20 | D | main.rs:403:22:403:22 | n | -| main.rs:406:9:406:24 | C {...} | main.rs:372:9:372:20 | C | main.rs:406:22:406:22 | n | -| main.rs:406:28:406:43 | D {...} | main.rs:373:9:373:20 | D | main.rs:406:41:406:41 | n | -| main.rs:409:9:409:24 | C {...} | main.rs:372:9:372:20 | C | main.rs:409:22:409:22 | n | -| main.rs:410:9:410:24 | D {...} | main.rs:373:9:373:20 | D | main.rs:410:22:410:22 | n | -| main.rs:419:14:419:17 | arr1 | file://:0:0:0:0 | element | main.rs:419:14:419:20 | arr1[2] | -| main.rs:423:14:423:17 | arr2 | file://:0:0:0:0 | element | main.rs:423:14:423:20 | arr2[4] | -| main.rs:427:14:427:17 | arr3 | file://:0:0:0:0 | element | main.rs:427:14:427:20 | arr3[2] | -| main.rs:433:15:433:18 | arr1 | file://:0:0:0:0 | element | main.rs:433:9:433:10 | n1 | -| main.rs:438:15:438:18 | arr2 | file://:0:0:0:0 | element | main.rs:438:9:438:10 | n2 | -| main.rs:446:9:446:17 | SlicePat | file://:0:0:0:0 | element | main.rs:446:10:446:10 | a | -| main.rs:446:9:446:17 | SlicePat | file://:0:0:0:0 | element | main.rs:446:13:446:13 | b | -| main.rs:446:9:446:17 | SlicePat | file://:0:0:0:0 | element | main.rs:446:16:446:16 | c | -| main.rs:456:10:456:16 | mut_arr | file://:0:0:0:0 | element | main.rs:456:10:456:19 | mut_arr[1] | -| main.rs:458:5:458:11 | mut_arr | file://:0:0:0:0 | element | main.rs:458:5:458:14 | mut_arr[1] | -| main.rs:459:13:459:19 | mut_arr | file://:0:0:0:0 | element | main.rs:459:13:459:22 | mut_arr[1] | -| main.rs:461:10:461:16 | mut_arr | file://:0:0:0:0 | element | main.rs:461:10:461:19 | mut_arr[0] | -| main.rs:468:9:468:20 | TuplePat | file://:0:0:0:0 | tuple.0 | main.rs:468:10:468:13 | cond | -| main.rs:468:9:468:20 | TuplePat | file://:0:0:0:0 | tuple.1 | main.rs:468:16:468:19 | name | -| main.rs:468:25:468:29 | names | file://:0:0:0:0 | element | main.rs:468:9:468:20 | TuplePat | -| main.rs:470:41:470:67 | [post] \|...\| ... | main.rs:467:9:467:20 | captured default_name | main.rs:470:41:470:67 | [post] default_name | -| main.rs:470:44:470:55 | this | main.rs:467:9:467:20 | captured default_name | main.rs:470:44:470:55 | default_name | -| main.rs:471:18:471:18 | [post] receiver for n | file://:0:0:0:0 | &ref | main.rs:471:18:471:18 | [post] n | -| main.rs:495:13:495:13 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:495:13:495:13 | [post] b | -| main.rs:496:18:496:18 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:496:18:496:18 | [post] b | -| main.rs:507:10:507:11 | vs | file://:0:0:0:0 | element | main.rs:507:10:507:14 | vs[0] | -| main.rs:508:11:508:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:508:10:508:35 | * ... | -| main.rs:509:11:509:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:509:10:509:35 | * ... | -| main.rs:511:14:511:15 | vs | file://:0:0:0:0 | element | main.rs:511:9:511:9 | v | -| main.rs:514:9:514:10 | &... | file://:0:0:0:0 | &ref | main.rs:514:10:514:10 | v | -| main.rs:514:15:514:23 | vs.iter() | file://:0:0:0:0 | element | main.rs:514:9:514:10 | &... | -| main.rs:519:9:519:10 | &... | file://:0:0:0:0 | &ref | main.rs:519:10:519:10 | v | -| main.rs:519:15:519:17 | vs2 | file://:0:0:0:0 | element | main.rs:519:9:519:10 | &... | -| main.rs:523:29:523:29 | x | file://:0:0:0:0 | &ref | main.rs:523:28:523:29 | * ... | -| main.rs:524:34:524:34 | x | file://:0:0:0:0 | &ref | main.rs:524:33:524:34 | * ... | -| main.rs:526:14:526:27 | vs.into_iter() | file://:0:0:0:0 | element | main.rs:526:9:526:9 | v | -| main.rs:532:10:532:15 | vs_mut | file://:0:0:0:0 | element | main.rs:532:10:532:18 | vs_mut[0] | -| main.rs:533:11:533:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:533:10:533:39 | * ... | -| main.rs:534:11:534:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:534:10:534:39 | * ... | -| main.rs:536:9:536:14 | &mut ... | file://:0:0:0:0 | &ref | main.rs:536:14:536:14 | v | -| main.rs:536:19:536:35 | vs_mut.iter_mut() | file://:0:0:0:0 | element | main.rs:536:9:536:14 | &mut ... | -| main.rs:550:11:550:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:550:10:550:15 | * ... | +| main.rs:116:11:116:11 | [post] receiver for i | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | [post] i | +| main.rs:116:11:116:11 | i | file://:0:0:0:0 | &ref | main.rs:116:10:116:11 | * ... | +| main.rs:124:10:124:10 | a | file://:0:0:0:0 | tuple.0 | main.rs:124:10:124:12 | a.0 | +| main.rs:125:10:125:10 | a | file://:0:0:0:0 | tuple.1 | main.rs:125:10:125:12 | a.1 | +| main.rs:130:9:130:20 | TuplePat | file://:0:0:0:0 | tuple.0 | main.rs:130:10:130:11 | a0 | +| main.rs:130:9:130:20 | TuplePat | file://:0:0:0:0 | tuple.1 | main.rs:130:14:130:15 | a1 | +| main.rs:130:9:130:20 | TuplePat | file://:0:0:0:0 | tuple.2 | main.rs:130:18:130:19 | a2 | +| main.rs:138:10:138:10 | a | file://:0:0:0:0 | tuple.0 | main.rs:138:10:138:12 | a.0 | +| main.rs:139:10:139:10 | a | file://:0:0:0:0 | tuple.1 | main.rs:139:10:139:12 | a.1 | +| main.rs:140:5:140:5 | a | file://:0:0:0:0 | tuple.0 | main.rs:140:5:140:7 | a.0 | +| main.rs:141:5:141:5 | a | file://:0:0:0:0 | tuple.1 | main.rs:141:5:141:7 | a.1 | +| main.rs:142:10:142:10 | a | file://:0:0:0:0 | tuple.0 | main.rs:142:10:142:12 | a.0 | +| main.rs:143:10:143:10 | a | file://:0:0:0:0 | tuple.1 | main.rs:143:10:143:12 | a.1 | +| main.rs:149:10:149:10 | b | file://:0:0:0:0 | tuple.0 | main.rs:149:10:149:12 | b.0 | +| main.rs:149:10:149:12 | b.0 | file://:0:0:0:0 | tuple.0 | main.rs:149:10:149:15 | ... .0 | +| main.rs:150:10:150:10 | b | file://:0:0:0:0 | tuple.0 | main.rs:150:10:150:12 | b.0 | +| main.rs:150:10:150:12 | b.0 | file://:0:0:0:0 | tuple.1 | main.rs:150:10:150:15 | ... .1 | +| main.rs:151:10:151:10 | b | file://:0:0:0:0 | tuple.1 | main.rs:151:10:151:12 | b.1 | +| main.rs:164:10:164:10 | p | main.rs:158:5:158:10 | Point.x | main.rs:164:10:164:12 | p.x | +| main.rs:165:10:165:10 | p | main.rs:159:5:159:10 | Point.y | main.rs:165:10:165:12 | p.y | +| main.rs:170:10:170:10 | p | main.rs:159:5:159:10 | Point.y | main.rs:170:10:170:12 | p.y | +| main.rs:171:5:171:5 | p | main.rs:159:5:159:10 | Point.y | main.rs:171:5:171:7 | p.y | +| main.rs:172:10:172:10 | p | main.rs:159:5:159:10 | Point.y | main.rs:172:10:172:12 | p.y | +| main.rs:180:9:180:28 | Point {...} | main.rs:158:5:158:10 | Point.x | main.rs:180:20:180:20 | a | +| main.rs:180:9:180:28 | Point {...} | main.rs:159:5:159:10 | Point.y | main.rs:180:26:180:26 | b | +| main.rs:198:10:198:10 | p | main.rs:186:5:186:16 | Point3D.plane | main.rs:198:10:198:16 | p.plane | +| main.rs:198:10:198:16 | p.plane | main.rs:158:5:158:10 | Point.x | main.rs:198:10:198:18 | ... .x | +| main.rs:199:10:199:10 | p | main.rs:186:5:186:16 | Point3D.plane | main.rs:199:10:199:16 | p.plane | +| main.rs:199:10:199:16 | p.plane | main.rs:159:5:159:10 | Point.y | main.rs:199:10:199:18 | ... .y | +| main.rs:200:10:200:10 | p | main.rs:187:5:187:10 | Point3D.z | main.rs:200:10:200:12 | p.z | +| main.rs:210:9:213:9 | Point3D {...} | main.rs:186:5:186:16 | Point3D.plane | main.rs:211:20:211:33 | Point {...} | +| main.rs:210:9:213:9 | Point3D {...} | main.rs:187:5:187:10 | Point3D.z | main.rs:212:13:212:13 | z | +| main.rs:211:20:211:33 | Point {...} | main.rs:158:5:158:10 | Point.x | main.rs:211:28:211:28 | x | +| main.rs:211:20:211:33 | Point {...} | main.rs:159:5:159:10 | Point.y | main.rs:211:31:211:31 | y | +| main.rs:225:10:225:10 | s | file://:0:0:0:0 | tuple.0 | main.rs:225:10:225:12 | s.0 | +| main.rs:225:10:225:10 | s | main.rs:221:22:221:24 | MyTupleStruct(0) | main.rs:225:10:225:12 | s.0 | +| main.rs:226:10:226:10 | s | file://:0:0:0:0 | tuple.1 | main.rs:226:10:226:12 | s.1 | +| main.rs:226:10:226:10 | s | main.rs:221:27:221:29 | MyTupleStruct(1) | main.rs:226:10:226:12 | s.1 | +| main.rs:229:9:229:27 | MyTupleStruct(...) | main.rs:221:22:221:24 | MyTupleStruct(0) | main.rs:229:23:229:23 | x | +| main.rs:229:9:229:27 | MyTupleStruct(...) | main.rs:221:27:221:29 | MyTupleStruct(1) | main.rs:229:26:229:26 | y | +| main.rs:243:9:243:23 | ...::Some(...) | {EXTERNAL LOCATION} | Some | main.rs:243:22:243:22 | n | +| main.rs:247:9:247:23 | ...::Some(...) | {EXTERNAL LOCATION} | Some | main.rs:247:22:247:22 | n | +| main.rs:256:9:256:15 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:256:14:256:14 | n | +| main.rs:260:9:260:15 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:260:14:260:14 | n | +| main.rs:267:12:267:18 | Some(...) | {EXTERNAL LOCATION} | Some | main.rs:267:17:267:17 | n | +| main.rs:301:14:301:15 | s1 | {EXTERNAL LOCATION} | Some | main.rs:301:14:301:16 | TryExpr | +| main.rs:301:14:301:15 | s1 | {EXTERNAL LOCATION} | Ok | main.rs:301:14:301:16 | TryExpr | +| main.rs:303:10:303:11 | s2 | {EXTERNAL LOCATION} | Some | main.rs:303:10:303:12 | TryExpr | +| main.rs:303:10:303:11 | s2 | {EXTERNAL LOCATION} | Ok | main.rs:303:10:303:12 | TryExpr | +| main.rs:325:14:325:15 | s1 | {EXTERNAL LOCATION} | Some | main.rs:325:14:325:16 | TryExpr | +| main.rs:325:14:325:15 | s1 | {EXTERNAL LOCATION} | Ok | main.rs:325:14:325:16 | TryExpr | +| main.rs:326:14:326:15 | s2 | {EXTERNAL LOCATION} | Some | main.rs:326:14:326:16 | TryExpr | +| main.rs:326:14:326:15 | s2 | {EXTERNAL LOCATION} | Ok | main.rs:326:14:326:16 | TryExpr | +| main.rs:329:14:329:15 | s3 | {EXTERNAL LOCATION} | Some | main.rs:329:14:329:16 | TryExpr | +| main.rs:329:14:329:15 | s3 | {EXTERNAL LOCATION} | Ok | main.rs:329:14:329:16 | TryExpr | +| main.rs:353:9:353:25 | ...::A(...) | main.rs:345:7:345:9 | A | main.rs:353:24:353:24 | n | +| main.rs:354:9:354:25 | ...::B(...) | main.rs:346:7:346:9 | B | main.rs:354:24:354:24 | n | +| main.rs:357:9:357:25 | ...::A(...) | main.rs:345:7:345:9 | A | main.rs:357:24:357:24 | n | +| main.rs:357:29:357:45 | ...::B(...) | main.rs:346:7:346:9 | B | main.rs:357:44:357:44 | n | +| main.rs:360:9:360:25 | ...::A(...) | main.rs:345:7:345:9 | A | main.rs:360:24:360:24 | n | +| main.rs:361:9:361:25 | ...::B(...) | main.rs:346:7:346:9 | B | main.rs:361:24:361:24 | n | +| main.rs:371:9:371:12 | A(...) | main.rs:345:7:345:9 | A | main.rs:371:11:371:11 | n | +| main.rs:372:9:372:12 | B(...) | main.rs:346:7:346:9 | B | main.rs:372:11:372:11 | n | +| main.rs:375:9:375:12 | A(...) | main.rs:345:7:345:9 | A | main.rs:375:11:375:11 | n | +| main.rs:375:16:375:19 | B(...) | main.rs:346:7:346:9 | B | main.rs:375:18:375:18 | n | +| main.rs:378:9:378:12 | A(...) | main.rs:345:7:345:9 | A | main.rs:378:11:378:11 | n | +| main.rs:379:9:379:12 | B(...) | main.rs:346:7:346:9 | B | main.rs:379:11:379:11 | n | +| main.rs:394:9:394:38 | ...::C {...} | main.rs:384:9:384:20 | C | main.rs:394:36:394:36 | n | +| main.rs:395:9:395:38 | ...::D {...} | main.rs:385:9:385:20 | D | main.rs:395:36:395:36 | n | +| main.rs:398:9:398:38 | ...::C {...} | main.rs:384:9:384:20 | C | main.rs:398:36:398:36 | n | +| main.rs:398:42:398:71 | ...::D {...} | main.rs:385:9:385:20 | D | main.rs:398:69:398:69 | n | +| main.rs:401:9:401:38 | ...::C {...} | main.rs:384:9:384:20 | C | main.rs:401:36:401:36 | n | +| main.rs:402:9:402:38 | ...::D {...} | main.rs:385:9:385:20 | D | main.rs:402:36:402:36 | n | +| main.rs:414:9:414:24 | C {...} | main.rs:384:9:384:20 | C | main.rs:414:22:414:22 | n | +| main.rs:415:9:415:24 | D {...} | main.rs:385:9:385:20 | D | main.rs:415:22:415:22 | n | +| main.rs:418:9:418:24 | C {...} | main.rs:384:9:384:20 | C | main.rs:418:22:418:22 | n | +| main.rs:418:28:418:43 | D {...} | main.rs:385:9:385:20 | D | main.rs:418:41:418:41 | n | +| main.rs:421:9:421:24 | C {...} | main.rs:384:9:384:20 | C | main.rs:421:22:421:22 | n | +| main.rs:422:9:422:24 | D {...} | main.rs:385:9:385:20 | D | main.rs:422:22:422:22 | n | +| main.rs:431:14:431:17 | arr1 | file://:0:0:0:0 | element | main.rs:431:14:431:20 | arr1[2] | +| main.rs:435:14:435:17 | arr2 | file://:0:0:0:0 | element | main.rs:435:14:435:20 | arr2[4] | +| main.rs:439:14:439:17 | arr3 | file://:0:0:0:0 | element | main.rs:439:14:439:20 | arr3[2] | +| main.rs:445:15:445:18 | arr1 | file://:0:0:0:0 | element | main.rs:445:9:445:10 | n1 | +| main.rs:450:15:450:18 | arr2 | file://:0:0:0:0 | element | main.rs:450:9:450:10 | n2 | +| main.rs:458:9:458:17 | SlicePat | file://:0:0:0:0 | element | main.rs:458:10:458:10 | a | +| main.rs:458:9:458:17 | SlicePat | file://:0:0:0:0 | element | main.rs:458:13:458:13 | b | +| main.rs:458:9:458:17 | SlicePat | file://:0:0:0:0 | element | main.rs:458:16:458:16 | c | +| main.rs:468:10:468:16 | mut_arr | file://:0:0:0:0 | element | main.rs:468:10:468:19 | mut_arr[1] | +| main.rs:470:5:470:11 | mut_arr | file://:0:0:0:0 | element | main.rs:470:5:470:14 | mut_arr[1] | +| main.rs:471:13:471:19 | mut_arr | file://:0:0:0:0 | element | main.rs:471:13:471:22 | mut_arr[1] | +| main.rs:473:10:473:16 | mut_arr | file://:0:0:0:0 | element | main.rs:473:10:473:19 | mut_arr[0] | +| main.rs:480:9:480:20 | TuplePat | file://:0:0:0:0 | tuple.0 | main.rs:480:10:480:13 | cond | +| main.rs:480:9:480:20 | TuplePat | file://:0:0:0:0 | tuple.1 | main.rs:480:16:480:19 | name | +| main.rs:480:25:480:29 | names | file://:0:0:0:0 | element | main.rs:480:9:480:20 | TuplePat | +| main.rs:482:41:482:67 | [post] \|...\| ... | main.rs:479:9:479:20 | captured default_name | main.rs:482:41:482:67 | [post] default_name | +| main.rs:482:44:482:55 | this | main.rs:479:9:479:20 | captured default_name | main.rs:482:44:482:55 | default_name | +| main.rs:483:18:483:18 | [post] receiver for n | file://:0:0:0:0 | &ref | main.rs:483:18:483:18 | [post] n | +| main.rs:507:13:507:13 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:507:13:507:13 | [post] b | +| main.rs:508:18:508:18 | [post] receiver for b | file://:0:0:0:0 | &ref | main.rs:508:18:508:18 | [post] b | +| main.rs:519:10:519:11 | vs | file://:0:0:0:0 | element | main.rs:519:10:519:14 | vs[0] | +| main.rs:520:11:520:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:520:10:520:35 | * ... | +| main.rs:521:11:521:35 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:521:10:521:35 | * ... | +| main.rs:523:14:523:15 | vs | file://:0:0:0:0 | element | main.rs:523:9:523:9 | v | +| main.rs:526:9:526:10 | &... | file://:0:0:0:0 | &ref | main.rs:526:10:526:10 | v | +| main.rs:526:15:526:23 | vs.iter() | file://:0:0:0:0 | element | main.rs:526:9:526:10 | &... | +| main.rs:531:9:531:10 | &... | file://:0:0:0:0 | &ref | main.rs:531:10:531:10 | v | +| main.rs:531:15:531:17 | vs2 | file://:0:0:0:0 | element | main.rs:531:9:531:10 | &... | +| main.rs:535:29:535:29 | x | file://:0:0:0:0 | &ref | main.rs:535:28:535:29 | * ... | +| main.rs:536:34:536:34 | x | file://:0:0:0:0 | &ref | main.rs:536:33:536:34 | * ... | +| main.rs:538:14:538:27 | vs.into_iter() | file://:0:0:0:0 | element | main.rs:538:9:538:9 | v | +| main.rs:544:10:544:15 | vs_mut | file://:0:0:0:0 | element | main.rs:544:10:544:18 | vs_mut[0] | +| main.rs:545:11:545:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:545:10:545:39 | * ... | +| main.rs:546:11:546:39 | ... .unwrap() | file://:0:0:0:0 | &ref | main.rs:546:10:546:39 | * ... | +| main.rs:548:9:548:14 | &mut ... | file://:0:0:0:0 | &ref | main.rs:548:14:548:14 | v | +| main.rs:548:19:548:35 | vs_mut.iter_mut() | file://:0:0:0:0 | element | main.rs:548:9:548:14 | &mut ... | +| main.rs:562:11:562:15 | c_ref | file://:0:0:0:0 | &ref | main.rs:562:10:562:15 | * ... | storeStep -| main.rs:104:11:104:11 | i | file://:0:0:0:0 | &ref | main.rs:104:11:104:11 | receiver for i | -| main.rs:111:14:111:22 | source(...) | file://:0:0:0:0 | tuple.0 | main.rs:111:13:111:26 | TupleExpr | -| main.rs:111:25:111:25 | 2 | file://:0:0:0:0 | tuple.1 | main.rs:111:13:111:26 | TupleExpr | -| main.rs:117:14:117:14 | 2 | file://:0:0:0:0 | tuple.0 | main.rs:117:13:117:30 | TupleExpr | -| main.rs:117:17:117:26 | source(...) | file://:0:0:0:0 | tuple.1 | main.rs:117:13:117:30 | TupleExpr | -| main.rs:117:29:117:29 | 2 | file://:0:0:0:0 | tuple.2 | main.rs:117:13:117:30 | TupleExpr | -| main.rs:125:18:125:18 | 2 | file://:0:0:0:0 | tuple.0 | main.rs:125:17:125:31 | TupleExpr | -| main.rs:125:21:125:30 | source(...) | file://:0:0:0:0 | tuple.1 | main.rs:125:17:125:31 | TupleExpr | -| main.rs:128:11:128:20 | source(...) | file://:0:0:0:0 | tuple.0 | main.rs:128:5:128:5 | [post] a | -| main.rs:129:11:129:11 | 2 | file://:0:0:0:0 | tuple.1 | main.rs:129:5:129:5 | [post] a | -| main.rs:135:14:135:14 | 3 | file://:0:0:0:0 | tuple.0 | main.rs:135:13:135:27 | TupleExpr | -| main.rs:135:17:135:26 | source(...) | file://:0:0:0:0 | tuple.1 | main.rs:135:13:135:27 | TupleExpr | -| main.rs:136:14:136:14 | a | file://:0:0:0:0 | tuple.0 | main.rs:136:13:136:18 | TupleExpr | -| main.rs:136:17:136:17 | 3 | file://:0:0:0:0 | tuple.1 | main.rs:136:13:136:18 | TupleExpr | -| main.rs:151:24:151:32 | source(...) | main.rs:146:5:146:10 | Point.x | main.rs:151:13:151:40 | Point {...} | -| main.rs:151:38:151:38 | 2 | main.rs:147:5:147:10 | Point.y | main.rs:151:13:151:40 | Point {...} | -| main.rs:157:28:157:36 | source(...) | main.rs:146:5:146:10 | Point.x | main.rs:157:17:157:44 | Point {...} | -| main.rs:157:42:157:42 | 2 | main.rs:147:5:147:10 | Point.y | main.rs:157:17:157:44 | Point {...} | -| main.rs:159:11:159:20 | source(...) | main.rs:147:5:147:10 | Point.y | main.rs:159:5:159:5 | [post] p | -| main.rs:165:12:165:21 | source(...) | main.rs:146:5:146:10 | Point.x | main.rs:164:13:167:5 | Point {...} | -| main.rs:166:12:166:12 | 2 | main.rs:147:5:147:10 | Point.y | main.rs:164:13:167:5 | Point {...} | -| main.rs:180:16:183:9 | Point {...} | main.rs:174:5:174:16 | Point3D.plane | main.rs:179:13:185:5 | Point3D {...} | -| main.rs:181:16:181:16 | 2 | main.rs:146:5:146:10 | Point.x | main.rs:180:16:183:9 | Point {...} | -| main.rs:182:16:182:25 | source(...) | main.rs:147:5:147:10 | Point.y | main.rs:180:16:183:9 | Point {...} | -| main.rs:184:12:184:12 | 4 | main.rs:175:5:175:10 | Point3D.z | main.rs:179:13:185:5 | Point3D {...} | -| main.rs:194:16:194:32 | Point {...} | main.rs:174:5:174:16 | Point3D.plane | main.rs:193:13:196:5 | Point3D {...} | -| main.rs:194:27:194:27 | 2 | main.rs:146:5:146:10 | Point.x | main.rs:194:16:194:32 | Point {...} | -| main.rs:194:30:194:30 | y | main.rs:147:5:147:10 | Point.y | main.rs:194:16:194:32 | Point {...} | -| main.rs:195:12:195:12 | 4 | main.rs:175:5:175:10 | Point3D.z | main.rs:193:13:196:5 | Point3D {...} | -| main.rs:212:27:212:36 | source(...) | main.rs:209:22:209:24 | MyTupleStruct(0) | main.rs:212:13:212:40 | MyTupleStruct(...) | -| main.rs:212:39:212:39 | 2 | main.rs:209:27:209:29 | MyTupleStruct(1) | main.rs:212:13:212:40 | MyTupleStruct(...) | -| main.rs:228:27:228:36 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:228:14:228:37 | ...::Some(...) | -| main.rs:229:27:229:27 | 2 | {EXTERNAL LOCATION} | Some | main.rs:229:14:229:28 | ...::Some(...) | -| main.rs:241:19:241:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:241:14:241:29 | Some(...) | -| main.rs:242:19:242:19 | 2 | {EXTERNAL LOCATION} | Some | main.rs:242:14:242:20 | Some(...) | -| main.rs:254:19:254:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:254:14:254:29 | Some(...) | +| main.rs:116:11:116:11 | i | file://:0:0:0:0 | &ref | main.rs:116:11:116:11 | receiver for i | +| main.rs:123:14:123:22 | source(...) | file://:0:0:0:0 | tuple.0 | main.rs:123:13:123:26 | TupleExpr | +| main.rs:123:25:123:25 | 2 | file://:0:0:0:0 | tuple.1 | main.rs:123:13:123:26 | TupleExpr | +| main.rs:129:14:129:14 | 2 | file://:0:0:0:0 | tuple.0 | main.rs:129:13:129:30 | TupleExpr | +| main.rs:129:17:129:26 | source(...) | file://:0:0:0:0 | tuple.1 | main.rs:129:13:129:30 | TupleExpr | +| main.rs:129:29:129:29 | 2 | file://:0:0:0:0 | tuple.2 | main.rs:129:13:129:30 | TupleExpr | +| main.rs:137:18:137:18 | 2 | file://:0:0:0:0 | tuple.0 | main.rs:137:17:137:31 | TupleExpr | +| main.rs:137:21:137:30 | source(...) | file://:0:0:0:0 | tuple.1 | main.rs:137:17:137:31 | TupleExpr | +| main.rs:140:11:140:20 | source(...) | file://:0:0:0:0 | tuple.0 | main.rs:140:5:140:5 | [post] a | +| main.rs:141:11:141:11 | 2 | file://:0:0:0:0 | tuple.1 | main.rs:141:5:141:5 | [post] a | +| main.rs:147:14:147:14 | 3 | file://:0:0:0:0 | tuple.0 | main.rs:147:13:147:27 | TupleExpr | +| main.rs:147:17:147:26 | source(...) | file://:0:0:0:0 | tuple.1 | main.rs:147:13:147:27 | TupleExpr | +| main.rs:148:14:148:14 | a | file://:0:0:0:0 | tuple.0 | main.rs:148:13:148:18 | TupleExpr | +| main.rs:148:17:148:17 | 3 | file://:0:0:0:0 | tuple.1 | main.rs:148:13:148:18 | TupleExpr | +| main.rs:163:24:163:32 | source(...) | main.rs:158:5:158:10 | Point.x | main.rs:163:13:163:40 | Point {...} | +| main.rs:163:38:163:38 | 2 | main.rs:159:5:159:10 | Point.y | main.rs:163:13:163:40 | Point {...} | +| main.rs:169:28:169:36 | source(...) | main.rs:158:5:158:10 | Point.x | main.rs:169:17:169:44 | Point {...} | +| main.rs:169:42:169:42 | 2 | main.rs:159:5:159:10 | Point.y | main.rs:169:17:169:44 | Point {...} | +| main.rs:171:11:171:20 | source(...) | main.rs:159:5:159:10 | Point.y | main.rs:171:5:171:5 | [post] p | +| main.rs:177:12:177:21 | source(...) | main.rs:158:5:158:10 | Point.x | main.rs:176:13:179:5 | Point {...} | +| main.rs:178:12:178:12 | 2 | main.rs:159:5:159:10 | Point.y | main.rs:176:13:179:5 | Point {...} | +| main.rs:192:16:195:9 | Point {...} | main.rs:186:5:186:16 | Point3D.plane | main.rs:191:13:197:5 | Point3D {...} | +| main.rs:193:16:193:16 | 2 | main.rs:158:5:158:10 | Point.x | main.rs:192:16:195:9 | Point {...} | +| main.rs:194:16:194:25 | source(...) | main.rs:159:5:159:10 | Point.y | main.rs:192:16:195:9 | Point {...} | +| main.rs:196:12:196:12 | 4 | main.rs:187:5:187:10 | Point3D.z | main.rs:191:13:197:5 | Point3D {...} | +| main.rs:206:16:206:32 | Point {...} | main.rs:186:5:186:16 | Point3D.plane | main.rs:205:13:208:5 | Point3D {...} | +| main.rs:206:27:206:27 | 2 | main.rs:158:5:158:10 | Point.x | main.rs:206:16:206:32 | Point {...} | +| main.rs:206:30:206:30 | y | main.rs:159:5:159:10 | Point.y | main.rs:206:16:206:32 | Point {...} | +| main.rs:207:12:207:12 | 4 | main.rs:187:5:187:10 | Point3D.z | main.rs:205:13:208:5 | Point3D {...} | +| main.rs:224:27:224:36 | source(...) | main.rs:221:22:221:24 | MyTupleStruct(0) | main.rs:224:13:224:40 | MyTupleStruct(...) | +| main.rs:224:39:224:39 | 2 | main.rs:221:27:221:29 | MyTupleStruct(1) | main.rs:224:13:224:40 | MyTupleStruct(...) | +| main.rs:240:27:240:36 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:240:14:240:37 | ...::Some(...) | +| main.rs:241:27:241:27 | 2 | {EXTERNAL LOCATION} | Some | main.rs:241:14:241:28 | ...::Some(...) | +| main.rs:253:19:253:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:253:14:253:29 | Some(...) | +| main.rs:254:19:254:19 | 2 | {EXTERNAL LOCATION} | Some | main.rs:254:14:254:20 | Some(...) | | main.rs:266:19:266:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:266:14:266:29 | Some(...) | -| main.rs:271:19:271:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:271:14:271:29 | Some(...) | -| main.rs:274:19:274:19 | 0 | {EXTERNAL LOCATION} | Some | main.rs:274:14:274:20 | Some(...) | -| main.rs:279:19:279:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:279:14:279:29 | Some(...) | -| main.rs:287:19:287:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:287:14:287:29 | Some(...) | -| main.rs:288:19:288:19 | 2 | {EXTERNAL LOCATION} | Some | main.rs:288:14:288:20 | Some(...) | -| main.rs:292:10:292:10 | 0 | {EXTERNAL LOCATION} | Some | main.rs:292:5:292:11 | Some(...) | -| main.rs:296:35:296:44 | source(...) | {EXTERNAL LOCATION} | Ok | main.rs:296:32:296:45 | Ok(...) | -| main.rs:302:36:302:45 | source(...) | {EXTERNAL LOCATION} | Err | main.rs:302:32:302:46 | Err(...) | -| main.rs:310:35:310:44 | source(...) | {EXTERNAL LOCATION} | Ok | main.rs:310:32:310:45 | Ok(...) | -| main.rs:311:35:311:35 | 2 | {EXTERNAL LOCATION} | Ok | main.rs:311:32:311:36 | Ok(...) | -| main.rs:312:36:312:45 | source(...) | {EXTERNAL LOCATION} | Err | main.rs:312:32:312:46 | Err(...) | -| main.rs:319:8:319:8 | 0 | {EXTERNAL LOCATION} | Ok | main.rs:319:5:319:9 | Ok(...) | -| main.rs:323:35:323:44 | source(...) | {EXTERNAL LOCATION} | Ok | main.rs:323:32:323:45 | Ok(...) | -| main.rs:327:36:327:45 | source(...) | {EXTERNAL LOCATION} | Err | main.rs:327:32:327:46 | Err(...) | -| main.rs:338:29:338:38 | source(...) | main.rs:333:7:333:9 | A | main.rs:338:14:338:39 | ...::A(...) | -| main.rs:339:29:339:29 | 2 | main.rs:334:7:334:9 | B | main.rs:339:14:339:30 | ...::B(...) | -| main.rs:356:16:356:25 | source(...) | main.rs:333:7:333:9 | A | main.rs:356:14:356:26 | A(...) | -| main.rs:357:16:357:16 | 2 | main.rs:334:7:334:9 | B | main.rs:357:14:357:17 | B(...) | -| main.rs:378:18:378:27 | source(...) | main.rs:372:9:372:20 | C | main.rs:377:14:379:5 | ...::C {...} | -| main.rs:380:41:380:41 | 2 | main.rs:373:9:373:20 | D | main.rs:380:14:380:43 | ...::D {...} | -| main.rs:398:18:398:27 | source(...) | main.rs:372:9:372:20 | C | main.rs:397:14:399:5 | C {...} | -| main.rs:400:27:400:27 | 2 | main.rs:373:9:373:20 | D | main.rs:400:14:400:29 | D {...} | -| main.rs:418:17:418:17 | 1 | file://:0:0:0:0 | element | main.rs:418:16:418:33 | [...] | -| main.rs:418:20:418:20 | 2 | file://:0:0:0:0 | element | main.rs:418:16:418:33 | [...] | -| main.rs:418:23:418:32 | source(...) | file://:0:0:0:0 | element | main.rs:418:16:418:33 | [...] | -| main.rs:422:17:422:26 | source(...) | file://:0:0:0:0 | element | main.rs:422:16:422:31 | [...; 10] | -| main.rs:426:17:426:17 | 1 | file://:0:0:0:0 | element | main.rs:426:16:426:24 | [...] | -| main.rs:426:20:426:20 | 2 | file://:0:0:0:0 | element | main.rs:426:16:426:24 | [...] | -| main.rs:426:23:426:23 | 3 | file://:0:0:0:0 | element | main.rs:426:16:426:24 | [...] | -| main.rs:432:17:432:17 | 1 | file://:0:0:0:0 | element | main.rs:432:16:432:33 | [...] | -| main.rs:432:20:432:20 | 2 | file://:0:0:0:0 | element | main.rs:432:16:432:33 | [...] | -| main.rs:432:23:432:32 | source(...) | file://:0:0:0:0 | element | main.rs:432:16:432:33 | [...] | -| main.rs:437:17:437:17 | 1 | file://:0:0:0:0 | element | main.rs:437:16:437:24 | [...] | -| main.rs:437:20:437:20 | 2 | file://:0:0:0:0 | element | main.rs:437:16:437:24 | [...] | -| main.rs:437:23:437:23 | 3 | file://:0:0:0:0 | element | main.rs:437:16:437:24 | [...] | +| main.rs:278:19:278:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:278:14:278:29 | Some(...) | +| main.rs:283:19:283:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:283:14:283:29 | Some(...) | +| main.rs:286:19:286:19 | 0 | {EXTERNAL LOCATION} | Some | main.rs:286:14:286:20 | Some(...) | +| main.rs:291:19:291:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:291:14:291:29 | Some(...) | +| main.rs:299:19:299:28 | source(...) | {EXTERNAL LOCATION} | Some | main.rs:299:14:299:29 | Some(...) | +| main.rs:300:19:300:19 | 2 | {EXTERNAL LOCATION} | Some | main.rs:300:14:300:20 | Some(...) | +| main.rs:304:10:304:10 | 0 | {EXTERNAL LOCATION} | Some | main.rs:304:5:304:11 | Some(...) | +| main.rs:308:35:308:44 | source(...) | {EXTERNAL LOCATION} | Ok | main.rs:308:32:308:45 | Ok(...) | +| main.rs:314:36:314:45 | source(...) | {EXTERNAL LOCATION} | Err | main.rs:314:32:314:46 | Err(...) | +| main.rs:322:35:322:44 | source(...) | {EXTERNAL LOCATION} | Ok | main.rs:322:32:322:45 | Ok(...) | +| main.rs:323:35:323:35 | 2 | {EXTERNAL LOCATION} | Ok | main.rs:323:32:323:36 | Ok(...) | +| main.rs:324:36:324:45 | source(...) | {EXTERNAL LOCATION} | Err | main.rs:324:32:324:46 | Err(...) | +| main.rs:331:8:331:8 | 0 | {EXTERNAL LOCATION} | Ok | main.rs:331:5:331:9 | Ok(...) | +| main.rs:335:35:335:44 | source(...) | {EXTERNAL LOCATION} | Ok | main.rs:335:32:335:45 | Ok(...) | +| main.rs:339:36:339:45 | source(...) | {EXTERNAL LOCATION} | Err | main.rs:339:32:339:46 | Err(...) | +| main.rs:350:29:350:38 | source(...) | main.rs:345:7:345:9 | A | main.rs:350:14:350:39 | ...::A(...) | +| main.rs:351:29:351:29 | 2 | main.rs:346:7:346:9 | B | main.rs:351:14:351:30 | ...::B(...) | +| main.rs:368:16:368:25 | source(...) | main.rs:345:7:345:9 | A | main.rs:368:14:368:26 | A(...) | +| main.rs:369:16:369:16 | 2 | main.rs:346:7:346:9 | B | main.rs:369:14:369:17 | B(...) | +| main.rs:390:18:390:27 | source(...) | main.rs:384:9:384:20 | C | main.rs:389:14:391:5 | ...::C {...} | +| main.rs:392:41:392:41 | 2 | main.rs:385:9:385:20 | D | main.rs:392:14:392:43 | ...::D {...} | +| main.rs:410:18:410:27 | source(...) | main.rs:384:9:384:20 | C | main.rs:409:14:411:5 | C {...} | +| main.rs:412:27:412:27 | 2 | main.rs:385:9:385:20 | D | main.rs:412:14:412:29 | D {...} | +| main.rs:430:17:430:17 | 1 | file://:0:0:0:0 | element | main.rs:430:16:430:33 | [...] | +| main.rs:430:20:430:20 | 2 | file://:0:0:0:0 | element | main.rs:430:16:430:33 | [...] | +| main.rs:430:23:430:32 | source(...) | file://:0:0:0:0 | element | main.rs:430:16:430:33 | [...] | +| main.rs:434:17:434:26 | source(...) | file://:0:0:0:0 | element | main.rs:434:16:434:31 | [...; 10] | +| main.rs:438:17:438:17 | 1 | file://:0:0:0:0 | element | main.rs:438:16:438:24 | [...] | +| main.rs:438:20:438:20 | 2 | file://:0:0:0:0 | element | main.rs:438:16:438:24 | [...] | +| main.rs:438:23:438:23 | 3 | file://:0:0:0:0 | element | main.rs:438:16:438:24 | [...] | | main.rs:444:17:444:17 | 1 | file://:0:0:0:0 | element | main.rs:444:16:444:33 | [...] | | main.rs:444:20:444:20 | 2 | file://:0:0:0:0 | element | main.rs:444:16:444:33 | [...] | | main.rs:444:23:444:32 | source(...) | file://:0:0:0:0 | element | main.rs:444:16:444:33 | [...] | -| main.rs:455:24:455:24 | 1 | file://:0:0:0:0 | element | main.rs:455:23:455:31 | [...] | -| main.rs:455:27:455:27 | 2 | file://:0:0:0:0 | element | main.rs:455:23:455:31 | [...] | -| main.rs:455:30:455:30 | 3 | file://:0:0:0:0 | element | main.rs:455:23:455:31 | [...] | -| main.rs:458:18:458:27 | source(...) | file://:0:0:0:0 | element | main.rs:458:5:458:11 | [post] mut_arr | -| main.rs:470:41:470:67 | default_name | main.rs:467:9:467:20 | captured default_name | main.rs:470:41:470:67 | \|...\| ... | -| main.rs:471:18:471:18 | n | file://:0:0:0:0 | &ref | main.rs:471:18:471:18 | receiver for n | -| main.rs:495:13:495:13 | b | file://:0:0:0:0 | &ref | main.rs:495:13:495:13 | receiver for b | -| main.rs:496:18:496:18 | b | file://:0:0:0:0 | &ref | main.rs:496:18:496:18 | receiver for b | -| main.rs:505:15:505:24 | source(...) | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] | -| main.rs:505:27:505:27 | 2 | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] | -| main.rs:505:30:505:30 | 3 | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] | -| main.rs:505:33:505:33 | 4 | file://:0:0:0:0 | element | main.rs:505:14:505:34 | [...] | -| main.rs:530:23:530:32 | source(...) | file://:0:0:0:0 | element | main.rs:530:22:530:42 | [...] | -| main.rs:530:35:530:35 | 2 | file://:0:0:0:0 | element | main.rs:530:22:530:42 | [...] | -| main.rs:530:38:530:38 | 3 | file://:0:0:0:0 | element | main.rs:530:22:530:42 | [...] | -| main.rs:530:41:530:41 | 4 | file://:0:0:0:0 | element | main.rs:530:22:530:42 | [...] | -| main.rs:545:18:545:18 | c | file://:0:0:0:0 | &ref | main.rs:545:17:545:18 | &c | -| main.rs:548:15:548:15 | b | file://:0:0:0:0 | &ref | main.rs:548:14:548:15 | &b | -| main.rs:571:27:571:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:571:22:571:28 | Some(...) | +| main.rs:449:17:449:17 | 1 | file://:0:0:0:0 | element | main.rs:449:16:449:24 | [...] | +| main.rs:449:20:449:20 | 2 | file://:0:0:0:0 | element | main.rs:449:16:449:24 | [...] | +| main.rs:449:23:449:23 | 3 | file://:0:0:0:0 | element | main.rs:449:16:449:24 | [...] | +| main.rs:456:17:456:17 | 1 | file://:0:0:0:0 | element | main.rs:456:16:456:33 | [...] | +| main.rs:456:20:456:20 | 2 | file://:0:0:0:0 | element | main.rs:456:16:456:33 | [...] | +| main.rs:456:23:456:32 | source(...) | file://:0:0:0:0 | element | main.rs:456:16:456:33 | [...] | +| main.rs:467:24:467:24 | 1 | file://:0:0:0:0 | element | main.rs:467:23:467:31 | [...] | +| main.rs:467:27:467:27 | 2 | file://:0:0:0:0 | element | main.rs:467:23:467:31 | [...] | +| main.rs:467:30:467:30 | 3 | file://:0:0:0:0 | element | main.rs:467:23:467:31 | [...] | +| main.rs:470:18:470:27 | source(...) | file://:0:0:0:0 | element | main.rs:470:5:470:11 | [post] mut_arr | +| main.rs:482:41:482:67 | default_name | main.rs:479:9:479:20 | captured default_name | main.rs:482:41:482:67 | \|...\| ... | +| main.rs:483:18:483:18 | n | file://:0:0:0:0 | &ref | main.rs:483:18:483:18 | receiver for n | +| main.rs:507:13:507:13 | b | file://:0:0:0:0 | &ref | main.rs:507:13:507:13 | receiver for b | +| main.rs:508:18:508:18 | b | file://:0:0:0:0 | &ref | main.rs:508:18:508:18 | receiver for b | +| main.rs:517:15:517:24 | source(...) | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] | +| main.rs:517:27:517:27 | 2 | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] | +| main.rs:517:30:517:30 | 3 | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] | +| main.rs:517:33:517:33 | 4 | file://:0:0:0:0 | element | main.rs:517:14:517:34 | [...] | +| main.rs:542:23:542:32 | source(...) | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | +| main.rs:542:35:542:35 | 2 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | +| main.rs:542:38:542:38 | 3 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | +| main.rs:542:41:542:41 | 4 | file://:0:0:0:0 | element | main.rs:542:22:542:42 | [...] | +| main.rs:557:18:557:18 | c | file://:0:0:0:0 | &ref | main.rs:557:17:557:18 | &c | +| main.rs:560:15:560:15 | b | file://:0:0:0:0 | &ref | main.rs:560:14:560:15 | &b | +| main.rs:583:27:583:27 | 0 | {EXTERNAL LOCATION} | Some | main.rs:583:22:583:28 | Some(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index 707a63342ba..eafe3a7452e 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -27,225 +27,229 @@ edges | main.rs:62:15:62:23 | source(...) | main.rs:61:9:61:9 | b | provenance | | | main.rs:70:5:70:5 | i | main.rs:71:10:71:10 | i | provenance | | | main.rs:70:9:70:17 | source(...) | main.rs:70:5:70:5 | i | provenance | | -| main.rs:103:9:103:9 | i [&ref] | main.rs:104:11:104:11 | i [&ref] | provenance | | -| main.rs:103:13:103:31 | ...::new(...) [&ref] | main.rs:103:9:103:9 | i [&ref] | provenance | | -| main.rs:103:22:103:30 | source(...) | main.rs:103:13:103:31 | ...::new(...) [&ref] | provenance | MaD:1 | -| main.rs:104:11:104:11 | i [&ref] | main.rs:104:10:104:11 | * ... | provenance | | -| main.rs:111:9:111:9 | a [tuple.0] | main.rs:112:10:112:10 | a [tuple.0] | provenance | | -| main.rs:111:13:111:26 | TupleExpr [tuple.0] | main.rs:111:9:111:9 | a [tuple.0] | provenance | | -| main.rs:111:14:111:22 | source(...) | main.rs:111:13:111:26 | TupleExpr [tuple.0] | provenance | | -| main.rs:112:10:112:10 | a [tuple.0] | main.rs:112:10:112:12 | a.0 | provenance | | -| main.rs:117:9:117:9 | a [tuple.1] | main.rs:118:9:118:20 | TuplePat [tuple.1] | provenance | | -| main.rs:117:13:117:30 | TupleExpr [tuple.1] | main.rs:117:9:117:9 | a [tuple.1] | provenance | | -| main.rs:117:17:117:26 | source(...) | main.rs:117:13:117:30 | TupleExpr [tuple.1] | provenance | | -| main.rs:118:9:118:20 | TuplePat [tuple.1] | main.rs:118:14:118:15 | a1 | provenance | | -| main.rs:118:14:118:15 | a1 | main.rs:120:10:120:11 | a1 | provenance | | -| main.rs:125:9:125:13 | mut a [tuple.1] | main.rs:127:10:127:10 | a [tuple.1] | provenance | | -| main.rs:125:17:125:31 | TupleExpr [tuple.1] | main.rs:125:9:125:13 | mut a [tuple.1] | provenance | | -| main.rs:125:21:125:30 | source(...) | main.rs:125:17:125:31 | TupleExpr [tuple.1] | provenance | | -| main.rs:127:10:127:10 | a [tuple.1] | main.rs:127:10:127:12 | a.1 | provenance | | -| main.rs:128:5:128:5 | [post] a [tuple.0] | main.rs:129:5:129:5 | a [tuple.0] | provenance | | -| main.rs:128:11:128:20 | source(...) | main.rs:128:5:128:5 | [post] a [tuple.0] | provenance | | -| main.rs:129:5:129:5 | a [tuple.0] | main.rs:130:10:130:10 | a [tuple.0] | provenance | | -| main.rs:130:10:130:10 | a [tuple.0] | main.rs:130:10:130:12 | a.0 | provenance | | -| main.rs:135:9:135:9 | a [tuple.1] | main.rs:136:14:136:14 | a [tuple.1] | provenance | | -| main.rs:135:13:135:27 | TupleExpr [tuple.1] | main.rs:135:9:135:9 | a [tuple.1] | provenance | | -| main.rs:135:17:135:26 | source(...) | main.rs:135:13:135:27 | TupleExpr [tuple.1] | provenance | | -| main.rs:136:9:136:9 | b [tuple.0, tuple.1] | main.rs:138:10:138:10 | b [tuple.0, tuple.1] | provenance | | -| main.rs:136:13:136:18 | TupleExpr [tuple.0, tuple.1] | main.rs:136:9:136:9 | b [tuple.0, tuple.1] | provenance | | -| main.rs:136:14:136:14 | a [tuple.1] | main.rs:136:13:136:18 | TupleExpr [tuple.0, tuple.1] | provenance | | -| main.rs:138:10:138:10 | b [tuple.0, tuple.1] | main.rs:138:10:138:12 | b.0 [tuple.1] | provenance | | -| main.rs:138:10:138:12 | b.0 [tuple.1] | main.rs:138:10:138:15 | ... .1 | provenance | | -| main.rs:151:9:151:9 | p [Point.x] | main.rs:152:10:152:10 | p [Point.x] | provenance | | -| main.rs:151:13:151:40 | Point {...} [Point.x] | main.rs:151:9:151:9 | p [Point.x] | provenance | | -| main.rs:151:24:151:32 | source(...) | main.rs:151:13:151:40 | Point {...} [Point.x] | provenance | | -| main.rs:152:10:152:10 | p [Point.x] | main.rs:152:10:152:12 | p.x | provenance | | -| main.rs:159:5:159:5 | [post] p [Point.y] | main.rs:160:10:160:10 | p [Point.y] | provenance | | -| main.rs:159:11:159:20 | source(...) | main.rs:159:5:159:5 | [post] p [Point.y] | provenance | | -| main.rs:160:10:160:10 | p [Point.y] | main.rs:160:10:160:12 | p.y | provenance | | -| main.rs:164:9:164:9 | p [Point.x] | main.rs:168:9:168:28 | Point {...} [Point.x] | provenance | | -| main.rs:164:13:167:5 | Point {...} [Point.x] | main.rs:164:9:164:9 | p [Point.x] | provenance | | -| main.rs:165:12:165:21 | source(...) | main.rs:164:13:167:5 | Point {...} [Point.x] | provenance | | -| main.rs:168:9:168:28 | Point {...} [Point.x] | main.rs:168:20:168:20 | a | provenance | | -| main.rs:168:20:168:20 | a | main.rs:169:10:169:10 | a | provenance | | -| main.rs:179:9:179:9 | p [Point3D.plane, Point.y] | main.rs:187:10:187:10 | p [Point3D.plane, Point.y] | provenance | | -| main.rs:179:13:185:5 | Point3D {...} [Point3D.plane, Point.y] | main.rs:179:9:179:9 | p [Point3D.plane, Point.y] | provenance | | -| main.rs:180:16:183:9 | Point {...} [Point.y] | main.rs:179:13:185:5 | Point3D {...} [Point3D.plane, Point.y] | provenance | | -| main.rs:182:16:182:25 | source(...) | main.rs:180:16:183:9 | Point {...} [Point.y] | provenance | | -| main.rs:187:10:187:10 | p [Point3D.plane, Point.y] | main.rs:187:10:187:16 | p.plane [Point.y] | provenance | | -| main.rs:187:10:187:16 | p.plane [Point.y] | main.rs:187:10:187:18 | ... .y | provenance | | -| main.rs:192:9:192:9 | y | main.rs:194:30:194:30 | y | provenance | | -| main.rs:192:13:192:22 | source(...) | main.rs:192:9:192:9 | y | provenance | | -| main.rs:193:9:193:9 | p [Point3D.plane, Point.y] | main.rs:197:11:197:11 | p [Point3D.plane, Point.y] | provenance | | -| main.rs:193:13:196:5 | Point3D {...} [Point3D.plane, Point.y] | main.rs:193:9:193:9 | p [Point3D.plane, Point.y] | provenance | | -| main.rs:194:16:194:32 | Point {...} [Point.y] | main.rs:193:13:196:5 | Point3D {...} [Point3D.plane, Point.y] | provenance | | -| main.rs:194:30:194:30 | y | main.rs:194:16:194:32 | Point {...} [Point.y] | provenance | | -| main.rs:197:11:197:11 | p [Point3D.plane, Point.y] | main.rs:198:9:201:9 | Point3D {...} [Point3D.plane, Point.y] | provenance | | -| main.rs:198:9:201:9 | Point3D {...} [Point3D.plane, Point.y] | main.rs:199:20:199:33 | Point {...} [Point.y] | provenance | | -| main.rs:199:20:199:33 | Point {...} [Point.y] | main.rs:199:31:199:31 | y | provenance | | -| main.rs:199:31:199:31 | y | main.rs:203:18:203:18 | y | provenance | | -| main.rs:212:9:212:9 | s [MyTupleStruct(0)] | main.rs:213:10:213:10 | s [MyTupleStruct(0)] | provenance | | -| main.rs:212:9:212:9 | s [MyTupleStruct(0)] | main.rs:216:11:216:11 | s [MyTupleStruct(0)] | provenance | | -| main.rs:212:13:212:40 | MyTupleStruct(...) [MyTupleStruct(0)] | main.rs:212:9:212:9 | s [MyTupleStruct(0)] | provenance | | -| main.rs:212:27:212:36 | source(...) | main.rs:212:13:212:40 | MyTupleStruct(...) [MyTupleStruct(0)] | provenance | | -| main.rs:213:10:213:10 | s [MyTupleStruct(0)] | main.rs:213:10:213:12 | s.0 | provenance | | -| main.rs:216:11:216:11 | s [MyTupleStruct(0)] | main.rs:217:9:217:27 | MyTupleStruct(...) [MyTupleStruct(0)] | provenance | | -| main.rs:217:9:217:27 | MyTupleStruct(...) [MyTupleStruct(0)] | main.rs:217:23:217:23 | x | provenance | | -| main.rs:217:23:217:23 | x | main.rs:218:18:218:18 | x | provenance | | -| main.rs:228:9:228:10 | s1 [Some] | main.rs:230:11:230:12 | s1 [Some] | provenance | | -| main.rs:228:14:228:37 | ...::Some(...) [Some] | main.rs:228:9:228:10 | s1 [Some] | provenance | | -| main.rs:228:27:228:36 | source(...) | main.rs:228:14:228:37 | ...::Some(...) [Some] | provenance | | -| main.rs:230:11:230:12 | s1 [Some] | main.rs:231:9:231:23 | ...::Some(...) [Some] | provenance | | -| main.rs:231:9:231:23 | ...::Some(...) [Some] | main.rs:231:22:231:22 | n | provenance | | -| main.rs:231:22:231:22 | n | main.rs:231:33:231:33 | n | provenance | | -| main.rs:241:9:241:10 | s1 [Some] | main.rs:243:11:243:12 | s1 [Some] | provenance | | -| main.rs:241:14:241:29 | Some(...) [Some] | main.rs:241:9:241:10 | s1 [Some] | provenance | | -| main.rs:241:19:241:28 | source(...) | main.rs:241:14:241:29 | Some(...) [Some] | provenance | | -| main.rs:243:11:243:12 | s1 [Some] | main.rs:244:9:244:15 | Some(...) [Some] | provenance | | -| main.rs:244:9:244:15 | Some(...) [Some] | main.rs:244:14:244:14 | n | provenance | | -| main.rs:244:14:244:14 | n | main.rs:244:25:244:25 | n | provenance | | -| main.rs:254:9:254:10 | s1 [Some] | main.rs:255:12:255:18 | Some(...) [Some] | provenance | | -| main.rs:254:14:254:29 | Some(...) [Some] | main.rs:254:9:254:10 | s1 [Some] | provenance | | -| main.rs:254:19:254:28 | source(...) | main.rs:254:14:254:29 | Some(...) [Some] | provenance | | -| main.rs:255:12:255:18 | Some(...) [Some] | main.rs:255:17:255:17 | n | provenance | | -| main.rs:255:17:255:17 | n | main.rs:257:18:257:18 | n | provenance | | -| main.rs:255:17:255:17 | n | main.rs:261:14:261:14 | n | provenance | | -| main.rs:266:9:266:10 | s1 [Some] | main.rs:267:10:267:20 | s1.unwrap() | provenance | MaD:2 | +| main.rs:76:9:76:9 | k | main.rs:77:5:77:5 | j | provenance | | +| main.rs:76:9:76:9 | k | main.rs:79:10:79:10 | k | provenance | | +| main.rs:76:13:76:21 | source(...) | main.rs:76:9:76:9 | k | provenance | | +| main.rs:77:5:77:5 | j | main.rs:78:10:78:10 | j | provenance | | +| main.rs:115:9:115:9 | i [&ref] | main.rs:116:11:116:11 | i [&ref] | provenance | | +| main.rs:115:13:115:31 | ...::new(...) [&ref] | main.rs:115:9:115:9 | i [&ref] | provenance | | +| main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [&ref] | provenance | MaD:1 | +| main.rs:116:11:116:11 | i [&ref] | main.rs:116:10:116:11 | * ... | provenance | | +| main.rs:123:9:123:9 | a [tuple.0] | main.rs:124:10:124:10 | a [tuple.0] | provenance | | +| main.rs:123:13:123:26 | TupleExpr [tuple.0] | main.rs:123:9:123:9 | a [tuple.0] | provenance | | +| main.rs:123:14:123:22 | source(...) | main.rs:123:13:123:26 | TupleExpr [tuple.0] | provenance | | +| main.rs:124:10:124:10 | a [tuple.0] | main.rs:124:10:124:12 | a.0 | provenance | | +| main.rs:129:9:129:9 | a [tuple.1] | main.rs:130:9:130:20 | TuplePat [tuple.1] | provenance | | +| main.rs:129:13:129:30 | TupleExpr [tuple.1] | main.rs:129:9:129:9 | a [tuple.1] | provenance | | +| main.rs:129:17:129:26 | source(...) | main.rs:129:13:129:30 | TupleExpr [tuple.1] | provenance | | +| main.rs:130:9:130:20 | TuplePat [tuple.1] | main.rs:130:14:130:15 | a1 | provenance | | +| main.rs:130:14:130:15 | a1 | main.rs:132:10:132:11 | a1 | provenance | | +| main.rs:137:9:137:13 | mut a [tuple.1] | main.rs:139:10:139:10 | a [tuple.1] | provenance | | +| main.rs:137:17:137:31 | TupleExpr [tuple.1] | main.rs:137:9:137:13 | mut a [tuple.1] | provenance | | +| main.rs:137:21:137:30 | source(...) | main.rs:137:17:137:31 | TupleExpr [tuple.1] | provenance | | +| main.rs:139:10:139:10 | a [tuple.1] | main.rs:139:10:139:12 | a.1 | provenance | | +| main.rs:140:5:140:5 | [post] a [tuple.0] | main.rs:141:5:141:5 | a [tuple.0] | provenance | | +| main.rs:140:11:140:20 | source(...) | main.rs:140:5:140:5 | [post] a [tuple.0] | provenance | | +| main.rs:141:5:141:5 | a [tuple.0] | main.rs:142:10:142:10 | a [tuple.0] | provenance | | +| main.rs:142:10:142:10 | a [tuple.0] | main.rs:142:10:142:12 | a.0 | provenance | | +| main.rs:147:9:147:9 | a [tuple.1] | main.rs:148:14:148:14 | a [tuple.1] | provenance | | +| main.rs:147:13:147:27 | TupleExpr [tuple.1] | main.rs:147:9:147:9 | a [tuple.1] | provenance | | +| main.rs:147:17:147:26 | source(...) | main.rs:147:13:147:27 | TupleExpr [tuple.1] | provenance | | +| main.rs:148:9:148:9 | b [tuple.0, tuple.1] | main.rs:150:10:150:10 | b [tuple.0, tuple.1] | provenance | | +| main.rs:148:13:148:18 | TupleExpr [tuple.0, tuple.1] | main.rs:148:9:148:9 | b [tuple.0, tuple.1] | provenance | | +| main.rs:148:14:148:14 | a [tuple.1] | main.rs:148:13:148:18 | TupleExpr [tuple.0, tuple.1] | provenance | | +| main.rs:150:10:150:10 | b [tuple.0, tuple.1] | main.rs:150:10:150:12 | b.0 [tuple.1] | provenance | | +| main.rs:150:10:150:12 | b.0 [tuple.1] | main.rs:150:10:150:15 | ... .1 | provenance | | +| main.rs:163:9:163:9 | p [Point.x] | main.rs:164:10:164:10 | p [Point.x] | provenance | | +| main.rs:163:13:163:40 | Point {...} [Point.x] | main.rs:163:9:163:9 | p [Point.x] | provenance | | +| main.rs:163:24:163:32 | source(...) | main.rs:163:13:163:40 | Point {...} [Point.x] | provenance | | +| main.rs:164:10:164:10 | p [Point.x] | main.rs:164:10:164:12 | p.x | provenance | | +| main.rs:171:5:171:5 | [post] p [Point.y] | main.rs:172:10:172:10 | p [Point.y] | provenance | | +| main.rs:171:11:171:20 | source(...) | main.rs:171:5:171:5 | [post] p [Point.y] | provenance | | +| main.rs:172:10:172:10 | p [Point.y] | main.rs:172:10:172:12 | p.y | provenance | | +| main.rs:176:9:176:9 | p [Point.x] | main.rs:180:9:180:28 | Point {...} [Point.x] | provenance | | +| main.rs:176:13:179:5 | Point {...} [Point.x] | main.rs:176:9:176:9 | p [Point.x] | provenance | | +| main.rs:177:12:177:21 | source(...) | main.rs:176:13:179:5 | Point {...} [Point.x] | provenance | | +| main.rs:180:9:180:28 | Point {...} [Point.x] | main.rs:180:20:180:20 | a | provenance | | +| main.rs:180:20:180:20 | a | main.rs:181:10:181:10 | a | provenance | | +| main.rs:191:9:191:9 | p [Point3D.plane, Point.y] | main.rs:199:10:199:10 | p [Point3D.plane, Point.y] | provenance | | +| main.rs:191:13:197:5 | Point3D {...} [Point3D.plane, Point.y] | main.rs:191:9:191:9 | p [Point3D.plane, Point.y] | provenance | | +| main.rs:192:16:195:9 | Point {...} [Point.y] | main.rs:191:13:197:5 | Point3D {...} [Point3D.plane, Point.y] | provenance | | +| main.rs:194:16:194:25 | source(...) | main.rs:192:16:195:9 | Point {...} [Point.y] | provenance | | +| main.rs:199:10:199:10 | p [Point3D.plane, Point.y] | main.rs:199:10:199:16 | p.plane [Point.y] | provenance | | +| main.rs:199:10:199:16 | p.plane [Point.y] | main.rs:199:10:199:18 | ... .y | provenance | | +| main.rs:204:9:204:9 | y | main.rs:206:30:206:30 | y | provenance | | +| main.rs:204:13:204:22 | source(...) | main.rs:204:9:204:9 | y | provenance | | +| main.rs:205:9:205:9 | p [Point3D.plane, Point.y] | main.rs:209:11:209:11 | p [Point3D.plane, Point.y] | provenance | | +| main.rs:205:13:208:5 | Point3D {...} [Point3D.plane, Point.y] | main.rs:205:9:205:9 | p [Point3D.plane, Point.y] | provenance | | +| main.rs:206:16:206:32 | Point {...} [Point.y] | main.rs:205:13:208:5 | Point3D {...} [Point3D.plane, Point.y] | provenance | | +| main.rs:206:30:206:30 | y | main.rs:206:16:206:32 | Point {...} [Point.y] | provenance | | +| main.rs:209:11:209:11 | p [Point3D.plane, Point.y] | main.rs:210:9:213:9 | Point3D {...} [Point3D.plane, Point.y] | provenance | | +| main.rs:210:9:213:9 | Point3D {...} [Point3D.plane, Point.y] | main.rs:211:20:211:33 | Point {...} [Point.y] | provenance | | +| main.rs:211:20:211:33 | Point {...} [Point.y] | main.rs:211:31:211:31 | y | provenance | | +| main.rs:211:31:211:31 | y | main.rs:215:18:215:18 | y | provenance | | +| main.rs:224:9:224:9 | s [MyTupleStruct(0)] | main.rs:225:10:225:10 | s [MyTupleStruct(0)] | provenance | | +| main.rs:224:9:224:9 | s [MyTupleStruct(0)] | main.rs:228:11:228:11 | s [MyTupleStruct(0)] | provenance | | +| main.rs:224:13:224:40 | MyTupleStruct(...) [MyTupleStruct(0)] | main.rs:224:9:224:9 | s [MyTupleStruct(0)] | provenance | | +| main.rs:224:27:224:36 | source(...) | main.rs:224:13:224:40 | MyTupleStruct(...) [MyTupleStruct(0)] | provenance | | +| main.rs:225:10:225:10 | s [MyTupleStruct(0)] | main.rs:225:10:225:12 | s.0 | provenance | | +| main.rs:228:11:228:11 | s [MyTupleStruct(0)] | main.rs:229:9:229:27 | MyTupleStruct(...) [MyTupleStruct(0)] | provenance | | +| main.rs:229:9:229:27 | MyTupleStruct(...) [MyTupleStruct(0)] | main.rs:229:23:229:23 | x | provenance | | +| main.rs:229:23:229:23 | x | main.rs:230:18:230:18 | x | provenance | | +| main.rs:240:9:240:10 | s1 [Some] | main.rs:242:11:242:12 | s1 [Some] | provenance | | +| main.rs:240:14:240:37 | ...::Some(...) [Some] | main.rs:240:9:240:10 | s1 [Some] | provenance | | +| main.rs:240:27:240:36 | source(...) | main.rs:240:14:240:37 | ...::Some(...) [Some] | provenance | | +| main.rs:242:11:242:12 | s1 [Some] | main.rs:243:9:243:23 | ...::Some(...) [Some] | provenance | | +| main.rs:243:9:243:23 | ...::Some(...) [Some] | main.rs:243:22:243:22 | n | provenance | | +| main.rs:243:22:243:22 | n | main.rs:243:33:243:33 | n | provenance | | +| main.rs:253:9:253:10 | s1 [Some] | main.rs:255:11:255:12 | s1 [Some] | provenance | | +| main.rs:253:14:253:29 | Some(...) [Some] | main.rs:253:9:253:10 | s1 [Some] | provenance | | +| main.rs:253:19:253:28 | source(...) | main.rs:253:14:253:29 | Some(...) [Some] | provenance | | +| main.rs:255:11:255:12 | s1 [Some] | main.rs:256:9:256:15 | Some(...) [Some] | provenance | | +| main.rs:256:9:256:15 | Some(...) [Some] | main.rs:256:14:256:14 | n | provenance | | +| main.rs:256:14:256:14 | n | main.rs:256:25:256:25 | n | provenance | | +| main.rs:266:9:266:10 | s1 [Some] | main.rs:267:12:267:18 | Some(...) [Some] | provenance | | | main.rs:266:14:266:29 | Some(...) [Some] | main.rs:266:9:266:10 | s1 [Some] | provenance | | | main.rs:266:19:266:28 | source(...) | main.rs:266:14:266:29 | Some(...) [Some] | provenance | | -| main.rs:271:9:271:10 | s1 [Some] | main.rs:272:10:272:24 | s1.unwrap_or(...) | provenance | MaD:4 | -| main.rs:271:14:271:29 | Some(...) [Some] | main.rs:271:9:271:10 | s1 [Some] | provenance | | -| main.rs:271:19:271:28 | source(...) | main.rs:271:14:271:29 | Some(...) [Some] | provenance | | -| main.rs:275:23:275:32 | source(...) | main.rs:275:10:275:33 | s2.unwrap_or(...) | provenance | MaD:3 | -| main.rs:279:9:279:10 | s1 [Some] | main.rs:280:10:280:32 | s1.unwrap_or_else(...) | provenance | MaD:6 | -| main.rs:279:14:279:29 | Some(...) [Some] | main.rs:279:9:279:10 | s1 [Some] | provenance | | -| main.rs:279:19:279:28 | source(...) | main.rs:279:14:279:29 | Some(...) [Some] | provenance | | -| main.rs:283:31:283:40 | source(...) | main.rs:283:10:283:41 | s2.unwrap_or_else(...) | provenance | MaD:5 | -| main.rs:287:9:287:10 | s1 [Some] | main.rs:289:14:289:15 | s1 [Some] | provenance | | -| main.rs:287:14:287:29 | Some(...) [Some] | main.rs:287:9:287:10 | s1 [Some] | provenance | | -| main.rs:287:19:287:28 | source(...) | main.rs:287:14:287:29 | Some(...) [Some] | provenance | | -| main.rs:289:9:289:10 | i1 | main.rs:290:10:290:11 | i1 | provenance | | -| main.rs:289:14:289:15 | s1 [Some] | main.rs:289:14:289:16 | TryExpr | provenance | | -| main.rs:289:14:289:16 | TryExpr | main.rs:289:9:289:10 | i1 | provenance | | -| main.rs:296:9:296:10 | r1 [Ok] | main.rs:297:28:297:34 | r1.ok() [Some] | provenance | MaD:10 | -| main.rs:296:32:296:45 | Ok(...) [Ok] | main.rs:296:9:296:10 | r1 [Ok] | provenance | | -| main.rs:296:35:296:44 | source(...) | main.rs:296:32:296:45 | Ok(...) [Ok] | provenance | | -| main.rs:297:9:297:11 | o1a [Some] | main.rs:299:10:299:21 | o1a.unwrap() | provenance | MaD:2 | -| main.rs:297:28:297:34 | r1.ok() [Some] | main.rs:297:9:297:11 | o1a [Some] | provenance | | -| main.rs:302:9:302:10 | r2 [Err] | main.rs:304:28:304:35 | r2.err() [Some] | provenance | MaD:7 | -| main.rs:302:32:302:46 | Err(...) [Err] | main.rs:302:9:302:10 | r2 [Err] | provenance | | -| main.rs:302:36:302:45 | source(...) | main.rs:302:32:302:46 | Err(...) [Err] | provenance | | -| main.rs:304:9:304:11 | o2b [Some] | main.rs:306:10:306:21 | o2b.unwrap() | provenance | MaD:2 | -| main.rs:304:28:304:35 | r2.err() [Some] | main.rs:304:9:304:11 | o2b [Some] | provenance | | -| main.rs:310:9:310:10 | s1 [Ok] | main.rs:313:14:313:15 | s1 [Ok] | provenance | | -| main.rs:310:32:310:45 | Ok(...) [Ok] | main.rs:310:9:310:10 | s1 [Ok] | provenance | | -| main.rs:310:35:310:44 | source(...) | main.rs:310:32:310:45 | Ok(...) [Ok] | provenance | | -| main.rs:313:9:313:10 | i1 | main.rs:315:10:315:11 | i1 | provenance | | -| main.rs:313:14:313:15 | s1 [Ok] | main.rs:313:14:313:16 | TryExpr | provenance | | -| main.rs:313:14:313:16 | TryExpr | main.rs:313:9:313:10 | i1 | provenance | | -| main.rs:323:9:323:10 | s1 [Ok] | main.rs:324:10:324:22 | s1.expect(...) | provenance | MaD:8 | -| main.rs:323:32:323:45 | Ok(...) [Ok] | main.rs:323:9:323:10 | s1 [Ok] | provenance | | -| main.rs:323:35:323:44 | source(...) | main.rs:323:32:323:45 | Ok(...) [Ok] | provenance | | -| main.rs:327:9:327:10 | s2 [Err] | main.rs:329:10:329:26 | s2.expect_err(...) | provenance | MaD:9 | -| main.rs:327:32:327:46 | Err(...) [Err] | main.rs:327:9:327:10 | s2 [Err] | provenance | | -| main.rs:327:36:327:45 | source(...) | main.rs:327:32:327:46 | Err(...) [Err] | provenance | | -| main.rs:338:9:338:10 | s1 [A] | main.rs:340:11:340:12 | s1 [A] | provenance | | -| main.rs:338:14:338:39 | ...::A(...) [A] | main.rs:338:9:338:10 | s1 [A] | provenance | | -| main.rs:338:29:338:38 | source(...) | main.rs:338:14:338:39 | ...::A(...) [A] | provenance | | -| main.rs:340:11:340:12 | s1 [A] | main.rs:341:9:341:25 | ...::A(...) [A] | provenance | | -| main.rs:340:11:340:12 | s1 [A] | main.rs:344:11:344:12 | s1 [A] | provenance | | -| main.rs:341:9:341:25 | ...::A(...) [A] | main.rs:341:24:341:24 | n | provenance | | -| main.rs:341:24:341:24 | n | main.rs:341:35:341:35 | n | provenance | | -| main.rs:344:11:344:12 | s1 [A] | main.rs:345:9:345:25 | ...::A(...) [A] | provenance | | -| main.rs:345:9:345:25 | ...::A(...) [A] | main.rs:345:24:345:24 | n | provenance | | -| main.rs:345:24:345:24 | n | main.rs:345:55:345:55 | n | provenance | | -| main.rs:356:9:356:10 | s1 [A] | main.rs:358:11:358:12 | s1 [A] | provenance | | -| main.rs:356:14:356:26 | A(...) [A] | main.rs:356:9:356:10 | s1 [A] | provenance | | -| main.rs:356:16:356:25 | source(...) | main.rs:356:14:356:26 | A(...) [A] | provenance | | -| main.rs:358:11:358:12 | s1 [A] | main.rs:359:9:359:12 | A(...) [A] | provenance | | -| main.rs:358:11:358:12 | s1 [A] | main.rs:362:11:362:12 | s1 [A] | provenance | | -| main.rs:359:9:359:12 | A(...) [A] | main.rs:359:11:359:11 | n | provenance | | -| main.rs:359:11:359:11 | n | main.rs:359:22:359:22 | n | provenance | | -| main.rs:362:11:362:12 | s1 [A] | main.rs:363:9:363:12 | A(...) [A] | provenance | | -| main.rs:363:9:363:12 | A(...) [A] | main.rs:363:11:363:11 | n | provenance | | -| main.rs:363:11:363:11 | n | main.rs:363:29:363:29 | n | provenance | | -| main.rs:377:9:377:10 | s1 [C] | main.rs:381:11:381:12 | s1 [C] | provenance | | -| main.rs:377:14:379:5 | ...::C {...} [C] | main.rs:377:9:377:10 | s1 [C] | provenance | | -| main.rs:378:18:378:27 | source(...) | main.rs:377:14:379:5 | ...::C {...} [C] | provenance | | -| main.rs:381:11:381:12 | s1 [C] | main.rs:382:9:382:38 | ...::C {...} [C] | provenance | | -| main.rs:381:11:381:12 | s1 [C] | main.rs:385:11:385:12 | s1 [C] | provenance | | -| main.rs:382:9:382:38 | ...::C {...} [C] | main.rs:382:36:382:36 | n | provenance | | -| main.rs:382:36:382:36 | n | main.rs:382:48:382:48 | n | provenance | | -| main.rs:385:11:385:12 | s1 [C] | main.rs:386:9:386:38 | ...::C {...} [C] | provenance | | -| main.rs:386:9:386:38 | ...::C {...} [C] | main.rs:386:36:386:36 | n | provenance | | -| main.rs:386:36:386:36 | n | main.rs:386:81:386:81 | n | provenance | | -| main.rs:397:9:397:10 | s1 [C] | main.rs:401:11:401:12 | s1 [C] | provenance | | -| main.rs:397:14:399:5 | C {...} [C] | main.rs:397:9:397:10 | s1 [C] | provenance | | -| main.rs:398:18:398:27 | source(...) | main.rs:397:14:399:5 | C {...} [C] | provenance | | -| main.rs:401:11:401:12 | s1 [C] | main.rs:402:9:402:24 | C {...} [C] | provenance | | -| main.rs:401:11:401:12 | s1 [C] | main.rs:405:11:405:12 | s1 [C] | provenance | | -| main.rs:402:9:402:24 | C {...} [C] | main.rs:402:22:402:22 | n | provenance | | -| main.rs:402:22:402:22 | n | main.rs:402:34:402:34 | n | provenance | | -| main.rs:405:11:405:12 | s1 [C] | main.rs:406:9:406:24 | C {...} [C] | provenance | | -| main.rs:406:9:406:24 | C {...} [C] | main.rs:406:22:406:22 | n | provenance | | -| main.rs:406:22:406:22 | n | main.rs:406:53:406:53 | n | provenance | | -| main.rs:418:9:418:12 | arr1 [element] | main.rs:419:14:419:17 | arr1 [element] | provenance | | -| main.rs:418:16:418:33 | [...] [element] | main.rs:418:9:418:12 | arr1 [element] | provenance | | -| main.rs:418:23:418:32 | source(...) | main.rs:418:16:418:33 | [...] [element] | provenance | | -| main.rs:419:9:419:10 | n1 | main.rs:420:10:420:11 | n1 | provenance | | -| main.rs:419:14:419:17 | arr1 [element] | main.rs:419:14:419:20 | arr1[2] | provenance | | -| main.rs:419:14:419:20 | arr1[2] | main.rs:419:9:419:10 | n1 | provenance | | -| main.rs:422:9:422:12 | arr2 [element] | main.rs:423:14:423:17 | arr2 [element] | provenance | | -| main.rs:422:16:422:31 | [...; 10] [element] | main.rs:422:9:422:12 | arr2 [element] | provenance | | -| main.rs:422:17:422:26 | source(...) | main.rs:422:16:422:31 | [...; 10] [element] | provenance | | -| main.rs:423:9:423:10 | n2 | main.rs:424:10:424:11 | n2 | provenance | | -| main.rs:423:14:423:17 | arr2 [element] | main.rs:423:14:423:20 | arr2[4] | provenance | | -| main.rs:423:14:423:20 | arr2[4] | main.rs:423:9:423:10 | n2 | provenance | | -| main.rs:432:9:432:12 | arr1 [element] | main.rs:433:15:433:18 | arr1 [element] | provenance | | -| main.rs:432:16:432:33 | [...] [element] | main.rs:432:9:432:12 | arr1 [element] | provenance | | -| main.rs:432:23:432:32 | source(...) | main.rs:432:16:432:33 | [...] [element] | provenance | | -| main.rs:433:9:433:10 | n1 | main.rs:434:14:434:15 | n1 | provenance | | -| main.rs:433:15:433:18 | arr1 [element] | main.rs:433:9:433:10 | n1 | provenance | | -| main.rs:444:9:444:12 | arr1 [element] | main.rs:445:11:445:14 | arr1 [element] | provenance | | +| main.rs:267:12:267:18 | Some(...) [Some] | main.rs:267:17:267:17 | n | provenance | | +| main.rs:267:17:267:17 | n | main.rs:269:18:269:18 | n | provenance | | +| main.rs:267:17:267:17 | n | main.rs:273:14:273:14 | n | provenance | | +| main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:2 | +| main.rs:278:14:278:29 | Some(...) [Some] | main.rs:278:9:278:10 | s1 [Some] | provenance | | +| main.rs:278:19:278:28 | source(...) | main.rs:278:14:278:29 | Some(...) [Some] | provenance | | +| main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:4 | +| main.rs:283:14:283:29 | Some(...) [Some] | main.rs:283:9:283:10 | s1 [Some] | provenance | | +| main.rs:283:19:283:28 | source(...) | main.rs:283:14:283:29 | Some(...) [Some] | provenance | | +| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:3 | +| main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:6 | +| main.rs:291:14:291:29 | Some(...) [Some] | main.rs:291:9:291:10 | s1 [Some] | provenance | | +| main.rs:291:19:291:28 | source(...) | main.rs:291:14:291:29 | Some(...) [Some] | provenance | | +| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:5 | +| main.rs:299:9:299:10 | s1 [Some] | main.rs:301:14:301:15 | s1 [Some] | provenance | | +| main.rs:299:14:299:29 | Some(...) [Some] | main.rs:299:9:299:10 | s1 [Some] | provenance | | +| main.rs:299:19:299:28 | source(...) | main.rs:299:14:299:29 | Some(...) [Some] | provenance | | +| main.rs:301:9:301:10 | i1 | main.rs:302:10:302:11 | i1 | provenance | | +| main.rs:301:14:301:15 | s1 [Some] | main.rs:301:14:301:16 | TryExpr | provenance | | +| main.rs:301:14:301:16 | TryExpr | main.rs:301:9:301:10 | i1 | provenance | | +| main.rs:308:9:308:10 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:10 | +| main.rs:308:32:308:45 | Ok(...) [Ok] | main.rs:308:9:308:10 | r1 [Ok] | provenance | | +| main.rs:308:35:308:44 | source(...) | main.rs:308:32:308:45 | Ok(...) [Ok] | provenance | | +| main.rs:309:9:309:11 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:2 | +| main.rs:309:28:309:34 | r1.ok() [Some] | main.rs:309:9:309:11 | o1a [Some] | provenance | | +| main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:7 | +| main.rs:314:32:314:46 | Err(...) [Err] | main.rs:314:9:314:10 | r2 [Err] | provenance | | +| main.rs:314:36:314:45 | source(...) | main.rs:314:32:314:46 | Err(...) [Err] | provenance | | +| main.rs:316:9:316:11 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:2 | +| main.rs:316:28:316:35 | r2.err() [Some] | main.rs:316:9:316:11 | o2b [Some] | provenance | | +| main.rs:322:9:322:10 | s1 [Ok] | main.rs:325:14:325:15 | s1 [Ok] | provenance | | +| main.rs:322:32:322:45 | Ok(...) [Ok] | main.rs:322:9:322:10 | s1 [Ok] | provenance | | +| main.rs:322:35:322:44 | source(...) | main.rs:322:32:322:45 | Ok(...) [Ok] | provenance | | +| main.rs:325:9:325:10 | i1 | main.rs:327:10:327:11 | i1 | provenance | | +| main.rs:325:14:325:15 | s1 [Ok] | main.rs:325:14:325:16 | TryExpr | provenance | | +| main.rs:325:14:325:16 | TryExpr | main.rs:325:9:325:10 | i1 | provenance | | +| main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:8 | +| main.rs:335:32:335:45 | Ok(...) [Ok] | main.rs:335:9:335:10 | s1 [Ok] | provenance | | +| main.rs:335:35:335:44 | source(...) | main.rs:335:32:335:45 | Ok(...) [Ok] | provenance | | +| main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:9 | +| main.rs:339:32:339:46 | Err(...) [Err] | main.rs:339:9:339:10 | s2 [Err] | provenance | | +| main.rs:339:36:339:45 | source(...) | main.rs:339:32:339:46 | Err(...) [Err] | provenance | | +| main.rs:350:9:350:10 | s1 [A] | main.rs:352:11:352:12 | s1 [A] | provenance | | +| main.rs:350:14:350:39 | ...::A(...) [A] | main.rs:350:9:350:10 | s1 [A] | provenance | | +| main.rs:350:29:350:38 | source(...) | main.rs:350:14:350:39 | ...::A(...) [A] | provenance | | +| main.rs:352:11:352:12 | s1 [A] | main.rs:353:9:353:25 | ...::A(...) [A] | provenance | | +| main.rs:352:11:352:12 | s1 [A] | main.rs:356:11:356:12 | s1 [A] | provenance | | +| main.rs:353:9:353:25 | ...::A(...) [A] | main.rs:353:24:353:24 | n | provenance | | +| main.rs:353:24:353:24 | n | main.rs:353:35:353:35 | n | provenance | | +| main.rs:356:11:356:12 | s1 [A] | main.rs:357:9:357:25 | ...::A(...) [A] | provenance | | +| main.rs:357:9:357:25 | ...::A(...) [A] | main.rs:357:24:357:24 | n | provenance | | +| main.rs:357:24:357:24 | n | main.rs:357:55:357:55 | n | provenance | | +| main.rs:368:9:368:10 | s1 [A] | main.rs:370:11:370:12 | s1 [A] | provenance | | +| main.rs:368:14:368:26 | A(...) [A] | main.rs:368:9:368:10 | s1 [A] | provenance | | +| main.rs:368:16:368:25 | source(...) | main.rs:368:14:368:26 | A(...) [A] | provenance | | +| main.rs:370:11:370:12 | s1 [A] | main.rs:371:9:371:12 | A(...) [A] | provenance | | +| main.rs:370:11:370:12 | s1 [A] | main.rs:374:11:374:12 | s1 [A] | provenance | | +| main.rs:371:9:371:12 | A(...) [A] | main.rs:371:11:371:11 | n | provenance | | +| main.rs:371:11:371:11 | n | main.rs:371:22:371:22 | n | provenance | | +| main.rs:374:11:374:12 | s1 [A] | main.rs:375:9:375:12 | A(...) [A] | provenance | | +| main.rs:375:9:375:12 | A(...) [A] | main.rs:375:11:375:11 | n | provenance | | +| main.rs:375:11:375:11 | n | main.rs:375:29:375:29 | n | provenance | | +| main.rs:389:9:389:10 | s1 [C] | main.rs:393:11:393:12 | s1 [C] | provenance | | +| main.rs:389:14:391:5 | ...::C {...} [C] | main.rs:389:9:389:10 | s1 [C] | provenance | | +| main.rs:390:18:390:27 | source(...) | main.rs:389:14:391:5 | ...::C {...} [C] | provenance | | +| main.rs:393:11:393:12 | s1 [C] | main.rs:394:9:394:38 | ...::C {...} [C] | provenance | | +| main.rs:393:11:393:12 | s1 [C] | main.rs:397:11:397:12 | s1 [C] | provenance | | +| main.rs:394:9:394:38 | ...::C {...} [C] | main.rs:394:36:394:36 | n | provenance | | +| main.rs:394:36:394:36 | n | main.rs:394:48:394:48 | n | provenance | | +| main.rs:397:11:397:12 | s1 [C] | main.rs:398:9:398:38 | ...::C {...} [C] | provenance | | +| main.rs:398:9:398:38 | ...::C {...} [C] | main.rs:398:36:398:36 | n | provenance | | +| main.rs:398:36:398:36 | n | main.rs:398:81:398:81 | n | provenance | | +| main.rs:409:9:409:10 | s1 [C] | main.rs:413:11:413:12 | s1 [C] | provenance | | +| main.rs:409:14:411:5 | C {...} [C] | main.rs:409:9:409:10 | s1 [C] | provenance | | +| main.rs:410:18:410:27 | source(...) | main.rs:409:14:411:5 | C {...} [C] | provenance | | +| main.rs:413:11:413:12 | s1 [C] | main.rs:414:9:414:24 | C {...} [C] | provenance | | +| main.rs:413:11:413:12 | s1 [C] | main.rs:417:11:417:12 | s1 [C] | provenance | | +| main.rs:414:9:414:24 | C {...} [C] | main.rs:414:22:414:22 | n | provenance | | +| main.rs:414:22:414:22 | n | main.rs:414:34:414:34 | n | provenance | | +| main.rs:417:11:417:12 | s1 [C] | main.rs:418:9:418:24 | C {...} [C] | provenance | | +| main.rs:418:9:418:24 | C {...} [C] | main.rs:418:22:418:22 | n | provenance | | +| main.rs:418:22:418:22 | n | main.rs:418:53:418:53 | n | provenance | | +| main.rs:430:9:430:12 | arr1 [element] | main.rs:431:14:431:17 | arr1 [element] | provenance | | +| main.rs:430:16:430:33 | [...] [element] | main.rs:430:9:430:12 | arr1 [element] | provenance | | +| main.rs:430:23:430:32 | source(...) | main.rs:430:16:430:33 | [...] [element] | provenance | | +| main.rs:431:9:431:10 | n1 | main.rs:432:10:432:11 | n1 | provenance | | +| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | | +| main.rs:431:14:431:20 | arr1[2] | main.rs:431:9:431:10 | n1 | provenance | | +| main.rs:434:9:434:12 | arr2 [element] | main.rs:435:14:435:17 | arr2 [element] | provenance | | +| main.rs:434:16:434:31 | [...; 10] [element] | main.rs:434:9:434:12 | arr2 [element] | provenance | | +| main.rs:434:17:434:26 | source(...) | main.rs:434:16:434:31 | [...; 10] [element] | provenance | | +| main.rs:435:9:435:10 | n2 | main.rs:436:10:436:11 | n2 | provenance | | +| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | | +| main.rs:435:14:435:20 | arr2[4] | main.rs:435:9:435:10 | n2 | provenance | | +| main.rs:444:9:444:12 | arr1 [element] | main.rs:445:15:445:18 | arr1 [element] | provenance | | | main.rs:444:16:444:33 | [...] [element] | main.rs:444:9:444:12 | arr1 [element] | provenance | | | main.rs:444:23:444:32 | source(...) | main.rs:444:16:444:33 | [...] [element] | provenance | | -| main.rs:445:11:445:14 | arr1 [element] | main.rs:446:9:446:17 | SlicePat [element] | provenance | | -| main.rs:446:9:446:17 | SlicePat [element] | main.rs:446:10:446:10 | a | provenance | | -| main.rs:446:9:446:17 | SlicePat [element] | main.rs:446:13:446:13 | b | provenance | | -| main.rs:446:9:446:17 | SlicePat [element] | main.rs:446:16:446:16 | c | provenance | | -| main.rs:446:10:446:10 | a | main.rs:447:18:447:18 | a | provenance | | -| main.rs:446:13:446:13 | b | main.rs:448:18:448:18 | b | provenance | | -| main.rs:446:16:446:16 | c | main.rs:449:18:449:18 | c | provenance | | -| main.rs:458:5:458:11 | [post] mut_arr [element] | main.rs:459:13:459:19 | mut_arr [element] | provenance | | -| main.rs:458:5:458:11 | [post] mut_arr [element] | main.rs:461:10:461:16 | mut_arr [element] | provenance | | -| main.rs:458:18:458:27 | source(...) | main.rs:458:5:458:11 | [post] mut_arr [element] | provenance | | -| main.rs:459:9:459:9 | d | main.rs:460:10:460:10 | d | provenance | | -| main.rs:459:13:459:19 | mut_arr [element] | main.rs:459:13:459:22 | mut_arr[1] | provenance | | -| main.rs:459:13:459:22 | mut_arr[1] | main.rs:459:9:459:9 | d | provenance | | -| main.rs:461:10:461:16 | mut_arr [element] | main.rs:461:10:461:19 | mut_arr[0] | provenance | | -| main.rs:484:9:484:9 | s | main.rs:485:10:485:10 | s | provenance | | -| main.rs:484:25:484:26 | source(...) | main.rs:484:9:484:9 | s | provenance | | -| main.rs:493:9:493:9 | a | main.rs:498:10:498:10 | a | provenance | | -| main.rs:493:13:493:22 | source(...) | main.rs:493:9:493:9 | a | provenance | | -| main.rs:505:9:505:10 | vs [element] | main.rs:507:10:507:11 | vs [element] | provenance | | -| main.rs:505:9:505:10 | vs [element] | main.rs:511:14:511:15 | vs [element] | provenance | | -| main.rs:505:14:505:34 | [...] [element] | main.rs:505:9:505:10 | vs [element] | provenance | | -| main.rs:505:15:505:24 | source(...) | main.rs:505:14:505:34 | [...] [element] | provenance | | -| main.rs:507:10:507:11 | vs [element] | main.rs:507:10:507:14 | vs[0] | provenance | | -| main.rs:511:9:511:9 | v | main.rs:512:14:512:14 | v | provenance | | -| main.rs:511:14:511:15 | vs [element] | main.rs:511:9:511:9 | v | provenance | | -| main.rs:530:9:530:18 | mut vs_mut [element] | main.rs:532:10:532:15 | vs_mut [element] | provenance | | -| main.rs:530:22:530:42 | [...] [element] | main.rs:530:9:530:18 | mut vs_mut [element] | provenance | | -| main.rs:530:23:530:32 | source(...) | main.rs:530:22:530:42 | [...] [element] | provenance | | -| main.rs:532:10:532:15 | vs_mut [element] | main.rs:532:10:532:18 | vs_mut[0] | provenance | | -| main.rs:542:9:542:9 | a | main.rs:547:10:547:10 | a | provenance | | -| main.rs:542:13:542:22 | source(...) | main.rs:542:9:542:9 | a | provenance | | -| main.rs:544:9:544:9 | c | main.rs:545:18:545:18 | c | provenance | | -| main.rs:544:13:544:22 | source(...) | main.rs:544:9:544:9 | c | provenance | | -| main.rs:545:9:545:13 | c_ref [&ref] | main.rs:550:11:550:15 | c_ref [&ref] | provenance | | -| main.rs:545:17:545:18 | &c [&ref] | main.rs:545:9:545:13 | c_ref [&ref] | provenance | | -| main.rs:545:18:545:18 | c | main.rs:545:17:545:18 | &c [&ref] | provenance | | -| main.rs:550:11:550:15 | c_ref [&ref] | main.rs:550:10:550:15 | * ... | provenance | | +| main.rs:445:9:445:10 | n1 | main.rs:446:14:446:15 | n1 | provenance | | +| main.rs:445:15:445:18 | arr1 [element] | main.rs:445:9:445:10 | n1 | provenance | | +| main.rs:456:9:456:12 | arr1 [element] | main.rs:457:11:457:14 | arr1 [element] | provenance | | +| main.rs:456:16:456:33 | [...] [element] | main.rs:456:9:456:12 | arr1 [element] | provenance | | +| main.rs:456:23:456:32 | source(...) | main.rs:456:16:456:33 | [...] [element] | provenance | | +| main.rs:457:11:457:14 | arr1 [element] | main.rs:458:9:458:17 | SlicePat [element] | provenance | | +| main.rs:458:9:458:17 | SlicePat [element] | main.rs:458:10:458:10 | a | provenance | | +| main.rs:458:9:458:17 | SlicePat [element] | main.rs:458:13:458:13 | b | provenance | | +| main.rs:458:9:458:17 | SlicePat [element] | main.rs:458:16:458:16 | c | provenance | | +| main.rs:458:10:458:10 | a | main.rs:459:18:459:18 | a | provenance | | +| main.rs:458:13:458:13 | b | main.rs:460:18:460:18 | b | provenance | | +| main.rs:458:16:458:16 | c | main.rs:461:18:461:18 | c | provenance | | +| main.rs:470:5:470:11 | [post] mut_arr [element] | main.rs:471:13:471:19 | mut_arr [element] | provenance | | +| main.rs:470:5:470:11 | [post] mut_arr [element] | main.rs:473:10:473:16 | mut_arr [element] | provenance | | +| main.rs:470:18:470:27 | source(...) | main.rs:470:5:470:11 | [post] mut_arr [element] | provenance | | +| main.rs:471:9:471:9 | d | main.rs:472:10:472:10 | d | provenance | | +| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | | +| main.rs:471:13:471:22 | mut_arr[1] | main.rs:471:9:471:9 | d | provenance | | +| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | | +| main.rs:496:9:496:9 | s | main.rs:497:10:497:10 | s | provenance | | +| main.rs:496:25:496:26 | source(...) | main.rs:496:9:496:9 | s | provenance | | +| main.rs:505:9:505:9 | a | main.rs:510:10:510:10 | a | provenance | | +| main.rs:505:13:505:22 | source(...) | main.rs:505:9:505:9 | a | provenance | | +| main.rs:517:9:517:10 | vs [element] | main.rs:519:10:519:11 | vs [element] | provenance | | +| main.rs:517:9:517:10 | vs [element] | main.rs:523:14:523:15 | vs [element] | provenance | | +| main.rs:517:14:517:34 | [...] [element] | main.rs:517:9:517:10 | vs [element] | provenance | | +| main.rs:517:15:517:24 | source(...) | main.rs:517:14:517:34 | [...] [element] | provenance | | +| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | | +| main.rs:523:9:523:9 | v | main.rs:524:14:524:14 | v | provenance | | +| main.rs:523:14:523:15 | vs [element] | main.rs:523:9:523:9 | v | provenance | | +| main.rs:542:9:542:18 | mut vs_mut [element] | main.rs:544:10:544:15 | vs_mut [element] | provenance | | +| main.rs:542:22:542:42 | [...] [element] | main.rs:542:9:542:18 | mut vs_mut [element] | provenance | | +| main.rs:542:23:542:32 | source(...) | main.rs:542:22:542:42 | [...] [element] | provenance | | +| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | | +| main.rs:554:9:554:9 | a | main.rs:559:10:559:10 | a | provenance | | +| main.rs:554:13:554:22 | source(...) | main.rs:554:9:554:9 | a | provenance | | +| main.rs:556:9:556:9 | c | main.rs:557:18:557:18 | c | provenance | | +| main.rs:556:13:556:22 | source(...) | main.rs:556:9:556:9 | c | provenance | | +| main.rs:557:9:557:13 | c_ref [&ref] | main.rs:562:11:562:15 | c_ref [&ref] | provenance | | +| main.rs:557:17:557:18 | &c [&ref] | main.rs:557:9:557:13 | c_ref [&ref] | provenance | | +| main.rs:557:18:557:18 | c | main.rs:557:17:557:18 | &c [&ref] | provenance | | +| main.rs:562:11:562:15 | c_ref [&ref] | main.rs:562:10:562:15 | * ... | provenance | | nodes | main.rs:19:10:19:18 | source(...) | semmle.label | source(...) | | main.rs:23:9:23:9 | s | semmle.label | s | @@ -270,266 +274,271 @@ nodes | main.rs:70:5:70:5 | i | semmle.label | i | | main.rs:70:9:70:17 | source(...) | semmle.label | source(...) | | main.rs:71:10:71:10 | i | semmle.label | i | -| main.rs:103:9:103:9 | i [&ref] | semmle.label | i [&ref] | -| main.rs:103:13:103:31 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | -| main.rs:103:22:103:30 | source(...) | semmle.label | source(...) | -| main.rs:104:10:104:11 | * ... | semmle.label | * ... | -| main.rs:104:11:104:11 | i [&ref] | semmle.label | i [&ref] | -| main.rs:111:9:111:9 | a [tuple.0] | semmle.label | a [tuple.0] | -| main.rs:111:13:111:26 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | -| main.rs:111:14:111:22 | source(...) | semmle.label | source(...) | -| main.rs:112:10:112:10 | a [tuple.0] | semmle.label | a [tuple.0] | -| main.rs:112:10:112:12 | a.0 | semmle.label | a.0 | -| main.rs:117:9:117:9 | a [tuple.1] | semmle.label | a [tuple.1] | -| main.rs:117:13:117:30 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] | -| main.rs:117:17:117:26 | source(...) | semmle.label | source(...) | -| main.rs:118:9:118:20 | TuplePat [tuple.1] | semmle.label | TuplePat [tuple.1] | -| main.rs:118:14:118:15 | a1 | semmle.label | a1 | -| main.rs:120:10:120:11 | a1 | semmle.label | a1 | -| main.rs:125:9:125:13 | mut a [tuple.1] | semmle.label | mut a [tuple.1] | -| main.rs:125:17:125:31 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] | -| main.rs:125:21:125:30 | source(...) | semmle.label | source(...) | -| main.rs:127:10:127:10 | a [tuple.1] | semmle.label | a [tuple.1] | -| main.rs:127:10:127:12 | a.1 | semmle.label | a.1 | -| main.rs:128:5:128:5 | [post] a [tuple.0] | semmle.label | [post] a [tuple.0] | -| main.rs:128:11:128:20 | source(...) | semmle.label | source(...) | -| main.rs:129:5:129:5 | a [tuple.0] | semmle.label | a [tuple.0] | -| main.rs:130:10:130:10 | a [tuple.0] | semmle.label | a [tuple.0] | -| main.rs:130:10:130:12 | a.0 | semmle.label | a.0 | -| main.rs:135:9:135:9 | a [tuple.1] | semmle.label | a [tuple.1] | -| main.rs:135:13:135:27 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] | -| main.rs:135:17:135:26 | source(...) | semmle.label | source(...) | -| main.rs:136:9:136:9 | b [tuple.0, tuple.1] | semmle.label | b [tuple.0, tuple.1] | -| main.rs:136:13:136:18 | TupleExpr [tuple.0, tuple.1] | semmle.label | TupleExpr [tuple.0, tuple.1] | -| main.rs:136:14:136:14 | a [tuple.1] | semmle.label | a [tuple.1] | -| main.rs:138:10:138:10 | b [tuple.0, tuple.1] | semmle.label | b [tuple.0, tuple.1] | -| main.rs:138:10:138:12 | b.0 [tuple.1] | semmle.label | b.0 [tuple.1] | -| main.rs:138:10:138:15 | ... .1 | semmle.label | ... .1 | -| main.rs:151:9:151:9 | p [Point.x] | semmle.label | p [Point.x] | -| main.rs:151:13:151:40 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] | -| main.rs:151:24:151:32 | source(...) | semmle.label | source(...) | -| main.rs:152:10:152:10 | p [Point.x] | semmle.label | p [Point.x] | -| main.rs:152:10:152:12 | p.x | semmle.label | p.x | -| main.rs:159:5:159:5 | [post] p [Point.y] | semmle.label | [post] p [Point.y] | -| main.rs:159:11:159:20 | source(...) | semmle.label | source(...) | -| main.rs:160:10:160:10 | p [Point.y] | semmle.label | p [Point.y] | -| main.rs:160:10:160:12 | p.y | semmle.label | p.y | -| main.rs:164:9:164:9 | p [Point.x] | semmle.label | p [Point.x] | -| main.rs:164:13:167:5 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] | -| main.rs:165:12:165:21 | source(...) | semmle.label | source(...) | -| main.rs:168:9:168:28 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] | -| main.rs:168:20:168:20 | a | semmle.label | a | -| main.rs:169:10:169:10 | a | semmle.label | a | -| main.rs:179:9:179:9 | p [Point3D.plane, Point.y] | semmle.label | p [Point3D.plane, Point.y] | -| main.rs:179:13:185:5 | Point3D {...} [Point3D.plane, Point.y] | semmle.label | Point3D {...} [Point3D.plane, Point.y] | -| main.rs:180:16:183:9 | Point {...} [Point.y] | semmle.label | Point {...} [Point.y] | -| main.rs:182:16:182:25 | source(...) | semmle.label | source(...) | -| main.rs:187:10:187:10 | p [Point3D.plane, Point.y] | semmle.label | p [Point3D.plane, Point.y] | -| main.rs:187:10:187:16 | p.plane [Point.y] | semmle.label | p.plane [Point.y] | -| main.rs:187:10:187:18 | ... .y | semmle.label | ... .y | -| main.rs:192:9:192:9 | y | semmle.label | y | -| main.rs:192:13:192:22 | source(...) | semmle.label | source(...) | -| main.rs:193:9:193:9 | p [Point3D.plane, Point.y] | semmle.label | p [Point3D.plane, Point.y] | -| main.rs:193:13:196:5 | Point3D {...} [Point3D.plane, Point.y] | semmle.label | Point3D {...} [Point3D.plane, Point.y] | -| main.rs:194:16:194:32 | Point {...} [Point.y] | semmle.label | Point {...} [Point.y] | -| main.rs:194:30:194:30 | y | semmle.label | y | -| main.rs:197:11:197:11 | p [Point3D.plane, Point.y] | semmle.label | p [Point3D.plane, Point.y] | -| main.rs:198:9:201:9 | Point3D {...} [Point3D.plane, Point.y] | semmle.label | Point3D {...} [Point3D.plane, Point.y] | -| main.rs:199:20:199:33 | Point {...} [Point.y] | semmle.label | Point {...} [Point.y] | -| main.rs:199:31:199:31 | y | semmle.label | y | -| main.rs:203:18:203:18 | y | semmle.label | y | -| main.rs:212:9:212:9 | s [MyTupleStruct(0)] | semmle.label | s [MyTupleStruct(0)] | -| main.rs:212:13:212:40 | MyTupleStruct(...) [MyTupleStruct(0)] | semmle.label | MyTupleStruct(...) [MyTupleStruct(0)] | -| main.rs:212:27:212:36 | source(...) | semmle.label | source(...) | -| main.rs:213:10:213:10 | s [MyTupleStruct(0)] | semmle.label | s [MyTupleStruct(0)] | -| main.rs:213:10:213:12 | s.0 | semmle.label | s.0 | -| main.rs:216:11:216:11 | s [MyTupleStruct(0)] | semmle.label | s [MyTupleStruct(0)] | -| main.rs:217:9:217:27 | MyTupleStruct(...) [MyTupleStruct(0)] | semmle.label | MyTupleStruct(...) [MyTupleStruct(0)] | -| main.rs:217:23:217:23 | x | semmle.label | x | -| main.rs:218:18:218:18 | x | semmle.label | x | -| main.rs:228:9:228:10 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:228:14:228:37 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| main.rs:228:27:228:36 | source(...) | semmle.label | source(...) | -| main.rs:230:11:230:12 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:231:9:231:23 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| main.rs:231:22:231:22 | n | semmle.label | n | -| main.rs:231:33:231:33 | n | semmle.label | n | -| main.rs:241:9:241:10 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:241:14:241:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:241:19:241:28 | source(...) | semmle.label | source(...) | -| main.rs:243:11:243:12 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:244:9:244:15 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:244:14:244:14 | n | semmle.label | n | -| main.rs:244:25:244:25 | n | semmle.label | n | -| main.rs:254:9:254:10 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:254:14:254:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:254:19:254:28 | source(...) | semmle.label | source(...) | -| main.rs:255:12:255:18 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:255:17:255:17 | n | semmle.label | n | -| main.rs:257:18:257:18 | n | semmle.label | n | -| main.rs:261:14:261:14 | n | semmle.label | n | +| main.rs:76:9:76:9 | k | semmle.label | k | +| main.rs:76:13:76:21 | source(...) | semmle.label | source(...) | +| main.rs:77:5:77:5 | j | semmle.label | j | +| main.rs:78:10:78:10 | j | semmle.label | j | +| main.rs:79:10:79:10 | k | semmle.label | k | +| main.rs:115:9:115:9 | i [&ref] | semmle.label | i [&ref] | +| main.rs:115:13:115:31 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| main.rs:115:22:115:30 | source(...) | semmle.label | source(...) | +| main.rs:116:10:116:11 | * ... | semmle.label | * ... | +| main.rs:116:11:116:11 | i [&ref] | semmle.label | i [&ref] | +| main.rs:123:9:123:9 | a [tuple.0] | semmle.label | a [tuple.0] | +| main.rs:123:13:123:26 | TupleExpr [tuple.0] | semmle.label | TupleExpr [tuple.0] | +| main.rs:123:14:123:22 | source(...) | semmle.label | source(...) | +| main.rs:124:10:124:10 | a [tuple.0] | semmle.label | a [tuple.0] | +| main.rs:124:10:124:12 | a.0 | semmle.label | a.0 | +| main.rs:129:9:129:9 | a [tuple.1] | semmle.label | a [tuple.1] | +| main.rs:129:13:129:30 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] | +| main.rs:129:17:129:26 | source(...) | semmle.label | source(...) | +| main.rs:130:9:130:20 | TuplePat [tuple.1] | semmle.label | TuplePat [tuple.1] | +| main.rs:130:14:130:15 | a1 | semmle.label | a1 | +| main.rs:132:10:132:11 | a1 | semmle.label | a1 | +| main.rs:137:9:137:13 | mut a [tuple.1] | semmle.label | mut a [tuple.1] | +| main.rs:137:17:137:31 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] | +| main.rs:137:21:137:30 | source(...) | semmle.label | source(...) | +| main.rs:139:10:139:10 | a [tuple.1] | semmle.label | a [tuple.1] | +| main.rs:139:10:139:12 | a.1 | semmle.label | a.1 | +| main.rs:140:5:140:5 | [post] a [tuple.0] | semmle.label | [post] a [tuple.0] | +| main.rs:140:11:140:20 | source(...) | semmle.label | source(...) | +| main.rs:141:5:141:5 | a [tuple.0] | semmle.label | a [tuple.0] | +| main.rs:142:10:142:10 | a [tuple.0] | semmle.label | a [tuple.0] | +| main.rs:142:10:142:12 | a.0 | semmle.label | a.0 | +| main.rs:147:9:147:9 | a [tuple.1] | semmle.label | a [tuple.1] | +| main.rs:147:13:147:27 | TupleExpr [tuple.1] | semmle.label | TupleExpr [tuple.1] | +| main.rs:147:17:147:26 | source(...) | semmle.label | source(...) | +| main.rs:148:9:148:9 | b [tuple.0, tuple.1] | semmle.label | b [tuple.0, tuple.1] | +| main.rs:148:13:148:18 | TupleExpr [tuple.0, tuple.1] | semmle.label | TupleExpr [tuple.0, tuple.1] | +| main.rs:148:14:148:14 | a [tuple.1] | semmle.label | a [tuple.1] | +| main.rs:150:10:150:10 | b [tuple.0, tuple.1] | semmle.label | b [tuple.0, tuple.1] | +| main.rs:150:10:150:12 | b.0 [tuple.1] | semmle.label | b.0 [tuple.1] | +| main.rs:150:10:150:15 | ... .1 | semmle.label | ... .1 | +| main.rs:163:9:163:9 | p [Point.x] | semmle.label | p [Point.x] | +| main.rs:163:13:163:40 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] | +| main.rs:163:24:163:32 | source(...) | semmle.label | source(...) | +| main.rs:164:10:164:10 | p [Point.x] | semmle.label | p [Point.x] | +| main.rs:164:10:164:12 | p.x | semmle.label | p.x | +| main.rs:171:5:171:5 | [post] p [Point.y] | semmle.label | [post] p [Point.y] | +| main.rs:171:11:171:20 | source(...) | semmle.label | source(...) | +| main.rs:172:10:172:10 | p [Point.y] | semmle.label | p [Point.y] | +| main.rs:172:10:172:12 | p.y | semmle.label | p.y | +| main.rs:176:9:176:9 | p [Point.x] | semmle.label | p [Point.x] | +| main.rs:176:13:179:5 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] | +| main.rs:177:12:177:21 | source(...) | semmle.label | source(...) | +| main.rs:180:9:180:28 | Point {...} [Point.x] | semmle.label | Point {...} [Point.x] | +| main.rs:180:20:180:20 | a | semmle.label | a | +| main.rs:181:10:181:10 | a | semmle.label | a | +| main.rs:191:9:191:9 | p [Point3D.plane, Point.y] | semmle.label | p [Point3D.plane, Point.y] | +| main.rs:191:13:197:5 | Point3D {...} [Point3D.plane, Point.y] | semmle.label | Point3D {...} [Point3D.plane, Point.y] | +| main.rs:192:16:195:9 | Point {...} [Point.y] | semmle.label | Point {...} [Point.y] | +| main.rs:194:16:194:25 | source(...) | semmle.label | source(...) | +| main.rs:199:10:199:10 | p [Point3D.plane, Point.y] | semmle.label | p [Point3D.plane, Point.y] | +| main.rs:199:10:199:16 | p.plane [Point.y] | semmle.label | p.plane [Point.y] | +| main.rs:199:10:199:18 | ... .y | semmle.label | ... .y | +| main.rs:204:9:204:9 | y | semmle.label | y | +| main.rs:204:13:204:22 | source(...) | semmle.label | source(...) | +| main.rs:205:9:205:9 | p [Point3D.plane, Point.y] | semmle.label | p [Point3D.plane, Point.y] | +| main.rs:205:13:208:5 | Point3D {...} [Point3D.plane, Point.y] | semmle.label | Point3D {...} [Point3D.plane, Point.y] | +| main.rs:206:16:206:32 | Point {...} [Point.y] | semmle.label | Point {...} [Point.y] | +| main.rs:206:30:206:30 | y | semmle.label | y | +| main.rs:209:11:209:11 | p [Point3D.plane, Point.y] | semmle.label | p [Point3D.plane, Point.y] | +| main.rs:210:9:213:9 | Point3D {...} [Point3D.plane, Point.y] | semmle.label | Point3D {...} [Point3D.plane, Point.y] | +| main.rs:211:20:211:33 | Point {...} [Point.y] | semmle.label | Point {...} [Point.y] | +| main.rs:211:31:211:31 | y | semmle.label | y | +| main.rs:215:18:215:18 | y | semmle.label | y | +| main.rs:224:9:224:9 | s [MyTupleStruct(0)] | semmle.label | s [MyTupleStruct(0)] | +| main.rs:224:13:224:40 | MyTupleStruct(...) [MyTupleStruct(0)] | semmle.label | MyTupleStruct(...) [MyTupleStruct(0)] | +| main.rs:224:27:224:36 | source(...) | semmle.label | source(...) | +| main.rs:225:10:225:10 | s [MyTupleStruct(0)] | semmle.label | s [MyTupleStruct(0)] | +| main.rs:225:10:225:12 | s.0 | semmle.label | s.0 | +| main.rs:228:11:228:11 | s [MyTupleStruct(0)] | semmle.label | s [MyTupleStruct(0)] | +| main.rs:229:9:229:27 | MyTupleStruct(...) [MyTupleStruct(0)] | semmle.label | MyTupleStruct(...) [MyTupleStruct(0)] | +| main.rs:229:23:229:23 | x | semmle.label | x | +| main.rs:230:18:230:18 | x | semmle.label | x | +| main.rs:240:9:240:10 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:240:14:240:37 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| main.rs:240:27:240:36 | source(...) | semmle.label | source(...) | +| main.rs:242:11:242:12 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:243:9:243:23 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| main.rs:243:22:243:22 | n | semmle.label | n | +| main.rs:243:33:243:33 | n | semmle.label | n | +| main.rs:253:9:253:10 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:253:14:253:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:253:19:253:28 | source(...) | semmle.label | source(...) | +| main.rs:255:11:255:12 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:256:9:256:15 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:256:14:256:14 | n | semmle.label | n | +| main.rs:256:25:256:25 | n | semmle.label | n | | main.rs:266:9:266:10 | s1 [Some] | semmle.label | s1 [Some] | | main.rs:266:14:266:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | | main.rs:266:19:266:28 | source(...) | semmle.label | source(...) | -| main.rs:267:10:267:20 | s1.unwrap() | semmle.label | s1.unwrap() | -| main.rs:271:9:271:10 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:271:14:271:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:271:19:271:28 | source(...) | semmle.label | source(...) | -| main.rs:272:10:272:24 | s1.unwrap_or(...) | semmle.label | s1.unwrap_or(...) | -| main.rs:275:10:275:33 | s2.unwrap_or(...) | semmle.label | s2.unwrap_or(...) | -| main.rs:275:23:275:32 | source(...) | semmle.label | source(...) | -| main.rs:279:9:279:10 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:279:14:279:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:279:19:279:28 | source(...) | semmle.label | source(...) | -| main.rs:280:10:280:32 | s1.unwrap_or_else(...) | semmle.label | s1.unwrap_or_else(...) | -| main.rs:283:10:283:41 | s2.unwrap_or_else(...) | semmle.label | s2.unwrap_or_else(...) | -| main.rs:283:31:283:40 | source(...) | semmle.label | source(...) | -| main.rs:287:9:287:10 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:287:14:287:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:287:19:287:28 | source(...) | semmle.label | source(...) | -| main.rs:289:9:289:10 | i1 | semmle.label | i1 | -| main.rs:289:14:289:15 | s1 [Some] | semmle.label | s1 [Some] | -| main.rs:289:14:289:16 | TryExpr | semmle.label | TryExpr | -| main.rs:290:10:290:11 | i1 | semmle.label | i1 | -| main.rs:296:9:296:10 | r1 [Ok] | semmle.label | r1 [Ok] | -| main.rs:296:32:296:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | -| main.rs:296:35:296:44 | source(...) | semmle.label | source(...) | -| main.rs:297:9:297:11 | o1a [Some] | semmle.label | o1a [Some] | -| main.rs:297:28:297:34 | r1.ok() [Some] | semmle.label | r1.ok() [Some] | -| main.rs:299:10:299:21 | o1a.unwrap() | semmle.label | o1a.unwrap() | -| main.rs:302:9:302:10 | r2 [Err] | semmle.label | r2 [Err] | -| main.rs:302:32:302:46 | Err(...) [Err] | semmle.label | Err(...) [Err] | -| main.rs:302:36:302:45 | source(...) | semmle.label | source(...) | -| main.rs:304:9:304:11 | o2b [Some] | semmle.label | o2b [Some] | -| main.rs:304:28:304:35 | r2.err() [Some] | semmle.label | r2.err() [Some] | -| main.rs:306:10:306:21 | o2b.unwrap() | semmle.label | o2b.unwrap() | -| main.rs:310:9:310:10 | s1 [Ok] | semmle.label | s1 [Ok] | -| main.rs:310:32:310:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | -| main.rs:310:35:310:44 | source(...) | semmle.label | source(...) | -| main.rs:313:9:313:10 | i1 | semmle.label | i1 | -| main.rs:313:14:313:15 | s1 [Ok] | semmle.label | s1 [Ok] | -| main.rs:313:14:313:16 | TryExpr | semmle.label | TryExpr | -| main.rs:315:10:315:11 | i1 | semmle.label | i1 | -| main.rs:323:9:323:10 | s1 [Ok] | semmle.label | s1 [Ok] | -| main.rs:323:32:323:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | -| main.rs:323:35:323:44 | source(...) | semmle.label | source(...) | -| main.rs:324:10:324:22 | s1.expect(...) | semmle.label | s1.expect(...) | -| main.rs:327:9:327:10 | s2 [Err] | semmle.label | s2 [Err] | -| main.rs:327:32:327:46 | Err(...) [Err] | semmle.label | Err(...) [Err] | -| main.rs:327:36:327:45 | source(...) | semmle.label | source(...) | -| main.rs:329:10:329:26 | s2.expect_err(...) | semmle.label | s2.expect_err(...) | -| main.rs:338:9:338:10 | s1 [A] | semmle.label | s1 [A] | -| main.rs:338:14:338:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | -| main.rs:338:29:338:38 | source(...) | semmle.label | source(...) | -| main.rs:340:11:340:12 | s1 [A] | semmle.label | s1 [A] | -| main.rs:341:9:341:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | -| main.rs:341:24:341:24 | n | semmle.label | n | -| main.rs:341:35:341:35 | n | semmle.label | n | -| main.rs:344:11:344:12 | s1 [A] | semmle.label | s1 [A] | -| main.rs:345:9:345:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | -| main.rs:345:24:345:24 | n | semmle.label | n | -| main.rs:345:55:345:55 | n | semmle.label | n | -| main.rs:356:9:356:10 | s1 [A] | semmle.label | s1 [A] | -| main.rs:356:14:356:26 | A(...) [A] | semmle.label | A(...) [A] | -| main.rs:356:16:356:25 | source(...) | semmle.label | source(...) | -| main.rs:358:11:358:12 | s1 [A] | semmle.label | s1 [A] | -| main.rs:359:9:359:12 | A(...) [A] | semmle.label | A(...) [A] | -| main.rs:359:11:359:11 | n | semmle.label | n | -| main.rs:359:22:359:22 | n | semmle.label | n | -| main.rs:362:11:362:12 | s1 [A] | semmle.label | s1 [A] | -| main.rs:363:9:363:12 | A(...) [A] | semmle.label | A(...) [A] | -| main.rs:363:11:363:11 | n | semmle.label | n | -| main.rs:363:29:363:29 | n | semmle.label | n | -| main.rs:377:9:377:10 | s1 [C] | semmle.label | s1 [C] | -| main.rs:377:14:379:5 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:378:18:378:27 | source(...) | semmle.label | source(...) | -| main.rs:381:11:381:12 | s1 [C] | semmle.label | s1 [C] | -| main.rs:382:9:382:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:382:36:382:36 | n | semmle.label | n | -| main.rs:382:48:382:48 | n | semmle.label | n | -| main.rs:385:11:385:12 | s1 [C] | semmle.label | s1 [C] | -| main.rs:386:9:386:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:386:36:386:36 | n | semmle.label | n | -| main.rs:386:81:386:81 | n | semmle.label | n | -| main.rs:397:9:397:10 | s1 [C] | semmle.label | s1 [C] | -| main.rs:397:14:399:5 | C {...} [C] | semmle.label | C {...} [C] | -| main.rs:398:18:398:27 | source(...) | semmle.label | source(...) | -| main.rs:401:11:401:12 | s1 [C] | semmle.label | s1 [C] | -| main.rs:402:9:402:24 | C {...} [C] | semmle.label | C {...} [C] | -| main.rs:402:22:402:22 | n | semmle.label | n | -| main.rs:402:34:402:34 | n | semmle.label | n | -| main.rs:405:11:405:12 | s1 [C] | semmle.label | s1 [C] | -| main.rs:406:9:406:24 | C {...} [C] | semmle.label | C {...} [C] | -| main.rs:406:22:406:22 | n | semmle.label | n | -| main.rs:406:53:406:53 | n | semmle.label | n | -| main.rs:418:9:418:12 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:418:16:418:33 | [...] [element] | semmle.label | [...] [element] | -| main.rs:418:23:418:32 | source(...) | semmle.label | source(...) | -| main.rs:419:9:419:10 | n1 | semmle.label | n1 | -| main.rs:419:14:419:17 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:419:14:419:20 | arr1[2] | semmle.label | arr1[2] | -| main.rs:420:10:420:11 | n1 | semmle.label | n1 | -| main.rs:422:9:422:12 | arr2 [element] | semmle.label | arr2 [element] | -| main.rs:422:16:422:31 | [...; 10] [element] | semmle.label | [...; 10] [element] | -| main.rs:422:17:422:26 | source(...) | semmle.label | source(...) | -| main.rs:423:9:423:10 | n2 | semmle.label | n2 | -| main.rs:423:14:423:17 | arr2 [element] | semmle.label | arr2 [element] | -| main.rs:423:14:423:20 | arr2[4] | semmle.label | arr2[4] | -| main.rs:424:10:424:11 | n2 | semmle.label | n2 | -| main.rs:432:9:432:12 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:432:16:432:33 | [...] [element] | semmle.label | [...] [element] | -| main.rs:432:23:432:32 | source(...) | semmle.label | source(...) | -| main.rs:433:9:433:10 | n1 | semmle.label | n1 | -| main.rs:433:15:433:18 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:434:14:434:15 | n1 | semmle.label | n1 | +| main.rs:267:12:267:18 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:267:17:267:17 | n | semmle.label | n | +| main.rs:269:18:269:18 | n | semmle.label | n | +| main.rs:273:14:273:14 | n | semmle.label | n | +| main.rs:278:9:278:10 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:278:14:278:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:278:19:278:28 | source(...) | semmle.label | source(...) | +| main.rs:279:10:279:20 | s1.unwrap() | semmle.label | s1.unwrap() | +| main.rs:283:9:283:10 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:283:14:283:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:283:19:283:28 | source(...) | semmle.label | source(...) | +| main.rs:284:10:284:24 | s1.unwrap_or(...) | semmle.label | s1.unwrap_or(...) | +| main.rs:287:10:287:33 | s2.unwrap_or(...) | semmle.label | s2.unwrap_or(...) | +| main.rs:287:23:287:32 | source(...) | semmle.label | source(...) | +| main.rs:291:9:291:10 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:291:14:291:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:291:19:291:28 | source(...) | semmle.label | source(...) | +| main.rs:292:10:292:32 | s1.unwrap_or_else(...) | semmle.label | s1.unwrap_or_else(...) | +| main.rs:295:10:295:41 | s2.unwrap_or_else(...) | semmle.label | s2.unwrap_or_else(...) | +| main.rs:295:31:295:40 | source(...) | semmle.label | source(...) | +| main.rs:299:9:299:10 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:299:14:299:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:299:19:299:28 | source(...) | semmle.label | source(...) | +| main.rs:301:9:301:10 | i1 | semmle.label | i1 | +| main.rs:301:14:301:15 | s1 [Some] | semmle.label | s1 [Some] | +| main.rs:301:14:301:16 | TryExpr | semmle.label | TryExpr | +| main.rs:302:10:302:11 | i1 | semmle.label | i1 | +| main.rs:308:9:308:10 | r1 [Ok] | semmle.label | r1 [Ok] | +| main.rs:308:32:308:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| main.rs:308:35:308:44 | source(...) | semmle.label | source(...) | +| main.rs:309:9:309:11 | o1a [Some] | semmle.label | o1a [Some] | +| main.rs:309:28:309:34 | r1.ok() [Some] | semmle.label | r1.ok() [Some] | +| main.rs:311:10:311:21 | o1a.unwrap() | semmle.label | o1a.unwrap() | +| main.rs:314:9:314:10 | r2 [Err] | semmle.label | r2 [Err] | +| main.rs:314:32:314:46 | Err(...) [Err] | semmle.label | Err(...) [Err] | +| main.rs:314:36:314:45 | source(...) | semmle.label | source(...) | +| main.rs:316:9:316:11 | o2b [Some] | semmle.label | o2b [Some] | +| main.rs:316:28:316:35 | r2.err() [Some] | semmle.label | r2.err() [Some] | +| main.rs:318:10:318:21 | o2b.unwrap() | semmle.label | o2b.unwrap() | +| main.rs:322:9:322:10 | s1 [Ok] | semmle.label | s1 [Ok] | +| main.rs:322:32:322:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| main.rs:322:35:322:44 | source(...) | semmle.label | source(...) | +| main.rs:325:9:325:10 | i1 | semmle.label | i1 | +| main.rs:325:14:325:15 | s1 [Ok] | semmle.label | s1 [Ok] | +| main.rs:325:14:325:16 | TryExpr | semmle.label | TryExpr | +| main.rs:327:10:327:11 | i1 | semmle.label | i1 | +| main.rs:335:9:335:10 | s1 [Ok] | semmle.label | s1 [Ok] | +| main.rs:335:32:335:45 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| main.rs:335:35:335:44 | source(...) | semmle.label | source(...) | +| main.rs:336:10:336:22 | s1.expect(...) | semmle.label | s1.expect(...) | +| main.rs:339:9:339:10 | s2 [Err] | semmle.label | s2 [Err] | +| main.rs:339:32:339:46 | Err(...) [Err] | semmle.label | Err(...) [Err] | +| main.rs:339:36:339:45 | source(...) | semmle.label | source(...) | +| main.rs:341:10:341:26 | s2.expect_err(...) | semmle.label | s2.expect_err(...) | +| main.rs:350:9:350:10 | s1 [A] | semmle.label | s1 [A] | +| main.rs:350:14:350:39 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | +| main.rs:350:29:350:38 | source(...) | semmle.label | source(...) | +| main.rs:352:11:352:12 | s1 [A] | semmle.label | s1 [A] | +| main.rs:353:9:353:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | +| main.rs:353:24:353:24 | n | semmle.label | n | +| main.rs:353:35:353:35 | n | semmle.label | n | +| main.rs:356:11:356:12 | s1 [A] | semmle.label | s1 [A] | +| main.rs:357:9:357:25 | ...::A(...) [A] | semmle.label | ...::A(...) [A] | +| main.rs:357:24:357:24 | n | semmle.label | n | +| main.rs:357:55:357:55 | n | semmle.label | n | +| main.rs:368:9:368:10 | s1 [A] | semmle.label | s1 [A] | +| main.rs:368:14:368:26 | A(...) [A] | semmle.label | A(...) [A] | +| main.rs:368:16:368:25 | source(...) | semmle.label | source(...) | +| main.rs:370:11:370:12 | s1 [A] | semmle.label | s1 [A] | +| main.rs:371:9:371:12 | A(...) [A] | semmle.label | A(...) [A] | +| main.rs:371:11:371:11 | n | semmle.label | n | +| main.rs:371:22:371:22 | n | semmle.label | n | +| main.rs:374:11:374:12 | s1 [A] | semmle.label | s1 [A] | +| main.rs:375:9:375:12 | A(...) [A] | semmle.label | A(...) [A] | +| main.rs:375:11:375:11 | n | semmle.label | n | +| main.rs:375:29:375:29 | n | semmle.label | n | +| main.rs:389:9:389:10 | s1 [C] | semmle.label | s1 [C] | +| main.rs:389:14:391:5 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:390:18:390:27 | source(...) | semmle.label | source(...) | +| main.rs:393:11:393:12 | s1 [C] | semmle.label | s1 [C] | +| main.rs:394:9:394:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:394:36:394:36 | n | semmle.label | n | +| main.rs:394:48:394:48 | n | semmle.label | n | +| main.rs:397:11:397:12 | s1 [C] | semmle.label | s1 [C] | +| main.rs:398:9:398:38 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:398:36:398:36 | n | semmle.label | n | +| main.rs:398:81:398:81 | n | semmle.label | n | +| main.rs:409:9:409:10 | s1 [C] | semmle.label | s1 [C] | +| main.rs:409:14:411:5 | C {...} [C] | semmle.label | C {...} [C] | +| main.rs:410:18:410:27 | source(...) | semmle.label | source(...) | +| main.rs:413:11:413:12 | s1 [C] | semmle.label | s1 [C] | +| main.rs:414:9:414:24 | C {...} [C] | semmle.label | C {...} [C] | +| main.rs:414:22:414:22 | n | semmle.label | n | +| main.rs:414:34:414:34 | n | semmle.label | n | +| main.rs:417:11:417:12 | s1 [C] | semmle.label | s1 [C] | +| main.rs:418:9:418:24 | C {...} [C] | semmle.label | C {...} [C] | +| main.rs:418:22:418:22 | n | semmle.label | n | +| main.rs:418:53:418:53 | n | semmle.label | n | +| main.rs:430:9:430:12 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:430:16:430:33 | [...] [element] | semmle.label | [...] [element] | +| main.rs:430:23:430:32 | source(...) | semmle.label | source(...) | +| main.rs:431:9:431:10 | n1 | semmle.label | n1 | +| main.rs:431:14:431:17 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:431:14:431:20 | arr1[2] | semmle.label | arr1[2] | +| main.rs:432:10:432:11 | n1 | semmle.label | n1 | +| main.rs:434:9:434:12 | arr2 [element] | semmle.label | arr2 [element] | +| main.rs:434:16:434:31 | [...; 10] [element] | semmle.label | [...; 10] [element] | +| main.rs:434:17:434:26 | source(...) | semmle.label | source(...) | +| main.rs:435:9:435:10 | n2 | semmle.label | n2 | +| main.rs:435:14:435:17 | arr2 [element] | semmle.label | arr2 [element] | +| main.rs:435:14:435:20 | arr2[4] | semmle.label | arr2[4] | +| main.rs:436:10:436:11 | n2 | semmle.label | n2 | | main.rs:444:9:444:12 | arr1 [element] | semmle.label | arr1 [element] | | main.rs:444:16:444:33 | [...] [element] | semmle.label | [...] [element] | | main.rs:444:23:444:32 | source(...) | semmle.label | source(...) | -| main.rs:445:11:445:14 | arr1 [element] | semmle.label | arr1 [element] | -| main.rs:446:9:446:17 | SlicePat [element] | semmle.label | SlicePat [element] | -| main.rs:446:10:446:10 | a | semmle.label | a | -| main.rs:446:13:446:13 | b | semmle.label | b | -| main.rs:446:16:446:16 | c | semmle.label | c | -| main.rs:447:18:447:18 | a | semmle.label | a | -| main.rs:448:18:448:18 | b | semmle.label | b | -| main.rs:449:18:449:18 | c | semmle.label | c | -| main.rs:458:5:458:11 | [post] mut_arr [element] | semmle.label | [post] mut_arr [element] | -| main.rs:458:18:458:27 | source(...) | semmle.label | source(...) | -| main.rs:459:9:459:9 | d | semmle.label | d | -| main.rs:459:13:459:19 | mut_arr [element] | semmle.label | mut_arr [element] | -| main.rs:459:13:459:22 | mut_arr[1] | semmle.label | mut_arr[1] | -| main.rs:460:10:460:10 | d | semmle.label | d | -| main.rs:461:10:461:16 | mut_arr [element] | semmle.label | mut_arr [element] | -| main.rs:461:10:461:19 | mut_arr[0] | semmle.label | mut_arr[0] | -| main.rs:484:9:484:9 | s | semmle.label | s | -| main.rs:484:25:484:26 | source(...) | semmle.label | source(...) | -| main.rs:485:10:485:10 | s | semmle.label | s | -| main.rs:493:9:493:9 | a | semmle.label | a | -| main.rs:493:13:493:22 | source(...) | semmle.label | source(...) | -| main.rs:498:10:498:10 | a | semmle.label | a | -| main.rs:505:9:505:10 | vs [element] | semmle.label | vs [element] | -| main.rs:505:14:505:34 | [...] [element] | semmle.label | [...] [element] | -| main.rs:505:15:505:24 | source(...) | semmle.label | source(...) | -| main.rs:507:10:507:11 | vs [element] | semmle.label | vs [element] | -| main.rs:507:10:507:14 | vs[0] | semmle.label | vs[0] | -| main.rs:511:9:511:9 | v | semmle.label | v | -| main.rs:511:14:511:15 | vs [element] | semmle.label | vs [element] | -| main.rs:512:14:512:14 | v | semmle.label | v | -| main.rs:530:9:530:18 | mut vs_mut [element] | semmle.label | mut vs_mut [element] | -| main.rs:530:22:530:42 | [...] [element] | semmle.label | [...] [element] | -| main.rs:530:23:530:32 | source(...) | semmle.label | source(...) | -| main.rs:532:10:532:15 | vs_mut [element] | semmle.label | vs_mut [element] | -| main.rs:532:10:532:18 | vs_mut[0] | semmle.label | vs_mut[0] | -| main.rs:542:9:542:9 | a | semmle.label | a | -| main.rs:542:13:542:22 | source(...) | semmle.label | source(...) | -| main.rs:544:9:544:9 | c | semmle.label | c | -| main.rs:544:13:544:22 | source(...) | semmle.label | source(...) | -| main.rs:545:9:545:13 | c_ref [&ref] | semmle.label | c_ref [&ref] | -| main.rs:545:17:545:18 | &c [&ref] | semmle.label | &c [&ref] | -| main.rs:545:18:545:18 | c | semmle.label | c | -| main.rs:547:10:547:10 | a | semmle.label | a | -| main.rs:550:10:550:15 | * ... | semmle.label | * ... | -| main.rs:550:11:550:15 | c_ref [&ref] | semmle.label | c_ref [&ref] | +| main.rs:445:9:445:10 | n1 | semmle.label | n1 | +| main.rs:445:15:445:18 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:446:14:446:15 | n1 | semmle.label | n1 | +| main.rs:456:9:456:12 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:456:16:456:33 | [...] [element] | semmle.label | [...] [element] | +| main.rs:456:23:456:32 | source(...) | semmle.label | source(...) | +| main.rs:457:11:457:14 | arr1 [element] | semmle.label | arr1 [element] | +| main.rs:458:9:458:17 | SlicePat [element] | semmle.label | SlicePat [element] | +| main.rs:458:10:458:10 | a | semmle.label | a | +| main.rs:458:13:458:13 | b | semmle.label | b | +| main.rs:458:16:458:16 | c | semmle.label | c | +| main.rs:459:18:459:18 | a | semmle.label | a | +| main.rs:460:18:460:18 | b | semmle.label | b | +| main.rs:461:18:461:18 | c | semmle.label | c | +| main.rs:470:5:470:11 | [post] mut_arr [element] | semmle.label | [post] mut_arr [element] | +| main.rs:470:18:470:27 | source(...) | semmle.label | source(...) | +| main.rs:471:9:471:9 | d | semmle.label | d | +| main.rs:471:13:471:19 | mut_arr [element] | semmle.label | mut_arr [element] | +| main.rs:471:13:471:22 | mut_arr[1] | semmle.label | mut_arr[1] | +| main.rs:472:10:472:10 | d | semmle.label | d | +| main.rs:473:10:473:16 | mut_arr [element] | semmle.label | mut_arr [element] | +| main.rs:473:10:473:19 | mut_arr[0] | semmle.label | mut_arr[0] | +| main.rs:496:9:496:9 | s | semmle.label | s | +| main.rs:496:25:496:26 | source(...) | semmle.label | source(...) | +| main.rs:497:10:497:10 | s | semmle.label | s | +| main.rs:505:9:505:9 | a | semmle.label | a | +| main.rs:505:13:505:22 | source(...) | semmle.label | source(...) | +| main.rs:510:10:510:10 | a | semmle.label | a | +| main.rs:517:9:517:10 | vs [element] | semmle.label | vs [element] | +| main.rs:517:14:517:34 | [...] [element] | semmle.label | [...] [element] | +| main.rs:517:15:517:24 | source(...) | semmle.label | source(...) | +| main.rs:519:10:519:11 | vs [element] | semmle.label | vs [element] | +| main.rs:519:10:519:14 | vs[0] | semmle.label | vs[0] | +| main.rs:523:9:523:9 | v | semmle.label | v | +| main.rs:523:14:523:15 | vs [element] | semmle.label | vs [element] | +| main.rs:524:14:524:14 | v | semmle.label | v | +| main.rs:542:9:542:18 | mut vs_mut [element] | semmle.label | mut vs_mut [element] | +| main.rs:542:22:542:42 | [...] [element] | semmle.label | [...] [element] | +| main.rs:542:23:542:32 | source(...) | semmle.label | source(...) | +| main.rs:544:10:544:15 | vs_mut [element] | semmle.label | vs_mut [element] | +| main.rs:544:10:544:18 | vs_mut[0] | semmle.label | vs_mut[0] | +| main.rs:554:9:554:9 | a | semmle.label | a | +| main.rs:554:13:554:22 | source(...) | semmle.label | source(...) | +| main.rs:556:9:556:9 | c | semmle.label | c | +| main.rs:556:13:556:22 | source(...) | semmle.label | source(...) | +| main.rs:557:9:557:13 | c_ref [&ref] | semmle.label | c_ref [&ref] | +| main.rs:557:17:557:18 | &c [&ref] | semmle.label | &c [&ref] | +| main.rs:557:18:557:18 | c | semmle.label | c | +| main.rs:559:10:559:10 | a | semmle.label | a | +| main.rs:562:10:562:15 | * ... | semmle.label | * ... | +| main.rs:562:11:562:15 | c_ref [&ref] | semmle.label | c_ref [&ref] | subpaths testFailures #select @@ -542,54 +551,56 @@ testFailures | main.rs:53:10:53:10 | b | main.rs:48:13:48:21 | source(...) | main.rs:53:10:53:10 | b | $@ | main.rs:48:13:48:21 | source(...) | source(...) | | main.rs:64:10:64:10 | b | main.rs:62:15:62:23 | source(...) | main.rs:64:10:64:10 | b | $@ | main.rs:62:15:62:23 | source(...) | source(...) | | main.rs:71:10:71:10 | i | main.rs:70:9:70:17 | source(...) | main.rs:71:10:71:10 | i | $@ | main.rs:70:9:70:17 | source(...) | source(...) | -| main.rs:104:10:104:11 | * ... | main.rs:103:22:103:30 | source(...) | main.rs:104:10:104:11 | * ... | $@ | main.rs:103:22:103:30 | source(...) | source(...) | -| main.rs:112:10:112:12 | a.0 | main.rs:111:14:111:22 | source(...) | main.rs:112:10:112:12 | a.0 | $@ | main.rs:111:14:111:22 | source(...) | source(...) | -| main.rs:120:10:120:11 | a1 | main.rs:117:17:117:26 | source(...) | main.rs:120:10:120:11 | a1 | $@ | main.rs:117:17:117:26 | source(...) | source(...) | -| main.rs:127:10:127:12 | a.1 | main.rs:125:21:125:30 | source(...) | main.rs:127:10:127:12 | a.1 | $@ | main.rs:125:21:125:30 | source(...) | source(...) | -| main.rs:130:10:130:12 | a.0 | main.rs:128:11:128:20 | source(...) | main.rs:130:10:130:12 | a.0 | $@ | main.rs:128:11:128:20 | source(...) | source(...) | -| main.rs:138:10:138:15 | ... .1 | main.rs:135:17:135:26 | source(...) | main.rs:138:10:138:15 | ... .1 | $@ | main.rs:135:17:135:26 | source(...) | source(...) | -| main.rs:152:10:152:12 | p.x | main.rs:151:24:151:32 | source(...) | main.rs:152:10:152:12 | p.x | $@ | main.rs:151:24:151:32 | source(...) | source(...) | -| main.rs:160:10:160:12 | p.y | main.rs:159:11:159:20 | source(...) | main.rs:160:10:160:12 | p.y | $@ | main.rs:159:11:159:20 | source(...) | source(...) | -| main.rs:169:10:169:10 | a | main.rs:165:12:165:21 | source(...) | main.rs:169:10:169:10 | a | $@ | main.rs:165:12:165:21 | source(...) | source(...) | -| main.rs:187:10:187:18 | ... .y | main.rs:182:16:182:25 | source(...) | main.rs:187:10:187:18 | ... .y | $@ | main.rs:182:16:182:25 | source(...) | source(...) | -| main.rs:203:18:203:18 | y | main.rs:192:13:192:22 | source(...) | main.rs:203:18:203:18 | y | $@ | main.rs:192:13:192:22 | source(...) | source(...) | -| main.rs:213:10:213:12 | s.0 | main.rs:212:27:212:36 | source(...) | main.rs:213:10:213:12 | s.0 | $@ | main.rs:212:27:212:36 | source(...) | source(...) | -| main.rs:218:18:218:18 | x | main.rs:212:27:212:36 | source(...) | main.rs:218:18:218:18 | x | $@ | main.rs:212:27:212:36 | source(...) | source(...) | -| main.rs:231:33:231:33 | n | main.rs:228:27:228:36 | source(...) | main.rs:231:33:231:33 | n | $@ | main.rs:228:27:228:36 | source(...) | source(...) | -| main.rs:244:25:244:25 | n | main.rs:241:19:241:28 | source(...) | main.rs:244:25:244:25 | n | $@ | main.rs:241:19:241:28 | source(...) | source(...) | -| main.rs:257:18:257:18 | n | main.rs:254:19:254:28 | source(...) | main.rs:257:18:257:18 | n | $@ | main.rs:254:19:254:28 | source(...) | source(...) | -| main.rs:261:14:261:14 | n | main.rs:254:19:254:28 | source(...) | main.rs:261:14:261:14 | n | $@ | main.rs:254:19:254:28 | source(...) | source(...) | -| main.rs:267:10:267:20 | s1.unwrap() | main.rs:266:19:266:28 | source(...) | main.rs:267:10:267:20 | s1.unwrap() | $@ | main.rs:266:19:266:28 | source(...) | source(...) | -| main.rs:272:10:272:24 | s1.unwrap_or(...) | main.rs:271:19:271:28 | source(...) | main.rs:272:10:272:24 | s1.unwrap_or(...) | $@ | main.rs:271:19:271:28 | source(...) | source(...) | -| main.rs:275:10:275:33 | s2.unwrap_or(...) | main.rs:275:23:275:32 | source(...) | main.rs:275:10:275:33 | s2.unwrap_or(...) | $@ | main.rs:275:23:275:32 | source(...) | source(...) | -| main.rs:280:10:280:32 | s1.unwrap_or_else(...) | main.rs:279:19:279:28 | source(...) | main.rs:280:10:280:32 | s1.unwrap_or_else(...) | $@ | main.rs:279:19:279:28 | source(...) | source(...) | -| main.rs:283:10:283:41 | s2.unwrap_or_else(...) | main.rs:283:31:283:40 | source(...) | main.rs:283:10:283:41 | s2.unwrap_or_else(...) | $@ | main.rs:283:31:283:40 | source(...) | source(...) | -| main.rs:290:10:290:11 | i1 | main.rs:287:19:287:28 | source(...) | main.rs:290:10:290:11 | i1 | $@ | main.rs:287:19:287:28 | source(...) | source(...) | -| main.rs:299:10:299:21 | o1a.unwrap() | main.rs:296:35:296:44 | source(...) | main.rs:299:10:299:21 | o1a.unwrap() | $@ | main.rs:296:35:296:44 | source(...) | source(...) | -| main.rs:306:10:306:21 | o2b.unwrap() | main.rs:302:36:302:45 | source(...) | main.rs:306:10:306:21 | o2b.unwrap() | $@ | main.rs:302:36:302:45 | source(...) | source(...) | -| main.rs:315:10:315:11 | i1 | main.rs:310:35:310:44 | source(...) | main.rs:315:10:315:11 | i1 | $@ | main.rs:310:35:310:44 | source(...) | source(...) | -| main.rs:324:10:324:22 | s1.expect(...) | main.rs:323:35:323:44 | source(...) | main.rs:324:10:324:22 | s1.expect(...) | $@ | main.rs:323:35:323:44 | source(...) | source(...) | -| main.rs:329:10:329:26 | s2.expect_err(...) | main.rs:327:36:327:45 | source(...) | main.rs:329:10:329:26 | s2.expect_err(...) | $@ | main.rs:327:36:327:45 | source(...) | source(...) | -| main.rs:341:35:341:35 | n | main.rs:338:29:338:38 | source(...) | main.rs:341:35:341:35 | n | $@ | main.rs:338:29:338:38 | source(...) | source(...) | -| main.rs:345:55:345:55 | n | main.rs:338:29:338:38 | source(...) | main.rs:345:55:345:55 | n | $@ | main.rs:338:29:338:38 | source(...) | source(...) | -| main.rs:359:22:359:22 | n | main.rs:356:16:356:25 | source(...) | main.rs:359:22:359:22 | n | $@ | main.rs:356:16:356:25 | source(...) | source(...) | -| main.rs:363:29:363:29 | n | main.rs:356:16:356:25 | source(...) | main.rs:363:29:363:29 | n | $@ | main.rs:356:16:356:25 | source(...) | source(...) | -| main.rs:382:48:382:48 | n | main.rs:378:18:378:27 | source(...) | main.rs:382:48:382:48 | n | $@ | main.rs:378:18:378:27 | source(...) | source(...) | -| main.rs:386:81:386:81 | n | main.rs:378:18:378:27 | source(...) | main.rs:386:81:386:81 | n | $@ | main.rs:378:18:378:27 | source(...) | source(...) | -| main.rs:402:34:402:34 | n | main.rs:398:18:398:27 | source(...) | main.rs:402:34:402:34 | n | $@ | main.rs:398:18:398:27 | source(...) | source(...) | -| main.rs:406:53:406:53 | n | main.rs:398:18:398:27 | source(...) | main.rs:406:53:406:53 | n | $@ | main.rs:398:18:398:27 | source(...) | source(...) | -| main.rs:420:10:420:11 | n1 | main.rs:418:23:418:32 | source(...) | main.rs:420:10:420:11 | n1 | $@ | main.rs:418:23:418:32 | source(...) | source(...) | -| main.rs:424:10:424:11 | n2 | main.rs:422:17:422:26 | source(...) | main.rs:424:10:424:11 | n2 | $@ | main.rs:422:17:422:26 | source(...) | source(...) | -| main.rs:434:14:434:15 | n1 | main.rs:432:23:432:32 | source(...) | main.rs:434:14:434:15 | n1 | $@ | main.rs:432:23:432:32 | source(...) | source(...) | -| main.rs:447:18:447:18 | a | main.rs:444:23:444:32 | source(...) | main.rs:447:18:447:18 | a | $@ | main.rs:444:23:444:32 | source(...) | source(...) | -| main.rs:448:18:448:18 | b | main.rs:444:23:444:32 | source(...) | main.rs:448:18:448:18 | b | $@ | main.rs:444:23:444:32 | source(...) | source(...) | -| main.rs:449:18:449:18 | c | main.rs:444:23:444:32 | source(...) | main.rs:449:18:449:18 | c | $@ | main.rs:444:23:444:32 | source(...) | source(...) | -| main.rs:460:10:460:10 | d | main.rs:458:18:458:27 | source(...) | main.rs:460:10:460:10 | d | $@ | main.rs:458:18:458:27 | source(...) | source(...) | -| main.rs:461:10:461:19 | mut_arr[0] | main.rs:458:18:458:27 | source(...) | main.rs:461:10:461:19 | mut_arr[0] | $@ | main.rs:458:18:458:27 | source(...) | source(...) | -| main.rs:485:10:485:10 | s | main.rs:484:25:484:26 | source(...) | main.rs:485:10:485:10 | s | $@ | main.rs:484:25:484:26 | source(...) | source(...) | -| main.rs:498:10:498:10 | a | main.rs:493:13:493:22 | source(...) | main.rs:498:10:498:10 | a | $@ | main.rs:493:13:493:22 | source(...) | source(...) | -| main.rs:507:10:507:14 | vs[0] | main.rs:505:15:505:24 | source(...) | main.rs:507:10:507:14 | vs[0] | $@ | main.rs:505:15:505:24 | source(...) | source(...) | -| main.rs:512:14:512:14 | v | main.rs:505:15:505:24 | source(...) | main.rs:512:14:512:14 | v | $@ | main.rs:505:15:505:24 | source(...) | source(...) | -| main.rs:532:10:532:18 | vs_mut[0] | main.rs:530:23:530:32 | source(...) | main.rs:532:10:532:18 | vs_mut[0] | $@ | main.rs:530:23:530:32 | source(...) | source(...) | -| main.rs:547:10:547:10 | a | main.rs:542:13:542:22 | source(...) | main.rs:547:10:547:10 | a | $@ | main.rs:542:13:542:22 | source(...) | source(...) | -| main.rs:550:10:550:15 | * ... | main.rs:544:13:544:22 | source(...) | main.rs:550:10:550:15 | * ... | $@ | main.rs:544:13:544:22 | source(...) | source(...) | +| main.rs:78:10:78:10 | j | main.rs:76:13:76:21 | source(...) | main.rs:78:10:78:10 | j | $@ | main.rs:76:13:76:21 | source(...) | source(...) | +| main.rs:79:10:79:10 | k | main.rs:76:13:76:21 | source(...) | main.rs:79:10:79:10 | k | $@ | main.rs:76:13:76:21 | source(...) | source(...) | +| main.rs:116:10:116:11 | * ... | main.rs:115:22:115:30 | source(...) | main.rs:116:10:116:11 | * ... | $@ | main.rs:115:22:115:30 | source(...) | source(...) | +| main.rs:124:10:124:12 | a.0 | main.rs:123:14:123:22 | source(...) | main.rs:124:10:124:12 | a.0 | $@ | main.rs:123:14:123:22 | source(...) | source(...) | +| main.rs:132:10:132:11 | a1 | main.rs:129:17:129:26 | source(...) | main.rs:132:10:132:11 | a1 | $@ | main.rs:129:17:129:26 | source(...) | source(...) | +| main.rs:139:10:139:12 | a.1 | main.rs:137:21:137:30 | source(...) | main.rs:139:10:139:12 | a.1 | $@ | main.rs:137:21:137:30 | source(...) | source(...) | +| main.rs:142:10:142:12 | a.0 | main.rs:140:11:140:20 | source(...) | main.rs:142:10:142:12 | a.0 | $@ | main.rs:140:11:140:20 | source(...) | source(...) | +| main.rs:150:10:150:15 | ... .1 | main.rs:147:17:147:26 | source(...) | main.rs:150:10:150:15 | ... .1 | $@ | main.rs:147:17:147:26 | source(...) | source(...) | +| main.rs:164:10:164:12 | p.x | main.rs:163:24:163:32 | source(...) | main.rs:164:10:164:12 | p.x | $@ | main.rs:163:24:163:32 | source(...) | source(...) | +| main.rs:172:10:172:12 | p.y | main.rs:171:11:171:20 | source(...) | main.rs:172:10:172:12 | p.y | $@ | main.rs:171:11:171:20 | source(...) | source(...) | +| main.rs:181:10:181:10 | a | main.rs:177:12:177:21 | source(...) | main.rs:181:10:181:10 | a | $@ | main.rs:177:12:177:21 | source(...) | source(...) | +| main.rs:199:10:199:18 | ... .y | main.rs:194:16:194:25 | source(...) | main.rs:199:10:199:18 | ... .y | $@ | main.rs:194:16:194:25 | source(...) | source(...) | +| main.rs:215:18:215:18 | y | main.rs:204:13:204:22 | source(...) | main.rs:215:18:215:18 | y | $@ | main.rs:204:13:204:22 | source(...) | source(...) | +| main.rs:225:10:225:12 | s.0 | main.rs:224:27:224:36 | source(...) | main.rs:225:10:225:12 | s.0 | $@ | main.rs:224:27:224:36 | source(...) | source(...) | +| main.rs:230:18:230:18 | x | main.rs:224:27:224:36 | source(...) | main.rs:230:18:230:18 | x | $@ | main.rs:224:27:224:36 | source(...) | source(...) | +| main.rs:243:33:243:33 | n | main.rs:240:27:240:36 | source(...) | main.rs:243:33:243:33 | n | $@ | main.rs:240:27:240:36 | source(...) | source(...) | +| main.rs:256:25:256:25 | n | main.rs:253:19:253:28 | source(...) | main.rs:256:25:256:25 | n | $@ | main.rs:253:19:253:28 | source(...) | source(...) | +| main.rs:269:18:269:18 | n | main.rs:266:19:266:28 | source(...) | main.rs:269:18:269:18 | n | $@ | main.rs:266:19:266:28 | source(...) | source(...) | +| main.rs:273:14:273:14 | n | main.rs:266:19:266:28 | source(...) | main.rs:273:14:273:14 | n | $@ | main.rs:266:19:266:28 | source(...) | source(...) | +| main.rs:279:10:279:20 | s1.unwrap() | main.rs:278:19:278:28 | source(...) | main.rs:279:10:279:20 | s1.unwrap() | $@ | main.rs:278:19:278:28 | source(...) | source(...) | +| main.rs:284:10:284:24 | s1.unwrap_or(...) | main.rs:283:19:283:28 | source(...) | main.rs:284:10:284:24 | s1.unwrap_or(...) | $@ | main.rs:283:19:283:28 | source(...) | source(...) | +| main.rs:287:10:287:33 | s2.unwrap_or(...) | main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | $@ | main.rs:287:23:287:32 | source(...) | source(...) | +| main.rs:292:10:292:32 | s1.unwrap_or_else(...) | main.rs:291:19:291:28 | source(...) | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | $@ | main.rs:291:19:291:28 | source(...) | source(...) | +| main.rs:295:10:295:41 | s2.unwrap_or_else(...) | main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | $@ | main.rs:295:31:295:40 | source(...) | source(...) | +| main.rs:302:10:302:11 | i1 | main.rs:299:19:299:28 | source(...) | main.rs:302:10:302:11 | i1 | $@ | main.rs:299:19:299:28 | source(...) | source(...) | +| main.rs:311:10:311:21 | o1a.unwrap() | main.rs:308:35:308:44 | source(...) | main.rs:311:10:311:21 | o1a.unwrap() | $@ | main.rs:308:35:308:44 | source(...) | source(...) | +| main.rs:318:10:318:21 | o2b.unwrap() | main.rs:314:36:314:45 | source(...) | main.rs:318:10:318:21 | o2b.unwrap() | $@ | main.rs:314:36:314:45 | source(...) | source(...) | +| main.rs:327:10:327:11 | i1 | main.rs:322:35:322:44 | source(...) | main.rs:327:10:327:11 | i1 | $@ | main.rs:322:35:322:44 | source(...) | source(...) | +| main.rs:336:10:336:22 | s1.expect(...) | main.rs:335:35:335:44 | source(...) | main.rs:336:10:336:22 | s1.expect(...) | $@ | main.rs:335:35:335:44 | source(...) | source(...) | +| main.rs:341:10:341:26 | s2.expect_err(...) | main.rs:339:36:339:45 | source(...) | main.rs:341:10:341:26 | s2.expect_err(...) | $@ | main.rs:339:36:339:45 | source(...) | source(...) | +| main.rs:353:35:353:35 | n | main.rs:350:29:350:38 | source(...) | main.rs:353:35:353:35 | n | $@ | main.rs:350:29:350:38 | source(...) | source(...) | +| main.rs:357:55:357:55 | n | main.rs:350:29:350:38 | source(...) | main.rs:357:55:357:55 | n | $@ | main.rs:350:29:350:38 | source(...) | source(...) | +| main.rs:371:22:371:22 | n | main.rs:368:16:368:25 | source(...) | main.rs:371:22:371:22 | n | $@ | main.rs:368:16:368:25 | source(...) | source(...) | +| main.rs:375:29:375:29 | n | main.rs:368:16:368:25 | source(...) | main.rs:375:29:375:29 | n | $@ | main.rs:368:16:368:25 | source(...) | source(...) | +| main.rs:394:48:394:48 | n | main.rs:390:18:390:27 | source(...) | main.rs:394:48:394:48 | n | $@ | main.rs:390:18:390:27 | source(...) | source(...) | +| main.rs:398:81:398:81 | n | main.rs:390:18:390:27 | source(...) | main.rs:398:81:398:81 | n | $@ | main.rs:390:18:390:27 | source(...) | source(...) | +| main.rs:414:34:414:34 | n | main.rs:410:18:410:27 | source(...) | main.rs:414:34:414:34 | n | $@ | main.rs:410:18:410:27 | source(...) | source(...) | +| main.rs:418:53:418:53 | n | main.rs:410:18:410:27 | source(...) | main.rs:418:53:418:53 | n | $@ | main.rs:410:18:410:27 | source(...) | source(...) | +| main.rs:432:10:432:11 | n1 | main.rs:430:23:430:32 | source(...) | main.rs:432:10:432:11 | n1 | $@ | main.rs:430:23:430:32 | source(...) | source(...) | +| main.rs:436:10:436:11 | n2 | main.rs:434:17:434:26 | source(...) | main.rs:436:10:436:11 | n2 | $@ | main.rs:434:17:434:26 | source(...) | source(...) | +| main.rs:446:14:446:15 | n1 | main.rs:444:23:444:32 | source(...) | main.rs:446:14:446:15 | n1 | $@ | main.rs:444:23:444:32 | source(...) | source(...) | +| main.rs:459:18:459:18 | a | main.rs:456:23:456:32 | source(...) | main.rs:459:18:459:18 | a | $@ | main.rs:456:23:456:32 | source(...) | source(...) | +| main.rs:460:18:460:18 | b | main.rs:456:23:456:32 | source(...) | main.rs:460:18:460:18 | b | $@ | main.rs:456:23:456:32 | source(...) | source(...) | +| main.rs:461:18:461:18 | c | main.rs:456:23:456:32 | source(...) | main.rs:461:18:461:18 | c | $@ | main.rs:456:23:456:32 | source(...) | source(...) | +| main.rs:472:10:472:10 | d | main.rs:470:18:470:27 | source(...) | main.rs:472:10:472:10 | d | $@ | main.rs:470:18:470:27 | source(...) | source(...) | +| main.rs:473:10:473:19 | mut_arr[0] | main.rs:470:18:470:27 | source(...) | main.rs:473:10:473:19 | mut_arr[0] | $@ | main.rs:470:18:470:27 | source(...) | source(...) | +| main.rs:497:10:497:10 | s | main.rs:496:25:496:26 | source(...) | main.rs:497:10:497:10 | s | $@ | main.rs:496:25:496:26 | source(...) | source(...) | +| main.rs:510:10:510:10 | a | main.rs:505:13:505:22 | source(...) | main.rs:510:10:510:10 | a | $@ | main.rs:505:13:505:22 | source(...) | source(...) | +| main.rs:519:10:519:14 | vs[0] | main.rs:517:15:517:24 | source(...) | main.rs:519:10:519:14 | vs[0] | $@ | main.rs:517:15:517:24 | source(...) | source(...) | +| main.rs:524:14:524:14 | v | main.rs:517:15:517:24 | source(...) | main.rs:524:14:524:14 | v | $@ | main.rs:517:15:517:24 | source(...) | source(...) | +| main.rs:544:10:544:18 | vs_mut[0] | main.rs:542:23:542:32 | source(...) | main.rs:544:10:544:18 | vs_mut[0] | $@ | main.rs:542:23:542:32 | source(...) | source(...) | +| main.rs:559:10:559:10 | a | main.rs:554:13:554:22 | source(...) | main.rs:559:10:559:10 | a | $@ | main.rs:554:13:554:22 | source(...) | source(...) | +| main.rs:562:10:562:15 | * ... | main.rs:556:13:556:22 | source(...) | main.rs:562:10:562:15 | * ... | $@ | main.rs:556:13:556:22 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/main.rs b/rust/ql/test/library-tests/dataflow/local/main.rs index 598aed6777f..d352eb0cbf1 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -69,6 +69,18 @@ fn assignment() { sink(i); i = source(6); sink(i); // $ hasValueFlow=6 + i = 2; + sink(i); + + let mut j = 3; + let k = source(7); + j = k; + sink(j); // $ hasValueFlow=7 + sink(k); // $ hasValueFlow=7 + + let mut l = source(8); + l = l; + sink(l); // $ MISSING: hasValueFlow=8 } fn block_expression1() -> i64 { From 49de716f10ab1d9e0ec7155363edc5e9e23405f5 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 16 Sep 2025 10:50:28 +0100 Subject: [PATCH 15/49] Rust: Accept consistency check changes. --- .../local/CONSISTENCY/PathResolutionConsistency.expected | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected index f5f63c61593..cbf6523d21c 100644 --- a/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/local/CONSISTENCY/PathResolutionConsistency.expected @@ -1,2 +1,2 @@ multipleCallTargets -| main.rs:471:18:471:24 | n.len() | +| main.rs:483:18:483:24 | n.len() | From 7b04cf1a73ddb561738e31ba5b31348ced20c626 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 16 Sep 2025 12:15:44 +0100 Subject: [PATCH 16/49] Rust: Fix up the test annotations. --- .../security/CWE-319/UseOfHttp.expected | 10 ------- .../test/query-tests/security/CWE-319/main.rs | 30 +++++++++---------- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected index 53cc8606cc8..f2a2e7e05f4 100644 --- a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected +++ b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected @@ -66,13 +66,3 @@ nodes | main.rs:60:21:60:42 | ...::get | semmle.label | ...::get | | main.rs:60:44:60:46 | url | semmle.label | url | subpaths -testFailures -| main.rs:22:20:22:39 | "http://example.com" | Unexpected result: Source | -| main.rs:22:42:22:71 | //... | Missing result: Alert[rust/non-https-url] | -| main.rs:25:21:25:42 | ...::get | Unexpected result: Alert | -| main.rs:33:20:33:28 | "http://" | Unexpected result: Source | -| main.rs:33:31:33:60 | //... | Missing result: Alert[rust/non-https-url] | -| main.rs:36:30:36:51 | ...::get | Unexpected result: Alert | -| main.rs:59:15:59:49 | "http://example.com/sensitive-... | Unexpected result: Source | -| main.rs:59:52:59:81 | //... | Missing result: Alert[rust/non-https-url] | -| main.rs:60:21:60:42 | ...::get | Unexpected result: Alert | diff --git a/rust/ql/test/query-tests/security/CWE-319/main.rs b/rust/ql/test/query-tests/security/CWE-319/main.rs index ae58967a49b..52f744e39a1 100644 --- a/rust/ql/test/query-tests/security/CWE-319/main.rs +++ b/rust/ql/test/query-tests/security/CWE-319/main.rs @@ -11,30 +11,30 @@ fn test_direct_literals() { // BAD: Direct HTTP URLs that should be flagged let _response1 = reqwest::blocking::get("http://example.com/api").unwrap(); // $ Alert[rust/non-https-url] let _response2 = reqwest::blocking::get("http://api.example.com/data").unwrap(); // $ Alert[rust/non-https-url] - - // GOOD: HTTPS URLs that should not be flagged + + // GOOD: HTTPS URLs that should not be flagged let _response3 = reqwest::blocking::get("https://example.com/api").unwrap(); let _response4 = reqwest::blocking::get("https://api.example.com/data").unwrap(); } fn test_dynamic_urls() { // BAD: HTTP URLs constructed dynamically - let base_url = "http://example.com"; // $ Alert[rust/non-https-url] + let base_url = "http://example.com"; // $ Source let endpoint = "/api/users"; let full_url = format!("{}{}", base_url, endpoint); - let _response = reqwest::blocking::get(&full_url).unwrap(); - + let _response = reqwest::blocking::get(&full_url).unwrap(); // $ Alert[rust/non-https-url] + // GOOD: HTTPS URLs constructed dynamically let secure_base = "https://example.com"; let secure_full = format!("{}{}", secure_base, endpoint); let _secure_response = reqwest::blocking::get(&secure_full).unwrap(); - + // BAD: HTTP protocol string - let protocol = "http://"; // $ Alert[rust/non-https-url] + let protocol = "http://"; // $ Source let host = "api.example.com"; let insecure_url = format!("{}{}", protocol, host); - let _insecure_response = reqwest::blocking::get(&insecure_url).unwrap(); - + let _insecure_response = reqwest::blocking::get(&insecure_url).unwrap(); // $ Alert[rust/non-https-url] + // GOOD: HTTPS protocol string let secure_protocol = "https://"; let secure_url = format!("{}{}", secure_protocol, host); @@ -47,7 +47,7 @@ fn test_localhost_exemptions() { let _local2 = reqwest::blocking::get("http://127.0.0.1:3000/test").unwrap(); let _local3 = reqwest::blocking::get("http://192.168.1.100/internal").unwrap(); let _local4 = reqwest::blocking::get("http://10.0.0.1/admin").unwrap(); - + // Test IPv6 localhost variants let _local5 = reqwest::blocking::get("http://[::1]:8080/api").unwrap(); let _local6 = reqwest::blocking::get("http://[0:0:0:0:0:0:0:1]/test").unwrap(); @@ -56,10 +56,10 @@ fn test_localhost_exemptions() { // Additional test cases that mirror the Bad/Good examples fn test_examples() { // From UseOfHttpBad.rs - BAD case - let url = "http://example.com/sensitive-data"; // $ Alert[rust/non-https-url] - let _response = reqwest::blocking::get(url).unwrap(); - - // From UseOfHttpGood.rs - GOOD case + let url = "http://example.com/sensitive-data"; // $ Source + let _response = reqwest::blocking::get(url).unwrap(); // $ Alert[rust/non-https-url] + + // From UseOfHttpGood.rs - GOOD case let secure_url = "https://example.com/sensitive-data"; let _secure_response = reqwest::blocking::get(secure_url).unwrap(); -} \ No newline at end of file +} From 0924dec545a0eff7113574d629f4c5f2b99007be Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:21:57 +0100 Subject: [PATCH 17/49] Rust: Make the tests of the example code closer to the actual example code. --- .../security/CWE-319/UseOfHttp.expected | 16 ++++++++-------- .../test/query-tests/security/CWE-319/main.rs | 18 ++++++++++++++---- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected index f2a2e7e05f4..e8b7d301335 100644 --- a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected +++ b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected @@ -3,7 +3,7 @@ | main.rs:13:22:13:43 | ...::get | main.rs:13:45:13:73 | "http://api.example.com/data" | main.rs:13:22:13:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:13:45:13:73 | "http://api.example.com/data" | this HTTP URL | | main.rs:25:21:25:42 | ...::get | main.rs:22:20:22:39 | "http://example.com" | main.rs:25:21:25:42 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:22:20:22:39 | "http://example.com" | this HTTP URL | | main.rs:36:30:36:51 | ...::get | main.rs:33:20:33:28 | "http://" | main.rs:36:30:36:51 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:33:20:33:28 | "http://" | this HTTP URL | -| main.rs:60:21:60:42 | ...::get | main.rs:59:15:59:49 | "http://example.com/sensitive-... | main.rs:60:21:60:42 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:59:15:59:49 | "http://example.com/sensitive-... | this HTTP URL | +| main.rs:63:24:63:45 | ...::get | main.rs:60:19:60:53 | "http://example.com/sensitive-... | main.rs:63:24:63:45 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:60:19:60:53 | "http://example.com/sensitive-... | this HTTP URL | edges | main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:22:12:43 | ...::get | provenance | MaD:1 Sink:MaD:1 | | main.rs:13:45:13:73 | "http://api.example.com/data" | main.rs:13:22:13:43 | ...::get | provenance | MaD:1 Sink:MaD:1 | @@ -27,9 +27,9 @@ edges | main.rs:35:32:35:53 | { ... } | main.rs:35:32:35:53 | ...::must_use(...) | provenance | MaD:3 | | main.rs:36:53:36:65 | &insecure_url [&ref] | main.rs:36:30:36:51 | ...::get | provenance | MaD:1 Sink:MaD:1 | | main.rs:36:54:36:65 | insecure_url | main.rs:36:53:36:65 | &insecure_url [&ref] | provenance | | -| main.rs:59:9:59:11 | url | main.rs:60:44:60:46 | url | provenance | | -| main.rs:59:15:59:49 | "http://example.com/sensitive-... | main.rs:59:9:59:11 | url | provenance | | -| main.rs:60:44:60:46 | url | main.rs:60:21:60:42 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:60:13:60:15 | url | main.rs:63:47:63:49 | url | provenance | | +| main.rs:60:19:60:53 | "http://example.com/sensitive-... | main.rs:60:13:60:15 | url | provenance | | +| main.rs:63:47:63:49 | url | main.rs:63:24:63:45 | ...::get | provenance | MaD:1 Sink:MaD:1 | models | 1 | Sink: reqwest::blocking::get; Argument[0]; request-url | | 2 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | @@ -61,8 +61,8 @@ nodes | main.rs:36:30:36:51 | ...::get | semmle.label | ...::get | | main.rs:36:53:36:65 | &insecure_url [&ref] | semmle.label | &insecure_url [&ref] | | main.rs:36:54:36:65 | insecure_url | semmle.label | insecure_url | -| main.rs:59:9:59:11 | url | semmle.label | url | -| main.rs:59:15:59:49 | "http://example.com/sensitive-... | semmle.label | "http://example.com/sensitive-... | -| main.rs:60:21:60:42 | ...::get | semmle.label | ...::get | -| main.rs:60:44:60:46 | url | semmle.label | url | +| main.rs:60:13:60:15 | url | semmle.label | url | +| main.rs:60:19:60:53 | "http://example.com/sensitive-... | semmle.label | "http://example.com/sensitive-... | +| main.rs:63:24:63:45 | ...::get | semmle.label | ...::get | +| main.rs:63:47:63:49 | url | semmle.label | url | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-319/main.rs b/rust/ql/test/query-tests/security/CWE-319/main.rs index 52f744e39a1..cec94840f29 100644 --- a/rust/ql/test/query-tests/security/CWE-319/main.rs +++ b/rust/ql/test/query-tests/security/CWE-319/main.rs @@ -56,10 +56,20 @@ fn test_localhost_exemptions() { // Additional test cases that mirror the Bad/Good examples fn test_examples() { // From UseOfHttpBad.rs - BAD case - let url = "http://example.com/sensitive-data"; // $ Source - let _response = reqwest::blocking::get(url).unwrap(); // $ Alert[rust/non-https-url] + { + let url = "http://example.com/sensitive-data"; // $ Source + + // This makes an insecure HTTP request that can be intercepted + let response = reqwest::blocking::get(url).unwrap(); // $ Alert[rust/non-https-url] + println!("Response: {}", response.text().unwrap()); + } // From UseOfHttpGood.rs - GOOD case - let secure_url = "https://example.com/sensitive-data"; - let _secure_response = reqwest::blocking::get(secure_url).unwrap(); + { + let url = "https://example.com/sensitive-data"; + + // This makes a secure HTTPS request that is encrypted + let response = reqwest::blocking::get(url).unwrap(); + println!("Response: {}", response.text().unwrap()); + } } From 9c7fc583373c353f5bf6cf35d055af3b6f28ad0e Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 16 Sep 2025 12:06:05 +0100 Subject: [PATCH 18/49] Rust: Add tests for a few more edge cases. --- .../security/CWE-319/UseOfHttp.expected | 120 ++++++++++-------- .../test/query-tests/security/CWE-319/main.rs | 22 +++- 2 files changed, 79 insertions(+), 63 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected index e8b7d301335..216d11b3606 100644 --- a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected +++ b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected @@ -1,35 +1,39 @@ #select | main.rs:12:22:12:43 | ...::get | main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:22:12:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:12:45:12:68 | "http://example.com/api" | this HTTP URL | -| main.rs:13:22:13:43 | ...::get | main.rs:13:45:13:73 | "http://api.example.com/data" | main.rs:13:22:13:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:13:45:13:73 | "http://api.example.com/data" | this HTTP URL | -| main.rs:25:21:25:42 | ...::get | main.rs:22:20:22:39 | "http://example.com" | main.rs:25:21:25:42 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:22:20:22:39 | "http://example.com" | this HTTP URL | -| main.rs:36:30:36:51 | ...::get | main.rs:33:20:33:28 | "http://" | main.rs:36:30:36:51 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:33:20:33:28 | "http://" | this HTTP URL | -| main.rs:63:24:63:45 | ...::get | main.rs:60:19:60:53 | "http://example.com/sensitive-... | main.rs:63:24:63:45 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:60:19:60:53 | "http://example.com/sensitive-... | this HTTP URL | +| main.rs:14:22:14:43 | ...::get | main.rs:14:45:14:73 | "http://api.example.com/data" | main.rs:14:22:14:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:14:45:14:73 | "http://api.example.com/data" | this HTTP URL | +| main.rs:26:21:26:42 | ...::get | main.rs:23:20:23:39 | "http://example.com" | main.rs:26:21:26:42 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:23:20:23:39 | "http://example.com" | this HTTP URL | +| main.rs:37:30:37:51 | ...::get | main.rs:34:20:34:28 | "http://" | main.rs:37:30:37:51 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:34:20:34:28 | "http://" | this HTTP URL | +| main.rs:53:19:53:40 | ...::get | main.rs:53:42:53:68 | "http://172.31.255.255/bar" | main.rs:53:19:53:40 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:53:42:53:68 | "http://172.31.255.255/bar" | this HTTP URL | +| main.rs:60:20:60:41 | ...::get | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | main.rs:60:20:60:41 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | this HTTP URL | +| main.rs:71:24:71:45 | ...::get | main.rs:68:19:68:53 | "http://example.com/sensitive-... | main.rs:71:24:71:45 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:68:19:68:53 | "http://example.com/sensitive-... | this HTTP URL | edges | main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:22:12:43 | ...::get | provenance | MaD:1 Sink:MaD:1 | -| main.rs:13:45:13:73 | "http://api.example.com/data" | main.rs:13:22:13:43 | ...::get | provenance | MaD:1 Sink:MaD:1 | -| main.rs:22:9:22:16 | base_url | main.rs:24:28:24:53 | MacroExpr | provenance | | -| main.rs:22:20:22:39 | "http://example.com" | main.rs:22:9:22:16 | base_url | provenance | | -| main.rs:24:9:24:16 | full_url | main.rs:25:45:25:52 | full_url | provenance | | -| main.rs:24:20:24:26 | res | main.rs:24:28:24:53 | { ... } | provenance | | -| main.rs:24:28:24:53 | ...::format(...) | main.rs:24:20:24:26 | res | provenance | | -| main.rs:24:28:24:53 | ...::must_use(...) | main.rs:24:9:24:16 | full_url | provenance | | -| main.rs:24:28:24:53 | MacroExpr | main.rs:24:28:24:53 | ...::format(...) | provenance | MaD:2 | -| main.rs:24:28:24:53 | { ... } | main.rs:24:28:24:53 | ...::must_use(...) | provenance | MaD:3 | -| main.rs:25:44:25:52 | &full_url [&ref] | main.rs:25:21:25:42 | ...::get | provenance | MaD:1 Sink:MaD:1 | -| main.rs:25:45:25:52 | full_url | main.rs:25:44:25:52 | &full_url [&ref] | provenance | | -| main.rs:33:9:33:16 | protocol | main.rs:35:32:35:53 | MacroExpr | provenance | | -| main.rs:33:20:33:28 | "http://" | main.rs:33:9:33:16 | protocol | provenance | | -| main.rs:35:9:35:20 | insecure_url | main.rs:36:54:36:65 | insecure_url | provenance | | -| main.rs:35:24:35:30 | res | main.rs:35:32:35:53 | { ... } | provenance | | -| main.rs:35:32:35:53 | ...::format(...) | main.rs:35:24:35:30 | res | provenance | | -| main.rs:35:32:35:53 | ...::must_use(...) | main.rs:35:9:35:20 | insecure_url | provenance | | -| main.rs:35:32:35:53 | MacroExpr | main.rs:35:32:35:53 | ...::format(...) | provenance | MaD:2 | -| main.rs:35:32:35:53 | { ... } | main.rs:35:32:35:53 | ...::must_use(...) | provenance | MaD:3 | -| main.rs:36:53:36:65 | &insecure_url [&ref] | main.rs:36:30:36:51 | ...::get | provenance | MaD:1 Sink:MaD:1 | -| main.rs:36:54:36:65 | insecure_url | main.rs:36:53:36:65 | &insecure_url [&ref] | provenance | | -| main.rs:60:13:60:15 | url | main.rs:63:47:63:49 | url | provenance | | -| main.rs:60:19:60:53 | "http://example.com/sensitive-... | main.rs:60:13:60:15 | url | provenance | | -| main.rs:63:47:63:49 | url | main.rs:63:24:63:45 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:14:45:14:73 | "http://api.example.com/data" | main.rs:14:22:14:43 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:23:9:23:16 | base_url | main.rs:25:28:25:53 | MacroExpr | provenance | | +| main.rs:23:20:23:39 | "http://example.com" | main.rs:23:9:23:16 | base_url | provenance | | +| main.rs:25:9:25:16 | full_url | main.rs:26:45:26:52 | full_url | provenance | | +| main.rs:25:20:25:26 | res | main.rs:25:28:25:53 | { ... } | provenance | | +| main.rs:25:28:25:53 | ...::format(...) | main.rs:25:20:25:26 | res | provenance | | +| main.rs:25:28:25:53 | ...::must_use(...) | main.rs:25:9:25:16 | full_url | provenance | | +| main.rs:25:28:25:53 | MacroExpr | main.rs:25:28:25:53 | ...::format(...) | provenance | MaD:2 | +| main.rs:25:28:25:53 | { ... } | main.rs:25:28:25:53 | ...::must_use(...) | provenance | MaD:3 | +| main.rs:26:44:26:52 | &full_url [&ref] | main.rs:26:21:26:42 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:26:45:26:52 | full_url | main.rs:26:44:26:52 | &full_url [&ref] | provenance | | +| main.rs:34:9:34:16 | protocol | main.rs:36:32:36:53 | MacroExpr | provenance | | +| main.rs:34:20:34:28 | "http://" | main.rs:34:9:34:16 | protocol | provenance | | +| main.rs:36:9:36:20 | insecure_url | main.rs:37:54:37:65 | insecure_url | provenance | | +| main.rs:36:24:36:30 | res | main.rs:36:32:36:53 | { ... } | provenance | | +| main.rs:36:32:36:53 | ...::format(...) | main.rs:36:24:36:30 | res | provenance | | +| main.rs:36:32:36:53 | ...::must_use(...) | main.rs:36:9:36:20 | insecure_url | provenance | | +| main.rs:36:32:36:53 | MacroExpr | main.rs:36:32:36:53 | ...::format(...) | provenance | MaD:2 | +| main.rs:36:32:36:53 | { ... } | main.rs:36:32:36:53 | ...::must_use(...) | provenance | MaD:3 | +| main.rs:37:53:37:65 | &insecure_url [&ref] | main.rs:37:30:37:51 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:37:54:37:65 | insecure_url | main.rs:37:53:37:65 | &insecure_url [&ref] | provenance | | +| main.rs:53:42:53:68 | "http://172.31.255.255/bar" | main.rs:53:19:53:40 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:60:43:60:65 | "http://172.32.0.0/baz" | main.rs:60:20:60:41 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:68:13:68:15 | url | main.rs:71:47:71:49 | url | provenance | | +| main.rs:68:19:68:53 | "http://example.com/sensitive-... | main.rs:68:13:68:15 | url | provenance | | +| main.rs:71:47:71:49 | url | main.rs:71:24:71:45 | ...::get | provenance | MaD:1 Sink:MaD:1 | models | 1 | Sink: reqwest::blocking::get; Argument[0]; request-url | | 2 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | @@ -37,32 +41,36 @@ models nodes | main.rs:12:22:12:43 | ...::get | semmle.label | ...::get | | main.rs:12:45:12:68 | "http://example.com/api" | semmle.label | "http://example.com/api" | -| main.rs:13:22:13:43 | ...::get | semmle.label | ...::get | -| main.rs:13:45:13:73 | "http://api.example.com/data" | semmle.label | "http://api.example.com/data" | -| main.rs:22:9:22:16 | base_url | semmle.label | base_url | -| main.rs:22:20:22:39 | "http://example.com" | semmle.label | "http://example.com" | -| main.rs:24:9:24:16 | full_url | semmle.label | full_url | -| main.rs:24:20:24:26 | res | semmle.label | res | -| main.rs:24:28:24:53 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:24:28:24:53 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| main.rs:24:28:24:53 | MacroExpr | semmle.label | MacroExpr | -| main.rs:24:28:24:53 | { ... } | semmle.label | { ... } | -| main.rs:25:21:25:42 | ...::get | semmle.label | ...::get | -| main.rs:25:44:25:52 | &full_url [&ref] | semmle.label | &full_url [&ref] | -| main.rs:25:45:25:52 | full_url | semmle.label | full_url | -| main.rs:33:9:33:16 | protocol | semmle.label | protocol | -| main.rs:33:20:33:28 | "http://" | semmle.label | "http://" | -| main.rs:35:9:35:20 | insecure_url | semmle.label | insecure_url | -| main.rs:35:24:35:30 | res | semmle.label | res | -| main.rs:35:32:35:53 | ...::format(...) | semmle.label | ...::format(...) | -| main.rs:35:32:35:53 | ...::must_use(...) | semmle.label | ...::must_use(...) | -| main.rs:35:32:35:53 | MacroExpr | semmle.label | MacroExpr | -| main.rs:35:32:35:53 | { ... } | semmle.label | { ... } | -| main.rs:36:30:36:51 | ...::get | semmle.label | ...::get | -| main.rs:36:53:36:65 | &insecure_url [&ref] | semmle.label | &insecure_url [&ref] | -| main.rs:36:54:36:65 | insecure_url | semmle.label | insecure_url | -| main.rs:60:13:60:15 | url | semmle.label | url | -| main.rs:60:19:60:53 | "http://example.com/sensitive-... | semmle.label | "http://example.com/sensitive-... | -| main.rs:63:24:63:45 | ...::get | semmle.label | ...::get | -| main.rs:63:47:63:49 | url | semmle.label | url | +| main.rs:14:22:14:43 | ...::get | semmle.label | ...::get | +| main.rs:14:45:14:73 | "http://api.example.com/data" | semmle.label | "http://api.example.com/data" | +| main.rs:23:9:23:16 | base_url | semmle.label | base_url | +| main.rs:23:20:23:39 | "http://example.com" | semmle.label | "http://example.com" | +| main.rs:25:9:25:16 | full_url | semmle.label | full_url | +| main.rs:25:20:25:26 | res | semmle.label | res | +| main.rs:25:28:25:53 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:25:28:25:53 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:25:28:25:53 | MacroExpr | semmle.label | MacroExpr | +| main.rs:25:28:25:53 | { ... } | semmle.label | { ... } | +| main.rs:26:21:26:42 | ...::get | semmle.label | ...::get | +| main.rs:26:44:26:52 | &full_url [&ref] | semmle.label | &full_url [&ref] | +| main.rs:26:45:26:52 | full_url | semmle.label | full_url | +| main.rs:34:9:34:16 | protocol | semmle.label | protocol | +| main.rs:34:20:34:28 | "http://" | semmle.label | "http://" | +| main.rs:36:9:36:20 | insecure_url | semmle.label | insecure_url | +| main.rs:36:24:36:30 | res | semmle.label | res | +| main.rs:36:32:36:53 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:36:32:36:53 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:36:32:36:53 | MacroExpr | semmle.label | MacroExpr | +| main.rs:36:32:36:53 | { ... } | semmle.label | { ... } | +| main.rs:37:30:37:51 | ...::get | semmle.label | ...::get | +| main.rs:37:53:37:65 | &insecure_url [&ref] | semmle.label | &insecure_url [&ref] | +| main.rs:37:54:37:65 | insecure_url | semmle.label | insecure_url | +| main.rs:53:19:53:40 | ...::get | semmle.label | ...::get | +| main.rs:53:42:53:68 | "http://172.31.255.255/bar" | semmle.label | "http://172.31.255.255/bar" | +| main.rs:60:20:60:41 | ...::get | semmle.label | ...::get | +| main.rs:60:43:60:65 | "http://172.32.0.0/baz" | semmle.label | "http://172.32.0.0/baz" | +| main.rs:68:13:68:15 | url | semmle.label | url | +| main.rs:68:19:68:53 | "http://example.com/sensitive-... | semmle.label | "http://example.com/sensitive-... | +| main.rs:71:24:71:45 | ...::get | semmle.label | ...::get | +| main.rs:71:47:71:49 | url | semmle.label | url | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-319/main.rs b/rust/ql/test/query-tests/security/CWE-319/main.rs index cec94840f29..0dd59ce0880 100644 --- a/rust/ql/test/query-tests/security/CWE-319/main.rs +++ b/rust/ql/test/query-tests/security/CWE-319/main.rs @@ -10,7 +10,8 @@ fn main() { fn test_direct_literals() { // BAD: Direct HTTP URLs that should be flagged let _response1 = reqwest::blocking::get("http://example.com/api").unwrap(); // $ Alert[rust/non-https-url] - let _response2 = reqwest::blocking::get("http://api.example.com/data").unwrap(); // $ Alert[rust/non-https-url] + let _response2 = reqwest::blocking::get("HTTP://EXAMPLE.COM/API").unwrap(); // $ MISSING: Alert[rust/non-https-url] + let _response3 = reqwest::blocking::get("http://api.example.com/data").unwrap(); // $ Alert[rust/non-https-url] // GOOD: HTTPS URLs that should not be flagged let _response3 = reqwest::blocking::get("https://example.com/api").unwrap(); @@ -44,13 +45,20 @@ fn test_dynamic_urls() { fn test_localhost_exemptions() { // GOOD: localhost URLs should not be flagged (local development) let _local1 = reqwest::blocking::get("http://localhost:8080/api").unwrap(); - let _local2 = reqwest::blocking::get("http://127.0.0.1:3000/test").unwrap(); - let _local3 = reqwest::blocking::get("http://192.168.1.100/internal").unwrap(); - let _local4 = reqwest::blocking::get("http://10.0.0.1/admin").unwrap(); + let _local2 = reqwest::blocking::get("HTTP://LOCALHOST:8080/api").unwrap(); + let _local3 = reqwest::blocking::get("http://127.0.0.1:3000/test").unwrap(); + let _local4 = reqwest::blocking::get("http://192.168.1.100/internal").unwrap(); + let _local5 = reqwest::blocking::get("http://10.0.0.1/admin").unwrap(); + let _local6 = reqwest::blocking::get("http://172.16.0.0/foo").unwrap(); + let _local7 = reqwest::blocking::get("http://172.31.255.255/bar").unwrap(); // $ SPURIOUS: Alert[rust/non-https-url] + + // GOOD: test IPv6 localhost variants + let _local8 = reqwest::blocking::get("http://[::1]:8080/api").unwrap(); + let _local9 = reqwest::blocking::get("http://[0:0:0:0:0:0:0:1]/test").unwrap(); + + // BAD: non-private IP address + let _local10 = reqwest::blocking::get("http://172.32.0.0/baz").unwrap(); // $ Alert[rust/non-https-url] - // Test IPv6 localhost variants - let _local5 = reqwest::blocking::get("http://[::1]:8080/api").unwrap(); - let _local6 = reqwest::blocking::get("http://[0:0:0:0:0:0:0:1]/test").unwrap(); } // Additional test cases that mirror the Bad/Good examples From 0f5aa857b874b22bfb53b67b08be2336e14af351 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:32:52 +0100 Subject: [PATCH 19/49] Rust: Remove unnecessary import. --- rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll | 1 - 1 file changed, 1 deletion(-) diff --git a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll index 026880785b6..8001e6270dd 100644 --- a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll @@ -6,7 +6,6 @@ import rust private import codeql.rust.dataflow.DataFlow private import codeql.rust.dataflow.FlowSink -private import codeql.rust.elements.LiteralExprExt private import codeql.rust.Concepts /** From 80ce55ab1072fb534776fc7b02a93ca6a2b18ce2 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:58:23 +0100 Subject: [PATCH 20/49] Rust: Make the private address spaces URL more accurate. --- rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll | 2 +- rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected | 4 ---- rust/ql/test/query-tests/security/CWE-319/main.rs | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll index 8001e6270dd..58466dd0a4f 100644 --- a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll @@ -38,7 +38,7 @@ module UseOfHttp { exists(string s | this.getTextValue() = s | // Match HTTP URLs that are not private/local s.regexpMatch("\"http://.*\"") and - not s.regexpMatch("\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.16\\.[0-9]+\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"") + not s.regexpMatch("\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.(1[6-9]|2[0-9]|3[01])\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"") ) } } diff --git a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected index 216d11b3606..ef99b001fcf 100644 --- a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected +++ b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected @@ -3,7 +3,6 @@ | main.rs:14:22:14:43 | ...::get | main.rs:14:45:14:73 | "http://api.example.com/data" | main.rs:14:22:14:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:14:45:14:73 | "http://api.example.com/data" | this HTTP URL | | main.rs:26:21:26:42 | ...::get | main.rs:23:20:23:39 | "http://example.com" | main.rs:26:21:26:42 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:23:20:23:39 | "http://example.com" | this HTTP URL | | main.rs:37:30:37:51 | ...::get | main.rs:34:20:34:28 | "http://" | main.rs:37:30:37:51 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:34:20:34:28 | "http://" | this HTTP URL | -| main.rs:53:19:53:40 | ...::get | main.rs:53:42:53:68 | "http://172.31.255.255/bar" | main.rs:53:19:53:40 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:53:42:53:68 | "http://172.31.255.255/bar" | this HTTP URL | | main.rs:60:20:60:41 | ...::get | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | main.rs:60:20:60:41 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | this HTTP URL | | main.rs:71:24:71:45 | ...::get | main.rs:68:19:68:53 | "http://example.com/sensitive-... | main.rs:71:24:71:45 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:68:19:68:53 | "http://example.com/sensitive-... | this HTTP URL | edges @@ -29,7 +28,6 @@ edges | main.rs:36:32:36:53 | { ... } | main.rs:36:32:36:53 | ...::must_use(...) | provenance | MaD:3 | | main.rs:37:53:37:65 | &insecure_url [&ref] | main.rs:37:30:37:51 | ...::get | provenance | MaD:1 Sink:MaD:1 | | main.rs:37:54:37:65 | insecure_url | main.rs:37:53:37:65 | &insecure_url [&ref] | provenance | | -| main.rs:53:42:53:68 | "http://172.31.255.255/bar" | main.rs:53:19:53:40 | ...::get | provenance | MaD:1 Sink:MaD:1 | | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | main.rs:60:20:60:41 | ...::get | provenance | MaD:1 Sink:MaD:1 | | main.rs:68:13:68:15 | url | main.rs:71:47:71:49 | url | provenance | | | main.rs:68:19:68:53 | "http://example.com/sensitive-... | main.rs:68:13:68:15 | url | provenance | | @@ -65,8 +63,6 @@ nodes | main.rs:37:30:37:51 | ...::get | semmle.label | ...::get | | main.rs:37:53:37:65 | &insecure_url [&ref] | semmle.label | &insecure_url [&ref] | | main.rs:37:54:37:65 | insecure_url | semmle.label | insecure_url | -| main.rs:53:19:53:40 | ...::get | semmle.label | ...::get | -| main.rs:53:42:53:68 | "http://172.31.255.255/bar" | semmle.label | "http://172.31.255.255/bar" | | main.rs:60:20:60:41 | ...::get | semmle.label | ...::get | | main.rs:60:43:60:65 | "http://172.32.0.0/baz" | semmle.label | "http://172.32.0.0/baz" | | main.rs:68:13:68:15 | url | semmle.label | url | diff --git a/rust/ql/test/query-tests/security/CWE-319/main.rs b/rust/ql/test/query-tests/security/CWE-319/main.rs index 0dd59ce0880..908e6c61c2c 100644 --- a/rust/ql/test/query-tests/security/CWE-319/main.rs +++ b/rust/ql/test/query-tests/security/CWE-319/main.rs @@ -50,7 +50,7 @@ fn test_localhost_exemptions() { let _local4 = reqwest::blocking::get("http://192.168.1.100/internal").unwrap(); let _local5 = reqwest::blocking::get("http://10.0.0.1/admin").unwrap(); let _local6 = reqwest::blocking::get("http://172.16.0.0/foo").unwrap(); - let _local7 = reqwest::blocking::get("http://172.31.255.255/bar").unwrap(); // $ SPURIOUS: Alert[rust/non-https-url] + let _local7 = reqwest::blocking::get("http://172.31.255.255/bar").unwrap(); // GOOD: test IPv6 localhost variants let _local8 = reqwest::blocking::get("http://[::1]:8080/api").unwrap(); From 4b281fdf12fb8a64cd194aee324ded70855b4695 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 16 Sep 2025 13:02:54 +0100 Subject: [PATCH 21/49] Rust: Use case insensitive regexps. --- rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll | 4 ++-- rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected | 4 ++++ rust/ql/test/query-tests/security/CWE-319/main.rs | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll index 58466dd0a4f..5e0d534fb7d 100644 --- a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll @@ -37,8 +37,8 @@ module UseOfHttp { HttpStringLiteral() { exists(string s | this.getTextValue() = s | // Match HTTP URLs that are not private/local - s.regexpMatch("\"http://.*\"") and - not s.regexpMatch("\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.(1[6-9]|2[0-9]|3[01])\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"") + s.regexpMatch("(?i)\"http://.*\"") and + not s.regexpMatch("(?i)\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.(1[6-9]|2[0-9]|3[01])\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"") ) } } diff --git a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected index ef99b001fcf..952bd741d1c 100644 --- a/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected +++ b/rust/ql/test/query-tests/security/CWE-319/UseOfHttp.expected @@ -1,5 +1,6 @@ #select | main.rs:12:22:12:43 | ...::get | main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:22:12:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:12:45:12:68 | "http://example.com/api" | this HTTP URL | +| main.rs:13:22:13:43 | ...::get | main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | main.rs:13:22:13:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | this HTTP URL | | main.rs:14:22:14:43 | ...::get | main.rs:14:45:14:73 | "http://api.example.com/data" | main.rs:14:22:14:43 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:14:45:14:73 | "http://api.example.com/data" | this HTTP URL | | main.rs:26:21:26:42 | ...::get | main.rs:23:20:23:39 | "http://example.com" | main.rs:26:21:26:42 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:23:20:23:39 | "http://example.com" | this HTTP URL | | main.rs:37:30:37:51 | ...::get | main.rs:34:20:34:28 | "http://" | main.rs:37:30:37:51 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:34:20:34:28 | "http://" | this HTTP URL | @@ -7,6 +8,7 @@ | main.rs:71:24:71:45 | ...::get | main.rs:68:19:68:53 | "http://example.com/sensitive-... | main.rs:71:24:71:45 | ...::get | This URL may be constructed with the HTTP protocol, from $@. | main.rs:68:19:68:53 | "http://example.com/sensitive-... | this HTTP URL | edges | main.rs:12:45:12:68 | "http://example.com/api" | main.rs:12:22:12:43 | ...::get | provenance | MaD:1 Sink:MaD:1 | +| main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | main.rs:13:22:13:43 | ...::get | provenance | MaD:1 Sink:MaD:1 | | main.rs:14:45:14:73 | "http://api.example.com/data" | main.rs:14:22:14:43 | ...::get | provenance | MaD:1 Sink:MaD:1 | | main.rs:23:9:23:16 | base_url | main.rs:25:28:25:53 | MacroExpr | provenance | | | main.rs:23:20:23:39 | "http://example.com" | main.rs:23:9:23:16 | base_url | provenance | | @@ -39,6 +41,8 @@ models nodes | main.rs:12:22:12:43 | ...::get | semmle.label | ...::get | | main.rs:12:45:12:68 | "http://example.com/api" | semmle.label | "http://example.com/api" | +| main.rs:13:22:13:43 | ...::get | semmle.label | ...::get | +| main.rs:13:45:13:68 | "HTTP://EXAMPLE.COM/API" | semmle.label | "HTTP://EXAMPLE.COM/API" | | main.rs:14:22:14:43 | ...::get | semmle.label | ...::get | | main.rs:14:45:14:73 | "http://api.example.com/data" | semmle.label | "http://api.example.com/data" | | main.rs:23:9:23:16 | base_url | semmle.label | base_url | diff --git a/rust/ql/test/query-tests/security/CWE-319/main.rs b/rust/ql/test/query-tests/security/CWE-319/main.rs index 908e6c61c2c..0a3539923da 100644 --- a/rust/ql/test/query-tests/security/CWE-319/main.rs +++ b/rust/ql/test/query-tests/security/CWE-319/main.rs @@ -10,7 +10,7 @@ fn main() { fn test_direct_literals() { // BAD: Direct HTTP URLs that should be flagged let _response1 = reqwest::blocking::get("http://example.com/api").unwrap(); // $ Alert[rust/non-https-url] - let _response2 = reqwest::blocking::get("HTTP://EXAMPLE.COM/API").unwrap(); // $ MISSING: Alert[rust/non-https-url] + let _response2 = reqwest::blocking::get("HTTP://EXAMPLE.COM/API").unwrap(); // $ Alert[rust/non-https-url] let _response3 = reqwest::blocking::get("http://api.example.com/data").unwrap(); // $ Alert[rust/non-https-url] // GOOD: HTTPS URLs that should not be flagged From 0eb602aad2991216268e79bbe5db05472f2156c0 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 16 Sep 2025 14:00:43 +0100 Subject: [PATCH 22/49] Rust: Update a redirected URL. --- .../src/queries/security/CWE-319/UseOfHttp.qhelp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp index a8ca1d9c7c7..a1345b189bb 100644 --- a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp +++ b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp @@ -6,21 +6,21 @@

    Constructing URLs with the HTTP protocol can lead to unsecured connections.

    -

    Furthermore, constructing URLs with the HTTP protocol can create problems if other parts of the -code expect HTTPS URLs. A typical pattern is to use libraries that expect secure connections, +

    Furthermore, constructing URLs with the HTTP protocol can create problems if other parts of the +code expect HTTPS URLs. A typical pattern is to use libraries that expect secure connections, which may fail or fall back to insecure behavior when provided with HTTP URLs instead of HTTPS URLs.

    -

    When you construct a URL for network requests, ensure that you use an HTTPS URL rather than an HTTP URL. +

    When you construct a URL for network requests, ensure that you use an HTTPS URL rather than an HTTP URL. Then, any connections that are made using that URL are secure SSL/TLS connections.

    -

    The following example shows two ways of making a network request using a URL. When the request is -made using an HTTP URL rather than an HTTPS URL, the connection is unsecured and can be intercepted +

    The following example shows two ways of making a network request using a URL. When the request is +made using an HTTP URL rather than an HTTPS URL, the connection is unsecured and can be intercepted by attackers. When the request is made using an HTTPS URL, the connection is a secure SSL/TLS connection.

    @@ -34,15 +34,15 @@ by attackers. When the request is made using an HTTPS URL, the connection is a s
  • OWASP: -Transport Layer Protection Cheat Sheet. +Transport Layer Security Cheat Sheet.
  • OWASP Top 10: A08:2021 - Software and Data Integrity Failures.
  • -
  • Rust reqwest documentation: +
  • Rust reqwest documentation: reqwest crate.
  • - \ No newline at end of file + From 31bf86fd1bcb60946c038d1329f132647bc60288 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 16 Sep 2025 14:04:47 +0100 Subject: [PATCH 23/49] Rust: Improve the flow around the qhelp example. --- rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp index a1345b189bb..e4e0fc5eaa9 100644 --- a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp +++ b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp @@ -19,13 +19,14 @@ Then, any connections that are made using that URL are secure SSL/TLS connection -

    The following example shows two ways of making a network request using a URL. When the request is +

    The following examples show two ways of making a network request using a URL. When the request is made using an HTTP URL rather than an HTTPS URL, the connection is unsecured and can be intercepted -by attackers. When the request is made using an HTTPS URL, the connection is a secure SSL/TLS connection.

    +by attackers:

    -

    A better approach is to use HTTPS:

    +

    A better approach is to use HTTPS. When the request is made using an HTTPS URL, the connection +is a secure SSL/TLS connection:

    From 220197484489f80467cee4cfcb3e975ed018d0d2 Mon Sep 17 00:00:00 2001 From: Alex Eyers-Taylor Date: Thu, 21 Aug 2025 19:48:21 +0100 Subject: [PATCH 24/49] Jave: Use force local to make parsing local after global regex finding. --- .../semmle/code/java/regex/RegexFlowConfigs.qll | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll b/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll index 6a934bdd578..929fa2d6c91 100644 --- a/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll +++ b/java/ql/lib/semmle/code/java/regex/RegexFlowConfigs.qll @@ -163,6 +163,12 @@ private module RegexFlowConfig implements DataFlow::ConfigSig { private module RegexFlow = DataFlow::Global; +private predicate usedAsRegexImpl(StringLiteral regex, string mode, boolean match_full_string) { + RegexFlow::flow(DataFlow::exprNode(regex), _) and + mode = "None" and // TODO: proper mode detection + (if matchesFullString(regex) then match_full_string = true else match_full_string = false) +} + /** * Holds if `regex` is used as a regex, with the mode `mode` (if known). * If regex mode is not known, `mode` will be `"None"`. @@ -170,11 +176,9 @@ private module RegexFlow = DataFlow::Global; * As an optimisation, only regexes containing an infinite repitition quatifier (`+`, `*`, or `{x,}`) * and therefore may be relevant for ReDoS queries are considered. */ -predicate usedAsRegex(StringLiteral regex, string mode, boolean match_full_string) { - RegexFlow::flow(DataFlow::exprNode(regex), _) and - mode = "None" and // TODO: proper mode detection - (if matchesFullString(regex) then match_full_string = true else match_full_string = false) -} +overlay[local] +predicate usedAsRegex(StringLiteral regex, string mode, boolean match_full_string) = + forceLocal(usedAsRegexImpl/3)(regex, mode, match_full_string) /** * Holds if `regex` is used as a regular expression that is matched against a full string, From 6f1fcbf41bf7484025a208af19a19630dc3a4df9 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 16 Sep 2025 17:08:22 +0100 Subject: [PATCH 25/49] Rust: Add IPv6 private address range (and explanatory comments). --- rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll index 5e0d534fb7d..bd91cde238f 100644 --- a/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/UseOfHttpExtensions.qll @@ -36,9 +36,12 @@ module UseOfHttp { class HttpStringLiteral extends StringLiteralExpr { HttpStringLiteral() { exists(string s | this.getTextValue() = s | - // Match HTTP URLs that are not private/local + // match HTTP URLs s.regexpMatch("(?i)\"http://.*\"") and - not s.regexpMatch("(?i)\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.(1[6-9]|2[0-9]|3[01])\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]).*\"") + // exclude private/local addresses: + // - IPv4: localhost / 127.0.0.1, 192.168.x.x, 10.x.x.x, 172.16.x.x -> 172.31.x.x + // - IPv6 (address inside []): ::1 (or 0:0:0:0:0:0:0:1), fc00::/7 (i.e. anything beginning `fcxx:` or `fdxx:`) + not s.regexpMatch("(?i)\"http://(localhost|127\\.0\\.0\\.1|192\\.168\\.[0-9]+\\.[0-9]+|10\\.[0-9]+\\.[0-9]+\\.[0-9]+|172\\.(1[6-9]|2[0-9]|3[01])\\.[0-9]+|\\[::1\\]|\\[0:0:0:0:0:0:0:1\\]|\\[f[cd][0-9a-f]{2}:.*\\]).*\"") ) } } From 1bccf42556fa214a6e7d44e3f0322cc09d008b09 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 17 Sep 2025 13:59:54 +0100 Subject: [PATCH 26/49] Rust: Update test results following fix on main. --- .../library-tests/dataflow/local/DataFlowStep.expected | 5 +++-- .../library-tests/dataflow/local/inline-flow.expected | 8 ++++++++ rust/ql/test/library-tests/dataflow/local/main.rs | 2 +- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected index 0af30149e74..b2fc845081c 100644 --- a/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected +++ b/rust/ql/test/library-tests/dataflow/local/DataFlowStep.expected @@ -111,11 +111,12 @@ localStep | main.rs:77:9:77:9 | k | main.rs:77:5:77:5 | j | | main.rs:77:9:77:9 | k | main.rs:79:10:79:10 | k | | main.rs:81:9:81:13 | mut l | main.rs:81:13:81:13 | l | +| main.rs:81:13:81:13 | [SSA] l | main.rs:82:9:82:9 | l | +| main.rs:81:13:81:13 | l | main.rs:81:13:81:13 | [SSA] l | | main.rs:81:17:81:25 | source(...) | main.rs:81:9:81:13 | mut l | -| main.rs:82:5:82:5 | [SSA] l | main.rs:82:9:82:9 | l | +| main.rs:82:5:82:5 | [SSA] l | main.rs:83:10:83:10 | l | | main.rs:82:5:82:5 | l | main.rs:82:5:82:5 | [SSA] l | | main.rs:82:9:82:9 | l | main.rs:82:5:82:5 | l | -| main.rs:82:9:82:9 | l | main.rs:83:10:83:10 | l | | main.rs:87:9:87:9 | [SSA] a | main.rs:88:5:88:5 | a | | main.rs:87:9:87:9 | a | main.rs:87:9:87:9 | [SSA] a | | main.rs:87:9:87:9 | a | main.rs:87:9:87:9 | a | diff --git a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected index eafe3a7452e..00640ed9aa4 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -31,6 +31,9 @@ edges | main.rs:76:9:76:9 | k | main.rs:79:10:79:10 | k | provenance | | | main.rs:76:13:76:21 | source(...) | main.rs:76:9:76:9 | k | provenance | | | main.rs:77:5:77:5 | j | main.rs:78:10:78:10 | j | provenance | | +| main.rs:81:9:81:13 | mut l | main.rs:82:5:82:5 | l | provenance | | +| main.rs:81:17:81:25 | source(...) | main.rs:81:9:81:13 | mut l | provenance | | +| main.rs:82:5:82:5 | l | main.rs:83:10:83:10 | l | provenance | | | main.rs:115:9:115:9 | i [&ref] | main.rs:116:11:116:11 | i [&ref] | provenance | | | main.rs:115:13:115:31 | ...::new(...) [&ref] | main.rs:115:9:115:9 | i [&ref] | provenance | | | main.rs:115:22:115:30 | source(...) | main.rs:115:13:115:31 | ...::new(...) [&ref] | provenance | MaD:1 | @@ -279,6 +282,10 @@ nodes | main.rs:77:5:77:5 | j | semmle.label | j | | main.rs:78:10:78:10 | j | semmle.label | j | | main.rs:79:10:79:10 | k | semmle.label | k | +| main.rs:81:9:81:13 | mut l | semmle.label | mut l | +| main.rs:81:17:81:25 | source(...) | semmle.label | source(...) | +| main.rs:82:5:82:5 | l | semmle.label | l | +| main.rs:83:10:83:10 | l | semmle.label | l | | main.rs:115:9:115:9 | i [&ref] | semmle.label | i [&ref] | | main.rs:115:13:115:31 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | | main.rs:115:22:115:30 | source(...) | semmle.label | source(...) | @@ -553,6 +560,7 @@ testFailures | main.rs:71:10:71:10 | i | main.rs:70:9:70:17 | source(...) | main.rs:71:10:71:10 | i | $@ | main.rs:70:9:70:17 | source(...) | source(...) | | main.rs:78:10:78:10 | j | main.rs:76:13:76:21 | source(...) | main.rs:78:10:78:10 | j | $@ | main.rs:76:13:76:21 | source(...) | source(...) | | main.rs:79:10:79:10 | k | main.rs:76:13:76:21 | source(...) | main.rs:79:10:79:10 | k | $@ | main.rs:76:13:76:21 | source(...) | source(...) | +| main.rs:83:10:83:10 | l | main.rs:81:17:81:25 | source(...) | main.rs:83:10:83:10 | l | $@ | main.rs:81:17:81:25 | source(...) | source(...) | | main.rs:116:10:116:11 | * ... | main.rs:115:22:115:30 | source(...) | main.rs:116:10:116:11 | * ... | $@ | main.rs:115:22:115:30 | source(...) | source(...) | | main.rs:124:10:124:12 | a.0 | main.rs:123:14:123:22 | source(...) | main.rs:124:10:124:12 | a.0 | $@ | main.rs:123:14:123:22 | source(...) | source(...) | | main.rs:132:10:132:11 | a1 | main.rs:129:17:129:26 | source(...) | main.rs:132:10:132:11 | a1 | $@ | main.rs:129:17:129:26 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/local/main.rs b/rust/ql/test/library-tests/dataflow/local/main.rs index d352eb0cbf1..7cab42da52b 100644 --- a/rust/ql/test/library-tests/dataflow/local/main.rs +++ b/rust/ql/test/library-tests/dataflow/local/main.rs @@ -80,7 +80,7 @@ fn assignment() { let mut l = source(8); l = l; - sink(l); // $ MISSING: hasValueFlow=8 + sink(l); // $ hasValueFlow=8 } fn block_expression1() -> i64 { From d5a238768c6c232620dbc8912fd2e60f62029668 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 17 Sep 2025 16:37:23 +0200 Subject: [PATCH 27/49] Shared/Cfg: Fix missing JoinBlockPredecessor. --- shared/controlflow/codeql/controlflow/Cfg.qll | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/shared/controlflow/codeql/controlflow/Cfg.qll b/shared/controlflow/codeql/controlflow/Cfg.qll index 4945c8da9cf..9e094385405 100644 --- a/shared/controlflow/codeql/controlflow/Cfg.qll +++ b/shared/controlflow/codeql/controlflow/Cfg.qll @@ -1020,6 +1020,12 @@ module MakeWithSplitting< not jbp instanceof BasicBlocks::EntryBasicBlock and id = idOfAstNode(jbp.getFirstNode().(AstCfgNode).getAstNode()) and kind = 1 + or + exists(AnnotatedExitNode aen | + jbp.getFirstNode() = aen and + id = idOfCfgScope(aen.getScope()) and + if aen.isNormal() then kind = 2 else kind = 3 + ) } string getSplitString(BasicBlocks::JoinPredecessorBasicBlock jbp) { From 34b40a14e876481909726ce811663a9683d1d62a Mon Sep 17 00:00:00 2001 From: Alex Eyers-Taylor Date: Wed, 17 Sep 2025 16:22:22 +0100 Subject: [PATCH 28/49] Java: Make a TC overlay caller. --- java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll | 1 + 1 file changed, 1 insertion(+) diff --git a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll index 4b436edc6aa..23e9f680c97 100644 --- a/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll +++ b/java/ql/lib/semmle/code/java/dataflow/internal/DataFlowUtil.qll @@ -83,6 +83,7 @@ overlay[caller?] pragma[inline] predicate localFlow(Node node1, Node node2) { node1 = node2 or localFlowStepPlus(node1, node2) } +overlay[caller?] private predicate localFlowStepPlus(Node node1, Node node2) = fastTC(localFlowStep/2)(node1, node2) /** From aba2cb487e7ef76dee681c2af85f789091e09670 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 17 Sep 2025 20:27:10 +0200 Subject: [PATCH 29/49] Rust: Convert data flow test to `@kind path-problem` --- .../dataflow/sources/InlineFlow.expected | 1779 +++++++++++++++++ .../dataflow/sources/InlineFlow.ql | 9 + 2 files changed, 1788 insertions(+) diff --git a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected index e69de29bb2d..88a728253d8 100644 --- a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected @@ -0,0 +1,1779 @@ +models +| 1 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 2 | Source: ::send_request; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 3 | Source: ::file_name; ReturnValue; file | +| 4 | Source: ::path; ReturnValue; file | +| 5 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 6 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 7 | Source: ::connect; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 8 | Source: ::connect_timeout; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 9 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 10 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 11 | Source: ::file_name; ReturnValue; file | +| 12 | Source: ::path; ReturnValue; file | +| 13 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 14 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 15 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 16 | Source: std::env::args; ReturnValue.Element; commandargs | +| 17 | Source: std::env::args_os; ReturnValue.Element; commandargs | +| 18 | Source: std::env::current_dir; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs | +| 19 | Source: std::env::current_exe; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs | +| 20 | Source: std::env::home_dir; ReturnValue.Field[core::option::Option::Some(0)]; commandargs | +| 21 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | +| 22 | Source: std::env::var_os; ReturnValue.Field[core::option::Option::Some(0)]; environment | +| 23 | Source: std::fs::read; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 24 | Source: std::fs::read; ReturnValue; file | +| 25 | Source: std::fs::read_link; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 26 | Source: std::fs::read_to_string; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 27 | Source: std::fs::read_to_string; ReturnValue; file | +| 28 | Source: std::io::stdio::stdin; ReturnValue; stdin | +| 29 | Source: tokio::fs::read::read; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 30 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 31 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 32 | Source: tokio::io::stdin::stdin; ReturnValue; stdin | +| 33 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 34 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | +| 35 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 36 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | +| 37 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 38 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 39 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | +| 40 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 41 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | +| 42 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 43 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | +| 44 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 45 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 46 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint | +| 47 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint | +| 48 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint | +| 49 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint | +| 50 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | +| 51 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint | +| 52 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint | +| 53 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint | +| 54 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint | +| 55 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 56 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 57 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | +| 58 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 59 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint | +| 60 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | +| 61 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | +| 62 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint | +| 63 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | +| 64 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint | +| 65 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint | +| 66 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 67 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 68 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 69 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 70 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 71 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 72 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 73 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 74 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 75 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 76 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 77 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value | +| 78 | Summary: ::new; Argument[0]; ReturnValue; value | +| 79 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 80 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 81 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 82 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 83 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 84 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 85 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 86 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 87 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 88 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 89 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 90 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 91 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 92 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 93 | Summary: ::read; Argument[self]; Argument[0]; taint | +| 94 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 95 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint | +| 96 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 97 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | +| 98 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint | +| 99 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 100 | Summary: ::buffer; Argument[self]; ReturnValue; taint | +| 101 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 102 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 103 | Summary: ::read; Argument[self]; Argument[0]; taint | +| 104 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint | +| 105 | Summary: ::read_exact; Argument[self]; Argument[0]; taint | +| 106 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 107 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 108 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | +| 109 | Summary: ::lock; Argument[self]; ReturnValue; taint | +| 110 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 111 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 112 | Summary: ::as_path; Argument[self]; ReturnValue; value | +| 113 | Summary: ::buffer; Argument[self]; ReturnValue; taint | +| 114 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 115 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 116 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 117 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint | +| 118 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint | +| 119 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint | +edges +| test.rs:8:10:8:22 | ...::var | test.rs:8:10:8:30 | ...::var(...) | provenance | Src:MaD:21 | +| test.rs:9:10:9:25 | ...::var_os | test.rs:9:10:9:33 | ...::var_os(...) | provenance | Src:MaD:22 | +| test.rs:11:9:11:12 | var1 | test.rs:14:10:14:13 | var1 | provenance | | +| test.rs:11:16:11:28 | ...::var | test.rs:11:16:11:36 | ...::var(...) [Ok] | provenance | Src:MaD:21 | +| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:79 | +| test.rs:11:16:11:59 | ... .expect(...) | test.rs:11:9:11:12 | var1 | provenance | | +| test.rs:12:9:12:12 | var2 | test.rs:15:10:15:13 | var2 | provenance | | +| test.rs:12:16:12:31 | ...::var_os | test.rs:12:16:12:39 | ...::var_os(...) [Some] | provenance | Src:MaD:22 | +| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:75 | +| test.rs:12:16:12:48 | ... .unwrap() | test.rs:12:9:12:12 | var2 | provenance | | +| test.rs:29:9:29:12 | args [element] | test.rs:30:20:30:23 | args [element] | provenance | | +| test.rs:29:9:29:12 | args [element] | test.rs:31:17:31:20 | args [element] | provenance | | +| test.rs:29:29:29:42 | ...::args | test.rs:29:29:29:44 | ...::args(...) [element] | provenance | Src:MaD:16 | +| test.rs:29:29:29:44 | ...::args(...) [element] | test.rs:29:29:29:54 | ... .collect() [element] | provenance | MaD:34 | +| test.rs:29:29:29:54 | ... .collect() [element] | test.rs:29:9:29:12 | args [element] | provenance | | +| test.rs:30:9:30:15 | my_path [&ref] | test.rs:36:10:36:16 | my_path | provenance | | +| test.rs:30:19:30:26 | &... [&ref] | test.rs:30:9:30:15 | my_path [&ref] | provenance | | +| test.rs:30:20:30:23 | args [element] | test.rs:30:20:30:26 | args[0] | provenance | | +| test.rs:30:20:30:26 | args[0] | test.rs:30:19:30:26 | &... [&ref] | provenance | | +| test.rs:31:9:31:12 | arg1 [&ref] | test.rs:37:10:37:13 | arg1 | provenance | | +| test.rs:31:16:31:23 | &... [&ref] | test.rs:31:9:31:12 | arg1 [&ref] | provenance | | +| test.rs:31:17:31:20 | args [element] | test.rs:31:17:31:23 | args[1] | provenance | | +| test.rs:31:17:31:23 | args[1] | test.rs:31:16:31:23 | &... [&ref] | provenance | | +| test.rs:32:9:32:12 | arg2 | test.rs:38:10:38:13 | arg2 | provenance | | +| test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:16 | +| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:35 | +| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:75 | +| test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:9:32:12 | arg2 | provenance | | +| test.rs:33:9:33:12 | arg3 | test.rs:39:10:39:13 | arg3 | provenance | | +| test.rs:33:16:33:32 | ...::args_os | test.rs:33:16:33:34 | ...::args_os(...) [element] | provenance | Src:MaD:17 | +| test.rs:33:16:33:34 | ...::args_os(...) [element] | test.rs:33:16:33:41 | ... .nth(...) [Some] | provenance | MaD:35 | +| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:75 | +| test.rs:33:16:33:50 | ... .unwrap() | test.rs:33:9:33:12 | arg3 | provenance | | +| test.rs:34:9:34:12 | arg4 | test.rs:40:10:40:13 | arg4 | provenance | | +| test.rs:34:16:34:29 | ...::args | test.rs:34:16:34:31 | ...::args(...) [element] | provenance | Src:MaD:16 | +| test.rs:34:16:34:31 | ...::args(...) [element] | test.rs:34:16:34:38 | ... .nth(...) [Some] | provenance | MaD:35 | +| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:75 | +| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:83 | +| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:80 | +| test.rs:34:16:34:73 | ... .unwrap() | test.rs:34:9:34:12 | arg4 | provenance | | +| test.rs:42:9:42:11 | arg | test.rs:43:14:43:16 | arg | provenance | | +| test.rs:42:16:42:29 | ...::args | test.rs:42:16:42:31 | ...::args(...) [element] | provenance | Src:MaD:16 | +| test.rs:42:16:42:31 | ...::args(...) [element] | test.rs:42:9:42:11 | arg | provenance | | +| test.rs:46:9:46:11 | arg | test.rs:47:14:47:16 | arg | provenance | | +| test.rs:46:16:46:32 | ...::args_os | test.rs:46:16:46:34 | ...::args_os(...) [element] | provenance | Src:MaD:17 | +| test.rs:46:16:46:34 | ...::args_os(...) [element] | test.rs:46:9:46:11 | arg | provenance | | +| test.rs:52:9:52:11 | dir | test.rs:56:10:56:12 | dir | provenance | | +| test.rs:52:15:52:35 | ...::current_dir | test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:18 | +| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:79 | +| test.rs:52:15:52:54 | ... .expect(...) | test.rs:52:9:52:11 | dir | provenance | | +| test.rs:53:9:53:11 | exe | test.rs:57:10:57:12 | exe | provenance | | +| test.rs:53:15:53:35 | ...::current_exe | test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:19 | +| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:79 | +| test.rs:53:15:53:54 | ... .expect(...) | test.rs:53:9:53:11 | exe | provenance | | +| test.rs:54:9:54:12 | home | test.rs:58:10:58:13 | home | provenance | | +| test.rs:54:16:54:33 | ...::home_dir | test.rs:54:16:54:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:20 | +| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:74 | +| test.rs:54:16:54:52 | ... .expect(...) | test.rs:54:9:54:12 | home | provenance | | +| test.rs:62:9:62:22 | remote_string1 | test.rs:63:10:63:23 | remote_string1 | provenance | | +| test.rs:62:26:62:47 | ...::get | test.rs:62:26:62:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 | +| test.rs:62:26:62:62 | ...::get(...) [Ok] | test.rs:62:26:62:63 | TryExpr | provenance | | +| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:90 | +| test.rs:62:26:62:70 | ... .text() [Ok] | test.rs:62:26:62:71 | TryExpr | provenance | | +| test.rs:62:26:62:71 | TryExpr | test.rs:62:9:62:22 | remote_string1 | provenance | | +| test.rs:65:9:65:22 | remote_string2 | test.rs:66:10:66:23 | remote_string2 | provenance | | +| test.rs:65:26:65:47 | ...::get | test.rs:65:26:65:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 | +| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:80 | +| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:90 | +| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:80 | +| test.rs:65:26:65:87 | ... .unwrap() | test.rs:65:9:65:22 | remote_string2 | provenance | | +| test.rs:68:9:68:22 | remote_string3 | test.rs:69:10:69:23 | remote_string3 | provenance | | +| test.rs:68:26:68:47 | ...::get | test.rs:68:26:68:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 | +| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:80 | +| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:91 | +| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:80 | +| test.rs:68:26:68:107 | ... .unwrap() | test.rs:68:9:68:22 | remote_string3 | provenance | | +| test.rs:71:9:71:22 | remote_string4 | test.rs:72:10:72:23 | remote_string4 | provenance | | +| test.rs:71:26:71:47 | ...::get | test.rs:71:26:71:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 | +| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:80 | +| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:89 | +| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:80 | +| test.rs:71:26:71:88 | ... .unwrap() | test.rs:71:9:71:22 | remote_string4 | provenance | | +| test.rs:74:9:74:22 | remote_string5 | test.rs:75:10:75:23 | remote_string5 | provenance | | +| test.rs:74:26:74:37 | ...::get | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:15 | +| test.rs:74:26:74:52 | ...::get(...) [future, Ok] | test.rs:74:26:74:58 | await ... [Ok] | provenance | | +| test.rs:74:26:74:58 | await ... [Ok] | test.rs:74:26:74:59 | TryExpr | provenance | | +| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:88 | +| test.rs:74:26:74:66 | ... .text() [future, Ok] | test.rs:74:26:74:72 | await ... [Ok] | provenance | | +| test.rs:74:26:74:72 | await ... [Ok] | test.rs:74:26:74:73 | TryExpr | provenance | | +| test.rs:74:26:74:73 | TryExpr | test.rs:74:9:74:22 | remote_string5 | provenance | | +| test.rs:77:9:77:22 | remote_string6 | test.rs:78:10:78:23 | remote_string6 | provenance | | +| test.rs:77:26:77:37 | ...::get | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:15 | +| test.rs:77:26:77:52 | ...::get(...) [future, Ok] | test.rs:77:26:77:58 | await ... [Ok] | provenance | | +| test.rs:77:26:77:58 | await ... [Ok] | test.rs:77:26:77:59 | TryExpr | provenance | | +| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:86 | +| test.rs:77:26:77:67 | ... .bytes() [future, Ok] | test.rs:77:26:77:73 | await ... [Ok] | provenance | | +| test.rs:77:26:77:73 | await ... [Ok] | test.rs:77:26:77:74 | TryExpr | provenance | | +| test.rs:77:26:77:74 | TryExpr | test.rs:77:9:77:22 | remote_string6 | provenance | | +| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:87 | +| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:87 | +| test.rs:80:24:80:35 | ...::get | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:15 | +| test.rs:80:24:80:50 | ...::get(...) [future, Ok] | test.rs:80:24:80:56 | await ... [Ok] | provenance | | +| test.rs:80:24:80:56 | await ... [Ok] | test.rs:80:24:80:57 | TryExpr | provenance | | +| test.rs:80:24:80:57 | TryExpr | test.rs:80:9:80:20 | mut request1 | provenance | | +| test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | test.rs:81:10:81:31 | await ... [Ok, Some] | provenance | | +| test.rs:81:10:81:31 | await ... [Ok, Some] | test.rs:81:10:81:32 | TryExpr [Some] | provenance | | +| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:75 | +| test.rs:82:15:82:25 | Some(...) [Some] | test.rs:82:20:82:24 | chunk | provenance | | +| test.rs:82:20:82:24 | chunk | test.rs:83:14:83:18 | chunk | provenance | | +| test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | test.rs:82:29:82:50 | await ... [Ok, Some] | provenance | | +| test.rs:82:29:82:50 | await ... [Ok, Some] | test.rs:82:29:82:51 | TryExpr [Some] | provenance | | +| test.rs:82:29:82:51 | TryExpr [Some] | test.rs:82:15:82:25 | Some(...) [Some] | provenance | | +| test.rs:114:13:114:20 | response | test.rs:115:15:115:22 | response | provenance | | +| test.rs:114:13:114:20 | response | test.rs:116:14:116:21 | response | provenance | | +| test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | test.rs:114:24:114:57 | await ... [Ok] | provenance | | +| test.rs:114:24:114:57 | await ... [Ok] | test.rs:114:24:114:58 | TryExpr | provenance | | +| test.rs:114:24:114:58 | TryExpr | test.rs:114:13:114:20 | response | provenance | | +| test.rs:114:31:114:42 | send_request | test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | +| test.rs:115:15:115:22 | response | test.rs:115:14:115:22 | &response | provenance | | +| test.rs:121:9:121:20 | mut response | test.rs:122:11:122:18 | response | provenance | | +| test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | test.rs:121:24:121:57 | await ... [Ok] | provenance | | +| test.rs:121:24:121:57 | await ... [Ok] | test.rs:121:24:121:58 | TryExpr | provenance | | +| test.rs:121:24:121:58 | TryExpr | test.rs:121:9:121:20 | mut response | provenance | | +| test.rs:121:31:121:42 | send_request | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | +| test.rs:122:11:122:18 | response | test.rs:122:10:122:18 | &response | provenance | | +| test.rs:211:22:211:35 | ...::stdin | test.rs:211:22:211:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:103 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:53 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:102 | +| test.rs:211:44:211:54 | [post] &mut buffer | test.rs:212:15:212:20 | buffer | provenance | | +| test.rs:211:44:211:54 | [post] &mut buffer [&ref] | test.rs:211:49:211:54 | [post] buffer | provenance | | +| test.rs:211:49:211:54 | [post] buffer | test.rs:212:15:212:20 | buffer | provenance | | +| test.rs:212:15:212:20 | buffer | test.rs:212:14:212:20 | &buffer | provenance | | +| test.rs:217:22:217:35 | ...::stdin | test.rs:217:22:217:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:55 | +| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:106 | +| test.rs:217:51:217:61 | [post] &mut buffer [&ref] | test.rs:217:56:217:61 | [post] buffer | provenance | | +| test.rs:217:56:217:61 | [post] buffer | test.rs:218:15:218:20 | buffer | provenance | | +| test.rs:218:15:218:20 | buffer | test.rs:218:14:218:20 | &buffer | provenance | | +| test.rs:223:22:223:35 | ...::stdin | test.rs:223:22:223:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:108 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:56 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:107 | +| test.rs:223:54:223:64 | [post] &mut buffer | test.rs:224:15:224:20 | buffer | provenance | | +| test.rs:223:54:223:64 | [post] &mut buffer [&ref] | test.rs:223:59:223:64 | [post] buffer | provenance | | +| test.rs:223:59:223:64 | [post] buffer | test.rs:224:15:224:20 | buffer | provenance | | +| test.rs:224:15:224:20 | buffer | test.rs:224:14:224:20 | &buffer | provenance | | +| test.rs:229:22:229:35 | ...::stdin | test.rs:229:22:229:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:109 | +| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:56 | +| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:110 | +| test.rs:229:61:229:71 | [post] &mut buffer [&ref] | test.rs:229:66:229:71 | [post] buffer | provenance | | +| test.rs:229:66:229:71 | [post] buffer | test.rs:230:15:230:20 | buffer | provenance | | +| test.rs:230:15:230:20 | buffer | test.rs:230:14:230:20 | &buffer | provenance | | +| test.rs:235:9:235:22 | ...::stdin | test.rs:235:9:235:24 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:105 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:54 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:104 | +| test.rs:235:37:235:47 | [post] &mut buffer | test.rs:236:15:236:20 | buffer | provenance | | +| test.rs:235:37:235:47 | [post] &mut buffer [&ref] | test.rs:235:42:235:47 | [post] buffer | provenance | | +| test.rs:235:42:235:47 | [post] buffer | test.rs:236:15:236:20 | buffer | provenance | | +| test.rs:236:15:236:20 | buffer | test.rs:236:14:236:20 | &buffer | provenance | | +| test.rs:239:17:239:30 | ...::stdin | test.rs:239:17:239:32 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:239:17:239:32 | ...::stdin(...) | test.rs:239:17:239:40 | ... .bytes() | provenance | MaD:50 | +| test.rs:239:17:239:40 | ... .bytes() | test.rs:240:14:240:17 | byte | provenance | | +| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:99 | +| test.rs:246:26:246:66 | ...::new(...) | test.rs:246:13:246:22 | mut reader | provenance | | +| test.rs:246:50:246:63 | ...::stdin | test.rs:246:50:246:65 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:101 | +| test.rs:247:13:247:16 | data | test.rs:248:15:248:18 | data | provenance | | +| test.rs:247:20:247:36 | reader.fill_buf() [Ok] | test.rs:247:20:247:37 | TryExpr | provenance | | +| test.rs:247:20:247:37 | TryExpr | test.rs:247:13:247:16 | data | provenance | | +| test.rs:248:15:248:18 | data | test.rs:248:14:248:18 | &data | provenance | | +| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:100 | +| test.rs:252:22:252:62 | ...::new(...) | test.rs:252:13:252:18 | reader | provenance | | +| test.rs:252:46:252:59 | ...::stdin | test.rs:252:46:252:61 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:101 | +| test.rs:253:13:253:16 | data | test.rs:254:15:254:18 | data | provenance | | +| test.rs:253:20:253:34 | reader.buffer() | test.rs:253:13:253:16 | data | provenance | | +| test.rs:254:15:254:18 | data | test.rs:254:14:254:18 | &data | provenance | | +| test.rs:259:13:259:22 | mut reader | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | provenance | MaD:47 | +| test.rs:259:26:259:66 | ...::new(...) | test.rs:259:13:259:22 | mut reader | provenance | | +| test.rs:259:50:259:63 | ...::stdin | test.rs:259:50:259:65 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:101 | +| test.rs:260:26:260:36 | [post] &mut buffer [&ref] | test.rs:260:31:260:36 | [post] buffer | provenance | | +| test.rs:260:31:260:36 | [post] buffer | test.rs:261:15:261:20 | buffer | provenance | | +| test.rs:261:15:261:20 | buffer | test.rs:261:14:261:20 | &buffer | provenance | | +| test.rs:266:13:266:22 | mut reader | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | provenance | MaD:48 | +| test.rs:266:26:266:66 | ...::new(...) | test.rs:266:13:266:22 | mut reader | provenance | | +| test.rs:266:50:266:63 | ...::stdin | test.rs:266:50:266:65 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:101 | +| test.rs:267:33:267:43 | [post] &mut buffer [&ref] | test.rs:267:38:267:43 | [post] buffer | provenance | | +| test.rs:267:38:267:43 | [post] buffer | test.rs:268:15:268:20 | buffer | provenance | | +| test.rs:267:38:267:43 | [post] buffer | test.rs:269:14:269:22 | buffer[0] | provenance | | +| test.rs:268:15:268:20 | buffer | test.rs:268:14:268:20 | &buffer | provenance | | +| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:98 | +| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:98 | +| test.rs:273:32:273:72 | ...::new(...) | test.rs:273:32:273:84 | ... .split(...) | provenance | MaD:49 | +| test.rs:273:32:273:84 | ... .split(...) | test.rs:273:13:273:28 | mut reader_split | provenance | | +| test.rs:273:56:273:69 | ...::stdin | test.rs:273:56:273:71 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:101 | +| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:75 | +| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:80 | +| test.rs:275:19:275:29 | Some(...) [Some, Ok] | test.rs:275:24:275:28 | chunk [Ok] | provenance | | +| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:80 | +| test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | test.rs:275:19:275:29 | Some(...) [Some, Ok] | provenance | | +| test.rs:281:13:281:18 | reader | test.rs:282:21:282:34 | reader.lines() | provenance | MaD:46 | +| test.rs:281:22:281:62 | ...::new(...) | test.rs:281:13:281:18 | reader | provenance | | +| test.rs:281:46:281:59 | ...::stdin | test.rs:281:46:281:61 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | +| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:101 | +| test.rs:282:21:282:34 | reader.lines() | test.rs:283:18:283:21 | line | provenance | | +| test.rs:309:13:309:21 | mut stdin | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | provenance | MaD:63 | +| test.rs:309:25:309:40 | ...::stdin | test.rs:309:25:309:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:309:25:309:42 | ...::stdin(...) | test.rs:309:13:309:21 | mut stdin | provenance | | +| test.rs:311:33:311:43 | [post] &mut buffer [&ref] | test.rs:311:38:311:43 | [post] buffer | provenance | | +| test.rs:311:38:311:43 | [post] buffer | test.rs:312:15:312:20 | buffer | provenance | | +| test.rs:312:15:312:20 | buffer | test.rs:312:14:312:20 | &buffer | provenance | | +| test.rs:316:13:316:21 | mut stdin | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | provenance | MaD:69 | +| test.rs:316:25:316:40 | ...::stdin | test.rs:316:25:316:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:316:25:316:42 | ...::stdin(...) | test.rs:316:13:316:21 | mut stdin | provenance | | +| test.rs:318:40:318:50 | [post] &mut buffer [&ref] | test.rs:318:45:318:50 | [post] buffer | provenance | | +| test.rs:318:45:318:50 | [post] buffer | test.rs:319:15:319:20 | buffer | provenance | | +| test.rs:319:15:319:20 | buffer | test.rs:319:14:319:20 | &buffer | provenance | | +| test.rs:323:13:323:21 | mut stdin | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | provenance | MaD:70 | +| test.rs:323:25:323:40 | ...::stdin | test.rs:323:25:323:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:323:25:323:42 | ...::stdin(...) | test.rs:323:13:323:21 | mut stdin | provenance | | +| test.rs:325:43:325:53 | [post] &mut buffer [&ref] | test.rs:325:48:325:53 | [post] buffer | provenance | | +| test.rs:325:48:325:53 | [post] buffer | test.rs:326:15:326:20 | buffer | provenance | | +| test.rs:326:15:326:20 | buffer | test.rs:326:14:326:20 | &buffer | provenance | | +| test.rs:330:13:330:21 | mut stdin | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | provenance | MaD:65 | +| test.rs:330:25:330:40 | ...::stdin | test.rs:330:25:330:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:330:25:330:42 | ...::stdin(...) | test.rs:330:13:330:21 | mut stdin | provenance | | +| test.rs:332:26:332:36 | [post] &mut buffer [&ref] | test.rs:332:31:332:36 | [post] buffer | provenance | | +| test.rs:332:31:332:36 | [post] buffer | test.rs:333:15:333:20 | buffer | provenance | | +| test.rs:333:15:333:20 | buffer | test.rs:333:14:333:20 | &buffer | provenance | | +| test.rs:337:13:337:21 | mut stdin | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | provenance | MaD:71 | +| test.rs:337:13:337:21 | mut stdin | test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | provenance | MaD:67 | +| test.rs:337:13:337:21 | mut stdin | test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | provenance | MaD:66 | +| test.rs:337:13:337:21 | mut stdin | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:68 | +| test.rs:337:25:337:40 | ...::stdin | test.rs:337:25:337:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:337:25:337:42 | ...::stdin(...) | test.rs:337:13:337:21 | mut stdin | provenance | | +| test.rs:338:13:338:14 | v1 | test.rs:342:14:342:15 | v1 | provenance | | +| test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | test.rs:338:18:338:38 | await ... [Ok] | provenance | | +| test.rs:338:18:338:38 | await ... [Ok] | test.rs:338:18:338:39 | TryExpr | provenance | | +| test.rs:338:18:338:39 | TryExpr | test.rs:338:13:338:14 | v1 | provenance | | +| test.rs:339:13:339:14 | v2 | test.rs:343:14:343:15 | v2 | provenance | | +| test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | test.rs:339:18:339:39 | await ... [Ok] | provenance | | +| test.rs:339:18:339:39 | await ... [Ok] | test.rs:339:18:339:40 | TryExpr | provenance | | +| test.rs:339:18:339:40 | TryExpr | test.rs:339:13:339:14 | v2 | provenance | | +| test.rs:340:13:340:14 | v3 | test.rs:344:14:344:15 | v3 | provenance | | +| test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | test.rs:340:18:340:39 | await ... [Ok] | provenance | | +| test.rs:340:18:340:39 | await ... [Ok] | test.rs:340:18:340:40 | TryExpr | provenance | | +| test.rs:340:18:340:40 | TryExpr | test.rs:340:13:340:14 | v3 | provenance | | +| test.rs:341:13:341:14 | v4 | test.rs:345:14:345:15 | v4 | provenance | | +| test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | test.rs:341:18:341:42 | await ... [Ok] | provenance | | +| test.rs:341:18:341:42 | await ... [Ok] | test.rs:341:18:341:43 | TryExpr | provenance | | +| test.rs:341:18:341:43 | TryExpr | test.rs:341:13:341:14 | v4 | provenance | | +| test.rs:349:13:349:21 | mut stdin | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | provenance | MaD:64 | +| test.rs:349:25:349:40 | ...::stdin | test.rs:349:25:349:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:349:25:349:42 | ...::stdin(...) | test.rs:349:13:349:21 | mut stdin | provenance | | +| test.rs:351:24:351:34 | [post] &mut buffer [&ref] | test.rs:351:29:351:34 | [post] buffer | provenance | | +| test.rs:351:29:351:34 | [post] buffer | test.rs:352:15:352:20 | buffer | provenance | | +| test.rs:352:15:352:20 | buffer | test.rs:352:14:352:20 | &buffer | provenance | | +| test.rs:358:13:358:22 | mut reader | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | provenance | MaD:58 | +| test.rs:358:26:358:70 | ...::new(...) | test.rs:358:13:358:22 | mut reader | provenance | | +| test.rs:358:52:358:67 | ...::stdin | test.rs:358:52:358:69 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:114 | +| test.rs:359:13:359:16 | data | test.rs:360:15:360:18 | data | provenance | | +| test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | test.rs:359:20:359:42 | await ... [Ok] | provenance | | +| test.rs:359:20:359:42 | await ... [Ok] | test.rs:359:20:359:43 | TryExpr | provenance | | +| test.rs:359:20:359:43 | TryExpr | test.rs:359:13:359:16 | data | provenance | | +| test.rs:360:15:360:18 | data | test.rs:360:14:360:18 | &data | provenance | | +| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:113 | +| test.rs:364:22:364:66 | ...::new(...) | test.rs:364:13:364:18 | reader | provenance | | +| test.rs:364:48:364:63 | ...::stdin | test.rs:364:48:364:65 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:114 | +| test.rs:365:13:365:16 | data | test.rs:366:15:366:18 | data | provenance | | +| test.rs:365:20:365:34 | reader.buffer() | test.rs:365:13:365:16 | data | provenance | | +| test.rs:366:15:366:18 | data | test.rs:366:14:366:18 | &data | provenance | | +| test.rs:371:13:371:22 | mut reader | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | provenance | MaD:60 | +| test.rs:371:26:371:70 | ...::new(...) | test.rs:371:13:371:22 | mut reader | provenance | | +| test.rs:371:52:371:67 | ...::stdin | test.rs:371:52:371:69 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:114 | +| test.rs:372:26:372:36 | [post] &mut buffer [&ref] | test.rs:372:31:372:36 | [post] buffer | provenance | | +| test.rs:372:31:372:36 | [post] buffer | test.rs:373:15:373:20 | buffer | provenance | | +| test.rs:373:15:373:20 | buffer | test.rs:373:14:373:20 | &buffer | provenance | | +| test.rs:378:13:378:22 | mut reader | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | provenance | MaD:61 | +| test.rs:378:26:378:70 | ...::new(...) | test.rs:378:13:378:22 | mut reader | provenance | | +| test.rs:378:52:378:67 | ...::stdin | test.rs:378:52:378:69 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:114 | +| test.rs:379:33:379:43 | [post] &mut buffer [&ref] | test.rs:379:38:379:43 | [post] buffer | provenance | | +| test.rs:379:38:379:43 | [post] buffer | test.rs:380:15:380:20 | buffer | provenance | | +| test.rs:379:38:379:43 | [post] buffer | test.rs:381:14:381:22 | buffer[0] | provenance | | +| test.rs:380:15:380:20 | buffer | test.rs:380:14:380:20 | &buffer | provenance | | +| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:116 | +| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:116 | +| test.rs:385:32:385:76 | ...::new(...) | test.rs:385:32:385:88 | ... .split(...) | provenance | MaD:62 | +| test.rs:385:32:385:88 | ... .split(...) | test.rs:385:13:385:28 | mut reader_split | provenance | | +| test.rs:385:58:385:73 | ...::stdin | test.rs:385:58:385:75 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:114 | +| test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:386:14:386:46 | await ... [Ok, Some] | provenance | | +| test.rs:386:14:386:46 | await ... [Ok, Some] | test.rs:386:14:386:47 | TryExpr [Some] | provenance | | +| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:75 | +| test.rs:387:19:387:29 | Some(...) [Some] | test.rs:387:24:387:28 | chunk | provenance | | +| test.rs:387:24:387:28 | chunk | test.rs:388:18:388:22 | chunk | provenance | | +| test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | test.rs:387:33:387:65 | await ... [Ok, Some] | provenance | | +| test.rs:387:33:387:65 | await ... [Ok, Some] | test.rs:387:33:387:66 | TryExpr [Some] | provenance | | +| test.rs:387:33:387:66 | TryExpr [Some] | test.rs:387:19:387:29 | Some(...) [Some] | provenance | | +| test.rs:393:13:393:18 | reader | test.rs:394:25:394:38 | reader.lines() | provenance | MaD:59 | +| test.rs:393:22:393:66 | ...::new(...) | test.rs:393:13:393:18 | reader | provenance | | +| test.rs:393:48:393:63 | ...::stdin | test.rs:393:48:393:65 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:114 | +| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:115 | +| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:115 | +| test.rs:394:25:394:38 | reader.lines() | test.rs:394:13:394:21 | mut lines | provenance | | +| test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | test.rs:395:14:395:36 | await ... [Ok, Some] | provenance | | +| test.rs:395:14:395:36 | await ... [Ok, Some] | test.rs:395:14:395:37 | TryExpr [Some] | provenance | | +| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:75 | +| test.rs:396:19:396:28 | Some(...) [Some] | test.rs:396:24:396:27 | line | provenance | | +| test.rs:396:24:396:27 | line | test.rs:397:18:397:21 | line | provenance | | +| test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | test.rs:396:32:396:54 | await ... [Ok, Some] | provenance | | +| test.rs:396:32:396:54 | await ... [Ok, Some] | test.rs:396:32:396:55 | TryExpr [Some] | provenance | | +| test.rs:396:32:396:55 | TryExpr [Some] | test.rs:396:19:396:28 | Some(...) [Some] | provenance | | +| test.rs:408:13:408:18 | buffer | test.rs:409:14:409:19 | buffer | provenance | | +| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:43 | ...::read [Ok] | provenance | Src:MaD:23 | +| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | Src:MaD:23 | +| test.rs:408:31:408:43 | ...::read [Ok] | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | MaD:24 | +| test.rs:408:31:408:55 | ...::read(...) [Ok] | test.rs:408:31:408:56 | TryExpr | provenance | | +| test.rs:408:31:408:56 | TryExpr | test.rs:408:13:408:18 | buffer | provenance | | +| test.rs:413:13:413:18 | buffer | test.rs:414:14:414:19 | buffer | provenance | | +| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:38 | ...::read [Ok] | provenance | Src:MaD:23 | +| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | Src:MaD:23 | +| test.rs:413:31:413:38 | ...::read [Ok] | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | MaD:24 | +| test.rs:413:31:413:50 | ...::read(...) [Ok] | test.rs:413:31:413:51 | TryExpr | provenance | | +| test.rs:413:31:413:51 | TryExpr | test.rs:413:13:413:18 | buffer | provenance | | +| test.rs:418:13:418:18 | buffer | test.rs:419:14:419:19 | buffer | provenance | | +| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:39 | ...::read_to_string [Ok] | provenance | Src:MaD:26 | +| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:26 | +| test.rs:418:22:418:39 | ...::read_to_string [Ok] | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | MaD:27 | +| test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | test.rs:418:22:418:52 | TryExpr | provenance | | +| test.rs:418:22:418:52 | TryExpr | test.rs:418:13:418:18 | buffer | provenance | | +| test.rs:425:13:425:16 | path | test.rs:426:14:426:17 | path | provenance | | +| test.rs:425:13:425:16 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:33 | +| test.rs:425:13:425:16 | path | test.rs:427:14:427:17 | path | provenance | | +| test.rs:425:13:425:16 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:33 | +| test.rs:425:13:425:16 | path | test.rs:437:14:437:17 | path | provenance | | +| test.rs:425:20:425:27 | e.path() | test.rs:425:13:425:16 | path | provenance | | +| test.rs:425:22:425:25 | path | test.rs:425:20:425:27 | e.path() | provenance | Src:MaD:4 MaD:4 | +| test.rs:426:14:426:17 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:33 | +| test.rs:427:14:427:17 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:33 | +| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:112 | +| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:22 | file_name | provenance | | +| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:33 | +| test.rs:439:13:439:21 | file_name | test.rs:445:14:445:22 | file_name | provenance | | +| test.rs:439:25:439:37 | e.file_name() | test.rs:439:13:439:21 | file_name | provenance | | +| test.rs:439:27:439:35 | file_name | test.rs:439:25:439:37 | e.file_name() | provenance | Src:MaD:3 MaD:3 | +| test.rs:440:14:440:22 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:33 | +| test.rs:461:13:461:18 | target | test.rs:462:14:462:19 | target | provenance | | +| test.rs:461:22:461:34 | ...::read_link | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:25 | +| test.rs:461:22:461:49 | ...::read_link(...) [Ok] | test.rs:461:22:461:50 | TryExpr | provenance | | +| test.rs:461:22:461:50 | TryExpr | test.rs:461:13:461:18 | target | provenance | | +| test.rs:470:13:470:18 | buffer | test.rs:471:14:471:19 | buffer | provenance | | +| test.rs:470:31:470:45 | ...::read | test.rs:470:31:470:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:29 | +| test.rs:470:31:470:57 | ...::read(...) [future, Ok] | test.rs:470:31:470:63 | await ... [Ok] | provenance | | +| test.rs:470:31:470:63 | await ... [Ok] | test.rs:470:31:470:64 | TryExpr | provenance | | +| test.rs:470:31:470:64 | TryExpr | test.rs:470:13:470:18 | buffer | provenance | | +| test.rs:475:13:475:18 | buffer | test.rs:476:14:476:19 | buffer | provenance | | +| test.rs:475:31:475:45 | ...::read | test.rs:475:31:475:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:29 | +| test.rs:475:31:475:57 | ...::read(...) [future, Ok] | test.rs:475:31:475:63 | await ... [Ok] | provenance | | +| test.rs:475:31:475:63 | await ... [Ok] | test.rs:475:31:475:64 | TryExpr | provenance | | +| test.rs:475:31:475:64 | TryExpr | test.rs:475:13:475:18 | buffer | provenance | | +| test.rs:480:13:480:18 | buffer | test.rs:481:14:481:19 | buffer | provenance | | +| test.rs:480:22:480:46 | ...::read_to_string | test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:31 | +| test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | test.rs:480:22:480:64 | await ... [Ok] | provenance | | +| test.rs:480:22:480:64 | await ... [Ok] | test.rs:480:22:480:65 | TryExpr | provenance | | +| test.rs:480:22:480:65 | TryExpr | test.rs:480:13:480:18 | buffer | provenance | | +| test.rs:486:13:486:16 | path | test.rs:488:14:488:17 | path | provenance | | +| test.rs:486:20:486:31 | entry.path() | test.rs:486:13:486:16 | path | provenance | | +| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:12 MaD:12 | +| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:12 MaD:12 | +| test.rs:487:13:487:21 | file_name | test.rs:489:14:489:22 | file_name | provenance | | +| test.rs:487:25:487:41 | entry.file_name() | test.rs:487:13:487:21 | file_name | provenance | | +| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:11 MaD:11 | +| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:11 MaD:11 | +| test.rs:493:13:493:18 | target | test.rs:494:14:494:19 | target | provenance | | +| test.rs:493:22:493:41 | ...::read_link | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:30 | +| test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | test.rs:493:22:493:62 | await ... [Ok] | provenance | | +| test.rs:493:22:493:62 | await ... [Ok] | test.rs:493:22:493:63 | TryExpr | provenance | | +| test.rs:493:22:493:63 | TryExpr | test.rs:493:13:493:18 | target | provenance | | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:93 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:53 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:92 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:95 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:55 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:94 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:97 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:56 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:96 | +| test.rs:503:9:503:16 | mut file | test.rs:525:25:525:35 | [post] &mut buffer [&ref] | provenance | MaD:54 | +| test.rs:503:9:503:16 | mut file | test.rs:529:17:529:28 | file.bytes() | provenance | MaD:50 | +| test.rs:503:20:503:38 | ...::open | test.rs:503:20:503:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:503:20:503:50 | ...::open(...) [Ok] | test.rs:503:20:503:51 | TryExpr | provenance | | +| test.rs:503:20:503:51 | TryExpr | test.rs:503:9:503:16 | mut file | provenance | | +| test.rs:507:32:507:42 | [post] &mut buffer | test.rs:508:15:508:20 | buffer | provenance | | +| test.rs:507:32:507:42 | [post] &mut buffer [&ref] | test.rs:507:37:507:42 | [post] buffer | provenance | | +| test.rs:507:37:507:42 | [post] buffer | test.rs:508:15:508:20 | buffer | provenance | | +| test.rs:508:15:508:20 | buffer | test.rs:508:14:508:20 | &buffer | provenance | | +| test.rs:513:39:513:49 | [post] &mut buffer | test.rs:514:15:514:20 | buffer | provenance | | +| test.rs:513:39:513:49 | [post] &mut buffer [&ref] | test.rs:513:44:513:49 | [post] buffer | provenance | | +| test.rs:513:44:513:49 | [post] buffer | test.rs:514:15:514:20 | buffer | provenance | | +| test.rs:514:15:514:20 | buffer | test.rs:514:14:514:20 | &buffer | provenance | | +| test.rs:519:42:519:52 | [post] &mut buffer | test.rs:520:15:520:20 | buffer | provenance | | +| test.rs:519:42:519:52 | [post] &mut buffer [&ref] | test.rs:519:47:519:52 | [post] buffer | provenance | | +| test.rs:519:47:519:52 | [post] buffer | test.rs:520:15:520:20 | buffer | provenance | | +| test.rs:520:15:520:20 | buffer | test.rs:520:14:520:20 | &buffer | provenance | | +| test.rs:525:25:525:35 | [post] &mut buffer [&ref] | test.rs:525:30:525:35 | [post] buffer | provenance | | +| test.rs:525:30:525:35 | [post] buffer | test.rs:526:15:526:20 | buffer | provenance | | +| test.rs:526:15:526:20 | buffer | test.rs:526:14:526:20 | &buffer | provenance | | +| test.rs:529:17:529:28 | file.bytes() | test.rs:530:14:530:17 | byte | provenance | | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:93 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:53 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:92 | +| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:80 | +| test.rs:536:22:536:72 | ... .unwrap() | test.rs:536:13:536:18 | mut f1 | provenance | | +| test.rs:536:50:536:53 | open | test.rs:536:22:536:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 | +| test.rs:538:30:538:40 | [post] &mut buffer | test.rs:539:15:539:20 | buffer | provenance | | +| test.rs:538:30:538:40 | [post] &mut buffer [&ref] | test.rs:538:35:538:40 | [post] buffer | provenance | | +| test.rs:538:35:538:40 | [post] buffer | test.rs:539:15:539:20 | buffer | provenance | | +| test.rs:539:15:539:20 | buffer | test.rs:539:14:539:20 | &buffer | provenance | | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:93 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:53 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:92 | +| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:80 | +| test.rs:543:22:543:89 | ... .unwrap() | test.rs:543:13:543:18 | mut f2 | provenance | | +| test.rs:543:67:543:70 | open | test.rs:543:22:543:80 | ... .open(...) [Ok] | provenance | Src:MaD:6 | +| test.rs:545:30:545:40 | [post] &mut buffer | test.rs:546:15:546:20 | buffer | provenance | | +| test.rs:545:30:545:40 | [post] &mut buffer [&ref] | test.rs:545:35:545:40 | [post] buffer | provenance | | +| test.rs:545:35:545:40 | [post] buffer | test.rs:546:15:546:20 | buffer | provenance | | +| test.rs:546:15:546:20 | buffer | test.rs:546:14:546:20 | &buffer | provenance | | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:93 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:53 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:92 | +| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:80 | +| test.rs:550:22:550:123 | ... .unwrap() | test.rs:550:13:550:18 | mut f3 | provenance | | +| test.rs:550:101:550:104 | open | test.rs:550:22:550:114 | ... .open(...) [Ok] | provenance | Src:MaD:6 | +| test.rs:552:30:552:40 | [post] &mut buffer | test.rs:553:15:553:20 | buffer | provenance | | +| test.rs:552:30:552:40 | [post] &mut buffer [&ref] | test.rs:552:35:552:40 | [post] buffer | provenance | | +| test.rs:552:35:552:40 | [post] buffer | test.rs:553:15:553:20 | buffer | provenance | | +| test.rs:553:15:553:20 | buffer | test.rs:553:14:553:20 | &buffer | provenance | | +| test.rs:560:13:560:17 | file1 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:52 | +| test.rs:560:21:560:39 | ...::open | test.rs:560:21:560:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:560:21:560:51 | ...::open(...) [Ok] | test.rs:560:21:560:52 | TryExpr | provenance | | +| test.rs:560:21:560:52 | TryExpr | test.rs:560:13:560:17 | file1 | provenance | | +| test.rs:561:13:561:17 | file2 | test.rs:562:38:562:42 | file2 | provenance | | +| test.rs:561:21:561:39 | ...::open | test.rs:561:21:561:59 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:561:21:561:59 | ...::open(...) [Ok] | test.rs:561:21:561:60 | TryExpr | provenance | | +| test.rs:561:21:561:60 | TryExpr | test.rs:561:13:561:17 | file2 | provenance | | +| test.rs:562:13:562:22 | mut reader | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | provenance | MaD:56 | +| test.rs:562:26:562:43 | file1.chain(...) | test.rs:562:13:562:22 | mut reader | provenance | | +| test.rs:562:38:562:42 | file2 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:51 | +| test.rs:563:31:563:41 | [post] &mut buffer [&ref] | test.rs:563:36:563:41 | [post] buffer | provenance | | +| test.rs:563:36:563:41 | [post] buffer | test.rs:564:15:564:20 | buffer | provenance | | +| test.rs:564:15:564:20 | buffer | test.rs:564:14:564:20 | &buffer | provenance | | +| test.rs:569:13:569:17 | file1 | test.rs:570:26:570:40 | file1.take(...) | provenance | MaD:57 | +| test.rs:569:21:569:39 | ...::open | test.rs:569:21:569:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:569:21:569:51 | ...::open(...) [Ok] | test.rs:569:21:569:52 | TryExpr | provenance | | +| test.rs:569:21:569:52 | TryExpr | test.rs:569:13:569:17 | file1 | provenance | | +| test.rs:570:13:570:22 | mut reader | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | provenance | MaD:56 | +| test.rs:570:26:570:40 | file1.take(...) | test.rs:570:13:570:22 | mut reader | provenance | | +| test.rs:571:31:571:41 | [post] &mut buffer [&ref] | test.rs:571:36:571:41 | [post] buffer | provenance | | +| test.rs:571:36:571:41 | [post] buffer | test.rs:572:15:572:20 | buffer | provenance | | +| test.rs:572:15:572:20 | buffer | test.rs:572:14:572:20 | &buffer | provenance | | +| test.rs:581:9:581:16 | mut file | test.rs:585:32:585:42 | [post] &mut buffer [&ref] | provenance | MaD:63 | +| test.rs:581:9:581:16 | mut file | test.rs:591:39:591:49 | [post] &mut buffer [&ref] | provenance | MaD:69 | +| test.rs:581:9:581:16 | mut file | test.rs:597:42:597:52 | [post] &mut buffer [&ref] | provenance | MaD:70 | +| test.rs:581:9:581:16 | mut file | test.rs:603:25:603:35 | [post] &mut buffer [&ref] | provenance | MaD:65 | +| test.rs:581:9:581:16 | mut file | test.rs:608:18:608:31 | file.read_u8() [future, Ok] | provenance | MaD:71 | +| test.rs:581:9:581:16 | mut file | test.rs:609:18:609:32 | file.read_i16() [future, Ok] | provenance | MaD:67 | +| test.rs:581:9:581:16 | mut file | test.rs:610:18:610:32 | file.read_f32() [future, Ok] | provenance | MaD:66 | +| test.rs:581:9:581:16 | mut file | test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | provenance | MaD:68 | +| test.rs:581:9:581:16 | mut file | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | provenance | MaD:64 | +| test.rs:581:20:581:40 | ...::open | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:9 | +| test.rs:581:20:581:52 | ...::open(...) [future, Ok] | test.rs:581:20:581:58 | await ... [Ok] | provenance | | +| test.rs:581:20:581:58 | await ... [Ok] | test.rs:581:20:581:59 | TryExpr | provenance | | +| test.rs:581:20:581:59 | TryExpr | test.rs:581:9:581:16 | mut file | provenance | | +| test.rs:585:32:585:42 | [post] &mut buffer [&ref] | test.rs:585:37:585:42 | [post] buffer | provenance | | +| test.rs:585:37:585:42 | [post] buffer | test.rs:586:15:586:20 | buffer | provenance | | +| test.rs:586:15:586:20 | buffer | test.rs:586:14:586:20 | &buffer | provenance | | +| test.rs:591:39:591:49 | [post] &mut buffer [&ref] | test.rs:591:44:591:49 | [post] buffer | provenance | | +| test.rs:591:44:591:49 | [post] buffer | test.rs:592:15:592:20 | buffer | provenance | | +| test.rs:592:15:592:20 | buffer | test.rs:592:14:592:20 | &buffer | provenance | | +| test.rs:597:42:597:52 | [post] &mut buffer [&ref] | test.rs:597:47:597:52 | [post] buffer | provenance | | +| test.rs:597:47:597:52 | [post] buffer | test.rs:598:15:598:20 | buffer | provenance | | +| test.rs:598:15:598:20 | buffer | test.rs:598:14:598:20 | &buffer | provenance | | +| test.rs:603:25:603:35 | [post] &mut buffer [&ref] | test.rs:603:30:603:35 | [post] buffer | provenance | | +| test.rs:603:30:603:35 | [post] buffer | test.rs:604:15:604:20 | buffer | provenance | | +| test.rs:604:15:604:20 | buffer | test.rs:604:14:604:20 | &buffer | provenance | | +| test.rs:608:13:608:14 | v1 | test.rs:612:14:612:15 | v1 | provenance | | +| test.rs:608:18:608:31 | file.read_u8() [future, Ok] | test.rs:608:18:608:37 | await ... [Ok] | provenance | | +| test.rs:608:18:608:37 | await ... [Ok] | test.rs:608:18:608:38 | TryExpr | provenance | | +| test.rs:608:18:608:38 | TryExpr | test.rs:608:13:608:14 | v1 | provenance | | +| test.rs:609:13:609:14 | v2 | test.rs:613:14:613:15 | v2 | provenance | | +| test.rs:609:18:609:32 | file.read_i16() [future, Ok] | test.rs:609:18:609:38 | await ... [Ok] | provenance | | +| test.rs:609:18:609:38 | await ... [Ok] | test.rs:609:18:609:39 | TryExpr | provenance | | +| test.rs:609:18:609:39 | TryExpr | test.rs:609:13:609:14 | v2 | provenance | | +| test.rs:610:13:610:14 | v3 | test.rs:614:14:614:15 | v3 | provenance | | +| test.rs:610:18:610:32 | file.read_f32() [future, Ok] | test.rs:610:18:610:38 | await ... [Ok] | provenance | | +| test.rs:610:18:610:38 | await ... [Ok] | test.rs:610:18:610:39 | TryExpr | provenance | | +| test.rs:610:18:610:39 | TryExpr | test.rs:610:13:610:14 | v3 | provenance | | +| test.rs:611:13:611:14 | v4 | test.rs:615:14:615:15 | v4 | provenance | | +| test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | test.rs:611:18:611:41 | await ... [Ok] | provenance | | +| test.rs:611:18:611:41 | await ... [Ok] | test.rs:611:18:611:42 | TryExpr | provenance | | +| test.rs:611:18:611:42 | TryExpr | test.rs:611:13:611:14 | v4 | provenance | | +| test.rs:620:23:620:33 | [post] &mut buffer [&ref] | test.rs:620:28:620:33 | [post] buffer | provenance | | +| test.rs:620:28:620:33 | [post] buffer | test.rs:621:15:621:20 | buffer | provenance | | +| test.rs:621:15:621:20 | buffer | test.rs:621:14:621:20 | &buffer | provenance | | +| test.rs:627:13:627:18 | mut f1 | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | provenance | MaD:63 | +| test.rs:627:22:627:65 | ... .open(...) [future, Ok] | test.rs:627:22:627:71 | await ... [Ok] | provenance | | +| test.rs:627:22:627:71 | await ... [Ok] | test.rs:627:22:627:72 | TryExpr | provenance | | +| test.rs:627:22:627:72 | TryExpr | test.rs:627:13:627:18 | mut f1 | provenance | | +| test.rs:627:52:627:55 | open | test.rs:627:22:627:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:10 | +| test.rs:629:30:629:40 | [post] &mut buffer [&ref] | test.rs:629:35:629:40 | [post] buffer | provenance | | +| test.rs:629:35:629:40 | [post] buffer | test.rs:630:15:630:20 | buffer | provenance | | +| test.rs:630:15:630:20 | buffer | test.rs:630:14:630:20 | &buffer | provenance | | +| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:53 | +| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:111 | +| test.rs:688:26:688:53 | ...::connect | test.rs:688:26:688:62 | ...::connect(...) [Ok] | provenance | Src:MaD:7 | +| test.rs:688:26:688:62 | ...::connect(...) [Ok] | test.rs:688:26:688:63 | TryExpr | provenance | | +| test.rs:688:26:688:63 | TryExpr | test.rs:688:13:688:22 | mut stream | provenance | | +| test.rs:695:29:695:39 | [post] &mut buffer [&ref] | test.rs:695:34:695:39 | [post] buffer | provenance | | +| test.rs:695:34:695:39 | [post] buffer | test.rs:698:15:698:20 | buffer | provenance | | +| test.rs:695:34:695:39 | [post] buffer | test.rs:699:14:699:22 | buffer[0] | provenance | | +| test.rs:698:15:698:20 | buffer | test.rs:698:14:698:20 | &buffer | provenance | | +| test.rs:707:13:707:22 | mut stream | test.rs:715:58:715:63 | stream | provenance | | +| test.rs:707:26:707:61 | ...::connect_timeout | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:8 | +| test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | test.rs:707:26:707:106 | TryExpr | provenance | | +| test.rs:707:26:707:106 | TryExpr | test.rs:707:13:707:22 | mut stream | provenance | | +| test.rs:715:21:715:30 | mut reader | test.rs:718:44:718:52 | [post] &mut line [&ref] | provenance | MaD:47 | +| test.rs:715:34:715:64 | ...::new(...) | test.rs:715:34:715:74 | ... .take(...) | provenance | MaD:57 | +| test.rs:715:34:715:74 | ... .take(...) | test.rs:715:21:715:30 | mut reader | provenance | | +| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:101 | +| test.rs:718:44:718:52 | [post] &mut line [&ref] | test.rs:718:49:718:52 | [post] line | provenance | | +| test.rs:718:49:718:52 | [post] line | test.rs:725:35:725:38 | line | provenance | | +| test.rs:725:35:725:38 | line | test.rs:725:34:725:38 | &line | provenance | | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:117 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | provenance | MaD:63 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:118 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:119 | +| test.rs:759:28:759:57 | ...::connect | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:13 | +| test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | test.rs:759:28:759:72 | await ... [Ok] | provenance | | +| test.rs:759:28:759:72 | await ... [Ok] | test.rs:759:28:759:73 | TryExpr | provenance | | +| test.rs:759:28:759:73 | TryExpr | test.rs:759:9:759:24 | mut tokio_stream | provenance | | +| test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | test.rs:767:40:767:46 | [post] buffer1 | provenance | | +| test.rs:767:40:767:46 | [post] buffer1 | test.rs:774:15:774:21 | buffer1 | provenance | | +| test.rs:767:40:767:46 | [post] buffer1 | test.rs:775:14:775:23 | buffer1[0] | provenance | | +| test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | test.rs:771:41:771:47 | [post] buffer2 | provenance | | +| test.rs:771:41:771:47 | [post] buffer2 | test.rs:778:15:778:21 | buffer2 | provenance | | +| test.rs:771:41:771:47 | [post] buffer2 | test.rs:779:14:779:23 | buffer2[0] | provenance | | +| test.rs:774:15:774:21 | buffer1 | test.rs:774:14:774:21 | &buffer1 | provenance | | +| test.rs:778:15:778:21 | buffer2 | test.rs:778:14:778:21 | &buffer2 | provenance | | +| test.rs:787:41:787:51 | [post] &mut buffer [&ref] | test.rs:787:46:787:51 | [post] buffer | provenance | | +| test.rs:787:46:787:51 | [post] buffer | test.rs:794:27:794:32 | buffer | provenance | | +| test.rs:794:27:794:32 | buffer | test.rs:794:26:794:32 | &buffer | provenance | | +| test.rs:810:45:810:55 | [post] &mut buffer [&ref] | test.rs:810:50:810:55 | [post] buffer | provenance | | +| test.rs:810:50:810:55 | [post] buffer | test.rs:817:27:817:32 | buffer | provenance | | +| test.rs:817:27:817:32 | buffer | test.rs:817:26:817:32 | &buffer | provenance | | +| test_futures_io.rs:19:9:19:11 | tcp | test_futures_io.rs:20:11:20:13 | tcp | provenance | | +| test_futures_io.rs:19:9:19:11 | tcp | test_futures_io.rs:26:53:26:55 | tcp | provenance | | +| test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | provenance | Src:MaD:1 | +| test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | test_futures_io.rs:19:15:19:43 | await ... [Ok] | provenance | | +| test_futures_io.rs:19:15:19:43 | await ... [Ok] | test_futures_io.rs:19:15:19:44 | TryExpr | provenance | | +| test_futures_io.rs:19:15:19:44 | TryExpr | test_futures_io.rs:19:9:19:11 | tcp | provenance | | +| test_futures_io.rs:20:11:20:13 | tcp | test_futures_io.rs:20:10:20:13 | &tcp | provenance | | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:27:11:27:16 | reader | provenance | | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:32:40:32:45 | reader | provenance | | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:45:64:45:69 | reader | provenance | | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:27:49:32 | reader | provenance | | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:42 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:43 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:54:51:54:56 | reader | provenance | | +| test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | test_futures_io.rs:26:22:26:62 | await ... [Ok] | provenance | | +| test_futures_io.rs:26:22:26:62 | await ... [Ok] | test_futures_io.rs:26:22:26:63 | TryExpr | provenance | | +| test_futures_io.rs:26:22:26:63 | TryExpr | test_futures_io.rs:26:9:26:18 | mut reader | provenance | | +| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:84 | +| test_futures_io.rs:27:11:27:16 | reader | test_futures_io.rs:27:10:27:16 | &reader | provenance | | +| test_futures_io.rs:32:13:32:22 | mut pinned | test_futures_io.rs:33:15:33:20 | pinned | provenance | | +| test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | test_futures_io.rs:33:15:33:20 | pinned [&ref] | provenance | | +| test_futures_io.rs:32:13:32:22 | mut pinned [Pin, &ref] | test_futures_io.rs:33:15:33:20 | pinned [Pin, &ref] | provenance | | +| test_futures_io.rs:32:26:32:46 | ...::new(...) | test_futures_io.rs:32:13:32:22 | mut pinned | provenance | | +| test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | provenance | | +| test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | test_futures_io.rs:32:13:32:22 | mut pinned [Pin, &ref] | provenance | | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:76 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:78 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | provenance | MaD:77 | +| test_futures_io.rs:32:40:32:45 | reader | test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | provenance | | +| test_futures_io.rs:33:15:33:20 | pinned | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | +| test_futures_io.rs:33:15:33:20 | pinned [&ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | +| test_futures_io.rs:33:15:33:20 | pinned [Pin, &ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | +| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:42 | +| test_futures_io.rs:45:64:45:69 | reader | test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | provenance | | +| test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | test_futures_io.rs:45:77:45:83 | [post] buffer1 | provenance | | +| test_futures_io.rs:45:77:45:83 | [post] buffer1 | test_futures_io.rs:46:15:46:36 | buffer1[...] | provenance | | +| test_futures_io.rs:46:15:46:36 | buffer1[...] | test_futures_io.rs:46:14:46:36 | &... | provenance | | +| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:42 | +| test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | test_futures_io.rs:49:44:49:50 | [post] buffer2 | provenance | | +| test_futures_io.rs:49:44:49:50 | [post] buffer2 | test_futures_io.rs:51:15:51:36 | buffer2[...] | provenance | | +| test_futures_io.rs:51:15:51:36 | buffer2[...] | test_futures_io.rs:51:14:51:36 | &... | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:55:11:55:17 | reader2 | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:59:40:59:46 | reader2 | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:69:37:69:43 | reader2 | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:37 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:90:40:90:46 | reader2 | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:103:64:103:70 | reader2 | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:27:107:33 | reader2 | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:42 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:43 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:113:40:113:46 | reader2 | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:37 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:27:132:33 | reader2 | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:40 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:41 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:27:139:33 | reader2 | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:38 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:39 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:27:146:33 | reader2 | provenance | | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:45 | +| test_futures_io.rs:54:23:54:57 | ...::new(...) | test_futures_io.rs:54:9:54:19 | mut reader2 | provenance | | +| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:85 | +| test_futures_io.rs:55:11:55:17 | reader2 | test_futures_io.rs:55:10:55:17 | &reader2 | provenance | | +| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:60:15:60:20 | pinned | provenance | | +| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:60:15:60:20 | pinned [&ref] | provenance | | +| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | test_futures_io.rs:60:15:60:20 | pinned [Pin, &ref] | provenance | | +| test_futures_io.rs:59:26:59:47 | ...::new(...) | test_futures_io.rs:59:13:59:22 | mut pinned | provenance | | +| test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | provenance | | +| test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | provenance | | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:76 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:78 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | provenance | MaD:77 | +| test_futures_io.rs:59:40:59:46 | reader2 | test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | provenance | | +| test_futures_io.rs:60:15:60:20 | pinned | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | +| test_futures_io.rs:60:15:60:20 | pinned [&ref] | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | +| test_futures_io.rs:60:15:60:20 | pinned [Pin, &ref] | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | +| test_futures_io.rs:62:13:62:18 | buffer [Ready, Ok] | test_futures_io.rs:63:16:63:35 | ...::Ready(...) [Ready, Ok] | provenance | | +| test_futures_io.rs:62:13:62:18 | buffer [Ready, Ok] | test_futures_io.rs:64:19:64:24 | buffer [Ready, Ok] | provenance | | +| test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | test_futures_io.rs:62:13:62:18 | buffer [Ready, Ok] | provenance | | +| test_futures_io.rs:63:16:63:35 | ...::Ready(...) [Ready, Ok] | test_futures_io.rs:63:28:63:34 | Ok(...) [Ok] | provenance | | +| test_futures_io.rs:63:28:63:34 | Ok(...) [Ok] | test_futures_io.rs:63:31:63:33 | buf | provenance | | +| test_futures_io.rs:63:31:63:33 | buf | test_futures_io.rs:65:18:65:20 | buf | provenance | | +| test_futures_io.rs:64:19:64:24 | buffer [Ready, Ok] | test_futures_io.rs:64:18:64:24 | &buffer | provenance | | +| test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | provenance | | +| test_futures_io.rs:69:23:69:44 | ...::new(...) | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | provenance | | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:76 | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:78 | +| test_futures_io.rs:69:37:69:43 | reader2 | test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | provenance | | +| test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:71:13:71:32 | ...::Ready(...) [Ready, Ok] | provenance | | +| test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:72:23:72:29 | buffer2 [Ready, Ok] | provenance | | +| test_futures_io.rs:71:13:71:32 | ...::Ready(...) [Ready, Ok] | test_futures_io.rs:71:25:71:31 | Ok(...) [Ok] | provenance | | +| test_futures_io.rs:71:25:71:31 | Ok(...) [Ok] | test_futures_io.rs:71:28:71:30 | buf | provenance | | +| test_futures_io.rs:71:28:71:30 | buf | test_futures_io.rs:73:22:73:24 | buf | provenance | | +| test_futures_io.rs:72:23:72:29 | buffer2 [Ready, Ok] | test_futures_io.rs:72:22:72:29 | &buffer2 | provenance | | +| test_futures_io.rs:83:13:83:18 | buffer | test_futures_io.rs:84:14:84:19 | buffer | provenance | | +| test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | test_futures_io.rs:83:22:83:45 | await ... [Ok] | provenance | | +| test_futures_io.rs:83:22:83:45 | await ... [Ok] | test_futures_io.rs:83:22:83:46 | TryExpr | provenance | | +| test_futures_io.rs:83:22:83:46 | TryExpr | test_futures_io.rs:83:13:83:18 | buffer | provenance | | +| test_futures_io.rs:90:13:90:22 | mut pinned | test_futures_io.rs:91:15:91:20 | pinned | provenance | | +| test_futures_io.rs:90:13:90:22 | mut pinned [&ref] | test_futures_io.rs:91:15:91:20 | pinned [&ref] | provenance | | +| test_futures_io.rs:90:13:90:22 | mut pinned [Pin, &ref] | test_futures_io.rs:91:15:91:20 | pinned [Pin, &ref] | provenance | | +| test_futures_io.rs:90:26:90:47 | ...::new(...) | test_futures_io.rs:90:13:90:22 | mut pinned | provenance | | +| test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | test_futures_io.rs:90:13:90:22 | mut pinned [&ref] | provenance | | +| test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:90:13:90:22 | mut pinned [Pin, &ref] | provenance | | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:76 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:78 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | provenance | MaD:77 | +| test_futures_io.rs:90:40:90:46 | reader2 | test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | provenance | | +| test_futures_io.rs:91:15:91:20 | pinned | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | +| test_futures_io.rs:91:15:91:20 | pinned [&ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | +| test_futures_io.rs:91:15:91:20 | pinned [Pin, &ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | +| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:42 | +| test_futures_io.rs:103:64:103:70 | reader2 | test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | provenance | | +| test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | test_futures_io.rs:103:78:103:84 | [post] buffer1 | provenance | | +| test_futures_io.rs:103:78:103:84 | [post] buffer1 | test_futures_io.rs:104:15:104:36 | buffer1[...] | provenance | | +| test_futures_io.rs:104:15:104:36 | buffer1[...] | test_futures_io.rs:104:14:104:36 | &... | provenance | | +| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:42 | +| test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | test_futures_io.rs:107:45:107:51 | [post] buffer2 | provenance | | +| test_futures_io.rs:107:45:107:51 | [post] buffer2 | test_futures_io.rs:108:15:108:36 | buffer2[...] | provenance | | +| test_futures_io.rs:108:15:108:36 | buffer2[...] | test_futures_io.rs:108:14:108:36 | &... | provenance | | +| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:114:15:114:20 | pinned | provenance | | +| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:114:15:114:20 | pinned [&ref] | provenance | | +| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | test_futures_io.rs:114:15:114:20 | pinned [Pin, &ref] | provenance | | +| test_futures_io.rs:113:26:113:47 | ...::new(...) | test_futures_io.rs:113:13:113:22 | mut pinned | provenance | | +| test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | provenance | | +| test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | provenance | | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:76 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:78 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | provenance | MaD:77 | +| test_futures_io.rs:113:40:113:46 | reader2 | test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | provenance | | +| test_futures_io.rs:114:15:114:20 | pinned | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | +| test_futures_io.rs:114:15:114:20 | pinned [&ref] | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | +| test_futures_io.rs:114:15:114:20 | pinned [Pin, &ref] | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | +| test_futures_io.rs:116:13:116:18 | buffer [Ready, Ok] | test_futures_io.rs:117:15:117:20 | buffer [Ready, Ok] | provenance | | +| test_futures_io.rs:116:13:116:18 | buffer [Ready, Ok] | test_futures_io.rs:118:16:118:35 | ...::Ready(...) [Ready, Ok] | provenance | | +| test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | test_futures_io.rs:116:13:116:18 | buffer [Ready, Ok] | provenance | | +| test_futures_io.rs:117:15:117:20 | buffer [Ready, Ok] | test_futures_io.rs:117:14:117:20 | &buffer | provenance | | +| test_futures_io.rs:118:16:118:35 | ...::Ready(...) [Ready, Ok] | test_futures_io.rs:118:28:118:34 | Ok(...) [Ok] | provenance | | +| test_futures_io.rs:118:28:118:34 | Ok(...) [Ok] | test_futures_io.rs:118:31:118:33 | buf | provenance | | +| test_futures_io.rs:118:31:118:33 | buf | test_futures_io.rs:119:18:119:20 | buf | provenance | | +| test_futures_io.rs:125:13:125:18 | buffer | test_futures_io.rs:126:14:126:19 | buffer | provenance | | +| test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | test_futures_io.rs:125:22:125:45 | await ... [Ok] | provenance | | +| test_futures_io.rs:125:22:125:45 | await ... [Ok] | test_futures_io.rs:125:22:125:46 | TryExpr | provenance | | +| test_futures_io.rs:125:22:125:46 | TryExpr | test_futures_io.rs:125:13:125:18 | buffer | provenance | | +| test_futures_io.rs:132:27:132:33 | reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:40 | +| test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | test_futures_io.rs:132:58:132:61 | [post] line | provenance | | +| test_futures_io.rs:132:58:132:61 | [post] line | test_futures_io.rs:133:15:133:18 | line | provenance | | +| test_futures_io.rs:133:15:133:18 | line | test_futures_io.rs:133:14:133:18 | &line | provenance | | +| test_futures_io.rs:139:27:139:33 | reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:38 | +| test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | test_futures_io.rs:139:50:139:53 | [post] line | provenance | | +| test_futures_io.rs:139:50:139:53 | [post] line | test_futures_io.rs:140:15:140:18 | line | provenance | | +| test_futures_io.rs:140:15:140:18 | line | test_futures_io.rs:140:14:140:18 | &line | provenance | | +| test_futures_io.rs:146:27:146:33 | reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | test_futures_io.rs:146:52:146:57 | [post] buffer | provenance | | +| test_futures_io.rs:146:52:146:57 | [post] buffer | test_futures_io.rs:147:15:147:20 | buffer | provenance | | +| test_futures_io.rs:147:15:147:20 | buffer | test_futures_io.rs:147:14:147:20 | &buffer | provenance | | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:73 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:82 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:73 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:82 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:72 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:81 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:72 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:81 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:73 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:82 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:73 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:82 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:72 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:81 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:72 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:81 | +| web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | | +| web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | | +nodes +| test.rs:8:10:8:22 | ...::var | semmle.label | ...::var | +| test.rs:8:10:8:30 | ...::var(...) | semmle.label | ...::var(...) | +| test.rs:9:10:9:25 | ...::var_os | semmle.label | ...::var_os | +| test.rs:9:10:9:33 | ...::var_os(...) | semmle.label | ...::var_os(...) | +| test.rs:11:9:11:12 | var1 | semmle.label | var1 | +| test.rs:11:16:11:28 | ...::var | semmle.label | ...::var | +| test.rs:11:16:11:36 | ...::var(...) [Ok] | semmle.label | ...::var(...) [Ok] | +| test.rs:11:16:11:59 | ... .expect(...) | semmle.label | ... .expect(...) | +| test.rs:12:9:12:12 | var2 | semmle.label | var2 | +| test.rs:12:16:12:31 | ...::var_os | semmle.label | ...::var_os | +| test.rs:12:16:12:39 | ...::var_os(...) [Some] | semmle.label | ...::var_os(...) [Some] | +| test.rs:12:16:12:48 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:14:10:14:13 | var1 | semmle.label | var1 | +| test.rs:15:10:15:13 | var2 | semmle.label | var2 | +| test.rs:29:9:29:12 | args [element] | semmle.label | args [element] | +| test.rs:29:29:29:42 | ...::args | semmle.label | ...::args | +| test.rs:29:29:29:44 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| test.rs:29:29:29:54 | ... .collect() [element] | semmle.label | ... .collect() [element] | +| test.rs:30:9:30:15 | my_path [&ref] | semmle.label | my_path [&ref] | +| test.rs:30:19:30:26 | &... [&ref] | semmle.label | &... [&ref] | +| test.rs:30:20:30:23 | args [element] | semmle.label | args [element] | +| test.rs:30:20:30:26 | args[0] | semmle.label | args[0] | +| test.rs:31:9:31:12 | arg1 [&ref] | semmle.label | arg1 [&ref] | +| test.rs:31:16:31:23 | &... [&ref] | semmle.label | &... [&ref] | +| test.rs:31:17:31:20 | args [element] | semmle.label | args [element] | +| test.rs:31:17:31:23 | args[1] | semmle.label | args[1] | +| test.rs:32:9:32:12 | arg2 | semmle.label | arg2 | +| test.rs:32:16:32:29 | ...::args | semmle.label | ...::args | +| test.rs:32:16:32:31 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| test.rs:32:16:32:38 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| test.rs:32:16:32:47 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:33:9:33:12 | arg3 | semmle.label | arg3 | +| test.rs:33:16:33:32 | ...::args_os | semmle.label | ...::args_os | +| test.rs:33:16:33:34 | ...::args_os(...) [element] | semmle.label | ...::args_os(...) [element] | +| test.rs:33:16:33:41 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| test.rs:33:16:33:50 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:34:9:34:12 | arg4 | semmle.label | arg4 | +| test.rs:34:16:34:29 | ...::args | semmle.label | ...::args | +| test.rs:34:16:34:31 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| test.rs:34:16:34:38 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| test.rs:34:16:34:47 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:34:16:34:64 | ... .parse() [Ok] | semmle.label | ... .parse() [Ok] | +| test.rs:34:16:34:73 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:36:10:36:16 | my_path | semmle.label | my_path | +| test.rs:37:10:37:13 | arg1 | semmle.label | arg1 | +| test.rs:38:10:38:13 | arg2 | semmle.label | arg2 | +| test.rs:39:10:39:13 | arg3 | semmle.label | arg3 | +| test.rs:40:10:40:13 | arg4 | semmle.label | arg4 | +| test.rs:42:9:42:11 | arg | semmle.label | arg | +| test.rs:42:16:42:29 | ...::args | semmle.label | ...::args | +| test.rs:42:16:42:31 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| test.rs:43:14:43:16 | arg | semmle.label | arg | +| test.rs:46:9:46:11 | arg | semmle.label | arg | +| test.rs:46:16:46:32 | ...::args_os | semmle.label | ...::args_os | +| test.rs:46:16:46:34 | ...::args_os(...) [element] | semmle.label | ...::args_os(...) [element] | +| test.rs:47:14:47:16 | arg | semmle.label | arg | +| test.rs:52:9:52:11 | dir | semmle.label | dir | +| test.rs:52:15:52:35 | ...::current_dir | semmle.label | ...::current_dir | +| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | semmle.label | ...::current_dir(...) [Ok] | +| test.rs:52:15:52:54 | ... .expect(...) | semmle.label | ... .expect(...) | +| test.rs:53:9:53:11 | exe | semmle.label | exe | +| test.rs:53:15:53:35 | ...::current_exe | semmle.label | ...::current_exe | +| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | semmle.label | ...::current_exe(...) [Ok] | +| test.rs:53:15:53:54 | ... .expect(...) | semmle.label | ... .expect(...) | +| test.rs:54:9:54:12 | home | semmle.label | home | +| test.rs:54:16:54:33 | ...::home_dir | semmle.label | ...::home_dir | +| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | semmle.label | ...::home_dir(...) [Some] | +| test.rs:54:16:54:52 | ... .expect(...) | semmle.label | ... .expect(...) | +| test.rs:56:10:56:12 | dir | semmle.label | dir | +| test.rs:57:10:57:12 | exe | semmle.label | exe | +| test.rs:58:10:58:13 | home | semmle.label | home | +| test.rs:62:9:62:22 | remote_string1 | semmle.label | remote_string1 | +| test.rs:62:26:62:47 | ...::get | semmle.label | ...::get | +| test.rs:62:26:62:62 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| test.rs:62:26:62:63 | TryExpr | semmle.label | TryExpr | +| test.rs:62:26:62:70 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| test.rs:62:26:62:71 | TryExpr | semmle.label | TryExpr | +| test.rs:63:10:63:23 | remote_string1 | semmle.label | remote_string1 | +| test.rs:65:9:65:22 | remote_string2 | semmle.label | remote_string2 | +| test.rs:65:26:65:47 | ...::get | semmle.label | ...::get | +| test.rs:65:26:65:62 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| test.rs:65:26:65:71 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:65:26:65:78 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| test.rs:65:26:65:87 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:66:10:66:23 | remote_string2 | semmle.label | remote_string2 | +| test.rs:68:9:68:22 | remote_string3 | semmle.label | remote_string3 | +| test.rs:68:26:68:47 | ...::get | semmle.label | ...::get | +| test.rs:68:26:68:62 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| test.rs:68:26:68:71 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | semmle.label | ... .text_with_charset(...) [Ok] | +| test.rs:68:26:68:107 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:69:10:69:23 | remote_string3 | semmle.label | remote_string3 | +| test.rs:71:9:71:22 | remote_string4 | semmle.label | remote_string4 | +| test.rs:71:26:71:47 | ...::get | semmle.label | ...::get | +| test.rs:71:26:71:62 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| test.rs:71:26:71:71 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:71:26:71:79 | ... .bytes() [Ok] | semmle.label | ... .bytes() [Ok] | +| test.rs:71:26:71:88 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:72:10:72:23 | remote_string4 | semmle.label | remote_string4 | +| test.rs:74:9:74:22 | remote_string5 | semmle.label | remote_string5 | +| test.rs:74:26:74:37 | ...::get | semmle.label | ...::get | +| test.rs:74:26:74:52 | ...::get(...) [future, Ok] | semmle.label | ...::get(...) [future, Ok] | +| test.rs:74:26:74:58 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:74:26:74:59 | TryExpr | semmle.label | TryExpr | +| test.rs:74:26:74:66 | ... .text() [future, Ok] | semmle.label | ... .text() [future, Ok] | +| test.rs:74:26:74:72 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:74:26:74:73 | TryExpr | semmle.label | TryExpr | +| test.rs:75:10:75:23 | remote_string5 | semmle.label | remote_string5 | +| test.rs:77:9:77:22 | remote_string6 | semmle.label | remote_string6 | +| test.rs:77:26:77:37 | ...::get | semmle.label | ...::get | +| test.rs:77:26:77:52 | ...::get(...) [future, Ok] | semmle.label | ...::get(...) [future, Ok] | +| test.rs:77:26:77:58 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:77:26:77:59 | TryExpr | semmle.label | TryExpr | +| test.rs:77:26:77:67 | ... .bytes() [future, Ok] | semmle.label | ... .bytes() [future, Ok] | +| test.rs:77:26:77:73 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:77:26:77:74 | TryExpr | semmle.label | TryExpr | +| test.rs:78:10:78:23 | remote_string6 | semmle.label | remote_string6 | +| test.rs:80:9:80:20 | mut request1 | semmle.label | mut request1 | +| test.rs:80:24:80:35 | ...::get | semmle.label | ...::get | +| test.rs:80:24:80:50 | ...::get(...) [future, Ok] | semmle.label | ...::get(...) [future, Ok] | +| test.rs:80:24:80:56 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:80:24:80:57 | TryExpr | semmle.label | TryExpr | +| test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | semmle.label | request1.chunk() [future, Ok, Some] | +| test.rs:81:10:81:31 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | +| test.rs:81:10:81:32 | TryExpr [Some] | semmle.label | TryExpr [Some] | +| test.rs:81:10:81:41 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:82:15:82:25 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| test.rs:82:20:82:24 | chunk | semmle.label | chunk | +| test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | semmle.label | request1.chunk() [future, Ok, Some] | +| test.rs:82:29:82:50 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | +| test.rs:82:29:82:51 | TryExpr [Some] | semmle.label | TryExpr [Some] | +| test.rs:83:14:83:18 | chunk | semmle.label | chunk | +| test.rs:114:13:114:20 | response | semmle.label | response | +| test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | semmle.label | sender.send_request(...) [future, Ok] | +| test.rs:114:24:114:57 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:114:24:114:58 | TryExpr | semmle.label | TryExpr | +| test.rs:114:31:114:42 | send_request | semmle.label | send_request | +| test.rs:115:14:115:22 | &response | semmle.label | &response | +| test.rs:115:15:115:22 | response | semmle.label | response | +| test.rs:116:14:116:21 | response | semmle.label | response | +| test.rs:121:9:121:20 | mut response | semmle.label | mut response | +| test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | semmle.label | sender.send_request(...) [future, Ok] | +| test.rs:121:24:121:57 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:121:24:121:58 | TryExpr | semmle.label | TryExpr | +| test.rs:121:31:121:42 | send_request | semmle.label | send_request | +| test.rs:122:10:122:18 | &response | semmle.label | &response | +| test.rs:122:11:122:18 | response | semmle.label | response | +| test.rs:211:22:211:35 | ...::stdin | semmle.label | ...::stdin | +| test.rs:211:22:211:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:211:44:211:54 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:211:44:211:54 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:211:49:211:54 | [post] buffer | semmle.label | [post] buffer | +| test.rs:212:14:212:20 | &buffer | semmle.label | &buffer | +| test.rs:212:15:212:20 | buffer | semmle.label | buffer | +| test.rs:217:22:217:35 | ...::stdin | semmle.label | ...::stdin | +| test.rs:217:22:217:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:217:51:217:61 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:217:56:217:61 | [post] buffer | semmle.label | [post] buffer | +| test.rs:218:14:218:20 | &buffer | semmle.label | &buffer | +| test.rs:218:15:218:20 | buffer | semmle.label | buffer | +| test.rs:223:22:223:35 | ...::stdin | semmle.label | ...::stdin | +| test.rs:223:22:223:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:223:54:223:64 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:223:54:223:64 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:223:59:223:64 | [post] buffer | semmle.label | [post] buffer | +| test.rs:224:14:224:20 | &buffer | semmle.label | &buffer | +| test.rs:224:15:224:20 | buffer | semmle.label | buffer | +| test.rs:229:22:229:35 | ...::stdin | semmle.label | ...::stdin | +| test.rs:229:22:229:37 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:229:22:229:44 | ... .lock() | semmle.label | ... .lock() | +| test.rs:229:61:229:71 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:229:66:229:71 | [post] buffer | semmle.label | [post] buffer | +| test.rs:230:14:230:20 | &buffer | semmle.label | &buffer | +| test.rs:230:15:230:20 | buffer | semmle.label | buffer | +| test.rs:235:9:235:22 | ...::stdin | semmle.label | ...::stdin | +| test.rs:235:9:235:24 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:235:37:235:47 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:235:37:235:47 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:235:42:235:47 | [post] buffer | semmle.label | [post] buffer | +| test.rs:236:14:236:20 | &buffer | semmle.label | &buffer | +| test.rs:236:15:236:20 | buffer | semmle.label | buffer | +| test.rs:239:17:239:30 | ...::stdin | semmle.label | ...::stdin | +| test.rs:239:17:239:32 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:239:17:239:40 | ... .bytes() | semmle.label | ... .bytes() | +| test.rs:240:14:240:17 | byte | semmle.label | byte | +| test.rs:246:13:246:22 | mut reader | semmle.label | mut reader | +| test.rs:246:26:246:66 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:246:50:246:63 | ...::stdin | semmle.label | ...::stdin | +| test.rs:246:50:246:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:247:13:247:16 | data | semmle.label | data | +| test.rs:247:20:247:36 | reader.fill_buf() [Ok] | semmle.label | reader.fill_buf() [Ok] | +| test.rs:247:20:247:37 | TryExpr | semmle.label | TryExpr | +| test.rs:248:14:248:18 | &data | semmle.label | &data | +| test.rs:248:15:248:18 | data | semmle.label | data | +| test.rs:252:13:252:18 | reader | semmle.label | reader | +| test.rs:252:22:252:62 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:252:46:252:59 | ...::stdin | semmle.label | ...::stdin | +| test.rs:252:46:252:61 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:253:13:253:16 | data | semmle.label | data | +| test.rs:253:20:253:34 | reader.buffer() | semmle.label | reader.buffer() | +| test.rs:254:14:254:18 | &data | semmle.label | &data | +| test.rs:254:15:254:18 | data | semmle.label | data | +| test.rs:259:13:259:22 | mut reader | semmle.label | mut reader | +| test.rs:259:26:259:66 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:259:50:259:63 | ...::stdin | semmle.label | ...::stdin | +| test.rs:259:50:259:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:260:26:260:36 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:260:31:260:36 | [post] buffer | semmle.label | [post] buffer | +| test.rs:261:14:261:20 | &buffer | semmle.label | &buffer | +| test.rs:261:15:261:20 | buffer | semmle.label | buffer | +| test.rs:266:13:266:22 | mut reader | semmle.label | mut reader | +| test.rs:266:26:266:66 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:266:50:266:63 | ...::stdin | semmle.label | ...::stdin | +| test.rs:266:50:266:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:267:33:267:43 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:267:38:267:43 | [post] buffer | semmle.label | [post] buffer | +| test.rs:268:14:268:20 | &buffer | semmle.label | &buffer | +| test.rs:268:15:268:20 | buffer | semmle.label | buffer | +| test.rs:269:14:269:22 | buffer[0] | semmle.label | buffer[0] | +| test.rs:273:13:273:28 | mut reader_split | semmle.label | mut reader_split | +| test.rs:273:32:273:72 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:273:32:273:84 | ... .split(...) | semmle.label | ... .split(...) | +| test.rs:273:56:273:69 | ...::stdin | semmle.label | ...::stdin | +| test.rs:273:56:273:71 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | semmle.label | reader_split.next() [Some, Ok] | +| test.rs:274:14:274:41 | ... .unwrap() [Ok] | semmle.label | ... .unwrap() [Ok] | +| test.rs:274:14:274:50 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:275:19:275:29 | Some(...) [Some, Ok] | semmle.label | Some(...) [Some, Ok] | +| test.rs:275:24:275:28 | chunk [Ok] | semmle.label | chunk [Ok] | +| test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | semmle.label | reader_split.next() [Some, Ok] | +| test.rs:276:18:276:31 | chunk.unwrap() | semmle.label | chunk.unwrap() | +| test.rs:281:13:281:18 | reader | semmle.label | reader | +| test.rs:281:22:281:62 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:281:46:281:59 | ...::stdin | semmle.label | ...::stdin | +| test.rs:281:46:281:61 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:282:21:282:34 | reader.lines() | semmle.label | reader.lines() | +| test.rs:283:18:283:21 | line | semmle.label | line | +| test.rs:309:13:309:21 | mut stdin | semmle.label | mut stdin | +| test.rs:309:25:309:40 | ...::stdin | semmle.label | ...::stdin | +| test.rs:309:25:309:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:311:33:311:43 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:311:38:311:43 | [post] buffer | semmle.label | [post] buffer | +| test.rs:312:14:312:20 | &buffer | semmle.label | &buffer | +| test.rs:312:15:312:20 | buffer | semmle.label | buffer | +| test.rs:316:13:316:21 | mut stdin | semmle.label | mut stdin | +| test.rs:316:25:316:40 | ...::stdin | semmle.label | ...::stdin | +| test.rs:316:25:316:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:318:40:318:50 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:318:45:318:50 | [post] buffer | semmle.label | [post] buffer | +| test.rs:319:14:319:20 | &buffer | semmle.label | &buffer | +| test.rs:319:15:319:20 | buffer | semmle.label | buffer | +| test.rs:323:13:323:21 | mut stdin | semmle.label | mut stdin | +| test.rs:323:25:323:40 | ...::stdin | semmle.label | ...::stdin | +| test.rs:323:25:323:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:325:43:325:53 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:325:48:325:53 | [post] buffer | semmle.label | [post] buffer | +| test.rs:326:14:326:20 | &buffer | semmle.label | &buffer | +| test.rs:326:15:326:20 | buffer | semmle.label | buffer | +| test.rs:330:13:330:21 | mut stdin | semmle.label | mut stdin | +| test.rs:330:25:330:40 | ...::stdin | semmle.label | ...::stdin | +| test.rs:330:25:330:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:332:26:332:36 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:332:31:332:36 | [post] buffer | semmle.label | [post] buffer | +| test.rs:333:14:333:20 | &buffer | semmle.label | &buffer | +| test.rs:333:15:333:20 | buffer | semmle.label | buffer | +| test.rs:337:13:337:21 | mut stdin | semmle.label | mut stdin | +| test.rs:337:25:337:40 | ...::stdin | semmle.label | ...::stdin | +| test.rs:337:25:337:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:338:13:338:14 | v1 | semmle.label | v1 | +| test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | semmle.label | stdin.read_u8() [future, Ok] | +| test.rs:338:18:338:38 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:338:18:338:39 | TryExpr | semmle.label | TryExpr | +| test.rs:339:13:339:14 | v2 | semmle.label | v2 | +| test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | semmle.label | stdin.read_i16() [future, Ok] | +| test.rs:339:18:339:39 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:339:18:339:40 | TryExpr | semmle.label | TryExpr | +| test.rs:340:13:340:14 | v3 | semmle.label | v3 | +| test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | semmle.label | stdin.read_f32() [future, Ok] | +| test.rs:340:18:340:39 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:340:18:340:40 | TryExpr | semmle.label | TryExpr | +| test.rs:341:13:341:14 | v4 | semmle.label | v4 | +| test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | semmle.label | stdin.read_i64_le() [future, Ok] | +| test.rs:341:18:341:42 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:341:18:341:43 | TryExpr | semmle.label | TryExpr | +| test.rs:342:14:342:15 | v1 | semmle.label | v1 | +| test.rs:343:14:343:15 | v2 | semmle.label | v2 | +| test.rs:344:14:344:15 | v3 | semmle.label | v3 | +| test.rs:345:14:345:15 | v4 | semmle.label | v4 | +| test.rs:349:13:349:21 | mut stdin | semmle.label | mut stdin | +| test.rs:349:25:349:40 | ...::stdin | semmle.label | ...::stdin | +| test.rs:349:25:349:42 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:351:24:351:34 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:351:29:351:34 | [post] buffer | semmle.label | [post] buffer | +| test.rs:352:14:352:20 | &buffer | semmle.label | &buffer | +| test.rs:352:15:352:20 | buffer | semmle.label | buffer | +| test.rs:358:13:358:22 | mut reader | semmle.label | mut reader | +| test.rs:358:26:358:70 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:358:52:358:67 | ...::stdin | semmle.label | ...::stdin | +| test.rs:358:52:358:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:359:13:359:16 | data | semmle.label | data | +| test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | semmle.label | reader.fill_buf() [future, Ok] | +| test.rs:359:20:359:42 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:359:20:359:43 | TryExpr | semmle.label | TryExpr | +| test.rs:360:14:360:18 | &data | semmle.label | &data | +| test.rs:360:15:360:18 | data | semmle.label | data | +| test.rs:364:13:364:18 | reader | semmle.label | reader | +| test.rs:364:22:364:66 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:364:48:364:63 | ...::stdin | semmle.label | ...::stdin | +| test.rs:364:48:364:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:365:13:365:16 | data | semmle.label | data | +| test.rs:365:20:365:34 | reader.buffer() | semmle.label | reader.buffer() | +| test.rs:366:14:366:18 | &data | semmle.label | &data | +| test.rs:366:15:366:18 | data | semmle.label | data | +| test.rs:371:13:371:22 | mut reader | semmle.label | mut reader | +| test.rs:371:26:371:70 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:371:52:371:67 | ...::stdin | semmle.label | ...::stdin | +| test.rs:371:52:371:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:372:26:372:36 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:372:31:372:36 | [post] buffer | semmle.label | [post] buffer | +| test.rs:373:14:373:20 | &buffer | semmle.label | &buffer | +| test.rs:373:15:373:20 | buffer | semmle.label | buffer | +| test.rs:378:13:378:22 | mut reader | semmle.label | mut reader | +| test.rs:378:26:378:70 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:378:52:378:67 | ...::stdin | semmle.label | ...::stdin | +| test.rs:378:52:378:69 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:379:33:379:43 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:379:38:379:43 | [post] buffer | semmle.label | [post] buffer | +| test.rs:380:14:380:20 | &buffer | semmle.label | &buffer | +| test.rs:380:15:380:20 | buffer | semmle.label | buffer | +| test.rs:381:14:381:22 | buffer[0] | semmle.label | buffer[0] | +| test.rs:385:13:385:28 | mut reader_split | semmle.label | mut reader_split | +| test.rs:385:32:385:76 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:385:32:385:88 | ... .split(...) | semmle.label | ... .split(...) | +| test.rs:385:58:385:73 | ...::stdin | semmle.label | ...::stdin | +| test.rs:385:58:385:75 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | semmle.label | reader_split.next_segment() [future, Ok, Some] | +| test.rs:386:14:386:46 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | +| test.rs:386:14:386:47 | TryExpr [Some] | semmle.label | TryExpr [Some] | +| test.rs:386:14:386:56 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:387:19:387:29 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| test.rs:387:24:387:28 | chunk | semmle.label | chunk | +| test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | semmle.label | reader_split.next_segment() [future, Ok, Some] | +| test.rs:387:33:387:65 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | +| test.rs:387:33:387:66 | TryExpr [Some] | semmle.label | TryExpr [Some] | +| test.rs:388:18:388:22 | chunk | semmle.label | chunk | +| test.rs:393:13:393:18 | reader | semmle.label | reader | +| test.rs:393:22:393:66 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:393:48:393:63 | ...::stdin | semmle.label | ...::stdin | +| test.rs:393:48:393:65 | ...::stdin(...) | semmle.label | ...::stdin(...) | +| test.rs:394:13:394:21 | mut lines | semmle.label | mut lines | +| test.rs:394:25:394:38 | reader.lines() | semmle.label | reader.lines() | +| test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | semmle.label | lines.next_line() [future, Ok, Some] | +| test.rs:395:14:395:36 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | +| test.rs:395:14:395:37 | TryExpr [Some] | semmle.label | TryExpr [Some] | +| test.rs:395:14:395:46 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:396:19:396:28 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| test.rs:396:24:396:27 | line | semmle.label | line | +| test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | semmle.label | lines.next_line() [future, Ok, Some] | +| test.rs:396:32:396:54 | await ... [Ok, Some] | semmle.label | await ... [Ok, Some] | +| test.rs:396:32:396:55 | TryExpr [Some] | semmle.label | TryExpr [Some] | +| test.rs:397:18:397:21 | line | semmle.label | line | +| test.rs:408:13:408:18 | buffer | semmle.label | buffer | +| test.rs:408:31:408:43 | ...::read | semmle.label | ...::read | +| test.rs:408:31:408:43 | ...::read [Ok] | semmle.label | ...::read [Ok] | +| test.rs:408:31:408:55 | ...::read(...) [Ok] | semmle.label | ...::read(...) [Ok] | +| test.rs:408:31:408:56 | TryExpr | semmle.label | TryExpr | +| test.rs:409:14:409:19 | buffer | semmle.label | buffer | +| test.rs:413:13:413:18 | buffer | semmle.label | buffer | +| test.rs:413:31:413:38 | ...::read | semmle.label | ...::read | +| test.rs:413:31:413:38 | ...::read [Ok] | semmle.label | ...::read [Ok] | +| test.rs:413:31:413:50 | ...::read(...) [Ok] | semmle.label | ...::read(...) [Ok] | +| test.rs:413:31:413:51 | TryExpr | semmle.label | TryExpr | +| test.rs:414:14:414:19 | buffer | semmle.label | buffer | +| test.rs:418:13:418:18 | buffer | semmle.label | buffer | +| test.rs:418:22:418:39 | ...::read_to_string | semmle.label | ...::read_to_string | +| test.rs:418:22:418:39 | ...::read_to_string [Ok] | semmle.label | ...::read_to_string [Ok] | +| test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | semmle.label | ...::read_to_string(...) [Ok] | +| test.rs:418:22:418:52 | TryExpr | semmle.label | TryExpr | +| test.rs:419:14:419:19 | buffer | semmle.label | buffer | +| test.rs:425:13:425:16 | path | semmle.label | path | +| test.rs:425:20:425:27 | e.path() | semmle.label | e.path() | +| test.rs:425:22:425:25 | path | semmle.label | path | +| test.rs:426:14:426:17 | path | semmle.label | path | +| test.rs:426:14:426:25 | path.clone() | semmle.label | path.clone() | +| test.rs:427:14:427:17 | path | semmle.label | path | +| test.rs:427:14:427:25 | path.clone() | semmle.label | path.clone() | +| test.rs:427:14:427:35 | ... .as_path() | semmle.label | ... .as_path() | +| test.rs:437:14:437:17 | path | semmle.label | path | +| test.rs:439:13:439:21 | file_name | semmle.label | file_name | +| test.rs:439:25:439:37 | e.file_name() | semmle.label | e.file_name() | +| test.rs:439:27:439:35 | file_name | semmle.label | file_name | +| test.rs:440:14:440:22 | file_name | semmle.label | file_name | +| test.rs:440:14:440:30 | file_name.clone() | semmle.label | file_name.clone() | +| test.rs:445:14:445:22 | file_name | semmle.label | file_name | +| test.rs:461:13:461:18 | target | semmle.label | target | +| test.rs:461:22:461:34 | ...::read_link | semmle.label | ...::read_link | +| test.rs:461:22:461:49 | ...::read_link(...) [Ok] | semmle.label | ...::read_link(...) [Ok] | +| test.rs:461:22:461:50 | TryExpr | semmle.label | TryExpr | +| test.rs:462:14:462:19 | target | semmle.label | target | +| test.rs:470:13:470:18 | buffer | semmle.label | buffer | +| test.rs:470:31:470:45 | ...::read | semmle.label | ...::read | +| test.rs:470:31:470:57 | ...::read(...) [future, Ok] | semmle.label | ...::read(...) [future, Ok] | +| test.rs:470:31:470:63 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:470:31:470:64 | TryExpr | semmle.label | TryExpr | +| test.rs:471:14:471:19 | buffer | semmle.label | buffer | +| test.rs:475:13:475:18 | buffer | semmle.label | buffer | +| test.rs:475:31:475:45 | ...::read | semmle.label | ...::read | +| test.rs:475:31:475:57 | ...::read(...) [future, Ok] | semmle.label | ...::read(...) [future, Ok] | +| test.rs:475:31:475:63 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:475:31:475:64 | TryExpr | semmle.label | TryExpr | +| test.rs:476:14:476:19 | buffer | semmle.label | buffer | +| test.rs:480:13:480:18 | buffer | semmle.label | buffer | +| test.rs:480:22:480:46 | ...::read_to_string | semmle.label | ...::read_to_string | +| test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | semmle.label | ...::read_to_string(...) [future, Ok] | +| test.rs:480:22:480:64 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:480:22:480:65 | TryExpr | semmle.label | TryExpr | +| test.rs:481:14:481:19 | buffer | semmle.label | buffer | +| test.rs:486:13:486:16 | path | semmle.label | path | +| test.rs:486:20:486:31 | entry.path() | semmle.label | entry.path() | +| test.rs:486:26:486:29 | path | semmle.label | path | +| test.rs:486:26:486:29 | path | semmle.label | path | +| test.rs:487:13:487:21 | file_name | semmle.label | file_name | +| test.rs:487:25:487:41 | entry.file_name() | semmle.label | entry.file_name() | +| test.rs:487:31:487:39 | file_name | semmle.label | file_name | +| test.rs:487:31:487:39 | file_name | semmle.label | file_name | +| test.rs:488:14:488:17 | path | semmle.label | path | +| test.rs:489:14:489:22 | file_name | semmle.label | file_name | +| test.rs:493:13:493:18 | target | semmle.label | target | +| test.rs:493:22:493:41 | ...::read_link | semmle.label | ...::read_link | +| test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | semmle.label | ...::read_link(...) [future, Ok] | +| test.rs:493:22:493:62 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:493:22:493:63 | TryExpr | semmle.label | TryExpr | +| test.rs:494:14:494:19 | target | semmle.label | target | +| test.rs:503:9:503:16 | mut file | semmle.label | mut file | +| test.rs:503:20:503:38 | ...::open | semmle.label | ...::open | +| test.rs:503:20:503:50 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | +| test.rs:503:20:503:51 | TryExpr | semmle.label | TryExpr | +| test.rs:507:32:507:42 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:507:32:507:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:507:37:507:42 | [post] buffer | semmle.label | [post] buffer | +| test.rs:508:14:508:20 | &buffer | semmle.label | &buffer | +| test.rs:508:15:508:20 | buffer | semmle.label | buffer | +| test.rs:513:39:513:49 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:513:39:513:49 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:513:44:513:49 | [post] buffer | semmle.label | [post] buffer | +| test.rs:514:14:514:20 | &buffer | semmle.label | &buffer | +| test.rs:514:15:514:20 | buffer | semmle.label | buffer | +| test.rs:519:42:519:52 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:519:42:519:52 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:519:47:519:52 | [post] buffer | semmle.label | [post] buffer | +| test.rs:520:14:520:20 | &buffer | semmle.label | &buffer | +| test.rs:520:15:520:20 | buffer | semmle.label | buffer | +| test.rs:525:25:525:35 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:525:30:525:35 | [post] buffer | semmle.label | [post] buffer | +| test.rs:526:14:526:20 | &buffer | semmle.label | &buffer | +| test.rs:526:15:526:20 | buffer | semmle.label | buffer | +| test.rs:529:17:529:28 | file.bytes() | semmle.label | file.bytes() | +| test.rs:530:14:530:17 | byte | semmle.label | byte | +| test.rs:536:13:536:18 | mut f1 | semmle.label | mut f1 | +| test.rs:536:22:536:63 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | +| test.rs:536:22:536:72 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:536:50:536:53 | open | semmle.label | open | +| test.rs:538:30:538:40 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:538:30:538:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:538:35:538:40 | [post] buffer | semmle.label | [post] buffer | +| test.rs:539:14:539:20 | &buffer | semmle.label | &buffer | +| test.rs:539:15:539:20 | buffer | semmle.label | buffer | +| test.rs:543:13:543:18 | mut f2 | semmle.label | mut f2 | +| test.rs:543:22:543:80 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | +| test.rs:543:22:543:89 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:543:67:543:70 | open | semmle.label | open | +| test.rs:545:30:545:40 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:545:30:545:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:545:35:545:40 | [post] buffer | semmle.label | [post] buffer | +| test.rs:546:14:546:20 | &buffer | semmle.label | &buffer | +| test.rs:546:15:546:20 | buffer | semmle.label | buffer | +| test.rs:550:13:550:18 | mut f3 | semmle.label | mut f3 | +| test.rs:550:22:550:114 | ... .open(...) [Ok] | semmle.label | ... .open(...) [Ok] | +| test.rs:550:22:550:123 | ... .unwrap() | semmle.label | ... .unwrap() | +| test.rs:550:101:550:104 | open | semmle.label | open | +| test.rs:552:30:552:40 | [post] &mut buffer | semmle.label | [post] &mut buffer | +| test.rs:552:30:552:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:552:35:552:40 | [post] buffer | semmle.label | [post] buffer | +| test.rs:553:14:553:20 | &buffer | semmle.label | &buffer | +| test.rs:553:15:553:20 | buffer | semmle.label | buffer | +| test.rs:560:13:560:17 | file1 | semmle.label | file1 | +| test.rs:560:21:560:39 | ...::open | semmle.label | ...::open | +| test.rs:560:21:560:51 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | +| test.rs:560:21:560:52 | TryExpr | semmle.label | TryExpr | +| test.rs:561:13:561:17 | file2 | semmle.label | file2 | +| test.rs:561:21:561:39 | ...::open | semmle.label | ...::open | +| test.rs:561:21:561:59 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | +| test.rs:561:21:561:60 | TryExpr | semmle.label | TryExpr | +| test.rs:562:13:562:22 | mut reader | semmle.label | mut reader | +| test.rs:562:26:562:43 | file1.chain(...) | semmle.label | file1.chain(...) | +| test.rs:562:38:562:42 | file2 | semmle.label | file2 | +| test.rs:563:31:563:41 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:563:36:563:41 | [post] buffer | semmle.label | [post] buffer | +| test.rs:564:14:564:20 | &buffer | semmle.label | &buffer | +| test.rs:564:15:564:20 | buffer | semmle.label | buffer | +| test.rs:569:13:569:17 | file1 | semmle.label | file1 | +| test.rs:569:21:569:39 | ...::open | semmle.label | ...::open | +| test.rs:569:21:569:51 | ...::open(...) [Ok] | semmle.label | ...::open(...) [Ok] | +| test.rs:569:21:569:52 | TryExpr | semmle.label | TryExpr | +| test.rs:570:13:570:22 | mut reader | semmle.label | mut reader | +| test.rs:570:26:570:40 | file1.take(...) | semmle.label | file1.take(...) | +| test.rs:571:31:571:41 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:571:36:571:41 | [post] buffer | semmle.label | [post] buffer | +| test.rs:572:14:572:20 | &buffer | semmle.label | &buffer | +| test.rs:572:15:572:20 | buffer | semmle.label | buffer | +| test.rs:581:9:581:16 | mut file | semmle.label | mut file | +| test.rs:581:20:581:40 | ...::open | semmle.label | ...::open | +| test.rs:581:20:581:52 | ...::open(...) [future, Ok] | semmle.label | ...::open(...) [future, Ok] | +| test.rs:581:20:581:58 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:581:20:581:59 | TryExpr | semmle.label | TryExpr | +| test.rs:585:32:585:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:585:37:585:42 | [post] buffer | semmle.label | [post] buffer | +| test.rs:586:14:586:20 | &buffer | semmle.label | &buffer | +| test.rs:586:15:586:20 | buffer | semmle.label | buffer | +| test.rs:591:39:591:49 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:591:44:591:49 | [post] buffer | semmle.label | [post] buffer | +| test.rs:592:14:592:20 | &buffer | semmle.label | &buffer | +| test.rs:592:15:592:20 | buffer | semmle.label | buffer | +| test.rs:597:42:597:52 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:597:47:597:52 | [post] buffer | semmle.label | [post] buffer | +| test.rs:598:14:598:20 | &buffer | semmle.label | &buffer | +| test.rs:598:15:598:20 | buffer | semmle.label | buffer | +| test.rs:603:25:603:35 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:603:30:603:35 | [post] buffer | semmle.label | [post] buffer | +| test.rs:604:14:604:20 | &buffer | semmle.label | &buffer | +| test.rs:604:15:604:20 | buffer | semmle.label | buffer | +| test.rs:608:13:608:14 | v1 | semmle.label | v1 | +| test.rs:608:18:608:31 | file.read_u8() [future, Ok] | semmle.label | file.read_u8() [future, Ok] | +| test.rs:608:18:608:37 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:608:18:608:38 | TryExpr | semmle.label | TryExpr | +| test.rs:609:13:609:14 | v2 | semmle.label | v2 | +| test.rs:609:18:609:32 | file.read_i16() [future, Ok] | semmle.label | file.read_i16() [future, Ok] | +| test.rs:609:18:609:38 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:609:18:609:39 | TryExpr | semmle.label | TryExpr | +| test.rs:610:13:610:14 | v3 | semmle.label | v3 | +| test.rs:610:18:610:32 | file.read_f32() [future, Ok] | semmle.label | file.read_f32() [future, Ok] | +| test.rs:610:18:610:38 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:610:18:610:39 | TryExpr | semmle.label | TryExpr | +| test.rs:611:13:611:14 | v4 | semmle.label | v4 | +| test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | semmle.label | file.read_i64_le() [future, Ok] | +| test.rs:611:18:611:41 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:611:18:611:42 | TryExpr | semmle.label | TryExpr | +| test.rs:612:14:612:15 | v1 | semmle.label | v1 | +| test.rs:613:14:613:15 | v2 | semmle.label | v2 | +| test.rs:614:14:614:15 | v3 | semmle.label | v3 | +| test.rs:615:14:615:15 | v4 | semmle.label | v4 | +| test.rs:620:23:620:33 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:620:28:620:33 | [post] buffer | semmle.label | [post] buffer | +| test.rs:621:14:621:20 | &buffer | semmle.label | &buffer | +| test.rs:621:15:621:20 | buffer | semmle.label | buffer | +| test.rs:627:13:627:18 | mut f1 | semmle.label | mut f1 | +| test.rs:627:22:627:65 | ... .open(...) [future, Ok] | semmle.label | ... .open(...) [future, Ok] | +| test.rs:627:22:627:71 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:627:22:627:72 | TryExpr | semmle.label | TryExpr | +| test.rs:627:52:627:55 | open | semmle.label | open | +| test.rs:629:30:629:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:629:35:629:40 | [post] buffer | semmle.label | [post] buffer | +| test.rs:630:14:630:20 | &buffer | semmle.label | &buffer | +| test.rs:630:15:630:20 | buffer | semmle.label | buffer | +| test.rs:688:13:688:22 | mut stream | semmle.label | mut stream | +| test.rs:688:26:688:53 | ...::connect | semmle.label | ...::connect | +| test.rs:688:26:688:62 | ...::connect(...) [Ok] | semmle.label | ...::connect(...) [Ok] | +| test.rs:688:26:688:63 | TryExpr | semmle.label | TryExpr | +| test.rs:695:29:695:39 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:695:34:695:39 | [post] buffer | semmle.label | [post] buffer | +| test.rs:698:14:698:20 | &buffer | semmle.label | &buffer | +| test.rs:698:15:698:20 | buffer | semmle.label | buffer | +| test.rs:699:14:699:22 | buffer[0] | semmle.label | buffer[0] | +| test.rs:707:13:707:22 | mut stream | semmle.label | mut stream | +| test.rs:707:26:707:61 | ...::connect_timeout | semmle.label | ...::connect_timeout | +| test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | semmle.label | ...::connect_timeout(...) [Ok] | +| test.rs:707:26:707:106 | TryExpr | semmle.label | TryExpr | +| test.rs:715:21:715:30 | mut reader | semmle.label | mut reader | +| test.rs:715:34:715:64 | ...::new(...) | semmle.label | ...::new(...) | +| test.rs:715:34:715:74 | ... .take(...) | semmle.label | ... .take(...) | +| test.rs:715:58:715:63 | stream | semmle.label | stream | +| test.rs:718:44:718:52 | [post] &mut line [&ref] | semmle.label | [post] &mut line [&ref] | +| test.rs:718:49:718:52 | [post] line | semmle.label | [post] line | +| test.rs:725:34:725:38 | &line | semmle.label | &line | +| test.rs:725:35:725:38 | line | semmle.label | line | +| test.rs:759:9:759:24 | mut tokio_stream | semmle.label | mut tokio_stream | +| test.rs:759:28:759:57 | ...::connect | semmle.label | ...::connect | +| test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | semmle.label | ...::connect(...) [future, Ok] | +| test.rs:759:28:759:72 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:759:28:759:73 | TryExpr | semmle.label | TryExpr | +| test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | semmle.label | [post] &mut buffer1 [&ref] | +| test.rs:767:40:767:46 | [post] buffer1 | semmle.label | [post] buffer1 | +| test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | semmle.label | [post] &mut buffer2 [&ref] | +| test.rs:771:41:771:47 | [post] buffer2 | semmle.label | [post] buffer2 | +| test.rs:774:14:774:21 | &buffer1 | semmle.label | &buffer1 | +| test.rs:774:15:774:21 | buffer1 | semmle.label | buffer1 | +| test.rs:775:14:775:23 | buffer1[0] | semmle.label | buffer1[0] | +| test.rs:778:14:778:21 | &buffer2 | semmle.label | &buffer2 | +| test.rs:778:15:778:21 | buffer2 | semmle.label | buffer2 | +| test.rs:779:14:779:23 | buffer2[0] | semmle.label | buffer2[0] | +| test.rs:787:41:787:51 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:787:46:787:51 | [post] buffer | semmle.label | [post] buffer | +| test.rs:794:26:794:32 | &buffer | semmle.label | &buffer | +| test.rs:794:27:794:32 | buffer | semmle.label | buffer | +| test.rs:810:45:810:55 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:810:50:810:55 | [post] buffer | semmle.label | [post] buffer | +| test.rs:817:26:817:32 | &buffer | semmle.label | &buffer | +| test.rs:817:27:817:32 | buffer | semmle.label | buffer | +| test_futures_io.rs:19:9:19:11 | tcp | semmle.label | tcp | +| test_futures_io.rs:19:15:19:32 | ...::connect | semmle.label | ...::connect | +| test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | semmle.label | ...::connect(...) [future, Ok] | +| test_futures_io.rs:19:15:19:43 | await ... [Ok] | semmle.label | await ... [Ok] | +| test_futures_io.rs:19:15:19:44 | TryExpr | semmle.label | TryExpr | +| test_futures_io.rs:20:10:20:13 | &tcp | semmle.label | &tcp | +| test_futures_io.rs:20:11:20:13 | tcp | semmle.label | tcp | +| test_futures_io.rs:26:9:26:18 | mut reader | semmle.label | mut reader | +| test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | semmle.label | connector.connect(...) [future, Ok] | +| test_futures_io.rs:26:22:26:62 | await ... [Ok] | semmle.label | await ... [Ok] | +| test_futures_io.rs:26:22:26:63 | TryExpr | semmle.label | TryExpr | +| test_futures_io.rs:26:53:26:55 | tcp | semmle.label | tcp | +| test_futures_io.rs:27:10:27:16 | &reader | semmle.label | &reader | +| test_futures_io.rs:27:11:27:16 | reader | semmle.label | reader | +| test_futures_io.rs:32:13:32:22 | mut pinned | semmle.label | mut pinned | +| test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | semmle.label | mut pinned [&ref] | +| test_futures_io.rs:32:13:32:22 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | +| test_futures_io.rs:32:26:32:46 | ...::new(...) | semmle.label | ...::new(...) | +| test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | semmle.label | &mut reader [&ref] | +| test_futures_io.rs:32:40:32:45 | reader | semmle.label | reader | +| test_futures_io.rs:33:14:33:20 | &pinned | semmle.label | &pinned | +| test_futures_io.rs:33:15:33:20 | pinned | semmle.label | pinned | +| test_futures_io.rs:33:15:33:20 | pinned [&ref] | semmle.label | pinned [&ref] | +| test_futures_io.rs:33:15:33:20 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | +| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | semmle.label | &mut reader [&ref] | +| test_futures_io.rs:45:64:45:69 | reader | semmle.label | reader | +| test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | semmle.label | [post] &mut buffer1 [&ref] | +| test_futures_io.rs:45:77:45:83 | [post] buffer1 | semmle.label | [post] buffer1 | +| test_futures_io.rs:46:14:46:36 | &... | semmle.label | &... | +| test_futures_io.rs:46:15:46:36 | buffer1[...] | semmle.label | buffer1[...] | +| test_futures_io.rs:49:27:49:32 | reader | semmle.label | reader | +| test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | semmle.label | [post] &mut buffer2 [&ref] | +| test_futures_io.rs:49:44:49:50 | [post] buffer2 | semmle.label | [post] buffer2 | +| test_futures_io.rs:51:14:51:36 | &... | semmle.label | &... | +| test_futures_io.rs:51:15:51:36 | buffer2[...] | semmle.label | buffer2[...] | +| test_futures_io.rs:54:9:54:19 | mut reader2 | semmle.label | mut reader2 | +| test_futures_io.rs:54:23:54:57 | ...::new(...) | semmle.label | ...::new(...) | +| test_futures_io.rs:54:51:54:56 | reader | semmle.label | reader | +| test_futures_io.rs:55:10:55:17 | &reader2 | semmle.label | &reader2 | +| test_futures_io.rs:55:11:55:17 | reader2 | semmle.label | reader2 | +| test_futures_io.rs:59:13:59:22 | mut pinned | semmle.label | mut pinned | +| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | semmle.label | mut pinned [&ref] | +| test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | +| test_futures_io.rs:59:26:59:47 | ...::new(...) | semmle.label | ...::new(...) | +| test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | +| test_futures_io.rs:59:40:59:46 | reader2 | semmle.label | reader2 | +| test_futures_io.rs:60:14:60:20 | &pinned | semmle.label | &pinned | +| test_futures_io.rs:60:15:60:20 | pinned | semmle.label | pinned | +| test_futures_io.rs:60:15:60:20 | pinned [&ref] | semmle.label | pinned [&ref] | +| test_futures_io.rs:60:15:60:20 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | +| test_futures_io.rs:62:13:62:18 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | +| test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | semmle.label | pinned.poll_fill_buf(...) [Ready, Ok] | +| test_futures_io.rs:63:16:63:35 | ...::Ready(...) [Ready, Ok] | semmle.label | ...::Ready(...) [Ready, Ok] | +| test_futures_io.rs:63:28:63:34 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| test_futures_io.rs:63:31:63:33 | buf | semmle.label | buf | +| test_futures_io.rs:64:18:64:24 | &buffer | semmle.label | &buffer | +| test_futures_io.rs:64:19:64:24 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | +| test_futures_io.rs:65:18:65:20 | buf | semmle.label | buf | +| test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | +| test_futures_io.rs:69:23:69:44 | ...::new(...) | semmle.label | ...::new(...) | +| test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | semmle.label | ... .poll_fill_buf(...) [Ready, Ok] | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | +| test_futures_io.rs:69:37:69:43 | reader2 | semmle.label | reader2 | +| test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | +| test_futures_io.rs:71:13:71:32 | ...::Ready(...) [Ready, Ok] | semmle.label | ...::Ready(...) [Ready, Ok] | +| test_futures_io.rs:71:25:71:31 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| test_futures_io.rs:71:28:71:30 | buf | semmle.label | buf | +| test_futures_io.rs:72:22:72:29 | &buffer2 | semmle.label | &buffer2 | +| test_futures_io.rs:72:23:72:29 | buffer2 [Ready, Ok] | semmle.label | buffer2 [Ready, Ok] | +| test_futures_io.rs:73:22:73:24 | buf | semmle.label | buf | +| test_futures_io.rs:83:13:83:18 | buffer | semmle.label | buffer | +| test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | semmle.label | reader2.fill_buf() [future, Ok] | +| test_futures_io.rs:83:22:83:45 | await ... [Ok] | semmle.label | await ... [Ok] | +| test_futures_io.rs:83:22:83:46 | TryExpr | semmle.label | TryExpr | +| test_futures_io.rs:84:14:84:19 | buffer | semmle.label | buffer | +| test_futures_io.rs:90:13:90:22 | mut pinned | semmle.label | mut pinned | +| test_futures_io.rs:90:13:90:22 | mut pinned [&ref] | semmle.label | mut pinned [&ref] | +| test_futures_io.rs:90:13:90:22 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | +| test_futures_io.rs:90:26:90:47 | ...::new(...) | semmle.label | ...::new(...) | +| test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | +| test_futures_io.rs:90:40:90:46 | reader2 | semmle.label | reader2 | +| test_futures_io.rs:91:14:91:20 | &pinned | semmle.label | &pinned | +| test_futures_io.rs:91:15:91:20 | pinned | semmle.label | pinned | +| test_futures_io.rs:91:15:91:20 | pinned [&ref] | semmle.label | pinned [&ref] | +| test_futures_io.rs:91:15:91:20 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | +| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | +| test_futures_io.rs:103:64:103:70 | reader2 | semmle.label | reader2 | +| test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | semmle.label | [post] &mut buffer1 [&ref] | +| test_futures_io.rs:103:78:103:84 | [post] buffer1 | semmle.label | [post] buffer1 | +| test_futures_io.rs:104:14:104:36 | &... | semmle.label | &... | +| test_futures_io.rs:104:15:104:36 | buffer1[...] | semmle.label | buffer1[...] | +| test_futures_io.rs:107:27:107:33 | reader2 | semmle.label | reader2 | +| test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | semmle.label | [post] &mut buffer2 [&ref] | +| test_futures_io.rs:107:45:107:51 | [post] buffer2 | semmle.label | [post] buffer2 | +| test_futures_io.rs:108:14:108:36 | &... | semmle.label | &... | +| test_futures_io.rs:108:15:108:36 | buffer2[...] | semmle.label | buffer2[...] | +| test_futures_io.rs:113:13:113:22 | mut pinned | semmle.label | mut pinned | +| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | semmle.label | mut pinned [&ref] | +| test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | semmle.label | mut pinned [Pin, &ref] | +| test_futures_io.rs:113:26:113:47 | ...::new(...) | semmle.label | ...::new(...) | +| test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | semmle.label | ...::new(...) [&ref] | +| test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | semmle.label | ...::new(...) [Pin, &ref] | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | semmle.label | &mut reader2 [&ref] | +| test_futures_io.rs:113:40:113:46 | reader2 | semmle.label | reader2 | +| test_futures_io.rs:114:14:114:20 | &pinned | semmle.label | &pinned | +| test_futures_io.rs:114:15:114:20 | pinned | semmle.label | pinned | +| test_futures_io.rs:114:15:114:20 | pinned [&ref] | semmle.label | pinned [&ref] | +| test_futures_io.rs:114:15:114:20 | pinned [Pin, &ref] | semmle.label | pinned [Pin, &ref] | +| test_futures_io.rs:116:13:116:18 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | +| test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | semmle.label | pinned.poll_fill_buf(...) [Ready, Ok] | +| test_futures_io.rs:117:14:117:20 | &buffer | semmle.label | &buffer | +| test_futures_io.rs:117:15:117:20 | buffer [Ready, Ok] | semmle.label | buffer [Ready, Ok] | +| test_futures_io.rs:118:16:118:35 | ...::Ready(...) [Ready, Ok] | semmle.label | ...::Ready(...) [Ready, Ok] | +| test_futures_io.rs:118:28:118:34 | Ok(...) [Ok] | semmle.label | Ok(...) [Ok] | +| test_futures_io.rs:118:31:118:33 | buf | semmle.label | buf | +| test_futures_io.rs:119:18:119:20 | buf | semmle.label | buf | +| test_futures_io.rs:125:13:125:18 | buffer | semmle.label | buffer | +| test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | semmle.label | reader2.fill_buf() [future, Ok] | +| test_futures_io.rs:125:22:125:45 | await ... [Ok] | semmle.label | await ... [Ok] | +| test_futures_io.rs:125:22:125:46 | TryExpr | semmle.label | TryExpr | +| test_futures_io.rs:126:14:126:19 | buffer | semmle.label | buffer | +| test_futures_io.rs:132:27:132:33 | reader2 | semmle.label | reader2 | +| test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | semmle.label | [post] &mut line [&ref] | +| test_futures_io.rs:132:58:132:61 | [post] line | semmle.label | [post] line | +| test_futures_io.rs:133:14:133:18 | &line | semmle.label | &line | +| test_futures_io.rs:133:15:133:18 | line | semmle.label | line | +| test_futures_io.rs:139:27:139:33 | reader2 | semmle.label | reader2 | +| test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | semmle.label | [post] &mut line [&ref] | +| test_futures_io.rs:139:50:139:53 | [post] line | semmle.label | [post] line | +| test_futures_io.rs:140:14:140:18 | &line | semmle.label | &line | +| test_futures_io.rs:140:15:140:18 | line | semmle.label | line | +| test_futures_io.rs:146:27:146:33 | reader2 | semmle.label | reader2 | +| test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test_futures_io.rs:146:52:146:57 | [post] buffer | semmle.label | [post] buffer | +| test_futures_io.rs:147:14:147:20 | &buffer | semmle.label | &buffer | +| test_futures_io.rs:147:15:147:20 | buffer | semmle.label | buffer | +| web_frameworks.rs:11:31:11:31 | a | semmle.label | a | +| web_frameworks.rs:11:31:11:31 | a | semmle.label | a | +| web_frameworks.rs:13:14:13:14 | a | semmle.label | a | +| web_frameworks.rs:13:14:13:14 | a | semmle.label | a | +| web_frameworks.rs:13:14:13:22 | a.as_str() | semmle.label | a.as_str() | +| web_frameworks.rs:13:14:13:23 | a.as_str() | semmle.label | a.as_str() | +| web_frameworks.rs:14:14:14:14 | a | semmle.label | a | +| web_frameworks.rs:14:14:14:14 | a | semmle.label | a | +| web_frameworks.rs:14:14:14:24 | a.as_bytes() | semmle.label | a.as_bytes() | +| web_frameworks.rs:14:14:14:25 | a.as_bytes() | semmle.label | a.as_bytes() | +| web_frameworks.rs:15:14:15:14 | a | semmle.label | a | +| web_frameworks.rs:15:14:15:14 | a | semmle.label | a | +| web_frameworks.rs:68:15:68:15 | a | semmle.label | a | +| web_frameworks.rs:68:15:68:15 | a | semmle.label | a | +| web_frameworks.rs:70:14:70:14 | a | semmle.label | a | +| web_frameworks.rs:70:14:70:14 | a | semmle.label | a | +subpaths +testFailures +#select +| test.rs:8:10:8:30 | ...::var(...) | test.rs:8:10:8:22 | ...::var | test.rs:8:10:8:30 | ...::var(...) | $@ | test.rs:8:10:8:22 | ...::var | ...::var | +| test.rs:9:10:9:33 | ...::var_os(...) | test.rs:9:10:9:25 | ...::var_os | test.rs:9:10:9:33 | ...::var_os(...) | $@ | test.rs:9:10:9:25 | ...::var_os | ...::var_os | +| test.rs:14:10:14:13 | var1 | test.rs:11:16:11:28 | ...::var | test.rs:14:10:14:13 | var1 | $@ | test.rs:11:16:11:28 | ...::var | ...::var | +| test.rs:15:10:15:13 | var2 | test.rs:12:16:12:31 | ...::var_os | test.rs:15:10:15:13 | var2 | $@ | test.rs:12:16:12:31 | ...::var_os | ...::var_os | +| test.rs:36:10:36:16 | my_path | test.rs:29:29:29:42 | ...::args | test.rs:36:10:36:16 | my_path | $@ | test.rs:29:29:29:42 | ...::args | ...::args | +| test.rs:37:10:37:13 | arg1 | test.rs:29:29:29:42 | ...::args | test.rs:37:10:37:13 | arg1 | $@ | test.rs:29:29:29:42 | ...::args | ...::args | +| test.rs:38:10:38:13 | arg2 | test.rs:32:16:32:29 | ...::args | test.rs:38:10:38:13 | arg2 | $@ | test.rs:32:16:32:29 | ...::args | ...::args | +| test.rs:39:10:39:13 | arg3 | test.rs:33:16:33:32 | ...::args_os | test.rs:39:10:39:13 | arg3 | $@ | test.rs:33:16:33:32 | ...::args_os | ...::args_os | +| test.rs:40:10:40:13 | arg4 | test.rs:34:16:34:29 | ...::args | test.rs:40:10:40:13 | arg4 | $@ | test.rs:34:16:34:29 | ...::args | ...::args | +| test.rs:43:14:43:16 | arg | test.rs:42:16:42:29 | ...::args | test.rs:43:14:43:16 | arg | $@ | test.rs:42:16:42:29 | ...::args | ...::args | +| test.rs:47:14:47:16 | arg | test.rs:46:16:46:32 | ...::args_os | test.rs:47:14:47:16 | arg | $@ | test.rs:46:16:46:32 | ...::args_os | ...::args_os | +| test.rs:56:10:56:12 | dir | test.rs:52:15:52:35 | ...::current_dir | test.rs:56:10:56:12 | dir | $@ | test.rs:52:15:52:35 | ...::current_dir | ...::current_dir | +| test.rs:57:10:57:12 | exe | test.rs:53:15:53:35 | ...::current_exe | test.rs:57:10:57:12 | exe | $@ | test.rs:53:15:53:35 | ...::current_exe | ...::current_exe | +| test.rs:58:10:58:13 | home | test.rs:54:16:54:33 | ...::home_dir | test.rs:58:10:58:13 | home | $@ | test.rs:54:16:54:33 | ...::home_dir | ...::home_dir | +| test.rs:63:10:63:23 | remote_string1 | test.rs:62:26:62:47 | ...::get | test.rs:63:10:63:23 | remote_string1 | $@ | test.rs:62:26:62:47 | ...::get | ...::get | +| test.rs:66:10:66:23 | remote_string2 | test.rs:65:26:65:47 | ...::get | test.rs:66:10:66:23 | remote_string2 | $@ | test.rs:65:26:65:47 | ...::get | ...::get | +| test.rs:69:10:69:23 | remote_string3 | test.rs:68:26:68:47 | ...::get | test.rs:69:10:69:23 | remote_string3 | $@ | test.rs:68:26:68:47 | ...::get | ...::get | +| test.rs:72:10:72:23 | remote_string4 | test.rs:71:26:71:47 | ...::get | test.rs:72:10:72:23 | remote_string4 | $@ | test.rs:71:26:71:47 | ...::get | ...::get | +| test.rs:75:10:75:23 | remote_string5 | test.rs:74:26:74:37 | ...::get | test.rs:75:10:75:23 | remote_string5 | $@ | test.rs:74:26:74:37 | ...::get | ...::get | +| test.rs:78:10:78:23 | remote_string6 | test.rs:77:26:77:37 | ...::get | test.rs:78:10:78:23 | remote_string6 | $@ | test.rs:77:26:77:37 | ...::get | ...::get | +| test.rs:81:10:81:41 | ... .unwrap() | test.rs:80:24:80:35 | ...::get | test.rs:81:10:81:41 | ... .unwrap() | $@ | test.rs:80:24:80:35 | ...::get | ...::get | +| test.rs:83:14:83:18 | chunk | test.rs:80:24:80:35 | ...::get | test.rs:83:14:83:18 | chunk | $@ | test.rs:80:24:80:35 | ...::get | ...::get | +| test.rs:115:14:115:22 | &response | test.rs:114:31:114:42 | send_request | test.rs:115:14:115:22 | &response | $@ | test.rs:114:31:114:42 | send_request | send_request | +| test.rs:116:14:116:21 | response | test.rs:114:31:114:42 | send_request | test.rs:116:14:116:21 | response | $@ | test.rs:114:31:114:42 | send_request | send_request | +| test.rs:122:10:122:18 | &response | test.rs:121:31:121:42 | send_request | test.rs:122:10:122:18 | &response | $@ | test.rs:121:31:121:42 | send_request | send_request | +| test.rs:212:14:212:20 | &buffer | test.rs:211:22:211:35 | ...::stdin | test.rs:212:14:212:20 | &buffer | $@ | test.rs:211:22:211:35 | ...::stdin | ...::stdin | +| test.rs:218:14:218:20 | &buffer | test.rs:217:22:217:35 | ...::stdin | test.rs:218:14:218:20 | &buffer | $@ | test.rs:217:22:217:35 | ...::stdin | ...::stdin | +| test.rs:224:14:224:20 | &buffer | test.rs:223:22:223:35 | ...::stdin | test.rs:224:14:224:20 | &buffer | $@ | test.rs:223:22:223:35 | ...::stdin | ...::stdin | +| test.rs:230:14:230:20 | &buffer | test.rs:229:22:229:35 | ...::stdin | test.rs:230:14:230:20 | &buffer | $@ | test.rs:229:22:229:35 | ...::stdin | ...::stdin | +| test.rs:236:14:236:20 | &buffer | test.rs:235:9:235:22 | ...::stdin | test.rs:236:14:236:20 | &buffer | $@ | test.rs:235:9:235:22 | ...::stdin | ...::stdin | +| test.rs:240:14:240:17 | byte | test.rs:239:17:239:30 | ...::stdin | test.rs:240:14:240:17 | byte | $@ | test.rs:239:17:239:30 | ...::stdin | ...::stdin | +| test.rs:248:14:248:18 | &data | test.rs:246:50:246:63 | ...::stdin | test.rs:248:14:248:18 | &data | $@ | test.rs:246:50:246:63 | ...::stdin | ...::stdin | +| test.rs:254:14:254:18 | &data | test.rs:252:46:252:59 | ...::stdin | test.rs:254:14:254:18 | &data | $@ | test.rs:252:46:252:59 | ...::stdin | ...::stdin | +| test.rs:261:14:261:20 | &buffer | test.rs:259:50:259:63 | ...::stdin | test.rs:261:14:261:20 | &buffer | $@ | test.rs:259:50:259:63 | ...::stdin | ...::stdin | +| test.rs:268:14:268:20 | &buffer | test.rs:266:50:266:63 | ...::stdin | test.rs:268:14:268:20 | &buffer | $@ | test.rs:266:50:266:63 | ...::stdin | ...::stdin | +| test.rs:269:14:269:22 | buffer[0] | test.rs:266:50:266:63 | ...::stdin | test.rs:269:14:269:22 | buffer[0] | $@ | test.rs:266:50:266:63 | ...::stdin | ...::stdin | +| test.rs:274:14:274:50 | ... .unwrap() | test.rs:273:56:273:69 | ...::stdin | test.rs:274:14:274:50 | ... .unwrap() | $@ | test.rs:273:56:273:69 | ...::stdin | ...::stdin | +| test.rs:276:18:276:31 | chunk.unwrap() | test.rs:273:56:273:69 | ...::stdin | test.rs:276:18:276:31 | chunk.unwrap() | $@ | test.rs:273:56:273:69 | ...::stdin | ...::stdin | +| test.rs:283:18:283:21 | line | test.rs:281:46:281:59 | ...::stdin | test.rs:283:18:283:21 | line | $@ | test.rs:281:46:281:59 | ...::stdin | ...::stdin | +| test.rs:312:14:312:20 | &buffer | test.rs:309:25:309:40 | ...::stdin | test.rs:312:14:312:20 | &buffer | $@ | test.rs:309:25:309:40 | ...::stdin | ...::stdin | +| test.rs:319:14:319:20 | &buffer | test.rs:316:25:316:40 | ...::stdin | test.rs:319:14:319:20 | &buffer | $@ | test.rs:316:25:316:40 | ...::stdin | ...::stdin | +| test.rs:326:14:326:20 | &buffer | test.rs:323:25:323:40 | ...::stdin | test.rs:326:14:326:20 | &buffer | $@ | test.rs:323:25:323:40 | ...::stdin | ...::stdin | +| test.rs:333:14:333:20 | &buffer | test.rs:330:25:330:40 | ...::stdin | test.rs:333:14:333:20 | &buffer | $@ | test.rs:330:25:330:40 | ...::stdin | ...::stdin | +| test.rs:342:14:342:15 | v1 | test.rs:337:25:337:40 | ...::stdin | test.rs:342:14:342:15 | v1 | $@ | test.rs:337:25:337:40 | ...::stdin | ...::stdin | +| test.rs:343:14:343:15 | v2 | test.rs:337:25:337:40 | ...::stdin | test.rs:343:14:343:15 | v2 | $@ | test.rs:337:25:337:40 | ...::stdin | ...::stdin | +| test.rs:344:14:344:15 | v3 | test.rs:337:25:337:40 | ...::stdin | test.rs:344:14:344:15 | v3 | $@ | test.rs:337:25:337:40 | ...::stdin | ...::stdin | +| test.rs:345:14:345:15 | v4 | test.rs:337:25:337:40 | ...::stdin | test.rs:345:14:345:15 | v4 | $@ | test.rs:337:25:337:40 | ...::stdin | ...::stdin | +| test.rs:352:14:352:20 | &buffer | test.rs:349:25:349:40 | ...::stdin | test.rs:352:14:352:20 | &buffer | $@ | test.rs:349:25:349:40 | ...::stdin | ...::stdin | +| test.rs:360:14:360:18 | &data | test.rs:358:52:358:67 | ...::stdin | test.rs:360:14:360:18 | &data | $@ | test.rs:358:52:358:67 | ...::stdin | ...::stdin | +| test.rs:366:14:366:18 | &data | test.rs:364:48:364:63 | ...::stdin | test.rs:366:14:366:18 | &data | $@ | test.rs:364:48:364:63 | ...::stdin | ...::stdin | +| test.rs:373:14:373:20 | &buffer | test.rs:371:52:371:67 | ...::stdin | test.rs:373:14:373:20 | &buffer | $@ | test.rs:371:52:371:67 | ...::stdin | ...::stdin | +| test.rs:380:14:380:20 | &buffer | test.rs:378:52:378:67 | ...::stdin | test.rs:380:14:380:20 | &buffer | $@ | test.rs:378:52:378:67 | ...::stdin | ...::stdin | +| test.rs:381:14:381:22 | buffer[0] | test.rs:378:52:378:67 | ...::stdin | test.rs:381:14:381:22 | buffer[0] | $@ | test.rs:378:52:378:67 | ...::stdin | ...::stdin | +| test.rs:386:14:386:56 | ... .unwrap() | test.rs:385:58:385:73 | ...::stdin | test.rs:386:14:386:56 | ... .unwrap() | $@ | test.rs:385:58:385:73 | ...::stdin | ...::stdin | +| test.rs:388:18:388:22 | chunk | test.rs:385:58:385:73 | ...::stdin | test.rs:388:18:388:22 | chunk | $@ | test.rs:385:58:385:73 | ...::stdin | ...::stdin | +| test.rs:395:14:395:46 | ... .unwrap() | test.rs:393:48:393:63 | ...::stdin | test.rs:395:14:395:46 | ... .unwrap() | $@ | test.rs:393:48:393:63 | ...::stdin | ...::stdin | +| test.rs:397:18:397:21 | line | test.rs:393:48:393:63 | ...::stdin | test.rs:397:18:397:21 | line | $@ | test.rs:393:48:393:63 | ...::stdin | ...::stdin | +| test.rs:409:14:409:19 | buffer | test.rs:408:31:408:43 | ...::read | test.rs:409:14:409:19 | buffer | $@ | test.rs:408:31:408:43 | ...::read | ...::read | +| test.rs:414:14:414:19 | buffer | test.rs:413:31:413:38 | ...::read | test.rs:414:14:414:19 | buffer | $@ | test.rs:413:31:413:38 | ...::read | ...::read | +| test.rs:419:14:419:19 | buffer | test.rs:418:22:418:39 | ...::read_to_string | test.rs:419:14:419:19 | buffer | $@ | test.rs:418:22:418:39 | ...::read_to_string | ...::read_to_string | +| test.rs:426:14:426:25 | path.clone() | test.rs:425:22:425:25 | path | test.rs:426:14:426:25 | path.clone() | $@ | test.rs:425:22:425:25 | path | path | +| test.rs:427:14:427:35 | ... .as_path() | test.rs:425:22:425:25 | path | test.rs:427:14:427:35 | ... .as_path() | $@ | test.rs:425:22:425:25 | path | path | +| test.rs:437:14:437:17 | path | test.rs:425:22:425:25 | path | test.rs:437:14:437:17 | path | $@ | test.rs:425:22:425:25 | path | path | +| test.rs:440:14:440:30 | file_name.clone() | test.rs:439:27:439:35 | file_name | test.rs:440:14:440:30 | file_name.clone() | $@ | test.rs:439:27:439:35 | file_name | file_name | +| test.rs:445:14:445:22 | file_name | test.rs:439:27:439:35 | file_name | test.rs:445:14:445:22 | file_name | $@ | test.rs:439:27:439:35 | file_name | file_name | +| test.rs:462:14:462:19 | target | test.rs:461:22:461:34 | ...::read_link | test.rs:462:14:462:19 | target | $@ | test.rs:461:22:461:34 | ...::read_link | ...::read_link | +| test.rs:471:14:471:19 | buffer | test.rs:470:31:470:45 | ...::read | test.rs:471:14:471:19 | buffer | $@ | test.rs:470:31:470:45 | ...::read | ...::read | +| test.rs:476:14:476:19 | buffer | test.rs:475:31:475:45 | ...::read | test.rs:476:14:476:19 | buffer | $@ | test.rs:475:31:475:45 | ...::read | ...::read | +| test.rs:481:14:481:19 | buffer | test.rs:480:22:480:46 | ...::read_to_string | test.rs:481:14:481:19 | buffer | $@ | test.rs:480:22:480:46 | ...::read_to_string | ...::read_to_string | +| test.rs:488:14:488:17 | path | test.rs:486:26:486:29 | path | test.rs:488:14:488:17 | path | $@ | test.rs:486:26:486:29 | path | path | +| test.rs:488:14:488:17 | path | test.rs:486:26:486:29 | path | test.rs:488:14:488:17 | path | $@ | test.rs:486:26:486:29 | path | path | +| test.rs:489:14:489:22 | file_name | test.rs:487:31:487:39 | file_name | test.rs:489:14:489:22 | file_name | $@ | test.rs:487:31:487:39 | file_name | file_name | +| test.rs:489:14:489:22 | file_name | test.rs:487:31:487:39 | file_name | test.rs:489:14:489:22 | file_name | $@ | test.rs:487:31:487:39 | file_name | file_name | +| test.rs:494:14:494:19 | target | test.rs:493:22:493:41 | ...::read_link | test.rs:494:14:494:19 | target | $@ | test.rs:493:22:493:41 | ...::read_link | ...::read_link | +| test.rs:508:14:508:20 | &buffer | test.rs:503:20:503:38 | ...::open | test.rs:508:14:508:20 | &buffer | $@ | test.rs:503:20:503:38 | ...::open | ...::open | +| test.rs:514:14:514:20 | &buffer | test.rs:503:20:503:38 | ...::open | test.rs:514:14:514:20 | &buffer | $@ | test.rs:503:20:503:38 | ...::open | ...::open | +| test.rs:520:14:520:20 | &buffer | test.rs:503:20:503:38 | ...::open | test.rs:520:14:520:20 | &buffer | $@ | test.rs:503:20:503:38 | ...::open | ...::open | +| test.rs:526:14:526:20 | &buffer | test.rs:503:20:503:38 | ...::open | test.rs:526:14:526:20 | &buffer | $@ | test.rs:503:20:503:38 | ...::open | ...::open | +| test.rs:530:14:530:17 | byte | test.rs:503:20:503:38 | ...::open | test.rs:530:14:530:17 | byte | $@ | test.rs:503:20:503:38 | ...::open | ...::open | +| test.rs:539:14:539:20 | &buffer | test.rs:536:50:536:53 | open | test.rs:539:14:539:20 | &buffer | $@ | test.rs:536:50:536:53 | open | open | +| test.rs:546:14:546:20 | &buffer | test.rs:543:67:543:70 | open | test.rs:546:14:546:20 | &buffer | $@ | test.rs:543:67:543:70 | open | open | +| test.rs:553:14:553:20 | &buffer | test.rs:550:101:550:104 | open | test.rs:553:14:553:20 | &buffer | $@ | test.rs:550:101:550:104 | open | open | +| test.rs:564:14:564:20 | &buffer | test.rs:560:21:560:39 | ...::open | test.rs:564:14:564:20 | &buffer | $@ | test.rs:560:21:560:39 | ...::open | ...::open | +| test.rs:564:14:564:20 | &buffer | test.rs:561:21:561:39 | ...::open | test.rs:564:14:564:20 | &buffer | $@ | test.rs:561:21:561:39 | ...::open | ...::open | +| test.rs:572:14:572:20 | &buffer | test.rs:569:21:569:39 | ...::open | test.rs:572:14:572:20 | &buffer | $@ | test.rs:569:21:569:39 | ...::open | ...::open | +| test.rs:586:14:586:20 | &buffer | test.rs:581:20:581:40 | ...::open | test.rs:586:14:586:20 | &buffer | $@ | test.rs:581:20:581:40 | ...::open | ...::open | +| test.rs:592:14:592:20 | &buffer | test.rs:581:20:581:40 | ...::open | test.rs:592:14:592:20 | &buffer | $@ | test.rs:581:20:581:40 | ...::open | ...::open | +| test.rs:598:14:598:20 | &buffer | test.rs:581:20:581:40 | ...::open | test.rs:598:14:598:20 | &buffer | $@ | test.rs:581:20:581:40 | ...::open | ...::open | +| test.rs:604:14:604:20 | &buffer | test.rs:581:20:581:40 | ...::open | test.rs:604:14:604:20 | &buffer | $@ | test.rs:581:20:581:40 | ...::open | ...::open | +| test.rs:612:14:612:15 | v1 | test.rs:581:20:581:40 | ...::open | test.rs:612:14:612:15 | v1 | $@ | test.rs:581:20:581:40 | ...::open | ...::open | +| test.rs:613:14:613:15 | v2 | test.rs:581:20:581:40 | ...::open | test.rs:613:14:613:15 | v2 | $@ | test.rs:581:20:581:40 | ...::open | ...::open | +| test.rs:614:14:614:15 | v3 | test.rs:581:20:581:40 | ...::open | test.rs:614:14:614:15 | v3 | $@ | test.rs:581:20:581:40 | ...::open | ...::open | +| test.rs:615:14:615:15 | v4 | test.rs:581:20:581:40 | ...::open | test.rs:615:14:615:15 | v4 | $@ | test.rs:581:20:581:40 | ...::open | ...::open | +| test.rs:621:14:621:20 | &buffer | test.rs:581:20:581:40 | ...::open | test.rs:621:14:621:20 | &buffer | $@ | test.rs:581:20:581:40 | ...::open | ...::open | +| test.rs:630:14:630:20 | &buffer | test.rs:627:52:627:55 | open | test.rs:630:14:630:20 | &buffer | $@ | test.rs:627:52:627:55 | open | open | +| test.rs:698:14:698:20 | &buffer | test.rs:688:26:688:53 | ...::connect | test.rs:698:14:698:20 | &buffer | $@ | test.rs:688:26:688:53 | ...::connect | ...::connect | +| test.rs:699:14:699:22 | buffer[0] | test.rs:688:26:688:53 | ...::connect | test.rs:699:14:699:22 | buffer[0] | $@ | test.rs:688:26:688:53 | ...::connect | ...::connect | +| test.rs:725:34:725:38 | &line | test.rs:707:26:707:61 | ...::connect_timeout | test.rs:725:34:725:38 | &line | $@ | test.rs:707:26:707:61 | ...::connect_timeout | ...::connect_timeout | +| test.rs:774:14:774:21 | &buffer1 | test.rs:759:28:759:57 | ...::connect | test.rs:774:14:774:21 | &buffer1 | $@ | test.rs:759:28:759:57 | ...::connect | ...::connect | +| test.rs:775:14:775:23 | buffer1[0] | test.rs:759:28:759:57 | ...::connect | test.rs:775:14:775:23 | buffer1[0] | $@ | test.rs:759:28:759:57 | ...::connect | ...::connect | +| test.rs:778:14:778:21 | &buffer2 | test.rs:759:28:759:57 | ...::connect | test.rs:778:14:778:21 | &buffer2 | $@ | test.rs:759:28:759:57 | ...::connect | ...::connect | +| test.rs:779:14:779:23 | buffer2[0] | test.rs:759:28:759:57 | ...::connect | test.rs:779:14:779:23 | buffer2[0] | $@ | test.rs:759:28:759:57 | ...::connect | ...::connect | +| test.rs:794:26:794:32 | &buffer | test.rs:759:28:759:57 | ...::connect | test.rs:794:26:794:32 | &buffer | $@ | test.rs:759:28:759:57 | ...::connect | ...::connect | +| test.rs:817:26:817:32 | &buffer | test.rs:759:28:759:57 | ...::connect | test.rs:817:26:817:32 | &buffer | $@ | test.rs:759:28:759:57 | ...::connect | ...::connect | +| test_futures_io.rs:20:10:20:13 | &tcp | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:20:10:20:13 | &tcp | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:27:10:27:16 | &reader | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:27:10:27:16 | &reader | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:33:14:33:20 | &pinned | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:33:14:33:20 | &pinned | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:46:14:46:36 | &... | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:46:14:46:36 | &... | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:51:14:51:36 | &... | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:51:14:51:36 | &... | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:55:10:55:17 | &reader2 | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:55:10:55:17 | &reader2 | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:60:14:60:20 | &pinned | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:60:14:60:20 | &pinned | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:64:18:64:24 | &buffer | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:64:18:64:24 | &buffer | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:65:18:65:20 | buf | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:65:18:65:20 | buf | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:72:22:72:29 | &buffer2 | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:72:22:72:29 | &buffer2 | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:73:22:73:24 | buf | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:73:22:73:24 | buf | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:84:14:84:19 | buffer | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:84:14:84:19 | buffer | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:91:14:91:20 | &pinned | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:91:14:91:20 | &pinned | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:104:14:104:36 | &... | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:104:14:104:36 | &... | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:108:14:108:36 | &... | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:108:14:108:36 | &... | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:114:14:114:20 | &pinned | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:114:14:114:20 | &pinned | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:117:14:117:20 | &buffer | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:117:14:117:20 | &buffer | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:119:18:119:20 | buf | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:119:18:119:20 | buf | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:126:14:126:19 | buffer | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:126:14:126:19 | buffer | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:133:14:133:18 | &line | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:133:14:133:18 | &line | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:140:14:140:18 | &line | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:140:14:140:18 | &line | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| test_futures_io.rs:147:14:147:20 | &buffer | test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:147:14:147:20 | &buffer | $@ | test_futures_io.rs:19:15:19:32 | ...::connect | ...::connect | +| web_frameworks.rs:13:14:13:22 | a.as_str() | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | $@ | web_frameworks.rs:11:31:11:31 | a | a | +| web_frameworks.rs:13:14:13:23 | a.as_str() | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | $@ | web_frameworks.rs:11:31:11:31 | a | a | +| web_frameworks.rs:14:14:14:24 | a.as_bytes() | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | $@ | web_frameworks.rs:11:31:11:31 | a | a | +| web_frameworks.rs:14:14:14:25 | a.as_bytes() | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | $@ | web_frameworks.rs:11:31:11:31 | a | a | +| web_frameworks.rs:15:14:15:14 | a | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | $@ | web_frameworks.rs:11:31:11:31 | a | a | +| web_frameworks.rs:15:14:15:14 | a | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | $@ | web_frameworks.rs:11:31:11:31 | a | a | +| web_frameworks.rs:70:14:70:14 | a | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | $@ | web_frameworks.rs:68:15:68:15 | a | a | +| web_frameworks.rs:70:14:70:14 | a | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | $@ | web_frameworks.rs:68:15:68:15 | a | a | diff --git a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.ql b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.ql index d13ca71f16e..09b4ab5bf90 100644 --- a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.ql +++ b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.ql @@ -1,3 +1,7 @@ +/** + * @kind path-problem + */ + import rust import codeql.rust.dataflow.DataFlow import codeql.rust.Concepts @@ -25,3 +29,8 @@ module MyFlowConfig implements DataFlow::ConfigSig { module MyFlowTest = TaintFlowTest; import MyFlowTest +import PathGraph + +from PathNode source, PathNode sink +where flowPath(source, sink) +select sink, source, sink, "$@", source, source.toString() From d93b2edc0daf081a5da8aa9a5daa470d8f70f944 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 18 Sep 2025 08:13:43 +0200 Subject: [PATCH 30/49] Ruby: Accept test changes. --- .../controlflow/graph/BasicBlocks.expected | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected index 35b18b7132b..720ee26e679 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected @@ -6252,7 +6252,8 @@ joinBlockPredecessor | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | 1 | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | 0 | | break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:21:9:21:20 | self | 1 | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | 0 | +| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | exit m3 (normal) | 0 | +| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | 1 | | break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | 1 | | break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | while ... | 0 | | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | 0 | @@ -6286,20 +6287,25 @@ joinBlockPredecessor | case.rb:9:3:17:5 | case ... | case.rb:14:25:14:25 | 6 | 3 | | case.rb:9:3:17:5 | case ... | case.rb:15:28:15:28 | 7 | 4 | | case.rb:9:3:17:5 | case ... | case.rb:16:10:16:10 | 8 | 5 | -| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:21:3:23:5 | case ... | 0 | -| case.rb:26:1:30:3 | exit case_match_raise | case.rb:27:3:29:5 | case ... | 0 | -| case.rb:32:1:39:3 | exit case_match_array | case.rb:33:3:38:5 | case ... | 0 | +| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | 0 | +| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:21:3:23:5 | case ... | 1 | +| case.rb:26:1:30:3 | exit case_match_raise | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | 0 | +| case.rb:26:1:30:3 | exit case_match_raise | case.rb:27:3:29:5 | case ... | 1 | +| case.rb:32:1:39:3 | exit case_match_array | case.rb:32:1:39:3 | exit case_match_array (abnormal) | 0 | +| case.rb:32:1:39:3 | exit case_match_array | case.rb:33:3:38:5 | case ... | 1 | | case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:37:5:37:27 | in ... then ... | 0 | | case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:37:8:37:26 | [ ..., * ] | 1 | | case.rb:33:3:38:5 | case ... | case.rb:32:1:39:3 | enter case_match_array | 0 | | case.rb:33:3:38:5 | case ... | case.rb:35:9:35:9 | x | 1 | | case.rb:33:3:38:5 | case ... | case.rb:36:9:36:9 | x | 2 | | case.rb:33:3:38:5 | case ... | case.rb:37:25:37:25 | e | 3 | -| case.rb:41:1:45:3 | exit case_match_find | case.rb:43:20:43:20 | y | 0 | +| case.rb:41:1:45:3 | exit case_match_find | case.rb:41:1:45:3 | exit case_match_find (abnormal) | 0 | +| case.rb:41:1:45:3 | exit case_match_find | case.rb:43:20:43:20 | y | 1 | | case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:41:1:45:3 | enter case_match_find | 0 | | case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:43:10:43:10 | x | 1 | | case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:43:16:43:16 | 2 | 2 | -| case.rb:47:1:53:3 | exit case_match_hash | case.rb:48:3:52:5 | case ... | 0 | +| case.rb:47:1:53:3 | exit case_match_hash | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | 0 | +| case.rb:47:1:53:3 | exit case_match_hash | case.rb:48:3:52:5 | case ... | 1 | | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:51:5:51:17 | in ... then ... | 0 | | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:51:8:51:16 | { ..., ** } | 1 | | case.rb:48:3:52:5 | case ... | case.rb:49:29:49:32 | rest | 0 | @@ -6315,7 +6321,8 @@ joinBlockPredecessor | case.rb:56:3:60:5 | case ... | case.rb:58:5:58:10 | in ... then ... | 1 | | case.rb:64:3:66:5 | case ... | case.rb:63:1:67:3 | enter case_match_underscore | 0 | | case.rb:64:3:66:5 | case ... | case.rb:65:12:65:12 | _ | 1 | -| case.rb:69:1:93:3 | exit case_match_various | case.rb:72:3:92:5 | case ... | 0 | +| case.rb:69:1:93:3 | exit case_match_various | case.rb:69:1:93:3 | exit case_match_various (abnormal) | 0 | +| case.rb:69:1:93:3 | exit case_match_various | case.rb:72:3:92:5 | case ... | 1 | | case.rb:72:3:92:5 | case ... | case.rb:69:1:93:3 | enter case_match_various | 0 | | case.rb:72:3:92:5 | case ... | case.rb:74:5:74:11 | in ... then ... | 1 | | case.rb:72:3:92:5 | case ... | case.rb:75:5:75:15 | in ... then ... | 2 | @@ -6347,7 +6354,8 @@ joinBlockPredecessor | case.rb:72:3:92:5 | case ... | case.rb:91:13:91:14 | "" | 28 | | case.rb:72:3:92:5 | case ... | case.rb:91:18:91:19 | [ ..., * ] | 29 | | case.rb:72:3:92:5 | case ... | case.rb:91:23:91:24 | { ..., ** } | 30 | -| case.rb:95:1:99:3 | exit case_match_guard_no_else | case.rb:97:25:97:25 | 6 | 0 | +| case.rb:95:1:99:3 | exit case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | 0 | +| case.rb:95:1:99:3 | exit case_match_guard_no_else | case.rb:97:25:97:25 | 6 | 1 | | cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:19:19:19:32 | self | 0 | | cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:21:19:21:32 | self | 1 | | cfg.rb:41:1:45:3 | case ... | cfg.rb:42:15:42:24 | self | 0 | @@ -6454,7 +6462,8 @@ joinBlockPredecessor | loops.rb:31:9:31:9 | x | loops.rb:31:15:32:5 | do ... | 1 | | raise.rb:7:1:12:3 | exit m1 | raise.rb:8:3:10:5 | if ... | 0 | | raise.rb:7:1:12:3 | exit m1 | raise.rb:9:5:9:17 | self | 1 | -| raise.rb:14:1:23:3 | exit m2 | raise.rb:22:3:22:15 | self | 0 | +| raise.rb:14:1:23:3 | exit m2 | raise.rb:14:1:23:3 | exit m2 (abnormal) | 0 | +| raise.rb:14:1:23:3 | exit m2 | raise.rb:22:3:22:15 | self | 1 | | raise.rb:22:3:22:15 | self | raise.rb:16:5:18:7 | if ... | 0 | | raise.rb:22:3:22:15 | self | raise.rb:20:5:20:18 | self | 1 | | raise.rb:33:3:33:15 | self | raise.rb:27:5:29:7 | if ... | 0 | @@ -6463,25 +6472,30 @@ joinBlockPredecessor | raise.rb:44:3:44:15 | self | raise.rb:39:7:39:22 | self | 1 | | raise.rb:54:3:54:15 | self | raise.rb:49:5:51:7 | if ... | 0 | | raise.rb:54:3:54:15 | self | raise.rb:50:7:50:22 | self | 1 | -| raise.rb:57:1:66:3 | exit m6 | raise.rb:65:3:65:15 | self | 0 | +| raise.rb:57:1:66:3 | exit m6 | raise.rb:57:1:66:3 | exit m6 (abnormal) | 0 | +| raise.rb:57:1:66:3 | exit m6 | raise.rb:65:3:65:15 | self | 1 | | raise.rb:62:36:62:36 | e | raise.rb:60:7:60:22 | self | 0 | | raise.rb:62:36:62:36 | e | raise.rb:62:22:62:31 | ExceptionB | 1 | | raise.rb:65:3:65:15 | self | raise.rb:59:5:61:7 | if ... | 0 | | raise.rb:65:3:65:15 | self | raise.rb:62:36:62:36 | e | 1 | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:76:3:76:15 | [ensure: exception] self | 0 | +| raise.rb:68:1:77:3 | exit m7 | raise.rb:68:1:77:3 | exit m7 (normal) | 0 | +| raise.rb:68:1:77:3 | exit m7 | raise.rb:76:3:76:15 | [ensure: exception] self | 1 | | raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:72:13:72:17 | x < 0 | 0 | | raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:76:3:76:15 | self | 1 | | raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:68:1:77:3 | enter m7 | 0 | | raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:70:5:70:17 | self | 1 | | raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:71:3:72:18 | elsif ... | 2 | | raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:71:9:71:9 | x | 3 | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:89:5:89:17 | [ensure: exception] self | 0 | +| raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | exit m8 (normal) | 0 | +| raise.rb:79:1:92:3 | exit m8 | raise.rb:89:5:89:17 | [ensure: exception] self | 1 | | raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:85:15:85:19 | x < 0 | 0 | | raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:89:5:89:17 | self | 1 | | raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:79:1:92:3 | enter m8 | 0 | | raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:83:7:83:19 | self | 1 | | raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:84:5:85:20 | elsif ... | 2 | | raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:84:11:84:11 | x | 3 | +| raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | exit m9 (abnormal) | 1 | +| raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | exit m9 (normal) | 0 | | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:116:3:118:5 | [ensure: exception] if ... | 0 | | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | [ensure: exception] self | 2 | | raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | [ensure: return] self | 3 | @@ -6520,6 +6534,8 @@ joinBlockPredecessor | raise.rb:155:16:155:50 | exit { ... } | raise.rb:155:25:155:48 | ... if ... | 0 | | raise.rb:160:9:162:7 | exit -> { ... } | raise.rb:161:7:161:14 | self | 1 | | raise.rb:160:9:162:7 | exit -> { ... } | raise.rb:161:7:161:23 | ... unless ... | 0 | +| raise.rb:172:1:182:3 | exit m16 | raise.rb:172:1:182:3 | exit m16 (abnormal) | 1 | +| raise.rb:172:1:182:3 | exit m16 | raise.rb:172:1:182:3 | exit m16 (normal) | 0 | | raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:175:14:175:14 | 1 | 0 | | raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:177:14:177:14 | 2 | 1 | | raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:180:12:180:12 | 3 | 2 | From 3cd737e40d43fe5108a2f5710bb733e2c37ce454 Mon Sep 17 00:00:00 2001 From: Kasper Svendsen Date: Thu, 18 Sep 2025 10:32:20 +0200 Subject: [PATCH 31/49] Overlay: Future-proof Java config discarding --- java/ql/lib/semmle/code/java/Overlay.qll | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/java/ql/lib/semmle/code/java/Overlay.qll b/java/ql/lib/semmle/code/java/Overlay.qll index 1d1a3896ba7..27e8badc233 100644 --- a/java/ql/lib/semmle/code/java/Overlay.qll +++ b/java/ql/lib/semmle/code/java/Overlay.qll @@ -73,22 +73,24 @@ private predicate discardReferableLocatable(@locatable el) { ) } +/** Gets the raw file for a configLocatable. */ overlay[local] -private predicate baseConfigLocatable(@configLocatable l) { not isOverlay() and exists(l) } +private string getRawFileForConfig(@configLocatable el) { + exists(@location loc, @file file | + configLocations(el, loc) and + locations_default(loc, file, _, _, _, _) and + files(file, result) + ) +} overlay[local] -private predicate overlayHasConfigLocatables() { - isOverlay() and - exists(@configLocatable el) +private string baseConfigLocatable(@configLocatable el) { + not isOverlay() and result = getRawFileForConfig(el) } overlay[discard_entity] private predicate discardBaseConfigLocatable(@configLocatable el) { - // The properties extractor is currently not incremental, so if - // the overlay contains any config locatables, the overlay should - // contain a full extraction and all config locatables from base - // should be discarded. - baseConfigLocatable(el) and overlayHasConfigLocatables() + overlayChangedFiles(baseConfigLocatable(el)) } overlay[local] From dbb9a26f78938a5ddd4763d56e9c7cdb54f204c5 Mon Sep 17 00:00:00 2001 From: Kasper Svendsen Date: Thu, 18 Sep 2025 10:35:11 +0200 Subject: [PATCH 32/49] Overlay: Future-proof Java XML discarding --- java/ql/lib/semmle/code/java/Overlay.qll | 22 +--------------------- java/ql/lib/semmle/code/xml/XML.qll | 11 +++++++++++ 2 files changed, 12 insertions(+), 21 deletions(-) diff --git a/java/ql/lib/semmle/code/java/Overlay.qll b/java/ql/lib/semmle/code/java/Overlay.qll index 27e8badc233..0f6033d87b3 100644 --- a/java/ql/lib/semmle/code/java/Overlay.qll +++ b/java/ql/lib/semmle/code/java/Overlay.qll @@ -18,7 +18,7 @@ predicate isOverlay() { databaseMetadata("isOverlay", "true") } overlay[local] string getRawFile(@locatable el) { exists(@location loc, @file file | - hasLocation(el, loc) and + (hasLocation(el, loc) or xmllocations(el, loc)) and locations_default(loc, file, _, _, _, _) and files(file, result) ) @@ -92,23 +92,3 @@ overlay[discard_entity] private predicate discardBaseConfigLocatable(@configLocatable el) { overlayChangedFiles(baseConfigLocatable(el)) } - -overlay[local] -private predicate baseXmlLocatable(@xmllocatable l) { - not isOverlay() and not files(l, _) and not xmlNs(l, _, _, _) -} - -overlay[local] -private predicate overlayHasXmlLocatable() { - isOverlay() and - exists(@xmllocatable l | not files(l, _) and not xmlNs(l, _, _, _)) -} - -overlay[discard_entity] -private predicate discardBaseXmlLocatable(@xmllocatable el) { - // The XML extractor is currently not incremental, so if - // the overlay contains any XML locatables, the overlay should - // contain a full extraction and all XML locatables from base - // should be discarded. - baseXmlLocatable(el) and overlayHasXmlLocatable() -} diff --git a/java/ql/lib/semmle/code/xml/XML.qll b/java/ql/lib/semmle/code/xml/XML.qll index e4073362fc6..cd00991eb65 100644 --- a/java/ql/lib/semmle/code/xml/XML.qll +++ b/java/ql/lib/semmle/code/xml/XML.qll @@ -6,6 +6,7 @@ module; import semmle.files.FileSystem private import codeql.xml.Xml +private import semmle.code.java.Overlay private module Input implements InputSig { class XmlLocatableBase = @xmllocatable or @xmlnamespaceable; @@ -69,3 +70,13 @@ private module Input implements InputSig { } import Make + +private class DiscardableXmlAttribute extends DiscardableLocatable, @xmlattribute { } + +private class DiscardableXmlElement extends DiscardableLocatable, @xmlelement { } + +private class DiscardableXmlComment extends DiscardableLocatable, @xmlcomment { } + +private class DiscardableXmlCharacters extends DiscardableLocatable, @xmlcharacters { } + +private class DiscardableXmlDtd extends DiscardableLocatable, @xmldtd { } From c831a8c2d92d7dd7be628f16b3df9eb528184868 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 17 Sep 2025 13:43:24 +0200 Subject: [PATCH 33/49] Rust: Add more path resolution tests --- .../PathResolutionConsistency.expected | 3 +- .../library-tests/path-resolution/main.rs | 10 +- .../library-tests/path-resolution/my2/mod.rs | 10 +- .../path-resolution/my2/my3/mod.rs | 2 + .../path-resolution/path-resolution.expected | 813 +++++++++--------- 5 files changed, 431 insertions(+), 407 deletions(-) diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index 9d1761069fe..d945cb4c6c2 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -1,3 +1,4 @@ multipleCallTargets -| main.rs:118:9:118:11 | f(...) | +| main.rs:124:9:124:11 | f(...) | +| main.rs:774:5:774:7 | f(...) | | proc_macro.rs:9:5:9:10 | ...::new(...) | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 1de91a60fe4..db8e4c0f39d 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -8,7 +8,13 @@ mod my2; // I14 use my2::*; // $ item=I14 -use my2::nested2::nested3::nested4::{f, g}; // $ item=I11 item=I12 item=I13 +#[rustfmt::skip] +use my2::nested2::nested3::nested4::{ // $ item=I11 + f, // $ item=I12 + g, // $ item=I13 +}; + +use my2::nested8_f; // $ item=I119 mod m1 { fn f() { @@ -765,7 +771,7 @@ fn main() { my::nested::nested1::nested2::f(); // $ item=I4 my::f(); // $ item=I38 nested2::nested3::nested4::f(); // $ item=I12 - f(); // $ item=I12 + f(); // $ item=I12 $ SPURIOUS: item=I119 g(); // $ item=I13 crate::h(); // $ item=I25 m1::m2::g(); // $ item=I19 diff --git a/rust/ql/test/library-tests/path-resolution/my2/mod.rs b/rust/ql/test/library-tests/path-resolution/my2/mod.rs index 43c1a05e91f..85edb683202 100644 --- a/rust/ql/test/library-tests/path-resolution/my2/mod.rs +++ b/rust/ql/test/library-tests/path-resolution/my2/mod.rs @@ -7,11 +7,17 @@ fn g() { pub use nested2::nested5::*; // $ item=I114 -pub use nested2::nested7::nested8::{self}; // $ item=I118 +#[rustfmt::skip] +pub use nested2::nested7::nested8::{ // $ item=I118 + self, // $ item=I118 + f as nested8_f // $ item=I119 +}; + +use nested2::nested5::nested6::f as nested6_f; // $ item=I116 pub mod my3; #[path = "renamed.rs"] mod mymod; -use mymod::f; // $ item=I1001 +pub use mymod::f; // $ item=I1001 diff --git a/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs b/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs index 6b54377728b..e2d413841c3 100644 --- a/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs +++ b/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs @@ -6,3 +6,5 @@ pub fn f() { use super::super::h; // $ item=I25 use super::g; // $ item=I9 + +use super::nested6_f; // $ MISSING: item=I116 diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected index a51816a5228..8f12af96c02 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -2,38 +2,38 @@ mod | lib.rs:1:1:1:11 | mod my | | main.rs:1:1:1:7 | mod my | | main.rs:7:1:7:8 | mod my2 | -| main.rs:13:1:37:1 | mod m1 | -| main.rs:18:5:36:5 | mod m2 | -| main.rs:29:9:35:9 | mod m3 | -| main.rs:39:1:46:1 | mod m4 | -| main.rs:103:1:107:1 | mod m5 | -| main.rs:109:1:120:1 | mod m6 | -| main.rs:122:1:141:1 | mod m7 | -| main.rs:143:1:197:1 | mod m8 | -| main.rs:199:1:207:1 | mod m9 | -| main.rs:209:1:228:1 | mod m10 | -| main.rs:230:1:267:1 | mod m11 | -| main.rs:240:5:240:12 | mod f | -| main.rs:269:1:281:1 | mod m12 | -| main.rs:283:1:296:1 | mod m13 | -| main.rs:287:5:295:5 | mod m14 | -| main.rs:298:1:367:1 | mod m15 | -| main.rs:369:1:461:1 | mod m16 | -| main.rs:463:1:513:1 | mod trait_visibility | -| main.rs:464:5:486:5 | mod m | -| main.rs:515:1:545:1 | mod m17 | -| main.rs:547:1:565:1 | mod m18 | -| main.rs:552:5:564:5 | mod m19 | -| main.rs:557:9:563:9 | mod m20 | -| main.rs:567:1:592:1 | mod m21 | -| main.rs:568:5:574:5 | mod m22 | -| main.rs:576:5:591:5 | mod m33 | -| main.rs:594:1:619:1 | mod m23 | -| main.rs:621:1:689:1 | mod m24 | -| main.rs:706:1:758:1 | mod associated_types | +| main.rs:19:1:43:1 | mod m1 | +| main.rs:24:5:42:5 | mod m2 | +| main.rs:35:9:41:9 | mod m3 | +| main.rs:45:1:52:1 | mod m4 | +| main.rs:109:1:113:1 | mod m5 | +| main.rs:115:1:126:1 | mod m6 | +| main.rs:128:1:147:1 | mod m7 | +| main.rs:149:1:203:1 | mod m8 | +| main.rs:205:1:213:1 | mod m9 | +| main.rs:215:1:234:1 | mod m10 | +| main.rs:236:1:273:1 | mod m11 | +| main.rs:246:5:246:12 | mod f | +| main.rs:275:1:287:1 | mod m12 | +| main.rs:289:1:302:1 | mod m13 | +| main.rs:293:5:301:5 | mod m14 | +| main.rs:304:1:373:1 | mod m15 | +| main.rs:375:1:467:1 | mod m16 | +| main.rs:469:1:519:1 | mod trait_visibility | +| main.rs:470:5:492:5 | mod m | +| main.rs:521:1:551:1 | mod m17 | +| main.rs:553:1:571:1 | mod m18 | +| main.rs:558:5:570:5 | mod m19 | +| main.rs:563:9:569:9 | mod m20 | +| main.rs:573:1:598:1 | mod m21 | +| main.rs:574:5:580:5 | mod m22 | +| main.rs:582:5:597:5 | mod m33 | +| main.rs:600:1:625:1 | mod m23 | +| main.rs:627:1:695:1 | mod m24 | +| main.rs:712:1:764:1 | mod associated_types | | my2/mod.rs:1:1:1:16 | mod nested2 | -| my2/mod.rs:12:1:12:12 | mod my3 | -| my2/mod.rs:14:1:15:10 | mod mymod | +| my2/mod.rs:18:1:18:12 | mod my3 | +| my2/mod.rs:20:1:21:10 | mod mymod | | my2/nested2.rs:1:1:11:1 | mod nested3 | | my2/nested2.rs:2:5:10:5 | mod nested4 | | my2/nested2.rs:13:1:19:1 | mod nested5 | @@ -52,385 +52,394 @@ resolvePath | main.rs:5:5:5:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | | main.rs:5:5:5:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | | main.rs:9:5:9:7 | my2 | main.rs:7:1:7:8 | mod my2 | -| main.rs:11:5:11:7 | my2 | main.rs:7:1:7:8 | mod my2 | -| main.rs:11:5:11:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:11:5:11:25 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:11:5:11:34 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:11:38:11:38 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:11:41:11:41 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:25:13:25:13 | f | main.rs:19:9:21:9 | fn f | -| main.rs:26:13:26:17 | super | main.rs:13:1:37:1 | mod m1 | -| main.rs:26:13:26:20 | ...::f | main.rs:14:5:16:5 | fn f | -| main.rs:30:17:30:21 | super | main.rs:18:5:36:5 | mod m2 | -| main.rs:30:17:30:24 | ...::f | main.rs:19:9:21:9 | fn f | -| main.rs:33:17:33:17 | f | main.rs:19:9:21:9 | fn f | -| main.rs:40:9:40:13 | super | main.rs:1:1:799:2 | SourceFile | -| main.rs:40:9:40:17 | ...::m1 | main.rs:13:1:37:1 | mod m1 | -| main.rs:40:9:40:21 | ...::m2 | main.rs:18:5:36:5 | mod m2 | -| main.rs:40:9:40:24 | ...::g | main.rs:23:9:27:9 | fn g | -| main.rs:44:9:44:9 | g | main.rs:23:9:27:9 | fn g | -| main.rs:56:13:56:14 | m1 | main.rs:13:1:37:1 | mod m1 | -| main.rs:56:13:56:18 | ...::m2 | main.rs:18:5:36:5 | mod m2 | -| main.rs:56:13:56:21 | ...::g | main.rs:23:9:27:9 | fn g | -| main.rs:57:9:57:9 | g | main.rs:23:9:27:9 | fn g | -| main.rs:61:17:61:19 | Foo | main.rs:59:9:59:21 | struct Foo | -| main.rs:64:13:64:15 | Foo | main.rs:53:5:53:17 | struct Foo | -| main.rs:66:5:66:5 | f | main.rs:55:5:62:5 | fn f | -| main.rs:68:5:68:8 | self | main.rs:1:1:799:2 | SourceFile | -| main.rs:68:5:68:11 | ...::i | main.rs:71:1:83:1 | fn i | -| main.rs:74:13:74:15 | Foo | main.rs:48:1:48:13 | struct Foo | -| main.rs:78:16:78:18 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:81:17:81:19 | Foo | main.rs:77:9:79:9 | struct Foo | -| main.rs:85:5:85:7 | my2 | main.rs:7:1:7:8 | mod my2 | -| main.rs:85:5:85:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:87:5:87:21 | my2_nested2_alias | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:87:5:87:30 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:87:34:87:40 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:87:34:87:43 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:87:57:87:63 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:87:57:87:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:87:80:87:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:100:5:100:22 | f_defined_in_macro | main.rs:99:18:99:42 | fn f_defined_in_macro | -| main.rs:117:13:117:17 | super | main.rs:1:1:799:2 | SourceFile | -| main.rs:117:13:117:21 | ...::m5 | main.rs:103:1:107:1 | mod m5 | -| main.rs:118:9:118:9 | f | main.rs:104:5:106:5 | fn f | -| main.rs:118:9:118:9 | f | main.rs:110:5:112:5 | fn f | -| main.rs:125:13:125:15 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:128:16:128:18 | i32 | {EXTERNAL LOCATION} | struct i32 | -| main.rs:134:19:134:24 | MyEnum | main.rs:123:5:131:5 | enum MyEnum | -| main.rs:137:17:137:22 | MyEnum | main.rs:123:5:131:5 | enum MyEnum | -| main.rs:137:17:137:25 | ...::A | main.rs:124:9:126:9 | A | -| main.rs:138:17:138:22 | MyEnum | main.rs:123:5:131:5 | enum MyEnum | -| main.rs:138:17:138:25 | ...::B | main.rs:126:12:129:9 | B | -| main.rs:139:9:139:14 | MyEnum | main.rs:123:5:131:5 | enum MyEnum | -| main.rs:139:9:139:17 | ...::C | main.rs:129:12:130:9 | C | -| main.rs:149:13:149:13 | f | main.rs:156:5:158:5 | fn f | -| main.rs:150:13:150:16 | Self | main.rs:144:5:152:5 | trait MyTrait | -| main.rs:150:13:150:19 | ...::f | main.rs:145:9:145:20 | fn f | -| main.rs:161:10:161:16 | MyTrait | main.rs:144:5:152:5 | trait MyTrait | -| main.rs:161:22:161:29 | MyStruct | main.rs:154:5:154:22 | struct MyStruct | -| main.rs:164:13:164:13 | f | main.rs:156:5:158:5 | fn f | -| main.rs:165:13:165:16 | Self | main.rs:160:5:171:5 | impl MyTrait for MyStruct { ... } | -| main.rs:165:13:165:19 | ...::g | main.rs:168:9:170:9 | fn g | -| main.rs:174:10:174:17 | MyStruct | main.rs:154:5:154:22 | struct MyStruct | -| main.rs:177:13:177:13 | f | main.rs:156:5:158:5 | fn f | -| main.rs:183:17:183:24 | MyStruct | main.rs:154:5:154:22 | struct MyStruct | -| main.rs:184:9:184:15 | MyTrait | main.rs:144:5:152:5 | trait MyTrait | -| main.rs:184:9:184:18 | ...::f | main.rs:145:9:145:20 | fn f | -| main.rs:185:9:185:16 | MyStruct | main.rs:154:5:154:22 | struct MyStruct | -| main.rs:185:9:185:19 | ...::f | main.rs:161:33:166:9 | fn f | -| main.rs:186:10:186:17 | MyStruct | main.rs:154:5:154:22 | struct MyStruct | -| main.rs:187:10:187:16 | MyTrait | main.rs:144:5:152:5 | trait MyTrait | -| main.rs:190:17:190:24 | MyStruct | main.rs:154:5:154:22 | struct MyStruct | -| main.rs:192:17:192:24 | MyStruct | main.rs:154:5:154:22 | struct MyStruct | -| main.rs:194:9:194:16 | MyStruct | main.rs:154:5:154:22 | struct MyStruct | -| main.rs:194:9:194:19 | ...::h | main.rs:174:21:178:9 | fn h | -| main.rs:203:19:203:22 | self | main.rs:199:1:207:1 | mod m9 | -| main.rs:203:19:203:32 | ...::MyStruct | main.rs:200:5:200:26 | struct MyStruct | -| main.rs:205:9:205:12 | self | main.rs:199:1:207:1 | mod m9 | -| main.rs:205:9:205:22 | ...::MyStruct | main.rs:200:5:200:26 | struct MyStruct | -| main.rs:215:12:215:12 | T | main.rs:212:7:212:7 | T | -| main.rs:220:12:220:12 | T | main.rs:219:14:219:14 | T | -| main.rs:222:7:224:7 | MyStruct::<...> | main.rs:210:5:216:5 | struct MyStruct | -| main.rs:223:9:223:9 | T | main.rs:219:14:219:14 | T | -| main.rs:226:9:226:16 | MyStruct | main.rs:210:5:216:5 | struct MyStruct | -| main.rs:236:17:236:19 | Foo | main.rs:231:5:231:21 | struct Foo | -| main.rs:237:9:237:11 | Foo | main.rs:233:5:233:15 | fn Foo | -| main.rs:246:9:246:11 | Bar | main.rs:242:5:244:5 | enum Bar | -| main.rs:246:9:246:19 | ...::FooBar | main.rs:243:9:243:17 | FooBar | -| main.rs:251:13:251:15 | Foo | main.rs:231:5:231:21 | struct Foo | -| main.rs:252:17:252:22 | FooBar | main.rs:243:9:243:17 | FooBar | -| main.rs:253:17:253:22 | FooBar | main.rs:248:5:248:18 | fn FooBar | -| main.rs:261:9:261:9 | E | main.rs:256:15:259:5 | enum E | -| main.rs:261:9:261:12 | ...::C | main.rs:258:9:258:9 | C | -| main.rs:264:17:264:17 | S | main.rs:256:5:256:13 | struct S | -| main.rs:265:17:265:17 | C | main.rs:258:9:258:9 | C | -| main.rs:278:16:278:16 | T | main.rs:272:7:272:7 | T | -| main.rs:279:14:279:17 | Self | main.rs:270:5:280:5 | trait MyParamTrait | -| main.rs:279:14:279:33 | ...::AssociatedType | main.rs:274:9:274:28 | type AssociatedType | -| main.rs:288:13:288:16 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:288:13:288:21 | ...::m13 | main.rs:283:1:296:1 | mod m13 | -| main.rs:288:13:288:24 | ...::f | main.rs:284:5:284:17 | fn f | -| main.rs:288:13:288:24 | ...::f | main.rs:284:19:285:19 | struct f | -| main.rs:291:17:291:17 | f | main.rs:284:19:285:19 | struct f | -| main.rs:292:21:292:21 | f | main.rs:284:19:285:19 | struct f | -| main.rs:293:13:293:13 | f | main.rs:284:5:284:17 | fn f | -| main.rs:307:9:307:14 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | -| main.rs:310:13:310:16 | Self | main.rs:305:5:313:5 | trait Trait2 | -| main.rs:310:13:310:19 | ...::g | main.rs:302:9:302:20 | fn g | -| main.rs:320:9:320:12 | Self | main.rs:315:5:328:5 | trait Trait3 | -| main.rs:320:15:320:20 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | -| main.rs:321:9:321:10 | TT | main.rs:317:9:317:10 | TT | -| main.rs:321:13:321:18 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | -| main.rs:323:25:323:26 | TT | main.rs:317:9:317:10 | TT | -| main.rs:324:13:324:16 | Self | main.rs:315:5:328:5 | trait Trait3 | -| main.rs:324:13:324:19 | ...::g | main.rs:302:9:302:20 | fn g | -| main.rs:325:13:325:14 | TT | main.rs:317:9:317:10 | TT | -| main.rs:325:13:325:17 | ...::g | main.rs:302:9:302:20 | fn g | -| main.rs:333:10:333:15 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | -| main.rs:334:11:334:11 | S | main.rs:330:5:330:13 | struct S | -| main.rs:337:13:337:16 | Self | main.rs:332:5:344:5 | impl Trait1 for S { ... } | -| main.rs:337:13:337:19 | ...::g | main.rs:341:9:343:9 | fn g | -| main.rs:347:10:347:15 | Trait2 | main.rs:305:5:313:5 | trait Trait2 | -| main.rs:348:11:348:11 | S | main.rs:330:5:330:13 | struct S | -| main.rs:357:17:357:17 | S | main.rs:330:5:330:13 | struct S | -| main.rs:358:10:358:10 | S | main.rs:330:5:330:13 | struct S | -| main.rs:359:14:359:19 | Trait1 | main.rs:299:5:303:5 | trait Trait1 | -| main.rs:361:10:361:10 | S | main.rs:330:5:330:13 | struct S | -| main.rs:362:14:362:19 | Trait2 | main.rs:305:5:313:5 | trait Trait2 | -| main.rs:364:9:364:9 | S | main.rs:330:5:330:13 | struct S | -| main.rs:364:9:364:12 | ...::g | main.rs:341:9:343:9 | fn g | -| main.rs:374:24:374:24 | T | main.rs:372:7:372:7 | T | -| main.rs:376:24:376:24 | T | main.rs:372:7:372:7 | T | -| main.rs:379:24:379:24 | T | main.rs:372:7:372:7 | T | -| main.rs:380:13:380:16 | Self | main.rs:370:5:386:5 | trait Trait1 | -| main.rs:380:13:380:19 | ...::g | main.rs:376:9:377:9 | fn g | -| main.rs:384:18:384:18 | T | main.rs:372:7:372:7 | T | -| main.rs:392:9:394:9 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 | -| main.rs:393:11:393:11 | T | main.rs:390:7:390:7 | T | -| main.rs:395:24:395:24 | T | main.rs:390:7:390:7 | T | -| main.rs:397:13:397:16 | Self | main.rs:388:5:401:5 | trait Trait2 | -| main.rs:397:13:397:19 | ...::g | main.rs:376:9:377:9 | fn g | -| main.rs:399:13:399:16 | Self | main.rs:388:5:401:5 | trait Trait2 | -| main.rs:399:13:399:19 | ...::c | main.rs:384:9:385:9 | Const | -| main.rs:406:10:408:5 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 | -| main.rs:407:7:407:7 | S | main.rs:403:5:403:13 | struct S | -| main.rs:409:11:409:11 | S | main.rs:403:5:403:13 | struct S | -| main.rs:410:24:410:24 | S | main.rs:403:5:403:13 | struct S | -| main.rs:412:13:412:16 | Self | main.rs:405:5:423:5 | impl Trait1::<...> for S { ... } | -| main.rs:412:13:412:19 | ...::g | main.rs:416:9:419:9 | fn g | -| main.rs:416:24:416:24 | S | main.rs:403:5:403:13 | struct S | -| main.rs:418:13:418:16 | Self | main.rs:405:5:423:5 | impl Trait1::<...> for S { ... } | -| main.rs:418:13:418:19 | ...::c | main.rs:421:9:422:9 | Const | -| main.rs:421:18:421:18 | S | main.rs:403:5:403:13 | struct S | -| main.rs:421:22:421:22 | S | main.rs:403:5:403:13 | struct S | -| main.rs:426:10:428:5 | Trait2::<...> | main.rs:388:5:401:5 | trait Trait2 | -| main.rs:427:7:427:7 | S | main.rs:403:5:403:13 | struct S | -| main.rs:429:11:429:11 | S | main.rs:403:5:403:13 | struct S | -| main.rs:430:24:430:24 | S | main.rs:403:5:403:13 | struct S | -| main.rs:432:13:432:16 | Self | main.rs:425:5:434:5 | impl Trait2::<...> for S { ... } | -| main.rs:439:17:439:17 | S | main.rs:403:5:403:13 | struct S | -| main.rs:440:10:440:10 | S | main.rs:403:5:403:13 | struct S | -| main.rs:441:14:443:11 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 | -| main.rs:442:13:442:13 | S | main.rs:403:5:403:13 | struct S | -| main.rs:445:10:445:10 | S | main.rs:403:5:403:13 | struct S | -| main.rs:446:14:448:11 | Trait2::<...> | main.rs:388:5:401:5 | trait Trait2 | -| main.rs:447:13:447:13 | S | main.rs:403:5:403:13 | struct S | -| main.rs:450:9:450:9 | S | main.rs:403:5:403:13 | struct S | -| main.rs:450:9:450:12 | ...::g | main.rs:416:9:419:9 | fn g | -| main.rs:452:9:452:9 | S | main.rs:403:5:403:13 | struct S | -| main.rs:452:9:452:12 | ...::h | main.rs:379:9:382:9 | fn h | -| main.rs:454:9:454:9 | S | main.rs:403:5:403:13 | struct S | -| main.rs:454:9:454:12 | ...::c | main.rs:421:9:422:9 | Const | -| main.rs:455:10:455:10 | S | main.rs:403:5:403:13 | struct S | -| main.rs:456:14:458:11 | Trait1::<...> | main.rs:370:5:386:5 | trait Trait1 | -| main.rs:457:13:457:13 | S | main.rs:403:5:403:13 | struct S | -| main.rs:475:14:475:16 | Foo | main.rs:465:9:467:9 | trait Foo | -| main.rs:475:22:475:22 | X | main.rs:473:9:473:21 | struct X | -| main.rs:481:14:481:16 | Bar | main.rs:469:9:471:9 | trait Bar | -| main.rs:481:22:481:22 | X | main.rs:473:9:473:21 | struct X | -| main.rs:488:9:488:9 | m | main.rs:464:5:486:5 | mod m | -| main.rs:488:9:488:12 | ...::X | main.rs:473:9:473:21 | struct X | -| main.rs:491:17:491:17 | X | main.rs:473:9:473:21 | struct X | -| main.rs:494:17:494:17 | m | main.rs:464:5:486:5 | mod m | -| main.rs:494:17:494:22 | ...::Foo | main.rs:465:9:467:9 | trait Foo | -| main.rs:495:13:495:13 | X | main.rs:473:9:473:21 | struct X | -| main.rs:495:13:495:23 | ...::a_method | main.rs:475:26:478:13 | fn a_method | -| main.rs:499:17:499:17 | m | main.rs:464:5:486:5 | mod m | -| main.rs:499:17:499:22 | ...::Bar | main.rs:469:9:471:9 | trait Bar | -| main.rs:500:13:500:13 | X | main.rs:473:9:473:21 | struct X | -| main.rs:500:13:500:23 | ...::a_method | main.rs:481:26:484:13 | fn a_method | -| main.rs:504:17:504:17 | m | main.rs:464:5:486:5 | mod m | -| main.rs:504:17:504:22 | ...::Bar | main.rs:469:9:471:9 | trait Bar | -| main.rs:505:13:505:13 | X | main.rs:473:9:473:21 | struct X | -| main.rs:505:13:505:23 | ...::a_method | main.rs:481:26:484:13 | fn a_method | -| main.rs:510:13:510:13 | m | main.rs:464:5:486:5 | mod m | -| main.rs:510:13:510:18 | ...::Bar | main.rs:469:9:471:9 | trait Bar | -| main.rs:510:13:510:28 | ...::a_method | main.rs:470:13:470:31 | fn a_method | -| main.rs:523:10:523:16 | MyTrait | main.rs:516:5:518:5 | trait MyTrait | -| main.rs:524:9:524:9 | S | main.rs:520:5:520:13 | struct S | -| main.rs:532:7:532:13 | MyTrait | main.rs:516:5:518:5 | trait MyTrait | -| main.rs:533:10:533:10 | T | main.rs:531:10:531:10 | T | -| main.rs:535:9:535:9 | T | main.rs:531:10:531:10 | T | -| main.rs:535:9:535:12 | ...::f | main.rs:517:9:517:20 | fn f | -| main.rs:536:9:536:15 | MyTrait | main.rs:516:5:518:5 | trait MyTrait | -| main.rs:536:9:536:18 | ...::f | main.rs:517:9:517:20 | fn f | -| main.rs:541:9:541:9 | g | main.rs:530:5:537:5 | fn g | -| main.rs:542:11:542:11 | S | main.rs:520:5:520:13 | struct S | -| main.rs:560:17:560:21 | super | main.rs:552:5:564:5 | mod m19 | -| main.rs:560:17:560:24 | ...::f | main.rs:553:9:555:9 | fn f | -| main.rs:561:17:561:21 | super | main.rs:552:5:564:5 | mod m19 | -| main.rs:561:17:561:28 | ...::super | main.rs:547:1:565:1 | mod m18 | -| main.rs:561:17:561:31 | ...::f | main.rs:548:5:550:5 | fn f | -| main.rs:578:13:578:17 | super | main.rs:567:1:592:1 | mod m21 | -| main.rs:578:13:578:22 | ...::m22 | main.rs:568:5:574:5 | mod m22 | -| main.rs:578:13:578:30 | ...::MyEnum | main.rs:569:9:571:9 | enum MyEnum | -| main.rs:579:13:579:16 | self | main.rs:569:9:571:9 | enum MyEnum | -| main.rs:583:13:583:17 | super | main.rs:567:1:592:1 | mod m21 | -| main.rs:583:13:583:22 | ...::m22 | main.rs:568:5:574:5 | mod m22 | -| main.rs:583:13:583:32 | ...::MyStruct | main.rs:573:9:573:28 | struct MyStruct | -| main.rs:584:13:584:16 | self | main.rs:573:9:573:28 | struct MyStruct | -| main.rs:588:21:588:26 | MyEnum | main.rs:569:9:571:9 | enum MyEnum | -| main.rs:588:21:588:29 | ...::A | main.rs:570:13:570:13 | A | -| main.rs:589:21:589:28 | MyStruct | main.rs:573:9:573:28 | struct MyStruct | -| main.rs:605:10:607:5 | Trait1::<...> | main.rs:595:5:600:5 | trait Trait1 | -| main.rs:606:7:606:10 | Self | main.rs:602:5:602:13 | struct S | -| main.rs:608:11:608:11 | S | main.rs:602:5:602:13 | struct S | -| main.rs:616:17:616:17 | S | main.rs:602:5:602:13 | struct S | -| main.rs:632:15:632:15 | T | main.rs:631:26:631:26 | T | -| main.rs:637:9:637:24 | GenericStruct::<...> | main.rs:630:5:633:5 | struct GenericStruct | -| main.rs:637:23:637:23 | T | main.rs:636:10:636:10 | T | -| main.rs:639:9:639:9 | T | main.rs:636:10:636:10 | T | -| main.rs:639:12:639:17 | TraitA | main.rs:622:5:624:5 | trait TraitA | -| main.rs:648:9:648:24 | GenericStruct::<...> | main.rs:630:5:633:5 | struct GenericStruct | -| main.rs:648:23:648:23 | T | main.rs:647:10:647:10 | T | -| main.rs:650:9:650:9 | T | main.rs:647:10:647:10 | T | -| main.rs:650:12:650:17 | TraitB | main.rs:626:5:628:5 | trait TraitB | -| main.rs:651:9:651:9 | T | main.rs:647:10:647:10 | T | -| main.rs:651:12:651:17 | TraitA | main.rs:622:5:624:5 | trait TraitA | -| main.rs:662:10:662:15 | TraitA | main.rs:622:5:624:5 | trait TraitA | -| main.rs:662:21:662:31 | Implementor | main.rs:659:5:659:23 | struct Implementor | -| main.rs:669:10:669:15 | TraitB | main.rs:626:5:628:5 | trait TraitB | -| main.rs:669:21:669:31 | Implementor | main.rs:659:5:659:23 | struct Implementor | -| main.rs:677:24:677:34 | Implementor | main.rs:659:5:659:23 | struct Implementor | -| main.rs:678:23:678:35 | GenericStruct | main.rs:630:5:633:5 | struct GenericStruct | -| main.rs:684:9:684:36 | GenericStruct::<...> | main.rs:630:5:633:5 | struct GenericStruct | -| main.rs:684:9:684:50 | ...::call_trait_a | main.rs:641:9:643:9 | fn call_trait_a | -| main.rs:684:25:684:35 | Implementor | main.rs:659:5:659:23 | struct Implementor | -| main.rs:687:9:687:36 | GenericStruct::<...> | main.rs:630:5:633:5 | struct GenericStruct | -| main.rs:687:9:687:47 | ...::call_both | main.rs:653:9:656:9 | fn call_both | -| main.rs:687:25:687:35 | Implementor | main.rs:659:5:659:23 | struct Implementor | -| main.rs:693:3:693:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:693:3:693:24 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | -| main.rs:697:6:697:12 | AStruct | main.rs:696:1:696:17 | struct AStruct | -| main.rs:699:7:699:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:699:7:699:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | -| main.rs:702:7:702:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:702:7:702:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | -| main.rs:707:9:707:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:707:9:707:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | -| main.rs:707:9:707:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:708:9:708:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:708:9:708:19 | ...::result | {EXTERNAL LOCATION} | mod result | -| main.rs:708:9:708:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | -| main.rs:716:19:716:22 | Self | main.rs:710:5:718:5 | trait Reduce | -| main.rs:716:19:716:29 | ...::Input | main.rs:711:9:711:19 | type Input | -| main.rs:717:14:717:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:717:21:717:24 | Self | main.rs:710:5:718:5 | trait Reduce | -| main.rs:717:21:717:32 | ...::Output | main.rs:712:21:713:20 | type Output | -| main.rs:717:35:717:38 | Self | main.rs:710:5:718:5 | trait Reduce | -| main.rs:717:35:717:45 | ...::Error | main.rs:711:21:712:19 | type Error | -| main.rs:721:17:721:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:721:29:721:33 | Input | main.rs:720:19:720:23 | Input | -| main.rs:722:17:722:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | -| main.rs:722:29:722:33 | Error | main.rs:720:26:720:30 | Error | -| main.rs:729:11:729:16 | Reduce | main.rs:710:5:718:5 | trait Reduce | -| main.rs:730:13:733:9 | MyImpl::<...> | main.rs:720:5:723:5 | struct MyImpl | -| main.rs:731:13:731:17 | Input | main.rs:727:13:727:17 | Input | -| main.rs:732:13:732:17 | Error | main.rs:728:13:728:17 | Error | -| main.rs:735:22:738:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:736:13:736:17 | Input | main.rs:727:13:727:17 | Input | -| main.rs:737:13:737:16 | Self | main.rs:725:5:757:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:737:13:737:23 | ...::Error | main.rs:739:11:743:9 | type Error | -| main.rs:740:22:742:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | -| main.rs:741:11:741:15 | Error | main.rs:728:13:728:17 | Error | -| main.rs:745:13:745:17 | Input | main.rs:727:13:727:17 | Input | -| main.rs:750:19:750:22 | Self | main.rs:725:5:757:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:750:19:750:29 | ...::Input | main.rs:735:9:739:9 | type Input | -| main.rs:751:14:754:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | -| main.rs:752:13:752:16 | Self | main.rs:725:5:757:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:752:13:752:24 | ...::Output | main.rs:743:11:746:9 | type Output | -| main.rs:753:13:753:16 | Self | main.rs:725:5:757:5 | impl Reduce for MyImpl::<...> { ... } | -| main.rs:753:13:753:23 | ...::Error | main.rs:739:11:743:9 | type Error | -| main.rs:760:5:760:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:760:11:760:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:762:15:762:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | -| main.rs:762:15:762:25 | ...::string | {EXTERNAL LOCATION} | mod string | -| main.rs:762:15:762:33 | ...::String | {EXTERNAL LOCATION} | struct String | -| main.rs:765:5:765:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:765:5:765:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:765:5:765:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:765:5:765:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:765:5:765:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:766:5:766:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:766:5:766:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:767:5:767:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:767:5:767:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:767:5:767:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:767:5:767:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:768:5:768:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:769:5:769:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:770:5:770:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:770:5:770:12 | ...::h | main.rs:50:1:69:1 | fn h | -| main.rs:771:5:771:6 | m1 | main.rs:13:1:37:1 | mod m1 | -| main.rs:771:5:771:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 | -| main.rs:771:5:771:13 | ...::g | main.rs:23:9:27:9 | fn g | -| main.rs:772:5:772:6 | m1 | main.rs:13:1:37:1 | mod m1 | -| main.rs:772:5:772:10 | ...::m2 | main.rs:18:5:36:5 | mod m2 | -| main.rs:772:5:772:14 | ...::m3 | main.rs:29:9:35:9 | mod m3 | -| main.rs:772:5:772:17 | ...::h | main.rs:30:27:34:13 | fn h | -| main.rs:773:5:773:6 | m4 | main.rs:39:1:46:1 | mod m4 | -| main.rs:773:5:773:9 | ...::i | main.rs:42:5:45:5 | fn i | -| main.rs:774:5:774:5 | h | main.rs:50:1:69:1 | fn h | -| main.rs:775:5:775:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:776:5:776:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:777:5:777:5 | j | main.rs:97:1:101:1 | fn j | -| main.rs:778:5:778:6 | m6 | main.rs:109:1:120:1 | mod m6 | -| main.rs:778:5:778:9 | ...::g | main.rs:114:5:119:5 | fn g | -| main.rs:779:5:779:6 | m7 | main.rs:122:1:141:1 | mod m7 | -| main.rs:779:5:779:9 | ...::f | main.rs:133:5:140:5 | fn f | -| main.rs:780:5:780:6 | m8 | main.rs:143:1:197:1 | mod m8 | -| main.rs:780:5:780:9 | ...::g | main.rs:181:5:196:5 | fn g | -| main.rs:781:5:781:6 | m9 | main.rs:199:1:207:1 | mod m9 | -| main.rs:781:5:781:9 | ...::f | main.rs:202:5:206:5 | fn f | -| main.rs:782:5:782:7 | m11 | main.rs:230:1:267:1 | mod m11 | -| main.rs:782:5:782:10 | ...::f | main.rs:235:5:238:5 | fn f | -| main.rs:783:5:783:7 | m15 | main.rs:298:1:367:1 | mod m15 | -| main.rs:783:5:783:10 | ...::f | main.rs:354:5:366:5 | fn f | -| main.rs:784:5:784:7 | m16 | main.rs:369:1:461:1 | mod m16 | -| main.rs:784:5:784:10 | ...::f | main.rs:436:5:460:5 | fn f | -| main.rs:785:5:785:20 | trait_visibility | main.rs:463:1:513:1 | mod trait_visibility | -| main.rs:785:5:785:23 | ...::f | main.rs:490:5:512:5 | fn f | -| main.rs:786:5:786:7 | m17 | main.rs:515:1:545:1 | mod m17 | -| main.rs:786:5:786:10 | ...::f | main.rs:539:5:544:5 | fn f | -| main.rs:787:5:787:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:787:5:787:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:788:5:788:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:788:5:788:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:789:5:789:7 | my3 | my2/mod.rs:12:1:12:12 | mod my3 | -| main.rs:789:5:789:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:790:5:790:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:791:5:791:7 | m18 | main.rs:547:1:565:1 | mod m18 | -| main.rs:791:5:791:12 | ...::m19 | main.rs:552:5:564:5 | mod m19 | -| main.rs:791:5:791:17 | ...::m20 | main.rs:557:9:563:9 | mod m20 | -| main.rs:791:5:791:20 | ...::g | main.rs:558:13:562:13 | fn g | -| main.rs:792:5:792:7 | m23 | main.rs:594:1:619:1 | mod m23 | -| main.rs:792:5:792:10 | ...::f | main.rs:614:5:618:5 | fn f | -| main.rs:793:5:793:7 | m24 | main.rs:621:1:689:1 | mod m24 | -| main.rs:793:5:793:10 | ...::f | main.rs:675:5:688:5 | fn f | -| main.rs:794:5:794:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:794:5:794:11 | ...::h | main.rs:50:1:69:1 | fn h | -| main.rs:796:5:796:11 | AStruct | main.rs:696:1:696:17 | struct AStruct | -| main.rs:797:5:797:11 | AStruct | main.rs:696:1:696:17 | struct AStruct | +| main.rs:12:5:12:7 | my2 | main.rs:7:1:7:8 | mod my2 | +| main.rs:12:5:12:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:12:5:12:25 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:12:5:12:34 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:13:5:13:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:14:5:14:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:17:5:17:7 | my2 | main.rs:7:1:7:8 | mod my2 | +| main.rs:17:5:17:18 | ...::nested8_f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:31:13:31:13 | f | main.rs:25:9:27:9 | fn f | +| main.rs:32:13:32:17 | super | main.rs:19:1:43:1 | mod m1 | +| main.rs:32:13:32:20 | ...::f | main.rs:20:5:22:5 | fn f | +| main.rs:36:17:36:21 | super | main.rs:24:5:42:5 | mod m2 | +| main.rs:36:17:36:24 | ...::f | main.rs:25:9:27:9 | fn f | +| main.rs:39:17:39:17 | f | main.rs:25:9:27:9 | fn f | +| main.rs:46:9:46:13 | super | main.rs:1:1:805:2 | SourceFile | +| main.rs:46:9:46:17 | ...::m1 | main.rs:19:1:43:1 | mod m1 | +| main.rs:46:9:46:21 | ...::m2 | main.rs:24:5:42:5 | mod m2 | +| main.rs:46:9:46:24 | ...::g | main.rs:29:9:33:9 | fn g | +| main.rs:50:9:50:9 | g | main.rs:29:9:33:9 | fn g | +| main.rs:62:13:62:14 | m1 | main.rs:19:1:43:1 | mod m1 | +| main.rs:62:13:62:18 | ...::m2 | main.rs:24:5:42:5 | mod m2 | +| main.rs:62:13:62:21 | ...::g | main.rs:29:9:33:9 | fn g | +| main.rs:63:9:63:9 | g | main.rs:29:9:33:9 | fn g | +| main.rs:67:17:67:19 | Foo | main.rs:65:9:65:21 | struct Foo | +| main.rs:70:13:70:15 | Foo | main.rs:59:5:59:17 | struct Foo | +| main.rs:72:5:72:5 | f | main.rs:61:5:68:5 | fn f | +| main.rs:74:5:74:8 | self | main.rs:1:1:805:2 | SourceFile | +| main.rs:74:5:74:11 | ...::i | main.rs:77:1:89:1 | fn i | +| main.rs:80:13:80:15 | Foo | main.rs:54:1:54:13 | struct Foo | +| main.rs:84:16:84:18 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:87:17:87:19 | Foo | main.rs:83:9:85:9 | struct Foo | +| main.rs:91:5:91:7 | my2 | main.rs:7:1:7:8 | mod my2 | +| main.rs:91:5:91:16 | ...::nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:93:5:93:21 | my2_nested2_alias | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:93:5:93:30 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:93:34:93:40 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:93:34:93:43 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:93:57:93:63 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:93:57:93:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:93:80:93:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:106:5:106:22 | f_defined_in_macro | main.rs:105:18:105:42 | fn f_defined_in_macro | +| main.rs:123:13:123:17 | super | main.rs:1:1:805:2 | SourceFile | +| main.rs:123:13:123:21 | ...::m5 | main.rs:109:1:113:1 | mod m5 | +| main.rs:124:9:124:9 | f | main.rs:110:5:112:5 | fn f | +| main.rs:124:9:124:9 | f | main.rs:116:5:118:5 | fn f | +| main.rs:131:13:131:15 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:134:16:134:18 | i32 | {EXTERNAL LOCATION} | struct i32 | +| main.rs:140:19:140:24 | MyEnum | main.rs:129:5:137:5 | enum MyEnum | +| main.rs:143:17:143:22 | MyEnum | main.rs:129:5:137:5 | enum MyEnum | +| main.rs:143:17:143:25 | ...::A | main.rs:130:9:132:9 | A | +| main.rs:144:17:144:22 | MyEnum | main.rs:129:5:137:5 | enum MyEnum | +| main.rs:144:17:144:25 | ...::B | main.rs:132:12:135:9 | B | +| main.rs:145:9:145:14 | MyEnum | main.rs:129:5:137:5 | enum MyEnum | +| main.rs:145:9:145:17 | ...::C | main.rs:135:12:136:9 | C | +| main.rs:155:13:155:13 | f | main.rs:162:5:164:5 | fn f | +| main.rs:156:13:156:16 | Self | main.rs:150:5:158:5 | trait MyTrait | +| main.rs:156:13:156:19 | ...::f | main.rs:151:9:151:20 | fn f | +| main.rs:167:10:167:16 | MyTrait | main.rs:150:5:158:5 | trait MyTrait | +| main.rs:167:22:167:29 | MyStruct | main.rs:160:5:160:22 | struct MyStruct | +| main.rs:170:13:170:13 | f | main.rs:162:5:164:5 | fn f | +| main.rs:171:13:171:16 | Self | main.rs:166:5:177:5 | impl MyTrait for MyStruct { ... } | +| main.rs:171:13:171:19 | ...::g | main.rs:174:9:176:9 | fn g | +| main.rs:180:10:180:17 | MyStruct | main.rs:160:5:160:22 | struct MyStruct | +| main.rs:183:13:183:13 | f | main.rs:162:5:164:5 | fn f | +| main.rs:189:17:189:24 | MyStruct | main.rs:160:5:160:22 | struct MyStruct | +| main.rs:190:9:190:15 | MyTrait | main.rs:150:5:158:5 | trait MyTrait | +| main.rs:190:9:190:18 | ...::f | main.rs:151:9:151:20 | fn f | +| main.rs:191:9:191:16 | MyStruct | main.rs:160:5:160:22 | struct MyStruct | +| main.rs:191:9:191:19 | ...::f | main.rs:167:33:172:9 | fn f | +| main.rs:192:10:192:17 | MyStruct | main.rs:160:5:160:22 | struct MyStruct | +| main.rs:193:10:193:16 | MyTrait | main.rs:150:5:158:5 | trait MyTrait | +| main.rs:196:17:196:24 | MyStruct | main.rs:160:5:160:22 | struct MyStruct | +| main.rs:198:17:198:24 | MyStruct | main.rs:160:5:160:22 | struct MyStruct | +| main.rs:200:9:200:16 | MyStruct | main.rs:160:5:160:22 | struct MyStruct | +| main.rs:200:9:200:19 | ...::h | main.rs:180:21:184:9 | fn h | +| main.rs:209:19:209:22 | self | main.rs:205:1:213:1 | mod m9 | +| main.rs:209:19:209:32 | ...::MyStruct | main.rs:206:5:206:26 | struct MyStruct | +| main.rs:211:9:211:12 | self | main.rs:205:1:213:1 | mod m9 | +| main.rs:211:9:211:22 | ...::MyStruct | main.rs:206:5:206:26 | struct MyStruct | +| main.rs:221:12:221:12 | T | main.rs:218:7:218:7 | T | +| main.rs:226:12:226:12 | T | main.rs:225:14:225:14 | T | +| main.rs:228:7:230:7 | MyStruct::<...> | main.rs:216:5:222:5 | struct MyStruct | +| main.rs:229:9:229:9 | T | main.rs:225:14:225:14 | T | +| main.rs:232:9:232:16 | MyStruct | main.rs:216:5:222:5 | struct MyStruct | +| main.rs:242:17:242:19 | Foo | main.rs:237:5:237:21 | struct Foo | +| main.rs:243:9:243:11 | Foo | main.rs:239:5:239:15 | fn Foo | +| main.rs:252:9:252:11 | Bar | main.rs:248:5:250:5 | enum Bar | +| main.rs:252:9:252:19 | ...::FooBar | main.rs:249:9:249:17 | FooBar | +| main.rs:257:13:257:15 | Foo | main.rs:237:5:237:21 | struct Foo | +| main.rs:258:17:258:22 | FooBar | main.rs:249:9:249:17 | FooBar | +| main.rs:259:17:259:22 | FooBar | main.rs:254:5:254:18 | fn FooBar | +| main.rs:267:9:267:9 | E | main.rs:262:15:265:5 | enum E | +| main.rs:267:9:267:12 | ...::C | main.rs:264:9:264:9 | C | +| main.rs:270:17:270:17 | S | main.rs:262:5:262:13 | struct S | +| main.rs:271:17:271:17 | C | main.rs:264:9:264:9 | C | +| main.rs:284:16:284:16 | T | main.rs:278:7:278:7 | T | +| main.rs:285:14:285:17 | Self | main.rs:276:5:286:5 | trait MyParamTrait | +| main.rs:285:14:285:33 | ...::AssociatedType | main.rs:280:9:280:28 | type AssociatedType | +| main.rs:294:13:294:16 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:294:13:294:21 | ...::m13 | main.rs:289:1:302:1 | mod m13 | +| main.rs:294:13:294:24 | ...::f | main.rs:290:5:290:17 | fn f | +| main.rs:294:13:294:24 | ...::f | main.rs:290:19:291:19 | struct f | +| main.rs:297:17:297:17 | f | main.rs:290:19:291:19 | struct f | +| main.rs:298:21:298:21 | f | main.rs:290:19:291:19 | struct f | +| main.rs:299:13:299:13 | f | main.rs:290:5:290:17 | fn f | +| main.rs:313:9:313:14 | Trait1 | main.rs:305:5:309:5 | trait Trait1 | +| main.rs:316:13:316:16 | Self | main.rs:311:5:319:5 | trait Trait2 | +| main.rs:316:13:316:19 | ...::g | main.rs:308:9:308:20 | fn g | +| main.rs:326:9:326:12 | Self | main.rs:321:5:334:5 | trait Trait3 | +| main.rs:326:15:326:20 | Trait1 | main.rs:305:5:309:5 | trait Trait1 | +| main.rs:327:9:327:10 | TT | main.rs:323:9:323:10 | TT | +| main.rs:327:13:327:18 | Trait1 | main.rs:305:5:309:5 | trait Trait1 | +| main.rs:329:25:329:26 | TT | main.rs:323:9:323:10 | TT | +| main.rs:330:13:330:16 | Self | main.rs:321:5:334:5 | trait Trait3 | +| main.rs:330:13:330:19 | ...::g | main.rs:308:9:308:20 | fn g | +| main.rs:331:13:331:14 | TT | main.rs:323:9:323:10 | TT | +| main.rs:331:13:331:17 | ...::g | main.rs:308:9:308:20 | fn g | +| main.rs:339:10:339:15 | Trait1 | main.rs:305:5:309:5 | trait Trait1 | +| main.rs:340:11:340:11 | S | main.rs:336:5:336:13 | struct S | +| main.rs:343:13:343:16 | Self | main.rs:338:5:350:5 | impl Trait1 for S { ... } | +| main.rs:343:13:343:19 | ...::g | main.rs:347:9:349:9 | fn g | +| main.rs:353:10:353:15 | Trait2 | main.rs:311:5:319:5 | trait Trait2 | +| main.rs:354:11:354:11 | S | main.rs:336:5:336:13 | struct S | +| main.rs:363:17:363:17 | S | main.rs:336:5:336:13 | struct S | +| main.rs:364:10:364:10 | S | main.rs:336:5:336:13 | struct S | +| main.rs:365:14:365:19 | Trait1 | main.rs:305:5:309:5 | trait Trait1 | +| main.rs:367:10:367:10 | S | main.rs:336:5:336:13 | struct S | +| main.rs:368:14:368:19 | Trait2 | main.rs:311:5:319:5 | trait Trait2 | +| main.rs:370:9:370:9 | S | main.rs:336:5:336:13 | struct S | +| main.rs:370:9:370:12 | ...::g | main.rs:347:9:349:9 | fn g | +| main.rs:380:24:380:24 | T | main.rs:378:7:378:7 | T | +| main.rs:382:24:382:24 | T | main.rs:378:7:378:7 | T | +| main.rs:385:24:385:24 | T | main.rs:378:7:378:7 | T | +| main.rs:386:13:386:16 | Self | main.rs:376:5:392:5 | trait Trait1 | +| main.rs:386:13:386:19 | ...::g | main.rs:382:9:383:9 | fn g | +| main.rs:390:18:390:18 | T | main.rs:378:7:378:7 | T | +| main.rs:398:9:400:9 | Trait1::<...> | main.rs:376:5:392:5 | trait Trait1 | +| main.rs:399:11:399:11 | T | main.rs:396:7:396:7 | T | +| main.rs:401:24:401:24 | T | main.rs:396:7:396:7 | T | +| main.rs:403:13:403:16 | Self | main.rs:394:5:407:5 | trait Trait2 | +| main.rs:403:13:403:19 | ...::g | main.rs:382:9:383:9 | fn g | +| main.rs:405:13:405:16 | Self | main.rs:394:5:407:5 | trait Trait2 | +| main.rs:405:13:405:19 | ...::c | main.rs:390:9:391:9 | Const | +| main.rs:412:10:414:5 | Trait1::<...> | main.rs:376:5:392:5 | trait Trait1 | +| main.rs:413:7:413:7 | S | main.rs:409:5:409:13 | struct S | +| main.rs:415:11:415:11 | S | main.rs:409:5:409:13 | struct S | +| main.rs:416:24:416:24 | S | main.rs:409:5:409:13 | struct S | +| main.rs:418:13:418:16 | Self | main.rs:411:5:429:5 | impl Trait1::<...> for S { ... } | +| main.rs:418:13:418:19 | ...::g | main.rs:422:9:425:9 | fn g | +| main.rs:422:24:422:24 | S | main.rs:409:5:409:13 | struct S | +| main.rs:424:13:424:16 | Self | main.rs:411:5:429:5 | impl Trait1::<...> for S { ... } | +| main.rs:424:13:424:19 | ...::c | main.rs:427:9:428:9 | Const | +| main.rs:427:18:427:18 | S | main.rs:409:5:409:13 | struct S | +| main.rs:427:22:427:22 | S | main.rs:409:5:409:13 | struct S | +| main.rs:432:10:434:5 | Trait2::<...> | main.rs:394:5:407:5 | trait Trait2 | +| main.rs:433:7:433:7 | S | main.rs:409:5:409:13 | struct S | +| main.rs:435:11:435:11 | S | main.rs:409:5:409:13 | struct S | +| main.rs:436:24:436:24 | S | main.rs:409:5:409:13 | struct S | +| main.rs:438:13:438:16 | Self | main.rs:431:5:440:5 | impl Trait2::<...> for S { ... } | +| main.rs:445:17:445:17 | S | main.rs:409:5:409:13 | struct S | +| main.rs:446:10:446:10 | S | main.rs:409:5:409:13 | struct S | +| main.rs:447:14:449:11 | Trait1::<...> | main.rs:376:5:392:5 | trait Trait1 | +| main.rs:448:13:448:13 | S | main.rs:409:5:409:13 | struct S | +| main.rs:451:10:451:10 | S | main.rs:409:5:409:13 | struct S | +| main.rs:452:14:454:11 | Trait2::<...> | main.rs:394:5:407:5 | trait Trait2 | +| main.rs:453:13:453:13 | S | main.rs:409:5:409:13 | struct S | +| main.rs:456:9:456:9 | S | main.rs:409:5:409:13 | struct S | +| main.rs:456:9:456:12 | ...::g | main.rs:422:9:425:9 | fn g | +| main.rs:458:9:458:9 | S | main.rs:409:5:409:13 | struct S | +| main.rs:458:9:458:12 | ...::h | main.rs:385:9:388:9 | fn h | +| main.rs:460:9:460:9 | S | main.rs:409:5:409:13 | struct S | +| main.rs:460:9:460:12 | ...::c | main.rs:427:9:428:9 | Const | +| main.rs:461:10:461:10 | S | main.rs:409:5:409:13 | struct S | +| main.rs:462:14:464:11 | Trait1::<...> | main.rs:376:5:392:5 | trait Trait1 | +| main.rs:463:13:463:13 | S | main.rs:409:5:409:13 | struct S | +| main.rs:481:14:481:16 | Foo | main.rs:471:9:473:9 | trait Foo | +| main.rs:481:22:481:22 | X | main.rs:479:9:479:21 | struct X | +| main.rs:487:14:487:16 | Bar | main.rs:475:9:477:9 | trait Bar | +| main.rs:487:22:487:22 | X | main.rs:479:9:479:21 | struct X | +| main.rs:494:9:494:9 | m | main.rs:470:5:492:5 | mod m | +| main.rs:494:9:494:12 | ...::X | main.rs:479:9:479:21 | struct X | +| main.rs:497:17:497:17 | X | main.rs:479:9:479:21 | struct X | +| main.rs:500:17:500:17 | m | main.rs:470:5:492:5 | mod m | +| main.rs:500:17:500:22 | ...::Foo | main.rs:471:9:473:9 | trait Foo | +| main.rs:501:13:501:13 | X | main.rs:479:9:479:21 | struct X | +| main.rs:501:13:501:23 | ...::a_method | main.rs:481:26:484:13 | fn a_method | +| main.rs:505:17:505:17 | m | main.rs:470:5:492:5 | mod m | +| main.rs:505:17:505:22 | ...::Bar | main.rs:475:9:477:9 | trait Bar | +| main.rs:506:13:506:13 | X | main.rs:479:9:479:21 | struct X | +| main.rs:506:13:506:23 | ...::a_method | main.rs:487:26:490:13 | fn a_method | +| main.rs:510:17:510:17 | m | main.rs:470:5:492:5 | mod m | +| main.rs:510:17:510:22 | ...::Bar | main.rs:475:9:477:9 | trait Bar | +| main.rs:511:13:511:13 | X | main.rs:479:9:479:21 | struct X | +| main.rs:511:13:511:23 | ...::a_method | main.rs:487:26:490:13 | fn a_method | +| main.rs:516:13:516:13 | m | main.rs:470:5:492:5 | mod m | +| main.rs:516:13:516:18 | ...::Bar | main.rs:475:9:477:9 | trait Bar | +| main.rs:516:13:516:28 | ...::a_method | main.rs:476:13:476:31 | fn a_method | +| main.rs:529:10:529:16 | MyTrait | main.rs:522:5:524:5 | trait MyTrait | +| main.rs:530:9:530:9 | S | main.rs:526:5:526:13 | struct S | +| main.rs:538:7:538:13 | MyTrait | main.rs:522:5:524:5 | trait MyTrait | +| main.rs:539:10:539:10 | T | main.rs:537:10:537:10 | T | +| main.rs:541:9:541:9 | T | main.rs:537:10:537:10 | T | +| main.rs:541:9:541:12 | ...::f | main.rs:523:9:523:20 | fn f | +| main.rs:542:9:542:15 | MyTrait | main.rs:522:5:524:5 | trait MyTrait | +| main.rs:542:9:542:18 | ...::f | main.rs:523:9:523:20 | fn f | +| main.rs:547:9:547:9 | g | main.rs:536:5:543:5 | fn g | +| main.rs:548:11:548:11 | S | main.rs:526:5:526:13 | struct S | +| main.rs:566:17:566:21 | super | main.rs:558:5:570:5 | mod m19 | +| main.rs:566:17:566:24 | ...::f | main.rs:559:9:561:9 | fn f | +| main.rs:567:17:567:21 | super | main.rs:558:5:570:5 | mod m19 | +| main.rs:567:17:567:28 | ...::super | main.rs:553:1:571:1 | mod m18 | +| main.rs:567:17:567:31 | ...::f | main.rs:554:5:556:5 | fn f | +| main.rs:584:13:584:17 | super | main.rs:573:1:598:1 | mod m21 | +| main.rs:584:13:584:22 | ...::m22 | main.rs:574:5:580:5 | mod m22 | +| main.rs:584:13:584:30 | ...::MyEnum | main.rs:575:9:577:9 | enum MyEnum | +| main.rs:585:13:585:16 | self | main.rs:575:9:577:9 | enum MyEnum | +| main.rs:589:13:589:17 | super | main.rs:573:1:598:1 | mod m21 | +| main.rs:589:13:589:22 | ...::m22 | main.rs:574:5:580:5 | mod m22 | +| main.rs:589:13:589:32 | ...::MyStruct | main.rs:579:9:579:28 | struct MyStruct | +| main.rs:590:13:590:16 | self | main.rs:579:9:579:28 | struct MyStruct | +| main.rs:594:21:594:26 | MyEnum | main.rs:575:9:577:9 | enum MyEnum | +| main.rs:594:21:594:29 | ...::A | main.rs:576:13:576:13 | A | +| main.rs:595:21:595:28 | MyStruct | main.rs:579:9:579:28 | struct MyStruct | +| main.rs:611:10:613:5 | Trait1::<...> | main.rs:601:5:606:5 | trait Trait1 | +| main.rs:612:7:612:10 | Self | main.rs:608:5:608:13 | struct S | +| main.rs:614:11:614:11 | S | main.rs:608:5:608:13 | struct S | +| main.rs:622:17:622:17 | S | main.rs:608:5:608:13 | struct S | +| main.rs:638:15:638:15 | T | main.rs:637:26:637:26 | T | +| main.rs:643:9:643:24 | GenericStruct::<...> | main.rs:636:5:639:5 | struct GenericStruct | +| main.rs:643:23:643:23 | T | main.rs:642:10:642:10 | T | +| main.rs:645:9:645:9 | T | main.rs:642:10:642:10 | T | +| main.rs:645:12:645:17 | TraitA | main.rs:628:5:630:5 | trait TraitA | +| main.rs:654:9:654:24 | GenericStruct::<...> | main.rs:636:5:639:5 | struct GenericStruct | +| main.rs:654:23:654:23 | T | main.rs:653:10:653:10 | T | +| main.rs:656:9:656:9 | T | main.rs:653:10:653:10 | T | +| main.rs:656:12:656:17 | TraitB | main.rs:632:5:634:5 | trait TraitB | +| main.rs:657:9:657:9 | T | main.rs:653:10:653:10 | T | +| main.rs:657:12:657:17 | TraitA | main.rs:628:5:630:5 | trait TraitA | +| main.rs:668:10:668:15 | TraitA | main.rs:628:5:630:5 | trait TraitA | +| main.rs:668:21:668:31 | Implementor | main.rs:665:5:665:23 | struct Implementor | +| main.rs:675:10:675:15 | TraitB | main.rs:632:5:634:5 | trait TraitB | +| main.rs:675:21:675:31 | Implementor | main.rs:665:5:665:23 | struct Implementor | +| main.rs:683:24:683:34 | Implementor | main.rs:665:5:665:23 | struct Implementor | +| main.rs:684:23:684:35 | GenericStruct | main.rs:636:5:639:5 | struct GenericStruct | +| main.rs:690:9:690:36 | GenericStruct::<...> | main.rs:636:5:639:5 | struct GenericStruct | +| main.rs:690:9:690:50 | ...::call_trait_a | main.rs:647:9:649:9 | fn call_trait_a | +| main.rs:690:25:690:35 | Implementor | main.rs:665:5:665:23 | struct Implementor | +| main.rs:693:9:693:36 | GenericStruct::<...> | main.rs:636:5:639:5 | struct GenericStruct | +| main.rs:693:9:693:47 | ...::call_both | main.rs:659:9:662:9 | fn call_both | +| main.rs:693:25:693:35 | Implementor | main.rs:665:5:665:23 | struct Implementor | +| main.rs:699:3:699:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:699:3:699:24 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:703:6:703:12 | AStruct | main.rs:702:1:702:17 | struct AStruct | +| main.rs:705:7:705:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:705:7:705:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:708:7:708:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:708:7:708:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:713:9:713:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:713:9:713:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | +| main.rs:713:9:713:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:714:9:714:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:714:9:714:19 | ...::result | {EXTERNAL LOCATION} | mod result | +| main.rs:714:9:714:27 | ...::Result | {EXTERNAL LOCATION} | enum Result | +| main.rs:722:19:722:22 | Self | main.rs:716:5:724:5 | trait Reduce | +| main.rs:722:19:722:29 | ...::Input | main.rs:717:9:717:19 | type Input | +| main.rs:723:14:723:46 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:723:21:723:24 | Self | main.rs:716:5:724:5 | trait Reduce | +| main.rs:723:21:723:32 | ...::Output | main.rs:718:21:719:20 | type Output | +| main.rs:723:35:723:38 | Self | main.rs:716:5:724:5 | trait Reduce | +| main.rs:723:35:723:45 | ...::Error | main.rs:717:21:718:19 | type Error | +| main.rs:727:17:727:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:727:29:727:33 | Input | main.rs:726:19:726:23 | Input | +| main.rs:728:17:728:34 | PhantomData::<...> | {EXTERNAL LOCATION} | struct PhantomData | +| main.rs:728:29:728:33 | Error | main.rs:726:26:726:30 | Error | +| main.rs:735:11:735:16 | Reduce | main.rs:716:5:724:5 | trait Reduce | +| main.rs:736:13:739:9 | MyImpl::<...> | main.rs:726:5:729:5 | struct MyImpl | +| main.rs:737:13:737:17 | Input | main.rs:733:13:733:17 | Input | +| main.rs:738:13:738:17 | Error | main.rs:734:13:734:17 | Error | +| main.rs:741:22:744:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:742:13:742:17 | Input | main.rs:733:13:733:17 | Input | +| main.rs:743:13:743:16 | Self | main.rs:731:5:763:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:743:13:743:23 | ...::Error | main.rs:745:11:749:9 | type Error | +| main.rs:746:22:748:9 | Option::<...> | {EXTERNAL LOCATION} | enum Option | +| main.rs:747:11:747:15 | Error | main.rs:734:13:734:17 | Error | +| main.rs:751:13:751:17 | Input | main.rs:733:13:733:17 | Input | +| main.rs:756:19:756:22 | Self | main.rs:731:5:763:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:756:19:756:29 | ...::Input | main.rs:741:9:745:9 | type Input | +| main.rs:757:14:760:9 | Result::<...> | {EXTERNAL LOCATION} | enum Result | +| main.rs:758:13:758:16 | Self | main.rs:731:5:763:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:758:13:758:24 | ...::Output | main.rs:749:11:752:9 | type Output | +| main.rs:759:13:759:16 | Self | main.rs:731:5:763:5 | impl Reduce for MyImpl::<...> { ... } | +| main.rs:759:13:759:23 | ...::Error | main.rs:745:11:749:9 | type Error | +| main.rs:766:5:766:7 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:766:11:766:14 | self | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:768:15:768:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | +| main.rs:768:15:768:25 | ...::string | {EXTERNAL LOCATION} | mod string | +| main.rs:768:15:768:33 | ...::String | {EXTERNAL LOCATION} | struct String | +| main.rs:771:5:771:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:771:5:771:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:771:5:771:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:771:5:771:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:771:5:771:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:772:5:772:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:772:5:772:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:773:5:773:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:773:5:773:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:773:5:773:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:773:5:773:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:774:5:774:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:774:5:774:5 | f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:775:5:775:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:776:5:776:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:776:5:776:12 | ...::h | main.rs:56:1:75:1 | fn h | +| main.rs:777:5:777:6 | m1 | main.rs:19:1:43:1 | mod m1 | +| main.rs:777:5:777:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 | +| main.rs:777:5:777:13 | ...::g | main.rs:29:9:33:9 | fn g | +| main.rs:778:5:778:6 | m1 | main.rs:19:1:43:1 | mod m1 | +| main.rs:778:5:778:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 | +| main.rs:778:5:778:14 | ...::m3 | main.rs:35:9:41:9 | mod m3 | +| main.rs:778:5:778:17 | ...::h | main.rs:36:27:40:13 | fn h | +| main.rs:779:5:779:6 | m4 | main.rs:45:1:52:1 | mod m4 | +| main.rs:779:5:779:9 | ...::i | main.rs:48:5:51:5 | fn i | +| main.rs:780:5:780:5 | h | main.rs:56:1:75:1 | fn h | +| main.rs:781:5:781:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:782:5:782:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:783:5:783:5 | j | main.rs:103:1:107:1 | fn j | +| main.rs:784:5:784:6 | m6 | main.rs:115:1:126:1 | mod m6 | +| main.rs:784:5:784:9 | ...::g | main.rs:120:5:125:5 | fn g | +| main.rs:785:5:785:6 | m7 | main.rs:128:1:147:1 | mod m7 | +| main.rs:785:5:785:9 | ...::f | main.rs:139:5:146:5 | fn f | +| main.rs:786:5:786:6 | m8 | main.rs:149:1:203:1 | mod m8 | +| main.rs:786:5:786:9 | ...::g | main.rs:187:5:202:5 | fn g | +| main.rs:787:5:787:6 | m9 | main.rs:205:1:213:1 | mod m9 | +| main.rs:787:5:787:9 | ...::f | main.rs:208:5:212:5 | fn f | +| main.rs:788:5:788:7 | m11 | main.rs:236:1:273:1 | mod m11 | +| main.rs:788:5:788:10 | ...::f | main.rs:241:5:244:5 | fn f | +| main.rs:789:5:789:7 | m15 | main.rs:304:1:373:1 | mod m15 | +| main.rs:789:5:789:10 | ...::f | main.rs:360:5:372:5 | fn f | +| main.rs:790:5:790:7 | m16 | main.rs:375:1:467:1 | mod m16 | +| main.rs:790:5:790:10 | ...::f | main.rs:442:5:466:5 | fn f | +| main.rs:791:5:791:20 | trait_visibility | main.rs:469:1:519:1 | mod trait_visibility | +| main.rs:791:5:791:23 | ...::f | main.rs:496:5:518:5 | fn f | +| main.rs:792:5:792:7 | m17 | main.rs:521:1:551:1 | mod m17 | +| main.rs:792:5:792:10 | ...::f | main.rs:545:5:550:5 | fn f | +| main.rs:793:5:793:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:793:5:793:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:794:5:794:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:794:5:794:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:795:5:795:7 | my3 | my2/mod.rs:18:1:18:12 | mod my3 | +| main.rs:795:5:795:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:796:5:796:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:797:5:797:7 | m18 | main.rs:553:1:571:1 | mod m18 | +| main.rs:797:5:797:12 | ...::m19 | main.rs:558:5:570:5 | mod m19 | +| main.rs:797:5:797:17 | ...::m20 | main.rs:563:9:569:9 | mod m20 | +| main.rs:797:5:797:20 | ...::g | main.rs:564:13:568:13 | fn g | +| main.rs:798:5:798:7 | m23 | main.rs:600:1:625:1 | mod m23 | +| main.rs:798:5:798:10 | ...::f | main.rs:620:5:624:5 | fn f | +| main.rs:799:5:799:7 | m24 | main.rs:627:1:695:1 | mod m24 | +| main.rs:799:5:799:10 | ...::f | main.rs:681:5:694:5 | fn f | +| main.rs:800:5:800:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:800:5:800:11 | ...::h | main.rs:56:1:75:1 | fn h | +| main.rs:802:5:802:11 | AStruct | main.rs:702:1:702:17 | struct AStruct | +| main.rs:803:5:803:11 | AStruct | main.rs:702:1:702:17 | struct AStruct | | my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | | my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | | my2/mod.rs:5:5:5:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | | my2/mod.rs:8:9:8:15 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:8:9:8:24 | ...::nested5 | my2/nested2.rs:13:1:19:1 | mod nested5 | -| my2/mod.rs:10:9:10:15 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| my2/mod.rs:10:9:10:24 | ...::nested7 | my2/nested2.rs:21:1:27:1 | mod nested7 | -| my2/mod.rs:10:9:10:33 | ...::nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| my2/mod.rs:10:37:10:40 | self | my2/nested2.rs:22:5:26:5 | mod nested8 | -| my2/mod.rs:17:5:17:9 | mymod | my2/mod.rs:14:1:15:10 | mod mymod | -| my2/mod.rs:17:5:17:12 | ...::f | my2/renamed.rs:1:1:1:13 | fn f | +| my2/mod.rs:11:9:11:15 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| my2/mod.rs:11:9:11:24 | ...::nested7 | my2/nested2.rs:21:1:27:1 | mod nested7 | +| my2/mod.rs:11:9:11:33 | ...::nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| my2/mod.rs:12:5:12:8 | self | my2/nested2.rs:22:5:26:5 | mod nested8 | +| my2/mod.rs:13:5:13:5 | f | my2/nested2.rs:23:9:25:9 | fn f | +| my2/mod.rs:16:5:16:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| my2/mod.rs:16:5:16:20 | ...::nested5 | my2/nested2.rs:13:1:19:1 | mod nested5 | +| my2/mod.rs:16:5:16:29 | ...::nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| my2/mod.rs:16:5:16:32 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| my2/mod.rs:23:9:23:13 | mymod | my2/mod.rs:20:1:21:10 | mod mymod | +| my2/mod.rs:23:9:23:16 | ...::f | my2/renamed.rs:1:1:1:13 | fn f | | my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g | -| my2/my3/mod.rs:4:5:4:5 | h | main.rs:50:1:69:1 | fn h | -| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:17:30 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:799:2 | SourceFile | -| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:50:1:69:1 | fn h | -| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:17:30 | SourceFile | +| my2/my3/mod.rs:4:5:4:5 | h | main.rs:56:1:75:1 | fn h | +| my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:23:34 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:805:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:56:1:75:1 | fn h | +| my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:23:34 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | +| my2/my3/mod.rs:10:5:10:9 | super | my2/mod.rs:1:1:23:34 | SourceFile | | my.rs:3:5:3:10 | nested | my.rs:1:1:1:15 | mod nested | | my.rs:3:5:3:13 | ...::g | my/nested.rs:19:1:22:1 | fn g | | my.rs:11:5:11:5 | g | my/nested.rs:19:1:22:1 | fn g | From f6bdfba3b328e8f9d42f5af0fa0cae8363122e84 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 17 Sep 2025 13:43:39 +0200 Subject: [PATCH 34/49] Rust: Path resolution improvements --- .../codeql/rust/internal/PathResolution.qll | 60 +- .../PathResolutionConsistency.expected | 2 + .../dataflow/sources/InlineFlow.expected | 840 +++++++++--------- .../library-tests/dataflow/sources/test.rs | 4 +- .../PathResolutionConsistency.expected | 1 - .../library-tests/path-resolution/main.rs | 2 +- .../path-resolution/my2/my3/mod.rs | 2 +- .../path-resolution/path-resolution.expected | 2 +- 8 files changed, 497 insertions(+), 416 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 4b718fc4399..f819632ce10 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -72,9 +72,9 @@ private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind ki if item instanceof ImplOrTraitItemNode and result instanceof AssocItem then kind.isExternal() else - if result instanceof Use - then kind.isInternal() - else kind.isBoth() + if result.isPublic() + then kind.isBoth() + else kind.isInternal() ) } @@ -165,6 +165,20 @@ abstract class ItemNode extends Locatable { /** Gets the visibility of this item, if any. */ abstract Visibility getVisibility(); + /** + * Holds if this item is public. + * + * This is the case when this item either has `pub` visibility (but is not + * a `use`; a `use` itself is not visible from the outside), or when this + * item is a variant. + */ + predicate isPublic() { + exists(this.getVisibility()) and + not this instanceof Use + or + this instanceof Variant + } + /** Gets the `i`th type parameter of this item, if any. */ abstract TypeParam getTypeParam(int i); @@ -380,9 +394,7 @@ abstract private class ModuleLikeNode extends ItemNode { private class SourceFileItemNode extends ModuleLikeNode, SourceFile { pragma[nomagic] - ModuleLikeNode getSuper() { - result = any(ModuleItemNode mod | fileImport(mod, this)).getASuccessor("super") - } + ModuleLikeNode getSuper() { fileImport(result.getAnItemInScope(), this) } override string getName() { result = "(source file)" } @@ -1300,7 +1312,8 @@ private predicate useTreeDeclares(UseTree tree, string name) { */ pragma[nomagic] private predicate declaresDirectly(ItemNode item, Namespace ns, string name) { - exists(ItemNode child, SuccessorKind kind | child = getAChildSuccessor(item, name, kind) | + exists(ItemNode child, SuccessorKind kind | + child = getAChildSuccessor(item, name, kind) and child.getNamespace() = ns and kind.isInternalOrBoth() ) @@ -1491,6 +1504,13 @@ private ItemNode resolvePathCandQualifier(RelevantPath qualifier, RelevantPath p name = path.getText() } +pragma[nomagic] +private Crate getCrate0(Locatable l) { result.getASourceFile().getFile() = l.getFile() } + +bindingset[l] +pragma[inline_late] +private Crate getCrate(Locatable l) { result = getCrate0(l) } + /** * Gets the item that `path` resolves to in `ns` when `qualifier` is the * qualifier of `path` and `qualifier` resolves to `q`, if any. @@ -1501,8 +1521,17 @@ private ItemNode resolvePathCandQualified( ) { exists(string name, SuccessorKind kind | q = resolvePathCandQualifier(qualifier, path, name) and - result = getASuccessor(q, name, ns, kind) and + result = getASuccessor(q, name, ns, kind) + | kind.isExternalOrBoth() + or + // Non-public items are visible to paths in descendant modules of the declaring + // module; the declaration may happen via a `use` statement, where the item + // being used is _not_ itself in an ancestor module, and we currently don't track + // that information in `getASuccessor`. So, for simplicity, we allow for non-public + // items when the path and the item are in the same crate. + getCrate(path) = getCrate(result) and + not result instanceof TypeParam ) } @@ -1646,10 +1675,12 @@ private ItemNode resolveUseTreeListItemQualifier( pragma[nomagic] private ItemNode resolveUseTreeListItem(Use use, UseTree tree) { - tree = use.getUseTree() and - result = resolvePathCand(tree.getPath()) - or - result = resolveUseTreeListItem(use, tree, tree.getPath(), _) + exists(Path path | path = tree.getPath() | + tree = use.getUseTree() and + result = resolvePathCand(path) + or + result = resolveUseTreeListItem(use, tree, path, _) + ) } /** Holds if `use` imports `item` as `name`. */ @@ -1673,7 +1704,10 @@ private predicate useImportEdge(Use use, string name, ItemNode item, SuccessorKi item = used and ( not tree.hasRename() and - name = item.getName() + exists(string pathName | + pathName = tree.getPath().getText() and + if pathName = "self" then name = item.getName() else name = pathName + ) or exists(Rename rename | rename = tree.getRename() | name = rename.getName().getText() diff --git a/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected index 5ba71c14933..0fb7a59f6f4 100644 --- a/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/dataflow/sources/CONSISTENCY/PathResolutionConsistency.expected @@ -11,6 +11,8 @@ multipleCallTargets | test.rs:179:30:179:68 | ...::_print(...) | | test.rs:188:26:188:105 | ...::_print(...) | | test.rs:229:22:229:72 | ... .read_to_string(...) | +| test.rs:664:22:664:43 | file.read(...) | +| test.rs:673:22:673:41 | f1.read(...) | | test.rs:697:18:697:38 | ...::_print(...) | | test.rs:702:18:702:45 | ...::_print(...) | | test.rs:720:38:720:42 | ...::_print(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected index 88a728253d8..db0cb969d5a 100644 --- a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected @@ -1,138 +1,140 @@ models -| 1 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 2 | Source: ::send_request; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 3 | Source: ::file_name; ReturnValue; file | -| 4 | Source: ::path; ReturnValue; file | -| 5 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 6 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 7 | Source: ::connect; ReturnValue.Field[core::result::Result::Ok(0)]; remote | -| 8 | Source: ::connect_timeout; ReturnValue.Field[core::result::Result::Ok(0)]; remote | -| 9 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 10 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 11 | Source: ::file_name; ReturnValue; file | -| 12 | Source: ::path; ReturnValue; file | -| 13 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 14 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | -| 15 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 16 | Source: std::env::args; ReturnValue.Element; commandargs | -| 17 | Source: std::env::args_os; ReturnValue.Element; commandargs | -| 18 | Source: std::env::current_dir; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs | -| 19 | Source: std::env::current_exe; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs | -| 20 | Source: std::env::home_dir; ReturnValue.Field[core::option::Option::Some(0)]; commandargs | -| 21 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | -| 22 | Source: std::env::var_os; ReturnValue.Field[core::option::Option::Some(0)]; environment | -| 23 | Source: std::fs::read; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 24 | Source: std::fs::read; ReturnValue; file | -| 25 | Source: std::fs::read_link; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 26 | Source: std::fs::read_to_string; ReturnValue.Field[core::result::Result::Ok(0)]; file | -| 27 | Source: std::fs::read_to_string; ReturnValue; file | -| 28 | Source: std::io::stdio::stdin; ReturnValue; stdin | -| 29 | Source: tokio::fs::read::read; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 30 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 31 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | -| 32 | Source: tokio::io::stdin::stdin; ReturnValue; stdin | -| 33 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 34 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | -| 35 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 36 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | -| 37 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 38 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 39 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | -| 40 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 41 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | -| 42 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 43 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 44 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 45 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 46 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint | -| 47 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint | -| 48 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint | -| 49 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint | -| 50 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | -| 51 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint | -| 52 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint | -| 53 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint | -| 54 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint | -| 55 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 56 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 57 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | -| 58 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 59 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint | -| 60 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | -| 61 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | -| 62 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint | -| 63 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 64 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint | -| 65 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint | -| 66 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 67 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 68 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 69 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 70 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 71 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 72 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 73 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 74 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 75 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 76 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 77 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value | -| 78 | Summary: ::new; Argument[0]; ReturnValue; value | -| 79 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 80 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 81 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 82 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 83 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 84 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 85 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 86 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 87 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 88 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 89 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 90 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 91 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 92 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 93 | Summary: ::read; Argument[self]; Argument[0]; taint | -| 94 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 95 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint | -| 96 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 97 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | -| 98 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint | -| 99 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 100 | Summary: ::buffer; Argument[self]; ReturnValue; taint | -| 101 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 102 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 103 | Summary: ::read; Argument[self]; Argument[0]; taint | -| 104 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint | -| 105 | Summary: ::read_exact; Argument[self]; Argument[0]; taint | -| 106 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 107 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 108 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | -| 109 | Summary: ::lock; Argument[self]; ReturnValue; taint | -| 110 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 111 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 112 | Summary: ::as_path; Argument[self]; ReturnValue; value | -| 113 | Summary: ::buffer; Argument[self]; ReturnValue; taint | -| 114 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 115 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 116 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 117 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint | -| 118 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint | -| 119 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint | +| 1 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 2 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 3 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 4 | Source: ::send_request; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 5 | Source: ::file_name; ReturnValue; file | +| 6 | Source: ::path; ReturnValue; file | +| 7 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 8 | Source: ::open; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 9 | Source: ::connect; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 10 | Source: ::connect_timeout; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 11 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 12 | Source: ::open; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 13 | Source: ::file_name; ReturnValue; file | +| 14 | Source: ::path; ReturnValue; file | +| 15 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 16 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 17 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | +| 18 | Source: std::env::args; ReturnValue.Element; commandargs | +| 19 | Source: std::env::args_os; ReturnValue.Element; commandargs | +| 20 | Source: std::env::current_dir; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs | +| 21 | Source: std::env::current_exe; ReturnValue.Field[core::result::Result::Ok(0)]; commandargs | +| 22 | Source: std::env::home_dir; ReturnValue.Field[core::option::Option::Some(0)]; commandargs | +| 23 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | +| 24 | Source: std::env::var_os; ReturnValue.Field[core::option::Option::Some(0)]; environment | +| 25 | Source: std::fs::read; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 26 | Source: std::fs::read; ReturnValue; file | +| 27 | Source: std::fs::read_link; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 28 | Source: std::fs::read_to_string; ReturnValue.Field[core::result::Result::Ok(0)]; file | +| 29 | Source: std::fs::read_to_string; ReturnValue; file | +| 30 | Source: std::io::stdio::stdin; ReturnValue; stdin | +| 31 | Source: tokio::fs::read::read; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 32 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 33 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | +| 34 | Source: tokio::io::stdin::stdin; ReturnValue; stdin | +| 35 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 36 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | +| 37 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 38 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | +| 39 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 40 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 41 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | +| 42 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 43 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | +| 44 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 45 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | +| 46 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 47 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 48 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint | +| 49 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint | +| 50 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint | +| 51 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint | +| 52 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | +| 53 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint | +| 54 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint | +| 55 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint | +| 56 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint | +| 57 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 58 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 59 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | +| 60 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 61 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint | +| 62 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | +| 63 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | +| 64 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint | +| 65 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | +| 66 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint | +| 67 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint | +| 68 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 69 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 70 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 71 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 72 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 73 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 74 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 75 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 76 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 77 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 78 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 79 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value | +| 80 | Summary: ::new; Argument[0]; ReturnValue; value | +| 81 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 82 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 83 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 84 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 85 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 86 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 87 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 88 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 89 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 90 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 91 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 92 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 93 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 94 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 95 | Summary: ::read; Argument[self]; Argument[0]; taint | +| 96 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 97 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint | +| 98 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 99 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | +| 100 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint | +| 101 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 102 | Summary: ::buffer; Argument[self]; ReturnValue; taint | +| 103 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 104 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 105 | Summary: ::read; Argument[self]; Argument[0]; taint | +| 106 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint | +| 107 | Summary: ::read_exact; Argument[self]; Argument[0]; taint | +| 108 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 109 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 110 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | +| 111 | Summary: ::lock; Argument[self]; ReturnValue; taint | +| 112 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 113 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 114 | Summary: ::as_path; Argument[self]; ReturnValue; value | +| 115 | Summary: ::buffer; Argument[self]; ReturnValue; taint | +| 116 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 117 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 118 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 119 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint | +| 120 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint | +| 121 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint | edges -| test.rs:8:10:8:22 | ...::var | test.rs:8:10:8:30 | ...::var(...) | provenance | Src:MaD:21 | -| test.rs:9:10:9:25 | ...::var_os | test.rs:9:10:9:33 | ...::var_os(...) | provenance | Src:MaD:22 | +| test.rs:8:10:8:22 | ...::var | test.rs:8:10:8:30 | ...::var(...) | provenance | Src:MaD:23 | +| test.rs:9:10:9:25 | ...::var_os | test.rs:9:10:9:33 | ...::var_os(...) | provenance | Src:MaD:24 | | test.rs:11:9:11:12 | var1 | test.rs:14:10:14:13 | var1 | provenance | | -| test.rs:11:16:11:28 | ...::var | test.rs:11:16:11:36 | ...::var(...) [Ok] | provenance | Src:MaD:21 | -| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:79 | +| test.rs:11:16:11:28 | ...::var | test.rs:11:16:11:36 | ...::var(...) [Ok] | provenance | Src:MaD:23 | +| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:81 | | test.rs:11:16:11:59 | ... .expect(...) | test.rs:11:9:11:12 | var1 | provenance | | | test.rs:12:9:12:12 | var2 | test.rs:15:10:15:13 | var2 | provenance | | -| test.rs:12:16:12:31 | ...::var_os | test.rs:12:16:12:39 | ...::var_os(...) [Some] | provenance | Src:MaD:22 | -| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:75 | +| test.rs:12:16:12:31 | ...::var_os | test.rs:12:16:12:39 | ...::var_os(...) [Some] | provenance | Src:MaD:24 | +| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:77 | | test.rs:12:16:12:48 | ... .unwrap() | test.rs:12:9:12:12 | var2 | provenance | | | test.rs:29:9:29:12 | args [element] | test.rs:30:20:30:23 | args [element] | provenance | | | test.rs:29:9:29:12 | args [element] | test.rs:31:17:31:20 | args [element] | provenance | | -| test.rs:29:29:29:42 | ...::args | test.rs:29:29:29:44 | ...::args(...) [element] | provenance | Src:MaD:16 | -| test.rs:29:29:29:44 | ...::args(...) [element] | test.rs:29:29:29:54 | ... .collect() [element] | provenance | MaD:34 | +| test.rs:29:29:29:42 | ...::args | test.rs:29:29:29:44 | ...::args(...) [element] | provenance | Src:MaD:18 | +| test.rs:29:29:29:44 | ...::args(...) [element] | test.rs:29:29:29:54 | ... .collect() [element] | provenance | MaD:36 | | test.rs:29:29:29:54 | ... .collect() [element] | test.rs:29:9:29:12 | args [element] | provenance | | | test.rs:30:9:30:15 | my_path [&ref] | test.rs:36:10:36:16 | my_path | provenance | | | test.rs:30:19:30:26 | &... [&ref] | test.rs:30:9:30:15 | my_path [&ref] | provenance | | @@ -143,89 +145,89 @@ edges | test.rs:31:17:31:20 | args [element] | test.rs:31:17:31:23 | args[1] | provenance | | | test.rs:31:17:31:23 | args[1] | test.rs:31:16:31:23 | &... [&ref] | provenance | | | test.rs:32:9:32:12 | arg2 | test.rs:38:10:38:13 | arg2 | provenance | | -| test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:16 | -| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:35 | -| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:75 | +| test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:18 | +| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:37 | +| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:77 | | test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:9:32:12 | arg2 | provenance | | | test.rs:33:9:33:12 | arg3 | test.rs:39:10:39:13 | arg3 | provenance | | -| test.rs:33:16:33:32 | ...::args_os | test.rs:33:16:33:34 | ...::args_os(...) [element] | provenance | Src:MaD:17 | -| test.rs:33:16:33:34 | ...::args_os(...) [element] | test.rs:33:16:33:41 | ... .nth(...) [Some] | provenance | MaD:35 | -| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:75 | +| test.rs:33:16:33:32 | ...::args_os | test.rs:33:16:33:34 | ...::args_os(...) [element] | provenance | Src:MaD:19 | +| test.rs:33:16:33:34 | ...::args_os(...) [element] | test.rs:33:16:33:41 | ... .nth(...) [Some] | provenance | MaD:37 | +| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:77 | | test.rs:33:16:33:50 | ... .unwrap() | test.rs:33:9:33:12 | arg3 | provenance | | | test.rs:34:9:34:12 | arg4 | test.rs:40:10:40:13 | arg4 | provenance | | -| test.rs:34:16:34:29 | ...::args | test.rs:34:16:34:31 | ...::args(...) [element] | provenance | Src:MaD:16 | -| test.rs:34:16:34:31 | ...::args(...) [element] | test.rs:34:16:34:38 | ... .nth(...) [Some] | provenance | MaD:35 | -| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:75 | -| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:83 | -| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:80 | +| test.rs:34:16:34:29 | ...::args | test.rs:34:16:34:31 | ...::args(...) [element] | provenance | Src:MaD:18 | +| test.rs:34:16:34:31 | ...::args(...) [element] | test.rs:34:16:34:38 | ... .nth(...) [Some] | provenance | MaD:37 | +| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:77 | +| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:85 | +| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:82 | | test.rs:34:16:34:73 | ... .unwrap() | test.rs:34:9:34:12 | arg4 | provenance | | | test.rs:42:9:42:11 | arg | test.rs:43:14:43:16 | arg | provenance | | -| test.rs:42:16:42:29 | ...::args | test.rs:42:16:42:31 | ...::args(...) [element] | provenance | Src:MaD:16 | +| test.rs:42:16:42:29 | ...::args | test.rs:42:16:42:31 | ...::args(...) [element] | provenance | Src:MaD:18 | | test.rs:42:16:42:31 | ...::args(...) [element] | test.rs:42:9:42:11 | arg | provenance | | | test.rs:46:9:46:11 | arg | test.rs:47:14:47:16 | arg | provenance | | -| test.rs:46:16:46:32 | ...::args_os | test.rs:46:16:46:34 | ...::args_os(...) [element] | provenance | Src:MaD:17 | +| test.rs:46:16:46:32 | ...::args_os | test.rs:46:16:46:34 | ...::args_os(...) [element] | provenance | Src:MaD:19 | | test.rs:46:16:46:34 | ...::args_os(...) [element] | test.rs:46:9:46:11 | arg | provenance | | | test.rs:52:9:52:11 | dir | test.rs:56:10:56:12 | dir | provenance | | -| test.rs:52:15:52:35 | ...::current_dir | test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:18 | -| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:79 | +| test.rs:52:15:52:35 | ...::current_dir | test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:20 | +| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:81 | | test.rs:52:15:52:54 | ... .expect(...) | test.rs:52:9:52:11 | dir | provenance | | | test.rs:53:9:53:11 | exe | test.rs:57:10:57:12 | exe | provenance | | -| test.rs:53:15:53:35 | ...::current_exe | test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:19 | -| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:79 | +| test.rs:53:15:53:35 | ...::current_exe | test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:21 | +| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:81 | | test.rs:53:15:53:54 | ... .expect(...) | test.rs:53:9:53:11 | exe | provenance | | | test.rs:54:9:54:12 | home | test.rs:58:10:58:13 | home | provenance | | -| test.rs:54:16:54:33 | ...::home_dir | test.rs:54:16:54:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:20 | -| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:74 | +| test.rs:54:16:54:33 | ...::home_dir | test.rs:54:16:54:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:22 | +| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:76 | | test.rs:54:16:54:52 | ... .expect(...) | test.rs:54:9:54:12 | home | provenance | | | test.rs:62:9:62:22 | remote_string1 | test.rs:63:10:63:23 | remote_string1 | provenance | | -| test.rs:62:26:62:47 | ...::get | test.rs:62:26:62:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 | +| test.rs:62:26:62:47 | ...::get | test.rs:62:26:62:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 | | test.rs:62:26:62:62 | ...::get(...) [Ok] | test.rs:62:26:62:63 | TryExpr | provenance | | -| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:90 | +| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:92 | | test.rs:62:26:62:70 | ... .text() [Ok] | test.rs:62:26:62:71 | TryExpr | provenance | | | test.rs:62:26:62:71 | TryExpr | test.rs:62:9:62:22 | remote_string1 | provenance | | | test.rs:65:9:65:22 | remote_string2 | test.rs:66:10:66:23 | remote_string2 | provenance | | -| test.rs:65:26:65:47 | ...::get | test.rs:65:26:65:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 | -| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:80 | -| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:90 | -| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:80 | +| test.rs:65:26:65:47 | ...::get | test.rs:65:26:65:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 | +| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:82 | +| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:92 | +| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:82 | | test.rs:65:26:65:87 | ... .unwrap() | test.rs:65:9:65:22 | remote_string2 | provenance | | | test.rs:68:9:68:22 | remote_string3 | test.rs:69:10:69:23 | remote_string3 | provenance | | -| test.rs:68:26:68:47 | ...::get | test.rs:68:26:68:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 | -| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:80 | -| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:91 | -| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:80 | +| test.rs:68:26:68:47 | ...::get | test.rs:68:26:68:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 | +| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:82 | +| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:93 | +| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:82 | | test.rs:68:26:68:107 | ... .unwrap() | test.rs:68:9:68:22 | remote_string3 | provenance | | | test.rs:71:9:71:22 | remote_string4 | test.rs:72:10:72:23 | remote_string4 | provenance | | -| test.rs:71:26:71:47 | ...::get | test.rs:71:26:71:62 | ...::get(...) [Ok] | provenance | Src:MaD:14 | -| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:80 | -| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:89 | -| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:80 | +| test.rs:71:26:71:47 | ...::get | test.rs:71:26:71:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 | +| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:82 | +| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:91 | +| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:82 | | test.rs:71:26:71:88 | ... .unwrap() | test.rs:71:9:71:22 | remote_string4 | provenance | | | test.rs:74:9:74:22 | remote_string5 | test.rs:75:10:75:23 | remote_string5 | provenance | | -| test.rs:74:26:74:37 | ...::get | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:15 | +| test.rs:74:26:74:37 | ...::get | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:17 | | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | test.rs:74:26:74:58 | await ... [Ok] | provenance | | | test.rs:74:26:74:58 | await ... [Ok] | test.rs:74:26:74:59 | TryExpr | provenance | | -| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:88 | +| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:90 | | test.rs:74:26:74:66 | ... .text() [future, Ok] | test.rs:74:26:74:72 | await ... [Ok] | provenance | | | test.rs:74:26:74:72 | await ... [Ok] | test.rs:74:26:74:73 | TryExpr | provenance | | | test.rs:74:26:74:73 | TryExpr | test.rs:74:9:74:22 | remote_string5 | provenance | | | test.rs:77:9:77:22 | remote_string6 | test.rs:78:10:78:23 | remote_string6 | provenance | | -| test.rs:77:26:77:37 | ...::get | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:15 | +| test.rs:77:26:77:37 | ...::get | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:17 | | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | test.rs:77:26:77:58 | await ... [Ok] | provenance | | | test.rs:77:26:77:58 | await ... [Ok] | test.rs:77:26:77:59 | TryExpr | provenance | | -| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:86 | +| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:88 | | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | test.rs:77:26:77:73 | await ... [Ok] | provenance | | | test.rs:77:26:77:73 | await ... [Ok] | test.rs:77:26:77:74 | TryExpr | provenance | | | test.rs:77:26:77:74 | TryExpr | test.rs:77:9:77:22 | remote_string6 | provenance | | -| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:87 | -| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:87 | -| test.rs:80:24:80:35 | ...::get | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:15 | +| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:89 | +| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:89 | +| test.rs:80:24:80:35 | ...::get | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:17 | | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | test.rs:80:24:80:56 | await ... [Ok] | provenance | | | test.rs:80:24:80:56 | await ... [Ok] | test.rs:80:24:80:57 | TryExpr | provenance | | | test.rs:80:24:80:57 | TryExpr | test.rs:80:9:80:20 | mut request1 | provenance | | | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | test.rs:81:10:81:31 | await ... [Ok, Some] | provenance | | | test.rs:81:10:81:31 | await ... [Ok, Some] | test.rs:81:10:81:32 | TryExpr [Some] | provenance | | -| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:75 | +| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:77 | | test.rs:82:15:82:25 | Some(...) [Some] | test.rs:82:20:82:24 | chunk | provenance | | | test.rs:82:20:82:24 | chunk | test.rs:83:14:83:18 | chunk | provenance | | | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | test.rs:82:29:82:50 | await ... [Ok, Some] | provenance | | @@ -236,129 +238,129 @@ edges | test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | test.rs:114:24:114:57 | await ... [Ok] | provenance | | | test.rs:114:24:114:57 | await ... [Ok] | test.rs:114:24:114:58 | TryExpr | provenance | | | test.rs:114:24:114:58 | TryExpr | test.rs:114:13:114:20 | response | provenance | | -| test.rs:114:31:114:42 | send_request | test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | +| test.rs:114:31:114:42 | send_request | test.rs:114:24:114:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:4 | | test.rs:115:15:115:22 | response | test.rs:115:14:115:22 | &response | provenance | | | test.rs:121:9:121:20 | mut response | test.rs:122:11:122:18 | response | provenance | | | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | test.rs:121:24:121:57 | await ... [Ok] | provenance | | | test.rs:121:24:121:57 | await ... [Ok] | test.rs:121:24:121:58 | TryExpr | provenance | | | test.rs:121:24:121:58 | TryExpr | test.rs:121:9:121:20 | mut response | provenance | | -| test.rs:121:31:121:42 | send_request | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:2 | +| test.rs:121:31:121:42 | send_request | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:4 | | test.rs:122:11:122:18 | response | test.rs:122:10:122:18 | &response | provenance | | -| test.rs:211:22:211:35 | ...::stdin | test.rs:211:22:211:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:103 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:53 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:102 | +| test.rs:211:22:211:35 | ...::stdin | test.rs:211:22:211:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:105 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:55 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:104 | | test.rs:211:44:211:54 | [post] &mut buffer | test.rs:212:15:212:20 | buffer | provenance | | | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | test.rs:211:49:211:54 | [post] buffer | provenance | | | test.rs:211:49:211:54 | [post] buffer | test.rs:212:15:212:20 | buffer | provenance | | | test.rs:212:15:212:20 | buffer | test.rs:212:14:212:20 | &buffer | provenance | | -| test.rs:217:22:217:35 | ...::stdin | test.rs:217:22:217:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:55 | -| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:106 | +| test.rs:217:22:217:35 | ...::stdin | test.rs:217:22:217:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:57 | +| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:108 | | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | test.rs:217:56:217:61 | [post] buffer | provenance | | | test.rs:217:56:217:61 | [post] buffer | test.rs:218:15:218:20 | buffer | provenance | | | test.rs:218:15:218:20 | buffer | test.rs:218:14:218:20 | &buffer | provenance | | -| test.rs:223:22:223:35 | ...::stdin | test.rs:223:22:223:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:108 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:56 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:107 | +| test.rs:223:22:223:35 | ...::stdin | test.rs:223:22:223:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:110 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:58 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:109 | | test.rs:223:54:223:64 | [post] &mut buffer | test.rs:224:15:224:20 | buffer | provenance | | | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | test.rs:223:59:223:64 | [post] buffer | provenance | | | test.rs:223:59:223:64 | [post] buffer | test.rs:224:15:224:20 | buffer | provenance | | | test.rs:224:15:224:20 | buffer | test.rs:224:14:224:20 | &buffer | provenance | | -| test.rs:229:22:229:35 | ...::stdin | test.rs:229:22:229:37 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:109 | -| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:56 | -| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:110 | +| test.rs:229:22:229:35 | ...::stdin | test.rs:229:22:229:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:111 | +| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:58 | +| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:112 | | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | test.rs:229:66:229:71 | [post] buffer | provenance | | | test.rs:229:66:229:71 | [post] buffer | test.rs:230:15:230:20 | buffer | provenance | | | test.rs:230:15:230:20 | buffer | test.rs:230:14:230:20 | &buffer | provenance | | -| test.rs:235:9:235:22 | ...::stdin | test.rs:235:9:235:24 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:105 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:54 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:104 | +| test.rs:235:9:235:22 | ...::stdin | test.rs:235:9:235:24 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:107 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:56 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:106 | | test.rs:235:37:235:47 | [post] &mut buffer | test.rs:236:15:236:20 | buffer | provenance | | | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | test.rs:235:42:235:47 | [post] buffer | provenance | | | test.rs:235:42:235:47 | [post] buffer | test.rs:236:15:236:20 | buffer | provenance | | | test.rs:236:15:236:20 | buffer | test.rs:236:14:236:20 | &buffer | provenance | | -| test.rs:239:17:239:30 | ...::stdin | test.rs:239:17:239:32 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:239:17:239:32 | ...::stdin(...) | test.rs:239:17:239:40 | ... .bytes() | provenance | MaD:50 | +| test.rs:239:17:239:30 | ...::stdin | test.rs:239:17:239:32 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:239:17:239:32 | ...::stdin(...) | test.rs:239:17:239:40 | ... .bytes() | provenance | MaD:52 | | test.rs:239:17:239:40 | ... .bytes() | test.rs:240:14:240:17 | byte | provenance | | -| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:99 | +| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:101 | | test.rs:246:26:246:66 | ...::new(...) | test.rs:246:13:246:22 | mut reader | provenance | | -| test.rs:246:50:246:63 | ...::stdin | test.rs:246:50:246:65 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:101 | +| test.rs:246:50:246:63 | ...::stdin | test.rs:246:50:246:65 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:103 | | test.rs:247:13:247:16 | data | test.rs:248:15:248:18 | data | provenance | | | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | test.rs:247:20:247:37 | TryExpr | provenance | | | test.rs:247:20:247:37 | TryExpr | test.rs:247:13:247:16 | data | provenance | | | test.rs:248:15:248:18 | data | test.rs:248:14:248:18 | &data | provenance | | -| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:100 | +| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:102 | | test.rs:252:22:252:62 | ...::new(...) | test.rs:252:13:252:18 | reader | provenance | | -| test.rs:252:46:252:59 | ...::stdin | test.rs:252:46:252:61 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:101 | +| test.rs:252:46:252:59 | ...::stdin | test.rs:252:46:252:61 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:103 | | test.rs:253:13:253:16 | data | test.rs:254:15:254:18 | data | provenance | | | test.rs:253:20:253:34 | reader.buffer() | test.rs:253:13:253:16 | data | provenance | | | test.rs:254:15:254:18 | data | test.rs:254:14:254:18 | &data | provenance | | -| test.rs:259:13:259:22 | mut reader | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | provenance | MaD:47 | +| test.rs:259:13:259:22 | mut reader | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | provenance | MaD:49 | | test.rs:259:26:259:66 | ...::new(...) | test.rs:259:13:259:22 | mut reader | provenance | | -| test.rs:259:50:259:63 | ...::stdin | test.rs:259:50:259:65 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:101 | +| test.rs:259:50:259:63 | ...::stdin | test.rs:259:50:259:65 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:103 | | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | test.rs:260:31:260:36 | [post] buffer | provenance | | | test.rs:260:31:260:36 | [post] buffer | test.rs:261:15:261:20 | buffer | provenance | | | test.rs:261:15:261:20 | buffer | test.rs:261:14:261:20 | &buffer | provenance | | -| test.rs:266:13:266:22 | mut reader | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | provenance | MaD:48 | +| test.rs:266:13:266:22 | mut reader | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | provenance | MaD:50 | | test.rs:266:26:266:66 | ...::new(...) | test.rs:266:13:266:22 | mut reader | provenance | | -| test.rs:266:50:266:63 | ...::stdin | test.rs:266:50:266:65 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:101 | +| test.rs:266:50:266:63 | ...::stdin | test.rs:266:50:266:65 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:103 | | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | test.rs:267:38:267:43 | [post] buffer | provenance | | | test.rs:267:38:267:43 | [post] buffer | test.rs:268:15:268:20 | buffer | provenance | | | test.rs:267:38:267:43 | [post] buffer | test.rs:269:14:269:22 | buffer[0] | provenance | | | test.rs:268:15:268:20 | buffer | test.rs:268:14:268:20 | &buffer | provenance | | -| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:98 | -| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:98 | -| test.rs:273:32:273:72 | ...::new(...) | test.rs:273:32:273:84 | ... .split(...) | provenance | MaD:49 | +| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:100 | +| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:100 | +| test.rs:273:32:273:72 | ...::new(...) | test.rs:273:32:273:84 | ... .split(...) | provenance | MaD:51 | | test.rs:273:32:273:84 | ... .split(...) | test.rs:273:13:273:28 | mut reader_split | provenance | | -| test.rs:273:56:273:69 | ...::stdin | test.rs:273:56:273:71 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:101 | -| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:75 | -| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:80 | +| test.rs:273:56:273:69 | ...::stdin | test.rs:273:56:273:71 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:103 | +| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:77 | +| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:82 | | test.rs:275:19:275:29 | Some(...) [Some, Ok] | test.rs:275:24:275:28 | chunk [Ok] | provenance | | -| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:80 | +| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:82 | | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | test.rs:275:19:275:29 | Some(...) [Some, Ok] | provenance | | -| test.rs:281:13:281:18 | reader | test.rs:282:21:282:34 | reader.lines() | provenance | MaD:46 | +| test.rs:281:13:281:18 | reader | test.rs:282:21:282:34 | reader.lines() | provenance | MaD:48 | | test.rs:281:22:281:62 | ...::new(...) | test.rs:281:13:281:18 | reader | provenance | | -| test.rs:281:46:281:59 | ...::stdin | test.rs:281:46:281:61 | ...::stdin(...) | provenance | Src:MaD:28 MaD:28 | -| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:101 | +| test.rs:281:46:281:59 | ...::stdin | test.rs:281:46:281:61 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | +| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:103 | | test.rs:282:21:282:34 | reader.lines() | test.rs:283:18:283:21 | line | provenance | | -| test.rs:309:13:309:21 | mut stdin | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | provenance | MaD:63 | -| test.rs:309:25:309:40 | ...::stdin | test.rs:309:25:309:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:309:13:309:21 | mut stdin | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | provenance | MaD:65 | +| test.rs:309:25:309:40 | ...::stdin | test.rs:309:25:309:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:309:25:309:42 | ...::stdin(...) | test.rs:309:13:309:21 | mut stdin | provenance | | | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | test.rs:311:38:311:43 | [post] buffer | provenance | | | test.rs:311:38:311:43 | [post] buffer | test.rs:312:15:312:20 | buffer | provenance | | | test.rs:312:15:312:20 | buffer | test.rs:312:14:312:20 | &buffer | provenance | | -| test.rs:316:13:316:21 | mut stdin | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | provenance | MaD:69 | -| test.rs:316:25:316:40 | ...::stdin | test.rs:316:25:316:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:316:13:316:21 | mut stdin | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | provenance | MaD:71 | +| test.rs:316:25:316:40 | ...::stdin | test.rs:316:25:316:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:316:25:316:42 | ...::stdin(...) | test.rs:316:13:316:21 | mut stdin | provenance | | | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | test.rs:318:45:318:50 | [post] buffer | provenance | | | test.rs:318:45:318:50 | [post] buffer | test.rs:319:15:319:20 | buffer | provenance | | | test.rs:319:15:319:20 | buffer | test.rs:319:14:319:20 | &buffer | provenance | | -| test.rs:323:13:323:21 | mut stdin | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | provenance | MaD:70 | -| test.rs:323:25:323:40 | ...::stdin | test.rs:323:25:323:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:323:13:323:21 | mut stdin | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | provenance | MaD:72 | +| test.rs:323:25:323:40 | ...::stdin | test.rs:323:25:323:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:323:25:323:42 | ...::stdin(...) | test.rs:323:13:323:21 | mut stdin | provenance | | | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | test.rs:325:48:325:53 | [post] buffer | provenance | | | test.rs:325:48:325:53 | [post] buffer | test.rs:326:15:326:20 | buffer | provenance | | | test.rs:326:15:326:20 | buffer | test.rs:326:14:326:20 | &buffer | provenance | | -| test.rs:330:13:330:21 | mut stdin | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | provenance | MaD:65 | -| test.rs:330:25:330:40 | ...::stdin | test.rs:330:25:330:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:330:13:330:21 | mut stdin | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | provenance | MaD:67 | +| test.rs:330:25:330:40 | ...::stdin | test.rs:330:25:330:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:330:25:330:42 | ...::stdin(...) | test.rs:330:13:330:21 | mut stdin | provenance | | | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | test.rs:332:31:332:36 | [post] buffer | provenance | | | test.rs:332:31:332:36 | [post] buffer | test.rs:333:15:333:20 | buffer | provenance | | | test.rs:333:15:333:20 | buffer | test.rs:333:14:333:20 | &buffer | provenance | | -| test.rs:337:13:337:21 | mut stdin | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | provenance | MaD:71 | -| test.rs:337:13:337:21 | mut stdin | test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | provenance | MaD:67 | -| test.rs:337:13:337:21 | mut stdin | test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | provenance | MaD:66 | -| test.rs:337:13:337:21 | mut stdin | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:68 | -| test.rs:337:25:337:40 | ...::stdin | test.rs:337:25:337:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:337:13:337:21 | mut stdin | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | provenance | MaD:73 | +| test.rs:337:13:337:21 | mut stdin | test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | provenance | MaD:69 | +| test.rs:337:13:337:21 | mut stdin | test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | provenance | MaD:68 | +| test.rs:337:13:337:21 | mut stdin | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:70 | +| test.rs:337:25:337:40 | ...::stdin | test.rs:337:25:337:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:337:25:337:42 | ...::stdin(...) | test.rs:337:13:337:21 | mut stdin | provenance | | | test.rs:338:13:338:14 | v1 | test.rs:342:14:342:15 | v1 | provenance | | | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | test.rs:338:18:338:38 | await ... [Ok] | provenance | | @@ -376,150 +378,150 @@ edges | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | test.rs:341:18:341:42 | await ... [Ok] | provenance | | | test.rs:341:18:341:42 | await ... [Ok] | test.rs:341:18:341:43 | TryExpr | provenance | | | test.rs:341:18:341:43 | TryExpr | test.rs:341:13:341:14 | v4 | provenance | | -| test.rs:349:13:349:21 | mut stdin | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | provenance | MaD:64 | -| test.rs:349:25:349:40 | ...::stdin | test.rs:349:25:349:42 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | +| test.rs:349:13:349:21 | mut stdin | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | provenance | MaD:66 | +| test.rs:349:25:349:40 | ...::stdin | test.rs:349:25:349:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:349:25:349:42 | ...::stdin(...) | test.rs:349:13:349:21 | mut stdin | provenance | | | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | test.rs:351:29:351:34 | [post] buffer | provenance | | | test.rs:351:29:351:34 | [post] buffer | test.rs:352:15:352:20 | buffer | provenance | | | test.rs:352:15:352:20 | buffer | test.rs:352:14:352:20 | &buffer | provenance | | -| test.rs:358:13:358:22 | mut reader | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | provenance | MaD:58 | +| test.rs:358:13:358:22 | mut reader | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | provenance | MaD:60 | | test.rs:358:26:358:70 | ...::new(...) | test.rs:358:13:358:22 | mut reader | provenance | | -| test.rs:358:52:358:67 | ...::stdin | test.rs:358:52:358:69 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | -| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:114 | +| test.rs:358:52:358:67 | ...::stdin | test.rs:358:52:358:69 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | +| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:116 | | test.rs:359:13:359:16 | data | test.rs:360:15:360:18 | data | provenance | | | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | test.rs:359:20:359:42 | await ... [Ok] | provenance | | | test.rs:359:20:359:42 | await ... [Ok] | test.rs:359:20:359:43 | TryExpr | provenance | | | test.rs:359:20:359:43 | TryExpr | test.rs:359:13:359:16 | data | provenance | | | test.rs:360:15:360:18 | data | test.rs:360:14:360:18 | &data | provenance | | -| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:113 | +| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:115 | | test.rs:364:22:364:66 | ...::new(...) | test.rs:364:13:364:18 | reader | provenance | | -| test.rs:364:48:364:63 | ...::stdin | test.rs:364:48:364:65 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | -| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:114 | +| test.rs:364:48:364:63 | ...::stdin | test.rs:364:48:364:65 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | +| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:116 | | test.rs:365:13:365:16 | data | test.rs:366:15:366:18 | data | provenance | | | test.rs:365:20:365:34 | reader.buffer() | test.rs:365:13:365:16 | data | provenance | | | test.rs:366:15:366:18 | data | test.rs:366:14:366:18 | &data | provenance | | -| test.rs:371:13:371:22 | mut reader | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | provenance | MaD:60 | +| test.rs:371:13:371:22 | mut reader | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | provenance | MaD:62 | | test.rs:371:26:371:70 | ...::new(...) | test.rs:371:13:371:22 | mut reader | provenance | | -| test.rs:371:52:371:67 | ...::stdin | test.rs:371:52:371:69 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | -| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:114 | +| test.rs:371:52:371:67 | ...::stdin | test.rs:371:52:371:69 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | +| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:116 | | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | test.rs:372:31:372:36 | [post] buffer | provenance | | | test.rs:372:31:372:36 | [post] buffer | test.rs:373:15:373:20 | buffer | provenance | | | test.rs:373:15:373:20 | buffer | test.rs:373:14:373:20 | &buffer | provenance | | -| test.rs:378:13:378:22 | mut reader | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | provenance | MaD:61 | +| test.rs:378:13:378:22 | mut reader | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | provenance | MaD:63 | | test.rs:378:26:378:70 | ...::new(...) | test.rs:378:13:378:22 | mut reader | provenance | | -| test.rs:378:52:378:67 | ...::stdin | test.rs:378:52:378:69 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | -| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:114 | +| test.rs:378:52:378:67 | ...::stdin | test.rs:378:52:378:69 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | +| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:116 | | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | test.rs:379:38:379:43 | [post] buffer | provenance | | | test.rs:379:38:379:43 | [post] buffer | test.rs:380:15:380:20 | buffer | provenance | | | test.rs:379:38:379:43 | [post] buffer | test.rs:381:14:381:22 | buffer[0] | provenance | | | test.rs:380:15:380:20 | buffer | test.rs:380:14:380:20 | &buffer | provenance | | -| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:116 | -| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:116 | -| test.rs:385:32:385:76 | ...::new(...) | test.rs:385:32:385:88 | ... .split(...) | provenance | MaD:62 | +| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:118 | +| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:118 | +| test.rs:385:32:385:76 | ...::new(...) | test.rs:385:32:385:88 | ... .split(...) | provenance | MaD:64 | | test.rs:385:32:385:88 | ... .split(...) | test.rs:385:13:385:28 | mut reader_split | provenance | | -| test.rs:385:58:385:73 | ...::stdin | test.rs:385:58:385:75 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | -| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:114 | +| test.rs:385:58:385:73 | ...::stdin | test.rs:385:58:385:75 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | +| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:116 | | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:386:14:386:46 | await ... [Ok, Some] | provenance | | | test.rs:386:14:386:46 | await ... [Ok, Some] | test.rs:386:14:386:47 | TryExpr [Some] | provenance | | -| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:75 | +| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:77 | | test.rs:387:19:387:29 | Some(...) [Some] | test.rs:387:24:387:28 | chunk | provenance | | | test.rs:387:24:387:28 | chunk | test.rs:388:18:388:22 | chunk | provenance | | | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | test.rs:387:33:387:65 | await ... [Ok, Some] | provenance | | | test.rs:387:33:387:65 | await ... [Ok, Some] | test.rs:387:33:387:66 | TryExpr [Some] | provenance | | | test.rs:387:33:387:66 | TryExpr [Some] | test.rs:387:19:387:29 | Some(...) [Some] | provenance | | -| test.rs:393:13:393:18 | reader | test.rs:394:25:394:38 | reader.lines() | provenance | MaD:59 | +| test.rs:393:13:393:18 | reader | test.rs:394:25:394:38 | reader.lines() | provenance | MaD:61 | | test.rs:393:22:393:66 | ...::new(...) | test.rs:393:13:393:18 | reader | provenance | | -| test.rs:393:48:393:63 | ...::stdin | test.rs:393:48:393:65 | ...::stdin(...) | provenance | Src:MaD:32 MaD:32 | -| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:114 | -| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:115 | -| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:115 | +| test.rs:393:48:393:63 | ...::stdin | test.rs:393:48:393:65 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | +| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:116 | +| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:117 | +| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:117 | | test.rs:394:25:394:38 | reader.lines() | test.rs:394:13:394:21 | mut lines | provenance | | | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | test.rs:395:14:395:36 | await ... [Ok, Some] | provenance | | | test.rs:395:14:395:36 | await ... [Ok, Some] | test.rs:395:14:395:37 | TryExpr [Some] | provenance | | -| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:75 | +| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:77 | | test.rs:396:19:396:28 | Some(...) [Some] | test.rs:396:24:396:27 | line | provenance | | | test.rs:396:24:396:27 | line | test.rs:397:18:397:21 | line | provenance | | | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | test.rs:396:32:396:54 | await ... [Ok, Some] | provenance | | | test.rs:396:32:396:54 | await ... [Ok, Some] | test.rs:396:32:396:55 | TryExpr [Some] | provenance | | | test.rs:396:32:396:55 | TryExpr [Some] | test.rs:396:19:396:28 | Some(...) [Some] | provenance | | | test.rs:408:13:408:18 | buffer | test.rs:409:14:409:19 | buffer | provenance | | -| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:43 | ...::read [Ok] | provenance | Src:MaD:23 | -| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | Src:MaD:23 | -| test.rs:408:31:408:43 | ...::read [Ok] | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | MaD:24 | +| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:43 | ...::read [Ok] | provenance | Src:MaD:25 | +| test.rs:408:31:408:43 | ...::read | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | Src:MaD:25 | +| test.rs:408:31:408:43 | ...::read [Ok] | test.rs:408:31:408:55 | ...::read(...) [Ok] | provenance | MaD:26 | | test.rs:408:31:408:55 | ...::read(...) [Ok] | test.rs:408:31:408:56 | TryExpr | provenance | | | test.rs:408:31:408:56 | TryExpr | test.rs:408:13:408:18 | buffer | provenance | | | test.rs:413:13:413:18 | buffer | test.rs:414:14:414:19 | buffer | provenance | | -| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:38 | ...::read [Ok] | provenance | Src:MaD:23 | -| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | Src:MaD:23 | -| test.rs:413:31:413:38 | ...::read [Ok] | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | MaD:24 | +| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:38 | ...::read [Ok] | provenance | Src:MaD:25 | +| test.rs:413:31:413:38 | ...::read | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | Src:MaD:25 | +| test.rs:413:31:413:38 | ...::read [Ok] | test.rs:413:31:413:50 | ...::read(...) [Ok] | provenance | MaD:26 | | test.rs:413:31:413:50 | ...::read(...) [Ok] | test.rs:413:31:413:51 | TryExpr | provenance | | | test.rs:413:31:413:51 | TryExpr | test.rs:413:13:413:18 | buffer | provenance | | | test.rs:418:13:418:18 | buffer | test.rs:419:14:419:19 | buffer | provenance | | -| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:39 | ...::read_to_string [Ok] | provenance | Src:MaD:26 | -| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:26 | -| test.rs:418:22:418:39 | ...::read_to_string [Ok] | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | MaD:27 | +| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:39 | ...::read_to_string [Ok] | provenance | Src:MaD:28 | +| test.rs:418:22:418:39 | ...::read_to_string | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | Src:MaD:28 | +| test.rs:418:22:418:39 | ...::read_to_string [Ok] | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | provenance | MaD:29 | | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | test.rs:418:22:418:52 | TryExpr | provenance | | | test.rs:418:22:418:52 | TryExpr | test.rs:418:13:418:18 | buffer | provenance | | | test.rs:425:13:425:16 | path | test.rs:426:14:426:17 | path | provenance | | -| test.rs:425:13:425:16 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:33 | +| test.rs:425:13:425:16 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:35 | | test.rs:425:13:425:16 | path | test.rs:427:14:427:17 | path | provenance | | -| test.rs:425:13:425:16 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:33 | +| test.rs:425:13:425:16 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:35 | | test.rs:425:13:425:16 | path | test.rs:437:14:437:17 | path | provenance | | | test.rs:425:20:425:27 | e.path() | test.rs:425:13:425:16 | path | provenance | | -| test.rs:425:22:425:25 | path | test.rs:425:20:425:27 | e.path() | provenance | Src:MaD:4 MaD:4 | -| test.rs:426:14:426:17 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:33 | -| test.rs:427:14:427:17 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:33 | -| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:112 | +| test.rs:425:22:425:25 | path | test.rs:425:20:425:27 | e.path() | provenance | Src:MaD:6 MaD:6 | +| test.rs:426:14:426:17 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:35 | +| test.rs:427:14:427:17 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:35 | +| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:114 | | test.rs:439:13:439:21 | file_name | test.rs:440:14:440:22 | file_name | provenance | | -| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:33 | +| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:35 | | test.rs:439:13:439:21 | file_name | test.rs:445:14:445:22 | file_name | provenance | | | test.rs:439:25:439:37 | e.file_name() | test.rs:439:13:439:21 | file_name | provenance | | -| test.rs:439:27:439:35 | file_name | test.rs:439:25:439:37 | e.file_name() | provenance | Src:MaD:3 MaD:3 | -| test.rs:440:14:440:22 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:33 | +| test.rs:439:27:439:35 | file_name | test.rs:439:25:439:37 | e.file_name() | provenance | Src:MaD:5 MaD:5 | +| test.rs:440:14:440:22 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:35 | | test.rs:461:13:461:18 | target | test.rs:462:14:462:19 | target | provenance | | -| test.rs:461:22:461:34 | ...::read_link | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:25 | +| test.rs:461:22:461:34 | ...::read_link | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:27 | | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | test.rs:461:22:461:50 | TryExpr | provenance | | | test.rs:461:22:461:50 | TryExpr | test.rs:461:13:461:18 | target | provenance | | | test.rs:470:13:470:18 | buffer | test.rs:471:14:471:19 | buffer | provenance | | -| test.rs:470:31:470:45 | ...::read | test.rs:470:31:470:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:29 | +| test.rs:470:31:470:45 | ...::read | test.rs:470:31:470:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:31 | | test.rs:470:31:470:57 | ...::read(...) [future, Ok] | test.rs:470:31:470:63 | await ... [Ok] | provenance | | | test.rs:470:31:470:63 | await ... [Ok] | test.rs:470:31:470:64 | TryExpr | provenance | | | test.rs:470:31:470:64 | TryExpr | test.rs:470:13:470:18 | buffer | provenance | | | test.rs:475:13:475:18 | buffer | test.rs:476:14:476:19 | buffer | provenance | | -| test.rs:475:31:475:45 | ...::read | test.rs:475:31:475:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:29 | +| test.rs:475:31:475:45 | ...::read | test.rs:475:31:475:57 | ...::read(...) [future, Ok] | provenance | Src:MaD:31 | | test.rs:475:31:475:57 | ...::read(...) [future, Ok] | test.rs:475:31:475:63 | await ... [Ok] | provenance | | | test.rs:475:31:475:63 | await ... [Ok] | test.rs:475:31:475:64 | TryExpr | provenance | | | test.rs:475:31:475:64 | TryExpr | test.rs:475:13:475:18 | buffer | provenance | | | test.rs:480:13:480:18 | buffer | test.rs:481:14:481:19 | buffer | provenance | | -| test.rs:480:22:480:46 | ...::read_to_string | test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:31 | +| test.rs:480:22:480:46 | ...::read_to_string | test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | provenance | Src:MaD:33 | | test.rs:480:22:480:58 | ...::read_to_string(...) [future, Ok] | test.rs:480:22:480:64 | await ... [Ok] | provenance | | | test.rs:480:22:480:64 | await ... [Ok] | test.rs:480:22:480:65 | TryExpr | provenance | | | test.rs:480:22:480:65 | TryExpr | test.rs:480:13:480:18 | buffer | provenance | | | test.rs:486:13:486:16 | path | test.rs:488:14:488:17 | path | provenance | | | test.rs:486:20:486:31 | entry.path() | test.rs:486:13:486:16 | path | provenance | | -| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:12 MaD:12 | -| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:12 MaD:12 | +| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:14 MaD:14 | +| test.rs:486:26:486:29 | path | test.rs:486:20:486:31 | entry.path() | provenance | Src:MaD:14 MaD:14 | | test.rs:487:13:487:21 | file_name | test.rs:489:14:489:22 | file_name | provenance | | | test.rs:487:25:487:41 | entry.file_name() | test.rs:487:13:487:21 | file_name | provenance | | -| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:11 MaD:11 | -| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:11 MaD:11 | +| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:13 MaD:13 | +| test.rs:487:31:487:39 | file_name | test.rs:487:25:487:41 | entry.file_name() | provenance | Src:MaD:13 MaD:13 | | test.rs:493:13:493:18 | target | test.rs:494:14:494:19 | target | provenance | | -| test.rs:493:22:493:41 | ...::read_link | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:30 | +| test.rs:493:22:493:41 | ...::read_link | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | provenance | Src:MaD:32 | | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | test.rs:493:22:493:62 | await ... [Ok] | provenance | | | test.rs:493:22:493:62 | await ... [Ok] | test.rs:493:22:493:63 | TryExpr | provenance | | | test.rs:493:22:493:63 | TryExpr | test.rs:493:13:493:18 | target | provenance | | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:93 | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:53 | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:92 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:95 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:55 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:94 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:97 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:56 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:96 | -| test.rs:503:9:503:16 | mut file | test.rs:525:25:525:35 | [post] &mut buffer [&ref] | provenance | MaD:54 | -| test.rs:503:9:503:16 | mut file | test.rs:529:17:529:28 | file.bytes() | provenance | MaD:50 | -| test.rs:503:20:503:38 | ...::open | test.rs:503:20:503:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:95 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:55 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:94 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:97 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:57 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:96 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:99 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:58 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:98 | +| test.rs:503:9:503:16 | mut file | test.rs:525:25:525:35 | [post] &mut buffer [&ref] | provenance | MaD:56 | +| test.rs:503:9:503:16 | mut file | test.rs:529:17:529:28 | file.bytes() | provenance | MaD:52 | +| test.rs:503:20:503:38 | ...::open | test.rs:503:20:503:50 | ...::open(...) [Ok] | provenance | Src:MaD:7 | | test.rs:503:20:503:50 | ...::open(...) [Ok] | test.rs:503:20:503:51 | TryExpr | provenance | | | test.rs:503:20:503:51 | TryExpr | test.rs:503:9:503:16 | mut file | provenance | | | test.rs:507:32:507:42 | [post] &mut buffer | test.rs:508:15:508:20 | buffer | provenance | | @@ -538,69 +540,69 @@ edges | test.rs:525:30:525:35 | [post] buffer | test.rs:526:15:526:20 | buffer | provenance | | | test.rs:526:15:526:20 | buffer | test.rs:526:14:526:20 | &buffer | provenance | | | test.rs:529:17:529:28 | file.bytes() | test.rs:530:14:530:17 | byte | provenance | | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:93 | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:53 | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:92 | -| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:80 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:95 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:55 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:94 | +| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:82 | | test.rs:536:22:536:72 | ... .unwrap() | test.rs:536:13:536:18 | mut f1 | provenance | | -| test.rs:536:50:536:53 | open | test.rs:536:22:536:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 | +| test.rs:536:50:536:53 | open | test.rs:536:22:536:63 | ... .open(...) [Ok] | provenance | Src:MaD:8 | | test.rs:538:30:538:40 | [post] &mut buffer | test.rs:539:15:539:20 | buffer | provenance | | | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | test.rs:538:35:538:40 | [post] buffer | provenance | | | test.rs:538:35:538:40 | [post] buffer | test.rs:539:15:539:20 | buffer | provenance | | | test.rs:539:15:539:20 | buffer | test.rs:539:14:539:20 | &buffer | provenance | | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:93 | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:53 | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:92 | -| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:80 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:95 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:55 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:94 | +| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:82 | | test.rs:543:22:543:89 | ... .unwrap() | test.rs:543:13:543:18 | mut f2 | provenance | | -| test.rs:543:67:543:70 | open | test.rs:543:22:543:80 | ... .open(...) [Ok] | provenance | Src:MaD:6 | +| test.rs:543:67:543:70 | open | test.rs:543:22:543:80 | ... .open(...) [Ok] | provenance | Src:MaD:8 | | test.rs:545:30:545:40 | [post] &mut buffer | test.rs:546:15:546:20 | buffer | provenance | | | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | test.rs:545:35:545:40 | [post] buffer | provenance | | | test.rs:545:35:545:40 | [post] buffer | test.rs:546:15:546:20 | buffer | provenance | | | test.rs:546:15:546:20 | buffer | test.rs:546:14:546:20 | &buffer | provenance | | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:93 | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:53 | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:92 | -| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:80 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:95 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:55 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:94 | +| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:82 | | test.rs:550:22:550:123 | ... .unwrap() | test.rs:550:13:550:18 | mut f3 | provenance | | -| test.rs:550:101:550:104 | open | test.rs:550:22:550:114 | ... .open(...) [Ok] | provenance | Src:MaD:6 | +| test.rs:550:101:550:104 | open | test.rs:550:22:550:114 | ... .open(...) [Ok] | provenance | Src:MaD:8 | | test.rs:552:30:552:40 | [post] &mut buffer | test.rs:553:15:553:20 | buffer | provenance | | | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | test.rs:552:35:552:40 | [post] buffer | provenance | | | test.rs:552:35:552:40 | [post] buffer | test.rs:553:15:553:20 | buffer | provenance | | | test.rs:553:15:553:20 | buffer | test.rs:553:14:553:20 | &buffer | provenance | | -| test.rs:560:13:560:17 | file1 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:52 | -| test.rs:560:21:560:39 | ...::open | test.rs:560:21:560:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:560:13:560:17 | file1 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:54 | +| test.rs:560:21:560:39 | ...::open | test.rs:560:21:560:51 | ...::open(...) [Ok] | provenance | Src:MaD:7 | | test.rs:560:21:560:51 | ...::open(...) [Ok] | test.rs:560:21:560:52 | TryExpr | provenance | | | test.rs:560:21:560:52 | TryExpr | test.rs:560:13:560:17 | file1 | provenance | | | test.rs:561:13:561:17 | file2 | test.rs:562:38:562:42 | file2 | provenance | | -| test.rs:561:21:561:39 | ...::open | test.rs:561:21:561:59 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:561:21:561:39 | ...::open | test.rs:561:21:561:59 | ...::open(...) [Ok] | provenance | Src:MaD:7 | | test.rs:561:21:561:59 | ...::open(...) [Ok] | test.rs:561:21:561:60 | TryExpr | provenance | | | test.rs:561:21:561:60 | TryExpr | test.rs:561:13:561:17 | file2 | provenance | | -| test.rs:562:13:562:22 | mut reader | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | provenance | MaD:56 | +| test.rs:562:13:562:22 | mut reader | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | provenance | MaD:58 | | test.rs:562:26:562:43 | file1.chain(...) | test.rs:562:13:562:22 | mut reader | provenance | | -| test.rs:562:38:562:42 | file2 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:51 | +| test.rs:562:38:562:42 | file2 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:53 | | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | test.rs:563:36:563:41 | [post] buffer | provenance | | | test.rs:563:36:563:41 | [post] buffer | test.rs:564:15:564:20 | buffer | provenance | | | test.rs:564:15:564:20 | buffer | test.rs:564:14:564:20 | &buffer | provenance | | -| test.rs:569:13:569:17 | file1 | test.rs:570:26:570:40 | file1.take(...) | provenance | MaD:57 | -| test.rs:569:21:569:39 | ...::open | test.rs:569:21:569:51 | ...::open(...) [Ok] | provenance | Src:MaD:5 | +| test.rs:569:13:569:17 | file1 | test.rs:570:26:570:40 | file1.take(...) | provenance | MaD:59 | +| test.rs:569:21:569:39 | ...::open | test.rs:569:21:569:51 | ...::open(...) [Ok] | provenance | Src:MaD:7 | | test.rs:569:21:569:51 | ...::open(...) [Ok] | test.rs:569:21:569:52 | TryExpr | provenance | | | test.rs:569:21:569:52 | TryExpr | test.rs:569:13:569:17 | file1 | provenance | | -| test.rs:570:13:570:22 | mut reader | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | provenance | MaD:56 | +| test.rs:570:13:570:22 | mut reader | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | provenance | MaD:58 | | test.rs:570:26:570:40 | file1.take(...) | test.rs:570:13:570:22 | mut reader | provenance | | | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | test.rs:571:36:571:41 | [post] buffer | provenance | | | test.rs:571:36:571:41 | [post] buffer | test.rs:572:15:572:20 | buffer | provenance | | | test.rs:572:15:572:20 | buffer | test.rs:572:14:572:20 | &buffer | provenance | | -| test.rs:581:9:581:16 | mut file | test.rs:585:32:585:42 | [post] &mut buffer [&ref] | provenance | MaD:63 | -| test.rs:581:9:581:16 | mut file | test.rs:591:39:591:49 | [post] &mut buffer [&ref] | provenance | MaD:69 | -| test.rs:581:9:581:16 | mut file | test.rs:597:42:597:52 | [post] &mut buffer [&ref] | provenance | MaD:70 | -| test.rs:581:9:581:16 | mut file | test.rs:603:25:603:35 | [post] &mut buffer [&ref] | provenance | MaD:65 | -| test.rs:581:9:581:16 | mut file | test.rs:608:18:608:31 | file.read_u8() [future, Ok] | provenance | MaD:71 | -| test.rs:581:9:581:16 | mut file | test.rs:609:18:609:32 | file.read_i16() [future, Ok] | provenance | MaD:67 | -| test.rs:581:9:581:16 | mut file | test.rs:610:18:610:32 | file.read_f32() [future, Ok] | provenance | MaD:66 | -| test.rs:581:9:581:16 | mut file | test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | provenance | MaD:68 | -| test.rs:581:9:581:16 | mut file | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | provenance | MaD:64 | -| test.rs:581:20:581:40 | ...::open | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:9 | +| test.rs:581:9:581:16 | mut file | test.rs:585:32:585:42 | [post] &mut buffer [&ref] | provenance | MaD:65 | +| test.rs:581:9:581:16 | mut file | test.rs:591:39:591:49 | [post] &mut buffer [&ref] | provenance | MaD:71 | +| test.rs:581:9:581:16 | mut file | test.rs:597:42:597:52 | [post] &mut buffer [&ref] | provenance | MaD:72 | +| test.rs:581:9:581:16 | mut file | test.rs:603:25:603:35 | [post] &mut buffer [&ref] | provenance | MaD:67 | +| test.rs:581:9:581:16 | mut file | test.rs:608:18:608:31 | file.read_u8() [future, Ok] | provenance | MaD:73 | +| test.rs:581:9:581:16 | mut file | test.rs:609:18:609:32 | file.read_i16() [future, Ok] | provenance | MaD:69 | +| test.rs:581:9:581:16 | mut file | test.rs:610:18:610:32 | file.read_f32() [future, Ok] | provenance | MaD:68 | +| test.rs:581:9:581:16 | mut file | test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | provenance | MaD:70 | +| test.rs:581:9:581:16 | mut file | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | provenance | MaD:66 | +| test.rs:581:20:581:40 | ...::open | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:11 | | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | test.rs:581:20:581:58 | await ... [Ok] | provenance | | | test.rs:581:20:581:58 | await ... [Ok] | test.rs:581:20:581:59 | TryExpr | provenance | | | test.rs:581:20:581:59 | TryExpr | test.rs:581:9:581:16 | mut file | provenance | | @@ -635,17 +637,39 @@ edges | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | test.rs:620:28:620:33 | [post] buffer | provenance | | | test.rs:620:28:620:33 | [post] buffer | test.rs:621:15:621:20 | buffer | provenance | | | test.rs:621:15:621:20 | buffer | test.rs:621:14:621:20 | &buffer | provenance | | -| test.rs:627:13:627:18 | mut f1 | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | provenance | MaD:63 | +| test.rs:627:13:627:18 | mut f1 | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | provenance | MaD:65 | | test.rs:627:22:627:65 | ... .open(...) [future, Ok] | test.rs:627:22:627:71 | await ... [Ok] | provenance | | | test.rs:627:22:627:71 | await ... [Ok] | test.rs:627:22:627:72 | TryExpr | provenance | | | test.rs:627:22:627:72 | TryExpr | test.rs:627:13:627:18 | mut f1 | provenance | | -| test.rs:627:52:627:55 | open | test.rs:627:22:627:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:10 | +| test.rs:627:52:627:55 | open | test.rs:627:22:627:65 | ... .open(...) [future, Ok] | provenance | Src:MaD:12 | | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | test.rs:629:35:629:40 | [post] buffer | provenance | | | test.rs:629:35:629:40 | [post] buffer | test.rs:630:15:630:20 | buffer | provenance | | | test.rs:630:15:630:20 | buffer | test.rs:630:14:630:20 | &buffer | provenance | | -| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:53 | -| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:111 | -| test.rs:688:26:688:53 | ...::connect | test.rs:688:26:688:62 | ...::connect(...) [Ok] | provenance | Src:MaD:7 | +| test.rs:660:9:660:16 | mut file | test.rs:664:22:664:25 | file | provenance | | +| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:45 | +| test.rs:660:20:660:44 | ...::open | test.rs:660:20:660:56 | ...::open(...) [future, Ok] | provenance | Src:MaD:1 | +| test.rs:660:20:660:56 | ...::open(...) [future, Ok] | test.rs:660:20:660:62 | await ... [Ok] | provenance | | +| test.rs:660:20:660:62 | await ... [Ok] | test.rs:660:20:660:63 | TryExpr | provenance | | +| test.rs:660:20:660:63 | TryExpr | test.rs:660:9:660:16 | mut file | provenance | | +| test.rs:664:22:664:25 | file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test.rs:664:32:664:42 | [post] &mut buffer [&ref] | test.rs:664:37:664:42 | [post] buffer | provenance | | +| test.rs:664:37:664:42 | [post] buffer | test.rs:665:15:665:20 | buffer | provenance | | +| test.rs:665:15:665:20 | buffer | test.rs:665:14:665:20 | &buffer | provenance | | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:22:673:23 | f1 | provenance | | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:45 | +| test.rs:671:22:671:69 | ... .open(...) [future, Ok] | test.rs:671:22:671:75 | await ... [Ok] | provenance | | +| test.rs:671:22:671:75 | await ... [Ok] | test.rs:671:22:671:76 | TryExpr | provenance | | +| test.rs:671:22:671:76 | TryExpr | test.rs:671:13:671:18 | mut f1 | provenance | | +| test.rs:671:56:671:59 | open | test.rs:671:22:671:69 | ... .open(...) [future, Ok] | provenance | Src:MaD:2 | +| test.rs:673:22:673:23 | f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test.rs:673:30:673:40 | [post] &mut buffer [&ref] | test.rs:673:35:673:40 | [post] buffer | provenance | | +| test.rs:673:35:673:40 | [post] buffer | test.rs:674:15:674:20 | buffer | provenance | | +| test.rs:674:15:674:20 | buffer | test.rs:674:14:674:20 | &buffer | provenance | | +| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:55 | +| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:113 | +| test.rs:688:26:688:53 | ...::connect | test.rs:688:26:688:62 | ...::connect(...) [Ok] | provenance | Src:MaD:9 | | test.rs:688:26:688:62 | ...::connect(...) [Ok] | test.rs:688:26:688:63 | TryExpr | provenance | | | test.rs:688:26:688:63 | TryExpr | test.rs:688:13:688:22 | mut stream | provenance | | | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | test.rs:695:34:695:39 | [post] buffer | provenance | | @@ -653,21 +677,21 @@ edges | test.rs:695:34:695:39 | [post] buffer | test.rs:699:14:699:22 | buffer[0] | provenance | | | test.rs:698:15:698:20 | buffer | test.rs:698:14:698:20 | &buffer | provenance | | | test.rs:707:13:707:22 | mut stream | test.rs:715:58:715:63 | stream | provenance | | -| test.rs:707:26:707:61 | ...::connect_timeout | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:8 | +| test.rs:707:26:707:61 | ...::connect_timeout | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:10 | | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | test.rs:707:26:707:106 | TryExpr | provenance | | | test.rs:707:26:707:106 | TryExpr | test.rs:707:13:707:22 | mut stream | provenance | | -| test.rs:715:21:715:30 | mut reader | test.rs:718:44:718:52 | [post] &mut line [&ref] | provenance | MaD:47 | -| test.rs:715:34:715:64 | ...::new(...) | test.rs:715:34:715:74 | ... .take(...) | provenance | MaD:57 | +| test.rs:715:21:715:30 | mut reader | test.rs:718:44:718:52 | [post] &mut line [&ref] | provenance | MaD:49 | +| test.rs:715:34:715:64 | ...::new(...) | test.rs:715:34:715:74 | ... .take(...) | provenance | MaD:59 | | test.rs:715:34:715:74 | ... .take(...) | test.rs:715:21:715:30 | mut reader | provenance | | -| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:101 | +| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:103 | | test.rs:718:44:718:52 | [post] &mut line [&ref] | test.rs:718:49:718:52 | [post] line | provenance | | | test.rs:718:49:718:52 | [post] line | test.rs:725:35:725:38 | line | provenance | | | test.rs:725:35:725:38 | line | test.rs:725:34:725:38 | &line | provenance | | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:117 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | provenance | MaD:63 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:118 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:119 | -| test.rs:759:28:759:57 | ...::connect | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:13 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:119 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | provenance | MaD:65 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:120 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:121 | +| test.rs:759:28:759:57 | ...::connect | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:15 | | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | test.rs:759:28:759:72 | await ... [Ok] | provenance | | | test.rs:759:28:759:72 | await ... [Ok] | test.rs:759:28:759:73 | TryExpr | provenance | | | test.rs:759:28:759:73 | TryExpr | test.rs:759:9:759:24 | mut tokio_stream | provenance | | @@ -687,7 +711,7 @@ edges | test.rs:817:27:817:32 | buffer | test.rs:817:26:817:32 | &buffer | provenance | | | test_futures_io.rs:19:9:19:11 | tcp | test_futures_io.rs:20:11:20:13 | tcp | provenance | | | test_futures_io.rs:19:9:19:11 | tcp | test_futures_io.rs:26:53:26:55 | tcp | provenance | | -| test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | provenance | Src:MaD:1 | +| test_futures_io.rs:19:15:19:32 | ...::connect | test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | provenance | Src:MaD:3 | | test_futures_io.rs:19:15:19:37 | ...::connect(...) [future, Ok] | test_futures_io.rs:19:15:19:43 | await ... [Ok] | provenance | | | test_futures_io.rs:19:15:19:43 | await ... [Ok] | test_futures_io.rs:19:15:19:44 | TryExpr | provenance | | | test_futures_io.rs:19:15:19:44 | TryExpr | test_futures_io.rs:19:9:19:11 | tcp | provenance | | @@ -696,13 +720,13 @@ edges | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:32:40:32:45 | reader | provenance | | | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:45:64:45:69 | reader | provenance | | | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:27:49:32 | reader | provenance | | -| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:42 | -| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:43 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:45 | | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:54:51:54:56 | reader | provenance | | | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | test_futures_io.rs:26:22:26:62 | await ... [Ok] | provenance | | | test_futures_io.rs:26:22:26:62 | await ... [Ok] | test_futures_io.rs:26:22:26:63 | TryExpr | provenance | | | test_futures_io.rs:26:22:26:63 | TryExpr | test_futures_io.rs:26:9:26:18 | mut reader | provenance | | -| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:84 | +| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:86 | | test_futures_io.rs:27:11:27:16 | reader | test_futures_io.rs:27:10:27:16 | &reader | provenance | | | test_futures_io.rs:32:13:32:22 | mut pinned | test_futures_io.rs:33:15:33:20 | pinned | provenance | | | test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | test_futures_io.rs:33:15:33:20 | pinned [&ref] | provenance | | @@ -710,56 +734,56 @@ edges | test_futures_io.rs:32:26:32:46 | ...::new(...) | test_futures_io.rs:32:13:32:22 | mut pinned | provenance | | | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | test_futures_io.rs:32:13:32:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:76 | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:78 | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | provenance | MaD:77 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:78 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:80 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | provenance | MaD:79 | | test_futures_io.rs:32:40:32:45 | reader | test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | provenance | | | test_futures_io.rs:33:15:33:20 | pinned | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | | test_futures_io.rs:33:15:33:20 | pinned [&ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | | test_futures_io.rs:33:15:33:20 | pinned [Pin, &ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | -| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:42 | +| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:44 | | test_futures_io.rs:45:64:45:69 | reader | test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | provenance | | | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | test_futures_io.rs:45:77:45:83 | [post] buffer1 | provenance | | | test_futures_io.rs:45:77:45:83 | [post] buffer1 | test_futures_io.rs:46:15:46:36 | buffer1[...] | provenance | | | test_futures_io.rs:46:15:46:36 | buffer1[...] | test_futures_io.rs:46:14:46:36 | &... | provenance | | -| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:42 | +| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | test_futures_io.rs:49:44:49:50 | [post] buffer2 | provenance | | | test_futures_io.rs:49:44:49:50 | [post] buffer2 | test_futures_io.rs:51:15:51:36 | buffer2[...] | provenance | | | test_futures_io.rs:51:15:51:36 | buffer2[...] | test_futures_io.rs:51:14:51:36 | &... | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:55:11:55:17 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:59:40:59:46 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:69:37:69:43 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:37 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:39 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:90:40:90:46 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:103:64:103:70 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:27:107:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:42 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:43 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:45 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:113:40:113:46 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:37 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:39 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:27:132:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:40 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:41 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:42 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:43 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:27:139:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:38 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:39 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:40 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:41 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:27:146:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:44 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:45 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:46 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:47 | | test_futures_io.rs:54:23:54:57 | ...::new(...) | test_futures_io.rs:54:9:54:19 | mut reader2 | provenance | | -| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:85 | +| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:87 | | test_futures_io.rs:55:11:55:17 | reader2 | test_futures_io.rs:55:10:55:17 | &reader2 | provenance | | | test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:60:15:60:20 | pinned | provenance | | -| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | | test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:60:15:60:20 | pinned [&ref] | provenance | | -| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | | test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | test_futures_io.rs:60:15:60:20 | pinned [Pin, &ref] | provenance | | | test_futures_io.rs:59:26:59:47 | ...::new(...) | test_futures_io.rs:59:13:59:22 | mut pinned | provenance | | | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:76 | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:78 | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | provenance | MaD:77 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:78 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:80 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | provenance | MaD:79 | | test_futures_io.rs:59:40:59:46 | reader2 | test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:60:15:60:20 | pinned | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | | test_futures_io.rs:60:15:60:20 | pinned [&ref] | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | @@ -772,11 +796,11 @@ edges | test_futures_io.rs:63:31:63:33 | buf | test_futures_io.rs:65:18:65:20 | buf | provenance | | | test_futures_io.rs:64:19:64:24 | buffer [Ready, Ok] | test_futures_io.rs:64:18:64:24 | &buffer | provenance | | | test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | provenance | | -| test_futures_io.rs:69:23:69:44 | ...::new(...) | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | -| test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:69:23:69:44 | ...::new(...) | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | +| test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | provenance | | -| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:76 | -| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:78 | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:78 | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:80 | | test_futures_io.rs:69:37:69:43 | reader2 | test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:71:13:71:32 | ...::Ready(...) [Ready, Ok] | provenance | | | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:72:23:72:29 | buffer2 [Ready, Ok] | provenance | | @@ -794,33 +818,33 @@ edges | test_futures_io.rs:90:26:90:47 | ...::new(...) | test_futures_io.rs:90:13:90:22 | mut pinned | provenance | | | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | test_futures_io.rs:90:13:90:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:90:13:90:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:76 | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:78 | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | provenance | MaD:77 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:78 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:80 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | provenance | MaD:79 | | test_futures_io.rs:90:40:90:46 | reader2 | test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:91:15:91:20 | pinned | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | | test_futures_io.rs:91:15:91:20 | pinned [&ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | | test_futures_io.rs:91:15:91:20 | pinned [Pin, &ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | -| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:42 | +| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:44 | | test_futures_io.rs:103:64:103:70 | reader2 | test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | test_futures_io.rs:103:78:103:84 | [post] buffer1 | provenance | | | test_futures_io.rs:103:78:103:84 | [post] buffer1 | test_futures_io.rs:104:15:104:36 | buffer1[...] | provenance | | | test_futures_io.rs:104:15:104:36 | buffer1[...] | test_futures_io.rs:104:14:104:36 | &... | provenance | | -| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:42 | +| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | test_futures_io.rs:107:45:107:51 | [post] buffer2 | provenance | | | test_futures_io.rs:107:45:107:51 | [post] buffer2 | test_futures_io.rs:108:15:108:36 | buffer2[...] | provenance | | | test_futures_io.rs:108:15:108:36 | buffer2[...] | test_futures_io.rs:108:14:108:36 | &... | provenance | | | test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:114:15:114:20 | pinned | provenance | | -| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | | test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:114:15:114:20 | pinned [&ref] | provenance | | -| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:36 | +| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | | test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | test_futures_io.rs:114:15:114:20 | pinned [Pin, &ref] | provenance | | | test_futures_io.rs:113:26:113:47 | ...::new(...) | test_futures_io.rs:113:13:113:22 | mut pinned | provenance | | | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:76 | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:78 | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | provenance | MaD:77 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:78 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:80 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | provenance | MaD:79 | | test_futures_io.rs:113:40:113:46 | reader2 | test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:114:15:114:20 | pinned | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | | test_futures_io.rs:114:15:114:20 | pinned [&ref] | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | @@ -836,40 +860,40 @@ edges | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | test_futures_io.rs:125:22:125:45 | await ... [Ok] | provenance | | | test_futures_io.rs:125:22:125:45 | await ... [Ok] | test_futures_io.rs:125:22:125:46 | TryExpr | provenance | | | test_futures_io.rs:125:22:125:46 | TryExpr | test_futures_io.rs:125:13:125:18 | buffer | provenance | | -| test_futures_io.rs:132:27:132:33 | reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:40 | +| test_futures_io.rs:132:27:132:33 | reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:42 | | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | test_futures_io.rs:132:58:132:61 | [post] line | provenance | | | test_futures_io.rs:132:58:132:61 | [post] line | test_futures_io.rs:133:15:133:18 | line | provenance | | | test_futures_io.rs:133:15:133:18 | line | test_futures_io.rs:133:14:133:18 | &line | provenance | | -| test_futures_io.rs:139:27:139:33 | reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:38 | +| test_futures_io.rs:139:27:139:33 | reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:40 | | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | test_futures_io.rs:139:50:139:53 | [post] line | provenance | | | test_futures_io.rs:139:50:139:53 | [post] line | test_futures_io.rs:140:15:140:18 | line | provenance | | | test_futures_io.rs:140:15:140:18 | line | test_futures_io.rs:140:14:140:18 | &line | provenance | | -| test_futures_io.rs:146:27:146:33 | reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test_futures_io.rs:146:27:146:33 | reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:46 | | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | test_futures_io.rs:146:52:146:57 | [post] buffer | provenance | | | test_futures_io.rs:146:52:146:57 | [post] buffer | test_futures_io.rs:147:15:147:20 | buffer | provenance | | | test_futures_io.rs:147:15:147:20 | buffer | test_futures_io.rs:147:14:147:20 | &buffer | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:73 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:82 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:73 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:82 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:75 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:84 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:75 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:84 | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:72 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:81 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:72 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:81 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:74 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:83 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:74 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:83 | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:73 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:82 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:73 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:82 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:72 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:81 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:72 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:81 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:75 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:84 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:75 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:84 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:74 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:83 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:74 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:83 | | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | | | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | | nodes @@ -1437,6 +1461,26 @@ nodes | test.rs:629:35:629:40 | [post] buffer | semmle.label | [post] buffer | | test.rs:630:14:630:20 | &buffer | semmle.label | &buffer | | test.rs:630:15:630:20 | buffer | semmle.label | buffer | +| test.rs:660:9:660:16 | mut file | semmle.label | mut file | +| test.rs:660:20:660:44 | ...::open | semmle.label | ...::open | +| test.rs:660:20:660:56 | ...::open(...) [future, Ok] | semmle.label | ...::open(...) [future, Ok] | +| test.rs:660:20:660:62 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:660:20:660:63 | TryExpr | semmle.label | TryExpr | +| test.rs:664:22:664:25 | file | semmle.label | file | +| test.rs:664:32:664:42 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:664:37:664:42 | [post] buffer | semmle.label | [post] buffer | +| test.rs:665:14:665:20 | &buffer | semmle.label | &buffer | +| test.rs:665:15:665:20 | buffer | semmle.label | buffer | +| test.rs:671:13:671:18 | mut f1 | semmle.label | mut f1 | +| test.rs:671:22:671:69 | ... .open(...) [future, Ok] | semmle.label | ... .open(...) [future, Ok] | +| test.rs:671:22:671:75 | await ... [Ok] | semmle.label | await ... [Ok] | +| test.rs:671:22:671:76 | TryExpr | semmle.label | TryExpr | +| test.rs:671:56:671:59 | open | semmle.label | open | +| test.rs:673:22:673:23 | f1 | semmle.label | f1 | +| test.rs:673:30:673:40 | [post] &mut buffer [&ref] | semmle.label | [post] &mut buffer [&ref] | +| test.rs:673:35:673:40 | [post] buffer | semmle.label | [post] buffer | +| test.rs:674:14:674:20 | &buffer | semmle.label | &buffer | +| test.rs:674:15:674:20 | buffer | semmle.label | buffer | | test.rs:688:13:688:22 | mut stream | semmle.label | mut stream | | test.rs:688:26:688:53 | ...::connect | semmle.label | ...::connect | | test.rs:688:26:688:62 | ...::connect(...) [Ok] | semmle.label | ...::connect(...) [Ok] | @@ -1738,6 +1782,8 @@ testFailures | test.rs:615:14:615:15 | v4 | test.rs:581:20:581:40 | ...::open | test.rs:615:14:615:15 | v4 | $@ | test.rs:581:20:581:40 | ...::open | ...::open | | test.rs:621:14:621:20 | &buffer | test.rs:581:20:581:40 | ...::open | test.rs:621:14:621:20 | &buffer | $@ | test.rs:581:20:581:40 | ...::open | ...::open | | test.rs:630:14:630:20 | &buffer | test.rs:627:52:627:55 | open | test.rs:630:14:630:20 | &buffer | $@ | test.rs:627:52:627:55 | open | open | +| test.rs:665:14:665:20 | &buffer | test.rs:660:20:660:44 | ...::open | test.rs:665:14:665:20 | &buffer | $@ | test.rs:660:20:660:44 | ...::open | ...::open | +| test.rs:674:14:674:20 | &buffer | test.rs:671:56:671:59 | open | test.rs:674:14:674:20 | &buffer | $@ | test.rs:671:56:671:59 | open | open | | test.rs:698:14:698:20 | &buffer | test.rs:688:26:688:53 | ...::connect | test.rs:698:14:698:20 | &buffer | $@ | test.rs:688:26:688:53 | ...::connect | ...::connect | | test.rs:699:14:699:22 | buffer[0] | test.rs:688:26:688:53 | ...::connect | test.rs:699:14:699:22 | buffer[0] | $@ | test.rs:688:26:688:53 | ...::connect | ...::connect | | test.rs:725:34:725:38 | &line | test.rs:707:26:707:61 | ...::connect_timeout | test.rs:725:34:725:38 | &line | $@ | test.rs:707:26:707:61 | ...::connect_timeout | ...::connect_timeout | diff --git a/rust/ql/test/library-tests/dataflow/sources/test.rs b/rust/ql/test/library-tests/dataflow/sources/test.rs index 6e30159ea1a..895a789cfaf 100644 --- a/rust/ql/test/library-tests/dataflow/sources/test.rs +++ b/rust/ql/test/library-tests/dataflow/sources/test.rs @@ -662,7 +662,7 @@ async fn test_async_std_file() -> std::io::Result<()> { { let mut buffer = [0u8; 100]; let _bytes = file.read(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow="file.txt" + sink(&buffer); // $ hasTaintFlow="file.txt" } // --- OpenOptions --- @@ -671,7 +671,7 @@ async fn test_async_std_file() -> std::io::Result<()> { let mut f1 = async_std::fs::OpenOptions::new().open("f1.txt").await?; // $ Alert[rust/summary/taint-sources] let mut buffer = [0u8; 1024]; let _bytes = f1.read(&mut buffer).await?; - sink(&buffer); // $ MISSING: hasTaintFlow="f1.txt" + sink(&buffer); // $ hasTaintFlow="f1.txt" } Ok(()) diff --git a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected index d945cb4c6c2..7a3fd01dbc7 100644 --- a/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected +++ b/rust/ql/test/library-tests/path-resolution/CONSISTENCY/PathResolutionConsistency.expected @@ -1,4 +1,3 @@ multipleCallTargets | main.rs:124:9:124:11 | f(...) | -| main.rs:774:5:774:7 | f(...) | | proc_macro.rs:9:5:9:10 | ...::new(...) | diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index db8e4c0f39d..5146373b896 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -771,7 +771,7 @@ fn main() { my::nested::nested1::nested2::f(); // $ item=I4 my::f(); // $ item=I38 nested2::nested3::nested4::f(); // $ item=I12 - f(); // $ item=I12 $ SPURIOUS: item=I119 + f(); // $ item=I12 g(); // $ item=I13 crate::h(); // $ item=I25 m1::m2::g(); // $ item=I19 diff --git a/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs b/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs index e2d413841c3..b459ca05aa6 100644 --- a/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs +++ b/rust/ql/test/library-tests/path-resolution/my2/my3/mod.rs @@ -7,4 +7,4 @@ pub fn f() { use super::super::h; // $ item=I25 use super::g; // $ item=I9 -use super::nested6_f; // $ MISSING: item=I116 +use super::nested6_f; // $ item=I116 diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected index 8f12af96c02..067365a5386 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -361,7 +361,6 @@ resolvePath | main.rs:773:5:773:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | | main.rs:773:5:773:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | | main.rs:774:5:774:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:774:5:774:5 | f | my2/nested2.rs:23:9:25:9 | fn f | | main.rs:775:5:775:5 | g | my2/nested2.rs:7:9:9:9 | fn g | | main.rs:776:5:776:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | | main.rs:776:5:776:12 | ...::h | main.rs:56:1:75:1 | fn h | @@ -440,6 +439,7 @@ resolvePath | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:23:34 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | | my2/my3/mod.rs:10:5:10:9 | super | my2/mod.rs:1:1:23:34 | SourceFile | +| my2/my3/mod.rs:10:5:10:20 | ...::nested6_f | my2/nested2.rs:15:9:17:9 | fn f | | my.rs:3:5:3:10 | nested | my.rs:1:1:1:15 | mod nested | | my.rs:3:5:3:13 | ...::g | my/nested.rs:19:1:22:1 | fn g | | my.rs:11:5:11:5 | g | my/nested.rs:19:1:22:1 | fn g | From a6c1ffc45d1c6bec8f01e55f5b4ac6989fd2a236 Mon Sep 17 00:00:00 2001 From: Philip Ginsbach Date: Fri, 19 Sep 2025 10:39:36 +0100 Subject: [PATCH 35/49] sort the annotations alphabetically --- .../ql-language-reference/annotations.rst | 6 +- .../ql-language-specification.rst | 62 +++++++++---------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/docs/codeql/ql-language-reference/annotations.rst b/docs/codeql/ql-language-reference/annotations.rst index 0ddb28c3a9d..00080087d36 100644 --- a/docs/codeql/ql-language-reference/annotations.rst +++ b/docs/codeql/ql-language-reference/annotations.rst @@ -16,9 +16,9 @@ For example, to declare a module ``M`` as private, you could use: } Note that some annotations act on an entity itself, whilst others act on a particular *name* for the entity: - - Act on an **entity**: ``abstract``, ``cached``, ``external``, ``transient``, ``override``, ``pragma``, ``language``, - and ``bindingset`` - - Act on a **name**: ``deprecated``, ``library``, ``private``, ``final``, and ``query`` + - Act on an **entity**: ``abstract``, ``bindingset``, ``cached``, ``external``, ``language``, + ``override``, ``pragma``, and ``transient`` + - Act on a **name**: ``deprecated``, ``final``, ``library``, ``private``, and ``query`` For example, if you annotate an entity with ``private``, then only that particular name is private. You could still access that entity under a different name (using an :ref:`alias `). diff --git a/docs/codeql/ql-language-reference/ql-language-specification.rst b/docs/codeql/ql-language-reference/ql-language-specification.rst index 9989c73e5dc..854c9f28f60 100644 --- a/docs/codeql/ql-language-reference/ql-language-specification.rst +++ b/docs/codeql/ql-language-reference/ql-language-specification.rst @@ -761,17 +761,17 @@ Various kinds of syntax can have *annotations* applied to them. Annotations are annotation ::= simpleAnnotation | argsAnnotation simpleAnnotation ::= "abstract" - | "cached" - | "external" - | "extensible" - | "final" - | "transient" - | "library" - | "private" - | "deprecated" - | "override" | "additional" + | "cached" + | "deprecated" + | "extensible" + | "external" + | "final" + | "library" + | "override" + | "private" | "query" + | "transient" argsAnnotation ::= "pragma" "[" ("inline" | "inline_late" | "noinline" | "nomagic" | "noopt" | "assume_small_delta") "]" | "language" "[" "monotonicAggregates" "]" @@ -791,28 +791,28 @@ The following table summarizes the syntactic constructs which can be marked with +================+=========+============+===================+=======================+=========+========+=========+=========+============+ | ``abstract`` | yes | | yes | | | | | | | +----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ +| ``additional`` | yes | | | yes | | | yes | yes | yes | ++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ | ``cached`` | yes | yes | yes | yes | | | yes | | | +----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ -| ``external`` | | | | yes | | | | | | -+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ -| ``extensible`` | | | | yes | | | | | | -+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ -| ``final`` | yes | | yes | | | yes | | (yes) | | -+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ -| ``transient`` | | | | yes | | | | | | -+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ -| ``library`` | (yes) | | | | | | | | | -+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ -| ``private`` | yes | | yes | yes | yes | yes | yes | yes | yes | -+----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ | ``deprecated`` | yes | | yes | yes | yes | yes | yes | yes | yes | +----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ +| ``extensible`` | | | | yes | | | | | | ++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ +| ``external`` | | | | yes | | | | | | ++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ +| ``final`` | yes | | yes | | | yes | | (yes) | | ++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ +| ``library`` | (yes) | | | | | | | | | ++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ | ``override`` | | | yes | | | yes | | | | +----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ -| ``additional`` | yes | | | yes | | | yes | yes | yes | +| ``private`` | yes | | yes | yes | yes | yes | yes | yes | yes | +----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ | ``query`` | | | | yes | | | | yes | | +----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ +| ``transient`` | | | | yes | | | | | | ++----------------+---------+------------+-------------------+-----------------------+---------+--------+---------+---------+------------+ The ``library`` annotation is only usable within a QLL file, not a QL file. The ``final`` annotation is usable on type aliases, but not on module aliases and predicate aliases. @@ -2292,17 +2292,17 @@ The complete grammar for QL is as follows: annotation ::= simpleAnnotation | argsAnnotation simpleAnnotation ::= "abstract" - | "cached" - | "external" - | "extensible" - | "final" - | "transient" - | "library" - | "private" - | "deprecated" - | "override" | "additional" + | "cached" + | "deprecated" + | "extensible" + | "external" + | "final" + | "library" + | "override" + | "private" | "query" + | "transient" argsAnnotation ::= "pragma" "[" ("inline" | "inline_late" | "noinline" | "nomagic" | "noopt" | "assume_small_delta") "]" | "language" "[" "monotonicAggregates" "]" From b27d3745781d0362ec42dfb384d1d21c296bdb05 Mon Sep 17 00:00:00 2001 From: Philip Ginsbach Date: Fri, 19 Sep 2025 10:41:52 +0100 Subject: [PATCH 36/49] mention 'additional' and 'extensible' annotations --- docs/codeql/ql-language-reference/annotations.rst | 4 ++-- .../ql-language-reference/ql-language-specification.rst | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/codeql/ql-language-reference/annotations.rst b/docs/codeql/ql-language-reference/annotations.rst index 00080087d36..cffbbf73c71 100644 --- a/docs/codeql/ql-language-reference/annotations.rst +++ b/docs/codeql/ql-language-reference/annotations.rst @@ -16,9 +16,9 @@ For example, to declare a module ``M`` as private, you could use: } Note that some annotations act on an entity itself, whilst others act on a particular *name* for the entity: - - Act on an **entity**: ``abstract``, ``bindingset``, ``cached``, ``external``, ``language``, + - Act on an **entity**: ``abstract``, ``bindingset``, ``cached``, ``extensible``, ``external``, ``language``, ``override``, ``pragma``, and ``transient`` - - Act on a **name**: ``deprecated``, ``final``, ``library``, ``private``, and ``query`` + - Act on a **name**: ``additional``, ``deprecated``, ``final``, ``library``, ``private``, and ``query`` For example, if you annotate an entity with ``private``, then only that particular name is private. You could still access that entity under a different name (using an :ref:`alias `). diff --git a/docs/codeql/ql-language-reference/ql-language-specification.rst b/docs/codeql/ql-language-reference/ql-language-specification.rst index 854c9f28f60..f834949c3cd 100644 --- a/docs/codeql/ql-language-reference/ql-language-specification.rst +++ b/docs/codeql/ql-language-reference/ql-language-specification.rst @@ -933,7 +933,8 @@ A predicate definition adds a mapping from the predicate name and arity to the p When a predicate is a top-level clause in a module, it is called a non-member predicate. See below for "`Member predicates <#member-predicates>`__." -A valid non-member predicate can be annotated with ``cached``, ``deprecated``, ``external``, ``transient``, ``private``, and ``query``. Note, the ``transient`` annotation can only be applied if the non-member predicate is also annotated with ``external``. +A valid non-member predicate can be annotated with ``additional``, ``cached``, ``deprecated``, ``extensible``, ``external``, ``transient``, ``private``, and ``query``. +Note, the ``transient`` annotation can only be applied if the non-member predicate is also annotated with ``external``. The head of the predicate gives a name, an optional *result type*, and a sequence of variables declarations that are *arguments*: @@ -979,7 +980,7 @@ A class type is said to *final inherit* from base types that are final or refere A class adds a mapping from the class name to the class declaration to the current module's declared type environment. -A valid class can be annotated with ``abstract``, ``final``, ``library``, and ``private``. Any other annotation renders the class invalid. +A valid class can be annotated with ``abstract``, ``additional``, ``final``, ``library``, and ``private``. Any other annotation renders the class invalid. A valid class may not inherit from itself, or from more than one primitive type. The set of types that a valid class inherits from must be disjoint from the set of types that it final inherits from. From c7a9cc5a424c80dc4a3c538d20f934ad4d5f44c7 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 17 Sep 2025 14:55:52 +0200 Subject: [PATCH 37/49] Rust: Use annotations also for items in macro expansions --- .../lib/utils/test/PathResolutionInlineExpectationsTest.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll b/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll index c5a95ac9038..8d2fdb2d2eb 100644 --- a/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll +++ b/rust/ql/lib/utils/test/PathResolutionInlineExpectationsTest.qll @@ -25,9 +25,9 @@ private module ResolveTest implements TestSig { private predicate item(ItemNode i, string value) { exists(string filepath, int line, boolean inMacro | itemAt(i, filepath, line, inMacro) | - commmentAt(value, filepath, line) and inMacro = false + commmentAt(value, filepath, line) or - not (commmentAt(_, filepath, line) and inMacro = false) and + not commmentAt(_, filepath, line) and value = i.getName() ) } From 32365fd673e0520ae10cea12212adfd3e98d0b6e Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 17 Sep 2025 15:15:29 +0200 Subject: [PATCH 38/49] Rust: Account for attribute expansions in path resolution --- rust/ql/lib/codeql/rust/internal/PathResolution.qll | 11 ++++++----- rust/ql/test/library-tests/path-resolution/main.rs | 7 +++---- .../path-resolution/path-resolution.expected | 10 ++++++---- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index f819632ce10..980033811dd 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -156,6 +156,11 @@ private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind ki * - https://doc.rust-lang.org/reference/names/namespaces.html */ abstract class ItemNode extends Locatable { + ItemNode() { + // Exclude items that are superceded by the expansion of an attribute macro. + not this.(Item).hasAttributeMacroExpansion() + } + /** Gets the (original) name of this item. */ abstract string getName(); @@ -660,11 +665,7 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl { override Visibility getVisibility() { result = Impl.super.getVisibility() } - TypeParamItemNode getBlanketImplementationTypeParam() { - result = this.resolveSelfTy() and - // This impl block is not superseded by the expansion of an attribute macro. - not exists(super.getAttributeMacroExpansion()) - } + TypeParamItemNode getBlanketImplementationTypeParam() { result = this.resolveSelfTy() } /** * Holds if this impl block is a blanket implementation. That is, the diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 5146373b896..1ad55d36ad4 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -798,8 +798,7 @@ fn main() { m23::f(); // $ item=I108 m24::f(); // $ item=I121 zelf::h(); // $ item=I25 - z_changed(); // $ MISSING: item=I122 - AStruct::z_on_type(); // $ MISSING: item=I124 - AStruct {} // $ item=I123 - .z_on_instance(); // MISSING: item=I125 + z_changed(); // $ item=I122 + AStruct::z_on_type(); // $ item=I124 + AStruct {}.z_on_instance(); // $ item=I123 item=I125 } diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected index 067365a5386..7c30ebc4a1e 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -66,7 +66,7 @@ resolvePath | main.rs:36:17:36:21 | super | main.rs:24:5:42:5 | mod m2 | | main.rs:36:17:36:24 | ...::f | main.rs:25:9:27:9 | fn f | | main.rs:39:17:39:17 | f | main.rs:25:9:27:9 | fn f | -| main.rs:46:9:46:13 | super | main.rs:1:1:805:2 | SourceFile | +| main.rs:46:9:46:13 | super | main.rs:1:1:804:2 | SourceFile | | main.rs:46:9:46:17 | ...::m1 | main.rs:19:1:43:1 | mod m1 | | main.rs:46:9:46:21 | ...::m2 | main.rs:24:5:42:5 | mod m2 | | main.rs:46:9:46:24 | ...::g | main.rs:29:9:33:9 | fn g | @@ -78,7 +78,7 @@ resolvePath | main.rs:67:17:67:19 | Foo | main.rs:65:9:65:21 | struct Foo | | main.rs:70:13:70:15 | Foo | main.rs:59:5:59:17 | struct Foo | | main.rs:72:5:72:5 | f | main.rs:61:5:68:5 | fn f | -| main.rs:74:5:74:8 | self | main.rs:1:1:805:2 | SourceFile | +| main.rs:74:5:74:8 | self | main.rs:1:1:804:2 | SourceFile | | main.rs:74:5:74:11 | ...::i | main.rs:77:1:89:1 | fn i | | main.rs:80:13:80:15 | Foo | main.rs:54:1:54:13 | struct Foo | | main.rs:84:16:84:18 | i32 | {EXTERNAL LOCATION} | struct i32 | @@ -93,7 +93,7 @@ resolvePath | main.rs:93:57:93:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g | | main.rs:93:80:93:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | | main.rs:106:5:106:22 | f_defined_in_macro | main.rs:105:18:105:42 | fn f_defined_in_macro | -| main.rs:123:13:123:17 | super | main.rs:1:1:805:2 | SourceFile | +| main.rs:123:13:123:17 | super | main.rs:1:1:804:2 | SourceFile | | main.rs:123:13:123:21 | ...::m5 | main.rs:109:1:113:1 | mod m5 | | main.rs:124:9:124:9 | f | main.rs:110:5:112:5 | fn f | | main.rs:124:9:124:9 | f | main.rs:116:5:118:5 | fn f | @@ -412,7 +412,9 @@ resolvePath | main.rs:799:5:799:10 | ...::f | main.rs:681:5:694:5 | fn f | | main.rs:800:5:800:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | | main.rs:800:5:800:11 | ...::h | main.rs:56:1:75:1 | fn h | +| main.rs:801:5:801:13 | z_changed | main.rs:700:1:700:8 | fn z_changed | | main.rs:802:5:802:11 | AStruct | main.rs:702:1:702:17 | struct AStruct | +| main.rs:802:5:802:22 | ...::z_on_type | main.rs:706:5:706:16 | fn z_on_type | | main.rs:803:5:803:11 | AStruct | main.rs:702:1:702:17 | struct AStruct | | my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | @@ -434,7 +436,7 @@ resolvePath | my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g | | my2/my3/mod.rs:4:5:4:5 | h | main.rs:56:1:75:1 | fn h | | my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:23:34 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:805:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:804:2 | SourceFile | | my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:56:1:75:1 | fn h | | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:23:34 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | From 2c84b49cede939e5f935213890910c0ad87d7643 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Wed, 17 Sep 2025 15:58:54 +0200 Subject: [PATCH 39/49] Rust: Update test expecations --- .../security/CWE-696/BadCTorInitialization.expected | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-696/BadCTorInitialization.expected b/rust/ql/test/query-tests/security/CWE-696/BadCTorInitialization.expected index 3ac74a3cb13..ed95a8d448a 100644 --- a/rust/ql/test/query-tests/security/CWE-696/BadCTorInitialization.expected +++ b/rust/ql/test/query-tests/security/CWE-696/BadCTorInitialization.expected @@ -59,13 +59,11 @@ edges | test.rs:129:4:130:21 | fn bad3_1 | test.rs:130:5:130:19 | call_target3_1(...) | | test.rs:130:5:130:19 | call_target3_1(...) | test.rs:124:1:126:1 | fn call_target3_1 | | test.rs:144:1:144:7 | Attr | test.rs:145:4:147:21 | fn bad3_3 | -| test.rs:144:1:148:1 | fn bad3_3 | test.rs:146:5:146:20 | call_target3_1(...) | | test.rs:145:4:147:21 | fn bad3_3 | test.rs:146:5:146:19 | call_target3_1(...) | | test.rs:146:5:146:19 | call_target3_1(...) | test.rs:124:1:126:1 | fn call_target3_1 | -| test.rs:146:5:146:20 | call_target3_1(...) | test.rs:124:1:126:1 | fn call_target3_1 | | test.rs:150:1:150:7 | Attr | test.rs:151:4:152:13 | fn bad3_4 | | test.rs:151:4:152:13 | fn bad3_4 | test.rs:152:5:152:11 | bad3_3(...) | -| test.rs:152:5:152:11 | bad3_3(...) | test.rs:144:1:148:1 | fn bad3_3 | +| test.rs:152:5:152:11 | bad3_3(...) | test.rs:145:4:147:21 | fn bad3_3 | | test.rs:168:1:168:7 | Attr | test.rs:169:4:170:16 | fn bad4_1 | | test.rs:169:4:170:16 | fn bad4_1 | test.rs:168:1:168:7 | ... .write(...) | | test.rs:169:4:170:16 | fn bad4_1 | test.rs:168:1:168:7 | ...::stdout(...) | From a9d7662bb7a20a08bdc794bc67c1d10f60c5f3f9 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Fri, 19 Sep 2025 13:09:07 +0200 Subject: [PATCH 40/49] Rust: Add path resolution test with attribute on impl block --- .../library-tests/path-resolution/main.rs | 22 +++ .../path-resolution/path-resolution.expected | 161 ++++++++++-------- .../path-resolution/proc_macro.rs | 8 +- 3 files changed, 116 insertions(+), 75 deletions(-) diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 1ad55d36ad4..42107ec5fd4 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -767,6 +767,27 @@ use std::{self as ztd}; // $ item=std fn use_ztd(x: ztd::string::String) {} // $ item=String +#[rustfmt::skip] +mod impl_with_attribute_macro { + struct Foo; // IFoo + + trait ATrait { + type Foo; + } // IATrait + + #[proc_macro::identity] // $ item=identity + impl ATrait for i64 { // $ item=IATrait item=i64 + type Foo = + i64 // $ item=i64 + ; // IATrait_i64_Foo + } + + pub fn test() { + // This should resolve to the struct, not the associated type. + let _x: Foo; // $ item=IFoo SPURIOUS: item=IATrait_i64_Foo + } // impl_with_attribute_macro::test +} + fn main() { my::nested::nested1::nested2::f(); // $ item=I4 my::f(); // $ item=I38 @@ -801,4 +822,5 @@ fn main() { z_changed(); // $ item=I122 AStruct::z_on_type(); // $ item=I124 AStruct {}.z_on_instance(); // $ item=I123 item=I125 + impl_with_attribute_macro::test(); // $ item=impl_with_attribute_macro::test } diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected index 7c30ebc4a1e..e9bb668f681 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -31,6 +31,7 @@ mod | main.rs:600:1:625:1 | mod m23 | | main.rs:627:1:695:1 | mod m24 | | main.rs:712:1:764:1 | mod associated_types | +| main.rs:770:1:789:1 | mod impl_with_attribute_macro | | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:18:1:18:12 | mod my3 | | my2/mod.rs:20:1:21:10 | mod mymod | @@ -66,7 +67,7 @@ resolvePath | main.rs:36:17:36:21 | super | main.rs:24:5:42:5 | mod m2 | | main.rs:36:17:36:24 | ...::f | main.rs:25:9:27:9 | fn f | | main.rs:39:17:39:17 | f | main.rs:25:9:27:9 | fn f | -| main.rs:46:9:46:13 | super | main.rs:1:1:804:2 | SourceFile | +| main.rs:46:9:46:13 | super | main.rs:1:1:826:2 | SourceFile | | main.rs:46:9:46:17 | ...::m1 | main.rs:19:1:43:1 | mod m1 | | main.rs:46:9:46:21 | ...::m2 | main.rs:24:5:42:5 | mod m2 | | main.rs:46:9:46:24 | ...::g | main.rs:29:9:33:9 | fn g | @@ -78,7 +79,7 @@ resolvePath | main.rs:67:17:67:19 | Foo | main.rs:65:9:65:21 | struct Foo | | main.rs:70:13:70:15 | Foo | main.rs:59:5:59:17 | struct Foo | | main.rs:72:5:72:5 | f | main.rs:61:5:68:5 | fn f | -| main.rs:74:5:74:8 | self | main.rs:1:1:804:2 | SourceFile | +| main.rs:74:5:74:8 | self | main.rs:1:1:826:2 | SourceFile | | main.rs:74:5:74:11 | ...::i | main.rs:77:1:89:1 | fn i | | main.rs:80:13:80:15 | Foo | main.rs:54:1:54:13 | struct Foo | | main.rs:84:16:84:18 | i32 | {EXTERNAL LOCATION} | struct i32 | @@ -93,7 +94,7 @@ resolvePath | main.rs:93:57:93:66 | ...::g | my2/nested2.rs:7:9:9:9 | fn g | | main.rs:93:80:93:86 | nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | | main.rs:106:5:106:22 | f_defined_in_macro | main.rs:105:18:105:42 | fn f_defined_in_macro | -| main.rs:123:13:123:17 | super | main.rs:1:1:804:2 | SourceFile | +| main.rs:123:13:123:17 | super | main.rs:1:1:826:2 | SourceFile | | main.rs:123:13:123:21 | ...::m5 | main.rs:109:1:113:1 | mod m5 | | main.rs:124:9:124:9 | f | main.rs:110:5:112:5 | fn f | | main.rs:124:9:124:9 | f | main.rs:116:5:118:5 | fn f | @@ -303,12 +304,12 @@ resolvePath | main.rs:693:9:693:47 | ...::call_both | main.rs:659:9:662:9 | fn call_both | | main.rs:693:25:693:35 | Implementor | main.rs:665:5:665:23 | struct Implementor | | main.rs:699:3:699:12 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:699:3:699:24 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:699:3:699:24 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | | main.rs:703:6:703:12 | AStruct | main.rs:702:1:702:17 | struct AStruct | | main.rs:705:7:705:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:705:7:705:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:705:7:705:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | | main.rs:708:7:708:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | -| main.rs:708:7:708:28 | ...::add_suffix | proc_macro.rs:4:1:12:1 | fn add_suffix | +| main.rs:708:7:708:28 | ...::add_suffix | proc_macro.rs:4:1:13:1 | fn add_suffix | | main.rs:713:9:713:11 | std | {EXTERNAL LOCATION} | Crate(std@0.0.0) | | main.rs:713:9:713:19 | ...::marker | {EXTERNAL LOCATION} | mod marker | | main.rs:713:9:713:32 | ...::PhantomData | {EXTERNAL LOCATION} | struct PhantomData | @@ -349,73 +350,82 @@ resolvePath | main.rs:768:15:768:17 | ztd | {EXTERNAL LOCATION} | Crate(std@0.0.0) | | main.rs:768:15:768:25 | ...::string | {EXTERNAL LOCATION} | mod string | | main.rs:768:15:768:33 | ...::String | {EXTERNAL LOCATION} | struct String | -| main.rs:771:5:771:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:771:5:771:14 | ...::nested | my.rs:1:1:1:15 | mod nested | -| main.rs:771:5:771:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | -| main.rs:771:5:771:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | -| main.rs:771:5:771:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | -| main.rs:772:5:772:6 | my | main.rs:1:1:1:7 | mod my | -| main.rs:772:5:772:9 | ...::f | my.rs:5:1:7:1 | fn f | -| main.rs:773:5:773:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | -| main.rs:773:5:773:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | -| main.rs:773:5:773:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | -| main.rs:773:5:773:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:774:5:774:5 | f | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:775:5:775:5 | g | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:776:5:776:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:776:5:776:12 | ...::h | main.rs:56:1:75:1 | fn h | -| main.rs:777:5:777:6 | m1 | main.rs:19:1:43:1 | mod m1 | -| main.rs:777:5:777:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 | -| main.rs:777:5:777:13 | ...::g | main.rs:29:9:33:9 | fn g | -| main.rs:778:5:778:6 | m1 | main.rs:19:1:43:1 | mod m1 | -| main.rs:778:5:778:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 | -| main.rs:778:5:778:14 | ...::m3 | main.rs:35:9:41:9 | mod m3 | -| main.rs:778:5:778:17 | ...::h | main.rs:36:27:40:13 | fn h | -| main.rs:779:5:779:6 | m4 | main.rs:45:1:52:1 | mod m4 | -| main.rs:779:5:779:9 | ...::i | main.rs:48:5:51:5 | fn i | -| main.rs:780:5:780:5 | h | main.rs:56:1:75:1 | fn h | -| main.rs:781:5:781:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | -| main.rs:782:5:782:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | -| main.rs:783:5:783:5 | j | main.rs:103:1:107:1 | fn j | -| main.rs:784:5:784:6 | m6 | main.rs:115:1:126:1 | mod m6 | -| main.rs:784:5:784:9 | ...::g | main.rs:120:5:125:5 | fn g | -| main.rs:785:5:785:6 | m7 | main.rs:128:1:147:1 | mod m7 | -| main.rs:785:5:785:9 | ...::f | main.rs:139:5:146:5 | fn f | -| main.rs:786:5:786:6 | m8 | main.rs:149:1:203:1 | mod m8 | -| main.rs:786:5:786:9 | ...::g | main.rs:187:5:202:5 | fn g | -| main.rs:787:5:787:6 | m9 | main.rs:205:1:213:1 | mod m9 | -| main.rs:787:5:787:9 | ...::f | main.rs:208:5:212:5 | fn f | -| main.rs:788:5:788:7 | m11 | main.rs:236:1:273:1 | mod m11 | -| main.rs:788:5:788:10 | ...::f | main.rs:241:5:244:5 | fn f | -| main.rs:789:5:789:7 | m15 | main.rs:304:1:373:1 | mod m15 | -| main.rs:789:5:789:10 | ...::f | main.rs:360:5:372:5 | fn f | -| main.rs:790:5:790:7 | m16 | main.rs:375:1:467:1 | mod m16 | -| main.rs:790:5:790:10 | ...::f | main.rs:442:5:466:5 | fn f | -| main.rs:791:5:791:20 | trait_visibility | main.rs:469:1:519:1 | mod trait_visibility | -| main.rs:791:5:791:23 | ...::f | main.rs:496:5:518:5 | fn f | -| main.rs:792:5:792:7 | m17 | main.rs:521:1:551:1 | mod m17 | -| main.rs:792:5:792:10 | ...::f | main.rs:545:5:550:5 | fn f | -| main.rs:793:5:793:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | -| main.rs:793:5:793:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | -| main.rs:794:5:794:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | -| main.rs:794:5:794:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | -| main.rs:795:5:795:7 | my3 | my2/mod.rs:18:1:18:12 | mod my3 | -| main.rs:795:5:795:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | -| main.rs:796:5:796:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | -| main.rs:797:5:797:7 | m18 | main.rs:553:1:571:1 | mod m18 | -| main.rs:797:5:797:12 | ...::m19 | main.rs:558:5:570:5 | mod m19 | -| main.rs:797:5:797:17 | ...::m20 | main.rs:563:9:569:9 | mod m20 | -| main.rs:797:5:797:20 | ...::g | main.rs:564:13:568:13 | fn g | -| main.rs:798:5:798:7 | m23 | main.rs:600:1:625:1 | mod m23 | -| main.rs:798:5:798:10 | ...::f | main.rs:620:5:624:5 | fn f | -| main.rs:799:5:799:7 | m24 | main.rs:627:1:695:1 | mod m24 | -| main.rs:799:5:799:10 | ...::f | main.rs:681:5:694:5 | fn f | -| main.rs:800:5:800:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | -| main.rs:800:5:800:11 | ...::h | main.rs:56:1:75:1 | fn h | -| main.rs:801:5:801:13 | z_changed | main.rs:700:1:700:8 | fn z_changed | -| main.rs:802:5:802:11 | AStruct | main.rs:702:1:702:17 | struct AStruct | -| main.rs:802:5:802:22 | ...::z_on_type | main.rs:706:5:706:16 | fn z_on_type | -| main.rs:803:5:803:11 | AStruct | main.rs:702:1:702:17 | struct AStruct | +| main.rs:778:7:778:16 | proc_macro | proc_macro.rs:0:0:0:0 | Crate(proc_macro@0.0.1) | +| main.rs:778:7:778:26 | ...::identity | proc_macro.rs:15:1:18:1 | fn identity | +| main.rs:779:10:779:15 | ATrait | main.rs:774:5:776:5 | trait ATrait | +| main.rs:779:21:779:23 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:781:11:781:13 | i64 | {EXTERNAL LOCATION} | struct i64 | +| main.rs:787:17:787:19 | Foo | main.rs:772:5:772:15 | struct Foo | +| main.rs:787:17:787:19 | Foo | main.rs:779:27:782:9 | type Foo | +| main.rs:792:5:792:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:792:5:792:14 | ...::nested | my.rs:1:1:1:15 | mod nested | +| main.rs:792:5:792:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | +| main.rs:792:5:792:32 | ...::nested2 | my/nested.rs:2:5:11:5 | mod nested2 | +| main.rs:792:5:792:35 | ...::f | my/nested.rs:3:9:5:9 | fn f | +| main.rs:793:5:793:6 | my | main.rs:1:1:1:7 | mod my | +| main.rs:793:5:793:9 | ...::f | my.rs:5:1:7:1 | fn f | +| main.rs:794:5:794:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | +| main.rs:794:5:794:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | +| main.rs:794:5:794:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | +| main.rs:794:5:794:32 | ...::f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:795:5:795:5 | f | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:796:5:796:5 | g | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:797:5:797:9 | crate | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:797:5:797:12 | ...::h | main.rs:56:1:75:1 | fn h | +| main.rs:798:5:798:6 | m1 | main.rs:19:1:43:1 | mod m1 | +| main.rs:798:5:798:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 | +| main.rs:798:5:798:13 | ...::g | main.rs:29:9:33:9 | fn g | +| main.rs:799:5:799:6 | m1 | main.rs:19:1:43:1 | mod m1 | +| main.rs:799:5:799:10 | ...::m2 | main.rs:24:5:42:5 | mod m2 | +| main.rs:799:5:799:14 | ...::m3 | main.rs:35:9:41:9 | mod m3 | +| main.rs:799:5:799:17 | ...::h | main.rs:36:27:40:13 | fn h | +| main.rs:800:5:800:6 | m4 | main.rs:45:1:52:1 | mod m4 | +| main.rs:800:5:800:9 | ...::i | main.rs:48:5:51:5 | fn i | +| main.rs:801:5:801:5 | h | main.rs:56:1:75:1 | fn h | +| main.rs:802:5:802:11 | f_alias | my2/nested2.rs:3:9:5:9 | fn f | +| main.rs:803:5:803:11 | g_alias | my2/nested2.rs:7:9:9:9 | fn g | +| main.rs:804:5:804:5 | j | main.rs:103:1:107:1 | fn j | +| main.rs:805:5:805:6 | m6 | main.rs:115:1:126:1 | mod m6 | +| main.rs:805:5:805:9 | ...::g | main.rs:120:5:125:5 | fn g | +| main.rs:806:5:806:6 | m7 | main.rs:128:1:147:1 | mod m7 | +| main.rs:806:5:806:9 | ...::f | main.rs:139:5:146:5 | fn f | +| main.rs:807:5:807:6 | m8 | main.rs:149:1:203:1 | mod m8 | +| main.rs:807:5:807:9 | ...::g | main.rs:187:5:202:5 | fn g | +| main.rs:808:5:808:6 | m9 | main.rs:205:1:213:1 | mod m9 | +| main.rs:808:5:808:9 | ...::f | main.rs:208:5:212:5 | fn f | +| main.rs:809:5:809:7 | m11 | main.rs:236:1:273:1 | mod m11 | +| main.rs:809:5:809:10 | ...::f | main.rs:241:5:244:5 | fn f | +| main.rs:810:5:810:7 | m15 | main.rs:304:1:373:1 | mod m15 | +| main.rs:810:5:810:10 | ...::f | main.rs:360:5:372:5 | fn f | +| main.rs:811:5:811:7 | m16 | main.rs:375:1:467:1 | mod m16 | +| main.rs:811:5:811:10 | ...::f | main.rs:442:5:466:5 | fn f | +| main.rs:812:5:812:20 | trait_visibility | main.rs:469:1:519:1 | mod trait_visibility | +| main.rs:812:5:812:23 | ...::f | main.rs:496:5:518:5 | fn f | +| main.rs:813:5:813:7 | m17 | main.rs:521:1:551:1 | mod m17 | +| main.rs:813:5:813:10 | ...::f | main.rs:545:5:550:5 | fn f | +| main.rs:814:5:814:11 | nested6 | my2/nested2.rs:14:5:18:5 | mod nested6 | +| main.rs:814:5:814:14 | ...::f | my2/nested2.rs:15:9:17:9 | fn f | +| main.rs:815:5:815:11 | nested8 | my2/nested2.rs:22:5:26:5 | mod nested8 | +| main.rs:815:5:815:14 | ...::f | my2/nested2.rs:23:9:25:9 | fn f | +| main.rs:816:5:816:7 | my3 | my2/mod.rs:18:1:18:12 | mod my3 | +| main.rs:816:5:816:10 | ...::f | my2/my3/mod.rs:1:1:5:1 | fn f | +| main.rs:817:5:817:12 | nested_f | my/my4/my5/mod.rs:1:1:3:1 | fn f | +| main.rs:818:5:818:7 | m18 | main.rs:553:1:571:1 | mod m18 | +| main.rs:818:5:818:12 | ...::m19 | main.rs:558:5:570:5 | mod m19 | +| main.rs:818:5:818:17 | ...::m20 | main.rs:563:9:569:9 | mod m20 | +| main.rs:818:5:818:20 | ...::g | main.rs:564:13:568:13 | fn g | +| main.rs:819:5:819:7 | m23 | main.rs:600:1:625:1 | mod m23 | +| main.rs:819:5:819:10 | ...::f | main.rs:620:5:624:5 | fn f | +| main.rs:820:5:820:7 | m24 | main.rs:627:1:695:1 | mod m24 | +| main.rs:820:5:820:10 | ...::f | main.rs:681:5:694:5 | fn f | +| main.rs:821:5:821:8 | zelf | main.rs:0:0:0:0 | Crate(main@0.0.1) | +| main.rs:821:5:821:11 | ...::h | main.rs:56:1:75:1 | fn h | +| main.rs:822:5:822:13 | z_changed | main.rs:700:1:700:8 | fn z_changed | +| main.rs:823:5:823:11 | AStruct | main.rs:702:1:702:17 | struct AStruct | +| main.rs:823:5:823:22 | ...::z_on_type | main.rs:706:5:706:16 | fn z_on_type | +| main.rs:824:5:824:11 | AStruct | main.rs:702:1:702:17 | struct AStruct | +| main.rs:825:5:825:29 | impl_with_attribute_macro | main.rs:770:1:789:1 | mod impl_with_attribute_macro | +| main.rs:825:5:825:35 | ...::test | main.rs:785:5:788:5 | fn test | | my2/mod.rs:5:5:5:11 | nested2 | my2/mod.rs:1:1:1:16 | mod nested2 | | my2/mod.rs:5:5:5:20 | ...::nested3 | my2/nested2.rs:1:1:11:1 | mod nested3 | | my2/mod.rs:5:5:5:29 | ...::nested4 | my2/nested2.rs:2:5:10:5 | mod nested4 | @@ -436,7 +446,7 @@ resolvePath | my2/my3/mod.rs:3:5:3:5 | g | my2/mod.rs:3:1:6:1 | fn g | | my2/my3/mod.rs:4:5:4:5 | h | main.rs:56:1:75:1 | fn h | | my2/my3/mod.rs:7:5:7:9 | super | my2/mod.rs:1:1:23:34 | SourceFile | -| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:804:2 | SourceFile | +| my2/my3/mod.rs:7:5:7:16 | ...::super | main.rs:1:1:826:2 | SourceFile | | my2/my3/mod.rs:7:5:7:19 | ...::h | main.rs:56:1:75:1 | fn h | | my2/my3/mod.rs:8:5:8:9 | super | my2/mod.rs:1:1:23:34 | SourceFile | | my2/my3/mod.rs:8:5:8:12 | ...::g | my2/mod.rs:3:1:6:1 | fn g | @@ -482,4 +492,7 @@ resolvePath | proc_macro.rs:8:21:8:23 | syn | {EXTERNAL LOCATION} | Crate(syn@2.0.103) | | proc_macro.rs:8:21:8:30 | ...::Ident | {EXTERNAL LOCATION} | struct Ident | | proc_macro.rs:8:21:8:35 | ...::new | {EXTERNAL LOCATION} | fn new | +| proc_macro.rs:16:24:16:34 | TokenStream | {EXTERNAL LOCATION} | struct TokenStream | +| proc_macro.rs:16:43:16:53 | TokenStream | {EXTERNAL LOCATION} | struct TokenStream | +| proc_macro.rs:16:59:16:69 | TokenStream | {EXTERNAL LOCATION} | struct TokenStream | testFailures diff --git a/rust/ql/test/library-tests/path-resolution/proc_macro.rs b/rust/ql/test/library-tests/path-resolution/proc_macro.rs index c95fc6fe640..11e3a7024ae 100644 --- a/rust/ql/test/library-tests/path-resolution/proc_macro.rs +++ b/rust/ql/test/library-tests/path-resolution/proc_macro.rs @@ -8,5 +8,11 @@ pub fn add_suffix(attr: TokenStream, item: TokenStream) -> TokenStream { ast.sig.ident = syn::Ident::new(&format!("{}_{}", ast.sig.ident, suff), ast.sig.ident.span()); quote! { #ast - }.into() + } + .into() +} + +#[proc_macro_attribute] +pub fn identity(_attr: TokenStream, item: TokenStream) -> TokenStream { + item } From d88bc8e4086b3d90e80601b8489ed521c3cacdb2 Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Fri, 19 Sep 2025 14:23:40 +0200 Subject: [PATCH 41/49] JS: Add test case for `GraphQLObjectType` --- .../CWE-094/CodeInjection/graph-ql.js | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js index f68f47cf3ac..c4b68e16990 100644 --- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js @@ -1,5 +1,5 @@ const express = require('express'); -const { graphql, buildSchema } = require('graphql'); +const { graphql, buildSchema, GraphQLObjectType, GraphQLString } = require('graphql'); const app = express(); app.use(express.json()); @@ -53,4 +53,30 @@ app.post('/graphql', async (req, res) => { rootValue: root1, variableValues: variables }); + + const MutationType = new GraphQLObjectType({ + name: 'Mutation', + fields: { + runEval: { + type: GraphQLString, + args: { + value: { type: GraphQLString } + }, + resolve: (_, { value }, context) => { // $ MISSING: Source[js/code-injection] + return eval(value); // $ MISSING: Alert[js/code-injection] + } + } + } + }); + + const schema = new GraphQLSchema({ + query: QueryType, + mutation: MutationType + }); + + await graphql({ + schema, + source: query, + variableValues: variables + }); }); From 60ceb89f01be59ecba08fc972d5a9bdd84e11ff2 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Fri, 19 Sep 2025 13:26:36 +0200 Subject: [PATCH 42/49] Rust: Add debug predicate for `ItemNode` --- rust/ql/lib/codeql/rust/internal/PathResolution.qll | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 980033811dd..6b7df0db58a 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1807,6 +1807,8 @@ private module Debug { path = p.toStringDebug() } + predicate debugItemNode(ItemNode item) { item = getRelevantLocatable() } + ItemNode debugResolvePath(RelevantPath path) { path = getRelevantLocatable() and result = resolvePath(path) From 72103adacc7cf9712acd464a38adebeb240d5fb5 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Fri, 19 Sep 2025 13:27:02 +0200 Subject: [PATCH 43/49] Rust: Fix spurious path resolution The annotated impl block was filtered away, but it's children where not. This caused the associated type `Foo` to appear as if it was an item in the scope outside of the impl block. --- .../codeql/rust/internal/PathResolution.qll | 20 ++++++++++++++++++- .../library-tests/path-resolution/main.rs | 2 +- .../path-resolution/path-resolution.expected | 1 - 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 6b7df0db58a..46197b6189e 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -78,6 +78,24 @@ private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind ki ) } +/** + * Holds if `n` is superceded by an attribute macro expansion. That is, `n` is + * an item or a transitive child of an item with an attribute macro expansion. + */ +predicate supercededByAttributeMacroExpansion(AstNode n) { + n.(Item).hasAttributeMacroExpansion() + or + exists(AstNode parent | + n.getParentNode() = parent and + supercededByAttributeMacroExpansion(parent) and + // Don't exclude expansions themselves as they supercede other nodes. + not n = parent.(Item).getAttributeMacroExpansion() and + // Don't consider attributes themselves to be superceded. E.g., in `#[a] fn + // f() {}` the macro expansion supercedes `fn f() {}` but not `#[a]`. + not n instanceof Attr + ) +} + /** * An item that may be referred to by a path, and which is a node in * the _item graph_. @@ -158,7 +176,7 @@ private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind ki abstract class ItemNode extends Locatable { ItemNode() { // Exclude items that are superceded by the expansion of an attribute macro. - not this.(Item).hasAttributeMacroExpansion() + not supercededByAttributeMacroExpansion(this) } /** Gets the (original) name of this item. */ diff --git a/rust/ql/test/library-tests/path-resolution/main.rs b/rust/ql/test/library-tests/path-resolution/main.rs index 42107ec5fd4..9051f7f8412 100644 --- a/rust/ql/test/library-tests/path-resolution/main.rs +++ b/rust/ql/test/library-tests/path-resolution/main.rs @@ -784,7 +784,7 @@ mod impl_with_attribute_macro { pub fn test() { // This should resolve to the struct, not the associated type. - let _x: Foo; // $ item=IFoo SPURIOUS: item=IATrait_i64_Foo + let _x: Foo; // $ item=IFoo } // impl_with_attribute_macro::test } diff --git a/rust/ql/test/library-tests/path-resolution/path-resolution.expected b/rust/ql/test/library-tests/path-resolution/path-resolution.expected index e9bb668f681..a908ec1e5c1 100644 --- a/rust/ql/test/library-tests/path-resolution/path-resolution.expected +++ b/rust/ql/test/library-tests/path-resolution/path-resolution.expected @@ -356,7 +356,6 @@ resolvePath | main.rs:779:21:779:23 | i64 | {EXTERNAL LOCATION} | struct i64 | | main.rs:781:11:781:13 | i64 | {EXTERNAL LOCATION} | struct i64 | | main.rs:787:17:787:19 | Foo | main.rs:772:5:772:15 | struct Foo | -| main.rs:787:17:787:19 | Foo | main.rs:779:27:782:9 | type Foo | | main.rs:792:5:792:6 | my | main.rs:1:1:1:7 | mod my | | main.rs:792:5:792:14 | ...::nested | my.rs:1:1:1:15 | mod nested | | main.rs:792:5:792:23 | ...::nested1 | my/nested.rs:1:1:17:1 | mod nested1 | From afb6d307624ce482bf7f6f09c18b29353829bd34 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Fri, 19 Sep 2025 14:27:14 +0200 Subject: [PATCH 44/49] Rust: Fix typo in superseded --- rust/ql/lib/codeql/rust/internal/PathResolution.qll | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 46197b6189e..44e8b452255 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -79,18 +79,18 @@ private ItemNode getAChildSuccessor(ItemNode item, string name, SuccessorKind ki } /** - * Holds if `n` is superceded by an attribute macro expansion. That is, `n` is + * Holds if `n` is superseded by an attribute macro expansion. That is, `n` is * an item or a transitive child of an item with an attribute macro expansion. */ -predicate supercededByAttributeMacroExpansion(AstNode n) { +predicate supersededByAttributeMacroExpansion(AstNode n) { n.(Item).hasAttributeMacroExpansion() or exists(AstNode parent | n.getParentNode() = parent and - supercededByAttributeMacroExpansion(parent) and + supersededByAttributeMacroExpansion(parent) and // Don't exclude expansions themselves as they supercede other nodes. not n = parent.(Item).getAttributeMacroExpansion() and - // Don't consider attributes themselves to be superceded. E.g., in `#[a] fn + // Don't consider attributes themselves to be superseded. E.g., in `#[a] fn // f() {}` the macro expansion supercedes `fn f() {}` but not `#[a]`. not n instanceof Attr ) @@ -175,8 +175,8 @@ predicate supercededByAttributeMacroExpansion(AstNode n) { */ abstract class ItemNode extends Locatable { ItemNode() { - // Exclude items that are superceded by the expansion of an attribute macro. - not supercededByAttributeMacroExpansion(this) + // Exclude items that are superseded by the expansion of an attribute macro. + not supersededByAttributeMacroExpansion(this) } /** Gets the (original) name of this item. */ From 6cfc95015921ab781e16f36ac2ba5ba9a57187ae Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Fri, 19 Sep 2025 14:39:36 +0200 Subject: [PATCH 45/49] JS: Model `GraphQLObjectType` resolve params as sources --- javascript/ql/lib/ext/graph-ql.model.yml | 5 +++++ .../Security/CWE-094/CodeInjection/CodeInjection.expected | 6 ++++++ .../CodeInjection/HeuristicSourceCodeInjection.expected | 5 +++++ .../query-tests/Security/CWE-094/CodeInjection/graph-ql.js | 4 ++-- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/javascript/ql/lib/ext/graph-ql.model.yml b/javascript/ql/lib/ext/graph-ql.model.yml index 08233d1135d..2ea1c41ed9f 100644 --- a/javascript/ql/lib/ext/graph-ql.model.yml +++ b/javascript/ql/lib/ext/graph-ql.model.yml @@ -4,3 +4,8 @@ extensions: extensible: summaryModel data: - ["graphql", "Member[graphql]", "Argument[0].Member[source,variableValues]", "Argument[0].Member[rootValue].AnyMember.Parameter[0]", "taint"] + - addsTo: + pack: codeql/javascript-all + extensible: sourceModel + data: + - ["graphql", "Member[GraphQLObjectType].Argument[0].Member[fields].AnyMember.Member[resolve].Parameter[1]", "remote"] diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected index 3f5d8abed8a..fb3e4ad6e6a 100644 --- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/CodeInjection.expected @@ -63,6 +63,7 @@ | fastify.js:108:28:108:50 | reply.l ... tedCode | fastify.js:94:29:94:51 | request ... plyCode | fastify.js:108:28:108:50 | reply.l ... tedCode | This code execution depends on a $@. | fastify.js:94:29:94:51 | request ... plyCode | user-provided value | | graph-ql.js:20:19:20:22 | expr | graph-ql.js:28:32:28:39 | req.body | graph-ql.js:20:19:20:22 | expr | This code execution depends on a $@. | graph-ql.js:28:32:28:39 | req.body | user-provided value | | graph-ql.js:39:19:39:30 | name + title | graph-ql.js:28:32:28:39 | req.body | graph-ql.js:39:19:39:30 | name + title | This code execution depends on a $@. | graph-ql.js:28:32:28:39 | req.body | user-provided value | +| graph-ql.js:66:23:66:27 | value | graph-ql.js:65:22:65:30 | { value } | graph-ql.js:66:23:66:27 | value | This code execution depends on a $@. | graph-ql.js:65:22:65:30 | { value } | user-provided value | | module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | module.js:9:16:9:29 | req.query.code | This code execution depends on a $@. | module.js:9:16:9:29 | req.query.code | user-provided value | | module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | module.js:11:17:11:30 | req.query.code | This code execution depends on a $@. | module.js:11:17:11:30 | req.query.code | user-provided value | | react-native.js:8:32:8:38 | tainted | react-native.js:7:17:7:33 | req.param("code") | react-native.js:8:32:8:38 | tainted | This code execution depends on a $@. | react-native.js:7:17:7:33 | req.param("code") | user-provided value | @@ -173,6 +174,8 @@ edges | graph-ql.js:39:19:39:22 | name | graph-ql.js:39:19:39:30 | name + title | provenance | | | graph-ql.js:39:26:39:30 | title | graph-ql.js:39:19:39:30 | name + title | provenance | | | graph-ql.js:54:21:54:29 | variables | graph-ql.js:38:13:38:27 | { name, title } | provenance | | +| graph-ql.js:65:22:65:30 | { value } | graph-ql.js:65:24:65:28 | value | provenance | | +| graph-ql.js:65:24:65:28 | value | graph-ql.js:66:23:66:27 | value | provenance | | | react-native.js:7:7:7:13 | tainted | react-native.js:8:32:8:38 | tainted | provenance | | | react-native.js:7:7:7:13 | tainted | react-native.js:10:23:10:29 | tainted | provenance | | | react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:13 | tainted | provenance | | @@ -323,6 +326,9 @@ nodes | graph-ql.js:39:19:39:30 | name + title | semmle.label | name + title | | graph-ql.js:39:26:39:30 | title | semmle.label | title | | graph-ql.js:54:21:54:29 | variables | semmle.label | variables | +| graph-ql.js:65:22:65:30 | { value } | semmle.label | { value } | +| graph-ql.js:65:24:65:28 | value | semmle.label | value | +| graph-ql.js:66:23:66:27 | value | semmle.label | value | | module.js:9:16:9:29 | req.query.code | semmle.label | req.query.code | | module.js:11:17:11:30 | req.query.code | semmle.label | req.query.code | | react-native.js:7:7:7:13 | tainted | semmle.label | tainted | diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected index 3d4022d8fb6..837ae37eaee 100644 --- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/HeuristicSourceCodeInjection.expected @@ -72,6 +72,8 @@ edges | graph-ql.js:39:19:39:22 | name | graph-ql.js:39:19:39:30 | name + title | provenance | | | graph-ql.js:39:26:39:30 | title | graph-ql.js:39:19:39:30 | name + title | provenance | | | graph-ql.js:54:21:54:29 | variables | graph-ql.js:38:13:38:27 | { name, title } | provenance | | +| graph-ql.js:65:22:65:30 | { value } | graph-ql.js:65:24:65:28 | value | provenance | | +| graph-ql.js:65:24:65:28 | value | graph-ql.js:66:23:66:27 | value | provenance | | | react-native.js:7:7:7:13 | tainted | react-native.js:8:32:8:38 | tainted | provenance | | | react-native.js:7:7:7:13 | tainted | react-native.js:10:23:10:29 | tainted | provenance | | | react-native.js:7:17:7:33 | req.param("code") | react-native.js:7:7:7:13 | tainted | provenance | | @@ -224,6 +226,9 @@ nodes | graph-ql.js:39:19:39:30 | name + title | semmle.label | name + title | | graph-ql.js:39:26:39:30 | title | semmle.label | title | | graph-ql.js:54:21:54:29 | variables | semmle.label | variables | +| graph-ql.js:65:22:65:30 | { value } | semmle.label | { value } | +| graph-ql.js:65:24:65:28 | value | semmle.label | value | +| graph-ql.js:66:23:66:27 | value | semmle.label | value | | module.js:9:16:9:29 | req.query.code | semmle.label | req.query.code | | module.js:11:17:11:30 | req.query.code | semmle.label | req.query.code | | react-native.js:7:7:7:13 | tainted | semmle.label | tainted | diff --git a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js index c4b68e16990..167292330d2 100644 --- a/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js +++ b/javascript/ql/test/query-tests/Security/CWE-094/CodeInjection/graph-ql.js @@ -62,8 +62,8 @@ app.post('/graphql', async (req, res) => { args: { value: { type: GraphQLString } }, - resolve: (_, { value }, context) => { // $ MISSING: Source[js/code-injection] - return eval(value); // $ MISSING: Alert[js/code-injection] + resolve: (_, { value }, context) => { // $ Source[js/code-injection] + return eval(value); // $ Alert[js/code-injection] } } } From 3a6a537986133f24bfecbde3f2c770952e4d4642 Mon Sep 17 00:00:00 2001 From: Napalys Klicius Date: Fri, 19 Sep 2025 14:46:13 +0200 Subject: [PATCH 46/49] JS: Add change note --- .../ql/lib/change-notes/2025-09-19-graphql-type-object.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 javascript/ql/lib/change-notes/2025-09-19-graphql-type-object.md diff --git a/javascript/ql/lib/change-notes/2025-09-19-graphql-type-object.md b/javascript/ql/lib/change-notes/2025-09-19-graphql-type-object.md new file mode 100644 index 00000000000..6afa4ece331 --- /dev/null +++ b/javascript/ql/lib/change-notes/2025-09-19-graphql-type-object.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added modeling of `GraphQLObjectType` resolver function parameters as remote sources. From c26a07bb1008a8122e6f39d8df24a128fc4c6e4c Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Fri, 19 Sep 2025 16:49:54 +0100 Subject: [PATCH 47/49] Apply suggestions from code review Co-authored-by: Simon Friis Vindum --- rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp index e4e0fc5eaa9..088f202965a 100644 --- a/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp +++ b/rust/ql/src/queries/security/CWE-319/UseOfHttp.qhelp @@ -4,7 +4,7 @@ -

    Constructing URLs with the HTTP protocol can lead to unsecured connections.

    +

    Constructing URLs with the HTTP protocol can lead to insecure connections.

    Furthermore, constructing URLs with the HTTP protocol can create problems if other parts of the code expect HTTPS URLs. A typical pattern is to use libraries that expect secure connections, @@ -14,7 +14,7 @@ which may fail or fall back to insecure behavior when provided with HTTP URLs in

    When you construct a URL for network requests, ensure that you use an HTTPS URL rather than an HTTP URL. -Then, any connections that are made using that URL are secure SSL/TLS connections.

    +Then, any connections that are made using that URL are secure TLS connections.

    @@ -26,7 +26,7 @@ by attackers:

    A better approach is to use HTTPS. When the request is made using an HTTPS URL, the connection -is a secure SSL/TLS connection:

    +is a secure TLS connection:

    From 223ab5e60cc654b3255520c581ba8cdbd9716335 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Sun, 21 Sep 2025 15:22:40 +0200 Subject: [PATCH 48/49] Rust: Add missing model --- rust/ql/lib/codeql/rust/frameworks/async-rs.model.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rust/ql/lib/codeql/rust/frameworks/async-rs.model.yml b/rust/ql/lib/codeql/rust/frameworks/async-rs.model.yml index 9e65ba1b196..706170d44b8 100644 --- a/rust/ql/lib/codeql/rust/frameworks/async-rs.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/async-rs.model.yml @@ -4,3 +4,9 @@ extensions: extensible: sourceModel data: - ["::connect", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "remote", "manual"] + - addsTo: + pack: codeql/rust-all + extensible: summaryModel + data: + - ["<_ as async_std::io::read::ReadExt>::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] + - ["<_ as async_std::io::read::ReadExt>::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] \ No newline at end of file From 8d5d219c0f1d5372249c12a6f59ef3bf1046cd04 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Sun, 21 Sep 2025 15:36:22 +0200 Subject: [PATCH 49/49] Rust: Update expected test output --- .../dataflow/sources/InlineFlow.expected | 600 +++++++++--------- 1 file changed, 308 insertions(+), 292 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected index db0cb969d5a..af0e73ca2c0 100644 --- a/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/InlineFlow.expected @@ -33,108 +33,110 @@ models | 32 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | | 33 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | | 34 | Source: tokio::io::stdin::stdin; ReturnValue; stdin | -| 35 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | -| 36 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | -| 37 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 38 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | -| 39 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 40 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 41 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | -| 42 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 43 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | -| 44 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | -| 45 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 46 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 47 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 48 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint | -| 49 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint | -| 50 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint | -| 51 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint | -| 52 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | -| 53 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint | -| 54 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint | -| 55 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint | -| 56 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint | -| 57 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 58 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 59 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | -| 60 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 61 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint | -| 62 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | -| 63 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | -| 64 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint | -| 65 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | -| 66 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint | -| 67 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint | -| 68 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 69 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 70 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 71 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 72 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 73 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 74 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 75 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 76 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 77 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 78 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 79 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value | -| 80 | Summary: ::new; Argument[0]; ReturnValue; value | -| 81 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 82 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 83 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | -| 84 | Summary: ::as_str; Argument[self]; ReturnValue; value | -| 85 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 86 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 87 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 88 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 89 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 90 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 91 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 92 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 93 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 94 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 95 | Summary: ::read; Argument[self]; Argument[0]; taint | -| 96 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 97 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint | -| 98 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 99 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | -| 100 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint | -| 101 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 102 | Summary: ::buffer; Argument[self]; ReturnValue; taint | -| 103 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 104 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 105 | Summary: ::read; Argument[self]; Argument[0]; taint | -| 106 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint | -| 107 | Summary: ::read_exact; Argument[self]; Argument[0]; taint | -| 108 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | -| 109 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 110 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | -| 111 | Summary: ::lock; Argument[self]; ReturnValue; taint | -| 112 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | -| 113 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | -| 114 | Summary: ::as_path; Argument[self]; ReturnValue; value | -| 115 | Summary: ::buffer; Argument[self]; ReturnValue; taint | -| 116 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 117 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 118 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 119 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint | -| 120 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint | -| 121 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint | +| 35 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 36 | Summary: <_ as async_std::io::read::ReadExt>::read; Argument[self]; Argument[0].Reference; taint | +| 37 | Summary: <_ as core::clone::Clone>::clone; Argument[self].Reference; ReturnValue; value | +| 38 | Summary: <_ as core::iter::traits::iterator::Iterator>::collect; Argument[self].Element; ReturnValue.Element; value | +| 39 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 40 | Summary: <_ as futures_io::if_std::AsyncBufRead>::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | +| 41 | Summary: <_ as futures_util::io::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 42 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 43 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | +| 44 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 45 | Summary: <_ as futures_util::io::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | +| 46 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self].Reference; Argument[0].Reference; taint | +| 47 | Summary: <_ as futures_util::io::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | +| 48 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 49 | Summary: <_ as futures_util::io::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 50 | Summary: <_ as std::io::BufRead>::lines; Argument[self]; ReturnValue; taint | +| 51 | Summary: <_ as std::io::BufRead>::read_line; Argument[self]; Argument[0].Reference; taint | +| 52 | Summary: <_ as std::io::BufRead>::read_until; Argument[self]; Argument[1].Reference; taint | +| 53 | Summary: <_ as std::io::BufRead>::split; Argument[self]; ReturnValue; taint | +| 54 | Summary: <_ as std::io::Read>::bytes; Argument[self]; ReturnValue; taint | +| 55 | Summary: <_ as std::io::Read>::chain; Argument[0]; ReturnValue; taint | +| 56 | Summary: <_ as std::io::Read>::chain; Argument[self]; ReturnValue; taint | +| 57 | Summary: <_ as std::io::Read>::read; Argument[self]; Argument[0].Reference; taint | +| 58 | Summary: <_ as std::io::Read>::read_exact; Argument[self]; Argument[0].Reference; taint | +| 59 | Summary: <_ as std::io::Read>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 60 | Summary: <_ as std::io::Read>::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 61 | Summary: <_ as std::io::Read>::take; Argument[self]; ReturnValue; taint | +| 62 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::fill_buf; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 63 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::lines; Argument[self]; ReturnValue; taint | +| 64 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_line; Argument[self]; Argument[0].Reference; taint | +| 65 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::read_until; Argument[self]; Argument[1].Reference; taint | +| 66 | Summary: <_ as tokio::io::util::async_buf_read_ext::AsyncBufReadExt>::split; Argument[self]; ReturnValue; taint | +| 67 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read; Argument[self]; Argument[0].Reference; taint | +| 68 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_buf; Argument[self]; Argument[0].Reference; taint | +| 69 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_exact; Argument[self]; Argument[0].Reference; taint | +| 70 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_f32; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 71 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i16; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 72 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_i64_le; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 73 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 74 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 75 | Summary: <_ as tokio::io::util::async_read_ext::AsyncReadExt>::read_u8; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 76 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 77 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 78 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 79 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 80 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 81 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::__pointer]; value | +| 82 | Summary: ::new; Argument[0]; ReturnValue; value | +| 83 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 84 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 85 | Summary: ::as_bytes; Argument[self]; ReturnValue; value | +| 86 | Summary: ::as_str; Argument[self]; ReturnValue; value | +| 87 | Summary: ::parse; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 88 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 89 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 90 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 91 | Summary: ::chunk; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 92 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 93 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 94 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 95 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 96 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 97 | Summary: ::read; Argument[self]; Argument[0]; taint | +| 98 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 99 | Summary: ::read_to_end; Argument[self]; Argument[0]; taint | +| 100 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 101 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | +| 102 | Summary: ::next; Argument[self]; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; taint | +| 103 | Summary: ::fill_buf; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 104 | Summary: ::buffer; Argument[self]; ReturnValue; taint | +| 105 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 106 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 107 | Summary: ::read; Argument[self]; Argument[0]; taint | +| 108 | Summary: ::read_exact; Argument[self]; Argument[0].Reference; taint | +| 109 | Summary: ::read_exact; Argument[self]; Argument[0]; taint | +| 110 | Summary: ::read_to_end; Argument[self]; Argument[0].Reference; taint | +| 111 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 112 | Summary: ::read_to_string; Argument[self]; Argument[0]; taint | +| 113 | Summary: ::lock; Argument[self]; ReturnValue; taint | +| 114 | Summary: ::read_to_string; Argument[self]; Argument[0].Reference; taint | +| 115 | Summary: ::read; Argument[self]; Argument[0].Reference; taint | +| 116 | Summary: ::as_path; Argument[self]; ReturnValue; value | +| 117 | Summary: ::buffer; Argument[self]; ReturnValue; taint | +| 118 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 119 | Summary: ::next_line; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 120 | Summary: ::next_segment; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 121 | Summary: ::peek; Argument[self]; Argument[0].Reference; taint | +| 122 | Summary: ::try_read; Argument[self]; Argument[0].Reference; taint | +| 123 | Summary: ::try_read_buf; Argument[self]; Argument[0].Reference; taint | edges | test.rs:8:10:8:22 | ...::var | test.rs:8:10:8:30 | ...::var(...) | provenance | Src:MaD:23 | | test.rs:9:10:9:25 | ...::var_os | test.rs:9:10:9:33 | ...::var_os(...) | provenance | Src:MaD:24 | | test.rs:11:9:11:12 | var1 | test.rs:14:10:14:13 | var1 | provenance | | | test.rs:11:16:11:28 | ...::var | test.rs:11:16:11:36 | ...::var(...) [Ok] | provenance | Src:MaD:23 | -| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:81 | +| test.rs:11:16:11:36 | ...::var(...) [Ok] | test.rs:11:16:11:59 | ... .expect(...) | provenance | MaD:83 | | test.rs:11:16:11:59 | ... .expect(...) | test.rs:11:9:11:12 | var1 | provenance | | | test.rs:12:9:12:12 | var2 | test.rs:15:10:15:13 | var2 | provenance | | | test.rs:12:16:12:31 | ...::var_os | test.rs:12:16:12:39 | ...::var_os(...) [Some] | provenance | Src:MaD:24 | -| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:77 | +| test.rs:12:16:12:39 | ...::var_os(...) [Some] | test.rs:12:16:12:48 | ... .unwrap() | provenance | MaD:79 | | test.rs:12:16:12:48 | ... .unwrap() | test.rs:12:9:12:12 | var2 | provenance | | | test.rs:29:9:29:12 | args [element] | test.rs:30:20:30:23 | args [element] | provenance | | | test.rs:29:9:29:12 | args [element] | test.rs:31:17:31:20 | args [element] | provenance | | | test.rs:29:29:29:42 | ...::args | test.rs:29:29:29:44 | ...::args(...) [element] | provenance | Src:MaD:18 | -| test.rs:29:29:29:44 | ...::args(...) [element] | test.rs:29:29:29:54 | ... .collect() [element] | provenance | MaD:36 | +| test.rs:29:29:29:44 | ...::args(...) [element] | test.rs:29:29:29:54 | ... .collect() [element] | provenance | MaD:38 | | test.rs:29:29:29:54 | ... .collect() [element] | test.rs:29:9:29:12 | args [element] | provenance | | | test.rs:30:9:30:15 | my_path [&ref] | test.rs:36:10:36:16 | my_path | provenance | | | test.rs:30:19:30:26 | &... [&ref] | test.rs:30:9:30:15 | my_path [&ref] | provenance | | @@ -146,20 +148,20 @@ edges | test.rs:31:17:31:23 | args[1] | test.rs:31:16:31:23 | &... [&ref] | provenance | | | test.rs:32:9:32:12 | arg2 | test.rs:38:10:38:13 | arg2 | provenance | | | test.rs:32:16:32:29 | ...::args | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:18 | -| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:37 | -| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:77 | +| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:39 | +| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:79 | | test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:9:32:12 | arg2 | provenance | | | test.rs:33:9:33:12 | arg3 | test.rs:39:10:39:13 | arg3 | provenance | | | test.rs:33:16:33:32 | ...::args_os | test.rs:33:16:33:34 | ...::args_os(...) [element] | provenance | Src:MaD:19 | -| test.rs:33:16:33:34 | ...::args_os(...) [element] | test.rs:33:16:33:41 | ... .nth(...) [Some] | provenance | MaD:37 | -| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:77 | +| test.rs:33:16:33:34 | ...::args_os(...) [element] | test.rs:33:16:33:41 | ... .nth(...) [Some] | provenance | MaD:39 | +| test.rs:33:16:33:41 | ... .nth(...) [Some] | test.rs:33:16:33:50 | ... .unwrap() | provenance | MaD:79 | | test.rs:33:16:33:50 | ... .unwrap() | test.rs:33:9:33:12 | arg3 | provenance | | | test.rs:34:9:34:12 | arg4 | test.rs:40:10:40:13 | arg4 | provenance | | | test.rs:34:16:34:29 | ...::args | test.rs:34:16:34:31 | ...::args(...) [element] | provenance | Src:MaD:18 | -| test.rs:34:16:34:31 | ...::args(...) [element] | test.rs:34:16:34:38 | ... .nth(...) [Some] | provenance | MaD:37 | -| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:77 | -| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:85 | -| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:82 | +| test.rs:34:16:34:31 | ...::args(...) [element] | test.rs:34:16:34:38 | ... .nth(...) [Some] | provenance | MaD:39 | +| test.rs:34:16:34:38 | ... .nth(...) [Some] | test.rs:34:16:34:47 | ... .unwrap() | provenance | MaD:79 | +| test.rs:34:16:34:47 | ... .unwrap() | test.rs:34:16:34:64 | ... .parse() [Ok] | provenance | MaD:87 | +| test.rs:34:16:34:64 | ... .parse() [Ok] | test.rs:34:16:34:73 | ... .unwrap() | provenance | MaD:84 | | test.rs:34:16:34:73 | ... .unwrap() | test.rs:34:9:34:12 | arg4 | provenance | | | test.rs:42:9:42:11 | arg | test.rs:43:14:43:16 | arg | provenance | | | test.rs:42:16:42:29 | ...::args | test.rs:42:16:42:31 | ...::args(...) [element] | provenance | Src:MaD:18 | @@ -169,45 +171,45 @@ edges | test.rs:46:16:46:34 | ...::args_os(...) [element] | test.rs:46:9:46:11 | arg | provenance | | | test.rs:52:9:52:11 | dir | test.rs:56:10:56:12 | dir | provenance | | | test.rs:52:15:52:35 | ...::current_dir | test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:20 | -| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:81 | +| test.rs:52:15:52:37 | ...::current_dir(...) [Ok] | test.rs:52:15:52:54 | ... .expect(...) | provenance | MaD:83 | | test.rs:52:15:52:54 | ... .expect(...) | test.rs:52:9:52:11 | dir | provenance | | | test.rs:53:9:53:11 | exe | test.rs:57:10:57:12 | exe | provenance | | | test.rs:53:15:53:35 | ...::current_exe | test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:21 | -| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:81 | +| test.rs:53:15:53:37 | ...::current_exe(...) [Ok] | test.rs:53:15:53:54 | ... .expect(...) | provenance | MaD:83 | | test.rs:53:15:53:54 | ... .expect(...) | test.rs:53:9:53:11 | exe | provenance | | | test.rs:54:9:54:12 | home | test.rs:58:10:58:13 | home | provenance | | | test.rs:54:16:54:33 | ...::home_dir | test.rs:54:16:54:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:22 | -| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:76 | +| test.rs:54:16:54:35 | ...::home_dir(...) [Some] | test.rs:54:16:54:52 | ... .expect(...) | provenance | MaD:78 | | test.rs:54:16:54:52 | ... .expect(...) | test.rs:54:9:54:12 | home | provenance | | | test.rs:62:9:62:22 | remote_string1 | test.rs:63:10:63:23 | remote_string1 | provenance | | | test.rs:62:26:62:47 | ...::get | test.rs:62:26:62:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 | | test.rs:62:26:62:62 | ...::get(...) [Ok] | test.rs:62:26:62:63 | TryExpr | provenance | | -| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:92 | +| test.rs:62:26:62:63 | TryExpr | test.rs:62:26:62:70 | ... .text() [Ok] | provenance | MaD:94 | | test.rs:62:26:62:70 | ... .text() [Ok] | test.rs:62:26:62:71 | TryExpr | provenance | | | test.rs:62:26:62:71 | TryExpr | test.rs:62:9:62:22 | remote_string1 | provenance | | | test.rs:65:9:65:22 | remote_string2 | test.rs:66:10:66:23 | remote_string2 | provenance | | | test.rs:65:26:65:47 | ...::get | test.rs:65:26:65:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 | -| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:82 | -| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:92 | -| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:82 | +| test.rs:65:26:65:62 | ...::get(...) [Ok] | test.rs:65:26:65:71 | ... .unwrap() | provenance | MaD:84 | +| test.rs:65:26:65:71 | ... .unwrap() | test.rs:65:26:65:78 | ... .text() [Ok] | provenance | MaD:94 | +| test.rs:65:26:65:78 | ... .text() [Ok] | test.rs:65:26:65:87 | ... .unwrap() | provenance | MaD:84 | | test.rs:65:26:65:87 | ... .unwrap() | test.rs:65:9:65:22 | remote_string2 | provenance | | | test.rs:68:9:68:22 | remote_string3 | test.rs:69:10:69:23 | remote_string3 | provenance | | | test.rs:68:26:68:47 | ...::get | test.rs:68:26:68:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 | -| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:82 | -| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:93 | -| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:82 | +| test.rs:68:26:68:62 | ...::get(...) [Ok] | test.rs:68:26:68:71 | ... .unwrap() | provenance | MaD:84 | +| test.rs:68:26:68:71 | ... .unwrap() | test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:95 | +| test.rs:68:26:68:98 | ... .text_with_charset(...) [Ok] | test.rs:68:26:68:107 | ... .unwrap() | provenance | MaD:84 | | test.rs:68:26:68:107 | ... .unwrap() | test.rs:68:9:68:22 | remote_string3 | provenance | | | test.rs:71:9:71:22 | remote_string4 | test.rs:72:10:72:23 | remote_string4 | provenance | | | test.rs:71:26:71:47 | ...::get | test.rs:71:26:71:62 | ...::get(...) [Ok] | provenance | Src:MaD:16 | -| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:82 | -| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:91 | -| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:82 | +| test.rs:71:26:71:62 | ...::get(...) [Ok] | test.rs:71:26:71:71 | ... .unwrap() | provenance | MaD:84 | +| test.rs:71:26:71:71 | ... .unwrap() | test.rs:71:26:71:79 | ... .bytes() [Ok] | provenance | MaD:93 | +| test.rs:71:26:71:79 | ... .bytes() [Ok] | test.rs:71:26:71:88 | ... .unwrap() | provenance | MaD:84 | | test.rs:71:26:71:88 | ... .unwrap() | test.rs:71:9:71:22 | remote_string4 | provenance | | | test.rs:74:9:74:22 | remote_string5 | test.rs:75:10:75:23 | remote_string5 | provenance | | | test.rs:74:26:74:37 | ...::get | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:17 | | test.rs:74:26:74:52 | ...::get(...) [future, Ok] | test.rs:74:26:74:58 | await ... [Ok] | provenance | | | test.rs:74:26:74:58 | await ... [Ok] | test.rs:74:26:74:59 | TryExpr | provenance | | -| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:90 | +| test.rs:74:26:74:59 | TryExpr | test.rs:74:26:74:66 | ... .text() [future, Ok] | provenance | MaD:92 | | test.rs:74:26:74:66 | ... .text() [future, Ok] | test.rs:74:26:74:72 | await ... [Ok] | provenance | | | test.rs:74:26:74:72 | await ... [Ok] | test.rs:74:26:74:73 | TryExpr | provenance | | | test.rs:74:26:74:73 | TryExpr | test.rs:74:9:74:22 | remote_string5 | provenance | | @@ -215,19 +217,19 @@ edges | test.rs:77:26:77:37 | ...::get | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:17 | | test.rs:77:26:77:52 | ...::get(...) [future, Ok] | test.rs:77:26:77:58 | await ... [Ok] | provenance | | | test.rs:77:26:77:58 | await ... [Ok] | test.rs:77:26:77:59 | TryExpr | provenance | | -| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:88 | +| test.rs:77:26:77:59 | TryExpr | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | provenance | MaD:90 | | test.rs:77:26:77:67 | ... .bytes() [future, Ok] | test.rs:77:26:77:73 | await ... [Ok] | provenance | | | test.rs:77:26:77:73 | await ... [Ok] | test.rs:77:26:77:74 | TryExpr | provenance | | | test.rs:77:26:77:74 | TryExpr | test.rs:77:9:77:22 | remote_string6 | provenance | | -| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:89 | -| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:89 | +| test.rs:80:9:80:20 | mut request1 | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:91 | +| test.rs:80:9:80:20 | mut request1 | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:91 | | test.rs:80:24:80:35 | ...::get | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | provenance | Src:MaD:17 | | test.rs:80:24:80:50 | ...::get(...) [future, Ok] | test.rs:80:24:80:56 | await ... [Ok] | provenance | | | test.rs:80:24:80:56 | await ... [Ok] | test.rs:80:24:80:57 | TryExpr | provenance | | | test.rs:80:24:80:57 | TryExpr | test.rs:80:9:80:20 | mut request1 | provenance | | | test.rs:81:10:81:25 | request1.chunk() [future, Ok, Some] | test.rs:81:10:81:31 | await ... [Ok, Some] | provenance | | | test.rs:81:10:81:31 | await ... [Ok, Some] | test.rs:81:10:81:32 | TryExpr [Some] | provenance | | -| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:77 | +| test.rs:81:10:81:32 | TryExpr [Some] | test.rs:81:10:81:41 | ... .unwrap() | provenance | MaD:79 | | test.rs:82:15:82:25 | Some(...) [Some] | test.rs:82:20:82:24 | chunk | provenance | | | test.rs:82:20:82:24 | chunk | test.rs:83:14:83:18 | chunk | provenance | | | test.rs:82:29:82:44 | request1.chunk() [future, Ok, Some] | test.rs:82:29:82:50 | await ... [Ok, Some] | provenance | | @@ -247,119 +249,119 @@ edges | test.rs:121:31:121:42 | send_request | test.rs:121:24:121:51 | sender.send_request(...) [future, Ok] | provenance | Src:MaD:4 | | test.rs:122:11:122:18 | response | test.rs:122:10:122:18 | &response | provenance | | | test.rs:211:22:211:35 | ...::stdin | test.rs:211:22:211:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:105 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:55 | -| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:104 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer | provenance | MaD:107 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:57 | +| test.rs:211:22:211:37 | ...::stdin(...) | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | provenance | MaD:106 | | test.rs:211:44:211:54 | [post] &mut buffer | test.rs:212:15:212:20 | buffer | provenance | | | test.rs:211:44:211:54 | [post] &mut buffer [&ref] | test.rs:211:49:211:54 | [post] buffer | provenance | | | test.rs:211:49:211:54 | [post] buffer | test.rs:212:15:212:20 | buffer | provenance | | | test.rs:212:15:212:20 | buffer | test.rs:212:14:212:20 | &buffer | provenance | | | test.rs:217:22:217:35 | ...::stdin | test.rs:217:22:217:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:57 | -| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:108 | +| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:59 | +| test.rs:217:22:217:37 | ...::stdin(...) | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | provenance | MaD:110 | | test.rs:217:51:217:61 | [post] &mut buffer [&ref] | test.rs:217:56:217:61 | [post] buffer | provenance | | | test.rs:217:56:217:61 | [post] buffer | test.rs:218:15:218:20 | buffer | provenance | | | test.rs:218:15:218:20 | buffer | test.rs:218:14:218:20 | &buffer | provenance | | | test.rs:223:22:223:35 | ...::stdin | test.rs:223:22:223:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:110 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:58 | -| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:109 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer | provenance | MaD:112 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:60 | +| test.rs:223:22:223:37 | ...::stdin(...) | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | provenance | MaD:111 | | test.rs:223:54:223:64 | [post] &mut buffer | test.rs:224:15:224:20 | buffer | provenance | | | test.rs:223:54:223:64 | [post] &mut buffer [&ref] | test.rs:223:59:223:64 | [post] buffer | provenance | | | test.rs:223:59:223:64 | [post] buffer | test.rs:224:15:224:20 | buffer | provenance | | | test.rs:224:15:224:20 | buffer | test.rs:224:14:224:20 | &buffer | provenance | | | test.rs:229:22:229:35 | ...::stdin | test.rs:229:22:229:37 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:111 | -| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:58 | -| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:112 | +| test.rs:229:22:229:37 | ...::stdin(...) | test.rs:229:22:229:44 | ... .lock() | provenance | MaD:113 | +| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:60 | +| test.rs:229:22:229:44 | ... .lock() | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | provenance | MaD:114 | | test.rs:229:61:229:71 | [post] &mut buffer [&ref] | test.rs:229:66:229:71 | [post] buffer | provenance | | | test.rs:229:66:229:71 | [post] buffer | test.rs:230:15:230:20 | buffer | provenance | | | test.rs:230:15:230:20 | buffer | test.rs:230:14:230:20 | &buffer | provenance | | | test.rs:235:9:235:22 | ...::stdin | test.rs:235:9:235:24 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:107 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:56 | -| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:106 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer | provenance | MaD:109 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:58 | +| test.rs:235:9:235:24 | ...::stdin(...) | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | provenance | MaD:108 | | test.rs:235:37:235:47 | [post] &mut buffer | test.rs:236:15:236:20 | buffer | provenance | | | test.rs:235:37:235:47 | [post] &mut buffer [&ref] | test.rs:235:42:235:47 | [post] buffer | provenance | | | test.rs:235:42:235:47 | [post] buffer | test.rs:236:15:236:20 | buffer | provenance | | | test.rs:236:15:236:20 | buffer | test.rs:236:14:236:20 | &buffer | provenance | | | test.rs:239:17:239:30 | ...::stdin | test.rs:239:17:239:32 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:239:17:239:32 | ...::stdin(...) | test.rs:239:17:239:40 | ... .bytes() | provenance | MaD:52 | +| test.rs:239:17:239:32 | ...::stdin(...) | test.rs:239:17:239:40 | ... .bytes() | provenance | MaD:54 | | test.rs:239:17:239:40 | ... .bytes() | test.rs:240:14:240:17 | byte | provenance | | -| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:101 | +| test.rs:246:13:246:22 | mut reader | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | provenance | MaD:103 | | test.rs:246:26:246:66 | ...::new(...) | test.rs:246:13:246:22 | mut reader | provenance | | | test.rs:246:50:246:63 | ...::stdin | test.rs:246:50:246:65 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:103 | +| test.rs:246:50:246:65 | ...::stdin(...) | test.rs:246:26:246:66 | ...::new(...) | provenance | MaD:105 | | test.rs:247:13:247:16 | data | test.rs:248:15:248:18 | data | provenance | | | test.rs:247:20:247:36 | reader.fill_buf() [Ok] | test.rs:247:20:247:37 | TryExpr | provenance | | | test.rs:247:20:247:37 | TryExpr | test.rs:247:13:247:16 | data | provenance | | | test.rs:248:15:248:18 | data | test.rs:248:14:248:18 | &data | provenance | | -| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:102 | +| test.rs:252:13:252:18 | reader | test.rs:253:20:253:34 | reader.buffer() | provenance | MaD:104 | | test.rs:252:22:252:62 | ...::new(...) | test.rs:252:13:252:18 | reader | provenance | | | test.rs:252:46:252:59 | ...::stdin | test.rs:252:46:252:61 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:103 | +| test.rs:252:46:252:61 | ...::stdin(...) | test.rs:252:22:252:62 | ...::new(...) | provenance | MaD:105 | | test.rs:253:13:253:16 | data | test.rs:254:15:254:18 | data | provenance | | | test.rs:253:20:253:34 | reader.buffer() | test.rs:253:13:253:16 | data | provenance | | | test.rs:254:15:254:18 | data | test.rs:254:14:254:18 | &data | provenance | | -| test.rs:259:13:259:22 | mut reader | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | provenance | MaD:49 | +| test.rs:259:13:259:22 | mut reader | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | provenance | MaD:51 | | test.rs:259:26:259:66 | ...::new(...) | test.rs:259:13:259:22 | mut reader | provenance | | | test.rs:259:50:259:63 | ...::stdin | test.rs:259:50:259:65 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:103 | +| test.rs:259:50:259:65 | ...::stdin(...) | test.rs:259:26:259:66 | ...::new(...) | provenance | MaD:105 | | test.rs:260:26:260:36 | [post] &mut buffer [&ref] | test.rs:260:31:260:36 | [post] buffer | provenance | | | test.rs:260:31:260:36 | [post] buffer | test.rs:261:15:261:20 | buffer | provenance | | | test.rs:261:15:261:20 | buffer | test.rs:261:14:261:20 | &buffer | provenance | | -| test.rs:266:13:266:22 | mut reader | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | provenance | MaD:50 | +| test.rs:266:13:266:22 | mut reader | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | provenance | MaD:52 | | test.rs:266:26:266:66 | ...::new(...) | test.rs:266:13:266:22 | mut reader | provenance | | | test.rs:266:50:266:63 | ...::stdin | test.rs:266:50:266:65 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:103 | +| test.rs:266:50:266:65 | ...::stdin(...) | test.rs:266:26:266:66 | ...::new(...) | provenance | MaD:105 | | test.rs:267:33:267:43 | [post] &mut buffer [&ref] | test.rs:267:38:267:43 | [post] buffer | provenance | | | test.rs:267:38:267:43 | [post] buffer | test.rs:268:15:268:20 | buffer | provenance | | | test.rs:267:38:267:43 | [post] buffer | test.rs:269:14:269:22 | buffer[0] | provenance | | | test.rs:268:15:268:20 | buffer | test.rs:268:14:268:20 | &buffer | provenance | | -| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:100 | -| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:100 | -| test.rs:273:32:273:72 | ...::new(...) | test.rs:273:32:273:84 | ... .split(...) | provenance | MaD:51 | +| test.rs:273:13:273:28 | mut reader_split | test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | provenance | MaD:102 | +| test.rs:273:13:273:28 | mut reader_split | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | provenance | MaD:102 | +| test.rs:273:32:273:72 | ...::new(...) | test.rs:273:32:273:84 | ... .split(...) | provenance | MaD:53 | | test.rs:273:32:273:84 | ... .split(...) | test.rs:273:13:273:28 | mut reader_split | provenance | | | test.rs:273:56:273:69 | ...::stdin | test.rs:273:56:273:71 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:103 | -| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:77 | -| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:82 | +| test.rs:273:56:273:71 | ...::stdin(...) | test.rs:273:32:273:72 | ...::new(...) | provenance | MaD:105 | +| test.rs:274:14:274:32 | reader_split.next() [Some, Ok] | test.rs:274:14:274:41 | ... .unwrap() [Ok] | provenance | MaD:79 | +| test.rs:274:14:274:41 | ... .unwrap() [Ok] | test.rs:274:14:274:50 | ... .unwrap() | provenance | MaD:84 | | test.rs:275:19:275:29 | Some(...) [Some, Ok] | test.rs:275:24:275:28 | chunk [Ok] | provenance | | -| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:82 | +| test.rs:275:24:275:28 | chunk [Ok] | test.rs:276:18:276:31 | chunk.unwrap() | provenance | MaD:84 | | test.rs:275:33:275:51 | reader_split.next() [Some, Ok] | test.rs:275:19:275:29 | Some(...) [Some, Ok] | provenance | | -| test.rs:281:13:281:18 | reader | test.rs:282:21:282:34 | reader.lines() | provenance | MaD:48 | +| test.rs:281:13:281:18 | reader | test.rs:282:21:282:34 | reader.lines() | provenance | MaD:50 | | test.rs:281:22:281:62 | ...::new(...) | test.rs:281:13:281:18 | reader | provenance | | | test.rs:281:46:281:59 | ...::stdin | test.rs:281:46:281:61 | ...::stdin(...) | provenance | Src:MaD:30 MaD:30 | -| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:103 | +| test.rs:281:46:281:61 | ...::stdin(...) | test.rs:281:22:281:62 | ...::new(...) | provenance | MaD:105 | | test.rs:282:21:282:34 | reader.lines() | test.rs:283:18:283:21 | line | provenance | | -| test.rs:309:13:309:21 | mut stdin | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | provenance | MaD:65 | +| test.rs:309:13:309:21 | mut stdin | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | provenance | MaD:67 | | test.rs:309:25:309:40 | ...::stdin | test.rs:309:25:309:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:309:25:309:42 | ...::stdin(...) | test.rs:309:13:309:21 | mut stdin | provenance | | | test.rs:311:33:311:43 | [post] &mut buffer [&ref] | test.rs:311:38:311:43 | [post] buffer | provenance | | | test.rs:311:38:311:43 | [post] buffer | test.rs:312:15:312:20 | buffer | provenance | | | test.rs:312:15:312:20 | buffer | test.rs:312:14:312:20 | &buffer | provenance | | -| test.rs:316:13:316:21 | mut stdin | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | provenance | MaD:71 | +| test.rs:316:13:316:21 | mut stdin | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | provenance | MaD:73 | | test.rs:316:25:316:40 | ...::stdin | test.rs:316:25:316:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:316:25:316:42 | ...::stdin(...) | test.rs:316:13:316:21 | mut stdin | provenance | | | test.rs:318:40:318:50 | [post] &mut buffer [&ref] | test.rs:318:45:318:50 | [post] buffer | provenance | | | test.rs:318:45:318:50 | [post] buffer | test.rs:319:15:319:20 | buffer | provenance | | | test.rs:319:15:319:20 | buffer | test.rs:319:14:319:20 | &buffer | provenance | | -| test.rs:323:13:323:21 | mut stdin | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | provenance | MaD:72 | +| test.rs:323:13:323:21 | mut stdin | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | provenance | MaD:74 | | test.rs:323:25:323:40 | ...::stdin | test.rs:323:25:323:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:323:25:323:42 | ...::stdin(...) | test.rs:323:13:323:21 | mut stdin | provenance | | | test.rs:325:43:325:53 | [post] &mut buffer [&ref] | test.rs:325:48:325:53 | [post] buffer | provenance | | | test.rs:325:48:325:53 | [post] buffer | test.rs:326:15:326:20 | buffer | provenance | | | test.rs:326:15:326:20 | buffer | test.rs:326:14:326:20 | &buffer | provenance | | -| test.rs:330:13:330:21 | mut stdin | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | provenance | MaD:67 | +| test.rs:330:13:330:21 | mut stdin | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | provenance | MaD:69 | | test.rs:330:25:330:40 | ...::stdin | test.rs:330:25:330:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:330:25:330:42 | ...::stdin(...) | test.rs:330:13:330:21 | mut stdin | provenance | | | test.rs:332:26:332:36 | [post] &mut buffer [&ref] | test.rs:332:31:332:36 | [post] buffer | provenance | | | test.rs:332:31:332:36 | [post] buffer | test.rs:333:15:333:20 | buffer | provenance | | | test.rs:333:15:333:20 | buffer | test.rs:333:14:333:20 | &buffer | provenance | | -| test.rs:337:13:337:21 | mut stdin | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | provenance | MaD:73 | -| test.rs:337:13:337:21 | mut stdin | test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | provenance | MaD:69 | -| test.rs:337:13:337:21 | mut stdin | test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | provenance | MaD:68 | -| test.rs:337:13:337:21 | mut stdin | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:70 | +| test.rs:337:13:337:21 | mut stdin | test.rs:338:18:338:32 | stdin.read_u8() [future, Ok] | provenance | MaD:75 | +| test.rs:337:13:337:21 | mut stdin | test.rs:339:18:339:33 | stdin.read_i16() [future, Ok] | provenance | MaD:71 | +| test.rs:337:13:337:21 | mut stdin | test.rs:340:18:340:33 | stdin.read_f32() [future, Ok] | provenance | MaD:70 | +| test.rs:337:13:337:21 | mut stdin | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:72 | | test.rs:337:25:337:40 | ...::stdin | test.rs:337:25:337:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:337:25:337:42 | ...::stdin(...) | test.rs:337:13:337:21 | mut stdin | provenance | | | test.rs:338:13:338:14 | v1 | test.rs:342:14:342:15 | v1 | provenance | | @@ -378,67 +380,67 @@ edges | test.rs:341:18:341:36 | stdin.read_i64_le() [future, Ok] | test.rs:341:18:341:42 | await ... [Ok] | provenance | | | test.rs:341:18:341:42 | await ... [Ok] | test.rs:341:18:341:43 | TryExpr | provenance | | | test.rs:341:18:341:43 | TryExpr | test.rs:341:13:341:14 | v4 | provenance | | -| test.rs:349:13:349:21 | mut stdin | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | provenance | MaD:66 | +| test.rs:349:13:349:21 | mut stdin | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | provenance | MaD:68 | | test.rs:349:25:349:40 | ...::stdin | test.rs:349:25:349:42 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | | test.rs:349:25:349:42 | ...::stdin(...) | test.rs:349:13:349:21 | mut stdin | provenance | | | test.rs:351:24:351:34 | [post] &mut buffer [&ref] | test.rs:351:29:351:34 | [post] buffer | provenance | | | test.rs:351:29:351:34 | [post] buffer | test.rs:352:15:352:20 | buffer | provenance | | | test.rs:352:15:352:20 | buffer | test.rs:352:14:352:20 | &buffer | provenance | | -| test.rs:358:13:358:22 | mut reader | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | provenance | MaD:60 | +| test.rs:358:13:358:22 | mut reader | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | provenance | MaD:62 | | test.rs:358:26:358:70 | ...::new(...) | test.rs:358:13:358:22 | mut reader | provenance | | | test.rs:358:52:358:67 | ...::stdin | test.rs:358:52:358:69 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | -| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:116 | +| test.rs:358:52:358:69 | ...::stdin(...) | test.rs:358:26:358:70 | ...::new(...) | provenance | MaD:118 | | test.rs:359:13:359:16 | data | test.rs:360:15:360:18 | data | provenance | | | test.rs:359:20:359:36 | reader.fill_buf() [future, Ok] | test.rs:359:20:359:42 | await ... [Ok] | provenance | | | test.rs:359:20:359:42 | await ... [Ok] | test.rs:359:20:359:43 | TryExpr | provenance | | | test.rs:359:20:359:43 | TryExpr | test.rs:359:13:359:16 | data | provenance | | | test.rs:360:15:360:18 | data | test.rs:360:14:360:18 | &data | provenance | | -| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:115 | +| test.rs:364:13:364:18 | reader | test.rs:365:20:365:34 | reader.buffer() | provenance | MaD:117 | | test.rs:364:22:364:66 | ...::new(...) | test.rs:364:13:364:18 | reader | provenance | | | test.rs:364:48:364:63 | ...::stdin | test.rs:364:48:364:65 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | -| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:116 | +| test.rs:364:48:364:65 | ...::stdin(...) | test.rs:364:22:364:66 | ...::new(...) | provenance | MaD:118 | | test.rs:365:13:365:16 | data | test.rs:366:15:366:18 | data | provenance | | | test.rs:365:20:365:34 | reader.buffer() | test.rs:365:13:365:16 | data | provenance | | | test.rs:366:15:366:18 | data | test.rs:366:14:366:18 | &data | provenance | | -| test.rs:371:13:371:22 | mut reader | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | provenance | MaD:62 | +| test.rs:371:13:371:22 | mut reader | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | provenance | MaD:64 | | test.rs:371:26:371:70 | ...::new(...) | test.rs:371:13:371:22 | mut reader | provenance | | | test.rs:371:52:371:67 | ...::stdin | test.rs:371:52:371:69 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | -| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:116 | +| test.rs:371:52:371:69 | ...::stdin(...) | test.rs:371:26:371:70 | ...::new(...) | provenance | MaD:118 | | test.rs:372:26:372:36 | [post] &mut buffer [&ref] | test.rs:372:31:372:36 | [post] buffer | provenance | | | test.rs:372:31:372:36 | [post] buffer | test.rs:373:15:373:20 | buffer | provenance | | | test.rs:373:15:373:20 | buffer | test.rs:373:14:373:20 | &buffer | provenance | | -| test.rs:378:13:378:22 | mut reader | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | provenance | MaD:63 | +| test.rs:378:13:378:22 | mut reader | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | provenance | MaD:65 | | test.rs:378:26:378:70 | ...::new(...) | test.rs:378:13:378:22 | mut reader | provenance | | | test.rs:378:52:378:67 | ...::stdin | test.rs:378:52:378:69 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | -| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:116 | +| test.rs:378:52:378:69 | ...::stdin(...) | test.rs:378:26:378:70 | ...::new(...) | provenance | MaD:118 | | test.rs:379:33:379:43 | [post] &mut buffer [&ref] | test.rs:379:38:379:43 | [post] buffer | provenance | | | test.rs:379:38:379:43 | [post] buffer | test.rs:380:15:380:20 | buffer | provenance | | | test.rs:379:38:379:43 | [post] buffer | test.rs:381:14:381:22 | buffer[0] | provenance | | | test.rs:380:15:380:20 | buffer | test.rs:380:14:380:20 | &buffer | provenance | | -| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:118 | -| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:118 | -| test.rs:385:32:385:76 | ...::new(...) | test.rs:385:32:385:88 | ... .split(...) | provenance | MaD:64 | +| test.rs:385:13:385:28 | mut reader_split | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:120 | +| test.rs:385:13:385:28 | mut reader_split | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:120 | +| test.rs:385:32:385:76 | ...::new(...) | test.rs:385:32:385:88 | ... .split(...) | provenance | MaD:66 | | test.rs:385:32:385:88 | ... .split(...) | test.rs:385:13:385:28 | mut reader_split | provenance | | | test.rs:385:58:385:73 | ...::stdin | test.rs:385:58:385:75 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | -| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:116 | +| test.rs:385:58:385:75 | ...::stdin(...) | test.rs:385:32:385:76 | ...::new(...) | provenance | MaD:118 | | test.rs:386:14:386:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:386:14:386:46 | await ... [Ok, Some] | provenance | | | test.rs:386:14:386:46 | await ... [Ok, Some] | test.rs:386:14:386:47 | TryExpr [Some] | provenance | | -| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:77 | +| test.rs:386:14:386:47 | TryExpr [Some] | test.rs:386:14:386:56 | ... .unwrap() | provenance | MaD:79 | | test.rs:387:19:387:29 | Some(...) [Some] | test.rs:387:24:387:28 | chunk | provenance | | | test.rs:387:24:387:28 | chunk | test.rs:388:18:388:22 | chunk | provenance | | | test.rs:387:33:387:59 | reader_split.next_segment() [future, Ok, Some] | test.rs:387:33:387:65 | await ... [Ok, Some] | provenance | | | test.rs:387:33:387:65 | await ... [Ok, Some] | test.rs:387:33:387:66 | TryExpr [Some] | provenance | | | test.rs:387:33:387:66 | TryExpr [Some] | test.rs:387:19:387:29 | Some(...) [Some] | provenance | | -| test.rs:393:13:393:18 | reader | test.rs:394:25:394:38 | reader.lines() | provenance | MaD:61 | +| test.rs:393:13:393:18 | reader | test.rs:394:25:394:38 | reader.lines() | provenance | MaD:63 | | test.rs:393:22:393:66 | ...::new(...) | test.rs:393:13:393:18 | reader | provenance | | | test.rs:393:48:393:63 | ...::stdin | test.rs:393:48:393:65 | ...::stdin(...) | provenance | Src:MaD:34 MaD:34 | -| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:116 | -| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:117 | -| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:117 | +| test.rs:393:48:393:65 | ...::stdin(...) | test.rs:393:22:393:66 | ...::new(...) | provenance | MaD:118 | +| test.rs:394:13:394:21 | mut lines | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:119 | +| test.rs:394:13:394:21 | mut lines | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:119 | | test.rs:394:25:394:38 | reader.lines() | test.rs:394:13:394:21 | mut lines | provenance | | | test.rs:395:14:395:30 | lines.next_line() [future, Ok, Some] | test.rs:395:14:395:36 | await ... [Ok, Some] | provenance | | | test.rs:395:14:395:36 | await ... [Ok, Some] | test.rs:395:14:395:37 | TryExpr [Some] | provenance | | -| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:77 | +| test.rs:395:14:395:37 | TryExpr [Some] | test.rs:395:14:395:46 | ... .unwrap() | provenance | MaD:79 | | test.rs:396:19:396:28 | Some(...) [Some] | test.rs:396:24:396:27 | line | provenance | | | test.rs:396:24:396:27 | line | test.rs:397:18:397:21 | line | provenance | | | test.rs:396:32:396:48 | lines.next_line() [future, Ok, Some] | test.rs:396:32:396:54 | await ... [Ok, Some] | provenance | | @@ -463,21 +465,21 @@ edges | test.rs:418:22:418:51 | ...::read_to_string(...) [Ok] | test.rs:418:22:418:52 | TryExpr | provenance | | | test.rs:418:22:418:52 | TryExpr | test.rs:418:13:418:18 | buffer | provenance | | | test.rs:425:13:425:16 | path | test.rs:426:14:426:17 | path | provenance | | -| test.rs:425:13:425:16 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:35 | +| test.rs:425:13:425:16 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:37 | | test.rs:425:13:425:16 | path | test.rs:427:14:427:17 | path | provenance | | -| test.rs:425:13:425:16 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:35 | +| test.rs:425:13:425:16 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:37 | | test.rs:425:13:425:16 | path | test.rs:437:14:437:17 | path | provenance | | | test.rs:425:20:425:27 | e.path() | test.rs:425:13:425:16 | path | provenance | | | test.rs:425:22:425:25 | path | test.rs:425:20:425:27 | e.path() | provenance | Src:MaD:6 MaD:6 | -| test.rs:426:14:426:17 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:35 | -| test.rs:427:14:427:17 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:35 | -| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:114 | +| test.rs:426:14:426:17 | path | test.rs:426:14:426:25 | path.clone() | provenance | MaD:37 | +| test.rs:427:14:427:17 | path | test.rs:427:14:427:25 | path.clone() | provenance | MaD:37 | +| test.rs:427:14:427:25 | path.clone() | test.rs:427:14:427:35 | ... .as_path() | provenance | MaD:116 | | test.rs:439:13:439:21 | file_name | test.rs:440:14:440:22 | file_name | provenance | | -| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:35 | +| test.rs:439:13:439:21 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:37 | | test.rs:439:13:439:21 | file_name | test.rs:445:14:445:22 | file_name | provenance | | | test.rs:439:25:439:37 | e.file_name() | test.rs:439:13:439:21 | file_name | provenance | | | test.rs:439:27:439:35 | file_name | test.rs:439:25:439:37 | e.file_name() | provenance | Src:MaD:5 MaD:5 | -| test.rs:440:14:440:22 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:35 | +| test.rs:440:14:440:22 | file_name | test.rs:440:14:440:30 | file_name.clone() | provenance | MaD:37 | | test.rs:461:13:461:18 | target | test.rs:462:14:462:19 | target | provenance | | | test.rs:461:22:461:34 | ...::read_link | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:27 | | test.rs:461:22:461:49 | ...::read_link(...) [Ok] | test.rs:461:22:461:50 | TryExpr | provenance | | @@ -510,17 +512,17 @@ edges | test.rs:493:22:493:56 | ...::read_link(...) [future, Ok] | test.rs:493:22:493:62 | await ... [Ok] | provenance | | | test.rs:493:22:493:62 | await ... [Ok] | test.rs:493:22:493:63 | TryExpr | provenance | | | test.rs:493:22:493:63 | TryExpr | test.rs:493:13:493:18 | target | provenance | | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:95 | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:55 | -| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:94 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:97 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:57 | -| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:96 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:99 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:58 | -| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:98 | -| test.rs:503:9:503:16 | mut file | test.rs:525:25:525:35 | [post] &mut buffer [&ref] | provenance | MaD:56 | -| test.rs:503:9:503:16 | mut file | test.rs:529:17:529:28 | file.bytes() | provenance | MaD:52 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer | provenance | MaD:97 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:57 | +| test.rs:503:9:503:16 | mut file | test.rs:507:32:507:42 | [post] &mut buffer [&ref] | provenance | MaD:96 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer | provenance | MaD:99 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:59 | +| test.rs:503:9:503:16 | mut file | test.rs:513:39:513:49 | [post] &mut buffer [&ref] | provenance | MaD:98 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer | provenance | MaD:101 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:60 | +| test.rs:503:9:503:16 | mut file | test.rs:519:42:519:52 | [post] &mut buffer [&ref] | provenance | MaD:100 | +| test.rs:503:9:503:16 | mut file | test.rs:525:25:525:35 | [post] &mut buffer [&ref] | provenance | MaD:58 | +| test.rs:503:9:503:16 | mut file | test.rs:529:17:529:28 | file.bytes() | provenance | MaD:54 | | test.rs:503:20:503:38 | ...::open | test.rs:503:20:503:50 | ...::open(...) [Ok] | provenance | Src:MaD:7 | | test.rs:503:20:503:50 | ...::open(...) [Ok] | test.rs:503:20:503:51 | TryExpr | provenance | | | test.rs:503:20:503:51 | TryExpr | test.rs:503:9:503:16 | mut file | provenance | | @@ -540,37 +542,37 @@ edges | test.rs:525:30:525:35 | [post] buffer | test.rs:526:15:526:20 | buffer | provenance | | | test.rs:526:15:526:20 | buffer | test.rs:526:14:526:20 | &buffer | provenance | | | test.rs:529:17:529:28 | file.bytes() | test.rs:530:14:530:17 | byte | provenance | | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:95 | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:55 | -| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:94 | -| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:82 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer | provenance | MaD:97 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:57 | +| test.rs:536:13:536:18 | mut f1 | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | provenance | MaD:96 | +| test.rs:536:22:536:63 | ... .open(...) [Ok] | test.rs:536:22:536:72 | ... .unwrap() | provenance | MaD:84 | | test.rs:536:22:536:72 | ... .unwrap() | test.rs:536:13:536:18 | mut f1 | provenance | | | test.rs:536:50:536:53 | open | test.rs:536:22:536:63 | ... .open(...) [Ok] | provenance | Src:MaD:8 | | test.rs:538:30:538:40 | [post] &mut buffer | test.rs:539:15:539:20 | buffer | provenance | | | test.rs:538:30:538:40 | [post] &mut buffer [&ref] | test.rs:538:35:538:40 | [post] buffer | provenance | | | test.rs:538:35:538:40 | [post] buffer | test.rs:539:15:539:20 | buffer | provenance | | | test.rs:539:15:539:20 | buffer | test.rs:539:14:539:20 | &buffer | provenance | | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:95 | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:55 | -| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:94 | -| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:82 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer | provenance | MaD:97 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:57 | +| test.rs:543:13:543:18 | mut f2 | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | provenance | MaD:96 | +| test.rs:543:22:543:80 | ... .open(...) [Ok] | test.rs:543:22:543:89 | ... .unwrap() | provenance | MaD:84 | | test.rs:543:22:543:89 | ... .unwrap() | test.rs:543:13:543:18 | mut f2 | provenance | | | test.rs:543:67:543:70 | open | test.rs:543:22:543:80 | ... .open(...) [Ok] | provenance | Src:MaD:8 | | test.rs:545:30:545:40 | [post] &mut buffer | test.rs:546:15:546:20 | buffer | provenance | | | test.rs:545:30:545:40 | [post] &mut buffer [&ref] | test.rs:545:35:545:40 | [post] buffer | provenance | | | test.rs:545:35:545:40 | [post] buffer | test.rs:546:15:546:20 | buffer | provenance | | | test.rs:546:15:546:20 | buffer | test.rs:546:14:546:20 | &buffer | provenance | | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:95 | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:55 | -| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:94 | -| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:82 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer | provenance | MaD:97 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:57 | +| test.rs:550:13:550:18 | mut f3 | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | provenance | MaD:96 | +| test.rs:550:22:550:114 | ... .open(...) [Ok] | test.rs:550:22:550:123 | ... .unwrap() | provenance | MaD:84 | | test.rs:550:22:550:123 | ... .unwrap() | test.rs:550:13:550:18 | mut f3 | provenance | | | test.rs:550:101:550:104 | open | test.rs:550:22:550:114 | ... .open(...) [Ok] | provenance | Src:MaD:8 | | test.rs:552:30:552:40 | [post] &mut buffer | test.rs:553:15:553:20 | buffer | provenance | | | test.rs:552:30:552:40 | [post] &mut buffer [&ref] | test.rs:552:35:552:40 | [post] buffer | provenance | | | test.rs:552:35:552:40 | [post] buffer | test.rs:553:15:553:20 | buffer | provenance | | | test.rs:553:15:553:20 | buffer | test.rs:553:14:553:20 | &buffer | provenance | | -| test.rs:560:13:560:17 | file1 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:54 | +| test.rs:560:13:560:17 | file1 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:56 | | test.rs:560:21:560:39 | ...::open | test.rs:560:21:560:51 | ...::open(...) [Ok] | provenance | Src:MaD:7 | | test.rs:560:21:560:51 | ...::open(...) [Ok] | test.rs:560:21:560:52 | TryExpr | provenance | | | test.rs:560:21:560:52 | TryExpr | test.rs:560:13:560:17 | file1 | provenance | | @@ -578,30 +580,30 @@ edges | test.rs:561:21:561:39 | ...::open | test.rs:561:21:561:59 | ...::open(...) [Ok] | provenance | Src:MaD:7 | | test.rs:561:21:561:59 | ...::open(...) [Ok] | test.rs:561:21:561:60 | TryExpr | provenance | | | test.rs:561:21:561:60 | TryExpr | test.rs:561:13:561:17 | file2 | provenance | | -| test.rs:562:13:562:22 | mut reader | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | provenance | MaD:58 | +| test.rs:562:13:562:22 | mut reader | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | provenance | MaD:60 | | test.rs:562:26:562:43 | file1.chain(...) | test.rs:562:13:562:22 | mut reader | provenance | | -| test.rs:562:38:562:42 | file2 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:53 | +| test.rs:562:38:562:42 | file2 | test.rs:562:26:562:43 | file1.chain(...) | provenance | MaD:55 | | test.rs:563:31:563:41 | [post] &mut buffer [&ref] | test.rs:563:36:563:41 | [post] buffer | provenance | | | test.rs:563:36:563:41 | [post] buffer | test.rs:564:15:564:20 | buffer | provenance | | | test.rs:564:15:564:20 | buffer | test.rs:564:14:564:20 | &buffer | provenance | | -| test.rs:569:13:569:17 | file1 | test.rs:570:26:570:40 | file1.take(...) | provenance | MaD:59 | +| test.rs:569:13:569:17 | file1 | test.rs:570:26:570:40 | file1.take(...) | provenance | MaD:61 | | test.rs:569:21:569:39 | ...::open | test.rs:569:21:569:51 | ...::open(...) [Ok] | provenance | Src:MaD:7 | | test.rs:569:21:569:51 | ...::open(...) [Ok] | test.rs:569:21:569:52 | TryExpr | provenance | | | test.rs:569:21:569:52 | TryExpr | test.rs:569:13:569:17 | file1 | provenance | | -| test.rs:570:13:570:22 | mut reader | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | provenance | MaD:58 | +| test.rs:570:13:570:22 | mut reader | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | provenance | MaD:60 | | test.rs:570:26:570:40 | file1.take(...) | test.rs:570:13:570:22 | mut reader | provenance | | | test.rs:571:31:571:41 | [post] &mut buffer [&ref] | test.rs:571:36:571:41 | [post] buffer | provenance | | | test.rs:571:36:571:41 | [post] buffer | test.rs:572:15:572:20 | buffer | provenance | | | test.rs:572:15:572:20 | buffer | test.rs:572:14:572:20 | &buffer | provenance | | -| test.rs:581:9:581:16 | mut file | test.rs:585:32:585:42 | [post] &mut buffer [&ref] | provenance | MaD:65 | -| test.rs:581:9:581:16 | mut file | test.rs:591:39:591:49 | [post] &mut buffer [&ref] | provenance | MaD:71 | -| test.rs:581:9:581:16 | mut file | test.rs:597:42:597:52 | [post] &mut buffer [&ref] | provenance | MaD:72 | -| test.rs:581:9:581:16 | mut file | test.rs:603:25:603:35 | [post] &mut buffer [&ref] | provenance | MaD:67 | -| test.rs:581:9:581:16 | mut file | test.rs:608:18:608:31 | file.read_u8() [future, Ok] | provenance | MaD:73 | -| test.rs:581:9:581:16 | mut file | test.rs:609:18:609:32 | file.read_i16() [future, Ok] | provenance | MaD:69 | -| test.rs:581:9:581:16 | mut file | test.rs:610:18:610:32 | file.read_f32() [future, Ok] | provenance | MaD:68 | -| test.rs:581:9:581:16 | mut file | test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | provenance | MaD:70 | -| test.rs:581:9:581:16 | mut file | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | provenance | MaD:66 | +| test.rs:581:9:581:16 | mut file | test.rs:585:32:585:42 | [post] &mut buffer [&ref] | provenance | MaD:67 | +| test.rs:581:9:581:16 | mut file | test.rs:591:39:591:49 | [post] &mut buffer [&ref] | provenance | MaD:73 | +| test.rs:581:9:581:16 | mut file | test.rs:597:42:597:52 | [post] &mut buffer [&ref] | provenance | MaD:74 | +| test.rs:581:9:581:16 | mut file | test.rs:603:25:603:35 | [post] &mut buffer [&ref] | provenance | MaD:69 | +| test.rs:581:9:581:16 | mut file | test.rs:608:18:608:31 | file.read_u8() [future, Ok] | provenance | MaD:75 | +| test.rs:581:9:581:16 | mut file | test.rs:609:18:609:32 | file.read_i16() [future, Ok] | provenance | MaD:71 | +| test.rs:581:9:581:16 | mut file | test.rs:610:18:610:32 | file.read_f32() [future, Ok] | provenance | MaD:70 | +| test.rs:581:9:581:16 | mut file | test.rs:611:18:611:35 | file.read_i64_le() [future, Ok] | provenance | MaD:72 | +| test.rs:581:9:581:16 | mut file | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | provenance | MaD:68 | | test.rs:581:20:581:40 | ...::open | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | provenance | Src:MaD:11 | | test.rs:581:20:581:52 | ...::open(...) [future, Ok] | test.rs:581:20:581:58 | await ... [Ok] | provenance | | | test.rs:581:20:581:58 | await ... [Ok] | test.rs:581:20:581:59 | TryExpr | provenance | | @@ -637,7 +639,7 @@ edges | test.rs:620:23:620:33 | [post] &mut buffer [&ref] | test.rs:620:28:620:33 | [post] buffer | provenance | | | test.rs:620:28:620:33 | [post] buffer | test.rs:621:15:621:20 | buffer | provenance | | | test.rs:621:15:621:20 | buffer | test.rs:621:14:621:20 | &buffer | provenance | | -| test.rs:627:13:627:18 | mut f1 | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | provenance | MaD:65 | +| test.rs:627:13:627:18 | mut f1 | test.rs:629:30:629:40 | [post] &mut buffer [&ref] | provenance | MaD:67 | | test.rs:627:22:627:65 | ... .open(...) [future, Ok] | test.rs:627:22:627:71 | await ... [Ok] | provenance | | | test.rs:627:22:627:71 | await ... [Ok] | test.rs:627:22:627:72 | TryExpr | provenance | | | test.rs:627:22:627:72 | TryExpr | test.rs:627:13:627:18 | mut f1 | provenance | | @@ -646,29 +648,35 @@ edges | test.rs:629:35:629:40 | [post] buffer | test.rs:630:15:630:20 | buffer | provenance | | | test.rs:630:15:630:20 | buffer | test.rs:630:14:630:20 | &buffer | provenance | | | test.rs:660:9:660:16 | mut file | test.rs:664:22:664:25 | file | provenance | | -| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:44 | -| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:45 | +| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:35 | +| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:36 | +| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:46 | +| test.rs:660:9:660:16 | mut file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:47 | | test.rs:660:20:660:44 | ...::open | test.rs:660:20:660:56 | ...::open(...) [future, Ok] | provenance | Src:MaD:1 | | test.rs:660:20:660:56 | ...::open(...) [future, Ok] | test.rs:660:20:660:62 | await ... [Ok] | provenance | | | test.rs:660:20:660:62 | await ... [Ok] | test.rs:660:20:660:63 | TryExpr | provenance | | | test.rs:660:20:660:63 | TryExpr | test.rs:660:9:660:16 | mut file | provenance | | -| test.rs:664:22:664:25 | file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test.rs:664:22:664:25 | file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:35 | +| test.rs:664:22:664:25 | file | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | provenance | MaD:46 | | test.rs:664:32:664:42 | [post] &mut buffer [&ref] | test.rs:664:37:664:42 | [post] buffer | provenance | | | test.rs:664:37:664:42 | [post] buffer | test.rs:665:15:665:20 | buffer | provenance | | | test.rs:665:15:665:20 | buffer | test.rs:665:14:665:20 | &buffer | provenance | | | test.rs:671:13:671:18 | mut f1 | test.rs:673:22:673:23 | f1 | provenance | | -| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:44 | -| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:45 | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:35 | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:36 | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:46 | +| test.rs:671:13:671:18 | mut f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:47 | | test.rs:671:22:671:69 | ... .open(...) [future, Ok] | test.rs:671:22:671:75 | await ... [Ok] | provenance | | | test.rs:671:22:671:75 | await ... [Ok] | test.rs:671:22:671:76 | TryExpr | provenance | | | test.rs:671:22:671:76 | TryExpr | test.rs:671:13:671:18 | mut f1 | provenance | | | test.rs:671:56:671:59 | open | test.rs:671:22:671:69 | ... .open(...) [future, Ok] | provenance | Src:MaD:2 | -| test.rs:673:22:673:23 | f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:44 | +| test.rs:673:22:673:23 | f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:35 | +| test.rs:673:22:673:23 | f1 | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | provenance | MaD:46 | | test.rs:673:30:673:40 | [post] &mut buffer [&ref] | test.rs:673:35:673:40 | [post] buffer | provenance | | | test.rs:673:35:673:40 | [post] buffer | test.rs:674:15:674:20 | buffer | provenance | | | test.rs:674:15:674:20 | buffer | test.rs:674:14:674:20 | &buffer | provenance | | -| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:55 | -| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:113 | +| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:57 | +| test.rs:688:13:688:22 | mut stream | test.rs:695:29:695:39 | [post] &mut buffer [&ref] | provenance | MaD:115 | | test.rs:688:26:688:53 | ...::connect | test.rs:688:26:688:62 | ...::connect(...) [Ok] | provenance | Src:MaD:9 | | test.rs:688:26:688:62 | ...::connect(...) [Ok] | test.rs:688:26:688:63 | TryExpr | provenance | | | test.rs:688:26:688:63 | TryExpr | test.rs:688:13:688:22 | mut stream | provenance | | @@ -680,17 +688,17 @@ edges | test.rs:707:26:707:61 | ...::connect_timeout | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:10 | | test.rs:707:26:707:105 | ...::connect_timeout(...) [Ok] | test.rs:707:26:707:106 | TryExpr | provenance | | | test.rs:707:26:707:106 | TryExpr | test.rs:707:13:707:22 | mut stream | provenance | | -| test.rs:715:21:715:30 | mut reader | test.rs:718:44:718:52 | [post] &mut line [&ref] | provenance | MaD:49 | -| test.rs:715:34:715:64 | ...::new(...) | test.rs:715:34:715:74 | ... .take(...) | provenance | MaD:59 | +| test.rs:715:21:715:30 | mut reader | test.rs:718:44:718:52 | [post] &mut line [&ref] | provenance | MaD:51 | +| test.rs:715:34:715:64 | ...::new(...) | test.rs:715:34:715:74 | ... .take(...) | provenance | MaD:61 | | test.rs:715:34:715:74 | ... .take(...) | test.rs:715:21:715:30 | mut reader | provenance | | -| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:103 | +| test.rs:715:58:715:63 | stream | test.rs:715:34:715:64 | ...::new(...) | provenance | MaD:105 | | test.rs:718:44:718:52 | [post] &mut line [&ref] | test.rs:718:49:718:52 | [post] line | provenance | | | test.rs:718:49:718:52 | [post] line | test.rs:725:35:725:38 | line | provenance | | | test.rs:725:35:725:38 | line | test.rs:725:34:725:38 | &line | provenance | | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:119 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | provenance | MaD:65 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:120 | -| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:121 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:767:35:767:46 | [post] &mut buffer1 [&ref] | provenance | MaD:121 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:771:36:771:47 | [post] &mut buffer2 [&ref] | provenance | MaD:67 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:787:41:787:51 | [post] &mut buffer [&ref] | provenance | MaD:122 | +| test.rs:759:9:759:24 | mut tokio_stream | test.rs:810:45:810:55 | [post] &mut buffer [&ref] | provenance | MaD:123 | | test.rs:759:28:759:57 | ...::connect | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | provenance | Src:MaD:15 | | test.rs:759:28:759:66 | ...::connect(...) [future, Ok] | test.rs:759:28:759:72 | await ... [Ok] | provenance | | | test.rs:759:28:759:72 | await ... [Ok] | test.rs:759:28:759:73 | TryExpr | provenance | | @@ -720,13 +728,15 @@ edges | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:32:40:32:45 | reader | provenance | | | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:45:64:45:69 | reader | provenance | | | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:27:49:32 | reader | provenance | | -| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | -| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:45 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:35 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:36 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:46 | +| test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:47 | | test_futures_io.rs:26:9:26:18 | mut reader | test_futures_io.rs:54:51:54:56 | reader | provenance | | | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | test_futures_io.rs:26:22:26:62 | await ... [Ok] | provenance | | | test_futures_io.rs:26:22:26:62 | await ... [Ok] | test_futures_io.rs:26:22:26:63 | TryExpr | provenance | | | test_futures_io.rs:26:22:26:63 | TryExpr | test_futures_io.rs:26:9:26:18 | mut reader | provenance | | -| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:86 | +| test_futures_io.rs:26:53:26:55 | tcp | test_futures_io.rs:26:22:26:56 | connector.connect(...) [future, Ok] | provenance | MaD:88 | | test_futures_io.rs:27:11:27:16 | reader | test_futures_io.rs:27:10:27:16 | &reader | provenance | | | test_futures_io.rs:32:13:32:22 | mut pinned | test_futures_io.rs:33:15:33:20 | pinned | provenance | | | test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | test_futures_io.rs:33:15:33:20 | pinned [&ref] | provenance | | @@ -734,56 +744,60 @@ edges | test_futures_io.rs:32:26:32:46 | ...::new(...) | test_futures_io.rs:32:13:32:22 | mut pinned | provenance | | | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | test_futures_io.rs:32:13:32:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | test_futures_io.rs:32:13:32:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:78 | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:80 | -| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | provenance | MaD:79 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) | provenance | MaD:80 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [&ref] | provenance | MaD:82 | +| test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | test_futures_io.rs:32:26:32:46 | ...::new(...) [Pin, &ref] | provenance | MaD:81 | | test_futures_io.rs:32:40:32:45 | reader | test_futures_io.rs:32:35:32:45 | &mut reader [&ref] | provenance | | | test_futures_io.rs:33:15:33:20 | pinned | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | | test_futures_io.rs:33:15:33:20 | pinned [&ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | | test_futures_io.rs:33:15:33:20 | pinned [Pin, &ref] | test_futures_io.rs:33:14:33:20 | &pinned | provenance | | -| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:44 | +| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:35 | +| test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | provenance | MaD:46 | | test_futures_io.rs:45:64:45:69 | reader | test_futures_io.rs:45:59:45:69 | &mut reader [&ref] | provenance | | | test_futures_io.rs:45:72:45:83 | [post] &mut buffer1 [&ref] | test_futures_io.rs:45:77:45:83 | [post] buffer1 | provenance | | | test_futures_io.rs:45:77:45:83 | [post] buffer1 | test_futures_io.rs:46:15:46:36 | buffer1[...] | provenance | | | test_futures_io.rs:46:15:46:36 | buffer1[...] | test_futures_io.rs:46:14:46:36 | &... | provenance | | -| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | +| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:35 | +| test_futures_io.rs:49:27:49:32 | reader | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | provenance | MaD:46 | | test_futures_io.rs:49:39:49:50 | [post] &mut buffer2 [&ref] | test_futures_io.rs:49:44:49:50 | [post] buffer2 | provenance | | | test_futures_io.rs:49:44:49:50 | [post] buffer2 | test_futures_io.rs:51:15:51:36 | buffer2[...] | provenance | | | test_futures_io.rs:51:15:51:36 | buffer2[...] | test_futures_io.rs:51:14:51:36 | &... | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:55:11:55:17 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:59:40:59:46 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:69:37:69:43 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:39 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:83:22:83:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:41 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:90:40:90:46 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:103:64:103:70 | reader2 | provenance | | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:27:107:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:45 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:35 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:36 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:46 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:47 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:113:40:113:46 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:39 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | provenance | MaD:41 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:27:132:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:42 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:43 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:44 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:45 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:27:139:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:40 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:41 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:42 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:43 | | test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:27:146:33 | reader2 | provenance | | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:46 | -| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:47 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:48 | +| test_futures_io.rs:54:9:54:19 | mut reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:49 | | test_futures_io.rs:54:23:54:57 | ...::new(...) | test_futures_io.rs:54:9:54:19 | mut reader2 | provenance | | -| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:87 | +| test_futures_io.rs:54:51:54:56 | reader | test_futures_io.rs:54:23:54:57 | ...::new(...) | provenance | MaD:89 | | test_futures_io.rs:55:11:55:17 | reader2 | test_futures_io.rs:55:10:55:17 | &reader2 | provenance | | | test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:60:15:60:20 | pinned | provenance | | -| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | +| test_futures_io.rs:59:13:59:22 | mut pinned | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:40 | | test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:60:15:60:20 | pinned [&ref] | provenance | | -| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | +| test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | test_futures_io.rs:62:22:62:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:40 | | test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | test_futures_io.rs:60:15:60:20 | pinned [Pin, &ref] | provenance | | | test_futures_io.rs:59:26:59:47 | ...::new(...) | test_futures_io.rs:59:13:59:22 | mut pinned | provenance | | | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | test_futures_io.rs:59:13:59:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:59:13:59:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:78 | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:80 | -| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | provenance | MaD:79 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) | provenance | MaD:80 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [&ref] | provenance | MaD:82 | +| test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | test_futures_io.rs:59:26:59:47 | ...::new(...) [Pin, &ref] | provenance | MaD:81 | | test_futures_io.rs:59:40:59:46 | reader2 | test_futures_io.rs:59:35:59:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:60:15:60:20 | pinned | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | | test_futures_io.rs:60:15:60:20 | pinned [&ref] | test_futures_io.rs:60:14:60:20 | &pinned | provenance | | @@ -796,11 +810,11 @@ edges | test_futures_io.rs:63:31:63:33 | buf | test_futures_io.rs:65:18:65:20 | buf | provenance | | | test_futures_io.rs:64:19:64:24 | buffer [Ready, Ok] | test_futures_io.rs:64:18:64:24 | &buffer | provenance | | | test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | provenance | | -| test_futures_io.rs:69:23:69:44 | ...::new(...) | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | -| test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | +| test_futures_io.rs:69:23:69:44 | ...::new(...) | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:40 | +| test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:40 | | test_futures_io.rs:69:23:69:67 | ... .poll_fill_buf(...) [Ready, Ok] | test_futures_io.rs:69:13:69:19 | buffer2 [Ready, Ok] | provenance | | -| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:78 | -| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:80 | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) | provenance | MaD:80 | +| test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | test_futures_io.rs:69:23:69:44 | ...::new(...) [&ref] | provenance | MaD:82 | | test_futures_io.rs:69:37:69:43 | reader2 | test_futures_io.rs:69:32:69:43 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:71:13:71:32 | ...::Ready(...) [Ready, Ok] | provenance | | | test_futures_io.rs:70:16:70:22 | buffer2 [Ready, Ok] | test_futures_io.rs:72:23:72:29 | buffer2 [Ready, Ok] | provenance | | @@ -818,33 +832,35 @@ edges | test_futures_io.rs:90:26:90:47 | ...::new(...) | test_futures_io.rs:90:13:90:22 | mut pinned | provenance | | | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | test_futures_io.rs:90:13:90:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:90:13:90:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:78 | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:80 | -| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | provenance | MaD:79 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) | provenance | MaD:80 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [&ref] | provenance | MaD:82 | +| test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | test_futures_io.rs:90:26:90:47 | ...::new(...) [Pin, &ref] | provenance | MaD:81 | | test_futures_io.rs:90:40:90:46 | reader2 | test_futures_io.rs:90:35:90:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:91:15:91:20 | pinned | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | | test_futures_io.rs:91:15:91:20 | pinned [&ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | | test_futures_io.rs:91:15:91:20 | pinned [Pin, &ref] | test_futures_io.rs:91:14:91:20 | &pinned | provenance | | -| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:44 | +| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:35 | +| test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | provenance | MaD:46 | | test_futures_io.rs:103:64:103:70 | reader2 | test_futures_io.rs:103:59:103:70 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:103:73:103:84 | [post] &mut buffer1 [&ref] | test_futures_io.rs:103:78:103:84 | [post] buffer1 | provenance | | | test_futures_io.rs:103:78:103:84 | [post] buffer1 | test_futures_io.rs:104:15:104:36 | buffer1[...] | provenance | | | test_futures_io.rs:104:15:104:36 | buffer1[...] | test_futures_io.rs:104:14:104:36 | &... | provenance | | -| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | +| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:35 | +| test_futures_io.rs:107:27:107:33 | reader2 | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | provenance | MaD:46 | | test_futures_io.rs:107:40:107:51 | [post] &mut buffer2 [&ref] | test_futures_io.rs:107:45:107:51 | [post] buffer2 | provenance | | | test_futures_io.rs:107:45:107:51 | [post] buffer2 | test_futures_io.rs:108:15:108:36 | buffer2[...] | provenance | | | test_futures_io.rs:108:15:108:36 | buffer2[...] | test_futures_io.rs:108:14:108:36 | &... | provenance | | | test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:114:15:114:20 | pinned | provenance | | -| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | +| test_futures_io.rs:113:13:113:22 | mut pinned | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:40 | | test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:114:15:114:20 | pinned [&ref] | provenance | | -| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:38 | +| test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | test_futures_io.rs:116:22:116:50 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:40 | | test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | test_futures_io.rs:114:15:114:20 | pinned [Pin, &ref] | provenance | | | test_futures_io.rs:113:26:113:47 | ...::new(...) | test_futures_io.rs:113:13:113:22 | mut pinned | provenance | | | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | test_futures_io.rs:113:13:113:22 | mut pinned [&ref] | provenance | | | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | test_futures_io.rs:113:13:113:22 | mut pinned [Pin, &ref] | provenance | | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:78 | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:80 | -| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | provenance | MaD:79 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) | provenance | MaD:80 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [&ref] | provenance | MaD:82 | +| test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | test_futures_io.rs:113:26:113:47 | ...::new(...) [Pin, &ref] | provenance | MaD:81 | | test_futures_io.rs:113:40:113:46 | reader2 | test_futures_io.rs:113:35:113:46 | &mut reader2 [&ref] | provenance | | | test_futures_io.rs:114:15:114:20 | pinned | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | | test_futures_io.rs:114:15:114:20 | pinned [&ref] | test_futures_io.rs:114:14:114:20 | &pinned | provenance | | @@ -860,40 +876,40 @@ edges | test_futures_io.rs:125:22:125:39 | reader2.fill_buf() [future, Ok] | test_futures_io.rs:125:22:125:45 | await ... [Ok] | provenance | | | test_futures_io.rs:125:22:125:45 | await ... [Ok] | test_futures_io.rs:125:22:125:46 | TryExpr | provenance | | | test_futures_io.rs:125:22:125:46 | TryExpr | test_futures_io.rs:125:13:125:18 | buffer | provenance | | -| test_futures_io.rs:132:27:132:33 | reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:42 | +| test_futures_io.rs:132:27:132:33 | reader2 | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | provenance | MaD:44 | | test_futures_io.rs:132:53:132:61 | [post] &mut line [&ref] | test_futures_io.rs:132:58:132:61 | [post] line | provenance | | | test_futures_io.rs:132:58:132:61 | [post] line | test_futures_io.rs:133:15:133:18 | line | provenance | | | test_futures_io.rs:133:15:133:18 | line | test_futures_io.rs:133:14:133:18 | &line | provenance | | -| test_futures_io.rs:139:27:139:33 | reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:40 | +| test_futures_io.rs:139:27:139:33 | reader2 | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | provenance | MaD:42 | | test_futures_io.rs:139:45:139:53 | [post] &mut line [&ref] | test_futures_io.rs:139:50:139:53 | [post] line | provenance | | | test_futures_io.rs:139:50:139:53 | [post] line | test_futures_io.rs:140:15:140:18 | line | provenance | | | test_futures_io.rs:140:15:140:18 | line | test_futures_io.rs:140:14:140:18 | &line | provenance | | -| test_futures_io.rs:146:27:146:33 | reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:46 | +| test_futures_io.rs:146:27:146:33 | reader2 | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | provenance | MaD:48 | | test_futures_io.rs:146:47:146:57 | [post] &mut buffer [&ref] | test_futures_io.rs:146:52:146:57 | [post] buffer | provenance | | | test_futures_io.rs:146:52:146:57 | [post] buffer | test_futures_io.rs:147:15:147:20 | buffer | provenance | | | test_futures_io.rs:147:15:147:20 | buffer | test_futures_io.rs:147:14:147:20 | &buffer | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:14 | a | provenance | | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:75 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:84 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:75 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:84 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:77 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:77 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:86 | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:14 | a | provenance | | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:74 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:83 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:74 | -| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:83 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:76 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:76 | +| web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:85 | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | | | web_frameworks.rs:11:31:11:31 | a | web_frameworks.rs:15:14:15:14 | a | provenance | | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:75 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:84 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:75 | -| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:84 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:74 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:83 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:74 | -| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:83 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:77 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:22 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:77 | +| web_frameworks.rs:13:14:13:14 | a | web_frameworks.rs:13:14:13:23 | a.as_str() | provenance | MaD:86 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:76 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:24 | a.as_bytes() | provenance | MaD:85 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:76 | +| web_frameworks.rs:14:14:14:14 | a | web_frameworks.rs:14:14:14:25 | a.as_bytes() | provenance | MaD:85 | | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | | | web_frameworks.rs:68:15:68:15 | a | web_frameworks.rs:70:14:70:14 | a | provenance | | nodes