From 5b8d0ffaf415436d6ac592542ff88943e42b20aa Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 00:56:20 +0300 Subject: [PATCH 001/181] C#: Separate ASP.NET Core controller helper methods --- .../frameworks/microsoft/AspNetCore.qll | 84 +++++++++++-------- .../security/dataflow/UrlRedirectQuery.qll | 3 +- 2 files changed, 52 insertions(+), 35 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 350465052d1a..fe841bb34f56 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -189,38 +189,61 @@ class MicrosoftAspNetCoreMvcControllerBaseClass extends Class { } } +private predicate isPotentialMicrosoftAspNetCoreMvcController(Class controller) { + controller = + any(Class c | + ( + exists(Assembly a | + a.getName() = ["Microsoft.AspNetCore.Mvc.Core", "Microsoft.AspNetCore.Mvc.ViewFeatures"] + ) or + exists(UsingNamespaceDirective ns | + ns.getImportedNamespace() instanceof MicrosoftAspNetCoreMvcNamespace + ) + ) and + c.isPublic() and + not c instanceof Generic and + ( + c.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass + or + c.getABaseType*().getName().matches("%Controller") + or + c.getABaseType*() + .getAnAttribute() + .getType() + .getABaseType*() + // ApiControllerAttribute is derived from ControllerAttribute + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "ControllerAttribute") + ) and + not c.getABaseType*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonControllerAttribute + ) +} + +/** A class treated as an owner of ASP.NET Core MVC controller helper methods. */ +class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { + MicrosoftAspNetCoreMvcControllerHelperClass() { + isPotentialMicrosoftAspNetCoreMvcController(this) + } + + /** Gets a `Redirect*`, `Accepted*`, or `Created*` method. */ + Method getAResponseMethod() { + result = this.getAMethod() and + ( + result.getName().matches("Redirect%") + or + result.getName().matches("Accepted%") + or + result.getName().matches("Created%") + ) + } +} + /** * A valid ASP.NET Core controller according to: * https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/actions?view=aspnetcore-3.1 * https://github.com/dotnet/aspnetcore/blob/b3c93967ba508b8ef139add27132d9483c1a9eb4/src/Mvc/Mvc.Core/src/Controllers/ControllerFeatureProvider.cs#L39-L75 */ class MicrosoftAspNetCoreMvcController extends Class { - MicrosoftAspNetCoreMvcController() { - ( - exists(Assembly a | - a.getName() = ["Microsoft.AspNetCore.Mvc.Core", "Microsoft.AspNetCore.Mvc.ViewFeatures"] - ) or - exists(UsingNamespaceDirective ns | - ns.getImportedNamespace() instanceof MicrosoftAspNetCoreMvcNamespace - ) - ) and - this.isPublic() and - not this instanceof Generic and - ( - this.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass - or - this.getABaseType*().getName().matches("%Controller") - or - this.getABaseType*() - .getAnAttribute() - .getType() - .getABaseType*() - // ApiControllerAttribute is derived from ControllerAttribute - .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "ControllerAttribute") - ) and - not this.getABaseType*().getAnAttribute() instanceof - MicrosoftAspNetCoreMvcNonControllerAttribute - } + MicrosoftAspNetCoreMvcController() { isPotentialMicrosoftAspNetCoreMvcController(this) } /** Gets an action method for this controller. */ Method getAnActionMethod() { @@ -232,14 +255,7 @@ class MicrosoftAspNetCoreMvcController extends Class { /** Gets a `Redirect*` method. */ Method getARedirectMethod() { - result = this.getAMethod() and - ( - result.getName().matches("Redirect%") - or - result.getName().matches("Accepted%") - or - result.getName().matches("Created%") - ) + result = this.(MicrosoftAspNetCoreMvcControllerHelperClass).getAResponseMethod() } } diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll index bad6c990fa7b..1e53fccaaea1 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/UrlRedirectQuery.qll @@ -251,7 +251,8 @@ class AspNetCoreRedirectSink extends Sink { AspNetCoreRedirectSink() { exists(MethodCall mc | mc.getTarget() = any(MicrosoftAspNetCoreHttpHttpResponse response).getRedirectMethod() or - mc.getTarget() = any(MicrosoftAspNetCoreMvcController response).getARedirectMethod() + mc.getTarget() = + any(MicrosoftAspNetCoreMvcControllerHelperClass response).getAResponseMethod() | // Response.Redirect uses 'location' parameter this.getExpr() = mc.getArgumentForName("location") From 1f7d000b2774e80db9a0842b978d008d403300fa Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 01:12:58 +0300 Subject: [PATCH 002/181] C#: Align ASP.NET Core controller discovery --- .../frameworks/microsoft/AspNetCore.qll | 50 +++++++++-- .../aspremote/aspRemoteFlowSource.expected | 1 - .../frameworks/microsoft/AspNetCore.cs | 83 +++++++++++++++++++ .../frameworks/microsoft/AspNetCore.expected | 7 +- .../microsoft/AspNetCoreActions.expected | 15 ++++ .../frameworks/microsoft/AspNetCoreActions.ql | 9 ++ 6 files changed, 156 insertions(+), 9 deletions(-) create mode 100644 csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected create mode 100644 csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.ql diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index fe841bb34f56..9c77dd2e03fc 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -2,6 +2,7 @@ import csharp import semmle.code.csharp.frameworks.Microsoft +private import semmle.code.csharp.frameworks.System /** The `Microsoft.AspNetCore` namespace. */ class MicrosoftAspNetCoreNamespace extends Namespace { @@ -218,6 +219,46 @@ private predicate isPotentialMicrosoftAspNetCoreMvcController(Class controller) ) } +private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { + ( + exists(Assembly a | + a.getName() = ["Microsoft.AspNetCore.Mvc.Core", "Microsoft.AspNetCore.Mvc.ViewFeatures"] + ) or + exists(UsingNamespaceDirective ns | + ns.getImportedNamespace() instanceof MicrosoftAspNetCoreMvcNamespace + ) + ) and + controller instanceof NonNestedType and + controller.isPublic() and + not controller.isAbstract() and + not controller instanceof Generic and + ( + controller.getName().toLowerCase().matches("%controller") + or + controller.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass + or + controller + .getABaseType*() + .getAnAttribute() + .getType() + .getABaseType*() + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "ControllerAttribute") + ) and + not controller.getABaseType*().getAnAttribute() instanceof + MicrosoftAspNetCoreMvcNonControllerAttribute +} + +private predicate isDefaultMicrosoftAspNetCoreMvcAction(Class controller, Method method) { + controller.hasMember(method) and + method.isPublic() and + not method.isStatic() and + not method.isAbstract() and + not method.getUnboundDeclaration() instanceof UnboundGenericMethod and + not method.getOverridee*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonActionAttribute and + not method.getOverridee*().getDeclaringType() instanceof ObjectType and + not method instanceof DisposeMethod +} + /** A class treated as an owner of ASP.NET Core MVC controller helper methods. */ class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { MicrosoftAspNetCoreMvcControllerHelperClass() { @@ -243,15 +284,10 @@ class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { * https://github.com/dotnet/aspnetcore/blob/b3c93967ba508b8ef139add27132d9483c1a9eb4/src/Mvc/Mvc.Core/src/Controllers/ControllerFeatureProvider.cs#L39-L75 */ class MicrosoftAspNetCoreMvcController extends Class { - MicrosoftAspNetCoreMvcController() { isPotentialMicrosoftAspNetCoreMvcController(this) } + MicrosoftAspNetCoreMvcController() { isDefaultMicrosoftAspNetCoreMvcController(this) } /** Gets an action method for this controller. */ - Method getAnActionMethod() { - result = this.getAMethod() and - result.isPublic() and - not result.isStatic() and - not result.getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonActionAttribute - } + Method getAnActionMethod() { isDefaultMicrosoftAspNetCoreMvcAction(this, result) } /** Gets a `Redirect*` method. */ Method getARedirectMethod() { diff --git a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected index ef7a8f3cd784..2d725fae7601 100644 --- a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected +++ b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected @@ -13,7 +13,6 @@ remoteFlowSources | AspRemoteFlowSource.cs:53:63:53:73 | mapPutParam | | AspRemoteFlowSource.cs:54:69:54:82 | mapDeleteParam | | AspRemoteFlowSource.cs:56:41:56:44 | item | -| AspRemoteFlowSource.cs:64:43:64:47 | param | | AspRemoteFlowSource.cs:71:34:71:35 | id | | AspRemoteFlowSource.cs:73:35:73:41 | command | | AspRemoteFlowSource.cs:73:48:73:52 | count | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs index bcf0c766f340..967ea1d03a3e 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs @@ -101,3 +101,86 @@ public string Index() return "This is Home Controller"; } } + +// has case-insensitive suffix "Controller" +public class LowerCasecontroller +{ + public void Action() { } +} + +// derives from ControllerBase, whose [Controller] attribute is inherited +public class Products : ControllerBase +{ + public void List() { } +} + +// is a nested type +public class ControllerContainer +{ + public class NestedController + { + public void Action() { } + } +} + +// only this base class has the Controller suffix +public class PlainController +{ + public void BaseAction() { } +} + +public class DerivedFromPlain : PlainController +{ + public void DerivedAction() { } +} + +// is a closed subclass of an open generic controller +public class GenericBaseController : ControllerBase +{ + public void GenericBaseAction(string input) { } +} + +public class ClosedGenericController : GenericBaseController +{ + public void ClosedAction(string input) { } +} + +[Controller] +public abstract class AbstractActionBase +{ + public abstract void AbstractAction(string input); + + public void InheritedAction(string input) { } + + [NonAction] + public virtual void InheritedNonAction(string input) { } +} + +public class ConcreteActionEndpoint : AbstractActionBase +{ + public override void AbstractAction(string input) { } + + public override void InheritedNonAction(string input) { } +} + +public class ActionCasesController : ControllerBase, System.IDisposable +{ + public void PublicAction(string input) { } + + public static void StaticAction(string input) { } + + public void GenericAction(T input) { } + + [NonAction] + public void ExplicitNonAction(string input) { } + + public override string ToString() => "action cases"; + + public void Dispose() { } + + protected void ProtectedAction(string input) { } + + internal void InternalAction(string input) { } + + private void PrivateAction(string input) { } +} diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected index e9866698ccdc..809e657405e3 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected @@ -4,4 +4,9 @@ | AspNetCore.cs:32:14:32:28 | HomeController3 | | AspNetCore.cs:42:14:42:28 | HomeController4 | | AspNetCore.cs:51:14:51:28 | HomeController5 | -| AspNetCore.cs:60:23:60:37 | HomeController6 | +| AspNetCore.cs:106:14:106:32 | LowerCasecontroller | +| AspNetCore.cs:112:14:112:21 | Products | +| AspNetCore.cs:127:14:127:28 | PlainController | +| AspNetCore.cs:143:14:143:36 | ClosedGenericController | +| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | +| AspNetCore.cs:166:14:166:34 | ActionCasesController | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected new file mode 100644 index 000000000000..98307a1521ad --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected @@ -0,0 +1,15 @@ +| AspNetCore.cs:4:14:4:27 | HomeController | AspNetCore.cs:6:19:6:23 | Index | +| AspNetCore.cs:13:14:13:28 | HomeController1 | AspNetCore.cs:15:19:15:23 | Index | +| AspNetCore.cs:22:14:22:28 | HomeController2 | AspNetCore.cs:24:19:24:23 | Index | +| AspNetCore.cs:32:14:32:28 | HomeController3 | AspNetCore.cs:34:19:34:23 | Index | +| AspNetCore.cs:42:14:42:28 | HomeController4 | AspNetCore.cs:44:19:44:23 | Index | +| AspNetCore.cs:51:14:51:28 | HomeController5 | AspNetCore.cs:44:19:44:23 | Index | +| AspNetCore.cs:51:14:51:28 | HomeController5 | AspNetCore.cs:53:19:53:23 | Index | +| AspNetCore.cs:106:14:106:32 | LowerCasecontroller | AspNetCore.cs:108:17:108:22 | Action | +| AspNetCore.cs:112:14:112:21 | Products | AspNetCore.cs:114:17:114:20 | List | +| AspNetCore.cs:127:14:127:28 | PlainController | AspNetCore.cs:129:17:129:26 | BaseAction | +| AspNetCore.cs:143:14:143:36 | ClosedGenericController | AspNetCore.cs:140:17:140:33 | GenericBaseAction | +| AspNetCore.cs:143:14:143:36 | ClosedGenericController | AspNetCore.cs:145:17:145:28 | ClosedAction | +| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | AspNetCore.cs:153:17:153:31 | InheritedAction | +| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | AspNetCore.cs:161:26:161:39 | AbstractAction | +| AspNetCore.cs:166:14:166:34 | ActionCasesController | AspNetCore.cs:168:17:168:28 | PublicAction | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.ql b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.ql new file mode 100644 index 000000000000..f4e927cd0b07 --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.ql @@ -0,0 +1,9 @@ +import csharp +import semmle.code.csharp.frameworks.microsoft.AspNetCore + +from MicrosoftAspNetCoreMvcController controller, Method action +where + controller.fromSource() and + action = controller.getAnActionMethod() and + action.fromSource() +select controller, action From 9921b891fe320884467fecdb8f07e58f9749675c Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 01:19:44 +0300 Subject: [PATCH 003/181] C#: Exclude injected MVC services from remote input --- .../security/dataflow/flowsources/Remote.qll | 14 +++++- .../aspremote/AspRemoteFlowSource.cs | 22 +++++++++ .../aspremote/aspRemoteFlowSource.expected | 45 ++++++++++--------- 3 files changed, 60 insertions(+), 21 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll index 68c06a1828de..d0358f6803fc 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll @@ -306,7 +306,19 @@ class AspNetCoreActionMethodParameter extends AspNetCoreRemoteFlowSource, DataFl AspNetCoreActionMethodParameter() { exists(Parameter p | p = this.getParameter() and - p.fromSource() + p.fromSource() and + not exists(Attribute attr, ValueOrRefType attributeBase | attr = p.getAnAttribute() | + attributeBase = attr.getType().getABaseType*() and + ( + attributeBase + .getABaseInterface*() + .hasFullyQualifiedName("Microsoft.AspNetCore.Http.Metadata", "IFromServiceMetadata") + or + attributeBase + .hasFullyQualifiedName("Microsoft.Extensions.DependencyInjection", + "FromKeyedServicesAttribute") + ) + ) | p = any(MicrosoftAspNetCoreMvcController c).getAnActionMethod().getAParameter() ) diff --git a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/AspRemoteFlowSource.cs b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/AspRemoteFlowSource.cs index 5bc8025f231b..d7b085ef61fd 100644 --- a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/AspRemoteFlowSource.cs +++ b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/AspRemoteFlowSource.cs @@ -1,5 +1,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; using System; namespace Testing @@ -21,6 +22,27 @@ public object MyAction(ViewModel viewModel) { throw null; } + + public void BindingSources( + string ordinary, + [FromQuery] string fromQuery, + [FromBody] string fromBody, + [FromRoute] string fromRoute, + [FromHeader] string fromHeader, + [FromServices] IRequestService fromServices, + [CustomFromServices] IRequestService customFromServices, + [FromKeyedServices("cache")] IRequestService fromKeyedServices, + [CustomFromKeyedServices] IRequestService customFromKeyedServices) + { } + } + + public interface IRequestService { } + + public sealed class CustomFromServicesAttribute : FromServicesAttribute { } + + public sealed class CustomFromKeyedServicesAttribute : FromKeyedServicesAttribute + { + public CustomFromKeyedServicesAttribute() : base("custom") { } } public class Item diff --git a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected index 2d725fae7601..6ba2741857b5 100644 --- a/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected +++ b/csharp/ql/test/library-tests/dataflow/flowsources/aspremote/aspRemoteFlowSource.expected @@ -1,22 +1,27 @@ remoteFlowSourceMembers -| AspRemoteFlowSource.cs:10:23:10:31 | RequestId | -| AspRemoteFlowSource.cs:11:23:11:36 | RequestIdField | -| AspRemoteFlowSource.cs:28:23:28:29 | Tainted | +| AspRemoteFlowSource.cs:11:23:11:31 | RequestId | +| AspRemoteFlowSource.cs:12:23:12:36 | RequestIdField | +| AspRemoteFlowSource.cs:50:23:50:29 | Tainted | remoteFlowSources -| AspRemoteFlowSource.cs:20:42:20:50 | viewModel | -| AspRemoteFlowSource.cs:35:42:35:46 | param | -| AspRemoteFlowSource.cs:43:58:43:63 | newUrl | -| AspRemoteFlowSource.cs:44:61:44:65 | myApi | -| AspRemoteFlowSource.cs:44:75:44:79 | myUrl | -| AspRemoteFlowSource.cs:46:46:46:56 | lambdaParam | -| AspRemoteFlowSource.cs:52:65:52:76 | mapPostParam | -| AspRemoteFlowSource.cs:53:63:53:73 | mapPutParam | -| AspRemoteFlowSource.cs:54:69:54:82 | mapDeleteParam | -| AspRemoteFlowSource.cs:56:41:56:44 | item | -| AspRemoteFlowSource.cs:71:34:71:35 | id | -| AspRemoteFlowSource.cs:73:35:73:41 | command | -| AspRemoteFlowSource.cs:73:48:73:52 | count | -| AspRemoteFlowSource.cs:75:40:75:43 | data | -| AspRemoteFlowSource.cs:77:34:77:38 | value | -| AspRemoteFlowSource.cs:79:37:79:42 | itemId | -| AspRemoteFlowSource.cs:92:35:92:46 | derivedParam | +| AspRemoteFlowSource.cs:21:42:21:50 | viewModel | +| AspRemoteFlowSource.cs:27:20:27:27 | ordinary | +| AspRemoteFlowSource.cs:28:32:28:40 | fromQuery | +| AspRemoteFlowSource.cs:29:31:29:38 | fromBody | +| AspRemoteFlowSource.cs:30:32:30:40 | fromRoute | +| AspRemoteFlowSource.cs:31:33:31:42 | fromHeader | +| AspRemoteFlowSource.cs:57:42:57:46 | param | +| AspRemoteFlowSource.cs:65:58:65:63 | newUrl | +| AspRemoteFlowSource.cs:66:61:66:65 | myApi | +| AspRemoteFlowSource.cs:66:75:66:79 | myUrl | +| AspRemoteFlowSource.cs:68:46:68:56 | lambdaParam | +| AspRemoteFlowSource.cs:74:65:74:76 | mapPostParam | +| AspRemoteFlowSource.cs:75:63:75:73 | mapPutParam | +| AspRemoteFlowSource.cs:76:69:76:82 | mapDeleteParam | +| AspRemoteFlowSource.cs:78:41:78:44 | item | +| AspRemoteFlowSource.cs:93:34:93:35 | id | +| AspRemoteFlowSource.cs:95:35:95:41 | command | +| AspRemoteFlowSource.cs:95:48:95:52 | count | +| AspRemoteFlowSource.cs:97:40:97:43 | data | +| AspRemoteFlowSource.cs:99:34:99:38 | value | +| AspRemoteFlowSource.cs:101:37:101:42 | itemId | +| AspRemoteFlowSource.cs:114:35:114:46 | derivedParam | From 526f4383424cfcc965d8de07d27436c8648fec43 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 01:38:08 +0300 Subject: [PATCH 004/181] C#: Scope convention-based controllers to MVC apps --- .../Controllers.expected | 3 + .../Controllers.ql | 6 ++ .../GeneratedController.cs | 6 ++ .../GeneratedControllers.csproj | 5 + .../IncludedControllers/IncludedController.cs | 6 ++ .../IncludedControllers.csproj | 5 + .../Unrelated/ThrottlingController.cs | 4 + .../Unrelated/Unrelated.csproj | 5 + .../WebApp/ApplicationParts.cs | 3 + .../WebApp/Program.cs | 12 +++ .../WebApp/WebApp.csproj | 9 ++ .../WebApp/WebPocoController.cs | 4 + .../global.json | 5 + .../aspnetcore_controller_discovery/test.py | 7 ++ .../frameworks/microsoft/AspNetCore.qll | 91 +++++++++++++++---- .../frameworks/microsoft/AspNetCore.cs | 9 ++ .../frameworks/microsoft/AspNetCore.expected | 24 ++--- .../microsoft/AspNetCoreActions.expected | 30 +++--- 18 files changed, 190 insertions(+), 44 deletions(-) create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.ql create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedControllers.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedControllers.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/ThrottlingController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/Unrelated.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/ApplicationParts.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebApp.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebPocoController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/global.json create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected new file mode 100644 index 000000000000..730310ba30a3 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected @@ -0,0 +1,3 @@ +| GeneratedController.cs | GeneratedController | +| IncludedController.cs | IncludedController | +| WebPocoController.cs | WebPocoController | \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.ql b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.ql new file mode 100644 index 000000000000..325f55434f5f --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.ql @@ -0,0 +1,6 @@ +import csharp +import semmle.code.csharp.frameworks.microsoft.AspNetCore + +from MicrosoftAspNetCoreMvcController controller +where controller.fromSource() +select controller.getFile().getBaseName(), controller.getName() diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedController.cs new file mode 100644 index 000000000000..0fe26a40d27b --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedController.cs @@ -0,0 +1,6 @@ +namespace GeneratedControllers; + +public class GeneratedController +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedControllers.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedControllers.csproj new file mode 100644 index 000000000000..10f1ac4e07e4 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/GeneratedControllers/GeneratedControllers.csproj @@ -0,0 +1,5 @@ + + + net10.0 + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedController.cs new file mode 100644 index 000000000000..04704dd9b064 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedController.cs @@ -0,0 +1,6 @@ +namespace IncludedControllers; + +public class IncludedController +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedControllers.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedControllers.csproj new file mode 100644 index 000000000000..10f1ac4e07e4 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/IncludedControllers/IncludedControllers.csproj @@ -0,0 +1,5 @@ + + + net10.0 + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/ThrottlingController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/ThrottlingController.cs new file mode 100644 index 000000000000..d4277061e9fa --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/ThrottlingController.cs @@ -0,0 +1,4 @@ +public class ThrottlingController +{ + public void Initialize(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/Unrelated.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/Unrelated.csproj new file mode 100644 index 000000000000..10f1ac4e07e4 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Unrelated/Unrelated.csproj @@ -0,0 +1,5 @@ + + + net10.0 + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/ApplicationParts.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/ApplicationParts.cs new file mode 100644 index 000000000000..a7622ef5f9be --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/ApplicationParts.cs @@ -0,0 +1,3 @@ +using Microsoft.AspNetCore.Mvc.ApplicationParts; + +[assembly: ApplicationPart("GeneratedControllers")] \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs new file mode 100644 index 000000000000..8db4f837d75d --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs @@ -0,0 +1,12 @@ +using IncludedControllers; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +var builder = WebApplication.CreateBuilder(args); +builder.Services + .AddControllers() + .AddApplicationPart(typeof(IncludedController).Assembly); + +var app = builder.Build(); +app.MapControllers(); +app.Run(); \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebApp.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebApp.csproj new file mode 100644 index 000000000000..56bc24531254 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebApp.csproj @@ -0,0 +1,9 @@ + + + net10.0 + + + + + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebPocoController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebPocoController.cs new file mode 100644 index 000000000000..338ebd5abe67 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/WebPocoController.cs @@ -0,0 +1,4 @@ +public class WebPocoController +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/global.json b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/global.json new file mode 100644 index 000000000000..7307ac0a4729 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/global.json @@ -0,0 +1,5 @@ +{ + "sdk": { + "version": "10.0.201" + } +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py new file mode 100644 index 000000000000..66f5e8666b02 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py @@ -0,0 +1,7 @@ +def test(codeql, csharp): + codeql.database.create( + command=[ + "dotnet build -t:Rebuild WebApp/WebApp.csproj", + "dotnet build -t:Rebuild Unrelated/Unrelated.csproj", + ] + ) \ No newline at end of file diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 9c77dd2e03fc..e49f6f509984 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -2,6 +2,7 @@ import csharp import semmle.code.csharp.frameworks.Microsoft +private import semmle.code.csharp.commons.Compilation private import semmle.code.csharp.frameworks.System /** The `Microsoft.AspNetCore` namespace. */ @@ -219,30 +220,86 @@ private predicate isPotentialMicrosoftAspNetCoreMvcController(Class controller) ) } +private Compilation getACompilationFor(Element element) { + result.getAFileCompiled() = element.getFile() +} + +private Assembly getAnAssemblyFor(Type type) { + result = getACompilationFor(type).getOutputAssembly() +} + +private predicate isMicrosoftAspNetCoreMvcRegistration(MethodCall call) { + call.getTarget() + .hasFullyQualifiedName("Microsoft.Extensions.DependencyInjection", + ["MvcServiceCollectionExtensions", "MvcCoreServiceCollectionExtensions"], + ["AddControllers", "AddControllersWithViews", "AddMvc", "AddMvcCore"]) +} + +private predicate isMicrosoftAspNetCoreMvcApplication(Compilation compilation) { + exists(MethodCall registration | + isMicrosoftAspNetCoreMvcRegistration(registration) and + compilation.getAFileCompiled() = registration.getFile() + ) +} + +private predicate isMicrosoftAspNetCoreMvcAddApplicationPart(MethodCall call) { + call.getTarget() + .hasFullyQualifiedName("Microsoft.Extensions.DependencyInjection", + ["MvcCoreMvcBuilderExtensions", "MvcCoreMvcCoreBuilderExtensions"], "AddApplicationPart") +} + +private predicate isMicrosoftAspNetCoreMvcApplicationPart(Compilation application, Assembly part) { + part = application.getOutputAssembly() + or + exists(AssemblyAttribute attr, StringLiteral assemblyName | + application.getAFileCompiled() = attr.getFile() and + attr.getType() + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc.ApplicationParts", + "ApplicationPartAttribute") and + assemblyName = attr.getArgument(0) and + assemblyName.getValue() = part.getName() + ) + or + exists(MethodCall addPart, PropertyAccess assemblyAccess, TypeofExpr typeOf, Type partType | + application.getAFileCompiled() = addPart.getFile() and + isMicrosoftAspNetCoreMvcAddApplicationPart(addPart) and + assemblyAccess = addPart.getArgumentForName("assembly") and + assemblyAccess.getTarget().hasName("Assembly") and + assemblyAccess.getQualifier() = typeOf and + partType = typeOf.getTypeAccess().getTarget() and + part = getAnAssemblyFor(partType) + ) +} + +private predicate isInMicrosoftAspNetCoreMvcApplication(Class controller) { + exists(Compilation application, Assembly controllerAssembly | + isMicrosoftAspNetCoreMvcApplication(application) and + controllerAssembly = getAnAssemblyFor(controller) and + isMicrosoftAspNetCoreMvcApplicationPart(application, controllerAssembly) + ) +} + +private predicate hasMicrosoftAspNetCoreMvcControllerIdentity(Class controller) { + controller.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass + or + controller + .getABaseType*() + .getAnAttribute() + .getType() + .getABaseType*() + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "ControllerAttribute") +} + private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { - ( - exists(Assembly a | - a.getName() = ["Microsoft.AspNetCore.Mvc.Core", "Microsoft.AspNetCore.Mvc.ViewFeatures"] - ) or - exists(UsingNamespaceDirective ns | - ns.getImportedNamespace() instanceof MicrosoftAspNetCoreMvcNamespace - ) - ) and controller instanceof NonNestedType and controller.isPublic() and not controller.isAbstract() and not controller instanceof Generic and ( - controller.getName().toLowerCase().matches("%controller") - or - controller.getABaseType*() instanceof MicrosoftAspNetCoreMvcControllerBaseClass + hasMicrosoftAspNetCoreMvcControllerIdentity(controller) or - controller - .getABaseType*() - .getAnAttribute() - .getType() - .getABaseType*() - .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "ControllerAttribute") + controller.getName().toLowerCase().matches("%controller") and + isInMicrosoftAspNetCoreMvcApplication(controller) ) and not controller.getABaseType*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonControllerAttribute diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs index 967ea1d03a3e..aa9af201259c 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs @@ -1,4 +1,13 @@ using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; + +public static class MvcRegistration +{ + public static void Register(IServiceCollection services) + { + services.AddControllers(); + } +} // has sufix "Controller" public class HomeController diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected index 809e657405e3..f62e295c1080 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected @@ -1,12 +1,12 @@ -| AspNetCore.cs:4:14:4:27 | HomeController | -| AspNetCore.cs:13:14:13:28 | HomeController1 | -| AspNetCore.cs:22:14:22:28 | HomeController2 | -| AspNetCore.cs:32:14:32:28 | HomeController3 | -| AspNetCore.cs:42:14:42:28 | HomeController4 | -| AspNetCore.cs:51:14:51:28 | HomeController5 | -| AspNetCore.cs:106:14:106:32 | LowerCasecontroller | -| AspNetCore.cs:112:14:112:21 | Products | -| AspNetCore.cs:127:14:127:28 | PlainController | -| AspNetCore.cs:143:14:143:36 | ClosedGenericController | -| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | -| AspNetCore.cs:166:14:166:34 | ActionCasesController | +| AspNetCore.cs:13:14:13:27 | HomeController | +| AspNetCore.cs:22:14:22:28 | HomeController1 | +| AspNetCore.cs:31:14:31:28 | HomeController2 | +| AspNetCore.cs:41:14:41:28 | HomeController3 | +| AspNetCore.cs:51:14:51:28 | HomeController4 | +| AspNetCore.cs:60:14:60:28 | HomeController5 | +| AspNetCore.cs:115:14:115:32 | LowerCasecontroller | +| AspNetCore.cs:121:14:121:21 | Products | +| AspNetCore.cs:136:14:136:28 | PlainController | +| AspNetCore.cs:152:14:152:36 | ClosedGenericController | +| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | +| AspNetCore.cs:175:14:175:34 | ActionCasesController | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected index 98307a1521ad..bd8e266fcd8a 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected @@ -1,15 +1,15 @@ -| AspNetCore.cs:4:14:4:27 | HomeController | AspNetCore.cs:6:19:6:23 | Index | -| AspNetCore.cs:13:14:13:28 | HomeController1 | AspNetCore.cs:15:19:15:23 | Index | -| AspNetCore.cs:22:14:22:28 | HomeController2 | AspNetCore.cs:24:19:24:23 | Index | -| AspNetCore.cs:32:14:32:28 | HomeController3 | AspNetCore.cs:34:19:34:23 | Index | -| AspNetCore.cs:42:14:42:28 | HomeController4 | AspNetCore.cs:44:19:44:23 | Index | -| AspNetCore.cs:51:14:51:28 | HomeController5 | AspNetCore.cs:44:19:44:23 | Index | -| AspNetCore.cs:51:14:51:28 | HomeController5 | AspNetCore.cs:53:19:53:23 | Index | -| AspNetCore.cs:106:14:106:32 | LowerCasecontroller | AspNetCore.cs:108:17:108:22 | Action | -| AspNetCore.cs:112:14:112:21 | Products | AspNetCore.cs:114:17:114:20 | List | -| AspNetCore.cs:127:14:127:28 | PlainController | AspNetCore.cs:129:17:129:26 | BaseAction | -| AspNetCore.cs:143:14:143:36 | ClosedGenericController | AspNetCore.cs:140:17:140:33 | GenericBaseAction | -| AspNetCore.cs:143:14:143:36 | ClosedGenericController | AspNetCore.cs:145:17:145:28 | ClosedAction | -| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | AspNetCore.cs:153:17:153:31 | InheritedAction | -| AspNetCore.cs:159:14:159:35 | ConcreteActionEndpoint | AspNetCore.cs:161:26:161:39 | AbstractAction | -| AspNetCore.cs:166:14:166:34 | ActionCasesController | AspNetCore.cs:168:17:168:28 | PublicAction | +| AspNetCore.cs:13:14:13:27 | HomeController | AspNetCore.cs:15:19:15:23 | Index | +| AspNetCore.cs:22:14:22:28 | HomeController1 | AspNetCore.cs:24:19:24:23 | Index | +| AspNetCore.cs:31:14:31:28 | HomeController2 | AspNetCore.cs:33:19:33:23 | Index | +| AspNetCore.cs:41:14:41:28 | HomeController3 | AspNetCore.cs:43:19:43:23 | Index | +| AspNetCore.cs:51:14:51:28 | HomeController4 | AspNetCore.cs:53:19:53:23 | Index | +| AspNetCore.cs:60:14:60:28 | HomeController5 | AspNetCore.cs:53:19:53:23 | Index | +| AspNetCore.cs:60:14:60:28 | HomeController5 | AspNetCore.cs:62:19:62:23 | Index | +| AspNetCore.cs:115:14:115:32 | LowerCasecontroller | AspNetCore.cs:117:17:117:22 | Action | +| AspNetCore.cs:121:14:121:21 | Products | AspNetCore.cs:123:17:123:20 | List | +| AspNetCore.cs:136:14:136:28 | PlainController | AspNetCore.cs:138:17:138:26 | BaseAction | +| AspNetCore.cs:152:14:152:36 | ClosedGenericController | AspNetCore.cs:149:17:149:33 | GenericBaseAction | +| AspNetCore.cs:152:14:152:36 | ClosedGenericController | AspNetCore.cs:154:17:154:28 | ClosedAction | +| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | AspNetCore.cs:162:17:162:31 | InheritedAction | +| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | AspNetCore.cs:170:26:170:39 | AbstractAction | +| AspNetCore.cs:175:14:175:34 | ActionCasesController | AspNetCore.cs:177:17:177:28 | PublicAction | From 93dac2c9e49509d0403bd42ce77389cc9f746705 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 01:48:06 +0300 Subject: [PATCH 005/181] C#: Account for MVC endpoint mappings --- .../AttributePocoController.cs | 8 ++ .../AttributeWebApp/AttributeWebApp.csproj | 5 ++ .../ConventionOnlyController.cs | 4 + .../AttributeWebApp/Program.cs | 9 +++ .../Controllers.expected | 8 +- .../UnmappedWebApp/Program.cs | 8 ++ .../UnmappedWebApp/StructuralController.cs | 6 ++ .../UnmappedWebApp/UnmappedPocoController.cs | 4 + .../UnmappedWebApp/UnmappedWebApp.csproj | 5 ++ .../WebApp/Program.cs | 4 +- .../aspnetcore_controller_discovery/test.py | 4 +- .../frameworks/microsoft/AspNetCore.qll | 77 +++++++++++++++++-- .../frameworks/microsoft/AspNetCore.cs | 5 +- .../frameworks/microsoft/AspNetCore.expected | 24 +++--- .../microsoft/AspNetCoreActions.expected | 30 ++++---- 15 files changed, 160 insertions(+), 41 deletions(-) create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributePocoController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributeWebApp.csproj create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/ConventionOnlyController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/StructuralController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedPocoController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedWebApp.csproj diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributePocoController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributePocoController.cs new file mode 100644 index 000000000000..f4427cc21c48 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributePocoController.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Mvc; + +[Route("api/attribute")] +public class AttributePocoController +{ + [HttpGet] + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributeWebApp.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributeWebApp.csproj new file mode 100644 index 000000000000..bddc74e0c784 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/AttributeWebApp.csproj @@ -0,0 +1,5 @@ + + + net10.0 + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/ConventionOnlyController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/ConventionOnlyController.cs new file mode 100644 index 000000000000..f1222ad5f181 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/ConventionOnlyController.cs @@ -0,0 +1,4 @@ +public class ConventionOnlyController +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/Program.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/Program.cs new file mode 100644 index 000000000000..8d74291b16a8 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/AttributeWebApp/Program.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddControllers(); + +var app = builder.Build(); +app.MapControllers(); +app.Run(); \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected index 730310ba30a3..22c2ca299300 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected @@ -1,3 +1,5 @@ -| GeneratedController.cs | GeneratedController | -| IncludedController.cs | IncludedController | -| WebPocoController.cs | WebPocoController | \ No newline at end of file +| AttributePocoController.cs | AttributePocoController | +| GeneratedController.cs | GeneratedController | +| IncludedController.cs | IncludedController | +| StructuralController.cs | StructuralController | +| WebPocoController.cs | WebPocoController | \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs new file mode 100644 index 000000000000..6cf99003feb3 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +var builder = WebApplication.CreateBuilder(args); +builder.Services.AddControllers(); + +var app = builder.Build(); +app.Run(); \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/StructuralController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/StructuralController.cs new file mode 100644 index 000000000000..dd9e5e2534b5 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/StructuralController.cs @@ -0,0 +1,6 @@ +using Microsoft.AspNetCore.Mvc; + +public class StructuralController : ControllerBase +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedPocoController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedPocoController.cs new file mode 100644 index 000000000000..99514ceb2c3f --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedPocoController.cs @@ -0,0 +1,4 @@ +public class UnmappedPocoController +{ + public void Action(string input) => _ = GetType().Name + input; +} \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedWebApp.csproj b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedWebApp.csproj new file mode 100644 index 000000000000..bddc74e0c784 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/UnmappedWebApp.csproj @@ -0,0 +1,5 @@ + + + net10.0 + + \ No newline at end of file diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs index 8db4f837d75d..a58be59888d9 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/WebApp/Program.cs @@ -8,5 +8,5 @@ .AddApplicationPart(typeof(IncludedController).Assembly); var app = builder.Build(); -app.MapControllers(); -app.Run(); \ No newline at end of file +app.MapControllerRoute("default", "{controller}/{action}"); +app.Run(); diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py index 66f5e8666b02..8e705bd10c06 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/test.py @@ -2,6 +2,8 @@ def test(codeql, csharp): codeql.database.create( command=[ "dotnet build -t:Rebuild WebApp/WebApp.csproj", + "dotnet build -t:Rebuild AttributeWebApp/AttributeWebApp.csproj", + "dotnet build -t:Rebuild UnmappedWebApp/UnmappedWebApp.csproj", "dotnet build -t:Rebuild Unrelated/Unrelated.csproj", ] - ) \ No newline at end of file + ) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index e49f6f509984..1717ebc218f0 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -271,11 +271,71 @@ private predicate isMicrosoftAspNetCoreMvcApplicationPart(Compilation applicatio ) } -private predicate isInMicrosoftAspNetCoreMvcApplication(Class controller) { - exists(Compilation application, Assembly controllerAssembly | - isMicrosoftAspNetCoreMvcApplication(application) and - controllerAssembly = getAnAssemblyFor(controller) and - isMicrosoftAspNetCoreMvcApplicationPart(application, controllerAssembly) +private predicate isInMicrosoftAspNetCoreMvcApplication(Class controller, Compilation application) { + isMicrosoftAspNetCoreMvcApplication(application) and + isMicrosoftAspNetCoreMvcApplicationPart(application, getAnAssemblyFor(controller)) +} + +private predicate hasMicrosoftAspNetCoreMvcAttributeRoute(Class controller) { + exists(Attribute attr | + ( + attr = controller.getABaseType*().getAnAttribute() + or + exists(Method method | + controller.hasMember(method) and + attr = method.getOverridee*().getAnAttribute() + ) + ) and + attr.getType() + .getABaseType*() + .getABaseInterface*() + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc.Routing", "IRouteTemplateProvider") + ) +} + +private predicate isMicrosoftAspNetCoreMvcConventionalEndpointMapping(MethodCall call) { + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", + "ControllerEndpointRouteBuilderExtensions", + [ + "MapAreaControllerRoute", "MapControllerRoute", "MapDefaultControllerRoute", + "MapDynamicControllerRoute" + ]) + or + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", "MvcApplicationBuilderExtensions", + "UseMvcWithDefaultRoute") + or + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", "MvcApplicationBuilderExtensions", + "UseMvc") and + exists(call.getArgumentForName("configureRoutes")) + or + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", "MvcAreaRouteBuilderExtensions", + "MapAreaRoute") +} + +private predicate isMicrosoftAspNetCoreMvcAttributeEndpointMapping(MethodCall call) { + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", + "ControllerEndpointRouteBuilderExtensions", "MapControllers") + or + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", "MvcApplicationBuilderExtensions", + "UseMvc") and + not exists(call.getArgumentForName("configureRoutes")) +} + +private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation application, Class controller) { + exists(MethodCall mapping | + application.getAFileCompiled() = mapping.getFile() and + ( + isMicrosoftAspNetCoreMvcConventionalEndpointMapping(mapping) + or + isMicrosoftAspNetCoreMvcAttributeEndpointMapping(mapping) and + hasMicrosoftAspNetCoreMvcAttributeRoute(controller) + ) ) } @@ -298,8 +358,11 @@ private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { ( hasMicrosoftAspNetCoreMvcControllerIdentity(controller) or - controller.getName().toLowerCase().matches("%controller") and - isInMicrosoftAspNetCoreMvcApplication(controller) + exists(Compilation application | + controller.getName().toLowerCase().matches("%controller") and + isInMicrosoftAspNetCoreMvcApplication(controller, application) and + hasMicrosoftAspNetCoreMvcEndpointMapping(application, controller) + ) ) and not controller.getABaseType*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonControllerAttribute diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs index aa9af201259c..7e0c880a766e 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs @@ -1,11 +1,14 @@ using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.DependencyInjection; public static class MvcRegistration { - public static void Register(IServiceCollection services) + public static void Register(IServiceCollection services, IEndpointRouteBuilder endpoints) { services.AddControllers(); + endpoints.MapControllerRoute("default", "{controller}/{action}"); } } diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected index f62e295c1080..444058a4add4 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected @@ -1,12 +1,12 @@ -| AspNetCore.cs:13:14:13:27 | HomeController | -| AspNetCore.cs:22:14:22:28 | HomeController1 | -| AspNetCore.cs:31:14:31:28 | HomeController2 | -| AspNetCore.cs:41:14:41:28 | HomeController3 | -| AspNetCore.cs:51:14:51:28 | HomeController4 | -| AspNetCore.cs:60:14:60:28 | HomeController5 | -| AspNetCore.cs:115:14:115:32 | LowerCasecontroller | -| AspNetCore.cs:121:14:121:21 | Products | -| AspNetCore.cs:136:14:136:28 | PlainController | -| AspNetCore.cs:152:14:152:36 | ClosedGenericController | -| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | -| AspNetCore.cs:175:14:175:34 | ActionCasesController | +| AspNetCore.cs:16:14:16:27 | HomeController | +| AspNetCore.cs:25:14:25:28 | HomeController1 | +| AspNetCore.cs:34:14:34:28 | HomeController2 | +| AspNetCore.cs:44:14:44:28 | HomeController3 | +| AspNetCore.cs:54:14:54:28 | HomeController4 | +| AspNetCore.cs:63:14:63:28 | HomeController5 | +| AspNetCore.cs:118:14:118:32 | LowerCasecontroller | +| AspNetCore.cs:124:14:124:21 | Products | +| AspNetCore.cs:139:14:139:28 | PlainController | +| AspNetCore.cs:155:14:155:36 | ClosedGenericController | +| AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | +| AspNetCore.cs:178:14:178:34 | ActionCasesController | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected index bd8e266fcd8a..c3222a0cbf4d 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected @@ -1,15 +1,15 @@ -| AspNetCore.cs:13:14:13:27 | HomeController | AspNetCore.cs:15:19:15:23 | Index | -| AspNetCore.cs:22:14:22:28 | HomeController1 | AspNetCore.cs:24:19:24:23 | Index | -| AspNetCore.cs:31:14:31:28 | HomeController2 | AspNetCore.cs:33:19:33:23 | Index | -| AspNetCore.cs:41:14:41:28 | HomeController3 | AspNetCore.cs:43:19:43:23 | Index | -| AspNetCore.cs:51:14:51:28 | HomeController4 | AspNetCore.cs:53:19:53:23 | Index | -| AspNetCore.cs:60:14:60:28 | HomeController5 | AspNetCore.cs:53:19:53:23 | Index | -| AspNetCore.cs:60:14:60:28 | HomeController5 | AspNetCore.cs:62:19:62:23 | Index | -| AspNetCore.cs:115:14:115:32 | LowerCasecontroller | AspNetCore.cs:117:17:117:22 | Action | -| AspNetCore.cs:121:14:121:21 | Products | AspNetCore.cs:123:17:123:20 | List | -| AspNetCore.cs:136:14:136:28 | PlainController | AspNetCore.cs:138:17:138:26 | BaseAction | -| AspNetCore.cs:152:14:152:36 | ClosedGenericController | AspNetCore.cs:149:17:149:33 | GenericBaseAction | -| AspNetCore.cs:152:14:152:36 | ClosedGenericController | AspNetCore.cs:154:17:154:28 | ClosedAction | -| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | AspNetCore.cs:162:17:162:31 | InheritedAction | -| AspNetCore.cs:168:14:168:35 | ConcreteActionEndpoint | AspNetCore.cs:170:26:170:39 | AbstractAction | -| AspNetCore.cs:175:14:175:34 | ActionCasesController | AspNetCore.cs:177:17:177:28 | PublicAction | +| AspNetCore.cs:16:14:16:27 | HomeController | AspNetCore.cs:18:19:18:23 | Index | +| AspNetCore.cs:25:14:25:28 | HomeController1 | AspNetCore.cs:27:19:27:23 | Index | +| AspNetCore.cs:34:14:34:28 | HomeController2 | AspNetCore.cs:36:19:36:23 | Index | +| AspNetCore.cs:44:14:44:28 | HomeController3 | AspNetCore.cs:46:19:46:23 | Index | +| AspNetCore.cs:54:14:54:28 | HomeController4 | AspNetCore.cs:56:19:56:23 | Index | +| AspNetCore.cs:63:14:63:28 | HomeController5 | AspNetCore.cs:56:19:56:23 | Index | +| AspNetCore.cs:63:14:63:28 | HomeController5 | AspNetCore.cs:65:19:65:23 | Index | +| AspNetCore.cs:118:14:118:32 | LowerCasecontroller | AspNetCore.cs:120:17:120:22 | Action | +| AspNetCore.cs:124:14:124:21 | Products | AspNetCore.cs:126:17:126:20 | List | +| AspNetCore.cs:139:14:139:28 | PlainController | AspNetCore.cs:141:17:141:26 | BaseAction | +| AspNetCore.cs:155:14:155:36 | ClosedGenericController | AspNetCore.cs:152:17:152:33 | GenericBaseAction | +| AspNetCore.cs:155:14:155:36 | ClosedGenericController | AspNetCore.cs:157:17:157:28 | ClosedAction | +| AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | AspNetCore.cs:165:17:165:31 | InheritedAction | +| AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | AspNetCore.cs:173:26:173:39 | AbstractAction | +| AspNetCore.cs:178:14:178:34 | ActionCasesController | AspNetCore.cs:180:17:180:28 | PublicAction | From 17d49362c3fb2d1b15da488f93b3d8b1154e7139 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 02:31:02 +0300 Subject: [PATCH 006/181] C#: Reduce ASP.NET Core action lookup cost --- .../frameworks/microsoft/AspNetCore.qll | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 1717ebc218f0..f031777d8ca9 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -368,17 +368,6 @@ private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { MicrosoftAspNetCoreMvcNonControllerAttribute } -private predicate isDefaultMicrosoftAspNetCoreMvcAction(Class controller, Method method) { - controller.hasMember(method) and - method.isPublic() and - not method.isStatic() and - not method.isAbstract() and - not method.getUnboundDeclaration() instanceof UnboundGenericMethod and - not method.getOverridee*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonActionAttribute and - not method.getOverridee*().getDeclaringType() instanceof ObjectType and - not method instanceof DisposeMethod -} - /** A class treated as an owner of ASP.NET Core MVC controller helper methods. */ class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { MicrosoftAspNetCoreMvcControllerHelperClass() { @@ -407,7 +396,16 @@ class MicrosoftAspNetCoreMvcController extends Class { MicrosoftAspNetCoreMvcController() { isDefaultMicrosoftAspNetCoreMvcController(this) } /** Gets an action method for this controller. */ - Method getAnActionMethod() { isDefaultMicrosoftAspNetCoreMvcAction(this, result) } + Method getAnActionMethod() { + this.hasMember(result) and + result.isPublic() and + not result.isStatic() and + not result.isAbstract() and + not result.getUnboundDeclaration() instanceof UnboundGenericMethod and + not result.getOverridee*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonActionAttribute and + not result.getOverridee*().getDeclaringType() instanceof ObjectType and + not result instanceof DisposeMethod + } /** Gets a `Redirect*` method. */ Method getARedirectMethod() { From 1d59e69674d8d430085f8d92688f20c0e813944e Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 02:42:01 +0300 Subject: [PATCH 007/181] C#: Document ASP.NET Core controller discovery --- .../2026-07-31-aspnet-core-controller-discovery.md | 4 ++++ .../code/csharp/frameworks/microsoft/AspNetCore.qll | 9 ++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md diff --git a/csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md b/csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md new file mode 100644 index 000000000000..a55f736a1e84 --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-07-31-aspnet-core-controller-discovery.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Improved ASP.NET Core MVC controller and action discovery to more closely match runtime behavior, including application parts, endpoint mappings, inherited actions, and controller and action exclusions. Service-injected action parameters are no longer modeled as remote input. diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index f031777d8ca9..03936c7c4537 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -388,9 +388,12 @@ class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { } /** - * A valid ASP.NET Core controller according to: - * https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/actions?view=aspnetcore-3.1 - * https://github.com/dotnet/aspnetcore/blob/b3c93967ba508b8ef139add27132d9483c1a9eb4/src/Mvc/Mvc.Core/src/Controllers/ControllerFeatureProvider.cs#L39-L75 + * An ASP.NET Core MVC controller, as described by: + * https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/actions + * https://learn.microsoft.com/en-us/aspnet/core/mvc/advanced/app-parts + * https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/routing + * https://github.com/dotnet/aspnetcore/blob/747d2cdb584079a0c7309115979f13c331fb7df7/src/Mvc/Mvc.Core/src/Controllers/ControllerFeatureProvider.cs#L20-L75 + * https://github.com/dotnet/aspnetcore/blob/747d2cdb584079a0c7309115979f13c331fb7df7/src/Mvc/Mvc.Core/src/ApplicationModels/DefaultApplicationModelProvider.cs#L410-L459 */ class MicrosoftAspNetCoreMvcController extends Class { MicrosoftAspNetCoreMvcController() { isDefaultMicrosoftAspNetCoreMvcController(this) } From 4cdb6121a0b40aba5aa084eba7ce208077aef535 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 18:10:24 +0300 Subject: [PATCH 008/181] Address pull request comments --- .../semmle/code/csharp/frameworks/microsoft/AspNetCore.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 03936c7c4537..a469fc98e9eb 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -328,6 +328,7 @@ private predicate isMicrosoftAspNetCoreMvcAttributeEndpointMapping(MethodCall ca } private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation application, Class controller) { + isInMicrosoftAspNetCoreMvcApplication(controller, application) and exists(MethodCall mapping | application.getAFileCompiled() = mapping.getFile() and ( @@ -360,7 +361,6 @@ private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { or exists(Compilation application | controller.getName().toLowerCase().matches("%controller") and - isInMicrosoftAspNetCoreMvcApplication(controller, application) and hasMicrosoftAspNetCoreMvcEndpointMapping(application, controller) ) ) and @@ -410,7 +410,7 @@ class MicrosoftAspNetCoreMvcController extends Class { not result instanceof DisposeMethod } - /** Gets a `Redirect*` method. */ + /** Gets a `Redirect*`, `Accepted*`, or `Created*` method. */ Method getARedirectMethod() { result = this.(MicrosoftAspNetCoreMvcControllerHelperClass).getAResponseMethod() } From dac78929a61d243637b7b81edce5e57c7056cf00 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 18:20:18 +0300 Subject: [PATCH 009/181] Use don't care expression --- .../semmle/code/csharp/frameworks/microsoft/AspNetCore.qll | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index a469fc98e9eb..79d001d8279d 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -359,10 +359,8 @@ private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { ( hasMicrosoftAspNetCoreMvcControllerIdentity(controller) or - exists(Compilation application | - controller.getName().toLowerCase().matches("%controller") and - hasMicrosoftAspNetCoreMvcEndpointMapping(application, controller) - ) + controller.getName().toLowerCase().matches("%controller") and + hasMicrosoftAspNetCoreMvcEndpointMapping(_, controller) ) and not controller.getABaseType*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonControllerAttribute From 731af157a48c09637ae75ecb57d939e0381b4216 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 18:53:14 +0300 Subject: [PATCH 010/181] C#: Model MVC fallback controller mappings --- .../Controllers.expected | 12 +++++----- .../AdminAreaFallbackController.cs | 9 ++++++++ .../UnmappedWebApp/FallbackOnlyController.cs | 4 ++++ .../OtherAreaFallbackController.cs | 9 ++++++++ .../UnmappedWebApp/Program.cs | 4 +++- .../frameworks/microsoft/AspNetCore.qll | 22 +++++++++++++++++++ 6 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/AdminAreaFallbackController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/FallbackOnlyController.cs create mode 100644 csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/OtherAreaFallbackController.cs diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected index 22c2ca299300..5b1b4a6edada 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected @@ -1,5 +1,7 @@ -| AttributePocoController.cs | AttributePocoController | -| GeneratedController.cs | GeneratedController | -| IncludedController.cs | IncludedController | -| StructuralController.cs | StructuralController | -| WebPocoController.cs | WebPocoController | \ No newline at end of file +| AdminAreaFallbackController.cs | AreaFallbackController | +| AttributePocoController.cs | AttributePocoController | +| FallbackOnlyController.cs | FallbackOnlyController | +| GeneratedController.cs | GeneratedController | +| IncludedController.cs | IncludedController | +| StructuralController.cs | StructuralController | +| WebPocoController.cs | WebPocoController | diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/AdminAreaFallbackController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/AdminAreaFallbackController.cs new file mode 100644 index 000000000000..c64aea73ddd1 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/AdminAreaFallbackController.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Mvc; + +namespace AdminArea; + +[Area("Admin")] +public class AreaFallbackController +{ + public void Index(string input) => _ = GetType().Name + input; +} diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/FallbackOnlyController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/FallbackOnlyController.cs new file mode 100644 index 000000000000..1716d49f2296 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/FallbackOnlyController.cs @@ -0,0 +1,4 @@ +public class FallbackOnlyController +{ + public void Index(string input) => _ = GetType().Name + input; +} diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/OtherAreaFallbackController.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/OtherAreaFallbackController.cs new file mode 100644 index 000000000000..10849896f531 --- /dev/null +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/OtherAreaFallbackController.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNetCore.Mvc; + +namespace OtherArea; + +[Area("Other")] +public class AreaFallbackController +{ + public void Index(string input) => _ = GetType().Name + input; +} diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs index 6cf99003feb3..bb27696d84b5 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/UnmappedWebApp/Program.cs @@ -5,4 +5,6 @@ builder.Services.AddControllers(); var app = builder.Build(); -app.Run(); \ No newline at end of file +app.MapFallbackToController("Index", "FallbackOnly"); +app.MapFallbackToAreaController("admin/{*path:nonfile}", "Index", "AreaFallback", "Admin"); +app.Run(); diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 79d001d8279d..d3c4c0bf6aba 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -327,6 +327,26 @@ private predicate isMicrosoftAspNetCoreMvcAttributeEndpointMapping(MethodCall ca not exists(call.getArgumentForName("configureRoutes")) } +private predicate isMicrosoftAspNetCoreMvcFallbackEndpointMapping(MethodCall call, Class controller) { + call.getTarget() + .hasFullyQualifiedName("Microsoft.AspNetCore.Builder", + "ControllerEndpointRouteBuilderExtensions", + ["MapFallbackToAreaController", "MapFallbackToController"]) and + call.getArgumentForName("controller").getValue().toLowerCase() + "controller" = + controller.getName().toLowerCase() and + ( + call.getTarget().hasName("MapFallbackToController") + or + call.getTarget().hasName("MapFallbackToAreaController") and + exists(Attribute area | + area = controller.getABaseType*().getAnAttribute() and + area.getType().hasFullyQualifiedName("Microsoft.AspNetCore.Mvc", "AreaAttribute") and + area.getArgument(0).getValue().toLowerCase() = + call.getArgumentForName("area").getValue().toLowerCase() + ) + ) +} + private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation application, Class controller) { isInMicrosoftAspNetCoreMvcApplication(controller, application) and exists(MethodCall mapping | @@ -336,6 +356,8 @@ private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation applicati or isMicrosoftAspNetCoreMvcAttributeEndpointMapping(mapping) and hasMicrosoftAspNetCoreMvcAttributeRoute(controller) + or + isMicrosoftAspNetCoreMvcFallbackEndpointMapping(mapping, controller) ) ) } From c38a11eb4d53836b215c1207d9e82d6c3e65d951 Mon Sep 17 00:00:00 2001 From: JarLob Date: Fri, 31 Jul 2026 20:49:52 +0300 Subject: [PATCH 011/181] C#: Fix controller discovery test fixtures --- .../Controllers.expected | 14 +++++++------- .../Security Features/CWE-089/SqlInjection.cs | 2 ++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected index 5b1b4a6edada..d6ee73a2694f 100644 --- a/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected +++ b/csharp/ql/integration-tests/all-platforms/aspnetcore_controller_discovery/Controllers.expected @@ -1,7 +1,7 @@ -| AdminAreaFallbackController.cs | AreaFallbackController | -| AttributePocoController.cs | AttributePocoController | -| FallbackOnlyController.cs | FallbackOnlyController | -| GeneratedController.cs | GeneratedController | -| IncludedController.cs | IncludedController | -| StructuralController.cs | StructuralController | -| WebPocoController.cs | WebPocoController | +| AdminAreaFallbackController.cs | AreaFallbackController | +| AttributePocoController.cs | AttributePocoController | +| FallbackOnlyController.cs | FallbackOnlyController | +| GeneratedController.cs | GeneratedController | +| IncludedController.cs | IncludedController | +| StructuralController.cs | StructuralController | +| WebPocoController.cs | WebPocoController | diff --git a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.cs b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.cs index e7dd2f732603..a35dddb5b662 100644 --- a/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.cs +++ b/csharp/ql/test/query-tests/Security Features/CWE-089/SqlInjection.cs @@ -139,4 +139,6 @@ public async Task GetUserById([FromRoute] string userId, Cancella return Ok(); } } + + public class ConcreteController : MyController { } } From 95962c98646f39a236739d35c64e73c39fa24ae6 Mon Sep 17 00:00:00 2001 From: Michael Recachinas Date: Tue, 11 Aug 2026 10:57:00 -0400 Subject: [PATCH 012/181] Migrate pull_request_target workflows --- .github/workflows/check-change-note.yml | 5 +- .github/workflows/labeler-apply.yml | 88 +++++++++++++++++++++++++ .github/workflows/labeler.yml | 13 ++-- 3 files changed, 98 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/labeler-apply.yml diff --git a/.github/workflows/check-change-note.yml b/.github/workflows/check-change-note.yml index 70b78ce72944..d29bd00486be 100644 --- a/.github/workflows/check-change-note.yml +++ b/.github/workflows/check-change-note.yml @@ -1,10 +1,11 @@ name: Check change note permissions: + contents: read pull-requests: read on: - pull_request_target: + pull_request: types: [labeled, unlabeled, opened, synchronize, reopened, ready_for_review] paths: - "*/ql/src/**/*.ql" @@ -23,7 +24,7 @@ jobs: env: REPO: ${{ github.repository }} PULL_REQUEST_NUMBER: ${{ github.event.number }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ github.token }} runs-on: ubuntu-latest steps: diff --git a/.github/workflows/labeler-apply.yml b/.github/workflows/labeler-apply.yml new file mode 100644 index 000000000000..bd8c15a081aa --- /dev/null +++ b/.github/workflows/labeler-apply.yml @@ -0,0 +1,88 @@ +name: "Pull Request Labeler Apply" + +on: + workflow_run: + workflows: ["Pull Request Labeler"] + types: [completed] + +permissions: {} + +jobs: + triage: + if: > + github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + pull-requests: write + steps: + - name: Validate pull request from workflow_run + id: validate + env: + GH_TOKEN: ${{ github.token }} + REPO: ${{ github.repository }} + RUN_ID: ${{ github.event.workflow_run.id }} + run: | + set -euo pipefail + + run_json=$(gh api "repos/$REPO/actions/runs/$RUN_ID") + event=$(jq -r '.event' <<<"$run_json") + conclusion=$(jq -r '.conclusion' <<<"$run_json") + head_sha=$(jq -r '.head_sha' <<<"$run_json") + head_repo=$(jq -r '.head_repository.full_name // empty' <<<"$run_json") + + if [ "$event" != "pull_request" ] || [ "$conclusion" != "success" ]; then + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + pr_number=$(jq -r 'if (.pull_requests | length) == 1 then .pull_requests[0].number else empty end' <<<"$run_json") + + if [ -z "$pr_number" ]; then + prs_json=$(gh api -H 'Accept: application/vnd.github+json' "repos/$REPO/commits/$head_sha/pulls") + pr_number=$(jq -r 'map(select(.state == "open")) | if length == 1 then .[0].number else empty end' <<<"$prs_json") + fi + + if [ -z "$pr_number" ]; then + head_owner=$(jq -r '.head_repository.owner.login // empty' <<<"$run_json") + head_branch=$(jq -r '.head_branch // empty' <<<"$run_json") + if [ -n "$head_owner" ] && [ -n "$head_branch" ]; then + prs_json=$(gh api --method GET "repos/$REPO/pulls" -f state=open -f head="$head_owner:$head_branch") + pr_number=$(jq -r 'if length == 1 then .[0].number else empty end' <<<"$prs_json") + fi + fi + + if [ -z "$pr_number" ]; then + echo "Could not identify a unique open pull request for workflow run $RUN_ID; skipping." + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + pr_json=$(gh api "repos/$REPO/pulls/$pr_number") + state=$(jq -r '.state' <<<"$pr_json") + base_repo=$(jq -r '.base.repo.full_name' <<<"$pr_json") + pr_head_sha=$(jq -r '.head.sha' <<<"$pr_json") + pr_head_repo=$(jq -r '.head.repo.full_name // empty' <<<"$pr_json") + + if [ "$state" != "open" ] || [ "$base_repo" != "$REPO" ]; then + echo "Pull request #$pr_number is no longer an open pull request against $REPO; skipping." + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + if [ "$pr_head_sha" != "$head_sha" ] || [ "$pr_head_repo" != "$head_repo" ]; then + echo "Pull request #$pr_number changed since workflow run $RUN_ID; skipping stale labeling." + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + echo "number=$pr_number" >> "$GITHUB_OUTPUT" + echo "apply=true" >> "$GITHUB_OUTPUT" + + - uses: actions/labeler@v4 + if: steps.validate.outputs.apply == 'true' + with: + repo-token: "${{ github.token }}" + pr-number: ${{ steps.validate.outputs.number }} diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 512fa40d2e3a..f6f54382f9b8 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,15 +1,16 @@ name: "Pull Request Labeler" + on: -- pull_request_target + pull_request: + types: [opened, synchronize, reopened] permissions: contents: read - pull-requests: write + pull-requests: read jobs: - triage: + request-labels: runs-on: ubuntu-latest steps: - - uses: actions/labeler@v4 - with: - repo-token: "${{ secrets.GITHUB_TOKEN }}" + - name: Request privileged labeling + run: echo "Labels are applied by the workflow_run writer after re-validating the pull request." From 862b71a42e095146294c8fceebb2a8875e223fd0 Mon Sep 17 00:00:00 2001 From: Michael Recachinas Date: Tue, 11 Aug 2026 11:08:29 -0400 Subject: [PATCH 013/181] Make labeler workflow_run PR lookup robust Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .github/workflows/labeler-apply.yml | 30 ++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/.github/workflows/labeler-apply.yml b/.github/workflows/labeler-apply.yml index bd8c15a081aa..8f75b00c7244 100644 --- a/.github/workflows/labeler-apply.yml +++ b/.github/workflows/labeler-apply.yml @@ -41,16 +41,16 @@ jobs: pr_number=$(jq -r 'if (.pull_requests | length) == 1 then .pull_requests[0].number else empty end' <<<"$run_json") if [ -z "$pr_number" ]; then - prs_json=$(gh api -H 'Accept: application/vnd.github+json' "repos/$REPO/commits/$head_sha/pulls") - pr_number=$(jq -r 'map(select(.state == "open")) | if length == 1 then .[0].number else empty end' <<<"$prs_json") + prs_json=$(gh api -H 'Accept: application/vnd.github+json' "repos/$REPO/commits/$head_sha/pulls" || echo '[]') + pr_number=$(jq -r 'map(select(.state == "open")) | if length == 1 then .[0].number else empty end' <<<"$prs_json" 2>/dev/null || true) fi if [ -z "$pr_number" ]; then head_owner=$(jq -r '.head_repository.owner.login // empty' <<<"$run_json") head_branch=$(jq -r '.head_branch // empty' <<<"$run_json") if [ -n "$head_owner" ] && [ -n "$head_branch" ]; then - prs_json=$(gh api --method GET "repos/$REPO/pulls" -f state=open -f head="$head_owner:$head_branch") - pr_number=$(jq -r 'if length == 1 then .[0].number else empty end' <<<"$prs_json") + prs_json=$(gh api --method GET "repos/$REPO/pulls" -f state=open -f head="$head_owner:$head_branch" || echo '[]') + pr_number=$(jq -r 'if length == 1 then .[0].number else empty end' <<<"$prs_json" 2>/dev/null || true) fi fi @@ -60,11 +60,23 @@ jobs: exit 0 fi - pr_json=$(gh api "repos/$REPO/pulls/$pr_number") - state=$(jq -r '.state' <<<"$pr_json") - base_repo=$(jq -r '.base.repo.full_name' <<<"$pr_json") - pr_head_sha=$(jq -r '.head.sha' <<<"$pr_json") - pr_head_repo=$(jq -r '.head.repo.full_name // empty' <<<"$pr_json") + pr_json=$(gh api "repos/$REPO/pulls/$pr_number" || true) + if [ -z "$pr_json" ]; then + echo "Pull request #$pr_number could not be fetched; skipping." + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + state=$(jq -r '.state // empty' <<<"$pr_json" 2>/dev/null || true) + base_repo=$(jq -r '.base.repo.full_name // empty' <<<"$pr_json" 2>/dev/null || true) + pr_head_sha=$(jq -r '.head.sha // empty' <<<"$pr_json" 2>/dev/null || true) + pr_head_repo=$(jq -r '.head.repo.full_name // empty' <<<"$pr_json" 2>/dev/null || true) + + if [ -z "$state" ]; then + echo "Pull request #$pr_number could not be parsed; skipping." + echo "apply=false" >> "$GITHUB_OUTPUT" + exit 0 + fi if [ "$state" != "open" ] || [ "$base_repo" != "$REPO" ]; then echo "Pull request #$pr_number is no longer an open pull request against $REPO; skipping." From 399582580fb26d42844a90ce96ecc3ffeae306d1 Mon Sep 17 00:00:00 2001 From: Lalith Chaitanya Mangalagiri Date: Tue, 11 Aug 2026 21:32:11 -0700 Subject: [PATCH 014/181] Rust: Add command injection query (CWE-078) Detects user-controlled data flowing into std::process::Command and tokio::process::Command (both command name and arguments). - Extension library with sources, sinks, and barriers - Models-as-data sinks for Command::new, .arg(), .args() (std + tokio) - Query help (.qhelp) with examples - Test cases with inline expectations Query ID: rust/command-line-injection --- .../rust/frameworks/stdlib/process.model.yml | 15 ++++ .../security/CommandInjectionExtensions.qll | 64 ++++++++++++++++ .../security/CWE-078/CommandInjection.qhelp | 40 ++++++++++ .../security/CWE-078/CommandInjection.ql | 42 +++++++++++ .../security/CWE-078/CommandInjectionBad.rs | 10 +++ .../security/CWE-078/CommandInjectionGood.rs | 13 ++++ .../security/CWE-078/CommandInjection.qlref | 4 + .../test/query-tests/security/CWE-078/main.rs | 75 +++++++++++++++++++ .../query-tests/security/CWE-078/options.yml | 4 + 9 files changed, 267 insertions(+) create mode 100644 rust/ql/lib/codeql/rust/frameworks/stdlib/process.model.yml create mode 100644 rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll create mode 100644 rust/ql/src/queries/security/CWE-078/CommandInjection.qhelp create mode 100644 rust/ql/src/queries/security/CWE-078/CommandInjection.ql create mode 100644 rust/ql/src/queries/security/CWE-078/CommandInjectionBad.rs create mode 100644 rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs create mode 100644 rust/ql/test/query-tests/security/CWE-078/CommandInjection.qlref create mode 100644 rust/ql/test/query-tests/security/CWE-078/main.rs create mode 100644 rust/ql/test/query-tests/security/CWE-078/options.yml diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/process.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/process.model.yml new file mode 100644 index 000000000000..0187f073d679 --- /dev/null +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/process.model.yml @@ -0,0 +1,15 @@ +extensions: + - addsTo: + pack: codeql/rust-all + extensible: sinkModel + data: + # std::process::Command - the command name itself + - ["::new", "Argument[0]", "command-injection", "manual"] + # std::process::Command - arguments passed to the command + - ["::arg", "Argument[0]", "command-injection", "manual"] + - ["::args", "Argument[0]", "command-injection", "manual"] + # tokio::process::Command - the command name itself + - ["::new", "Argument[0]", "command-injection", "manual"] + # tokio::process::Command - arguments passed to the command + - ["::arg", "Argument[0]", "command-injection", "manual"] + - ["::args", "Argument[0]", "command-injection", "manual"] diff --git a/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll b/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll new file mode 100644 index 000000000000..7e0150d53f66 --- /dev/null +++ b/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll @@ -0,0 +1,64 @@ +/** + * Provides classes and predicates for reasoning about command injection + * vulnerabilities (CWE-078). + */ + +import rust +private import codeql.rust.dataflow.DataFlow +private import codeql.rust.dataflow.FlowSink +private import codeql.rust.dataflow.FlowBarrier +private import codeql.rust.Concepts +private import codeql.rust.security.Barriers as Barriers + +/** + * Provides default sources, sinks and barriers for detecting command injection + * vulnerabilities, as well as extension points for adding your own. + */ +module CommandInjection { + /** + * A data flow source for command injection vulnerabilities. + */ + abstract class Source extends DataFlow::Node { } + + /** + * A data flow sink for command injection vulnerabilities. + */ + abstract class Sink extends QuerySink::Range { + override string getSinkType() { result = "CommandInjection" } + } + + /** + * A barrier for command injection vulnerabilities. + */ + abstract class Barrier extends DataFlow::Node { } + + /** + * An active threat-model source, considered as a flow source. + */ + private class ActiveThreatModelSourceAsSource extends Source, ActiveThreatModelSource { } + + /** + * A sink for command injection from model data. + */ + private class ModelsAsDataSink extends Sink { + ModelsAsDataSink() { sinkNode(this, "command-injection") } + } + + /** + * A barrier for command injection from model data. + */ + private class ModelsAsDataBarrier extends Barrier { + ModelsAsDataBarrier() { barrierNode(this, "command-injection") } + } + + /** + * A barrier for command injection vulnerabilities for nodes whose type is a + * numeric type, which is unlikely to expose any vulnerability. + */ + private class NumericTypeBarrier extends Barrier instanceof Barriers::NumericTypeBarrier { } + + private class BooleanTypeBarrier extends Barrier instanceof Barriers::BooleanTypeBarrier { } + + private class FieldlessEnumTypeBarrier extends Barrier instanceof Barriers::FieldlessEnumTypeBarrier + { } +} diff --git a/rust/ql/src/queries/security/CWE-078/CommandInjection.qhelp b/rust/ql/src/queries/security/CWE-078/CommandInjection.qhelp new file mode 100644 index 000000000000..3e7b336090b4 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-078/CommandInjection.qhelp @@ -0,0 +1,40 @@ + + + + +

+If a system command is built from user-provided data without sufficient sanitization, a user may be able to run malicious commands. An attacker can craft input to change the meaning of the command, potentially gaining control of the system. +

+ +
+ + +

+If possible, use hard-coded string literals for commands. If the command must be built from user-provided data, do not pass user input directly to shell commands. Instead, use APIs that accept command arguments as separate parameters (such as std::process::Command with individual .arg() calls for each argument), which avoids shell interpretation of special characters. If shell execution is necessary, validate and sanitize user input against an allowlist of permitted values. +

+ +
+ + +

+In the following example, a command is constructed directly from user-controlled input obtained via an HTTP request. An attacker could supply a malicious value to execute arbitrary commands. +

+ + + +

+A safer approach uses a fixed command with validated arguments, or avoids shell interpretation entirely: +

+ + + +
+ + +
  • OWASP: Command Injection.
  • +
  • Wikipedia: Shell injection.
  • + +
    +
    diff --git a/rust/ql/src/queries/security/CWE-078/CommandInjection.ql b/rust/ql/src/queries/security/CWE-078/CommandInjection.ql new file mode 100644 index 000000000000..b6e93a8d88a1 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-078/CommandInjection.ql @@ -0,0 +1,42 @@ +/** + * @name Uncontrolled command line + * @description Using externally controlled strings in a command line may allow a malicious + * user to change the meaning of the command. + * @kind path-problem + * @problem.severity error + * @security-severity 9.8 + * @precision high + * @id rust/command-line-injection + * @tags security + * external/cwe/cwe-078 + * external/cwe/cwe-088 + */ + +import rust +import codeql.rust.dataflow.DataFlow +import codeql.rust.dataflow.TaintTracking +import codeql.rust.security.CommandInjectionExtensions + +/** + * A taint configuration for detecting command injection vulnerabilities. + */ +module CommandInjectionConfig implements DataFlow::ConfigSig { + import CommandInjection + + 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 CommandInjectionFlow = TaintTracking::Global; + +import CommandInjectionFlow::PathGraph + +from CommandInjectionFlow::PathNode sourceNode, CommandInjectionFlow::PathNode sinkNode +where CommandInjectionFlow::flowPath(sourceNode, sinkNode) +select sinkNode.getNode(), sourceNode, sinkNode, "This command line depends on a $@.", + sourceNode.getNode(), "user-provided value" diff --git a/rust/ql/src/queries/security/CWE-078/CommandInjectionBad.rs b/rust/ql/src/queries/security/CWE-078/CommandInjectionBad.rs new file mode 100644 index 000000000000..fa81cef9fe15 --- /dev/null +++ b/rust/ql/src/queries/security/CWE-078/CommandInjectionBad.rs @@ -0,0 +1,10 @@ +use std::process::Command; + +fn handle_request(user_input: &str) { + // BAD: user input is passed directly to a shell command + Command::new("sh") + .arg("-c") + .arg(user_input) + .output() + .expect("failed to execute"); +} diff --git a/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs b/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs new file mode 100644 index 000000000000..bb720d39d03e --- /dev/null +++ b/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs @@ -0,0 +1,13 @@ +use std::process::Command; + +fn handle_request(filename: &str) { + // GOOD: use a fixed command with the user input as a separate argument, + // avoiding shell interpretation + let allowed_names = ["report.pdf", "summary.txt", "data.csv"]; + if allowed_names.contains(&filename) { + Command::new("cat") + .arg(filename) + .output() + .expect("failed to execute"); + } +} diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.qlref b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.qlref new file mode 100644 index 000000000000..3b14f15fafe6 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.qlref @@ -0,0 +1,4 @@ +query: queries/security/CWE-078/CommandInjection.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs new file mode 100644 index 000000000000..eecf95cec33d --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -0,0 +1,75 @@ +use std::process::Command; + +fn test_std_command_injection() { + let arg_string = std::env::args().nth(1).unwrap_or(String::from("ls")); // $ Source=args1 + let remote_string = reqwest::blocking::get("http://example.com/") // $ Source=remote1 + .unwrap() + .text() + .unwrap_or(String::from("ls")); + let const_string = String::from("echo hello"); + + // --- safe cases --- + + // Constant command and argument + Command::new("ls") + .arg("-la") + .output() + .expect("failed"); // safe + + // Constant constructed command + Command::new(const_string.as_str()) + .output() + .expect("failed"); // safe + + // --- unsafe cases --- + + // User input as the command itself + Command::new(arg_string.as_str()) // $ Alert[rust/command-line-injection]=args1 + .output() + .expect("failed"); + + // User input as an argument to sh -c + Command::new("sh") + .arg("-c") + .arg(remote_string.as_str()) // $ Alert[rust/command-line-injection]=remote1 + .output() + .expect("failed"); + + // User input as an argument + Command::new("grep") + .arg(arg_string.as_str()) // $ Alert[rust/command-line-injection]=args1 + .arg("file.txt") + .output() + .expect("failed"); + + // Remote input via args() + Command::new("bash") + .args(&["-c", remote_string.as_str()]) // $ Alert[rust/command-line-injection]=remote1 + .output() + .expect("failed"); +} + +async fn test_tokio_command_injection() { + let remote_string = reqwest::blocking::get("http://example.com/") // $ Source=remote2 + .unwrap() + .text() + .unwrap_or(String::from("ls")); + + // Unsafe: remote input as tokio command + let _output = tokio::process::Command::new(remote_string.as_str()) // $ Alert[rust/command-line-injection]=remote2 + .output() + .await + .expect("failed"); + + // Unsafe: remote input as tokio command argument + tokio::process::Command::new("sh") + .arg("-c") + .arg(remote_string.as_str()) // $ Alert[rust/command-line-injection]=remote2 + .output() + .await + .expect("failed"); +} + +fn main() { + test_std_command_injection(); +} diff --git a/rust/ql/test/query-tests/security/CWE-078/options.yml b/rust/ql/test/query-tests/security/CWE-078/options.yml new file mode 100644 index 000000000000..78cb2f883af1 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-078/options.yml @@ -0,0 +1,4 @@ +qltest_cargo_check: true +qltest_dependencies: + - reqwest = { version = "0.12.9", features = ["blocking"] } + - tokio = { version = "1", features = ["full"] } From 22ab3706421e309879fcf84143b1f4e5ecfb4de0 Mon Sep 17 00:00:00 2001 From: Lalith Chaitanya Mangalagiri Date: Tue, 11 Aug 2026 21:49:23 -0700 Subject: [PATCH 015/181] Add change note for rust/command-line-injection query --- rust/ql/src/change-notes/2026-08-11-command-injection.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/src/change-notes/2026-08-11-command-injection.md diff --git a/rust/ql/src/change-notes/2026-08-11-command-injection.md b/rust/ql/src/change-notes/2026-08-11-command-injection.md new file mode 100644 index 000000000000..2175cc9cdf18 --- /dev/null +++ b/rust/ql/src/change-notes/2026-08-11-command-injection.md @@ -0,0 +1,4 @@ +--- +category: newQuery +--- +* Added a new query, `rust/command-line-injection`, to detect uncontrolled command lines. From a014cd540873e2eff4fdf992ceaba755e0bdc1da Mon Sep 17 00:00:00 2001 From: Michael Recachinas Date: Wed, 12 Aug 2026 09:54:38 -0400 Subject: [PATCH 016/181] Reconcile pull request labels from the default branch Replace the fork-approval-gated dispatcher with frequent trusted scheduled reconciliation and stable hourly recovery shards. Revalidate each open pull request and head SHA immediately before applying labels without checking out pull request code. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 512eb347-ec89-4250-8bf1-87048974b01d --- .github/workflows/labeler-apply.yml | 100 ------------------- .github/workflows/labeler.yml | 144 ++++++++++++++++++++++++++-- 2 files changed, 136 insertions(+), 108 deletions(-) delete mode 100644 .github/workflows/labeler-apply.yml diff --git a/.github/workflows/labeler-apply.yml b/.github/workflows/labeler-apply.yml deleted file mode 100644 index 8f75b00c7244..000000000000 --- a/.github/workflows/labeler-apply.yml +++ /dev/null @@ -1,100 +0,0 @@ -name: "Pull Request Labeler Apply" - -on: - workflow_run: - workflows: ["Pull Request Labeler"] - types: [completed] - -permissions: {} - -jobs: - triage: - if: > - github.event.workflow_run.event == 'pull_request' && - github.event.workflow_run.conclusion == 'success' - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - pull-requests: write - steps: - - name: Validate pull request from workflow_run - id: validate - env: - GH_TOKEN: ${{ github.token }} - REPO: ${{ github.repository }} - RUN_ID: ${{ github.event.workflow_run.id }} - run: | - set -euo pipefail - - run_json=$(gh api "repos/$REPO/actions/runs/$RUN_ID") - event=$(jq -r '.event' <<<"$run_json") - conclusion=$(jq -r '.conclusion' <<<"$run_json") - head_sha=$(jq -r '.head_sha' <<<"$run_json") - head_repo=$(jq -r '.head_repository.full_name // empty' <<<"$run_json") - - if [ "$event" != "pull_request" ] || [ "$conclusion" != "success" ]; then - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - pr_number=$(jq -r 'if (.pull_requests | length) == 1 then .pull_requests[0].number else empty end' <<<"$run_json") - - if [ -z "$pr_number" ]; then - prs_json=$(gh api -H 'Accept: application/vnd.github+json' "repos/$REPO/commits/$head_sha/pulls" || echo '[]') - pr_number=$(jq -r 'map(select(.state == "open")) | if length == 1 then .[0].number else empty end' <<<"$prs_json" 2>/dev/null || true) - fi - - if [ -z "$pr_number" ]; then - head_owner=$(jq -r '.head_repository.owner.login // empty' <<<"$run_json") - head_branch=$(jq -r '.head_branch // empty' <<<"$run_json") - if [ -n "$head_owner" ] && [ -n "$head_branch" ]; then - prs_json=$(gh api --method GET "repos/$REPO/pulls" -f state=open -f head="$head_owner:$head_branch" || echo '[]') - pr_number=$(jq -r 'if length == 1 then .[0].number else empty end' <<<"$prs_json" 2>/dev/null || true) - fi - fi - - if [ -z "$pr_number" ]; then - echo "Could not identify a unique open pull request for workflow run $RUN_ID; skipping." - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - pr_json=$(gh api "repos/$REPO/pulls/$pr_number" || true) - if [ -z "$pr_json" ]; then - echo "Pull request #$pr_number could not be fetched; skipping." - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - state=$(jq -r '.state // empty' <<<"$pr_json" 2>/dev/null || true) - base_repo=$(jq -r '.base.repo.full_name // empty' <<<"$pr_json" 2>/dev/null || true) - pr_head_sha=$(jq -r '.head.sha // empty' <<<"$pr_json" 2>/dev/null || true) - pr_head_repo=$(jq -r '.head.repo.full_name // empty' <<<"$pr_json" 2>/dev/null || true) - - if [ -z "$state" ]; then - echo "Pull request #$pr_number could not be parsed; skipping." - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - if [ "$state" != "open" ] || [ "$base_repo" != "$REPO" ]; then - echo "Pull request #$pr_number is no longer an open pull request against $REPO; skipping." - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - if [ "$pr_head_sha" != "$head_sha" ] || [ "$pr_head_repo" != "$head_repo" ]; then - echo "Pull request #$pr_number changed since workflow run $RUN_ID; skipping stale labeling." - echo "apply=false" >> "$GITHUB_OUTPUT" - exit 0 - fi - - echo "number=$pr_number" >> "$GITHUB_OUTPUT" - echo "apply=true" >> "$GITHUB_OUTPUT" - - - uses: actions/labeler@v4 - if: steps.validate.outputs.apply == 'true' - with: - repo-token: "${{ github.token }}" - pr-number: ${{ steps.validate.outputs.number }} diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index f6f54382f9b8..e3f464331790 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -1,16 +1,144 @@ name: "Pull Request Labeler" on: - pull_request: - types: [opened, synchronize, reopened] + schedule: + # Reconcile recently updated PRs promptly, including unapproved forks and + # conflicted PRs for which pull_request workflows do not run. + - cron: "7,22,37,52 * * * *" + # Reconcile one stable shard of all open PRs each hour to recover from + # delayed or missed scheduled runs. + - cron: "12 * * * *" + workflow_dispatch: + inputs: + pr_number: + description: "Open pull request number to reconcile" + required: true + type: string -permissions: - contents: read - pull-requests: read +permissions: {} + +concurrency: + group: pull-request-labeler + cancel-in-progress: false jobs: - request-labels: + triage: + if: github.ref_name == github.event.repository.default_branch runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: read + pull-requests: write steps: - - name: Request privileged labeling - run: echo "Labels are applied by the workflow_run writer after re-validating the pull request." + - uses: actions/checkout@v5 + with: + persist-credentials: false + sparse-checkout: .github/labeler.yml + sparse-checkout-cone-mode: false + + - name: Collect pull requests to reconcile + id: collect + env: + GH_TOKEN: ${{ github.token }} + REPO: ${{ github.repository }} + EVENT_NAME: ${{ github.event_name }} + SCHEDULE: ${{ github.event.schedule }} + REQUESTED_PR: ${{ inputs.pr_number }} + run: | + set -euo pipefail + + if [ "$EVENT_NAME" = "workflow_dispatch" ]; then + if [[ ! "$REQUESTED_PR" =~ ^[1-9][0-9]*$ ]]; then + echo "Invalid pull request number: $REQUESTED_PR" + exit 1 + fi + + pr_json=$(gh api "repos/$REPO/pulls/$REQUESTED_PR") + candidates=$(jq -c '[{ + number: .number, + head_sha: .head.sha + }]' <<<"$pr_json") + else + pulls_json=$(gh api --paginate \ + "repos/$REPO/pulls?state=open&sort=updated&direction=desc&per_page=100" | + jq -cs 'add') + + if [ "$SCHEDULE" = "12 * * * *" ]; then + shard=$(( ($(date -u +%s) / 3600) % 6 )) + candidates=$(jq -c --argjson shard "$shard" \ + '[.[] | select((.number % 6) == $shard) | { + number: .number, + head_sha: .head.sha + }]' <<<"$pulls_json") + else + cutoff=$(date -u -d "1 hour ago" "+%Y-%m-%dT%H:%M:%SZ") + # Hourly shards reconcile any candidates beyond this API budget. + candidates=$(jq -c --arg cutoff "$cutoff" \ + '[.[] | select(.updated_at >= $cutoff) | { + number: .number, + head_sha: .head.sha + }][0:100]' <<<"$pulls_json") + fi + fi + + echo "Collected $(jq 'length' <<<"$candidates") pull request(s)." + { + echo "candidates<> "$GITHUB_OUTPUT" + + - name: Validate pull request state + id: validate + env: + GH_TOKEN: ${{ github.token }} + REPO: ${{ github.repository }} + CANDIDATES: ${{ steps.collect.outputs.candidates }} + run: | + set -euo pipefail + + valid_numbers=() + while IFS=$'\t' read -r pr_number expected_sha; do + if [[ ! "$pr_number" =~ ^[1-9][0-9]*$ ]] || + [[ ! "$expected_sha" =~ ^[0-9a-f]{40}$ ]]; then + echo "Skipping malformed pull request candidate." + continue + fi + + if ! pr_json=$(gh api "repos/$REPO/pulls/$pr_number"); then + echo "Pull request #$pr_number could not be fetched; skipping." + continue + fi + + if ! jq -e \ + --arg repo "$REPO" \ + --arg sha "$expected_sha" \ + '.state == "open" and + .base.repo.full_name == $repo and + .head.sha == $sha and + (.head.repo.full_name | type == "string")' \ + >/dev/null <<<"$pr_json"; then + echo "Pull request #$pr_number changed or is no longer open; skipping." + continue + fi + + valid_numbers+=("$pr_number") + done < <(jq -r '.[] | [.number, .head_sha] | @tsv' <<<"$CANDIDATES") + + if [ "${#valid_numbers[@]}" -eq 0 ]; then + echo "has_prs=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + + { + echo "has_prs=true" + echo "pr_numbers<> "$GITHUB_OUTPUT" + + - uses: actions/labeler@v4 + if: steps.validate.outputs.has_prs == 'true' + with: + repo-token: "${{ github.token }}" + pr-number: ${{ steps.validate.outputs.pr_numbers }} From ed380dc9bf97e6ce7e5a15844ad58931425edadf Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 12 Aug 2026 12:03:13 +0100 Subject: [PATCH 017/181] Rust: Add some new taint metrics to rust/summary/summary-statistics. --- rust/ql/src/queries/summary/Stats.qll | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 36eeb0df4ef4..1fedec62f934 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -104,6 +104,17 @@ int getTaintEdgesCount() { */ int getQuerySinksCount() { result = count(QuerySink s) } +/** + * Holds if there are at least 10 data flow nodes in the same location + * as `n`. + */ +private predicate isColocated10(DataFlow::Node n) { + exists(Location l | + l = n.getLocation() and + strictcount(DataFlow::Node other | other.getLocation() = l) >= 10 + ) +} + class CrateElement extends Element { CrateElement() { this instanceof Crate or @@ -131,7 +142,9 @@ predicate extractionStats(string key, int value) { key = "Extraction warnings" and value = count(ExtractionWarning w | not exists(w.getLocation()) or w.getLocation().fromSource()) or - key = "Files extracted - total" and value = count(ExtractedFile f | exists(f.getRelativePath())) + key = "Files extracted - total" and value = count(File f) + or + key = "Files extracted - total user" and value = count(ExtractedFile f | exists(f.getRelativePath())) or key = "Files extracted - with errors" and value = @@ -201,6 +214,8 @@ predicate taintStats(string key, int value) { or key = "Taint reach - per million nodes" and value = getTaintReach().floor() or + key = "Taint nodes - highly colocated nodes" and value = count(DataFlow::Node n | isColocated10(n)) + or key = "Taint sinks - query sinks" and value = getQuerySinksCount() or key = "Taint sinks - cryptographic operations" and From 74fa98011d346978c30ba38ca7e6b8bed817f64f Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 12 Aug 2026 16:43:50 +0100 Subject: [PATCH 018/181] Rust: Update the tests and exclude total files from rust/summary/reduced-summary-statistics. --- .../hello-workspace/summary.cargo.expected | 2 +- .../hello-workspace/summary.rust-project.expected | 2 +- rust/ql/src/queries/summary/Stats.qll | 9 +++++++-- rust/ql/src/queries/summary/SummaryStats.ql | 2 ++ .../query-tests/diagnostics/SummaryStatsReduced.expected | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/rust/ql/integration-tests/hello-workspace/summary.cargo.expected b/rust/ql/integration-tests/hello-workspace/summary.cargo.expected index 11fba34f9019..85d2b9971712 100644 --- a/rust/ql/integration-tests/hello-workspace/summary.cargo.expected +++ b/rust/ql/integration-tests/hello-workspace/summary.cargo.expected @@ -1,6 +1,6 @@ | Extraction errors | 0 | | Extraction warnings | 0 | -| Files extracted - total | 4 | +| Files extracted - total user | 4 | | Files extracted - with errors | 0 | | Files extracted - without errors | 4 | | Files extracted - without errors % | 100 | diff --git a/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected b/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected index 11fba34f9019..85d2b9971712 100644 --- a/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected +++ b/rust/ql/integration-tests/hello-workspace/summary.rust-project.expected @@ -1,6 +1,6 @@ | Extraction errors | 0 | | Extraction warnings | 0 | -| Files extracted - total | 4 | +| Files extracted - total user | 4 | | Files extracted - with errors | 0 | | Files extracted - without errors | 4 | | Files extracted - without errors % | 100 | diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 1fedec62f934..0251efcb6bf6 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -142,8 +142,6 @@ predicate extractionStats(string key, int value) { key = "Extraction warnings" and value = count(ExtractionWarning w | not exists(w.getLocation()) or w.getLocation().fromSource()) or - key = "Files extracted - total" and value = count(File f) - or key = "Files extracted - total user" and value = count(ExtractedFile f | exists(f.getRelativePath())) or key = "Files extracted - with errors" and @@ -173,6 +171,13 @@ predicate extractionStats(string key, int value) { value = count(MacroCall mc | mc.fromSource() and not mc.hasMacroCallExpansion()) } +/** + * Gets further summary statistics about extraction. + */ +predicate extractionStatsExtra(string key, int value) { + key = "Files extracted - total" and value = count(File f) +} + /** * Gets summary statistics about inconsistencies. */ diff --git a/rust/ql/src/queries/summary/SummaryStats.ql b/rust/ql/src/queries/summary/SummaryStats.ql index 47a2c91a9eda..adfd302d0f8b 100644 --- a/rust/ql/src/queries/summary/SummaryStats.ql +++ b/rust/ql/src/queries/summary/SummaryStats.ql @@ -15,6 +15,8 @@ where or extractionStats(key, value) or + extractionStatsExtra(key, value) + or inconsistencyStats(key, value) or typeInferenceInconsistencyStats(key, value) diff --git a/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected b/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected index ed21d9772fce..7756215d1023 100644 --- a/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected +++ b/rust/ql/test/query-tests/diagnostics/SummaryStatsReduced.expected @@ -1,6 +1,6 @@ | Extraction errors | 0 | | Extraction warnings | 7 | -| Files extracted - total | 7 | +| Files extracted - total user | 7 | | Files extracted - with errors | 3 | | Files extracted - without errors | 4 | | Files extracted - without errors % | 57 | From df01db8ea01331a3cff151bbb6fa10e04f203382 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 12 Aug 2026 17:09:43 +0100 Subject: [PATCH 019/181] Rust: Autoformat. --- rust/ql/src/queries/summary/Stats.qll | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 0251efcb6bf6..5e0169254486 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -142,7 +142,8 @@ predicate extractionStats(string key, int value) { key = "Extraction warnings" and value = count(ExtractionWarning w | not exists(w.getLocation()) or w.getLocation().fromSource()) or - key = "Files extracted - total user" and value = count(ExtractedFile f | exists(f.getRelativePath())) + key = "Files extracted - total user" and + value = count(ExtractedFile f | exists(f.getRelativePath())) or key = "Files extracted - with errors" and value = @@ -219,7 +220,8 @@ predicate taintStats(string key, int value) { or key = "Taint reach - per million nodes" and value = getTaintReach().floor() or - key = "Taint nodes - highly colocated nodes" and value = count(DataFlow::Node n | isColocated10(n)) + key = "Taint nodes - highly colocated nodes" and + value = count(DataFlow::Node n | isColocated10(n)) or key = "Taint sinks - query sinks" and value = getQuerySinksCount() or From db15d09880c453b1b9596c5da971ec7f75fc931c Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 13 Aug 2026 20:13:52 +0100 Subject: [PATCH 020/181] Rust: Add the test .expected file. --- .../CWE-078/CommandInjection.expected | 96 +++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected new file mode 100644 index 000000000000..29906c333d44 --- /dev/null +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -0,0 +1,96 @@ +#select +| main.rs:27:5:27:16 | ...::new | main.rs:4:22:4:35 | ...::args | main.rs:27:5:27:16 | ...::new | This command line depends on a $@. | main.rs:4:22:4:35 | ...::args | user-provided value | +| main.rs:34:10:34:12 | arg | main.rs:5:25:5:46 | ...::get | main.rs:34:10:34:12 | arg | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | +| main.rs:40:10:40:12 | arg | main.rs:4:22:4:35 | ...::args | main.rs:40:10:40:12 | arg | This command line depends on a $@. | main.rs:4:22:4:35 | ...::args | user-provided value | +| main.rs:47:10:47:13 | args | main.rs:5:25:5:46 | ...::get | main.rs:47:10:47:13 | args | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | +| main.rs:59:19:59:46 | ...::new | main.rs:53:25:53:46 | ...::get | main.rs:59:19:59:46 | ...::new | This command line depends on a $@. | main.rs:53:25:53:46 | ...::get | user-provided value | +| main.rs:67:10:67:12 | arg | main.rs:53:25:53:46 | ...::get | main.rs:67:10:67:12 | arg | This command line depends on a $@. | main.rs:53:25:53:46 | ...::get | user-provided value | +edges +| main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | +| main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | +| main.rs:4:22:4:35 | ...::args | main.rs:4:22:4:37 | ...::args(...) [element] | provenance | Src:MaD:7 | +| main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:8 | +| main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:4:22:4:74 | ... .unwrap_or(...) | main.rs:4:9:4:18 | arg_string | provenance | | +| main.rs:5:9:5:21 | remote_string | main.rs:34:14:34:26 | remote_string | provenance | | +| main.rs:5:9:5:21 | remote_string | main.rs:47:23:47:35 | remote_string | provenance | | +| main.rs:5:25:5:46 | ...::get | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | +| main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:11 | +| main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:13 | +| main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:12 | +| main.rs:5:25:8:38 | ... .unwrap_or(...) | main.rs:5:9:5:21 | remote_string | provenance | | +| main.rs:27:18:27:27 | arg_string | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:27:18:27:36 | arg_string.as_str() [&ref] | main.rs:27:5:27:16 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| main.rs:34:14:34:26 | remote_string | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:34:14:34:35 | remote_string.as_str() [&ref] | main.rs:34:10:34:12 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:40:14:40:23 | arg_string | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:40:14:40:32 | arg_string.as_str() [&ref] | main.rs:40:10:40:12 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:10:47:13 | args | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | +| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:10:47:13 | args | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 Sink:MaD:2 | +| main.rs:47:16:47:45 | [...] [element, &ref] | main.rs:47:15:47:45 | &... [&ref, element, &ref] | provenance | | +| main.rs:47:23:47:35 | remote_string | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:47:23:47:44 | remote_string.as_str() [&ref] | main.rs:47:16:47:45 | [...] [element, &ref] | provenance | | +| main.rs:53:9:53:21 | remote_string | main.rs:59:48:59:60 | remote_string | provenance | | +| main.rs:53:9:53:21 | remote_string | main.rs:67:14:67:26 | remote_string | provenance | | +| main.rs:53:25:53:46 | ...::get | main.rs:53:25:53:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | +| main.rs:53:25:53:69 | ...::get(...) [Ok] | main.rs:53:25:54:17 | ... .unwrap() | provenance | MaD:11 | +| main.rs:53:25:54:17 | ... .unwrap() | main.rs:53:25:55:15 | ... .text() [Ok] | provenance | MaD:13 | +| main.rs:53:25:55:15 | ... .text() [Ok] | main.rs:53:25:56:38 | ... .unwrap_or(...) | provenance | MaD:12 | +| main.rs:53:25:56:38 | ... .unwrap_or(...) | main.rs:53:9:53:21 | remote_string | provenance | | +| main.rs:59:48:59:60 | remote_string | main.rs:59:48:59:69 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:59:48:59:69 | remote_string.as_str() [&ref] | main.rs:59:19:59:46 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| main.rs:67:14:67:26 | remote_string | main.rs:67:14:67:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:67:14:67:35 | remote_string.as_str() [&ref] | main.rs:67:10:67:12 | arg | provenance | MaD:4 Sink:MaD:4 | +models +| 1 | Sink: ::arg; Argument[0]; command-injection | +| 2 | Sink: ::args; Argument[0]; command-injection | +| 3 | Sink: ::new; Argument[0]; command-injection | +| 4 | Sink: ::arg; Argument[0]; command-injection | +| 5 | Sink: ::new; Argument[0]; command-injection | +| 6 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | +| 7 | Source: std::env::args; ReturnValue.Element; commandargs | +| 8 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 9 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | +| 10 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 12 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 13 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +nodes +| main.rs:4:9:4:18 | arg_string | semmle.label | arg_string | +| main.rs:4:22:4:35 | ...::args | semmle.label | ...::args | +| main.rs:4:22:4:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:4:22:4:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:4:22:4:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:5:9:5:21 | remote_string | semmle.label | remote_string | +| main.rs:5:25:5:46 | ...::get | semmle.label | ...::get | +| main.rs:5:25:5:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| main.rs:5:25:6:17 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:5:25:7:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| main.rs:5:25:8:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:27:5:27:16 | ...::new | semmle.label | ...::new | +| main.rs:27:18:27:27 | arg_string | semmle.label | arg_string | +| main.rs:27:18:27:36 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:34:10:34:12 | arg | semmle.label | arg | +| main.rs:34:14:34:26 | remote_string | semmle.label | remote_string | +| main.rs:34:14:34:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:40:10:40:12 | arg | semmle.label | arg | +| main.rs:40:14:40:23 | arg_string | semmle.label | arg_string | +| main.rs:40:14:40:32 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:47:10:47:13 | args | semmle.label | args | +| main.rs:47:15:47:45 | &... [&ref, element, &ref] | semmle.label | &... [&ref, element, &ref] | +| main.rs:47:16:47:45 | [...] [element, &ref] | semmle.label | [...] [element, &ref] | +| main.rs:47:23:47:35 | remote_string | semmle.label | remote_string | +| main.rs:47:23:47:44 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:53:9:53:21 | remote_string | semmle.label | remote_string | +| main.rs:53:25:53:46 | ...::get | semmle.label | ...::get | +| main.rs:53:25:53:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| main.rs:53:25:54:17 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:53:25:55:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| main.rs:53:25:56:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:59:19:59:46 | ...::new | semmle.label | ...::new | +| main.rs:59:48:59:60 | remote_string | semmle.label | remote_string | +| main.rs:59:48:59:69 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:67:10:67:12 | arg | semmle.label | arg | +| main.rs:67:14:67:26 | remote_string | semmle.label | remote_string | +| main.rs:67:14:67:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +subpaths From c412722c3acba43b9ae83e93b44dbe4510612bc5 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 13 Aug 2026 20:25:28 +0100 Subject: [PATCH 021/181] Rust: Add a test case containing string concatenation. --- .../CWE-078/CommandInjection.expected | 69 ++++++++++++------- .../test/query-tests/security/CWE-078/main.rs | 7 ++ 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index 29906c333d44..21485f4e3a3b 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -3,8 +3,9 @@ | main.rs:34:10:34:12 | arg | main.rs:5:25:5:46 | ...::get | main.rs:34:10:34:12 | arg | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | | main.rs:40:10:40:12 | arg | main.rs:4:22:4:35 | ...::args | main.rs:40:10:40:12 | arg | This command line depends on a $@. | main.rs:4:22:4:35 | ...::args | user-provided value | | main.rs:47:10:47:13 | args | main.rs:5:25:5:46 | ...::get | main.rs:47:10:47:13 | args | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | -| main.rs:59:19:59:46 | ...::new | main.rs:53:25:53:46 | ...::get | main.rs:59:19:59:46 | ...::new | This command line depends on a $@. | main.rs:53:25:53:46 | ...::get | user-provided value | -| main.rs:67:10:67:12 | arg | main.rs:53:25:53:46 | ...::get | main.rs:67:10:67:12 | arg | This command line depends on a $@. | main.rs:53:25:53:46 | ...::get | user-provided value | +| main.rs:53:5:53:16 | ...::new | main.rs:5:25:5:46 | ...::get | main.rs:53:5:53:16 | ...::new | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | +| main.rs:65:19:65:46 | ...::new | main.rs:59:25:59:46 | ...::get | main.rs:65:19:65:46 | ...::new | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | +| main.rs:73:10:73:12 | arg | main.rs:59:25:59:46 | ...::get | main.rs:73:10:73:12 | arg | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | @@ -14,6 +15,7 @@ edges | main.rs:4:22:4:74 | ... .unwrap_or(...) | main.rs:4:9:4:18 | arg_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:34:14:34:26 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:47:23:47:35 | remote_string | provenance | | +| main.rs:5:9:5:21 | remote_string | main.rs:52:40:52:69 | MacroExpr | provenance | | | main.rs:5:25:5:46 | ...::get | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | | main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:11 | | main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:13 | @@ -30,17 +32,24 @@ edges | main.rs:47:16:47:45 | [...] [element, &ref] | main.rs:47:15:47:45 | &... [&ref, element, &ref] | provenance | | | main.rs:47:23:47:35 | remote_string | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | provenance | MaD:9 | | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | main.rs:47:16:47:45 | [...] [element, &ref] | provenance | | -| main.rs:53:9:53:21 | remote_string | main.rs:59:48:59:60 | remote_string | provenance | | -| main.rs:53:9:53:21 | remote_string | main.rs:67:14:67:26 | remote_string | provenance | | -| main.rs:53:25:53:46 | ...::get | main.rs:53:25:53:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:53:25:53:69 | ...::get(...) [Ok] | main.rs:53:25:54:17 | ... .unwrap() | provenance | MaD:11 | -| main.rs:53:25:54:17 | ... .unwrap() | main.rs:53:25:55:15 | ... .text() [Ok] | provenance | MaD:13 | -| main.rs:53:25:55:15 | ... .text() [Ok] | main.rs:53:25:56:38 | ... .unwrap_or(...) | provenance | MaD:12 | -| main.rs:53:25:56:38 | ... .unwrap_or(...) | main.rs:53:9:53:21 | remote_string | provenance | | -| main.rs:59:48:59:60 | remote_string | main.rs:59:48:59:69 | remote_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:59:48:59:69 | remote_string.as_str() [&ref] | main.rs:59:19:59:46 | ...::new | provenance | MaD:5 Sink:MaD:5 | -| main.rs:67:14:67:26 | remote_string | main.rs:67:14:67:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:67:14:67:35 | remote_string.as_str() [&ref] | main.rs:67:10:67:12 | arg | provenance | MaD:4 Sink:MaD:4 | +| main.rs:52:9:52:28 | concatenated_command | main.rs:53:18:53:37 | concatenated_command | provenance | | +| main.rs:52:40:52:69 | ...::format(...) | main.rs:52:40:52:69 | { ... } | provenance | | +| main.rs:52:40:52:69 | ...::must_use(...) | main.rs:52:9:52:28 | concatenated_command | provenance | | +| main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:14 | +| main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:15 | +| main.rs:53:18:53:37 | concatenated_command | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | provenance | MaD:9 | +| main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | main.rs:53:5:53:16 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| main.rs:59:9:59:21 | remote_string | main.rs:65:48:65:60 | remote_string | provenance | | +| main.rs:59:9:59:21 | remote_string | main.rs:73:14:73:26 | remote_string | provenance | | +| main.rs:59:25:59:46 | ...::get | main.rs:59:25:59:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | +| main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:11 | +| main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:13 | +| main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:12 | +| main.rs:59:25:62:38 | ... .unwrap_or(...) | main.rs:59:9:59:21 | remote_string | provenance | | +| main.rs:65:48:65:60 | remote_string | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:19:65:46 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:10:73:12 | arg | provenance | MaD:4 Sink:MaD:4 | models | 1 | Sink: ::arg; Argument[0]; command-injection | | 2 | Sink: ::args; Argument[0]; command-injection | @@ -55,6 +64,8 @@ models | 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 12 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 13 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 14 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 15 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:4:9:4:18 | arg_string | semmle.label | arg_string | | main.rs:4:22:4:35 | ...::args | semmle.label | ...::args | @@ -81,16 +92,24 @@ nodes | main.rs:47:16:47:45 | [...] [element, &ref] | semmle.label | [...] [element, &ref] | | main.rs:47:23:47:35 | remote_string | semmle.label | remote_string | | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | -| main.rs:53:9:53:21 | remote_string | semmle.label | remote_string | -| main.rs:53:25:53:46 | ...::get | semmle.label | ...::get | -| main.rs:53:25:53:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | -| main.rs:53:25:54:17 | ... .unwrap() | semmle.label | ... .unwrap() | -| main.rs:53:25:55:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | -| main.rs:53:25:56:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:59:19:59:46 | ...::new | semmle.label | ...::new | -| main.rs:59:48:59:60 | remote_string | semmle.label | remote_string | -| main.rs:59:48:59:69 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | -| main.rs:67:10:67:12 | arg | semmle.label | arg | -| main.rs:67:14:67:26 | remote_string | semmle.label | remote_string | -| main.rs:67:14:67:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:52:9:52:28 | concatenated_command | semmle.label | concatenated_command | +| main.rs:52:40:52:69 | ...::format(...) | semmle.label | ...::format(...) | +| main.rs:52:40:52:69 | ...::must_use(...) | semmle.label | ...::must_use(...) | +| main.rs:52:40:52:69 | MacroExpr | semmle.label | MacroExpr | +| main.rs:52:40:52:69 | { ... } | semmle.label | { ... } | +| main.rs:53:5:53:16 | ...::new | semmle.label | ...::new | +| main.rs:53:18:53:37 | concatenated_command | semmle.label | concatenated_command | +| main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | semmle.label | concatenated_command.as_str() [&ref] | +| main.rs:59:9:59:21 | remote_string | semmle.label | remote_string | +| main.rs:59:25:59:46 | ...::get | semmle.label | ...::get | +| main.rs:59:25:59:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | +| main.rs:59:25:60:17 | ... .unwrap() | semmle.label | ... .unwrap() | +| main.rs:59:25:61:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | +| main.rs:59:25:62:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:65:19:65:46 | ...::new | semmle.label | ...::new | +| main.rs:65:48:65:60 | remote_string | semmle.label | remote_string | +| main.rs:65:48:65:69 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:73:10:73:12 | arg | semmle.label | arg | +| main.rs:73:14:73:26 | remote_string | semmle.label | remote_string | +| main.rs:73:14:73:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs index eecf95cec33d..f81ec33fba3a 100644 --- a/rust/ql/test/query-tests/security/CWE-078/main.rs +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -47,6 +47,12 @@ fn test_std_command_injection() { .args(&["-c", remote_string.as_str()]) // $ Alert[rust/command-line-injection]=remote1 .output() .expect("failed"); + + // Remote input concatenated into a command + let concatenated_command = format!("sh -c echo {}", remote_string); + Command::new(concatenated_command.as_str()) // $ Alert[rust/command-line-injection]=remote1 + .output() + .expect("failed"); } async fn test_tokio_command_injection() { @@ -72,4 +78,5 @@ async fn test_tokio_command_injection() { fn main() { test_std_command_injection(); + test_tokio_command_injection(); } From bd564489a6d3b15ce01f8b1ce99bf163001ff7a1 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Thu, 13 Aug 2026 22:17:44 +0100 Subject: [PATCH 022/181] Rust: Add the examples as test cases. --- .../CWE-078/CommandInjection.expected | 31 ++++++++++++++++++ .../test/query-tests/security/CWE-078/main.rs | 32 +++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index 21485f4e3a3b..71be73855bbd 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -6,6 +6,8 @@ | main.rs:53:5:53:16 | ...::new | main.rs:5:25:5:46 | ...::get | main.rs:53:5:53:16 | ...::new | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | | main.rs:65:19:65:46 | ...::new | main.rs:59:25:59:46 | ...::get | main.rs:65:19:65:46 | ...::new | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | | main.rs:73:10:73:12 | arg | main.rs:59:25:59:46 | ...::get | main.rs:73:10:73:12 | arg | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | +| main.rs:86:14:86:16 | arg | main.rs:108:22:108:35 | ...::args | main.rs:86:14:86:16 | arg | This command line depends on a $@. | main.rs:108:22:108:35 | ...::args | user-provided value | +| main.rs:100:18:100:20 | arg | main.rs:108:22:108:35 | ...::args | main.rs:100:18:100:20 | arg | This command line depends on a $@. | main.rs:108:22:108:35 | ...::args | user-provided value | edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | @@ -50,6 +52,20 @@ edges | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:19:65:46 | ...::new | provenance | MaD:5 Sink:MaD:5 | | main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:10:73:12 | arg | provenance | MaD:4 Sink:MaD:4 | +| main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input [&ref] | provenance | | +| main.rs:86:18:86:27 | user_input [&ref] | main.rs:86:14:86:16 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename [&ref] | provenance | | +| main.rs:100:22:100:29 | filename [&ref] | main.rs:100:18:100:20 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:108:9:108:18 | arg_string | main.rs:112:39:112:48 | arg_string | provenance | | +| main.rs:108:9:108:18 | arg_string | main.rs:113:40:113:49 | arg_string | provenance | | +| main.rs:108:22:108:35 | ...::args | main.rs:108:22:108:37 | ...::args(...) [element] | provenance | Src:MaD:7 | +| main.rs:108:22:108:37 | ...::args(...) [element] | main.rs:108:22:108:44 | ... .nth(...) [Some] | provenance | MaD:8 | +| main.rs:108:22:108:44 | ... .nth(...) [Some] | main.rs:108:22:108:74 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:108:22:108:74 | ... .unwrap_or(...) | main.rs:108:9:108:18 | arg_string | provenance | | +| main.rs:112:39:112:48 | arg_string | main.rs:112:39:112:57 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:112:39:112:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | +| main.rs:113:40:113:49 | arg_string | main.rs:113:40:113:58 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:113:40:113:58 | arg_string.as_str() [&ref] | main.rs:95:27:95:40 | ...: ... [&ref] | provenance | | models | 1 | Sink: ::arg; Argument[0]; command-injection | | 2 | Sink: ::args; Argument[0]; command-injection | @@ -112,4 +128,19 @@ nodes | main.rs:73:10:73:12 | arg | semmle.label | arg | | main.rs:73:14:73:26 | remote_string | semmle.label | remote_string | | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | +| main.rs:82:27:82:42 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | +| main.rs:86:14:86:16 | arg | semmle.label | arg | +| main.rs:86:18:86:27 | user_input [&ref] | semmle.label | user_input [&ref] | +| main.rs:95:27:95:40 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | +| main.rs:100:18:100:20 | arg | semmle.label | arg | +| main.rs:100:22:100:29 | filename [&ref] | semmle.label | filename [&ref] | +| main.rs:108:9:108:18 | arg_string | semmle.label | arg_string | +| main.rs:108:22:108:35 | ...::args | semmle.label | ...::args | +| main.rs:108:22:108:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:108:22:108:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:108:22:108:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:112:39:112:48 | arg_string | semmle.label | arg_string | +| main.rs:112:39:112:57 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:113:40:113:49 | arg_string | semmle.label | arg_string | +| main.rs:113:40:113:58 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs index f81ec33fba3a..6fc29ceb2104 100644 --- a/rust/ql/test/query-tests/security/CWE-078/main.rs +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -76,7 +76,39 @@ async fn test_tokio_command_injection() { .expect("failed"); } +mod qhelp_example_bad { + use std::process::Command; + + pub fn handle_request(user_input: &str) { + // BAD + Command::new("sh") + .arg("-c") + .arg(user_input) // $ Alert[rust/command-line-injection]=args2 + .output() + .expect("failed to execute"); + } +} + +mod qhelp_example_good { + use std::process::Command; + + pub fn handle_request(filename: &str) { + // GOOD + let allowed_names = ["report.pdf", "summary.txt", "data.csv"]; + if allowed_names.contains(&filename) { + Command::new("cat") + .arg(filename) // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + .output() + .expect("failed to execute"); + } + } +} + fn main() { + let arg_string = std::env::args().nth(1).unwrap_or(String::from("ls")); // $ Source=args2 + test_std_command_injection(); test_tokio_command_injection(); + qhelp_example_bad::handle_request(arg_string.as_str()); + qhelp_example_good::handle_request(arg_string.as_str()); } From 1a811d5da04f5c6d75312899f69e1a59f1eb9be5 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 17 Aug 2026 11:22:50 +0100 Subject: [PATCH 023/181] C++: Cleanup in preparation for adding access paths at sources and sinks (no test changes). --- .../ir/dataflow/internal/DataFlowNodes.qll | 12 ++-- .../ir/dataflow/internal/DataFlowPrivate.qll | 71 ++++++++++++++++--- 2 files changed, 71 insertions(+), 12 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll index 27f7497422db..9e33969c85f8 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll @@ -1655,13 +1655,13 @@ abstract private class AbstractParameterNode extends Node { * Holds if this node represents an implicit `this` parameter, if it exists. */ predicate isThis() { none() } // overridden by subclasses -} -abstract private class AbstractIndirectParameterNode extends AbstractParameterNode { /** Gets the indirection index of this parameter node. */ - abstract int getIndirectionIndex(); + int getIndirectionIndex() { none() } } +abstract private class AbstractIndirectParameterNode extends AbstractParameterNode { } + pragma[noinline] private predicate indirectParameterNodeHasArgumentIndexAndIndex( IndirectInstructionParameterNode node, int argumentIndex, int indirectionIndex @@ -1725,7 +1725,9 @@ private class IndirectInstructionParameterNode extends AbstractIndirectParameter final override int getIndirectionIndex() { this.hasInstructionAndIndirectionIndex(init, result) } } -abstract private class AbstractDirectParameterNode extends AbstractParameterNode { } +abstract private class AbstractDirectParameterNode extends AbstractParameterNode { + override int getIndirectionIndex() { result = 0 } +} /** * A non-indirect parameter node that is represented as an `Instruction`. @@ -1796,6 +1798,8 @@ private class DirectBodyLessParameterNode extends AbstractExplicitParameterNode, } override Parameter getParameter() { result = p } + + final override int getIndirectionIndex() { result = 0 } } private class IndirectBodyLessParameterNode extends AbstractIndirectParameterNode, diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index df4901b65fe8..0513c2ba92e9 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -508,11 +508,31 @@ predicate isArgumentNode(ArgumentNode arg, DataFlowCall c, ArgumentPosition pos) * on parameters are also included. */ abstract class ArgumentNode extends Node { + /** + * Holds if this argument occurs at the given position in the given call, + * and this call is represented in the source code. + * The instance argument is considered to have index `-1`. + */ + predicate sourceArgumentOf(CallInstruction call, ArgumentPosition pos) { none() } + + /** + * Holds if this argument occurs at the given position in the given call, + * and this call part of a summary. + * The instance argument is considered to have index `-1`. + */ + predicate summaryArgumentOf(FlowSummaryImpl::Public::SummarizedCallable call, ArgumentPosition pos) { + none() + } + /** * Holds if this argument occurs at the given position in the given call. * The instance argument is considered to have index `-1`. */ - abstract predicate argumentOf(DataFlowCall call, ArgumentPosition pos); + final predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { + this.sourceArgumentOf(call.asCallInstruction(), pos) + or + this.summaryArgumentOf(call.asSummaryCall(), pos) + } /** Gets the call in which this node is an argument. */ DataFlowCall getCall() { this.argumentOf(result, _) } @@ -527,16 +547,16 @@ private class PrimaryArgumentNode extends ArgumentNode, OperandNode { PrimaryArgumentNode() { exists(CallInstruction call | op = call.getAnArgumentOperand()) } - override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { + override predicate sourceArgumentOf(CallInstruction call, ArgumentPosition pos) { op = call.getArgumentOperand(pos.(DirectPosition).getArgumentIndex()) } } private class SideEffectArgumentNode extends ArgumentNode, SideEffectOperandNode { - override predicate argumentOf(DataFlowCall dfCall, ArgumentPosition pos) { + override predicate sourceArgumentOf(CallInstruction c, ArgumentPosition pos) { exists(int indirectionIndex | pos = TIndirectionPosition(argumentIndex, pragma[only_bind_into](indirectionIndex)) and - this.getCallInstruction() = dfCall.asCallInstruction() and + this.getCallInstruction() = c and super.hasAddressOperandAndIndirectionIndex(arg, pragma[only_bind_into](indirectionIndex)) ) } @@ -554,8 +574,10 @@ class SummaryArgumentNode extends ArgumentNode, FlowSummaryNode { FlowSummaryImpl::Private::summaryArgumentNode(call_.getReceiver(), this.getSummaryNode(), pos_) } - override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { - call = call_ and + override predicate summaryArgumentOf( + FlowSummaryImpl::Public::SummarizedCallable call, ArgumentPosition pos + ) { + call = call_.asSummaryCall() and pos = pos_ } } @@ -569,8 +591,8 @@ private class FlowSummaryArgumentNode extends ArgumentNode, FlowSummaryNode { this.getSummaryNode() = FlowSummaryImpl::Private::summaryArgumentNode(callInstruction, rk) } - override predicate argumentOf(DataFlowCall call, ArgumentPosition pos) { - call.asCallInstruction() = callInstruction and + override predicate sourceArgumentOf(CallInstruction call, ArgumentPosition pos) { + call = callInstruction and pos = TFlowSummaryPosition(rk) } } @@ -593,6 +615,32 @@ abstract class Position extends TPosition { /** Gets the indirection index of this position. */ abstract int getIndirectionIndex(); + + /** + * Gets the parameter associated with this position, if any. + * + * Since a `Position` is defined by both an argument index and an + * indirection multiple `Position`s can be associated with the + * same `Parameter`. + */ + Parameter getParameter(Function f) { + result.getFunction() = f and + this.getArgumentIndex() = result.getIndex() + } + + /** + * Gets the argument (or qualifier) associated with this position, if any. + * + * Since a `Position` is defined by both an argument index and an + * indirection multiple `Position`s can be associated with the + * same argument/qualifier. + */ + Expr getArgument(Cpp::Call call) { + result = call.getArgument(this.getArgumentIndex()) + or + this.getArgumentIndex() = -1 and + result = call.getQualifier() + } } class DirectPosition extends Position, TDirectPosition { @@ -1189,6 +1237,11 @@ class DataFlowCall extends TDataFlowCall { */ CallInstruction asCallInstruction() { none() } + /** + * Gets the underlying summarized call, if any. + */ + FlowSummaryImpl::Public::SummarizedCallable asSummaryCall() { none() } + /** * Gets the operand the specifies the target function of the call. */ @@ -1306,6 +1359,8 @@ class SummaryCall extends DataFlowCall, TSummaryCall { */ FlowSummaryImpl::Private::SummaryNode getReceiver() { result = receiver } + final override FlowSummaryImpl::Public::SummarizedCallable asSummaryCall() { result = c } + // no implementation for `getCallTargetOperand()`, `getStaticCallTarget()` // or `getArgumentOperand(int index)`. This is because the flow summary // library is responsible for finding the call target, and there are no From 2ea969ddbc50e27c939508a8d497434cf04ad200 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 17 Aug 2026 13:39:04 +0100 Subject: [PATCH 024/181] C++: Add tests with missing flow sources. --- .../dataflow/external-models/flow.ext.yml | 3 ++ .../dataflow/external-models/sinks.expected | 5 +++ .../dataflow/external-models/test.cpp | 42 +++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 130e13a92571..87756c451f3a 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -4,6 +4,9 @@ extensions: extensible: sourceModel data: # namespace, type, subtypes, name, signature, ext, output, kind, provenance - ["", "", False, "ymlSource", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "ymlFieldSource", "", "", "ReturnValue.Field[SourceWrapper::value]", "local", "manual"] + - ["", "", False, "source_from_callback_template", "", "", "Argument[0].Parameter[*0].Field[SourceWrapper::value]", "local", "manual"] + - ["", "", False, "source_from_callback_ptr", "", "", "Argument[0].Parameter[*0].Field[SourceWrapper::value]", "local", "manual"] - addsTo: pack: codeql/cpp-all extensible: sinkModel diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index a1f44de81589..858f12bdd69e 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -23,3 +23,8 @@ | test.cpp:201:10:201:10 | x | test-sink | | test.cpp:218:11:218:11 | x | test-sink | | test.cpp:224:11:224:11 | c | test-sink | +| test.cpp:243:13:243:17 | value | test-sink | +| test.cpp:248:18:248:22 | value | test-sink | +| test.cpp:254:14:254:18 | value | test-sink | +| test.cpp:258:14:258:18 | value | test-sink | +| test.cpp:263:15:263:19 | value | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index ebb20bab6497..44138fd16e79 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -223,4 +223,46 @@ void test_reverse_flow(unsigned i, unsigned j) { char c = s[j]; ymlSink(c); // $ ir } +} + + +struct SourceWrapper { + int value; +}; + +SourceWrapper ymlFieldSource(); + +template +void source_from_callback_template(F); + +using Callback = void(*)(const SourceWrapper*); + +void source_from_callback_ptr(Callback); + +void f(const SourceWrapper* s) { + ymlSink(s->value); // $ MISSING: ir=250:32 ir=251:27 +} + +void test_source_access_path() { + SourceWrapper wrapper = ymlFieldSource(); + ymlSink(wrapper.value); // $ MISSING: ir + + source_from_callback_template(f); + source_from_callback_ptr(f); + + source_from_callback_template([](const SourceWrapper* s) { + ymlSink(s->value); // $ MISSING: ir + }); + + source_from_callback_ptr([](const SourceWrapper* s) { + ymlSink(s->value); // $ MISSING: ir + }); + + struct S { + void operator()(const SourceWrapper* s) { + ymlSink(s->value); // $ MISSING: ir + } + }; + + source_from_callback_template(S()); } \ No newline at end of file From 79ac0090d24d49009260ffc80dec901bb70a3a2b Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 17 Aug 2026 13:44:04 +0100 Subject: [PATCH 025/181] C++: Support for access path at sources and sinks. --- .../semmle/code/cpp/dataflow/ExternalFlow.qll | 9 +- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 157 +++++++++++++++++- .../ir/dataflow/internal/DataFlowNodes.qll | 36 ++++ 3 files changed, 188 insertions(+), 14 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll index 29da7f7204c0..4f84b30d557e 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/ExternalFlow.qll @@ -113,6 +113,7 @@ import cpp private import new.DataFlow private import semmle.code.cpp.controlflow.IRGuards +private import semmle.code.cpp.ir.dataflow.internal.DataFlowNodes as Nodes private import semmle.code.cpp.ir.dataflow.internal.DataFlowPrivate as Private private import semmle.code.cpp.ir.dataflow.internal.DataFlowUtil private import internal.FlowSummaryImpl @@ -952,9 +953,7 @@ private module Cached { */ cached predicate sourceNode(DataFlow::Node node, string kind, string model) { - exists(SourceSinkInterpretationInput::InterpretNode n | - isSourceNode(n, kind, model) and n.asNode() = node - ) + node.(Nodes::FlowSummaryNode).isSource(kind, model) } /** @@ -963,9 +962,7 @@ private module Cached { */ cached predicate sinkNode(DataFlow::Node node, string kind, string model) { - exists(SourceSinkInterpretationInput::InterpretNode n | - isSinkNode(n, kind, model) and n.asNode() = node - ) + node.(Nodes::FlowSummaryNode).isSink(kind, model) } private newtype TKindModelPair = diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index dda9218855f8..7a43fe19492e 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -17,11 +17,9 @@ module Input implements InputSig { class SummarizedCallableBase = Function; - class SourceBase extends Void { - Location getLocation() { none() } - } + class SourceBase = Function; - class SinkBase = SourceBase; + class SinkBase = Function; class FlowSummaryCallBase = CallInstruction; @@ -134,15 +132,120 @@ module Input implements InputSig { private import Make as Impl +private class ConversionCall extends Call { + ConversionCall() { this.getTarget() instanceof ConversionOperator } +} + private module Input2 implements Impl::Private::InputSig2 { private import codeql.util.Void - class SourceSinkReportingElement extends Void { - Location getLocation() { none() } + class SourceSinkReportingElement extends Element { + SourceSinkReportingElement() { this instanceof Expr or this instanceof Parameter } + + DataFlowCallable getEnclosingCallable() { + result.asSourceCallable() = + [this.(Expr).getEnclosingFunction(), this.(Parameter).getFunction()] + } + + /** + * Gets the member function corresponding to an overloaded `operator()` when this element is + * invoked. + */ + private MemberFunction getOperatorCallFunction() { + // An `operator()` on a struct + result.getClassAndName("operator()").getADerivedClass*() = this.(Expr).getUnspecifiedType() + or + // A lambda that has undergone "lambda to function-pointer conversion" + result = this.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() + } + + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { + exists(ParameterPosition pos | sc = Impl::Private::SummaryComponent::parameter(pos) | + // Taking the address of a function + result = pos.getParameter(this.(FunctionAccess).getTarget()) + or + // Passing an object with an overloaded `operator()` + result = pos.getParameter(this.getOperatorCallFunction()) + ) + } + } + + bindingset[source, sc] + SourceSinkReportingElement getASourceReportingElement( + Input::SourceBase source, Impl::Private::SummaryComponent sc + ) { + exists(Call call | call.getTarget() = source | + sc = Impl::Private::SummaryComponent::return(_) and + result = call + or + exists(ArgumentPosition pos | + sc = Impl::Private::SummaryComponent::argument(pos) and + result = pos.getArgument(call) + ) + ) + or + exists(ParameterPosition pos | + sc = Impl::Private::SummaryComponent::parameter(pos) and + result = pos.getParameter(source) + ) + } + + pragma[nomagic] + private IndirectReturnOutNode getIndirectReturn(CallInstruction call, NormalReturnKind rk) { + result.getCallInstruction() = call and + pragma[only_bind_out](result.getIndirectionIndex()) = + pragma[only_bind_out](rk.getIndirectionIndex()) + } + + bindingset[e, sc] + Node getSourceDataFlowNode(SourceSinkReportingElement e, Impl::Private::SummaryComponent sc) { + exists(DataFlowCall call | + exists(ArgumentPosition pos | + sc = Impl::Private::SummaryComponent::argument(pos) and + pos.getArgument(call.asCallInstruction().getUnconvertedResultExpression()) = e + | + pos.getIndirectionIndex() = 0 and + result.(PostUpdateNode).getPreUpdateNode().asExpr() = e + or + result.(PostUpdateNode).getPreUpdateNode().asIndirectExpr(pos.getIndirectionIndex()) = e + ) + or + exists(ReturnKind rk | + sc = Impl::Private::SummaryComponent::return(rk) and + e = call.asCallInstruction().getUnconvertedResultExpression() + | + rk.getIndirectionIndex() = 0 and + simpleOutNode(result, call.asCallInstruction()) + or + result = getIndirectReturn(call.asCallInstruction(), rk) + ) + ) + or + exists(ParameterPosition pos, ParameterNode p | + sc = Impl::Private::SummaryComponent::parameter(pos) and + p.isParameterOf(e.getEnclosingCallable(), pos) and + result = p + ) + } - DataFlowCallable getEnclosingCallable() { none() } + bindingset[sink, sc] + SourceSinkReportingElement getASinkReportingElement( + Input::SinkBase sink, Impl::Private::SummaryComponent sc + ) { + exists(Call call, ArgumentPosition pos | + call.getTarget() = sink and + sc = Impl::Private::SummaryComponent::argument(pos) and + result = pos.getArgument(call) + ) + } - SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { none() } + bindingset[e, sc] + Node getSinkDataFlowNode(SourceSinkReportingElement e, Impl::Private::SummaryComponent sc) { + exists(ArgumentPosition pos, CallInstruction call | + sc = Impl::Private::SummaryComponent::argument(pos) and + pos.getArgument(call.getUnconvertedResultExpression()) = e and + result.(ArgumentNode).sourceArgumentOf(call, pos) + ) } } @@ -319,3 +422,41 @@ module Private { } module Public = Impl::Public; + +private class SourceModelFunction extends Public::SourceElement instanceof Function { + private string namespace; + private string type; + private boolean subtypes; + private string name; + private string signature; + private string ext; + + SourceModelFunction() { + sourceModel(namespace, type, subtypes, name, signature, ext, _, _, _, _) and + this = interpretElement(namespace, type, subtypes, name, signature, ext) + } + + override predicate isSource( + string output, string kind, Public::Provenance provenance, string model + ) { + sourceModel(namespace, type, subtypes, name, signature, ext, output, kind, provenance, model) + } +} + +private class SinkModelFunction extends Public::SinkElement instanceof Function { + private string namespace; + private string type; + private boolean subtypes; + private string name; + private string signature; + private string ext; + + SinkModelFunction() { + sinkModel(namespace, type, subtypes, name, signature, ext, _, _, _, _) and + this = interpretElement(namespace, type, subtypes, name, signature, ext) + } + + override predicate isSink(string input, string kind, Public::Provenance provenance, string model) { + sinkModel(namespace, type, subtypes, name, signature, ext, input, kind, provenance, model) + } +} diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll index 9e33969c85f8..16e2130eb229 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll @@ -1541,6 +1541,42 @@ class FlowSummaryNode extends Node, TFlowSummaryNode { override Location getLocationImpl() { result = this.getSummaryNode().getLocation() } override string toStringImpl() { result = this.getSummaryNode().toString() } + + /** Gets the source element that this node belongs to, if any. */ + FlowSummaryImpl::Public::SourceElement getSourceElement() { + result = this.getSummaryNode().getSourceElement() + } + + /** Gets the sink element that this node belongs to, if any. */ + FlowSummaryImpl::Public::SinkElement getSinkElement() { + result = this.getSummaryNode().getSinkElement() + } + + /** Holds if this node is a source node of kind `kind`. */ + predicate isSource(string kind, string model) { + this.getSummaryNode().(FlowSummaryImpl::Private::SourceOutputNode).isEntry(kind, model) + } + + /** Holds if this node is a sink node of kind `kind`. */ + predicate isSink(string kind, string model) { + this.getSummaryNode().(FlowSummaryImpl::Private::SinkInputNode).isExit(kind, model) + } +} + +private class SourceOutputNode extends FlowSummaryImpl::Private::SourceOutputNode { + final override string toString() { + exists(Call call | + this.isOutArgument(call) and + result = call.getTarget() + " output argument" + ) + or + not this.isOutArgument(_) and + result = super.toString() + } + + private predicate isOutArgument(Call call) { + [call.getAnArgument(), call.getQualifier()] = this.getSourceSinkReportingElement() + } } /** From af7db963b711eab1294eab35f717ca8bf0196ca7 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 17 Aug 2026 14:39:14 +0100 Subject: [PATCH 026/181] C++: Accept test changes. --- .../dataflow/external-models/flow.expected | 344 ++++++++++-------- .../dataflow/external-models/sinks.expected | 4 +- .../dataflow/external-models/sources.expected | 30 +- .../dataflow/external-models/test.cpp | 10 +- .../models-as-data/testModels.expected | 67 ++++ 5 files changed, 288 insertions(+), 167 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 24ba3b2aa686..99ce09880165 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -33,106 +33,109 @@ models | 32 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[*6]; remote; manual | | 33 | Source: ; ; false; WinHttpReadData; ; ; Argument[*1]; remote; manual | | 34 | Source: ; ; false; WinHttpReadDataEx; ; ; Argument[*1]; remote; manual | -| 35 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | -| 36 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | -| 37 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | -| 38 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | -| 39 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | -| 40 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | -| 41 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | -| 42 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | -| 43 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 44 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 45 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | -| 46 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 47 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 48 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 49 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 50 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 51 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 52 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | -| 53 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 54 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 55 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 56 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | -| 57 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 58 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | -| 59 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 60 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 61 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 62 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 63 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 64 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | -| 65 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | -| 66 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | -| 67 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 68 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | -| 69 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | -| 70 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | -| 71 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | -| 72 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 73 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 74 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | -| 75 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | -| 76 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | -| 77 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | -| 78 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | -| 79 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 80 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 81 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | -| 82 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 83 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 35 | Source: ; ; false; source_from_callback_ptr; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | +| 36 | Source: ; ; false; source_from_callback_template; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | +| 37 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | +| 38 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | +| 39 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | +| 40 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | +| 41 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | +| 42 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | +| 43 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | +| 44 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | +| 45 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | +| 46 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 47 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 48 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | +| 49 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 50 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 51 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 52 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 53 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 54 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 55 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | +| 56 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 57 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 58 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 59 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | +| 60 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 61 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | +| 62 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 63 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 64 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 65 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 66 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 67 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | +| 68 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | +| 69 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | +| 70 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 71 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | +| 72 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | +| 73 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | +| 74 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | +| 75 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | +| 76 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 77 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | +| 78 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | +| 79 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | +| 80 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | +| 81 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | +| 82 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 83 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 84 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | +| 85 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 86 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:42 | -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | *recv_buffer | provenance | Src:MaD:42 Sink:MaD:2 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:45 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:45 Sink:MaD:2 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:100:64:100:71 | *send_str | provenance | TaintFunction | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | -| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | *send_buffer | provenance | Sink:MaD:2 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:83 | -| azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:39 | +| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:2 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:86 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | -| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:79 | +| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:42 | +| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:82 | | azure.cpp:257:16:257:21 | Read output argument | azure.cpp:258:10:258:16 | * ... | provenance | | -| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:80 | +| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:83 | | azure.cpp:262:23:262:28 | ReadToCount output argument | azure.cpp:263:10:263:16 | * ... | provenance | | -| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:81 | +| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:84 | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:267:10:267:12 | vec [element] | provenance | | | azure.cpp:267:10:267:12 | vec [element] | azure.cpp:267:10:267:12 | vec | provenance | | -| azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:38 | +| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:41 | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:10:274:29 | call to operator[] | provenance | | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:14:274:29 | call to operator[] | provenance | | -| azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:37 | +| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:40 | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:278:10:278:13 | body | azure.cpp:278:10:278:13 | body | provenance | | -| azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:36 | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:282:21:282:23 | *call to get | provenance | | -| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:81 | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:39 | +| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:84 | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | -| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:82 | +| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:85 | +| azure.cpp:289:32:289:40 | Value output argument | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:43 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | -| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:40 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:290:10:290:20 | headerValue | azure.cpp:290:10:290:20 | headerValue | provenance | | -| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:41 | +| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:44 | | azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:294:38:294:53 | call to operator[] | provenance | TaintFunction | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | -| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:14:10:14:10 | x | provenance | Sink:MaD:1 | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:17:24:17:24 | x | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:21:27:21:27 | x | provenance | | @@ -140,99 +143,122 @@ edges | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:32:41:32:41 | x | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:1 | -| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:71 | +| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:74 | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:1 | -| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:70 | +| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:73 | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:72 | +| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:75 | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:1 | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | provenance | | | test.cpp:32:41:32:41 | x | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:46:30:46:32 | *arg [x] | test.cpp:47:12:47:19 | *arg [x] | provenance | | | test.cpp:47:12:47:19 | *arg [x] | test.cpp:48:13:48:13 | *s [x] | provenance | | -| test.cpp:48:13:48:13 | *s [x] | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:1 | +| test.cpp:48:13:48:13 | *s [x] | test.cpp:48:16:48:16 | x | provenance | | +| test.cpp:48:16:48:16 | x | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:1 | | test.cpp:56:2:56:2 | *s [post update] [x] | test.cpp:59:55:59:64 | *& ... [x] | provenance | | | test.cpp:56:2:56:18 | ... = ... | test.cpp:56:2:56:2 | *s [post update] [x] | provenance | | -| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:35 | -| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:67 | +| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:38 | +| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:70 | | test.cpp:68:22:68:22 | y | test.cpp:69:11:69:11 | y | provenance | Sink:MaD:1 | | test.cpp:74:22:74:22 | y | test.cpp:75:11:75:11 | y | provenance | Sink:MaD:1 | | test.cpp:82:22:82:22 | y | test.cpp:83:11:83:11 | y | provenance | Sink:MaD:1 | | test.cpp:88:22:88:22 | y | test.cpp:89:11:89:11 | y | provenance | Sink:MaD:1 | -| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:97:26:97:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:101:26:101:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:103:63:103:63 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:104:62:104:62 | x | provenance | | -| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:65 | -| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:65 | -| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:65 | -| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:65 | -| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:68 | +| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:68 | +| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:68 | +| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:68 | +| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:114:10:114:18 | call to ymlSource | test.cpp:118:44:118:44 | *x | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:66 | -| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:69 | +| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:134:45:134:45 | x | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:134:13:134:43 | call to templateFunction | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:1 | -| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:77 | -| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:80 | +| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:148:26:148:26 | x | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:148:10:148:27 | call to function | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:1 | -| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:78 | -| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:81 | +| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:157:26:157:26 | x | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:157:13:157:20 | call to function | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:1 | -| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:78 | +| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:81 | | test.cpp:164:34:164:34 | x | test.cpp:165:69:165:69 | x | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:164:7:164:7 | *templateFunction3 | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | | -| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:76 | -| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:35 | +| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:79 | +| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:172:51:172:51 | x | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:1 | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | provenance | | -| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:76 | +| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:79 | | test.cpp:186:2:186:2 | *s [post update] [myField] | test.cpp:187:33:187:34 | *& ... [myField] | provenance | | | test.cpp:186:2:186:24 | ... = ... | test.cpp:186:2:186:2 | *s [post update] [myField] | provenance | | -| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:35 | +| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:38 | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:188:10:188:10 | x | provenance | Sink:MaD:1 | -| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:68 | +| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:71 | | test.cpp:199:2:199:2 | *s [post update] [myField] | test.cpp:200:35:200:36 | *& ... [myField] | provenance | | | test.cpp:199:2:199:24 | ... = ... | test.cpp:199:2:199:2 | *s [post update] [myField] | provenance | | -| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:35 | +| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:38 | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:1 | -| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:69 | +| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:72 | | test.cpp:216:3:216:4 | get_ptr output argument [value] | test.cpp:217:11:217:12 | *rf [value] | provenance | | -| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:75 | -| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:35 | +| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:78 | +| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:38 | | test.cpp:217:11:217:12 | *rf [value] | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:1 | | test.cpp:222:3:222:3 | operator[] output argument | test.cpp:223:12:223:12 | *s | provenance | | -| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:74 | -| test.cpp:222:10:222:20 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:35 | -| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:73 | +| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:77 | +| test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:38 | +| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:76 | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:223:13:223:15 | call to operator[] | provenance | | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:1 | -| windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:3 | +| test.cpp:243:10:243:10 | *s [value] | test.cpp:243:13:243:17 | value | provenance | | +| test.cpp:243:13:243:17 | value | test.cpp:243:13:243:17 | value | provenance | Sink:MaD:1 | +| test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:37 | +| test.cpp:247:26:247:39 | call to ymlFieldSource [value] | test.cpp:248:10:248:16 | *wrapper [value] | provenance | | +| test.cpp:248:10:248:16 | *wrapper [value] | test.cpp:248:18:248:22 | value | provenance | | +| test.cpp:248:18:248:22 | value | test.cpp:248:18:248:22 | value | provenance | Sink:MaD:1 | +| test.cpp:250:32:250:32 | source_from_callback_template output argument | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:35 | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | +| test.cpp:253:32:255:2 | source_from_callback_template output argument | test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | test.cpp:254:11:254:11 | *s [value] | provenance | | +| test.cpp:254:11:254:11 | *s [value] | test.cpp:254:14:254:18 | value | provenance | | +| test.cpp:254:14:254:18 | value | test.cpp:254:14:254:18 | value | provenance | Sink:MaD:1 | +| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:35 | +| test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | test.cpp:258:11:258:11 | *s [value] | provenance | | +| test.cpp:258:11:258:11 | *s [value] | test.cpp:258:14:258:18 | value | provenance | | +| test.cpp:258:14:258:18 | value | test.cpp:258:14:258:18 | value | provenance | Sink:MaD:1 | +| test.cpp:263:12:263:12 | *s [value] | test.cpp:263:15:263:19 | value | provenance | | +| test.cpp:263:15:263:19 | value | test.cpp:263:15:263:19 | value | provenance | Sink:MaD:1 | +| test.cpp:267:32:267:34 | source_from_callback_template output argument | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | test.cpp:263:12:263:12 | *s [value] | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | +| windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:3 | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:30:8:30:15 | * ... | provenance | | -| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:45 | -| windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:4 | +| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:48 | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | windows.cpp:36:10:36:13 | * ... | provenance | | +| windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:4 | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | windows.cpp:41:10:41:13 | * ... | provenance | Src:MaD:5 | | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | windows.cpp:149:42:149:53 | *lpOverlapped [*hEvent] | provenance | | | windows.cpp:149:18:149:62 | *hEvent | windows.cpp:149:18:149:62 | *hEvent | provenance | | @@ -250,32 +276,32 @@ edges | windows.cpp:189:21:189:26 | ReadFile output argument | windows.cpp:190:5:190:56 | *... = ... | provenance | Src:MaD:17 | | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | windows.cpp:192:53:192:63 | *& ... [*hEvent] | provenance | | | windows.cpp:190:5:190:56 | *... = ... | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | provenance | | -| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:52 | +| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:55 | | windows.cpp:198:21:198:26 | ReadFile output argument | windows.cpp:199:5:199:57 | ... = ... | provenance | Src:MaD:17 | | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | windows.cpp:201:53:201:63 | *& ... [hEvent] | provenance | | | windows.cpp:199:5:199:57 | ... = ... | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | provenance | | -| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:52 | +| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:55 | | windows.cpp:209:84:209:89 | NtReadFile output argument | windows.cpp:211:10:211:16 | * ... | provenance | Src:MaD:16 | -| windows.cpp:286:23:286:35 | *call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:12 | | windows.cpp:286:23:286:35 | *call to MapViewOfFile | windows.cpp:287:20:287:52 | *pMapView | provenance | | +| windows.cpp:286:23:286:35 | call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:12 | | windows.cpp:287:20:287:52 | *pMapView | windows.cpp:289:10:289:16 | * ... | provenance | | -| windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | provenance | Src:MaD:9 | | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | windows.cpp:294:20:294:52 | *pMapView | provenance | | +| windows.cpp:293:23:293:36 | call to MapViewOfFile2 | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | provenance | Src:MaD:9 | | windows.cpp:294:20:294:52 | *pMapView | windows.cpp:296:10:296:16 | * ... | provenance | | -| windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | provenance | Src:MaD:10 | | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | windows.cpp:303:20:303:52 | *pMapView | provenance | | +| windows.cpp:302:23:302:36 | call to MapViewOfFile3 | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | provenance | Src:MaD:10 | | windows.cpp:303:20:303:52 | *pMapView | windows.cpp:305:10:305:16 | * ... | provenance | | -| windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | provenance | Src:MaD:11 | | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | windows.cpp:312:20:312:52 | *pMapView | provenance | | +| windows.cpp:311:23:311:43 | call to MapViewOfFile3FromApp | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | provenance | Src:MaD:11 | | windows.cpp:312:20:312:52 | *pMapView | windows.cpp:314:10:314:16 | * ... | provenance | | -| windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | provenance | Src:MaD:13 | | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | windows.cpp:319:20:319:52 | *pMapView | provenance | | +| windows.cpp:318:23:318:37 | call to MapViewOfFileEx | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | provenance | Src:MaD:13 | | windows.cpp:319:20:319:52 | *pMapView | windows.cpp:321:10:321:16 | * ... | provenance | | -| windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | provenance | Src:MaD:14 | | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | windows.cpp:326:20:326:52 | *pMapView | provenance | | +| windows.cpp:325:23:325:42 | call to MapViewOfFileFromApp | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | provenance | Src:MaD:14 | | windows.cpp:326:20:326:52 | *pMapView | windows.cpp:328:10:328:16 | * ... | provenance | | -| windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | provenance | Src:MaD:15 | | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | windows.cpp:333:20:333:52 | *pMapView | provenance | | +| windows.cpp:332:23:332:40 | call to MapViewOfFileNuma2 | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | provenance | Src:MaD:15 | | windows.cpp:333:20:333:52 | *pMapView | windows.cpp:335:10:335:16 | * ... | provenance | | | windows.cpp:403:26:403:36 | *lpParameter [x] | windows.cpp:405:10:405:25 | *lpParameter [x] | provenance | | | windows.cpp:405:10:405:25 | *lpParameter [x] | windows.cpp:406:8:406:8 | *s [x] | provenance | | @@ -291,9 +317,9 @@ edges | windows.cpp:431:3:431:3 | *s [post update] [x] | windows.cpp:464:7:464:8 | *& ... [x] | provenance | | | windows.cpp:431:3:431:16 | ... = ... | windows.cpp:431:3:431:3 | *s [post update] [x] | provenance | | | windows.cpp:431:9:431:14 | call to source | windows.cpp:431:3:431:16 | ... = ... | provenance | | -| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:48 | -| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:46 | -| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:47 | +| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:51 | +| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:49 | +| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:50 | | windows.cpp:533:11:533:16 | call to source | windows.cpp:533:11:533:16 | call to source | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:537:40:537:41 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:542:38:542:39 | *& ... | provenance | | @@ -302,30 +328,30 @@ edges | windows.cpp:533:11:533:16 | call to source | windows.cpp:568:32:568:33 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:573:40:573:41 | *& ... | provenance | | | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | windows.cpp:538:10:538:23 | access to array | provenance | | -| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:57 | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:60 | | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | windows.cpp:543:10:543:23 | access to array | provenance | | -| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:53 | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:56 | | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | windows.cpp:548:10:548:23 | access to array | provenance | | -| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:54 | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:57 | | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | windows.cpp:553:10:553:23 | access to array | provenance | | -| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:55 | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:58 | | windows.cpp:559:5:559:24 | ... = ... | windows.cpp:561:39:561:44 | *buffer | provenance | | | windows.cpp:559:17:559:24 | call to source | windows.cpp:559:5:559:24 | ... = ... | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:562:10:562:19 | *src_string [*Buffer] | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:563:40:563:50 | *& ... [*Buffer] | provenance | | -| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:58 | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:61 | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:21:562:26 | *Buffer | provenance | | | windows.cpp:562:21:562:26 | *Buffer | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | provenance | | -| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:56 | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:59 | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:22:564:27 | *Buffer | provenance | | | windows.cpp:564:22:564:27 | *Buffer | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | windows.cpp:569:10:569:23 | access to array | provenance | | -| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:59 | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:62 | | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | windows.cpp:574:10:574:23 | access to array | provenance | | -| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:60 | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:63 | | windows.cpp:645:45:645:50 | WinHttpReadData output argument | windows.cpp:647:10:647:16 | * ... | provenance | Src:MaD:33 | | windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | windows.cpp:654:10:654:16 | * ... | provenance | Src:MaD:34 | | windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | windows.cpp:661:10:661:16 | * ... | provenance | Src:MaD:29 | @@ -334,7 +360,7 @@ edges | windows.cpp:669:105:669:112 | WinHttpQueryHeadersEx output argument | windows.cpp:675:10:675:27 | * ... | provenance | Src:MaD:30 | | windows.cpp:728:5:728:28 | ... = ... | windows.cpp:729:35:729:35 | *x | provenance | | | windows.cpp:728:12:728:28 | call to source | windows.cpp:728:5:728:28 | ... = ... | provenance | | -| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:64 | +| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:67 | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:731:10:731:36 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:733:10:733:35 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:735:10:735:37 | * ... | provenance | | @@ -369,49 +395,49 @@ edges | windows.cpp:1087:71:1087:74 | RegEnumValueW output argument | windows.cpp:1089:10:1089:14 | * ... | provenance | Src:MaD:20 | | windows.cpp:1122:5:1122:27 | ... = ... | windows.cpp:1124:19:1124:21 | *str | provenance | | | windows.cpp:1122:14:1122:27 | call to source | windows.cpp:1122:5:1122:27 | ... = ... | provenance | | -| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:50 | +| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:53 | | windows.cpp:1124:24:1124:27 | IIDFromString output argument | windows.cpp:1125:10:1125:12 | iid | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1128:15:1128:20 | call to source | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1130:19:1130:21 | *iid | provenance | | -| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:63 | +| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:66 | | windows.cpp:1130:24:1130:27 | StringFromIID output argument | windows.cpp:1132:10:1132:13 | * ... | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1135:19:1135:24 | call to source | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1137:21:1137:25 | *clsid | provenance | | -| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:51 | +| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:54 | | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | windows.cpp:1139:10:1139:13 | * ... | provenance | | | windows.cpp:1143:5:1143:30 | ... = ... | windows.cpp:1145:21:1145:26 | *progID | provenance | | | windows.cpp:1143:17:1143:30 | call to source | windows.cpp:1143:5:1143:30 | ... = ... | provenance | | -| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:43 | +| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:46 | | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | windows.cpp:1146:10:1146:14 | clsid | provenance | | | windows.cpp:1150:5:1150:27 | ... = ... | windows.cpp:1152:21:1152:23 | *str | provenance | | | windows.cpp:1150:14:1150:27 | call to source | windows.cpp:1150:5:1150:27 | ... = ... | provenance | | -| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:44 | +| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:47 | | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | windows.cpp:1153:10:1153:14 | clsid | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1156:19:1156:24 | call to source | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1158:21:1158:25 | *clsid | provenance | | -| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:61 | +| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:64 | | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | windows.cpp:1160:10:1160:13 | * ... | provenance | | | windows.cpp:1164:5:1164:27 | ... = ... | windows.cpp:1166:20:1166:22 | *str | provenance | | | windows.cpp:1164:14:1164:27 | call to source | windows.cpp:1164:5:1164:27 | ... = ... | provenance | | -| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:49 | +| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:52 | | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | windows.cpp:1167:10:1167:13 | guid | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1170:17:1170:22 | call to source | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1172:21:1172:24 | *guid | provenance | | -| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:62 | +| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:65 | | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | windows.cpp:1174:10:1174:13 | * ... | provenance | | nodes | asio_streams.cpp:87:34:87:44 | read_until output argument | semmle.label | read_until output argument | | asio_streams.cpp:91:7:91:17 | recv_buffer | semmle.label | recv_buffer | -| asio_streams.cpp:93:29:93:39 | *recv_buffer | semmle.label | *recv_buffer | +| asio_streams.cpp:93:29:93:39 | recv_buffer | semmle.label | recv_buffer | | asio_streams.cpp:97:37:97:44 | call to source | semmle.label | call to source | | asio_streams.cpp:98:7:98:14 | send_str | semmle.label | send_str | | asio_streams.cpp:100:44:100:62 | call to buffer | semmle.label | call to buffer | | asio_streams.cpp:100:44:100:62 | call to buffer | semmle.label | call to buffer | | asio_streams.cpp:100:64:100:71 | *send_str | semmle.label | *send_str | | asio_streams.cpp:101:7:101:17 | send_buffer | semmle.label | send_buffer | -| asio_streams.cpp:103:29:103:39 | *send_buffer | semmle.label | *send_buffer | -| azure.cpp:253:48:253:60 | *call to GetBodyStream | semmle.label | *call to GetBodyStream | +| asio_streams.cpp:103:29:103:39 | send_buffer | semmle.label | send_buffer | | azure.cpp:253:48:253:60 | *call to GetBodyStream | semmle.label | *call to GetBodyStream | +| azure.cpp:253:48:253:60 | call to GetBodyStream | semmle.label | call to GetBodyStream | | azure.cpp:257:5:257:8 | *resp | semmle.label | *resp | | azure.cpp:257:16:257:21 | Read output argument | semmle.label | Read output argument | | azure.cpp:258:10:258:16 | * ... | semmle.label | * ... | @@ -423,25 +449,25 @@ nodes | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | semmle.label | call to ReadToEnd [element] | | azure.cpp:267:10:267:12 | vec | semmle.label | vec | | azure.cpp:267:10:267:12 | vec [element] | semmle.label | vec [element] | -| azure.cpp:273:62:273:64 | call to GetHeaders | semmle.label | call to GetHeaders | +| azure.cpp:273:52:273:61 | call to GetHeaders | semmle.label | call to GetHeaders | | azure.cpp:273:62:273:64 | call to GetHeaders | semmle.label | call to GetHeaders | | azure.cpp:274:10:274:29 | call to operator[] | semmle.label | call to operator[] | | azure.cpp:274:14:274:29 | call to operator[] | semmle.label | call to operator[] | | azure.cpp:274:14:274:29 | call to operator[] | semmle.label | call to operator[] | | azure.cpp:274:14:274:29 | call to operator[] | semmle.label | call to operator[] | -| azure.cpp:277:45:277:47 | call to GetBody | semmle.label | call to GetBody | +| azure.cpp:277:38:277:44 | call to GetBody | semmle.label | call to GetBody | | azure.cpp:277:45:277:47 | call to GetBody | semmle.label | call to GetBody | | azure.cpp:278:10:278:13 | body | semmle.label | body | | azure.cpp:278:10:278:13 | body | semmle.label | body | | azure.cpp:278:10:278:13 | body | semmle.label | body | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | semmle.label | *call to ExtractBodyStream | -| azure.cpp:281:68:281:84 | *call to ExtractBodyStream | semmle.label | *call to ExtractBodyStream | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | semmle.label | call to ExtractBodyStream | | azure.cpp:282:10:282:38 | call to ReadToEnd | semmle.label | call to ReadToEnd | | azure.cpp:282:21:282:23 | *call to get | semmle.label | *call to get | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | semmle.label | call to ReadToEnd [element] | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | semmle.label | call to ReadToEnd [element] | | azure.cpp:289:24:289:56 | call to GetHeader | semmle.label | call to GetHeader | -| azure.cpp:289:32:289:40 | call to GetHeader | semmle.label | call to GetHeader | +| azure.cpp:289:32:289:40 | Value output argument | semmle.label | Value output argument | | azure.cpp:289:32:289:40 | call to GetHeader | semmle.label | call to GetHeader | | azure.cpp:289:63:289:65 | call to Value | semmle.label | call to Value | | azure.cpp:289:63:289:65 | call to Value | semmle.label | call to Value | @@ -480,6 +506,7 @@ nodes | test.cpp:47:12:47:19 | *arg [x] | semmle.label | *arg [x] | | test.cpp:48:13:48:13 | *s [x] | semmle.label | *s [x] | | test.cpp:48:16:48:16 | x | semmle.label | x | +| test.cpp:48:16:48:16 | x | semmle.label | x | | test.cpp:56:2:56:2 | *s [post update] [x] | semmle.label | *s [post update] [x] | | test.cpp:56:2:56:18 | ... = ... | semmle.label | ... = ... | | test.cpp:56:8:56:16 | call to ymlSource | semmle.label | call to ymlSource | @@ -556,20 +583,47 @@ nodes | test.cpp:218:11:218:11 | x | semmle.label | x | | test.cpp:222:3:222:3 | operator[] output argument | semmle.label | operator[] output argument | | test.cpp:222:3:222:20 | ... = ... | semmle.label | ... = ... | -| test.cpp:222:10:222:20 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:222:10:222:18 | call to ymlSource | semmle.label | call to ymlSource | | test.cpp:223:12:223:12 | *s | semmle.label | *s | | test.cpp:223:13:223:15 | call to operator[] | semmle.label | call to operator[] | | test.cpp:223:13:223:15 | call to operator[] | semmle.label | call to operator[] | | test.cpp:224:11:224:11 | c | semmle.label | c | +| test.cpp:243:10:243:10 | *s [value] | semmle.label | *s [value] | +| test.cpp:243:13:243:17 | value | semmle.label | value | +| test.cpp:243:13:243:17 | value | semmle.label | value | +| test.cpp:247:26:247:39 | call to ymlFieldSource | semmle.label | call to ymlFieldSource | +| test.cpp:247:26:247:39 | call to ymlFieldSource [value] | semmle.label | call to ymlFieldSource [value] | +| test.cpp:248:10:248:16 | *wrapper [value] | semmle.label | *wrapper [value] | +| test.cpp:248:18:248:22 | value | semmle.label | value | +| test.cpp:248:18:248:22 | value | semmle.label | value | +| test.cpp:250:32:250:32 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | +| test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | +| test.cpp:253:32:255:2 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | +| test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:254:11:254:11 | *s [value] | semmle.label | *s [value] | +| test.cpp:254:14:254:18 | value | semmle.label | value | +| test.cpp:254:14:254:18 | value | semmle.label | value | +| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | +| test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | +| test.cpp:258:11:258:11 | *s [value] | semmle.label | *s [value] | +| test.cpp:258:14:258:18 | value | semmle.label | value | +| test.cpp:258:14:258:18 | value | semmle.label | value | +| test.cpp:263:12:263:12 | *s [value] | semmle.label | *s [value] | +| test.cpp:263:15:263:19 | value | semmle.label | value | +| test.cpp:263:15:263:19 | value | semmle.label | value | +| test.cpp:267:32:267:34 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | +| test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | -| windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | +| windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | semmle.label | **call to CommandLineToArgvA | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | semmle.label | **call to CommandLineToArgvA | | windows.cpp:27:36:27:38 | *cmd | semmle.label | *cmd | | windows.cpp:30:8:30:15 | * ... | semmle.label | * ... | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | semmle.label | *call to GetEnvironmentStringsA | -| windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | semmle.label | *call to GetEnvironmentStringsA | +| windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | semmle.label | call to GetEnvironmentStringsA | | windows.cpp:36:10:36:13 | * ... | semmle.label | * ... | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | semmle.label | GetEnvironmentVariableA output argument | | windows.cpp:41:10:41:13 | * ... | semmle.label | * ... | @@ -599,31 +653,31 @@ nodes | windows.cpp:209:84:209:89 | NtReadFile output argument | semmle.label | NtReadFile output argument | | windows.cpp:211:10:211:16 | * ... | semmle.label | * ... | | windows.cpp:286:23:286:35 | *call to MapViewOfFile | semmle.label | *call to MapViewOfFile | -| windows.cpp:286:23:286:35 | *call to MapViewOfFile | semmle.label | *call to MapViewOfFile | +| windows.cpp:286:23:286:35 | call to MapViewOfFile | semmle.label | call to MapViewOfFile | | windows.cpp:287:20:287:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:289:10:289:16 | * ... | semmle.label | * ... | | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | semmle.label | *call to MapViewOfFile2 | -| windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | semmle.label | *call to MapViewOfFile2 | +| windows.cpp:293:23:293:36 | call to MapViewOfFile2 | semmle.label | call to MapViewOfFile2 | | windows.cpp:294:20:294:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:296:10:296:16 | * ... | semmle.label | * ... | | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | semmle.label | *call to MapViewOfFile3 | -| windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | semmle.label | *call to MapViewOfFile3 | +| windows.cpp:302:23:302:36 | call to MapViewOfFile3 | semmle.label | call to MapViewOfFile3 | | windows.cpp:303:20:303:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:305:10:305:16 | * ... | semmle.label | * ... | | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | semmle.label | *call to MapViewOfFile3FromApp | -| windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | semmle.label | *call to MapViewOfFile3FromApp | +| windows.cpp:311:23:311:43 | call to MapViewOfFile3FromApp | semmle.label | call to MapViewOfFile3FromApp | | windows.cpp:312:20:312:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:314:10:314:16 | * ... | semmle.label | * ... | | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | semmle.label | *call to MapViewOfFileEx | -| windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | semmle.label | *call to MapViewOfFileEx | +| windows.cpp:318:23:318:37 | call to MapViewOfFileEx | semmle.label | call to MapViewOfFileEx | | windows.cpp:319:20:319:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:321:10:321:16 | * ... | semmle.label | * ... | | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | semmle.label | *call to MapViewOfFileFromApp | -| windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | semmle.label | *call to MapViewOfFileFromApp | +| windows.cpp:325:23:325:42 | call to MapViewOfFileFromApp | semmle.label | call to MapViewOfFileFromApp | | windows.cpp:326:20:326:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:328:10:328:16 | * ... | semmle.label | * ... | | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | semmle.label | *call to MapViewOfFileNuma2 | -| windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | semmle.label | *call to MapViewOfFileNuma2 | +| windows.cpp:332:23:332:40 | call to MapViewOfFileNuma2 | semmle.label | call to MapViewOfFileNuma2 | | windows.cpp:333:20:333:52 | *pMapView | semmle.label | *pMapView | | windows.cpp:335:10:335:16 | * ... | semmle.label | * ... | | windows.cpp:403:26:403:36 | *lpParameter [x] | semmle.label | *lpParameter [x] | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 858f12bdd69e..32f130cd165d 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -1,5 +1,5 @@ -| asio_streams.cpp:93:29:93:39 | *recv_buffer | remote-sink | -| asio_streams.cpp:103:29:103:39 | *send_buffer | remote-sink | +| asio_streams.cpp:93:29:93:39 | recv_buffer | remote-sink | +| asio_streams.cpp:103:29:103:39 | send_buffer | remote-sink | | test.cpp:12:10:12:10 | 0 | test-sink | | test.cpp:14:10:14:10 | x | test-sink | | test.cpp:18:10:18:10 | y | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 3556bd9d51dd..9dfb62bdafde 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -1,9 +1,9 @@ | asio_streams.cpp:87:34:87:44 | read_until output argument | remote | -| azure.cpp:253:48:253:60 | *call to GetBodyStream | remote | -| azure.cpp:273:62:273:64 | call to GetHeaders | remote | -| azure.cpp:277:45:277:47 | call to GetBody | remote | -| azure.cpp:281:68:281:84 | *call to ExtractBodyStream | remote | -| azure.cpp:289:32:289:40 | call to GetHeader | remote | +| azure.cpp:253:48:253:60 | call to GetBodyStream | remote | +| azure.cpp:273:52:273:61 | call to GetHeaders | remote | +| azure.cpp:277:38:277:44 | call to GetBody | remote | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | remote | +| azure.cpp:289:32:289:40 | Value output argument | remote | | azure.cpp:293:58:293:67 | call to GetHeaders | remote | | test.cpp:10:10:10:18 | call to ymlSource | local | | test.cpp:56:8:56:16 | call to ymlSource | local | @@ -16,9 +16,9 @@ | test.cpp:186:14:186:22 | call to ymlSource | local | | test.cpp:199:14:199:22 | call to ymlSource | local | | test.cpp:216:18:216:26 | call to ymlSource | local | -| test.cpp:222:10:222:20 | call to ymlSource | local | -| windows.cpp:22:15:22:29 | *call to GetCommandLineA | local | -| windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | local | +| test.cpp:222:10:222:18 | call to ymlSource | local | +| windows.cpp:22:15:22:29 | call to GetCommandLineA | local | +| windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | | windows.cpp:168:35:168:40 | ReadFile output argument | local | | windows.cpp:177:23:177:28 | ReadFileEx output argument | local | @@ -27,13 +27,13 @@ | windows.cpp:198:21:198:26 | ReadFile output argument | local | | windows.cpp:201:23:201:29 | ReadFileEx output argument | local | | windows.cpp:209:84:209:89 | NtReadFile output argument | local | -| windows.cpp:286:23:286:35 | *call to MapViewOfFile | local | -| windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | local | -| windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | local | -| windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | local | -| windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | local | -| windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | local | -| windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | local | +| windows.cpp:286:23:286:35 | call to MapViewOfFile | local | +| windows.cpp:293:23:293:36 | call to MapViewOfFile2 | local | +| windows.cpp:302:23:302:36 | call to MapViewOfFile3 | local | +| windows.cpp:311:23:311:43 | call to MapViewOfFile3FromApp | local | +| windows.cpp:318:23:318:37 | call to MapViewOfFileEx | local | +| windows.cpp:325:23:325:42 | call to MapViewOfFileFromApp | local | +| windows.cpp:332:23:332:40 | call to MapViewOfFileNuma2 | local | | windows.cpp:645:45:645:50 | WinHttpReadData output argument | remote | | windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | remote | | windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | remote | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 44138fd16e79..bfdf213fc3c1 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -240,27 +240,27 @@ using Callback = void(*)(const SourceWrapper*); void source_from_callback_ptr(Callback); void f(const SourceWrapper* s) { - ymlSink(s->value); // $ MISSING: ir=250:32 ir=251:27 + ymlSink(s->value); // $ ir=250:32 ir=251:27 } void test_source_access_path() { SourceWrapper wrapper = ymlFieldSource(); - ymlSink(wrapper.value); // $ MISSING: ir + ymlSink(wrapper.value); // $ ir source_from_callback_template(f); source_from_callback_ptr(f); source_from_callback_template([](const SourceWrapper* s) { - ymlSink(s->value); // $ MISSING: ir + ymlSink(s->value); // $ ir }); source_from_callback_ptr([](const SourceWrapper* s) { - ymlSink(s->value); // $ MISSING: ir + ymlSink(s->value); // $ ir }); struct S { void operator()(const SourceWrapper* s) { - ymlSink(s->value); // $ MISSING: ir + ymlSink(s->value); // $ ir } }; diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected index 7d1e2bc9327a..8492e0c9ddec 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected @@ -18,6 +18,10 @@ postIsInSameCallable reverseRead argHasPostUpdate postWithInFlow +| tests.cpp:60:30:60:31 | remoteMadSourceIndirectArg0 output argument | PostUpdateNode should not be the target of local flow. | +| tests.cpp:63:33:63:33 | remoteMadSourceIndirectArg1 output argument | PostUpdateNode should not be the target of local flow. | +| tests.cpp:295:39:295:40 | memberRemoteMadSourceIndirectArg0 output argument | PostUpdateNode should not be the target of local flow. | +| tests.cpp:369:2:369:4 | qualifierSource output argument | PostUpdateNode should not be the target of local flow. | viableImplInCallContextTooLarge uniqueParameterNodeAtPosition uniqueParameterNodePosition @@ -283,6 +287,42 @@ sourceCallables | tests.cpp:433:6:433:10 | array | | tests.cpp:434:6:434:6 | y | flowSummaryNode +| tests.cpp:36:7:36:20 | sink output argument | | | test_sources | +| tests.cpp:37:7:37:21 | sink output argument | | | test_sources | +| tests.cpp:39:7:39:24 | sink output argument | | | test_sources | +| tests.cpp:40:7:40:27 | sink output argument | | | test_sources | +| tests.cpp:45:10:45:23 | call to localMadSource | | | test_sources | +| tests.cpp:53:7:53:29 | sink output argument | | | test_sources | +| tests.cpp:54:8:54:30 | call to remoteMadSourceIndirect | | | test_sources | +| tests.cpp:55:8:55:36 | call to remoteMadSourceDoubleIndirect | | | test_sources | +| tests.cpp:56:9:56:37 | call to remoteMadSourceDoubleIndirect | | | test_sources | +| tests.cpp:60:30:60:31 | remoteMadSourceIndirectArg0 output argument | | | test_sources | +| tests.cpp:63:33:63:33 | remoteMadSourceIndirectArg1 output argument | | | test_sources | +| tests.cpp:67:10:67:23 | call to localMadSource | | | test_sources | +| tests.cpp:70:7:70:57 | sink output argument | | | test_sources | +| tests.cpp:75:32:75:32 | x | | | remoteMadSourceParam0 | +| tests.cpp:95:14:95:19 | call to source | | | test_sinks | +| tests.cpp:97:24:97:24 | 0 | | | test_sinks | +| tests.cpp:98:17:98:22 | call to source | | | test_sinks | +| tests.cpp:99:15:99:20 | call to source | | | test_sinks | +| tests.cpp:99:25:99:25 | 0 | | | test_sinks | +| tests.cpp:100:15:100:15 | 0 | | | test_sinks | +| tests.cpp:100:18:100:23 | call to source | | | test_sinks | +| tests.cpp:101:15:101:15 | 0 | | | test_sinks | +| tests.cpp:101:18:101:18 | 0 | | | test_sinks | +| tests.cpp:102:15:102:20 | call to source | | | test_sinks | +| tests.cpp:102:28:102:28 | 0 | | | test_sinks | +| tests.cpp:103:15:103:15 | 0 | | | test_sinks | +| tests.cpp:103:28:103:28 | 0 | | | test_sinks | +| tests.cpp:104:15:104:15 | 0 | | | test_sinks | +| tests.cpp:104:21:104:26 | call to source | | | test_sinks | +| tests.cpp:108:22:108:23 | & ... | | | test_sinks | +| tests.cpp:109:22:109:26 | a_ptr | | | test_sinks | +| tests.cpp:110:28:110:33 | & ... | | | test_sinks | +| tests.cpp:111:14:111:27 | call to localMadSource | | | test_sinks | +| tests.cpp:111:14:111:27 | madSinkArg0 output argument | | | test_sinks | +| tests.cpp:112:22:112:44 | call to remoteMadSourceIndirect | | | test_sinks | +| tests.cpp:112:22:112:44 | madSinkIndirectArg0 output argument | | | test_sinks | | tests.cpp:127:5:127:19 | [summary param] 0 in madArg0ToReturn | ParameterNode | madArg0ToReturn | madArg0ToReturn | | tests.cpp:127:5:127:19 | [summary] to write: ReturnValue in madArg0ToReturn | ReturnNode | madArg0ToReturn | madArg0ToReturn | | tests.cpp:128:6:128:28 | [summary param] 0 in madArg0ToReturnIndirect | ParameterNode | madArg0ToReturnIndirect | madArg0ToReturnIndirect | @@ -325,6 +365,12 @@ flowSummaryNode | tests.cpp:148:13:148:40 | [summary param] 0 in madArg0ToReturnFieldIndirect | ParameterNode | madArg0ToReturnFieldIndirect | madArg0ToReturnFieldIndirect | | tests.cpp:148:13:148:40 | [summary] to write: ReturnValue in madArg0ToReturnFieldIndirect | ReturnNode | madArg0ToReturnFieldIndirect | madArg0ToReturnFieldIndirect | | tests.cpp:148:13:148:40 | [summary] to write: ReturnValue.Field[*MyContainer::ptr]/Field[*ptr] in madArg0ToReturnFieldIndirect | | madArg0ToReturnFieldIndirect | madArg0ToReturnFieldIndirect | +| tests.cpp:225:14:225:28 | call to madArg0ToReturn | | | test_summaries | +| tests.cpp:225:30:225:44 | madArg0ToReturn output argument | | | test_summaries | +| tests.cpp:226:14:226:37 | call to madArg0ToReturnValueFlow | | | test_summaries | +| tests.cpp:226:39:226:53 | madArg0ToReturnValueFlow output argument | | | test_summaries | +| tests.cpp:227:14:227:36 | call to madArg0IndirectToReturn | | | test_summaries | +| tests.cpp:228:14:228:36 | call to madArg0IndirectToReturn | | | test_summaries | | tests.cpp:250:7:250:19 | [summary param] 0 in madArg0ToSelf | ParameterNode | madArg0ToSelf | madArg0ToSelf | | tests.cpp:250:7:250:19 | [summary param] this in madArg0ToSelf | ParameterNode | madArg0ToSelf | madArg0ToSelf | | tests.cpp:250:7:250:19 | [summary] to write: Argument[this] in madArg0ToSelf | PostUpdateNode | madArg0ToSelf | madArg0ToSelf | @@ -339,6 +385,27 @@ flowSummaryNode | tests.cpp:254:6:254:21 | [summary] to write: ReturnValue in madFieldToReturn | ReturnNode | madFieldToReturn | madFieldToReturn | | tests.cpp:277:7:277:30 | [summary param] this in namespaceMadSelfToReturn | ParameterNode | namespaceMadSelfToReturn | namespaceMadSelfToReturn | | tests.cpp:277:7:277:30 | [summary] to write: ReturnValue in namespaceMadSelfToReturn | ReturnNode | namespaceMadSelfToReturn | namespaceMadSelfToReturn | +| tests.cpp:292:10:292:30 | sink output argument | | | test_class_members | +| tests.cpp:295:39:295:40 | memberRemoteMadSourceIndirectArg0 output argument | | | test_class_members | +| tests.cpp:300:11:300:31 | sink output argument | | | test_class_members | +| tests.cpp:301:11:301:33 | sink output argument | | | test_class_members | +| tests.cpp:303:11:303:33 | sink output argument | | | test_class_members | +| tests.cpp:307:23:307:28 | call to source | | | test_class_members | +| tests.cpp:309:33:309:38 | call to source | | | test_class_members | +| tests.cpp:310:57:310:62 | call to source | | | test_class_members | +| tests.cpp:351:26:351:46 | call to memberRemoteMadSource | | | test_class_members | +| tests.cpp:351:26:351:46 | memberMadSinkArg0 output argument | | | test_class_members | +| tests.cpp:362:2:362:4 | mc8 | | | test_class_members | +| tests.cpp:362:24:362:24 | 0 | | | test_class_members | +| tests.cpp:363:2:363:4 | mc8 | | | test_class_members | +| tests.cpp:363:24:363:29 | call to source | | | test_class_members | +| tests.cpp:366:2:366:4 | mc9 | | | test_class_members | +| tests.cpp:367:2:367:4 | mc9 | | | test_class_members | +| tests.cpp:367:24:367:24 | 0 | | | test_class_members | +| tests.cpp:369:2:369:4 | qualifierSource output argument | | | test_class_members | +| tests.cpp:371:2:371:4 | mc8 | | | test_class_members | +| tests.cpp:372:2:372:4 | mc9 | | | test_class_members | +| tests.cpp:372:24:372:24 | 0 | | | test_class_members | | tests.cpp:392:5:392:29 | [summary param] 0 in madCallArg0ReturnToReturn | ParameterNode | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn | | tests.cpp:392:5:392:29 | [summary] read: Argument[0].Parameter[this pointer] in madCallArg0ReturnToReturn | PostUpdateNode | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn | | tests.cpp:392:5:392:29 | [summary] read: Argument[0].ReturnValue in madCallArg0ReturnToReturn | OutNode | madCallArg0ReturnToReturn | madCallArg0ReturnToReturn | From b89e4f124781f1e69a423f6f83de69b823cccff3 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 18 Aug 2026 16:36:14 +0100 Subject: [PATCH 027/181] C++: Hide flow summary nodes from consistency just like Rust does. --- .../cpp/ir/dataflow/internal/DataFlowImplConsistency.qll | 8 ++++++++ .../dataflow/models-as-data/testModels.expected | 4 ---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll index 6b0de326d114..3b900320882b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplConsistency.qll @@ -6,6 +6,8 @@ private import cpp private import DataFlowImplSpecific private import TaintTrackingImplSpecific +private import DataFlowNodes as Nodes +private import semmle.code.cpp.dataflow.internal.FlowSummaryImpl as FlowSummaryImpl private import codeql.dataflow.internal.DataFlowImplConsistency private module Input implements InputSig { @@ -14,6 +16,12 @@ private module Input implements InputSig { // complex to model here. any() } + + predicate postWithInFlowExclude(CppDataFlow::Node n) { + n instanceof Nodes::FlowSummaryNode + or + FlowSummaryImpl::Private::Steps::summaryLocalStep(_, n, _, _) + } } module Consistency = MakeConsistency; diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected index 8492e0c9ddec..899b9bf80353 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected @@ -18,10 +18,6 @@ postIsInSameCallable reverseRead argHasPostUpdate postWithInFlow -| tests.cpp:60:30:60:31 | remoteMadSourceIndirectArg0 output argument | PostUpdateNode should not be the target of local flow. | -| tests.cpp:63:33:63:33 | remoteMadSourceIndirectArg1 output argument | PostUpdateNode should not be the target of local flow. | -| tests.cpp:295:39:295:40 | memberRemoteMadSourceIndirectArg0 output argument | PostUpdateNode should not be the target of local flow. | -| tests.cpp:369:2:369:4 | qualifierSource output argument | PostUpdateNode should not be the target of local flow. | viableImplInCallContextTooLarge uniqueParameterNodeAtPosition uniqueParameterNodePosition From a1f2b815669d92bcde42d6dc77c96d23f33d7ad5 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Wed, 19 Aug 2026 15:30:47 +0200 Subject: [PATCH 028/181] C#: add OData action-parameter taint modeling Adds semmle.code.csharp.frameworks.OData, following the WCF.qll/JsonNET.qll convention: values cast, as-converted, or type-tested out of an untyped ODataActionParameters dictionary, and entities tracked by Delta (via GetInstance/Patch/Put/CopyChangedValues/CopyUnchangedValues), have no static type relationship to the action method's own parameter types, so their members aren't picked up by the existing AspNetRemoteFlowSourceMember modeling. This adds a TaintedMember for those bound types (with the same nested-type/collection recursion as AspNetRemoteFlowSourceMember), plus two AdditionalTaintStep steps for the Delta method calls, which don't fit the member-read shape TaintedMember covers. Co-Authored-By: Claude Sonnet 5 --- .../2026-08-19-odata-taint-step.md | 4 + .../internal/TaintTrackingPrivate.qll | 1 + .../semmle/code/csharp/frameworks/OData.qll | 161 ++++++++++++++++++ .../library-tests/frameworks/OData/OData.cs | 125 ++++++++++++++ .../frameworks/OData/OData.expected | 9 + .../library-tests/frameworks/OData/OData.ql | 21 +++ 6 files changed, 321 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md create mode 100644 csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll create mode 100644 csharp/ql/test/library-tests/frameworks/OData/OData.cs create mode 100644 csharp/ql/test/library-tests/frameworks/OData/OData.expected create mode 100644 csharp/ql/test/library-tests/frameworks/OData/OData.ql diff --git a/csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md b/csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md new file mode 100644 index 000000000000..3d0a6cbeb8ae --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-08-19-odata-taint-step.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* Added taint modeling for OData action parameter binding (`Microsoft.AspNet.OData`/`Microsoft.AspNetCore.OData`). Values cast, `as`-converted, or type-tested out of `ODataActionParameters`, and entities tracked by `Delta` (via `GetInstance`, `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues`), now taint the members of the target type. diff --git a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll index 238ecab13461..418573cae8cc 100644 --- a/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll +++ b/csharp/ql/lib/semmle/code/csharp/dataflow/internal/TaintTrackingPrivate.qll @@ -9,6 +9,7 @@ private import semmle.code.csharp.dispatch.Dispatch private import semmle.code.csharp.commons.ComparisonTest // import `TaintedMember` definitions from other files to avoid potential reevaluation private import semmle.code.csharp.frameworks.JsonNET +private import semmle.code.csharp.frameworks.OData private import semmle.code.csharp.frameworks.WCF private import semmle.code.csharp.security.dataflow.flowsources.Remote diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll new file mode 100644 index 000000000000..899f1cbd036a --- /dev/null +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -0,0 +1,161 @@ +/** + * Provides taint modeling for `Microsoft.AspNet.OData`/`Microsoft.AspNetCore.OData` + * (and the older `System.Web.Http.OData`) OData action parameter binding. + * + * OData actions receive their untrusted payload in one of two shapes that + * bypass the usual "type used as an action-method parameter" taint modeling: + * + * - `ODataActionParameters`, an untyped `Dictionary` whose + * values are cast, `as`-converted, or type-tested to arbitrary model types + * by the action method body. + * - `Delta`, a change-tracking wrapper for PATCH/PUT requests, whose + * tracked property values are exposed via `GetInstance()` or copied onto an + * existing entity via `Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues`. + * + * In both cases the type that ends up holding the client-controlled data has + * no static relationship to the action method's parameter types, so its + * members need to be taint-tracked explicitly. + */ + +private import csharp +private import semmle.code.csharp.commons.Collections +private import semmle.code.csharp.dataflow.FlowSteps +private import semmle.code.csharp.dataflow.TaintTracking +private import semmle.code.csharp.dataflow.internal.DataFlowPrivate + +/** The `ODataActionParameters` dictionary type, across OData library versions. */ +private class ODataActionParametersClass extends Class { + ODataActionParametersClass() { + this.hasFullyQualifiedName("Microsoft.AspNet.OData", "ODataActionParameters") or + this.hasFullyQualifiedName("Microsoft.AspNetCore.OData.Formatter", "ODataActionParameters") or + this.hasFullyQualifiedName("System.Web.Http.OData", "ODataActionParameters") + } +} + +/** An indexer read on an `ODataActionParameters` dictionary, e.g. `parameters["CabFile"]`. */ +private class ODataActionParameterRead extends ElementAccess { + ODataActionParameterRead() { this.getQualifier().getType() instanceof ODataActionParametersClass } +} + +/** Holds if `e` may (locally) hold the value of an `ODataActionParameters` entry. */ +private predicate isODataParameterValue(Expr e) { + TaintTracking::localExprTaint(any(ODataActionParameterRead r), e) +} + +/** The generic `Delta` change-tracking class, across OData library versions. */ +private class DeltaClass extends UnboundGenericClass { + DeltaClass() { + this.getNumberOfTypeParameters() = 1 and + ( + this.hasFullyQualifiedName("Microsoft.AspNet.OData", "Delta`1") or + this.hasFullyQualifiedName("Microsoft.AspNetCore.OData.Deltas", "Delta`1") + ) + } +} + +/** + * A type that a value read out of `ODataActionParameters` is cast, `as`-converted, + * or type-tested to -- directly, or wrapped in a collection (`List`, + * `IEnumerable`, arrays, ...) -- or a type that is tracked by a `Delta`. + */ +private class ODataBoundType extends ValueOrRefType { + ODataBoundType() { + exists(Cast c | isODataParameterValue(c.getExpr()) | + this = c.getTargetType() or + this = c.getTargetType().(CollectionType).getElementType() or + this = c.getTargetType().(ParamsCollectionType).getElementType() + ) + or + exists(IsExpr ie, Type t | + isODataParameterValue(ie.getExpr()) and + t = ie.getPattern().(TypePatternExpr).getCheckedType() + | + this = t or + this = t.(CollectionType).getElementType() or + this = t.(ParamsCollectionType).getElementType() + ) + or + this = any(ConstructedClass c | c.getUnboundGeneric() instanceof DeltaClass).getTypeArgument(0) + } +} + +private class CandidateODataMember extends Member { + CandidateODataMember() { + this.isPublic() and + not this.isStatic() and + ( + this = + any(Property p | + p.isAutoImplemented() and + p.getGetter().isPublic() and + p.getSetter().isPublic() + ) + or + this = any(Field f | f.isPublic()) + ) + } +} + +/** + * Taint members (transitively) on types used in + * 1. Casts, `as`-conversions, or type tests applied to `ODataActionParameters` values. + * 2. The type argument of a `Delta`. + * + * Note that this also impacts uses of such types in other contexts, the same + * trade-off `AspNetRemoteFlowSourceMember` (`Remote.qll`) makes for ASP.NET + * action-method parameters. + */ +private class ODataBoundMember extends TaintTracking::TaintedMember, CandidateODataMember { + ODataBoundMember() { + exists(Type t, Type t0 | t = this.getDeclaringType() | + (t = t0 or t = t0.(CollectionType).getElementType()) and + ( + t0 = any(ODataBoundMember m).getType() + or + t0 instanceof ODataBoundType + ) + ) + } +} + +/** The `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues` methods on `Delta`. */ +private class DeltaMutatingMethod extends Method { + DeltaMutatingMethod() { + this.getDeclaringType() instanceof DeltaClass and + this.hasName(["Patch", "Put", "CopyChangedValues", "CopyUnchangedValues"]) + } +} + +/** + * A call to `Delta.Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues` + * copies the changes tracked by the `Delta` receiver onto its `original` + * entity argument. + */ +private class DeltaMutatingCallTaintStep extends AdditionalTaintStep { + override predicate step(DataFlow::Node node1, DataFlow::Node node2) { + exists(MethodCall mc | + mc.getTarget().getUnboundDeclaration() instanceof DeltaMutatingMethod and + node1.asExpr() = mc.getQualifier() and + node2.(PostUpdateNode).getPreUpdateNode().asExpr() = mc.getArgument(0) + ) + } +} + +/** The `GetInstance` method on `Delta`. */ +private class DeltaGetInstanceMethod extends Method { + DeltaGetInstanceMethod() { + this.getDeclaringType() instanceof DeltaClass and + this.hasName("GetInstance") + } +} + +/** `Delta.GetInstance()` returns the tracked entity, carrying the same taint as the `Delta` itself. */ +private class DeltaGetInstanceTaintStep extends AdditionalTaintStep { + override predicate step(DataFlow::Node node1, DataFlow::Node node2) { + exists(MethodCall mc | + mc.getTarget().getUnboundDeclaration() instanceof DeltaGetInstanceMethod and + node1.asExpr() = mc.getQualifier() and + node2.asExpr() = mc + ) + } +} diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs new file mode 100644 index 000000000000..ade9366f64d0 --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -0,0 +1,125 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.OData +{ + public class ODataActionParameters : Dictionary + { + } + + public class Delta where TStructuralType : class + { + private TStructuralType instance; + + public Delta() { instance = default(TStructuralType); } + + public TStructuralType GetInstance() => instance; + + public void Patch(TStructuralType original) { } + + public void Put(TStructuralType original) { } + + public void CopyChangedValues(TStructuralType original) { } + + public void CopyUnchangedValues(TStructuralType original) { } + } +} + +namespace Test +{ + using Microsoft.AspNet.OData; + using System.Collections.Generic; + + public class FileMetadata + { + public string Author { get; set; } + } + + public class UploadedFile + { + public string FileName { get; set; } + + public string FileContent { get; set; } + + public FileMetadata Metadata { get; set; } + + public List History { get; set; } + } + + public class SubscriptionRelation + { + public string EventName { get; set; } + + public string EventType { get; set; } + } + + public class Widget + { + public string Name { get; set; } + } + + public class UnrelatedType + { + // Never reached via an ODataActionParameters/Delta cast, so this + // member must stay untainted even though `UnrelatedType` itself is + // used elsewhere in the file. + public string Name { get; set; } + } + + public class OrderController + { + void Sink(object o) { } + + void CastFromDictionary(ODataActionParameters parameters) + { + var file = (UploadedFile)parameters["CabFile"]; + Sink(file); + Sink(file.FileName); + Sink(file.FileContent); + Sink(file.Metadata.Author); + foreach (var m in file.History) + { + Sink(m.Author); + } + } + + void IsAsFromDictionary(ODataActionParameters parameters) + { + if (parameters["NewEvents"] is IEnumerable relations1) + { + foreach (var item in relations1) + { + Sink(item.EventName); + } + } + + var relations2 = parameters["NewEvents"] as IEnumerable; + foreach (var item in relations2) + { + Sink(item.EventType); + } + } + + void DeltaPatch(Delta delta, Widget original) + { + delta.Patch(original); + Sink(original.Name); + } + + void DeltaGetInstance(Delta delta) + { + var w = delta.GetInstance(); + Sink(w.Name); + } + + void Untainted() + { + var w = new Widget(); + w.Name = "safe"; + Sink(w.Name); + + var u = new UnrelatedType(); + u.Name = "also safe"; + Sink(u.Name); + } + } +} diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected new file mode 100644 index 000000000000..dbaffab69b1d --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -0,0 +1,9 @@ +| OData.cs:72:55:72:64 | parameters | OData.cs:75:18:75:21 | access to local variable file | +| OData.cs:72:55:72:64 | parameters | OData.cs:76:18:76:30 | access to property FileName | +| OData.cs:72:55:72:64 | parameters | OData.cs:77:18:77:33 | access to property FileContent | +| OData.cs:72:55:72:64 | parameters | OData.cs:78:18:78:37 | access to property Author | +| OData.cs:72:55:72:64 | parameters | OData.cs:81:22:81:29 | access to property Author | +| OData.cs:85:55:85:64 | parameters | OData.cs:91:26:91:39 | access to property EventName | +| OData.cs:85:55:85:64 | parameters | OData.cs:98:22:98:35 | access to property EventType | +| OData.cs:102:39:102:43 | delta | OData.cs:105:18:105:30 | access to property Name | +| OData.cs:108:45:108:49 | delta | OData.cs:111:18:111:23 | access to property Name | diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.ql b/csharp/ql/test/library-tests/frameworks/OData/OData.ql new file mode 100644 index 000000000000..80d0f1d04dec --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.ql @@ -0,0 +1,21 @@ +import csharp + +module TaintConfig implements DataFlow::ConfigSig { + predicate isSource(DataFlow::Node n) { + exists(Parameter p | p = n.asParameter() | + p.getType().hasFullyQualifiedName("Microsoft.AspNet.OData", "ODataActionParameters") + or + p.getType().getUnboundDeclaration().hasFullyQualifiedName("Microsoft.AspNet.OData", "Delta`1") + ) + } + + predicate isSink(DataFlow::Node sink) { + exists(MethodCall c | c.getArgument(0) = sink.asExpr() and c.getTarget().hasName("Sink")) + } +} + +module Taint = TaintTracking::Global; + +from DataFlow::Node source, DataFlow::Node sink +where Taint::flow(source, sink) +select source, sink From 08724a877b2bb1c4335eace3f47fca742b44a1c6 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 19 Aug 2026 14:33:42 +0100 Subject: [PATCH 029/181] Rust: Remove the colocated nodes metric. Not proven useful. --- rust/ql/src/queries/summary/Stats.qll | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/rust/ql/src/queries/summary/Stats.qll b/rust/ql/src/queries/summary/Stats.qll index 5e0169254486..a9c040e4b3c7 100644 --- a/rust/ql/src/queries/summary/Stats.qll +++ b/rust/ql/src/queries/summary/Stats.qll @@ -104,17 +104,6 @@ int getTaintEdgesCount() { */ int getQuerySinksCount() { result = count(QuerySink s) } -/** - * Holds if there are at least 10 data flow nodes in the same location - * as `n`. - */ -private predicate isColocated10(DataFlow::Node n) { - exists(Location l | - l = n.getLocation() and - strictcount(DataFlow::Node other | other.getLocation() = l) >= 10 - ) -} - class CrateElement extends Element { CrateElement() { this instanceof Crate or @@ -220,9 +209,6 @@ predicate taintStats(string key, int value) { or key = "Taint reach - per million nodes" and value = getTaintReach().floor() or - key = "Taint nodes - highly colocated nodes" and - value = count(DataFlow::Node n | isColocated10(n)) - or key = "Taint sinks - query sinks" and value = getQuerySinksCount() or key = "Taint sinks - cryptographic operations" and From e88e00388effca676a02f87fc8ce712905f725ee Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Wed, 19 Aug 2026 15:45:00 +0200 Subject: [PATCH 030/181] C#: make OData.qll classes public, genericize test fixtures Match WCF.qll's convention: only the TaintedMember/AdditionalTaintStep wiring classes stay private, everything else that identifies a reusable OData domain concept (ODataActionParametersClass, DeltaClass, ODataBoundType, DeltaMutatingMethod, DeltaGetInstanceMethod) is public. Also renames the test fixtures to generic placeholder names. Co-Authored-By: Claude Sonnet 5 --- .../semmle/code/csharp/frameworks/OData.qll | 44 ++++++++--------- .../library-tests/frameworks/OData/OData.cs | 48 +++++++++---------- .../frameworks/OData/OData.expected | 14 +++--- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 899f1cbd036a..406041f04e10 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -17,14 +17,14 @@ * members need to be taint-tracked explicitly. */ -private import csharp +import csharp private import semmle.code.csharp.commons.Collections private import semmle.code.csharp.dataflow.FlowSteps private import semmle.code.csharp.dataflow.TaintTracking private import semmle.code.csharp.dataflow.internal.DataFlowPrivate /** The `ODataActionParameters` dictionary type, across OData library versions. */ -private class ODataActionParametersClass extends Class { +class ODataActionParametersClass extends Class { ODataActionParametersClass() { this.hasFullyQualifiedName("Microsoft.AspNet.OData", "ODataActionParameters") or this.hasFullyQualifiedName("Microsoft.AspNetCore.OData.Formatter", "ODataActionParameters") or @@ -32,8 +32,8 @@ private class ODataActionParametersClass extends Class { } } -/** An indexer read on an `ODataActionParameters` dictionary, e.g. `parameters["CabFile"]`. */ -private class ODataActionParameterRead extends ElementAccess { +/** An indexer read on an `ODataActionParameters` dictionary, e.g. `parameters["Foo"]`. */ +class ODataActionParameterRead extends ElementAccess { ODataActionParameterRead() { this.getQualifier().getType() instanceof ODataActionParametersClass } } @@ -43,7 +43,7 @@ private predicate isODataParameterValue(Expr e) { } /** The generic `Delta` change-tracking class, across OData library versions. */ -private class DeltaClass extends UnboundGenericClass { +class DeltaClass extends UnboundGenericClass { DeltaClass() { this.getNumberOfTypeParameters() = 1 and ( @@ -58,7 +58,7 @@ private class DeltaClass extends UnboundGenericClass { * or type-tested to -- directly, or wrapped in a collection (`List`, * `IEnumerable`, arrays, ...) -- or a type that is tracked by a `Delta`. */ -private class ODataBoundType extends ValueOrRefType { +class ODataBoundType extends ValueOrRefType { ODataBoundType() { exists(Cast c | isODataParameterValue(c.getExpr()) | this = c.getTargetType() or @@ -79,6 +79,22 @@ private class ODataBoundType extends ValueOrRefType { } } +/** The `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues` methods on `Delta`. */ +class DeltaMutatingMethod extends Method { + DeltaMutatingMethod() { + this.getDeclaringType() instanceof DeltaClass and + this.hasName(["Patch", "Put", "CopyChangedValues", "CopyUnchangedValues"]) + } +} + +/** The `GetInstance` method on `Delta`. */ +class DeltaGetInstanceMethod extends Method { + DeltaGetInstanceMethod() { + this.getDeclaringType() instanceof DeltaClass and + this.hasName("GetInstance") + } +} + private class CandidateODataMember extends Member { CandidateODataMember() { this.isPublic() and @@ -118,14 +134,6 @@ private class ODataBoundMember extends TaintTracking::TaintedMember, CandidateOD } } -/** The `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues` methods on `Delta`. */ -private class DeltaMutatingMethod extends Method { - DeltaMutatingMethod() { - this.getDeclaringType() instanceof DeltaClass and - this.hasName(["Patch", "Put", "CopyChangedValues", "CopyUnchangedValues"]) - } -} - /** * A call to `Delta.Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues` * copies the changes tracked by the `Delta` receiver onto its `original` @@ -141,14 +149,6 @@ private class DeltaMutatingCallTaintStep extends AdditionalTaintStep { } } -/** The `GetInstance` method on `Delta`. */ -private class DeltaGetInstanceMethod extends Method { - DeltaGetInstanceMethod() { - this.getDeclaringType() instanceof DeltaClass and - this.hasName("GetInstance") - } -} - /** `Delta.GetInstance()` returns the tracked entity, carrying the same taint as the `Delta` itself. */ private class DeltaGetInstanceTaintStep extends AdditionalTaintStep { override predicate step(DataFlow::Node node1, DataFlow::Node node2) { diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index ade9366f64d0..71a5c2218b68 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -29,27 +29,27 @@ namespace Test using Microsoft.AspNet.OData; using System.Collections.Generic; - public class FileMetadata + public class EntityMetadata { - public string Author { get; set; } + public string Owner { get; set; } } - public class UploadedFile + public class BoundEntity { - public string FileName { get; set; } + public string Name { get; set; } - public string FileContent { get; set; } + public string Content { get; set; } - public FileMetadata Metadata { get; set; } + public EntityMetadata Metadata { get; set; } - public List History { get; set; } + public List Revisions { get; set; } } - public class SubscriptionRelation + public class RelatedItem { - public string EventName { get; set; } + public string Label { get; set; } - public string EventType { get; set; } + public string Category { get; set; } } public class Widget @@ -65,37 +65,37 @@ public class UnrelatedType public string Name { get; set; } } - public class OrderController + public class SampleController { void Sink(object o) { } void CastFromDictionary(ODataActionParameters parameters) { - var file = (UploadedFile)parameters["CabFile"]; - Sink(file); - Sink(file.FileName); - Sink(file.FileContent); - Sink(file.Metadata.Author); - foreach (var m in file.History) + var entity = (BoundEntity)parameters["Entity"]; + Sink(entity); + Sink(entity.Name); + Sink(entity.Content); + Sink(entity.Metadata.Owner); + foreach (var m in entity.Revisions) { - Sink(m.Author); + Sink(m.Owner); } } void IsAsFromDictionary(ODataActionParameters parameters) { - if (parameters["NewEvents"] is IEnumerable relations1) + if (parameters["Items"] is IEnumerable items1) { - foreach (var item in relations1) + foreach (var item in items1) { - Sink(item.EventName); + Sink(item.Label); } } - var relations2 = parameters["NewEvents"] as IEnumerable; - foreach (var item in relations2) + var items2 = parameters["Items"] as IEnumerable; + foreach (var item in items2) { - Sink(item.EventType); + Sink(item.Category); } } diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index dbaffab69b1d..a9a2796c0ca5 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -1,9 +1,9 @@ -| OData.cs:72:55:72:64 | parameters | OData.cs:75:18:75:21 | access to local variable file | -| OData.cs:72:55:72:64 | parameters | OData.cs:76:18:76:30 | access to property FileName | -| OData.cs:72:55:72:64 | parameters | OData.cs:77:18:77:33 | access to property FileContent | -| OData.cs:72:55:72:64 | parameters | OData.cs:78:18:78:37 | access to property Author | -| OData.cs:72:55:72:64 | parameters | OData.cs:81:22:81:29 | access to property Author | -| OData.cs:85:55:85:64 | parameters | OData.cs:91:26:91:39 | access to property EventName | -| OData.cs:85:55:85:64 | parameters | OData.cs:98:22:98:35 | access to property EventType | +| OData.cs:72:55:72:64 | parameters | OData.cs:75:18:75:23 | access to local variable entity | +| OData.cs:72:55:72:64 | parameters | OData.cs:76:18:76:28 | access to property Name | +| OData.cs:72:55:72:64 | parameters | OData.cs:77:18:77:31 | access to property Content | +| OData.cs:72:55:72:64 | parameters | OData.cs:78:18:78:38 | access to property Owner | +| OData.cs:72:55:72:64 | parameters | OData.cs:81:22:81:28 | access to property Owner | +| OData.cs:85:55:85:64 | parameters | OData.cs:91:26:91:35 | access to property Label | +| OData.cs:85:55:85:64 | parameters | OData.cs:98:22:98:34 | access to property Category | | OData.cs:102:39:102:43 | delta | OData.cs:105:18:105:30 | access to property Name | | OData.cs:108:45:108:49 | delta | OData.cs:111:18:111:23 | access to property Name | From 3440d4a1eb5338c78c5faf7e40fdacd53c4f8a77 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Wed, 19 Aug 2026 15:53:23 +0200 Subject: [PATCH 031/181] C#: drop redundant TaintTracking import in OData.qll import csharp already publicly imports semmle.code.csharp.dataflow.TaintTracking (and DataFlow), same as WCF.qll/JsonNET.qll rely on implicitly. Co-Authored-By: Claude Sonnet 5 --- csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll | 1 - 1 file changed, 1 deletion(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 406041f04e10..80917322f441 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -20,7 +20,6 @@ import csharp private import semmle.code.csharp.commons.Collections private import semmle.code.csharp.dataflow.FlowSteps -private import semmle.code.csharp.dataflow.TaintTracking private import semmle.code.csharp.dataflow.internal.DataFlowPrivate /** The `ODataActionParameters` dictionary type, across OData library versions. */ From fe46062a1245c31652303040c735584a28453906 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 18 Aug 2026 18:45:58 +0100 Subject: [PATCH 032/181] C++: Fixup 'cpp/sql-injection' so that it doesn't require the sink to be an (indirect)expr. --- cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql | 40 +++++++------------ .../CWE-089/SqlTainted/SqlTainted.expected | 22 +++++----- 2 files changed, 26 insertions(+), 36 deletions(-) diff --git a/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql b/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql index 802888be271a..eb5d23b5fd6a 100644 --- a/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql +++ b/cpp/ql/src/Security/CWE/CWE-089/SqlTainted.ql @@ -33,15 +33,20 @@ Expr asSinkExpr(DataFlow::Node node) { result = node.asExpr() } +private predicate isSink(DataFlow::Node sink, string extraText) { + exists(SqlLikeFunction runSql, string callChain | + runSql.outermostWrapperFunctionCall(asSinkExpr(sink), callChain) and + extraText = " and then passed to " + callChain + ) + or + // sink defined using models-as-data + sinkNode(sink, "sql-injection") and extraText = "" +} + module SqlTaintedConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node node) { node instanceof FlowSource } - predicate isSink(DataFlow::Node node) { - exists(SqlLikeFunction runSql | runSql.outermostWrapperFunctionCall(asSinkExpr(node), _)) - or - // sink defined using models-as-data - sinkNode(node, "sql-injection") - } + predicate isSink(DataFlow::Node node) { isSink(node, _) } predicate isBarrier(DataFlow::Node node) { node.asExpr().getUnspecifiedType() instanceof IntegralType @@ -57,32 +62,17 @@ module SqlTaintedConfig implements DataFlow::ConfigSig { } predicate observeDiffInformedIncrementalMode() { any() } - - Location getASelectedSinkLocation(DataFlow::Node sink) { - exists(Expr taintedArg | result = [taintedArg.getLocation(), sink.getLocation()] | - taintedArg = asSinkExpr(sink) - ) - } } module SqlTainted = TaintTracking::Global; from - Expr taintedArg, FlowSource taintSource, SqlTainted::PathNode sourceNode, - SqlTainted::PathNode sinkNode, string extraText + FlowSource taintSource, SqlTainted::PathNode sourceNode, SqlTainted::PathNode sinkNode, + string extraText where - ( - exists(SqlLikeFunction runSql, string callChain | - runSql.outermostWrapperFunctionCall(taintedArg, callChain) and - extraText = " and then passed to " + callChain - ) - or - sinkNode(sinkNode.getNode(), "sql-injection") and - extraText = "" - ) and SqlTainted::flowPath(sourceNode, sinkNode) and - taintedArg = asSinkExpr(sinkNode.getNode()) and + isSink(sinkNode.getNode(), extraText) and taintSource = sourceNode.getNode() -select taintedArg, sourceNode, sinkNode, +select sinkNode.getNode(), sourceNode, sinkNode, "This argument to a SQL query function is derived from $@" + extraText + ".", taintSource, "user input (" + taintSource.getSourceType() + ")" diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected index df780acdd8d0..2e00cb866749 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected @@ -1,11 +1,11 @@ #select -| test.c:21:18:21:23 | query1 | test.c:14:27:14:30 | **argv | test.c:21:18:21:23 | *query1 | This argument to a SQL query function is derived from $@ and then passed to mysql_query(sqlArg). | test.c:14:27:14:30 | **argv | user input (a command-line argument) | -| test.c:51:18:51:23 | query1 | test.c:14:27:14:30 | **argv | test.c:51:18:51:23 | *query1 | This argument to a SQL query function is derived from $@ and then passed to mysql_query(sqlArg). | test.c:14:27:14:30 | **argv | user input (a command-line argument) | -| test.c:76:17:76:25 | userInput | test.c:75:8:75:16 | gets output argument | test.c:76:17:76:25 | *userInput | This argument to a SQL query function is derived from $@ and then passed to SQLPrepare(StatementText). | test.c:75:8:75:16 | gets output argument | user input (string read by gets) | -| test.c:77:20:77:28 | userInput | test.c:75:8:75:16 | gets output argument | test.c:77:20:77:28 | *userInput | This argument to a SQL query function is derived from $@ and then passed to SQLExecDirect(StatementText). | test.c:75:8:75:16 | gets output argument | user input (string read by gets) | -| test.c:106:24:106:29 | query1 | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | *query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | -| test.c:107:28:107:33 | query1 | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | *query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | -| test.cpp:43:27:43:33 | access to array | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | This argument to a SQL query function is derived from $@ and then passed to pqxx::work::exec1((unnamed parameter 0)). | test.cpp:39:27:39:30 | **argv | user input (a command-line argument) | +| test.c:21:18:21:23 | *query1 | test.c:14:27:14:30 | **argv | test.c:21:18:21:23 | *query1 | This argument to a SQL query function is derived from $@ and then passed to mysql_query(sqlArg). | test.c:14:27:14:30 | **argv | user input (a command-line argument) | +| test.c:51:18:51:23 | *query1 | test.c:14:27:14:30 | **argv | test.c:51:18:51:23 | *query1 | This argument to a SQL query function is derived from $@ and then passed to mysql_query(sqlArg). | test.c:14:27:14:30 | **argv | user input (a command-line argument) | +| test.c:76:17:76:25 | *userInput | test.c:75:8:75:16 | gets output argument | test.c:76:17:76:25 | *userInput | This argument to a SQL query function is derived from $@ and then passed to SQLPrepare(StatementText). | test.c:75:8:75:16 | gets output argument | user input (string read by gets) | +| test.c:77:20:77:28 | *userInput | test.c:75:8:75:16 | gets output argument | test.c:77:20:77:28 | *userInput | This argument to a SQL query function is derived from $@ and then passed to SQLExecDirect(StatementText). | test.c:75:8:75:16 | gets output argument | user input (string read by gets) | +| test.c:106:24:106:29 | query1 | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | +| test.c:107:28:107:33 | query1 | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | +| test.cpp:43:27:43:33 | *access to array | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | This argument to a SQL query function is derived from $@ and then passed to pqxx::work::exec1((unnamed parameter 0)). | test.cpp:39:27:39:30 | **argv | user input (a command-line argument) | edges | test.c:14:27:14:30 | **argv | test.c:15:20:15:26 | *access to array | provenance | | | test.c:15:20:15:26 | *access to array | test.c:21:18:21:23 | *query1 | provenance | TaintFunction | @@ -17,8 +17,8 @@ edges | test.c:48:20:48:33 | *globalUsername | test.c:51:18:51:23 | *query1 | provenance | TaintFunction | | test.c:75:8:75:16 | gets output argument | test.c:76:17:76:25 | *userInput | provenance | | | test.c:75:8:75:16 | gets output argument | test.c:77:20:77:28 | *userInput | provenance | | -| test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | *query1 | provenance | TaintFunction Sink:MaD:2 | -| test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | *query1 | provenance | TaintFunction Sink:MaD:1 | +| test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | provenance | TaintFunction Sink:MaD:2 | +| test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | provenance | TaintFunction Sink:MaD:1 | | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | provenance | | models | 1 | Sink: ; ; false; OCIStmtPrepare2; ; ; Argument[*3]; sql-injection; manual | @@ -37,8 +37,8 @@ nodes | test.c:76:17:76:25 | *userInput | semmle.label | *userInput | | test.c:77:20:77:28 | *userInput | semmle.label | *userInput | | test.c:101:8:101:16 | gets output argument | semmle.label | gets output argument | -| test.c:106:24:106:29 | *query1 | semmle.label | *query1 | -| test.c:107:28:107:33 | *query1 | semmle.label | *query1 | +| test.c:106:24:106:29 | query1 | semmle.label | query1 | +| test.c:107:28:107:33 | query1 | semmle.label | query1 | | test.cpp:39:27:39:30 | **argv | semmle.label | **argv | | test.cpp:43:27:43:33 | *access to array | semmle.label | *access to array | subpaths From 5077b54c4be744ed7638d91092dca9ea92736546 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 18 Aug 2026 18:46:19 +0100 Subject: [PATCH 033/181] C++: Accept test changes. Nothing exciting here. --- .../semmle/tests/ExposedSystemData.expected | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected index 6b4be51fd33e..a174000efec8 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-497/semmle/tests/ExposedSystemData.expected @@ -9,11 +9,11 @@ | tests2.cpp:93:14:93:17 | *str1 | tests2.cpp:91:42:91:45 | *str1 | tests2.cpp:93:14:93:17 | *str1 | This operation exposes system data from $@. | tests2.cpp:91:42:91:45 | *str1 | *str1 | | tests2.cpp:102:14:102:15 | *pw | tests2.cpp:101:8:101:15 | *call to getpwuid | tests2.cpp:102:14:102:15 | *pw | This operation exposes system data from $@. | tests2.cpp:101:8:101:15 | *call to getpwuid | *call to getpwuid | | tests2.cpp:111:14:111:19 | *ptr | tests2.cpp:109:12:109:17 | *call to getenv | tests2.cpp:111:14:111:19 | *ptr | This operation exposes system data from $@. | tests2.cpp:109:12:109:17 | *call to getenv | *call to getenv | -| tests2.cpp:138:23:138:34 | *message_data | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:138:23:138:34 | *message_data | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:144:33:144:40 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:144:33:144:40 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:147:20:147:27 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:147:20:147:27 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:155:32:155:39 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:155:32:155:39 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | -| tests2.cpp:158:20:158:27 | *& ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:158:20:158:27 | *& ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:138:23:138:34 | message_data | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:138:23:138:34 | message_data | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:144:33:144:40 | & ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:144:33:144:40 | & ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:147:20:147:27 | & ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:147:20:147:27 | & ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:155:32:155:39 | & ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:155:32:155:39 | & ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | +| tests2.cpp:158:20:158:27 | & ... | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:158:20:158:27 | & ... | This operation exposes system data from $@. | tests2.cpp:134:17:134:22 | *call to getenv | *call to getenv | | tests_sockets.cpp:39:19:39:22 | *path | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:39:19:39:22 | *path | This operation exposes system data from $@. | tests_sockets.cpp:26:15:26:20 | *call to getenv | *call to getenv | | tests_sockets.cpp:43:20:43:23 | *path | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:43:20:43:23 | *path | This operation exposes system data from $@. | tests_sockets.cpp:26:15:26:20 | *call to getenv | *call to getenv | | tests_sockets.cpp:76:19:76:22 | *path | tests_sockets.cpp:63:15:63:20 | *call to getenv | tests_sockets.cpp:76:19:76:22 | *path | This operation exposes system data from $@. | tests_sockets.cpp:63:15:63:20 | *call to getenv | *call to getenv | @@ -33,13 +33,13 @@ edges | tests2.cpp:111:14:111:15 | *c1 [*ptr] | tests2.cpp:111:14:111:19 | *ptr | provenance | | | tests2.cpp:111:14:111:15 | *c1 [*ptr] | tests2.cpp:111:17:111:19 | *ptr | provenance | | | tests2.cpp:111:17:111:19 | *ptr | tests2.cpp:111:14:111:19 | *ptr | provenance | | -| tests2.cpp:134:2:134:30 | *... = ... | tests2.cpp:138:23:138:34 | *message_data | provenance | Sink:MaD:2 | +| tests2.cpp:134:2:134:30 | *... = ... | tests2.cpp:138:23:138:34 | message_data | provenance | Sink:MaD:2 | | tests2.cpp:134:2:134:30 | *... = ... | tests2.cpp:143:34:143:45 | *message_data | provenance | | | tests2.cpp:134:17:134:22 | *call to getenv | tests2.cpp:134:2:134:30 | *... = ... | provenance | | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:144:33:144:40 | *& ... | provenance | Sink:MaD:3 | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:147:20:147:27 | *& ... | provenance | Sink:MaD:1 | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:155:32:155:39 | *& ... | provenance | Sink:MaD:3 | -| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:158:20:158:27 | *& ... | provenance | Sink:MaD:1 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:144:33:144:40 | & ... | provenance | Sink:MaD:3 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:147:20:147:27 | & ... | provenance | Sink:MaD:1 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:155:32:155:39 | & ... | provenance | Sink:MaD:3 | +| tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | tests2.cpp:158:20:158:27 | & ... | provenance | Sink:MaD:1 | | tests2.cpp:143:34:143:45 | *message_data | tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | provenance | MaD:4 | | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:26:15:26:20 | *call to getenv | provenance | | | tests_sockets.cpp:26:15:26:20 | *call to getenv | tests_sockets.cpp:39:19:39:22 | *path | provenance | | @@ -78,13 +78,13 @@ nodes | tests2.cpp:111:17:111:19 | *ptr | semmle.label | *ptr | | tests2.cpp:134:2:134:30 | *... = ... | semmle.label | *... = ... | | tests2.cpp:134:17:134:22 | *call to getenv | semmle.label | *call to getenv | -| tests2.cpp:138:23:138:34 | *message_data | semmle.label | *message_data | +| tests2.cpp:138:23:138:34 | message_data | semmle.label | message_data | | tests2.cpp:143:24:143:31 | zmq_msg_init_data output argument | semmle.label | zmq_msg_init_data output argument | | tests2.cpp:143:34:143:45 | *message_data | semmle.label | *message_data | -| tests2.cpp:144:33:144:40 | *& ... | semmle.label | *& ... | -| tests2.cpp:147:20:147:27 | *& ... | semmle.label | *& ... | -| tests2.cpp:155:32:155:39 | *& ... | semmle.label | *& ... | -| tests2.cpp:158:20:158:27 | *& ... | semmle.label | *& ... | +| tests2.cpp:144:33:144:40 | & ... | semmle.label | & ... | +| tests2.cpp:147:20:147:27 | & ... | semmle.label | & ... | +| tests2.cpp:155:32:155:39 | & ... | semmle.label | & ... | +| tests2.cpp:158:20:158:27 | & ... | semmle.label | & ... | | tests_sockets.cpp:26:15:26:20 | *call to getenv | semmle.label | *call to getenv | | tests_sockets.cpp:26:15:26:20 | *call to getenv | semmle.label | *call to getenv | | tests_sockets.cpp:39:19:39:22 | *path | semmle.label | *path | From 20788f1f69c794294d53ab52154ec26e5e0ccd5f Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 19 Aug 2026 16:23:55 +0100 Subject: [PATCH 034/181] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index 0513c2ba92e9..d09b10aa632b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -517,7 +517,7 @@ abstract class ArgumentNode extends Node { /** * Holds if this argument occurs at the given position in the given call, - * and this call part of a summary. + * and this call is part of a summary. * The instance argument is considered to have index `-1`. */ predicate summaryArgumentOf(FlowSummaryImpl::Public::SummarizedCallable call, ArgumentPosition pos) { From 98285faab0e4d569537d70c37f4a021c043cf0e5 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 19 Aug 2026 16:26:13 +0100 Subject: [PATCH 035/181] C++: Add change note. --- .../2026-08-19-access-paths-for-sources-and-sinks.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md diff --git a/cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md b/cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md new file mode 100644 index 000000000000..7cbe82b6f8e9 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-08-19-access-paths-for-sources-and-sinks.md @@ -0,0 +1,4 @@ +--- +category: feature +--- +* Sources and sinks defined using models-as-data now support access paths with fields. For example, the path `ReturnValue.Field[S::f]` makes the field `S::f` a flow source when it is returned by a call. \ No newline at end of file From 2e43cea169c42743745fb9bb897808d0b776d721 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 19 Aug 2026 16:41:36 +0100 Subject: [PATCH 036/181] C++: Fix bug spotted by Copilot. --- .../ir/dataflow/internal/DataFlowNodes.qll | 1 + .../dataflow/external-models/flow.expected | 4 +-- .../dataflow/external-models/sources.expected | 2 +- .../models-as-data/testModels.expected | 30 +++++++++---------- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll index 16e2130eb229..541b6d13b149 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowNodes.qll @@ -1575,6 +1575,7 @@ private class SourceOutputNode extends FlowSummaryImpl::Private::SourceOutputNod } private predicate isOutArgument(Call call) { + call.getTarget() = this.getSourceElement() and [call.getAnArgument(), call.getQualifier()] = this.getSourceSinkReportingElement() } } diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 99ce09880165..2532476fd1a0 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -122,8 +122,8 @@ edges | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | | azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:85 | -| azure.cpp:289:32:289:40 | Value output argument | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:43 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | +| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:43 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | @@ -467,7 +467,7 @@ nodes | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | semmle.label | call to ReadToEnd [element] | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | semmle.label | call to ReadToEnd [element] | | azure.cpp:289:24:289:56 | call to GetHeader | semmle.label | call to GetHeader | -| azure.cpp:289:32:289:40 | Value output argument | semmle.label | Value output argument | +| azure.cpp:289:32:289:40 | call to GetHeader | semmle.label | call to GetHeader | | azure.cpp:289:32:289:40 | call to GetHeader | semmle.label | call to GetHeader | | azure.cpp:289:63:289:65 | call to Value | semmle.label | call to Value | | azure.cpp:289:63:289:65 | call to Value | semmle.label | call to Value | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 9dfb62bdafde..9c04945642e9 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -3,7 +3,7 @@ | azure.cpp:273:52:273:61 | call to GetHeaders | remote | | azure.cpp:277:38:277:44 | call to GetBody | remote | | azure.cpp:281:68:281:84 | call to ExtractBodyStream | remote | -| azure.cpp:289:32:289:40 | Value output argument | remote | +| azure.cpp:289:32:289:40 | call to GetHeader | remote | | azure.cpp:293:58:293:67 | call to GetHeaders | remote | | test.cpp:10:10:10:18 | call to ymlSource | local | | test.cpp:56:8:56:16 | call to ymlSource | local | diff --git a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected index 899b9bf80353..ee106e24edb1 100644 --- a/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected +++ b/cpp/ql/test/library-tests/dataflow/models-as-data/testModels.expected @@ -283,19 +283,19 @@ sourceCallables | tests.cpp:433:6:433:10 | array | | tests.cpp:434:6:434:6 | y | flowSummaryNode -| tests.cpp:36:7:36:20 | sink output argument | | | test_sources | -| tests.cpp:37:7:37:21 | sink output argument | | | test_sources | -| tests.cpp:39:7:39:24 | sink output argument | | | test_sources | -| tests.cpp:40:7:40:27 | sink output argument | | | test_sources | +| tests.cpp:36:7:36:20 | call to localMadSource | | | test_sources | +| tests.cpp:37:7:37:21 | call to remoteMadSource | | | test_sources | +| tests.cpp:39:7:39:24 | call to localMadSourceVoid | | | test_sources | +| tests.cpp:40:7:40:27 | call to localMadSourceHasBody | | | test_sources | | tests.cpp:45:10:45:23 | call to localMadSource | | | test_sources | -| tests.cpp:53:7:53:29 | sink output argument | | | test_sources | +| tests.cpp:53:7:53:29 | call to remoteMadSourceIndirect | | | test_sources | | tests.cpp:54:8:54:30 | call to remoteMadSourceIndirect | | | test_sources | | tests.cpp:55:8:55:36 | call to remoteMadSourceDoubleIndirect | | | test_sources | | tests.cpp:56:9:56:37 | call to remoteMadSourceDoubleIndirect | | | test_sources | | tests.cpp:60:30:60:31 | remoteMadSourceIndirectArg0 output argument | | | test_sources | | tests.cpp:63:33:63:33 | remoteMadSourceIndirectArg1 output argument | | | test_sources | | tests.cpp:67:10:67:23 | call to localMadSource | | | test_sources | -| tests.cpp:70:7:70:57 | sink output argument | | | test_sources | +| tests.cpp:70:7:70:57 | call to namespace2LocalMadSource | | | test_sources | | tests.cpp:75:32:75:32 | x | | | remoteMadSourceParam0 | | tests.cpp:95:14:95:19 | call to source | | | test_sinks | | tests.cpp:97:24:97:24 | 0 | | | test_sinks | @@ -316,9 +316,9 @@ flowSummaryNode | tests.cpp:109:22:109:26 | a_ptr | | | test_sinks | | tests.cpp:110:28:110:33 | & ... | | | test_sinks | | tests.cpp:111:14:111:27 | call to localMadSource | | | test_sinks | -| tests.cpp:111:14:111:27 | madSinkArg0 output argument | | | test_sinks | +| tests.cpp:111:14:111:27 | call to localMadSource | | | test_sinks | +| tests.cpp:112:22:112:44 | call to remoteMadSourceIndirect | | | test_sinks | | tests.cpp:112:22:112:44 | call to remoteMadSourceIndirect | | | test_sinks | -| tests.cpp:112:22:112:44 | madSinkIndirectArg0 output argument | | | test_sinks | | tests.cpp:127:5:127:19 | [summary param] 0 in madArg0ToReturn | ParameterNode | madArg0ToReturn | madArg0ToReturn | | tests.cpp:127:5:127:19 | [summary] to write: ReturnValue in madArg0ToReturn | ReturnNode | madArg0ToReturn | madArg0ToReturn | | tests.cpp:128:6:128:28 | [summary param] 0 in madArg0ToReturnIndirect | ParameterNode | madArg0ToReturnIndirect | madArg0ToReturnIndirect | @@ -362,9 +362,9 @@ flowSummaryNode | tests.cpp:148:13:148:40 | [summary] to write: ReturnValue in madArg0ToReturnFieldIndirect | ReturnNode | madArg0ToReturnFieldIndirect | madArg0ToReturnFieldIndirect | | tests.cpp:148:13:148:40 | [summary] to write: ReturnValue.Field[*MyContainer::ptr]/Field[*ptr] in madArg0ToReturnFieldIndirect | | madArg0ToReturnFieldIndirect | madArg0ToReturnFieldIndirect | | tests.cpp:225:14:225:28 | call to madArg0ToReturn | | | test_summaries | -| tests.cpp:225:30:225:44 | madArg0ToReturn output argument | | | test_summaries | +| tests.cpp:225:30:225:44 | call to remoteMadSource | | | test_summaries | | tests.cpp:226:14:226:37 | call to madArg0ToReturnValueFlow | | | test_summaries | -| tests.cpp:226:39:226:53 | madArg0ToReturnValueFlow output argument | | | test_summaries | +| tests.cpp:226:39:226:53 | call to remoteMadSource | | | test_summaries | | tests.cpp:227:14:227:36 | call to madArg0IndirectToReturn | | | test_summaries | | tests.cpp:228:14:228:36 | call to madArg0IndirectToReturn | | | test_summaries | | tests.cpp:250:7:250:19 | [summary param] 0 in madArg0ToSelf | ParameterNode | madArg0ToSelf | madArg0ToSelf | @@ -381,16 +381,16 @@ flowSummaryNode | tests.cpp:254:6:254:21 | [summary] to write: ReturnValue in madFieldToReturn | ReturnNode | madFieldToReturn | madFieldToReturn | | tests.cpp:277:7:277:30 | [summary param] this in namespaceMadSelfToReturn | ParameterNode | namespaceMadSelfToReturn | namespaceMadSelfToReturn | | tests.cpp:277:7:277:30 | [summary] to write: ReturnValue in namespaceMadSelfToReturn | ReturnNode | namespaceMadSelfToReturn | namespaceMadSelfToReturn | -| tests.cpp:292:10:292:30 | sink output argument | | | test_class_members | +| tests.cpp:292:10:292:30 | call to memberRemoteMadSource | | | test_class_members | | tests.cpp:295:39:295:40 | memberRemoteMadSourceIndirectArg0 output argument | | | test_class_members | -| tests.cpp:300:11:300:31 | sink output argument | | | test_class_members | -| tests.cpp:301:11:301:33 | sink output argument | | | test_class_members | -| tests.cpp:303:11:303:33 | sink output argument | | | test_class_members | +| tests.cpp:300:11:300:31 | call to memberRemoteMadSource | | | test_class_members | +| tests.cpp:301:11:301:33 | call to subtypeRemoteMadSource1 | | | test_class_members | +| tests.cpp:303:11:303:33 | call to subtypeRemoteMadSource2 | | | test_class_members | | tests.cpp:307:23:307:28 | call to source | | | test_class_members | | tests.cpp:309:33:309:38 | call to source | | | test_class_members | | tests.cpp:310:57:310:62 | call to source | | | test_class_members | | tests.cpp:351:26:351:46 | call to memberRemoteMadSource | | | test_class_members | -| tests.cpp:351:26:351:46 | memberMadSinkArg0 output argument | | | test_class_members | +| tests.cpp:351:26:351:46 | call to memberRemoteMadSource | | | test_class_members | | tests.cpp:362:2:362:4 | mc8 | | | test_class_members | | tests.cpp:362:24:362:24 | 0 | | | test_class_members | | tests.cpp:363:2:363:4 | mc8 | | | test_class_members | From 1a430070f83f17353e929a9d383a8df4b3624344 Mon Sep 17 00:00:00 2001 From: Jordan Pike Date: Wed, 19 Aug 2026 14:53:30 -0400 Subject: [PATCH 037/181] Actions: AssociationIfCheck should not protect events that do not populate the checked field Same problem as EventActorIfCheck had. A condition like 'github.event.pull_request.author_association != NONE' on a workflow triggered by issues events is always true since github.event.pull_request is not populated there, but it still counted as a protective check for those events. Bind the matched context prefix in the characteristic predicate and require contextTriggerDataModel to populate it for the event, following the pattern from #22368. Existing TOCTOU alerts on vacuous gates migrate to the untrusted-checkout critical query, since a vacuous gate is no protection rather than raceable protection. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4084febb-f9c7-44df-baf3-c8be8e9932a7 --- ...-19-association-if-check-event-validity.md | 4 +++ .../codeql/actions/security/ControlChecks.qll | 35 +++++++++++++++---- .../association_check_wrong_event.yml | 21 +++++++++++ .../CWE-094/CodeInjectionCritical.expected | 3 ++ .../CWE-094/CodeInjectionMedium.expected | 3 ++ .../UntrustedCheckoutTOCTOUCritical.expected | 5 --- .../UntrustedCheckoutTOCTOUHigh.expected | 2 -- .../UntrustedCheckoutCritical.expected | 5 +++ 8 files changed, 64 insertions(+), 14 deletions(-) create mode 100644 actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md create mode 100644 actions/ql/test/query-tests/Security/CWE-094/.github/workflows/association_check_wrong_event.yml diff --git a/actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md b/actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md new file mode 100644 index 000000000000..28ef240b2394 --- /dev/null +++ b/actions/ql/lib/change-notes/2026-08-19-association-if-check-event-validity.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Checks on author association fields read from the event payload (e.g. `github.event.pull_request.author_association`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as `github.event.pull_request.author_association != 'NONE'` on a workflow triggered by `issues` events was treated as a protective check even though `github.event.pull_request` is not populated for `issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the `ControlCheck` class. diff --git a/actions/ql/lib/codeql/actions/security/ControlChecks.qll b/actions/ql/lib/codeql/actions/security/ControlChecks.qll index 675c1d18852b..aea57fdc4b71 100644 --- a/actions/ql/lib/codeql/actions/security/ControlChecks.qll +++ b/actions/ql/lib/codeql/actions/security/ControlChecks.qll @@ -408,16 +408,37 @@ class WorkflowRunRepositoryIfCheck extends RepositoryCheck instanceof If { } } +/** + * Gets a regular expression matching a condition on an author association field + * that is only populated for events whose payload contains the `context_prefix` + * context. + */ +private string eventPayloadAssociationFieldRegex(string context_prefix) { + context_prefix = "github.event.comment" and + result = "\\bgithub\\.event\\.comment\\.author_association\\b" + or + context_prefix = "github.event.issue" and + result = "\\bgithub\\.event\\.issue\\.author_association\\b" + or + context_prefix = "github.event.pull_request" and + result = "\\bgithub\\.event\\.pull_request\\.author_association\\b" +} + class AssociationIfCheck extends AssociationCheck instanceof If { + string context_prefix; + AssociationIfCheck() { // eg: contains(fromJson('["MEMBER", "OWNER"]'), github.event.comment.author_association) - normalizeExpr(this.getCondition()) - .splitAt("\n") - .regexpMatch([ - ".*\\bgithub\\.event\\.comment\\.author_association\\b.*", - ".*\\bgithub\\.event\\.issue\\.author_association\\b.*", - ".*\\bgithub\\.event\\.pull_request\\.author_association\\b.*", - ]) + exists( + normalizeExpr(this.getCondition()) + .regexpFind(eventPayloadAssociationFieldRegex(context_prefix), _, _) + ) + } + + override predicate protectsCategoryAndEvent(string category, string event) { + AssociationCheck.super.protectsCategoryAndEvent(category, event) and + // association fields only restrict events whose payload populates them + contextTriggerDataModel(event, context_prefix) } } diff --git a/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/association_check_wrong_event.yml b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/association_check_wrong_event.yml new file mode 100644 index 000000000000..b1cef25955dd --- /dev/null +++ b/actions/ql/test/query-tests/Security/CWE-094/.github/workflows/association_check_wrong_event.yml @@ -0,0 +1,21 @@ +on: + issues: + types: [opened] + +jobs: + # The `if:` condition compares an association field that is never populated + # for `issues` events, so it is always true and does not protect the + # injectable step. + vacuous-association-check: + runs-on: ubuntu-latest + if: github.event.pull_request.author_association != 'NONE' + steps: + - run: echo '${{ github.event.issue.title }}' + + # `github.event.issue` is populated for `issues` events, so this check is + # effective and the injectable step is protected. + valid-association-check: + runs-on: ubuntu-latest + if: github.event.issue.author_association == 'MEMBER' + steps: + - run: echo '${{ github.event.issue.title }}' diff --git a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected index 14e50942d734..e32155dffe93 100644 --- a/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected +++ b/actions/ql/test/query-tests/Security/CWE-094/CodeInjectionCritical.expected @@ -312,6 +312,8 @@ nodes | .github/workflows/artifactpoisoning8.yml:17:9:21:6 | Run Step: artifact [id] | semmle.label | Run Step: artifact [id] | | .github/workflows/artifactpoisoning8.yml:19:14:19:58 | echo "::set-output name=id::$( Date: Thu, 20 Aug 2026 10:00:22 +0100 Subject: [PATCH 038/181] Rust: Update an .expected file in integration tests. --- rust/ql/integration-tests/hello-project/summary.expected | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rust/ql/integration-tests/hello-project/summary.expected b/rust/ql/integration-tests/hello-project/summary.expected index 0d639fe44f75..e83ef6d22658 100644 --- a/rust/ql/integration-tests/hello-project/summary.expected +++ b/rust/ql/integration-tests/hello-project/summary.expected @@ -1,6 +1,6 @@ | Extraction errors | 0 | | Extraction warnings | 0 | -| Files extracted - total | 5 | +| Files extracted - total user | 5 | | Files extracted - with errors | 0 | | Files extracted - without errors | 5 | | Files extracted - without errors % | 100 | From 66573bb5951d60ad88d20fce4989345ee5d1aeaf Mon Sep 17 00:00:00 2001 From: Alex Ausch Date: Wed, 19 Aug 2026 17:11:54 +0200 Subject: [PATCH 039/181] Python: fix PEP 758 `except A, B:` in the default parser The grammar rule shared by both readings is except_clause: 'except' [test [(',' | 'as') test]] and `visit_except_clause` ignored the separator token, always treating the fourth child as an alias to bind. So `except A, B:` extracted `B` as a Store rather than a use, which is the Python 2 reading. Queries that reason about whether a name is used then report false positives; `py/unused-import` flags the import of `B` as unused. The tree-sitter parser already extracts this as a tuple of exception types (#20990), so the two parsers disagreed. `tests/parser/exceptions_relaxed.py` is an unsuffixed parser test, which asserts the two parsers produce identical ASTs; it fails without this change. With the fix, the default parser reproduces the existing `tests/parser/exceptions_new.expected` byte for byte, and of the 37 parser test files only the two containing PEP 758 syntax change at all. Co-Authored-By: Claude Opus 5 (1M context) --- python/extractor/semmle/python/parser/ast.py | 11 ++++++++++- python/extractor/tests/parser/exceptions_relaxed.py | 10 ++++++++++ .../2026-08-19-legacy-parser-relaxed-except.md | 4 ++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 python/extractor/tests/parser/exceptions_relaxed.py create mode 100644 python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md diff --git a/python/extractor/semmle/python/parser/ast.py b/python/extractor/semmle/python/parser/ast.py index e1843131554a..0712bf08ae45 100644 --- a/python/extractor/semmle/python/parser/ast.py +++ b/python/extractor/semmle/python/parser/ast.py @@ -981,7 +981,16 @@ def visit_except_clause(self, node): if len(node.children) > 1: type = self.visit(node.children[1], LOAD) if len(node.children) > 3: - name = self.visit(node.children[3], STORE) + if is_token(node.children[2], "as"): + name = self.visit(node.children[3], STORE) + else: + # PEP 758 (Python 3.14+): `except A, B:` is an unparenthesized + # tuple of exception types, not a Python 2 alias binding. The + # grammar rule `'except' [test [(',' | 'as') test]]` is shared + # between both readings, so the separator token decides. + elts = [type, self.visit(node.children[3], LOAD)] + type = ast.Tuple(elts, LOAD) + set_location(type, node.children[1].start, node.children[3].end) return type, name def visit_del_stmt(self, node): diff --git a/python/extractor/tests/parser/exceptions_relaxed.py b/python/extractor/tests/parser/exceptions_relaxed.py new file mode 100644 index 000000000000..a0dea76dfa81 --- /dev/null +++ b/python/extractor/tests/parser/exceptions_relaxed.py @@ -0,0 +1,10 @@ +try: + a +except b, c: + d +except (e, f): + g +except h as i: + j +except k: + l diff --git a/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md b/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md new file mode 100644 index 000000000000..bd4bd599f568 --- /dev/null +++ b/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Fixed the extraction of PEP 758 `except A, B:` clauses by the default (non-tree-sitter) Python parser. Previously the second exception type was extracted as a Python 2 style alias binding, so it was recorded as a `Store` rather than a use. This caused false positives from queries that reason about whether a name is used, such as `py/unused-import`. From 896d8d78b45d489a317cace26b4219399653e4e3 Mon Sep 17 00:00:00 2001 From: Alex Ausch Date: Thu, 20 Aug 2026 10:53:23 +0200 Subject: [PATCH 040/181] Python: add query tests for unparenthesized except chains of every length The parser test added with the fix pins the AST. These pin the behaviour a user actually sees, through the real extraction path including the tree-sitter fallback, and they cover chains longer than two. Chains of three or more behave differently from chains of two, which is worth having written down. `except A, B, C:` fails the default parser outright, so `Module.py_ast` falls back to tree-sitter and the result is already correct. `except A, B:` parses successfully under the Python 2 reading, so the fallback never fires and the bad AST reaches the queries. That is why only the two-type form produced a false positive. It also means the two cases cannot share a file: any three-type clause sends the whole file to tree-sitter and masks the two-type behaviour. Hence relaxed_except.py and relaxed_except_long.py, with a comment in each saying so. Each name is used in exactly one clause for the same reason -- a name reused in a parenthesized clause is a use regardless, and hides the defect. Verified by reverting the extractor fix in a 2.26.3 bundle: relaxed_except.py then reports `Import of 'Beta' is not used.` and the test fails. Co-Authored-By: Claude Opus 5 (1M context) --- .../Imports/unused/UnusedImport.expected | 1 + .../Imports/unused/relaxed_except.py | 26 +++++++++++++++++++ .../Imports/unused/relaxed_except_defs.py | 26 +++++++++++++++++++ .../Imports/unused/relaxed_except_long.py | 17 ++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 python/ql/test/query-tests/Imports/unused/relaxed_except.py create mode 100644 python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py create mode 100644 python/ql/test/query-tests/Imports/unused/relaxed_except_long.py diff --git a/python/ql/test/query-tests/Imports/unused/UnusedImport.expected b/python/ql/test/query-tests/Imports/unused/UnusedImport.expected index 2f27961d92e3..801305defafd 100644 --- a/python/ql/test/query-tests/Imports/unused/UnusedImport.expected +++ b/python/ql/test/query-tests/Imports/unused/UnusedImport.expected @@ -6,3 +6,4 @@ | imports_test.py:27:1:27:25 | Import | Import of 'func2' is not used. | | imports_test.py:34:1:34:14 | Import | Import of 'module2' is not used. | | imports_test.py:116:1:116:41 | Import | Import of 'not_a_fixture' is not used. | +| relaxed_except.py:12:1:12:68 | Import | Import of 'NeverUsed' is not used. | diff --git a/python/ql/test/query-tests/Imports/unused/relaxed_except.py b/python/ql/test/query-tests/Imports/unused/relaxed_except.py new file mode 100644 index 000000000000..0f1f29d71ceb --- /dev/null +++ b/python/ql/test/query-tests/Imports/unused/relaxed_except.py @@ -0,0 +1,26 @@ +# PEP 758 allows unparenthesized exception types when there is no `as` clause. +# Every name below is used as an exception type, so no import here is unused. +# `NeverUsed` is imported and never used, and is the one expected result. +# +# Each name appears in exactly one clause on purpose: a name that also appeared +# in a parenthesized clause would be a use regardless, and would mask the +# behaviour under test. +# +# This file deliberately contains no `except A, B, C:` clause. Three or more +# unparenthesized types fail the default parser, which sends the whole file to +# the tree-sitter parser and would likewise mask it. +from relaxed_except_defs import Alpha, Beta, Delta, Gamma, NeverUsed + + +def unparenthesized(): + try: + pass + except Alpha, Beta: + raise + + +def parenthesized(): + try: + pass + except (Gamma, Delta): + raise diff --git a/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py b/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py new file mode 100644 index 000000000000..1c6e63828666 --- /dev/null +++ b/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py @@ -0,0 +1,26 @@ +class Alpha(Exception): + pass + + +class Beta(Exception): + pass + + +class Gamma(Exception): + pass + + +class Delta(Exception): + pass + + +class Epsilon(Exception): + pass + + +class NeverUsed(Exception): + pass + + +class Zeta(Exception): + pass diff --git a/python/ql/test/query-tests/Imports/unused/relaxed_except_long.py b/python/ql/test/query-tests/Imports/unused/relaxed_except_long.py new file mode 100644 index 000000000000..cadecb48cd3c --- /dev/null +++ b/python/ql/test/query-tests/Imports/unused/relaxed_except_long.py @@ -0,0 +1,17 @@ +# Three or more unparenthesized exception types. These fail the default parser +# and are extracted by the tree-sitter parser instead; all names are still uses. +from relaxed_except_defs import Delta, Epsilon, Gamma, Zeta + + +def three(): + try: + pass + except Gamma, Delta, Epsilon: + raise + + +def four(): + try: + pass + except Gamma, Delta, Epsilon, Zeta: + raise From 04790c95d5823d5a2f69a43bd05e46dbb08fbaff Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 13 Aug 2026 11:49:49 +0200 Subject: [PATCH 041/181] C#: Remove the explicit feed timeout fallback. --- .../NugetPackageRestorer.cs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index aeedbc176867..9ff4760ed396 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -129,17 +129,6 @@ public HashSet Restore() var allExplicitReachable = explicitFeeds.Count == feedManager.ReachableExplicitFeeds.Count; EmitUnreachableFeedsDiagnostics(allExplicitReachable); - - if (feedManager.ExplicitFeedTimeout) - { - // If we experience a timeout, we use this fallback. - // todo: we could also check the reachability of the inherited nuget feeds, but to use those in the fallback we would need to handle authentication too. - var unresponsiveMissingPackageLocation = DownloadMissingPackages([]); - return unresponsiveMissingPackageLocation is null - ? [] - : [unresponsiveMissingPackageLocation]; - } - } try From 71377e7d7bcec95a89703fcd06f366594f6fcbbd Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 13 Aug 2026 12:44:27 +0200 Subject: [PATCH 042/181] C#: Remove the timeout bool logic in the feed manager. --- .../FeedManager.cs | 52 +++++-------------- 1 file changed, 13 insertions(+), 39 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 1d5523a983cb..0cbf106df38a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -60,17 +60,12 @@ internal sealed partial class FeedManager : IDisposable /// public ImmutableHashSet InheritedFeeds => AllFeeds.Except(ExplicitFeeds).ToImmutableHashSet(); - private readonly Lazy<(bool, ImmutableHashSet)> lazyReachableExplicitFeeds; - - /// - /// Gets whether there was a timeout when checking the reachability of the explicitly configured NuGet feeds. - /// - public bool ExplicitFeedTimeout => lazyReachableExplicitFeeds.Value.Item1; + private readonly Lazy> lazyReachableExplicitFeeds; /// /// Gets the list of reachable NuGet feeds that are explicitly configured. /// - public ImmutableHashSet ReachableExplicitFeeds => lazyReachableExplicitFeeds.Value.Item2; + public ImmutableHashSet ReachableExplicitFeeds => lazyReachableExplicitFeeds.Value; private readonly Lazy> lazyReachableFeeds; /// @@ -96,15 +91,11 @@ public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotPr lazyExplicitFeeds = new Lazy>(GetExplicitFeeds); lazyAllFeeds = new Lazy>(GetAllFeeds); - lazyReachableExplicitFeeds = new Lazy<(bool, ImmutableHashSet)>(() => - { - var timeout = CheckSpecifiedFeeds(ExplicitFeeds, out var reachableFeeds); - return (timeout, reachableFeeds); - }); + lazyReachableExplicitFeeds = new Lazy>(() => CheckSpecifiedFeeds(ExplicitFeeds)); lazyReachableFeeds = new Lazy>(() => { // Inherited feeds should only be used, if they are indeed reachable (as they may be environment specific). - CheckSpecifiedFeeds(InheritedFeeds, out var reachableInheritedFeeds); + var reachableInheritedFeeds = CheckSpecifiedFeeds(InheritedFeeds); return ReachableExplicitFeeds.Union(reachableInheritedFeeds).ToImmutableHashSet(); }); lazyReachableFallbackFeeds = new Lazy>(() => @@ -271,7 +262,7 @@ private static async Task ExecuteGetRequest(string address, return await httpClient.GetAsync(address, HttpCompletionOption.ResponseHeadersRead, cancellationToken); } - private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount, out bool isTimeout) + private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount) { logger.LogInfo($"Checking if NuGet feed '{feed}' is reachable..."); @@ -304,8 +295,6 @@ private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount, using HttpClient client = new(httpClientHandler); - isTimeout = false; - for (var i = 0; i < tryCount; i++) { using var cts = new CancellationTokenSource(); @@ -335,7 +324,6 @@ private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount, } logger.LogWarning($"Didn't receive answer from NuGet feed '{feed}'. Tried it {tryCount} times."); - isTimeout = true; return false; } @@ -359,12 +347,8 @@ private HashSet GetExcludedFeeds() /// Checks that we can connect to the specified NuGet feeds. /// /// The set of package feeds to check. - /// The list of feeds that were reachable. - /// - /// True if there is a timeout when trying to reach the feeds (excluding any feeds that are configured - /// to be excluded from the check) or false otherwise. - /// - private bool CheckSpecifiedFeeds(ImmutableHashSet feeds, out ImmutableHashSet reachableFeeds) + /// The list of feeds that were reachable. + private ImmutableHashSet CheckSpecifiedFeeds(ImmutableHashSet feeds) { // Exclude any feeds from the feed check that are configured by the corresponding environment variable. // These feeds are always assumed to be reachable. @@ -380,12 +364,10 @@ private bool CheckSpecifiedFeeds(ImmutableHashSet feeds, out ImmutableHa return true; }).ToHashSet(); - var reachable = GetReachableNuGetFeeds(feedsToCheck, isFallback: false, out var isTimeout); + var reachable = GetReachableNuGetFeeds(feedsToCheck, isFallback: false); // Always consider feeds excluded for the reachability check as reachable. - reachableFeeds = reachable.Union(feeds.Where(feed => excludedFeeds.Contains(feed))).ToImmutableHashSet(); - - return isTimeout; + return reachable.Union(feeds.Where(feed => excludedFeeds.Contains(feed))).ToImmutableHashSet(); } /// @@ -398,7 +380,7 @@ public bool IsDefaultFeedReachable() if (CheckNugetFeedResponsiveness) { var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback: false); - return IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount, out var _); + return IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount); } return true; @@ -409,22 +391,15 @@ public bool IsDefaultFeedReachable() /// /// The feeds to check. /// Whether the feeds are fallback feeds or not. - /// Whether a timeout occurred while checking the feeds. /// The list of feeds that could be reached. - private List GetReachableNuGetFeeds(HashSet feedsToCheck, bool isFallback, out bool isTimeout) + private List GetReachableNuGetFeeds(HashSet feedsToCheck, bool isFallback) { var fallbackStr = isFallback ? "fallback " : ""; logger.LogInfo($"Checking {fallbackStr}NuGet feed reachability on feeds: {string.Join(", ", feedsToCheck.OrderBy(f => f))}"); var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback); - var timeout = false; var reachableFeeds = feedsToCheck - .Where(feed => - { - var reachable = IsFeedReachable(feed, initialTimeout, tryCount, out var feedTimeout); - timeout |= feedTimeout; - return reachable; - }) + .Where(feed => IsFeedReachable(feed, initialTimeout, tryCount)) .ToList(); if (reachableFeeds.Count == 0) @@ -436,7 +411,6 @@ private List GetReachableNuGetFeeds(HashSet feedsToCheck, bool i logger.LogInfo($"Reachable {fallbackStr}NuGet feeds: {string.Join(", ", reachableFeeds.OrderBy(f => f))}"); } - isTimeout = timeout; return reachableFeeds; } @@ -460,7 +434,7 @@ private List GetReachableFallbackNugetFeeds() } } - return GetReachableNuGetFeeds(fallbackFeeds, isFallback: true, out var _); + return GetReachableNuGetFeeds(fallbackFeeds, isFallback: true); } private ImmutableHashSet GetExplicitFeeds() From 984061fbe38448b503b24f7d2e84806050927afe Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 13 Aug 2026 15:25:16 +0200 Subject: [PATCH 043/181] C#: Update integration tests. --- .../CompilationInfo.expected | 7 +++++++ .../CompilationInfo.expected | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected index 5a7abcf543c8..4acd4f54e8a6 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected @@ -1,4 +1,8 @@ | All NuGet feeds reachable | 0.0 | +| Failed project restore with missing package error | 1.0 | +| Failed project restore with package source error | 0.0 | +| Failed solution restore with missing package error | 0.0 | +| Failed solution restore with package source error | 0.0 | | Fallback nuget restore | 1.0 | | Inherited NuGet feed count | 1.0 | | NuGet feed responsiveness checked | 1.0 | @@ -7,10 +11,13 @@ | Resolved assembly conflicts | 7.0 | | Resource extraction enabled | 0.0 | | Restored .NET framework variants | 0.0 | +| Restored projects through solution files | 0.0 | | Solution files on filesystem | 1.0 | | Source files generated | 0.0 | | Source files on filesystem | 1.0 | | Successfully ran fallback nuget restore | 1.0 | +| Successfully restored project files | 0.0 | +| Successfully restored solution files | 1.0 | | Unresolved references | 0.0 | | UseWPF set | 0.0 | | UseWindowsForms set | 0.0 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected index 9cc03f2f5372..d421cfc42e1a 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected @@ -1,4 +1,8 @@ | All NuGet feeds reachable | 0.0 | +| Failed project restore with missing package error | 1.0 | +| Failed project restore with package source error | 0.0 | +| Failed solution restore with missing package error | 0.0 | +| Failed solution restore with package source error | 0.0 | | Fallback nuget restore | 1.0 | | Inherited NuGet feed count | 1.0 | | NuGet feed responsiveness checked | 1.0 | @@ -7,10 +11,13 @@ | Resolved assembly conflicts | 7.0 | | Resource extraction enabled | 0.0 | | Restored .NET framework variants | 0.0 | +| Restored projects through solution files | 0.0 | | Solution files on filesystem | 1.0 | | Source files generated | 0.0 | | Source files on filesystem | 1.0 | | Successfully ran fallback nuget restore | 1.0 | +| Successfully restored project files | 0.0 | +| Successfully restored solution files | 1.0 | | Unresolved references | 0.0 | | UseWPF set | 0.0 | | UseWindowsForms set | 0.0 | From 04b546cae8cfdf6eb269241c9eaa1b1308846a56 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Wed, 19 Aug 2026 15:09:39 +0200 Subject: [PATCH 044/181] C#: Remove some dead code. --- .../NugetPackageRestorer.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 9ff4760ed396..38924e2f876e 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -614,14 +614,6 @@ public void Dispose() feedManager.Dispose(); } - /// - /// Returns the full path to a temporary directory with the given subfolder name. - /// - private static string ComputeTempDirectoryPath(string subfolderName) - { - return Path.Join(FileUtils.GetTemporaryWorkingDirectory(out _), subfolderName); - } - /// /// Computes a unique temporary directory path based on the source directory and the subfolder name. /// From 8a747a63fbdf18d0fe02d346ff6e66758a90b22b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 20 Aug 2026 11:35:20 +0200 Subject: [PATCH 045/181] C#: Add change-note. --- csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md diff --git a/csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md b/csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md new file mode 100644 index 000000000000..9bd47c960e18 --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-08-20-dotnet-restore.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* In `build-mode: none`, project and solution restoration is now always attempted using the feeds available. From 360aec3a0249d8c2260db934b14cfec6d4154220 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 11 Aug 2026 10:59:33 +0200 Subject: [PATCH 046/181] unified: Add meta and diagmetric queries for static name binding --- shared/util/codeql/util/ReportStats.qll | 37 +++++++++++ .../unified/internal/AnalysisQuality.qll | 61 +++++++++++++++++++ .../ql/src/diagnostic/ExtractorInformation.ql | 24 ++++++++ .../FilesCoveredByModuleManifest.ql | 18 ++++++ .../ql/src/diagnostic/StaticNameResolution.ql | 17 ++++++ 5 files changed, 157 insertions(+) create mode 100644 unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll create mode 100644 unified/ql/src/diagnostic/ExtractorInformation.ql create mode 100644 unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql create mode 100644 unified/ql/src/diagnostic/StaticNameResolution.ql diff --git a/shared/util/codeql/util/ReportStats.qll b/shared/util/codeql/util/ReportStats.qll index 947eff548e75..10157d95c006 100644 --- a/shared/util/codeql/util/ReportStats.qll +++ b/shared/util/codeql/util/ReportStats.qll @@ -29,4 +29,41 @@ module ReportStats { value = Stats::getNumberOfOk() * 100.0 / (Stats::getNumberOfOk() + Stats::getNumberOfNotOk()) and key = "Percentage of " + Stats::getOkText() } + + predicate keyValuePair(string key, float value) { + numberOfOk(key, value) or + numberOfNotOk(key, value) or + percentageOfOk(key, value) + } +} + +/** + * Stats where each Ok/NotOk occurrence has an associated entity. + */ +signature module EntityStatsSig { + class Candidate { + predicate isOk(); + } + + string getOkText(); + + string getNotOkText(); +} + +module EntityReportStats { + private import Input + + private module StatsInput implements StatsSig { + int getNumberOfOk() { result = count(Candidate c | c.isOk()) } + + int getNumberOfNotOk() { result = count(Candidate c | not c.isOk()) } + + import Input + } + + import StatsInput + + private module ScalarReport = ReportStats; + + import ScalarReport } diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll new file mode 100644 index 000000000000..a10257ed8326 --- /dev/null +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -0,0 +1,61 @@ +private import unified +private import codeql.util.ReportStats +private import codeql.unified.internal.StaticNameBinding +private import codeql.unified.internal.LocalNameBinding +private import codeql.unified.internal.NameBindingPlugin + +/** Stats about identifiers that static name binding could resolve. */ +module StaticNameResolutionStats implements EntityStatsSig { + class Candidate extends Identifier { + Candidate() { + this = getIdentifierFromRef(_) and + not this instanceof NameDeclaration + // TODO: exclude names we know are not static references, e.g. unqualified instance-field access, + // currently blocked on getting static name binding to report this information. + } + + NameBindingNode getTarget() { + ( + exists(NameDeclaration decl | + result.isIdentifier(decl) and + trackNameDeclaration(decl).isIdentifier(this) + ) + or + result.isModuleScopeNode(_) and + result.(NamespaceNode).ref().isIdentifier(this) + ) and + // Do not consider a type extension to be a valid target + // TODO: Fix in the AST mapping: type extensions should reference their type, not declare it + not exists(ClassLikeDeclaration cls | + cls.hasModifier("extension") and + result.isIdentifier(cls.getName()) + ) + } + + predicate isOk() { exists(this.getTarget()) } + } + + string getOkText() { result = "statically resolvable names" } + + string getNotOkText() { result = "statically unresolvable names" } +} + +module StaticNameResolutionStatsReport = EntityReportStats; + +/** Stats about which files are covered by a module manifest. */ +module FilesCoveredByModuleManifestStats implements EntityStatsSig { + class Candidate extends File { + Candidate() { this.getExtension() = "swift" } + + ModuleScopeRepr getAModule() { result.getAnIncludedFile() = this } + + predicate isOk() { exists(this.getAModule()) } + } + + string getOkText() { result = "files covered by a module manifest" } + + string getNotOkText() { result = "files not covered by any module manifest" } +} + +module FilesCoveredByModuleManifestStatsReport = + EntityReportStats; diff --git a/unified/ql/src/diagnostic/ExtractorInformation.ql b/unified/ql/src/diagnostic/ExtractorInformation.ql new file mode 100644 index 000000000000..37469504b617 --- /dev/null +++ b/unified/ql/src/diagnostic/ExtractorInformation.ql @@ -0,0 +1,24 @@ +/** + * @name Unified extractor/analysis information + * @description Information about the extraction and analysis for a database + * @kind metric + * @tags summary telemetry + * @id unified/telemetry/extraction-information + */ + +private import unified +private import codeql.unified.internal.AnalysisQuality + +from string key, float value +where + ( + StaticNameResolutionStatsReport::keyValuePair(key, value) or + FilesCoveredByModuleManifestStatsReport::keyValuePair(key, value) + ) and + /* Infinity */ + value != 1.0 / 0.0 and + /* -Infinity */ + value != -1.0 / 0.0 and + /* NaN */ + value != 0.0 / 0.0 +select key, value diff --git a/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql b/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql new file mode 100644 index 000000000000..b426b6c06786 --- /dev/null +++ b/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql @@ -0,0 +1,18 @@ +/** + * @name Files covered by module manifest + * @description Files that are included from a module manifest + * @kind problem + * @problem.severity recommendation + * @id unified/diagnostic/files-covered-by-module-manifest + * @tags meta + * @precision very-low + */ + +import unified +import codeql.unified.internal.StaticNameBinding +import codeql.unified.internal.NameBindingPlugin +import codeql.unified.internal.AnalysisQuality + +from FilesCoveredByModuleManifestStats::Candidate c, ModuleScopeRepr mod +where c.isOk() and mod = c.getAModule() +select c, "File included in $@", mod, mod.toString() diff --git a/unified/ql/src/diagnostic/StaticNameResolution.ql b/unified/ql/src/diagnostic/StaticNameResolution.ql new file mode 100644 index 000000000000..a49ba94791b6 --- /dev/null +++ b/unified/ql/src/diagnostic/StaticNameResolution.ql @@ -0,0 +1,17 @@ +/** + * @name Static name resolution + * @description Static name references that could be resolved to a target + * @kind problem + * @problem.severity recommendation + * @id unified/diagnostic/static-name-resolution + * @tags meta + * @precision very-low + */ + +import unified +import codeql.unified.internal.StaticNameBinding +import codeql.unified.internal.AnalysisQuality + +from StaticNameResolutionStats::Candidate c, NameBindingNode target +where target = c.getTarget() +select c, "Resolved to $@", target, target.toString() From 0a2b80a15fdfdb9f28a09ec0f974c3e2f51a329c Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 12 Aug 2026 11:45:03 +0200 Subject: [PATCH 047/181] unified: Add folder-based fallback heuristic --- .../unified/internal/StaticNameBinding.qll | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 907cc9f14010..ca9cca2fc61a 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -16,6 +16,7 @@ private newtype TNameBindingNode = n instanceof ClassLikeDeclaration } or TModuleScope(ModuleScopeRepr repr) or + TFolderScope(Folder folder) or TModuleRoot() /** @@ -39,6 +40,9 @@ class NameBindingNode extends TNameBindingNode { /** Holds if this represents the given module scope. */ predicate isModuleScopeNode(ModuleScopeRepr repr) { this = TModuleScope(repr) } + /** Holds if this represents the set of members that can be accessed unqualified within the given folder and subfolders. */ + predicate isFolderScope(Folder folder) { this = TFolderScope(folder) } + /** Holds if this represents the root namespace in which all named modules are members. */ predicate isModuleRoot() { this = TModuleRoot() } @@ -76,6 +80,8 @@ class NameBindingNode extends TNameBindingNode { this.isModuleScopeNode(repr) and result = "ModuleScope(" + repr + ")" ) or + exists(Folder folder | this.isFolderScope(folder) and result = "FolderScope(" + folder + ")") + or this.isModuleRoot() and result = "ModuleRoot" } @@ -173,6 +179,8 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { mod.hasImportableName(name) and node2.isModuleRoot() ) + or + FolderHeuristic::storeStep(node1, name, node2) } predicate valueStep(NameBindingNode node1, NameBindingNode node2) { @@ -224,6 +232,8 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { node1 = getNodeFromRef(p) and node2 = getNodeFromRef(p.getSubPattern()) ) + or + FolderHeuristic::valueStep(node1, node2) } private predicate isImportPrefix(Expr e) { @@ -403,3 +413,96 @@ module DebugGraph { ) } } + +/** + * Implements a folder-based heuristic to linking up top-level names + * between files that are not included in any module scope. + */ +private module FolderHeuristic { + private predicate topLevelNameDef(File file, string name, NameBindingNode node) { + exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | + top.getFile() = file and + stmt = top.getBody().getAStmt() and + not stmt.(ClassLikeDeclaration).hasModifier("extension") and // TODO: target of type extensions should not be seen as a NameDeclaration + not isPrivateToLocalScope(nameDecl) and + nameDecl.getDeclaration() = stmt and + name = nameDecl.getName() and + node.isIdentifier(nameDecl) + ) + } + + private predicate uniqueTopLevelName(File file, string name) { + file = unique(File f | topLevelNameDef(f, name, _)) + } + + /** + * Holds if `file` has a one of the definitions of the given ambiguous name. + * + * A name is considered "ambiguous" if there is more than one file exporting it. + */ + private predicate ambiguousTopLevelName(File file, string name) { + topLevelNameDef(file, name, _) and + not uniqueTopLevelName(file, name) + } + + /** Holds if `folder` contains one or more definitions of the given ambiguous name */ + private predicate containsDef(Folder folder, string name) { + exists(File f | + ambiguousTopLevelName(f, name) and + folder = f.getParentContainer+() + ) + } + + /** + * Holds if `folder` has two or more subfolders containing a definition of `name`. + */ + private predicate hasConflictingDefs(Folder folder, string name) { + containsDef(folder, name) and + not exists(unique(Folder child | child = folder.getAFolder() and containsDef(child, name))) + } + + /** + * Holds if `folder` is an outermost folder containing exactly one definition of `name`. + * + * This means `folder` should act as the scope of that definition. + */ + private predicate isOutermostNonConflictingScope(Folder folder, string name) { + containsDef(folder, name) and + hasConflictingDefs(folder.getParentContainer(), name) and + not hasConflictingDefs(folder, name) + } + + /** + * Gets the scope into which a definition of `name` appearing in `folder` should target. + */ + private Folder getOutermostNonConflictingScope(Folder folder, string name) { + isOutermostNonConflictingScope(folder, name) and + result = folder + or + result = getOutermostNonConflictingScope(folder.getParentContainer(), name) and + not isOutermostNonConflictingScope(folder, name) and + containsDef(folder, name) // Prune to the subfolder actually containing the definition + } + + predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { + exists(File file | topLevelNameDef(file, name, node1) | + node2.isFolderScope(getOutermostNonConflictingScope(file.getParentContainer(), name)) + or + uniqueTopLevelName(file, name) and + node2.isFolderScope(any(Folder f | f.getRelativePath() = "")) + ) + } + + predicate valueStep(NameBindingNode node1, NameBindingNode node2) { + exists(TopLevel top | + node1.isFolderScope(top.getFile().getParentContainer()) and + node2.isLocalNamespace(top.getBody()) and + not top.getFile() = any(ModuleScopeRepr r).getAnIncludedFile() + ) + or + exists(Folder folder | + node1.isFolderScope(folder.getParentContainer()) and + node2.isFolderScope(folder) + ) + } +} From 468d392fd74b9304590f1f5e87dca2621e8b9272 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 13:41:25 +0200 Subject: [PATCH 048/181] unified: Add test exercising folder-based heuristic --- .../not-a-package/Main/Drivers/Driver.swift | 4 ++++ .../static-name-binding/not-a-package/Main/Runner.swift | 5 +++++ .../static-name-binding/not-a-package/Main/Util/Util.swift | 3 +++ .../not-a-package/Mock/Drivers/Driver.swift | 4 ++++ .../static-name-binding/not-a-package/Mock/Runner.swift | 5 +++++ .../static-name-binding/not-a-package/Mock/Util/Util.swift | 3 +++ 6 files changed, 24 insertions(+) create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Util/Util.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Util/Util.swift diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift new file mode 100644 index 000000000000..0b9dea4e773e --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift @@ -0,0 +1,4 @@ +class Driver { // name=Main.Driver +} + +class UniqueToMain {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift new file mode 100644 index 000000000000..19589ab35cba --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift @@ -0,0 +1,5 @@ +func main() { + Driver(); // $ access=Main.Driver + UniqueToMain(); // $ access=UniqueToMain + UniqueToMock(); // $ access=UniqueToMock +} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Util/Util.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Util/Util.swift new file mode 100644 index 000000000000..adc7a3004127 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Util/Util.swift @@ -0,0 +1,3 @@ +func getDriver() -> Driver { // $ access=Main.Driver + return Driver() // $ access=Main.Driver +} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift new file mode 100644 index 000000000000..e3b5d0a789cf --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift @@ -0,0 +1,4 @@ +class Driver { // name=Mock.Driver +} + +class UniqueToMock {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift new file mode 100644 index 000000000000..06712f12b2b7 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift @@ -0,0 +1,5 @@ +func main() { + Driver(); // $ access=Mock.Driver + UniqueToMain(); // $ access=UniqueToMain + UniqueToMock(); // $ access=UniqueToMock +} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Util/Util.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Util/Util.swift new file mode 100644 index 000000000000..1d83c82c4f9d --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Util/Util.swift @@ -0,0 +1,3 @@ +func getDriver() -> Driver { // $ access=Mock.Driver + return Driver() // $ access=Mock.Driver +} From a143d2c03e20ed380851af1ef8b3d323c0499691 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 13:42:09 +0200 Subject: [PATCH 049/181] unified: Record spurious result from lack of shadowing The spurious result is offered by the folder-based heuristic, but would have been blocked by proper shadowing support. --- .../library-tests/static-name-binding/unqualified-access.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift index 732e65563b3b..86cadc0b7a1f 100644 --- a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift +++ b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift @@ -10,7 +10,7 @@ class ASub : A { // $ access=A class BSub : B { // $ access=A.B let x3: B = nil; // $ access=A.B - let x4: C = nil; // $ access=A.B.C + let x4: C = nil; // $ access=A.B.C SPURIOUS: access=Target3.C // spurious result from folder-based heuristic } class BSub2 : B { // $ access=A.B From eb9d80b49fb34fd188aa1502e8258c11142c741d Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 13 Aug 2026 13:51:40 +0200 Subject: [PATCH 050/181] unified: Add test with inheritance+nested classes Inheritance and access to nested classes is one of the reasons not to apply the heuristic as a "fixup" after the recursive layer, because when a base class is resolved through the folder heuristic, access to nested members still need to be resolved through the standard logic. --- .../not-a-package/Main/Drivers/Driver.swift | 1 + .../static-name-binding/not-a-package/Main/Runner.swift | 5 +++++ .../not-a-package/Mock/Drivers/Driver.swift | 1 + .../static-name-binding/not-a-package/Mock/Runner.swift | 5 +++++ 4 files changed, 12 insertions(+) diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift index 0b9dea4e773e..4b41a6324afb 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Drivers/Driver.swift @@ -1,4 +1,5 @@ class Driver { // name=Main.Driver + class Nested {} // name=Main.Driver.Nested } class UniqueToMain {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift index 19589ab35cba..894e6257dbb1 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Main/Runner.swift @@ -1,5 +1,10 @@ func main() { Driver(); // $ access=Main.Driver + Driver.Nested(); // $ access=Main.Driver access=Main.Driver.Nested UniqueToMain(); // $ access=UniqueToMain UniqueToMock(); // $ access=UniqueToMock } + +class MyDriver: Driver { // $ access=Main.Driver + class B: Nested {} // $ access=Main.Driver.Nested +} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift index e3b5d0a789cf..75d9e81affe5 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Drivers/Driver.swift @@ -1,4 +1,5 @@ class Driver { // name=Mock.Driver + class Nested {} // name=Mock.Driver.Nested } class UniqueToMock {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift index 06712f12b2b7..930301ab9015 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/Mock/Runner.swift @@ -1,5 +1,10 @@ func main() { Driver(); // $ access=Mock.Driver + Driver.Nested(); // $ access=Mock.Driver access=Mock.Driver.Nested UniqueToMain(); // $ access=UniqueToMain UniqueToMock(); // $ access=UniqueToMock } + +class MyDriver: Driver { // $ access=Mock.Driver + class B: Nested {} // $ access=Mock.Driver.Nested +} From b6741aad142080ccab6849fcec24a46c7498a9e9 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 14 Aug 2026 09:54:56 +0200 Subject: [PATCH 051/181] unified: Add some same-folder tests --- .../not-a-package/SiblingFiles/Def1.swift | 3 +++ .../not-a-package/SiblingFiles/Def2.swift | 3 +++ .../not-a-package/SiblingFiles/SubFolder1/Def.swift | 3 +++ .../not-a-package/SiblingFiles/SubFolder2/Def.swift | 3 +++ .../not-a-package/SiblingFiles/Use.swift | 9 +++++++++ 5 files changed, 21 insertions(+) create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def1.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def2.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Use.swift diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def1.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def1.swift new file mode 100644 index 000000000000..6edb39c550d7 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def1.swift @@ -0,0 +1,3 @@ +class DeclaredTwiceInSameFolder {} // name=Def1.DeclaredTwiceInSameFolder + +class OnlyInDef1 {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def2.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def2.swift new file mode 100644 index 000000000000..f41e33bc34bb --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Def2.swift @@ -0,0 +1,3 @@ +class DeclaredTwiceInSameFolder {} // name=Def2.DeclaredTwiceInSameFolder + +class OnlyInDef2 {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift new file mode 100644 index 000000000000..139c0d2ab378 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift @@ -0,0 +1,3 @@ +class DeclaredTwiceInSubFolder {} // name=Subfolder2.DeclaredTwiceInSubFolder + +class OnlyInSubFolder2 {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift new file mode 100644 index 000000000000..07e2510e5cd1 --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift @@ -0,0 +1,3 @@ +class DeclaredTwiceInSubFolder {} // name=Subfolder1.DeclaredTwiceInSubFolder + +class OnlyInSubFolder1 {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Use.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Use.swift new file mode 100644 index 000000000000..897386e9e93e --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/Use.swift @@ -0,0 +1,9 @@ +private protocol P { + let x1: DeclaredTwiceInSameFolder; // unresolved; ambiguous reference + let x2: OnlyInDef1; // $ access=OnlyInDef1 + let x3: OnlyInDef2; // $ access=OnlyInDef2 + + let x4: DeclaredTwiceInSubFolder; // unresolved; ambiguous reference + let x5: OnlyInSubFolder1; // $ access=OnlyInSubFolder1 + let x6: OnlyInSubFolder2; // $ access=OnlyInSubFolder2 +} From b52ffdc78ab2ab69dcfddec7dc5045b728ffc7b7 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 20 Aug 2026 14:35:28 +0200 Subject: [PATCH 052/181] unified: Satisfy ql4ql warning --- unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql | 2 +- unified/ql/src/diagnostic/StaticNameResolution.ql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql b/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql index b426b6c06786..6ac4cec641bd 100644 --- a/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql +++ b/unified/ql/src/diagnostic/FilesCoveredByModuleManifest.ql @@ -15,4 +15,4 @@ import codeql.unified.internal.AnalysisQuality from FilesCoveredByModuleManifestStats::Candidate c, ModuleScopeRepr mod where c.isOk() and mod = c.getAModule() -select c, "File included in $@", mod, mod.toString() +select c, "File included in $@.", mod, mod.toString() diff --git a/unified/ql/src/diagnostic/StaticNameResolution.ql b/unified/ql/src/diagnostic/StaticNameResolution.ql index a49ba94791b6..501c39126e54 100644 --- a/unified/ql/src/diagnostic/StaticNameResolution.ql +++ b/unified/ql/src/diagnostic/StaticNameResolution.ql @@ -14,4 +14,4 @@ import codeql.unified.internal.AnalysisQuality from StaticNameResolutionStats::Candidate c, NameBindingNode target where target = c.getTarget() -select c, "Resolved to $@", target, target.toString() +select c, "Resolved to $@.", target, target.toString() From 420769740a8dea8acbad2ed34bc749f84d0e01a0 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 20 Aug 2026 14:44:53 +0200 Subject: [PATCH 053/181] unified: Fix accidentally swapped def names --- .../not-a-package/SiblingFiles/SubFolder1/Def.swift | 2 +- .../not-a-package/SiblingFiles/SubFolder2/Def.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift index 139c0d2ab378..3e5ce0ba952f 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Def.swift @@ -1,3 +1,3 @@ -class DeclaredTwiceInSubFolder {} // name=Subfolder2.DeclaredTwiceInSubFolder +class DeclaredTwiceInSubFolder {} // name=Subfolder1.DeclaredTwiceInSubFolder class OnlyInSubFolder2 {} diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift index 07e2510e5cd1..b82b472f39f6 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder2/Def.swift @@ -1,3 +1,3 @@ -class DeclaredTwiceInSubFolder {} // name=Subfolder1.DeclaredTwiceInSubFolder +class DeclaredTwiceInSubFolder {} // name=Subfolder2.DeclaredTwiceInSubFolder class OnlyInSubFolder1 {} From 771130a57d6bb25708a7caadd9843c44b1b30340 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 20 Aug 2026 14:46:18 +0200 Subject: [PATCH 054/181] unified: Add a test showing FN for same-folder ref --- .../not-a-package/SiblingFiles/SubFolder1/Use.swift | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift new file mode 100644 index 000000000000..cada63b4ca4e --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift @@ -0,0 +1,5 @@ +private protocol P { + let x4: DeclaredTwiceInSubFolder; // $ MISSING: access=Subfolder1.DeclaredTwiceInSubFolder + let x5: OnlyInSubFolder1; // $ access=OnlyInSubFolder1 + let x6: OnlyInSubFolder2; // $ access=OnlyInSubFolder2 +} From 42c07b37451377858666e8716b60c1ceef022f83 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 20 Aug 2026 14:47:33 +0200 Subject: [PATCH 055/181] Rust: Exclude 'unused variable' results for functions containing `todo!()` or `unimplemented!()` --- rust/ql/src/queries/unusedentities/UnusedVariable.qll | 9 +++++++-- rust/ql/test/query-tests/unusedentities/main.rs | 8 ++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/rust/ql/src/queries/unusedentities/UnusedVariable.qll b/rust/ql/src/queries/unusedentities/UnusedVariable.qll index 744af559dd2a..22070162d78a 100644 --- a/rust/ql/src/queries/unusedentities/UnusedVariable.qll +++ b/rust/ql/src/queries/unusedentities/UnusedVariable.qll @@ -1,4 +1,5 @@ import rust +private import codeql.rust.internal.PathResolution /** * A deliberately unused variable, for example `_` or `_x`. @@ -23,9 +24,13 @@ predicate isUnused(Variable v) { */ class IncompleteCallable extends Callable { IncompleteCallable() { - exists(MacroExpr me | - me.getEnclosingCallable() = this and + exists(MacroExpr me | me.getEnclosingCallable() = this | not me.getMacroCall().hasMacroCallExpansion() + or + exists(ItemNode i | + i.getCanonicalPath(_) = ["core::macros::unimplemented", "core::macros::todo"] and + me.getMacroCall().resolveMacro() = i + ) ) } } diff --git a/rust/ql/test/query-tests/unusedentities/main.rs b/rust/ql/test/query-tests/unusedentities/main.rs index a08a05a83bde..3f89e1d79155 100644 --- a/rust/ql/test/query-tests/unusedentities/main.rs +++ b/rust/ql/test/query-tests/unusedentities/main.rs @@ -558,6 +558,14 @@ trait MyTrait { fn my_func2(&self, x: i32) -> i32; } +fn unimplemented(x : i32) { + unimplemented!() +} + +fn todo(x : i32) { + todo!() +} + // --- main --- fn main() { From e49a71242ddc0ae689026b34bb5c64628206cc31 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 20 Aug 2026 14:51:58 +0200 Subject: [PATCH 056/181] unified: Fix same-folder bug --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 ++ .../not-a-package/SiblingFiles/SubFolder1/Use.swift | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index ca9cca2fc61a..463c7a13f818 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -458,6 +458,8 @@ private module FolderHeuristic { */ private predicate hasConflictingDefs(Folder folder, string name) { containsDef(folder, name) and + // Check for "two or more" using `exists(X) and not exists(unique(X))` + containsDef(folder.getAFolder(), name) and not exists(unique(Folder child | child = folder.getAFolder() and containsDef(child, name))) } diff --git a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift index cada63b4ca4e..ac4305b455fc 100644 --- a/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift +++ b/unified/ql/test/library-tests/static-name-binding/not-a-package/SiblingFiles/SubFolder1/Use.swift @@ -1,5 +1,5 @@ private protocol P { - let x4: DeclaredTwiceInSubFolder; // $ MISSING: access=Subfolder1.DeclaredTwiceInSubFolder + let x4: DeclaredTwiceInSubFolder; // $ access=Subfolder1.DeclaredTwiceInSubFolder let x5: OnlyInSubFolder1; // $ access=OnlyInSubFolder1 let x6: OnlyInSubFolder2; // $ access=OnlyInSubFolder2 } From 1a89fe4802bff44046d873596820e69c709f0443 Mon Sep 17 00:00:00 2001 From: Asger F Date: Thu, 20 Aug 2026 14:58:08 +0200 Subject: [PATCH 057/181] unified: fix typo --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 463c7a13f818..a1334ff0cd1f 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -415,7 +415,7 @@ module DebugGraph { } /** - * Implements a folder-based heuristic to linking up top-level names + * Implements a folder-based heuristic for linking up top-level names * between files that are not included in any module scope. */ private module FolderHeuristic { From b1ab236ca7f4ab71b020e6ad88b5142aef4ef81f Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 24 Jun 2026 09:39:56 +0200 Subject: [PATCH 058/181] Ruby: Replace control flow graph with shared implementation. --- ruby/ql/consistency-queries/CfgConsistency.ql | 31 +- .../DataFlowConsistency.ql | 11 - ruby/ql/lib/codeql/ruby/CFG.qll | 1 - ruby/ql/lib/codeql/ruby/ast/Statement.qll | 9 +- .../codeql/ruby/ast/internal/Synthesis.qll | 4 + .../codeql/ruby/controlflow/BasicBlocks.qll | 314 ---- .../lib/codeql/ruby/controlflow/CfgNodes.qll | 394 +---- .../ruby/controlflow/ControlFlowGraph.qll | 535 +++++- .../ruby/controlflow/internal/Completion.qll | 565 ------ .../internal/ControlFlowGraphImpl.qll | 1510 ----------------- .../ruby/controlflow/internal/Guards.qll | 8 +- .../controlflow/internal/NonReturning.qll | 10 +- .../ruby/controlflow/internal/Splitting.qll | 348 ---- ruby/ql/lib/codeql/ruby/dataflow/SSA.qll | 15 +- .../dataflow/internal/DataFlowDispatch.qll | 4 +- .../dataflow/internal/DataFlowPrivate.qll | 29 +- .../codeql/ruby/dataflow/internal/SsaImpl.qll | 37 +- .../ql/lib/codeql/ruby/frameworks/Sinatra.qll | 2 +- .../ConditionalBypassCustomizations.qll | 4 +- .../ql/lib/ide-contextual-queries/printCfg.ql | 7 +- .../src/experimental/performance/UseDetect.ql | 12 +- .../performance/DatabaseQueryInLoop.ql | 2 +- .../src/queries/variables/DeadStoreOfLocal.ql | 7 +- .../controlflow/graph/BasicBlocks.ql | 9 +- .../library-tests/controlflow/graph/Cfg.ql | 2 +- .../dataflow/barrier-guards/barrier-guards.ql | 3 +- 26 files changed, 668 insertions(+), 3205 deletions(-) delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll delete mode 100644 ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll diff --git a/ruby/ql/consistency-queries/CfgConsistency.ql b/ruby/ql/consistency-queries/CfgConsistency.ql index 5af4f22fc26a..d67d67a8d3fd 100644 --- a/ruby/ql/consistency-queries/CfgConsistency.ql +++ b/ruby/ql/consistency-queries/CfgConsistency.ql @@ -1,31 +1,2 @@ -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::Consistency as Consistency -import Consistency -import codeql.ruby.AST import codeql.ruby.CFG -import codeql.ruby.controlflow.internal.Completion -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl - -/** - * All `Expr` nodes are `PostOrderTree`s - */ -query predicate nonPostOrderExpr(Expr e, string cls) { - cls = e.getPrimaryQlClasses() and - not exists(e.getDesugared()) and - not e instanceof BodyStmt and - exists(AstNode last, Completion c | - CfgImpl::last(e, last, c) and - last != e and - c instanceof NormalCompletion - ) -} - -query predicate scopeNoFirst(CfgScope scope) { - Consistency::scopeNoFirst(scope) and - not scope = any(StmtSequence seq | not exists(seq.getAStmt())) and - not scope = - any(Callable c | - not exists(c.getAParameter()) and - not c.getBody().hasEnsure() and - not exists(c.getBody().getARescue()) - ) -} +import ControlFlow::Consistency diff --git a/ruby/ql/consistency-queries/DataFlowConsistency.ql b/ruby/ql/consistency-queries/DataFlowConsistency.ql index 4e0588d5d4a1..de63a4309b5b 100644 --- a/ruby/ql/consistency-queries/DataFlowConsistency.ql +++ b/ruby/ql/consistency-queries/DataFlowConsistency.ql @@ -22,17 +22,6 @@ private module Input implements InputSig { not isNonConstantExpr(n.asExpr()) } - predicate multipleArgumentCallExclude(ArgumentNode arg, DataFlowCall call) { - // An argument such as `x` in `if not x then ...` has two successors (and hence - // two calls); one for each Boolean outcome of `x`. - exists(CfgNodes::ExprCfgNode n | - arg.argumentOf(call, _) and - n = call.asCall() and - arg.asExpr().getASuccessor(any(ConditionalSuccessor c)).getASuccessor*() = n and - n.getASplit() instanceof Split::ConditionalCompletionSplit - ) - } - predicate uniqueTypeExclude(Node n) { n = any(DataFlow::CallNode call | diff --git a/ruby/ql/lib/codeql/ruby/CFG.qll b/ruby/ql/lib/codeql/ruby/CFG.qll index d3401821f199..5fe7da86df05 100644 --- a/ruby/ql/lib/codeql/ruby/CFG.qll +++ b/ruby/ql/lib/codeql/ruby/CFG.qll @@ -3,4 +3,3 @@ import codeql.Locations import controlflow.ControlFlowGraph import controlflow.CfgNodes as CfgNodes -import controlflow.BasicBlocks diff --git a/ruby/ql/lib/codeql/ruby/ast/Statement.qll b/ruby/ql/lib/codeql/ruby/ast/Statement.qll index dcd51dbb3272..0081fd5d593e 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Statement.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Statement.qll @@ -6,7 +6,6 @@ private import codeql.ruby.CFG private import internal.AST private import internal.TreeSitter private import internal.Variable -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl /** * A statement. @@ -14,14 +13,14 @@ private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as CfgImpl * This is the root QL class for all statements. */ class Stmt extends AstNode, TStmt { + /** Gets the control-flow node for this statement, if any. */ + ControlFlowNode getControlFlowNode() { result.injects(this) } + /** Gets a control-flow node for this statement, if any. */ CfgNodes::AstCfgNode getAControlFlowNode() { result.getAstNode() = this } - /** Gets a control-flow entry node for this statement, if any */ - AstNode getAControlFlowEntryNode() { result = CfgImpl::getAControlFlowEntryNode(this) } - /** Gets the control-flow scope of this statement, if any. */ - CfgScope getCfgScope() { result = CfgImpl::getCfgScope(this) } + CfgScope getCfgScope() { result = getEnclosingCallable(this) } /** Gets the enclosing callable, if any. */ Callable getEnclosingCallable() { result = this.getCfgScope() } diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll index f05deae59623..0b45d26ef12a 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll @@ -833,6 +833,10 @@ private module AssignOperationDesugar { ) ) } + + final override predicate excludeFromControlFlowTree(AstNode n) { + n = any(ScopeResolutionAssignOperation sao).getLeftOperand() + } } /** An assignment operation where the left-hand side is a method call. */ diff --git a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll b/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll deleted file mode 100644 index e085dbd90a38..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/BasicBlocks.qll +++ /dev/null @@ -1,314 +0,0 @@ -/** Provides classes representing basic blocks. */ -overlay[local] -module; - -private import codeql.ruby.AST -private import codeql.ruby.ast.internal.AST -private import codeql.ruby.ast.internal.TreeSitter -private import codeql.ruby.controlflow.ControlFlowGraph -private import internal.ControlFlowGraphImpl as CfgImpl -private import CfgNodes -private import CfgImpl::BasicBlocks as BasicBlocksImpl -private import codeql.controlflow.BasicBlock as BB - -/** - * A basic block, that is, a maximal straight-line sequence of control flow nodes - * without branches or joins. - */ -final class BasicBlock extends BasicBlocksImpl::BasicBlock { - /** Gets an immediate successor of this basic block, if any. */ - BasicBlock getASuccessor() { result = super.getASuccessor() } - - /** Gets an immediate successor of this basic block of a given type, if any. */ - BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor(t) } - - /** Gets an immediate predecessor of this basic block, if any. */ - BasicBlock getAPredecessor() { result = super.getAPredecessor() } - - /** Gets an immediate predecessor of this basic block of a given type, if any. */ - BasicBlock getAPredecessor(SuccessorType t) { result = super.getAPredecessor(t) } - - // The overrides below are to use `CfgNode` instead of `CfgImpl::Node` - CfgNode getNode(int pos) { result = super.getNode(pos) } - - CfgNode getANode() { result = super.getANode() } - - /** Gets the first control flow node in this basic block. */ - CfgNode getFirstNode() { result = super.getFirstNode() } - - /** Gets the last control flow node in this basic block. */ - CfgNode getLastNode() { result = super.getLastNode() } - - /** - * Holds if this basic block immediately dominates basic block `bb`. - * - * That is, this basic block is the unique basic block satisfying: - * 1. This basic block strictly dominates `bb` - * 2. There exists no other basic block that is strictly dominated by this - * basic block and which strictly dominates `bb`. - * - * All basic blocks, except entry basic blocks, have a unique immediate - * dominator. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 immediately dominates the - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate immediatelyDominates(BasicBlock bb) { super.immediatelyDominates(bb) } - - /** - * Holds if this basic block strictly dominates basic block `bb`. - * - * That is, all paths reaching basic block `bb` from some entry point - * basic block must go through this basic block (which must be different - * from `bb`). - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 strictly dominates the - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) } - - /** - * Holds if this basic block dominates basic block `bb`. - * - * That is, all paths reaching basic block `bb` from some entry point - * basic block must go through this basic block. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 dominates the basic - * basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block). - */ - predicate dominates(BasicBlock bb) { super.dominates(bb) } - - /** - * Holds if `df` is in the dominance frontier of this basic block. - * That is, this basic block dominates a predecessor of `df`, but - * does not dominate `df` itself. - * - * Example: - * - * ```rb - * def m x - * if x < 0 - * x = -x - * if x > 10 - * x = x - 1 - * end - * end - * puts x - * end - * ``` - * - * The basic block on line 8 is in the dominance frontier - * of the basic block starting on line 3 because that block - * dominates the basic block on line 4, which is a predecessor of - * `puts x`. Also, the basic block starting on line 3 does not - * dominate the basic block on line 8. - */ - predicate inDominanceFrontier(BasicBlock df) { super.inDominanceFrontier(df) } - - /** - * Gets the basic block that immediately dominates this basic block, if any. - * - * That is, the result is the unique basic block satisfying: - * 1. The result strictly dominates this basic block. - * 2. There exists no other basic block that is strictly dominated by the - * result and which strictly dominates this basic block. - * - * All basic blocks, except entry basic blocks, have a unique immediate - * dominator. - * - * Example: - * - * ```rb - * def m b - * if b - * return 0 - * end - * return 1 - * end - * ``` - * - * The basic block starting on line 2 is an immediate dominator of - * the basic block on line 5 (all paths from the entry point of `m` - * to `return 1` must go through the `if` block, and the `if` block - * is an immediate predecessor of `return 1`). - */ - BasicBlock getImmediateDominator() { result = super.getImmediateDominator() } - - /** - * Holds if the edge with successor type `s` out of this basic block is a - * dominating edge for `dominated`. - * - * That is, all paths reaching `dominated` from the entry point basic - * block must go through the `s` edge out of this basic block. - * - * Edge dominance is similar to node dominance except it concerns edges - * instead of nodes: A basic block is dominated by a _basic block_ `bb` if it - * can only be reached through `bb` and dominated by an _edge_ `e` if it can - * only be reached through `e`. - * - * Note that where all basic blocks (except the entry basic block) are - * strictly dominated by at least one basic block, a basic block may not be - * dominated by any edge. If an edge dominates a basic block `bb`, then - * both endpoints of the edge dominates `bb`. The converse is not the case, - * as there may be multiple paths between the endpoints with none of them - * dominating. - */ - predicate edgeDominates(BasicBlock dominated, SuccessorType s) { - super.edgeDominates(dominated, s) - } - - /** - * Holds if this basic block strictly post-dominates basic block `bb`. - * - * That is, all paths reaching a normal exit point basic block from basic - * block `bb` must go through this basic block (which must be different - * from `bb`). - * - * Example: - * - * ```rb - * def m b - * if b - * puts "b" - * end - * puts "m" - * end - * ``` - * - * The basic block on line 5 strictly post-dominates the basic block on - * line 3 (all paths to the exit point of `m` from `puts "b"` must go - * through `puts "m"`). - */ - predicate strictlyPostDominates(BasicBlock bb) { super.strictlyPostDominates(bb) } - - /** - * Holds if this basic block post-dominates basic block `bb`. - * - * That is, all paths reaching a normal exit point basic block from basic - * block `bb` must go through this basic block. - * - * Example: - * - * ```rb - * def m b - * if b - * puts "b" - * end - * puts "m" - * end - * ``` - * - * The basic block on line 5 post-dominates the basic block on line 3 - * (all paths to the exit point of `m` from `puts "b"` must go through - * `puts "m"`). - */ - predicate postDominates(BasicBlock bb) { super.postDominates(bb) } -} - -/** - * An entry basic block, that is, a basic block whose first node is - * an entry node. - */ -final class EntryBasicBlock extends BasicBlock, BasicBlocksImpl::EntryBasicBlock { } - -/** - * An annotated exit basic block, that is, a basic block that contains an - * annotated exit node. - */ -final class AnnotatedExitBasicBlock extends BasicBlock, BasicBlocksImpl::AnnotatedExitBasicBlock { } - -/** - * An exit basic block, that is, a basic block whose last node is - * an exit node. - */ -final class ExitBasicBlock extends BasicBlock, BasicBlocksImpl::ExitBasicBlock { } - -/** A basic block with more than one predecessor. */ -final class JoinBlock extends BasicBlock, BasicBlocksImpl::JoinBasicBlock { - JoinBlockPredecessor getJoinBlockPredecessor(int i) { result = super.getJoinBlockPredecessor(i) } -} - -/** A basic block that is an immediate predecessor of a join block. */ -final class JoinBlockPredecessor extends BasicBlock, BasicBlocksImpl::JoinPredecessorBasicBlock { } - -/** - * A basic block that terminates in a condition, splitting the subsequent - * control flow. - */ -final class ConditionBlock extends BasicBlock, BasicBlocksImpl::ConditionBasicBlock { - /** - * DEPRECATED: Use `edgeDominates` instead. - * - * Holds if basic block `succ` is immediately controlled by this basic - * block with conditional value `s`. That is, `succ` is an immediate - * successor of this block, and `succ` can only be reached from - * the callable entry point by going via the `s` edge out of this basic block. - */ - deprecated predicate immediatelyControls(BasicBlock succ, ConditionalSuccessor s) { - this.getASuccessor(s) = succ and - BasicBlocksImpl::dominatingEdge(this, succ) - } - - /** - * DEPRECATED: Use `edgeDominates` instead. - * - * Holds if basic block `controlled` is controlled by this basic block with - * conditional value `s`. That is, `controlled` can only be reached from the - * callable entry point by going via the `s` edge out of this basic block. - */ - deprecated predicate controls(BasicBlock controlled, ConditionalSuccessor s) { - super.edgeDominates(controlled, s) - } -} - -private class BasicBlockAlias = BasicBlock; - -private class EntryBasicBlockAlias = EntryBasicBlock; - -module Cfg implements BB::CfgSig { - class ControlFlowNode = CfgNode; - - class BasicBlock = BasicBlockAlias; - - class EntryBasicBlock = EntryBasicBlockAlias; - - predicate dominatingEdge(BasicBlock bb1, BasicBlock bb2) { - BasicBlocksImpl::dominatingEdge(bb1, bb2) - } -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll index 0da31370ff01..72806211f3f7 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll @@ -3,30 +3,9 @@ overlay[local] module; private import codeql.ruby.AST -private import codeql.ruby.controlflow.BasicBlocks private import codeql.ruby.dataflow.SSA private import codeql.ruby.ast.internal.Constant private import ControlFlowGraph -private import internal.ControlFlowGraphImpl as CfgImpl - -/** An entry node for a given scope. */ -class EntryNode extends CfgNode, CfgImpl::EntryNode { - override string getAPrimaryQlClass() { result = "EntryNode" } - - final override EntryBasicBlock getBasicBlock() { result = super.getBasicBlock() } -} - -/** An exit node for a given scope, annotated with the type of exit. */ -class AnnotatedExitNode extends CfgNode, CfgImpl::AnnotatedExitNode { - override string getAPrimaryQlClass() { result = "AnnotatedExitNode" } - - final override AnnotatedExitBasicBlock getBasicBlock() { result = super.getBasicBlock() } -} - -/** An exit node for a given scope. */ -class ExitNode extends CfgNode, CfgImpl::ExitNode { - override string getAPrimaryQlClass() { result = "ExitNode" } -} /** * A node for an AST node. @@ -35,7 +14,11 @@ class ExitNode extends CfgNode, CfgImpl::ExitNode { * (dead) code or not important for control flow, and multiple when there are different * splits for the AST node. */ -class AstCfgNode extends CfgNode, CfgImpl::AstCfgNode { +class AstCfgNode extends CfgNode { + AstCfgNode() { this.injects(_) } + + AstNode getAstNode() { this.injects(result) } + /** Gets the name of the primary QL class for this node. */ overlay[global] override string getAPrimaryQlClass() { result = "AstCfgNode" } @@ -67,10 +50,7 @@ class ReturningCfgNode extends AstCfgNode { ReturningCfgNode() { s = this.getAstNode() } /** Gets the node of the returned value, if any. */ - ExprCfgNode getReturnedValueNode() { - result = this.getAPredecessor() and - result.getAstNode() = s.getValue() - } + ExprCfgNode getReturnedValueNode() { result.getAstNode() = s.getValue() } } /** A control-flow node that wraps a `StringComponent` AST expression. */ @@ -100,108 +80,31 @@ private AstNode desugar(AstNode n) { result = n } -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class ChildMapping extends AstNode { - /** - * Holds if `child` is a (possibly nested) child of this expression - * for which we would like to find a matching CFG child. - */ - abstract predicate relevantChild(AstNode child); - - pragma[nomagic] - abstract predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb); - - /** - * Holds if there is a control-flow path from `cfn` to `cfnChild`, where `cfn` - * is a control-flow node for this expression, and `cfnChild` is a control-flow - * node for `child`. - * - * The path never escapes the syntactic scope of this expression. - */ - cached - predicate hasCfgChild(AstNode child, CfgNode cfn, CfgNode cfnChild) { - this.reachesBasicBlock(child, cfn, cfnChild.getBasicBlock()) and - cfnChild.getAstNode() = desugar(child) - } -} - -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class ExprChildMapping extends Expr, ChildMapping { - pragma[nomagic] - override predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb) { - this.relevantChild(child) and - cfn = this.getAControlFlowNode() and - bb.getANode() = cfn - or - exists(BasicBlock mid | - this.reachesBasicBlock(child, cfn, mid) and - bb = mid.getAPredecessor() and - not mid.getANode().getAstNode() = child - ) - } -} - -/** - * A class for mapping parent-child AST nodes to parent-child CFG nodes. - */ -abstract private class NonExprChildMapping extends ChildMapping { - NonExprChildMapping() { not this instanceof Expr } - - pragma[nomagic] - override predicate reachesBasicBlock(AstNode child, CfgNode cfn, BasicBlock bb) { - this.relevantChild(child) and - cfn.getAstNode() = this and - bb.getANode() = cfn - or - exists(BasicBlock mid | - this.reachesBasicBlock(child, cfn, mid) and - bb = mid.getASuccessor() and - not mid.getANode().getAstNode() = child - ) - } -} - /** Provides classes for control-flow nodes that wrap AST expressions. */ module ExprNodes { - private class LiteralChildMapping extends ExprChildMapping, Literal { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `Literal` AST expression. */ class LiteralCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "LiteralCfgNode" } - override LiteralChildMapping e; + override Literal e; override Literal getExpr() { result = super.getExpr() } } - private class ControlExprChildMapping extends ExprChildMapping, ControlExpr { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `ControlExpr` AST expression. */ class ControlExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ControlExprCfgNode" } - override ControlExprChildMapping e; + override ControlExpr e; override ControlExpr getExpr() { result = super.getExpr() } } - private class LhsExprChildMapping extends ExprChildMapping, LhsExpr { - override predicate relevantChild(AstNode n) { none() } - } - /** A control-flow node that wraps a `LhsExpr` AST expression. */ class LhsExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "LhsExprCfgNode" } - override LhsExprChildMapping e; + override LhsExpr e; override LhsExpr getExpr() { result = super.getExpr() } @@ -209,34 +112,26 @@ module ExprNodes { Variable getVariable() { result = e.(VariableAccess).getVariable() } } - private class AssignExprChildMapping extends ExprChildMapping, AssignExpr { - override predicate relevantChild(AstNode n) { n = this.getAnOperand() } - } - /** A control-flow node that wraps an `AssignExpr` AST expression. */ class AssignExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "AssignExprCfgNode" } - override AssignExprChildMapping e; + override AssignExpr e; final override AssignExpr getExpr() { result = super.getExpr() } /** Gets the LHS of this assignment. */ - final LhsExprCfgNode getLhs() { e.hasCfgChild(e.getLeftOperand(), this, result) } + final LhsExprCfgNode getLhs() { result.injects(desugar(e.getLeftOperand())) } /** Gets the RHS of this assignment. */ - final ExprCfgNode getRhs() { e.hasCfgChild(e.getRightOperand(), this, result) } - } - - private class OperationExprChildMapping extends ExprChildMapping, Operation { - override predicate relevantChild(AstNode n) { n = this.getAnOperand() } + final ExprCfgNode getRhs() { result.injects(desugar(e.getRightOperand())) } } /** A control-flow node that wraps an `Operation` AST expression. */ class OperationCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "OperationCfgNode" } - override OperationExprChildMapping e; + override Operation e; override Operation getExpr() { result = super.getExpr() } @@ -244,7 +139,7 @@ module ExprNodes { string getOperator() { result = this.getExpr().getOperator() } /** Gets an operand of this operation. */ - final ExprCfgNode getAnOperand() { e.hasCfgChild(e.getAnOperand(), this, result) } + final ExprCfgNode getAnOperand() { result.injects(desugar(e.getAnOperand())) } } /** A control-flow node that wraps a `UnaryOperation` AST expression. */ @@ -258,7 +153,7 @@ module ExprNodes { override UnaryOperation getExpr() { result = super.getExpr() } /** Gets the operand of this unary operation. */ - final ExprCfgNode getOperand() { e.hasCfgChild(uo.getOperand(), this, result) } + final ExprCfgNode getOperand() { result.injects(desugar(uo.getOperand())) } } /** A control-flow node that wraps a `BinaryOperation` AST expression. */ @@ -272,32 +167,22 @@ module ExprNodes { override BinaryOperation getExpr() { result = super.getExpr() } /** Gets the left operand of this binary operation. */ - final ExprCfgNode getLeftOperand() { e.hasCfgChild(bo.getLeftOperand(), this, result) } + final ExprCfgNode getLeftOperand() { result.injects(desugar(bo.getLeftOperand())) } /** Gets the right operand of this binary operation. */ - final ExprCfgNode getRightOperand() { e.hasCfgChild(bo.getRightOperand(), this, result) } - } - - private class BlockArgumentChildMapping extends ExprChildMapping, BlockArgument { - override predicate relevantChild(AstNode n) { n = this.getValue() } + final ExprCfgNode getRightOperand() { result.injects(desugar(bo.getRightOperand())) } } /** A control-flow node that wraps a `BlockArgument` AST expression. */ class BlockArgumentCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "BlockArgumentCfgNode" } - override BlockArgumentChildMapping e; + override BlockArgument e; final override BlockArgument getExpr() { result = super.getExpr() } /** Gets the value of this block argument. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } - } - - private class CallExprChildMapping extends ExprChildMapping, Call { - override predicate relevantChild(AstNode n) { - n = [this.getAnArgument(), this.(MethodCall).getReceiver(), this.(MethodCall).getBlock()] - } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `Call` AST expression. */ @@ -305,12 +190,12 @@ module ExprNodes { overlay[global] override string getAPrimaryQlClass() { result = "CallCfgNode" } - override CallExprChildMapping e; + override Call e; override Call getExpr() { result = super.getExpr() } /** Gets the `n`th argument of this call. */ - final ExprCfgNode getArgument(int n) { e.hasCfgChild(e.getArgument(n), this, result) } + final ExprCfgNode getArgument(int n) { result.injects(desugar(e.getArgument(n))) } /** Gets an argument of this call. */ final ExprCfgNode getAnArgument() { result = this.getArgument(_) } @@ -319,7 +204,7 @@ module ExprNodes { overlay[global] final ExprCfgNode getKeywordArgument(string keyword) { exists(PairCfgNode n | - e.hasCfgChild(e.getAnArgument(), this, n) and + n.injects(desugar(e.getAnArgument())) and n.getKey().getExpr().getConstantValue().isSymbol(keyword) and result = n.getValue() ) @@ -337,10 +222,10 @@ module ExprNodes { final int getNumberOfArguments() { result = e.getNumberOfArguments() } /** Gets the receiver of this call. */ - final ExprCfgNode getReceiver() { e.hasCfgChild(e.(MethodCall).getReceiver(), this, result) } + final ExprCfgNode getReceiver() { result.injects(desugar(e.(MethodCall).getReceiver())) } /** Gets the block of this call. */ - final ExprCfgNode getBlock() { e.hasCfgChild(e.(MethodCall).getBlock(), this, result) } + final ExprCfgNode getBlock() { result.injects(desugar(e.(MethodCall).getBlock())) } } /** A control-flow node that wraps a `MethodCall` AST expression. */ @@ -356,104 +241,54 @@ module ExprNodes { string getMethodName() { result = this.getExpr().getMethodName() } } - private class CaseExprChildMapping extends ExprChildMapping, CaseExpr { - override predicate relevantChild(AstNode e) { e = this.getValue() or e = this.getABranch() } - } - /** A control-flow node that wraps a `CaseExpr` AST expression. */ class CaseExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "CaseExprCfgNode" } - override CaseExprChildMapping e; + override CaseExpr e; final override CaseExpr getExpr() { result = super.getExpr() } /** Gets the expression being compared, if any. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } /** * Gets the `n`th branch of this case expression, either a `when` clause, an `in` clause, or an `else` branch. */ - final AstCfgNode getBranch(int n) { e.hasCfgChild(e.getBranch(n), this, result) } - } - - private class InClauseChildMapping extends NonExprChildMapping, InClause { - override predicate relevantChild(AstNode e) { - e = this.getPattern() or - e = this.getCondition() or - e = this.getBody() - } + final AstCfgNode getBranch(int n) { result.injects(desugar(e.getBranch(n))) } } /** A control-flow node that wraps an `InClause` AST expression. */ class InClauseCfgNode extends AstCfgNode { - private InClauseChildMapping e; + private InClause e; InClauseCfgNode() { e = this.getAstNode() } override string getAPrimaryQlClass() { result = "InClauseCfgNode" } /** Gets the pattern in this `in`-clause. */ - final AstCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } + final AstCfgNode getPattern() { result.injects(desugar(e.getPattern())) } /** Gets the pattern guard condition in this `in` clause, if any. */ - final ExprCfgNode getCondition() { e.hasCfgChild(e.getCondition(), this, result) } + final ExprCfgNode getCondition() { result.injects(desugar(e.getCondition())) } /** Gets the body of this `in`-clause. */ - final ExprCfgNode getBody() { e.hasCfgChild(e.getBody(), this, result) } - } - - // `when` clauses need special treatment, since they are neither pre-order - // nor post-order - private class WhenClauseChildMapping extends WhenClause { - predicate patternReachesBasicBlock(int i, CfgNode cfnPattern, BasicBlock bb) { - exists(Expr pattern | - pattern = this.getPattern(i) and - cfnPattern.getAstNode() = pattern and - bb.getANode() = cfnPattern - ) - or - exists(BasicBlock mid | - this.patternReachesBasicBlock(i, cfnPattern, mid) and - bb = mid.getASuccessor() and - not mid.getANode().getAstNode() = this - ) - } - - predicate bodyReachesBasicBlock(CfgNode cfnBody, BasicBlock bb) { - exists(Stmt body | - body = this.getBody() and - cfnBody.getAstNode() = body and - bb.getANode() = cfnBody - ) - or - exists(BasicBlock mid | - this.bodyReachesBasicBlock(cfnBody, mid) and - bb = mid.getAPredecessor() and - not mid.getANode().getAstNode() = this - ) - } + final ExprCfgNode getBody() { result.injects(desugar(e.getBody())) } } /** A control-flow node that wraps a `WhenClause` AST expression. */ class WhenClauseCfgNode extends AstCfgNode { - private WhenClauseChildMapping e; + private WhenClause e; WhenClauseCfgNode() { e = this.getAstNode() } override string getAPrimaryQlClass() { result = "WhenClauseCfgNode" } /** Gets the body of this `when`-clause. */ - final ExprCfgNode getBody() { - result.getAstNode() = desugar(e.getBody()) and - e.bodyReachesBasicBlock(result, this.getBasicBlock()) - } + final ExprCfgNode getBody() { result.getAstNode() = desugar(e.getBody()) } /** Gets the `i`th pattern this `when`-clause. */ - final ExprCfgNode getPattern(int i) { - result.getAstNode() = desugar(e.getPattern(i)) and - e.patternReachesBasicBlock(i, result, this.getBasicBlock()) - } + final ExprCfgNode getPattern(int i) { result.getAstNode() = desugar(e.getPattern(i)) } } /** A control-flow node that wraps a `CasePattern`. */ @@ -465,41 +300,25 @@ module ExprNodes { override string getAPrimaryQlClass() { result = "CasePatternCfgNode" } } - private class ArrayPatternChildMapping extends NonExprChildMapping, ArrayPattern { - override predicate relevantChild(AstNode e) { - e = this.getPrefixElement(_) or - e = this.getSuffixElement(_) or - e = this.getRestVariableAccess() - } - } - /** A control-flow node that wraps an `ArrayPattern` node. */ class ArrayPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "ArrayPatternCfgNode" } - override ArrayPatternChildMapping e; + override ArrayPattern e; /** Gets the `n`th element of this list pattern's prefix. */ final CasePatternCfgNode getPrefixElement(int n) { - e.hasCfgChild(e.getPrefixElement(n), this, result) + result.injects(desugar(e.getPrefixElement(n))) } /** Gets the `n`th element of this list pattern's suffix. */ final CasePatternCfgNode getSuffixElement(int n) { - e.hasCfgChild(e.getSuffixElement(n), this, result) + result.injects(desugar(e.getSuffixElement(n))) } /** Gets the variable of the rest token, if any. */ final VariableWriteAccessCfgNode getRestVariableAccess() { - e.hasCfgChild(e.getRestVariableAccess(), this, result) - } - } - - private class FindPatternChildMapping extends NonExprChildMapping, FindPattern { - override predicate relevantChild(AstNode e) { - e = this.getElement(_) or - e = this.getPrefixVariableAccess() or - e = this.getSuffixVariableAccess() + result.injects(desugar(e.getRestVariableAccess())) } } @@ -507,26 +326,19 @@ module ExprNodes { class FindPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "FindPatternCfgNode" } - override FindPatternChildMapping e; + override FindPattern e; /** Gets the `n`th element of this find pattern. */ - final CasePatternCfgNode getElement(int n) { e.hasCfgChild(e.getElement(n), this, result) } + final CasePatternCfgNode getElement(int n) { result.injects(desugar(e.getElement(n))) } /** Gets the variable for the prefix of this find pattern, if any. */ final VariableWriteAccessCfgNode getPrefixVariableAccess() { - e.hasCfgChild(e.getPrefixVariableAccess(), this, result) + result.injects(desugar(e.getPrefixVariableAccess())) } /** Gets the variable for the suffix of this find pattern, if any. */ final VariableWriteAccessCfgNode getSuffixVariableAccess() { - e.hasCfgChild(e.getSuffixVariableAccess(), this, result) - } - } - - private class HashPatternChildMapping extends NonExprChildMapping, HashPattern { - override predicate relevantChild(AstNode e) { - e = this.getValue(_) or - e = this.getRestVariableAccess() + result.injects(desugar(e.getSuffixVariableAccess())) } } @@ -534,136 +346,104 @@ module ExprNodes { class HashPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "HashPatternCfgNode" } - override HashPatternChildMapping e; + override HashPattern e; /** Gets the value of the `n`th pair. */ - final CasePatternCfgNode getValue(int n) { e.hasCfgChild(e.getValue(n), this, result) } + final CasePatternCfgNode getValue(int n) { result.injects(desugar(e.getValue(n))) } /** Gets the variable of the keyword rest token, if any. */ final VariableWriteAccessCfgNode getRestVariableAccess() { - e.hasCfgChild(e.getRestVariableAccess(), this, result) + result.injects(desugar(e.getRestVariableAccess())) } } - private class AlternativePatternChildMapping extends NonExprChildMapping, AlternativePattern { - override predicate relevantChild(AstNode e) { e = this.getAnAlternative() } - } - /** A control-flow node that wraps an `AlternativePattern` node. */ class AlternativePatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "AlternativePatternCfgNode" } - override AlternativePatternChildMapping e; + override AlternativePattern e; /** Gets the `n`th alternative. */ - final CasePatternCfgNode getAlternative(int n) { - e.hasCfgChild(e.getAlternative(n), this, result) - } - } - - private class AsPatternChildMapping extends NonExprChildMapping, AsPattern { - override predicate relevantChild(AstNode e) { - e = this.getPattern() or e = this.getVariableAccess() - } + final CasePatternCfgNode getAlternative(int n) { result.injects(desugar(e.getAlternative(n))) } } /** A control-flow node that wraps an `AsPattern` node. */ class AsPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "AsPatternCfgNode" } - override AsPatternChildMapping e; + override AsPattern e; /** Gets the underlying pattern. */ - final CasePatternCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } + final CasePatternCfgNode getPattern() { result.injects(desugar(e.getPattern())) } /** Gets the variable access for this pattern. */ final VariableWriteAccessCfgNode getVariableAccess() { - e.hasCfgChild(e.getVariableAccess(), this, result) + result.injects(desugar(e.getVariableAccess())) } } - private class ParenthesizedPatternChildMapping extends NonExprChildMapping, ParenthesizedPattern { - override predicate relevantChild(AstNode e) { e = this.getPattern() } - } - /** A control-flow node that wraps a `ParenthesizedPattern` node. */ class ParenthesizedPatternCfgNode extends CasePatternCfgNode { override string getAPrimaryQlClass() { result = "ParenthesizedPatternCfgNode" } - override ParenthesizedPatternChildMapping e; + override ParenthesizedPattern e; /** Gets the underlying pattern. */ - final CasePatternCfgNode getPattern() { e.hasCfgChild(e.getPattern(), this, result) } - } - - private class ConditionalExprChildMapping extends ExprChildMapping, ConditionalExpr { - override predicate relevantChild(AstNode n) { n = [this.getCondition(), this.getBranch(_)] } + final CasePatternCfgNode getPattern() { result.injects(desugar(e.getPattern())) } } /** A control-flow node that wraps a `ConditionalExpr` AST expression. */ class ConditionalExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ConditionalExprCfgNode" } - override ConditionalExprChildMapping e; + override ConditionalExpr e; final override ConditionalExpr getExpr() { result = super.getExpr() } /** Gets the condition expression. */ - final ExprCfgNode getCondition() { e.hasCfgChild(e.getCondition(), this, result) } + final ExprCfgNode getCondition() { result.injects(desugar(e.getCondition())) } /** * Gets the branch of this conditional expression that is taken when the condition * evaluates to cond, if any. */ - final ExprCfgNode getBranch(boolean cond) { e.hasCfgChild(e.getBranch(cond), this, result) } - } - - private class ConstantAccessChildMapping extends ExprChildMapping, ConstantAccess { - override predicate relevantChild(AstNode n) { n = this.getScopeExpr() } + final ExprCfgNode getBranch(boolean cond) { result.injects(desugar(e.getBranch(cond))) } } - /** A control-flow node that wraps a `ConditionalExpr` AST expression. */ + /** A control-flow node that wraps a `ConstantAccess` AST expression. */ class ConstantAccessCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ConstantAccessCfgNode" } - override ConstantAccessChildMapping e; + override ConstantAccess e; final override ConstantAccess getExpr() { result = super.getExpr() } /** Gets the scope expression. */ - final ExprCfgNode getScopeExpr() { e.hasCfgChild(e.getScopeExpr(), this, result) } - } - - private class StmtSequenceChildMapping extends ExprChildMapping, StmtSequence { - override predicate relevantChild(AstNode n) { n = this.getLastStmt() } + final ExprCfgNode getScopeExpr() { result.injects(desugar(e.getScopeExpr())) } } /** A control-flow node that wraps a `StmtSequence` AST expression. */ class StmtSequenceCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "StmtSequenceCfgNode" } - override StmtSequenceChildMapping e; + override StmtSequence e; final override StmtSequence getExpr() { result = super.getExpr() } /** Gets the last statement in this sequence, if any. */ - final ExprCfgNode getLastStmt() { e.hasCfgChild(e.getLastStmt(), this, result) } - } - - private class ForExprChildMapping extends ExprChildMapping, ForExpr { - override predicate relevantChild(AstNode n) { n = this.getValue() } + final ExprCfgNode getLastStmt() { result.injects(desugar(e.getLastStmt())) } } /** A control-flow node that wraps a `ForExpr` AST expression. */ class ForExprCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "ForExprCfgNode" } - override ForExprChildMapping e; + override ForExpr e; final override ForExpr getExpr() { result = super.getExpr() } /** Gets the value being iterated over. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `ParenthesizedExpr` AST expression. */ @@ -673,27 +453,23 @@ module ExprNodes { ParenthesizedExprCfgNode() { this.getExpr() instanceof ParenthesizedExpr } } - private class PairChildMapping extends ExprChildMapping, Pair { - override predicate relevantChild(AstNode n) { n = [this.getKey(), this.getValue()] } - } - /** A control-flow node that wraps a `Pair` AST expression. */ class PairCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "PairCfgNode" } - override PairChildMapping e; + override Pair e; final override Pair getExpr() { result = super.getExpr() } /** * Gets the key expression of this pair. */ - final ExprCfgNode getKey() { e.hasCfgChild(e.getKey(), this, result) } + final ExprCfgNode getKey() { result.injects(desugar(e.getKey())) } /** * Gets the value expression of this pair. */ - final ExprCfgNode getValue() { e.hasCfgChild(e.getValue(), this, result) } + final ExprCfgNode getValue() { result.injects(desugar(e.getValue())) } } /** A control-flow node that wraps a `VariableAccess` AST expression. */ @@ -728,41 +504,29 @@ module ExprNodes { final override LocalVariable getVariable() { result = super.getVariable() } } - private class InstanceVariableAccessMapping extends ExprChildMapping, InstanceVariableAccess { - override predicate relevantChild(AstNode n) { n = this.getReceiver() } - } - /** A control-flow node that wraps an `InstanceVariableAccess` AST expression. */ class InstanceVariableAccessCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "InstanceVariableAccessCfgNode" } - override InstanceVariableAccessMapping e; + override InstanceVariableAccess e; override InstanceVariableAccess getExpr() { result = super.getExpr() } /** * Gets the synthetic receiver (`self`) of this instance variable access. */ - final CfgNode getReceiver() { e.hasCfgChild(e.getReceiver(), this, result) } - } - - private class SelfVariableAccessMapping extends ExprChildMapping, SelfVariableAccess { - override predicate relevantChild(AstNode n) { none() } + final CfgNode getReceiver() { result.injects(desugar(e.getReceiver())) } } /** A control-flow node that wraps a `SelfVariableAccess` AST expression. */ class SelfVariableAccessCfgNode extends VariableAccessCfgNode { final override string getAPrimaryQlClass() { result = "SelfVariableAccessCfgNode" } - override SelfVariableAccessMapping e; + override SelfVariableAccess e; override SelfVariableAccess getExpr() { result = super.getExpr() } } - private class VariableWriteAccessChildMapping extends ExprChildMapping, VariableWriteAccess { - override predicate relevantChild(AstNode n) { this.isExplicitWrite(n) } - } - /** A control-flow node that wraps a `VariableWriteAccess` AST expression. */ class VariableWriteAccessCfgNode extends VariableAccessCfgNode { /** @@ -784,20 +548,16 @@ module ExprNodes { override string getAPrimaryQlClass() { result = "VariableWriteAccessCfgNode" } - override VariableWriteAccessChildMapping e; + override VariableWriteAccess e; override VariableWriteAccess getExpr() { result = super.getExpr() } } - private class LocalVariableWriteAccessChildMapping extends VariableWriteAccessChildMapping, - LocalVariableWriteAccess - { } - /** A control-flow node that wraps a `LocalVariableWriteAccess` AST expression. */ class LocalVariableWriteAccessCfgNode extends VariableWriteAccessCfgNode { override string getAPrimaryQlClass() { result = "LocalVariableWriteAccessCfgNode" } - override LocalVariableWriteAccessChildMapping e; + override LocalVariableWriteAccess e; final override LocalVariableWriteAccess getExpr() { result = super.getExpr() } @@ -870,20 +630,16 @@ module ExprNodes { } } - private class StringlikeLiteralChildMapping extends ExprChildMapping, StringlikeLiteral { - override predicate relevantChild(AstNode n) { n = this.getComponent(_) } - } - /** A control-flow node that wraps a `StringlikeLiteral` AST expression. */ class StringlikeLiteralCfgNode extends ExprCfgNode { override string getAPrimaryQlClass() { result = "StringlikeLiteralCfgNode" } - override StringlikeLiteralChildMapping e; + override StringlikeLiteral e; override StringlikeLiteral getExpr() { result = super.getExpr() } /** Gets the `n`th component of this `StringlikeLiteral` */ - StringComponentCfgNode getComponent(int n) { e.hasCfgChild(e.getComponent(n), this, result) } + StringComponentCfgNode getComponent(int n) { result.injects(desugar(e.getComponent(n))) } /** Gets a component of this `StringlikeLiteral` */ StringComponentCfgNode getAComponent() { result = this.getComponent(_) } @@ -929,15 +685,11 @@ module ExprNodes { final override RelationalOperation getExpr() { result = super.getExpr() } } - private class SplatExprChildMapping extends OperationExprChildMapping, SplatExpr { - override predicate relevantChild(AstNode n) { n = this.getOperand() } - } - /** A control-flow node that wraps a `SplatExpr` AST expression. */ class SplatExprCfgNode extends UnaryOperationCfgNode { override string getAPrimaryQlClass() { result = "SplatExprCfgNode" } - override SplatExprChildMapping e; + override SplatExpr e; final override SplatExpr getExpr() { result = super.getExpr() } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll index 8a7abea30904..06ca1ef1e7e7 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll @@ -2,12 +2,23 @@ overlay[local] module; +private import ruby as R +private import codeql.Locations +private import codeql.controlflow.ControlFlowGraph import codeql.controlflow.SuccessorType -private import codeql.ruby.AST -private import codeql.ruby.controlflow.BasicBlocks -private import internal.ControlFlowGraphImpl as CfgImpl -private import internal.Splitting as Splitting -private import internal.Completion +private import codeql.ruby.ast.internal.Synthesis +private import codeql.ruby.ast.internal.Scope + +private module Cfg0 = Make0; + +private module Cfg1 = Make1; + +private module Cfg2 = Make2; + +private import Cfg0 +private import Cfg1 +private import Cfg2 +import Public /** * An AST node with an associated control-flow graph. @@ -17,12 +28,12 @@ private import internal.Completion * Note that module declarations are not themselves CFG scopes, as they are part of * the CFG of the enclosing top-level or callable. */ -class CfgScope extends Scope instanceof CfgImpl::CfgScopeImpl { +class CfgScope extends R::Ast::Scope instanceof CfgScopeImpl { /** Gets the CFG scope that this scope is nested under, if any. */ final CfgScope getOuterCfgScope() { - exists(AstNode parent | + exists(R::Ast::AstNode parent | parent = this.getParent() and - result = CfgImpl::getCfgScope(parent) + result = getEnclosingCallable(parent) ) } } @@ -35,14 +46,11 @@ class CfgScope extends Scope instanceof CfgImpl::CfgScopeImpl { * * Only nodes that can be reached from an entry point are included in the CFG. */ -class CfgNode extends CfgImpl::Node { +class CfgNode extends ControlFlowNode { /** Gets the name of the primary QL class for this node. */ overlay[global] string getAPrimaryQlClass() { none() } - /** Gets the file of this control flow node. */ - final File getFile() { result = this.getLocation().getFile() } - /** Gets a successor node of a given type, if any. */ final CfgNode getASuccessor(SuccessorType t) { result = super.getASuccessor(t) } @@ -54,14 +62,505 @@ class CfgNode extends CfgImpl::Node { /** Gets an immediate predecessor, if any. */ final CfgNode getAPredecessor() { result = this.getAPredecessor(_) } +} + +private Ast::AstNode desugar(R::Ast::AstNode n) { result = n or result = n.getDesugared() } + +class CfgScopeImpl = Ast::Callable; + +predicate getEnclosingCallable = Ast::getEnclosingCallable/1; + +/** Provides an implementation of the AST signature for Ruby. */ +private module Ast implements AstSig { + private import codeql.ruby.ast.internal.AST + + private predicate additionalExclude(R::Ast::AstNode n) { + n instanceof R::Ast::DestructuredLhsExpr or + exists(n.getDesugared()) + } + + class AstNode extends R::Ast::AstNode { + AstNode() { + not any(Synthesis s).excludeFromControlFlowTree(this) and not additionalExclude(this) + } + } + + private R::Ast::AstNode adjustedGetChild(R::Ast::AstNode parent, int index) { + exists(R::Ast::WhenClause when | parent = when | + when.getPattern(index) = result + or + when.getBody() = result and index = toGenerated(result).getParentIndex() + ) + or + exists(R::Ast::MethodCall call | parent = call and not call instanceof R::Ast::BinaryOperation | + index = -1 and call.getReceiver() = result + or + call.getArgument(index) = result + or + index = call.getNumberOfArguments() and + call.getBlock() = result + ) + or + exists(R::Ast::ClassDeclaration cls | parent = cls | + index = 0 and cls.getScopeExpr() = result + or + index = 1 and cls.getSuperclassExpr() = result + or + cls.getStmt(index - 2) = result + ) + or + exists(R::Ast::ModuleDeclaration mod | parent = mod | + index = 0 and mod.getScopeExpr() = result + or + mod.getStmt(index - 1) = result + ) + or + exists(R::Ast::SingletonClass cls | parent = cls | + index = 0 and cls.getValue() = result + or + cls.getStmt(index - 1) = result + ) + or + exists(R::Ast::SingletonMethod method | parent = method | + index = 0 and method.getObject() = result + ) + or + exists(R::Ast::Pair pair | parent = pair | + index = 0 and pair.getKey() = result + or + index = 1 and pair.getValue() = result + ) + or + exists(R::Ast::ArrayPattern arraypattern | parent = arraypattern | + index = -1 and arraypattern.getClass() = result + or + arraypattern.getPrefixElement(index) = result + or + exists(int restix | restix = count(arraypattern.getPrefixElement(_)) | + restix = index and arraypattern.getRestVariableAccess() = result + or + arraypattern.getSuffixElement(index - restix - 1) = result + ) + ) + or + exists(R::Ast::FindPattern findpattern | parent = findpattern | + index = -2 and findpattern.getClass() = result + or + index = -1 and findpattern.getPrefixVariableAccess() = result + or + findpattern.getElement(index) = result + or + index = 1 + max(int i | exists(findpattern.getElement(i))) and + findpattern.getSuffixVariableAccess() = result + ) + or + exists(R::Ast::HashPattern hashpattern | parent = hashpattern | + index = -1 and hashpattern.getClass() = result + or + exists(int i | + hashpattern.getKey(i) = result and + index = 2 * i + or + hashpattern.getValue(i) = result and + index = 2 * i + 1 + ) + or + index = 2 * count(hashpattern.getValue(_)) and hashpattern.getRestVariableAccess() = result + ) + } + + private R::Ast::AstNode baseGetChild(R::Ast::AstNode parent, int index) { + result = adjustedGetChild(parent, index) + or + not exists(adjustedGetChild(parent, _)) and + not parent instanceof R::Ast::Callable and + ( + synthChild(parent, index, result) + or + result = parent.getAChild() and + not synthChild(parent, _, result) and + toGenerated(result).getParentIndex() = index + ) + } + + AstNode getChild(AstNode parent, int index) { result = desugar(baseGetChild(parent, index)) } + + private R::Ast::Scope parentScope(R::Ast::Scope n) { + result = n.getOuterScope() and + not n instanceof Callable + } + + cached + Callable getEnclosingCallable(AstNode node) { result = parentScope*(scopeOfInclSynth(node)) } + + // TODO: Include EndBlock + class Callable extends AstNode { + Callable() { this instanceof R::Ast::Toplevel or this instanceof R::Ast::Callable } + } + + AstNode callableGetBody(Callable c) { + result = c.(R::Ast::Toplevel).getABeginBlock() or + result = c.(R::Ast::Toplevel).getAStmt() or + result = c.(R::Ast::Callable).getBody() + } + + class Parameter extends AstNode instanceof R::Ast::Parameter { + AstNode getPattern() { + this.(R::Ast::NamedParameter).getDefiningAccess() = result + or + not exists(this.(R::Ast::NamedParameter).getDefiningAccess()) and + this = result + } + + Expr getDefaultValue() { + result = desugar(this.(R::Ast::KeywordParameter).getDefaultValue()) or + result = desugar(this.(R::Ast::OptionalParameter).getDefaultValue()) + } + } + + Parameter callableGetParameter(Callable c, int index) { + c.(R::Ast::Callable).getParameter(index) = result + } + + class Stmt extends AstNode instanceof R::Ast::Stmt { } + + // Most ast nodes in Ruby are both statements and expressions with only a few + // that are only statements. Similarly, most nodes accept statement children, + // but a few only accept expression children. But since this really only + // matters for parsing, we can just treat expressions and statements as the + // same thing to avoid hard-to-find mistakes. + class Expr = Stmt; + + class BlockStmt extends Stmt instanceof R::Ast::StmtSequence { + BlockStmt() { not this instanceof TryStmt } + + Stmt getStmt(int n) { result = desugar(super.getStmt(n)) } + + Stmt getLastStmt() { result = desugar(super.getLastStmt()) } + } + + class ExprStmt extends Stmt { + ExprStmt() { none() } + + Expr getExpr() { none() } + } + + class IfStmt extends Stmt instanceof R::Ast::ConditionalExpr { + IfStmt() { + exists(Stmt branch | + branch = desugar(super.getBranch(_)) and not branch instanceof R::Ast::Expr + ) + } + + Expr getCondition() { result = desugar(super.getCondition()) } + + Stmt getThen() { result = desugar(super.getBranch(true)) } + + Stmt getElse() { result = desugar(super.getBranch(false)) } + } + + class LoopStmt extends Stmt instanceof R::Ast::Loop { + Stmt getBody() { result = desugar(super.getBody()) } + } + + class WhileStmt extends LoopStmt instanceof R::Ast::ConditionalLoop { + WhileStmt() { this instanceof R::Ast::WhileExpr or this instanceof R::Ast::WhileModifierExpr } + + Expr getCondition() { result = desugar(super.getCondition()) } + } + + class UntilStmt extends LoopStmt instanceof R::Ast::ConditionalLoop { + UntilStmt() { this instanceof R::Ast::UntilExpr or this instanceof R::Ast::UntilModifierExpr } + + Expr getCondition() { result = desugar(super.getCondition()) } + } + + class DoStmt extends LoopStmt { + DoStmt() { none() } + + Expr getCondition() { none() } + } + + class ForStmt extends LoopStmt { + ForStmt() { none() } + + AstNode getInit(int index) { none() } + + Expr getCondition() { none() } + + AstNode getUpdate(int index) { none() } + } + + // `ForExpr` would be a match for `ForeachStmt`, but it is desugared. + class ForeachStmt extends LoopStmt { + ForeachStmt() { none() } + + Expr getVariable() { none() } + + Expr getCollection() { none() } + } + + class BreakStmt extends Stmt instanceof R::Ast::BreakStmt { } + + class ContinueStmt extends Stmt instanceof R::Ast::NextStmt { } + + class GotoStmt extends Stmt { + GotoStmt() { none() } + } + + class ReturnStmt extends Stmt instanceof R::Ast::ReturnStmt { + Expr getExpr() { result = desugar(super.getValue()) } + } + + // raise is just a method call + class Throw extends AstNode { + Throw() { none() } + + Expr getExpr() { none() } + } + + class TryStmt extends Stmt instanceof R::Ast::BodyStmt { + TryStmt() { exists(this.getRescue(_)) or exists(this.getElse()) or this.hasEnsure() } + + AstNode getBody(int index) { result = desugar(super.getStmt(index)) } + + CatchClause getCatch(int index) { result = super.getRescue(index) } + + Stmt getFinally() { result = super.getEnsure() } + } + + AstNode getTryElse(TryStmt try) { result = try.(R::Ast::BodyStmt).getElse() } + + class CatchClause extends AstNode instanceof R::Ast::RescueClause { + AstNode getPattern() { result = desugar(super.getPattern()) } + + AstNode getVariable() { result = super.getVariableExpr() } + + Expr getCondition() { none() } + + Stmt getBody() { result = super.getBody() } + } + + class Switch extends AstNode instanceof R::Ast::CaseExpr { + Expr getExpr() { result = desugar(super.getValue()) } + + Case getCase(int index) { result = super.getBranch(index) } + + Stmt getStmt(int index) { none() } + } + + class Case extends AstNode { + Case() { this = any(R::Ast::CaseExpr switch).getABranch() } + + AstNode getPattern(int index) { + desugar(this.(R::Ast::WhenClause).getPattern(index)) = result + or + desugar(this.(R::Ast::InClause).getPattern()) = result and index = 0 + } + + Expr getGuard() { desugar(this.(R::Ast::InClause).getCondition()) = result } + + AstNode getBody() { + desugar(this.(R::Ast::WhenClause).getBody()) = result or + desugar(this.(R::Ast::InClause).getBody()) = result or + desugar(this.(R::Ast::CaseElseBranch).getBody()) = result + } + } + + class DefaultCase extends Case instanceof R::Ast::CaseElseBranch { } + + predicate fallsThrough(Case c) { none() } + + class ConditionalExpr extends Expr instanceof R::Ast::ConditionalExpr { + ConditionalExpr() { not this instanceof IfStmt } + + Expr getCondition() { result = desugar(super.getCondition()) } + + Expr getThen() { result = desugar(super.getBranch(true)) } + + Expr getElse() { result = desugar(super.getBranch(false)) } + } + + class BinaryExpr extends Expr { + BinaryExpr() { this instanceof R::Ast::BinaryOperation or this instanceof R::Ast::Assignment } + + Expr getLeftOperand() { + result = desugar(this.(R::Ast::BinaryOperation).getLeftOperand()) or + result = desugar(this.(R::Ast::Assignment).getLeftOperand()) + } + + Expr getRightOperand() { + result = desugar(this.(R::Ast::BinaryOperation).getRightOperand()) or + result = desugar(this.(R::Ast::Assignment).getRightOperand()) + } + } + + class LogicalAndExpr extends BinaryExpr instanceof R::Ast::LogicalAndExpr { } + + class LogicalOrExpr extends BinaryExpr instanceof R::Ast::LogicalOrExpr { } + + class NullCoalescingExpr extends BinaryExpr { + NullCoalescingExpr() { none() } + } + + class UnaryExpr extends Expr instanceof R::Ast::UnaryOperation { + Expr getOperand() { result = desugar(super.getOperand()) } + } - /** Gets the basic block that this control flow node belongs to. */ - BasicBlock getBasicBlock() { result.getANode() = this } + class LogicalNotExpr extends UnaryExpr instanceof R::Ast::NotExpr { } + + class Assignment extends BinaryExpr instanceof R::Ast::Assignment { } + + class AssignExpr extends Assignment instanceof R::Ast::AssignExpr { } + + // Compound assignments are desugared. + class CompoundAssignment extends Assignment { + CompoundAssignment() { none() } + } + + class AssignLogicalAndExpr extends CompoundAssignment { } + + class AssignLogicalOrExpr extends CompoundAssignment { } + + class AssignNullCoalescingExpr extends CompoundAssignment { } + + class BooleanLiteral extends Expr instanceof R::Ast::BooleanLiteral { + boolean getValue() { result = super.getValue() } + } + + class PatternMatchExpr extends Expr { + PatternMatchExpr() { none() } + + Expr getExpr() { none() } + + AstNode getPattern() { none() } + } +} + +private predicate rescuable(R::Ast::AstNode n) { + exists(R::Ast::RescueModifierExpr rescueModifier | n = desugar(rescueModifier.getBody())) + or + exists(Ast::TryStmt try | n = try.getBody(_)) + or + exists(R::Ast::AstNode parent | n = desugar(parent.getAChild()) and rescuable(parent)) } -class Split = Splitting::Split; +/** + * Holds if `c` happens in an exception-aware context, that is, it may be + * `rescue`d or `ensure`d. In such cases, we assume that the target of `c` + * may raise an exception (in addition to evaluating normally). + */ +private predicate mayRaise(R::Ast::Call c) { rescuable(c) } + +private module Input implements InputSig1, InputSig2 { + private import codeql.util.Void + private import codeql.util.Unit + private import internal.NonReturning + + predicate cfgCachedStageRef() { CfgCachedStage::ref() } + + class Label = Void; -/** Provides different kinds of control flow graph splittings. */ -module Split { - class ConditionalCompletionSplit = Splitting::ConditionalCompletionSplit; + predicate preOrderExpr(Ast::Expr e) { + e instanceof R::Ast::StmtSequence or + e instanceof R::Ast::RescueClause or + e instanceof R::Ast::ConditionalExpr or + e instanceof R::Ast::Loop or + e instanceof R::Ast::RescueModifierExpr + } + + predicate postOrInOrder(Ast::AstNode n) { + n instanceof R::Ast::Call and + not n instanceof R::Ast::BinaryOperation and + not n instanceof R::Ast::UnaryOperation + or + n instanceof R::Ast::RedoStmt + or + n instanceof R::Ast::RetryStmt + } + + class CallableContext = Unit; + + Ast::AstNode callableGetBodyPart(Ast::Callable c, CallableContext ctx, int index) { + exists(R::Ast::Toplevel t | + c = t and + exists(ctx) + | + result = t.getBeginBlock(index) or + result = desugar(t.getStmt(index - count(t.getABeginBlock()))) + ) + } + + predicate catchAll(Ast::CatchClause catch) { + not exists(catch.(R::Ast::RescueClause).getAnException()) + } + + predicate beginAbruptCompletion( + Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always + ) { + ast.(NonReturningCall).getASuccessorType() = c.asSimpleAbruptCompletion() and + n.isIn(ast) and + always = true + or + mayRaise(ast) and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof ExceptionSuccessor and + always = false + or + ast instanceof R::Ast::RedoStmt and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof RedoSuccessor and + always = true + or + ast instanceof R::Ast::RetryStmt and + n.isIn(ast) and + c.asSimpleAbruptCompletion() instanceof RetrySuccessor and + always = true + } + + predicate endAbruptCompletion(Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c) { + exists(R::Ast::Callable callable | + callable.getBody() = ast and + n.(NormalExitNodeImpl).getEnclosingCallable() = callable + | + c.asSimpleAbruptCompletion() instanceof BreakSuccessor or + c.asSimpleAbruptCompletion() instanceof ContinueSuccessor or + c.asSimpleAbruptCompletion() instanceof RedoSuccessor + ) + or + exists(R::Ast::RescueModifierExpr rescueModifier | + ast = desugar(rescueModifier.getBody()) and + c.getSuccessorType() instanceof ExceptionSuccessor and + n.isBefore(desugar(rescueModifier.getHandler())) + ) + or + ast = any(Ast::LoopStmt loop).getBody() and + c.asSimpleAbruptCompletion() instanceof RedoSuccessor and + n.isBefore(ast) + or + exists(Ast::TryStmt try | + ast = try.getCatch(_).getBody() and + c.asSimpleAbruptCompletion() instanceof RetrySuccessor and + n.isBefore(try.getBody(0)) + ) + } + + predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { + exists(Ast::ConditionalExpr ce | + n1.isAfterTrue(ce.getCondition()) and not exists(ce.getThen()) and n2.isAfter(ce) + or + n1.isAfterFalse(ce.getCondition()) and not exists(ce.getElse()) and n2.isAfter(ce) + ) + or + exists(R::Ast::RescueModifierExpr rescueModifier | + n1.isBefore(rescueModifier) and + n2.isBefore(desugar(rescueModifier.getBody())) + or + n1.isAfter(desugar(rescueModifier.getBody())) and + n2.isAfter(rescueModifier) + or + n1.isAfter(desugar(rescueModifier.getHandler())) and + n2.isAfter(rescueModifier) + ) + } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll deleted file mode 100644 index bcfe8f98d437..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Completion.qll +++ /dev/null @@ -1,565 +0,0 @@ -/** - * Provides classes representing control flow completions. - * - * A completion represents how a statement or expression terminates. - */ -overlay[local] -module; - -private import codeql.ruby.AST -private import codeql.ruby.ast.internal.AST -private import codeql.ruby.ast.internal.Control -private import codeql.ruby.controlflow.ControlFlowGraph -private import ControlFlowGraphImpl as CfgImpl -private import NonReturning - -private newtype TCompletion = - TSimpleCompletion() or - TBooleanCompletion(boolean b) { b in [false, true] } or - TMatchingCompletion(boolean isMatch) { isMatch in [false, true] } or - TReturnCompletion() or - TBreakCompletion() or - TNextCompletion() or - TRedoCompletion() or - TRetryCompletion() or - TRaiseCompletion() or // TODO: Add exception type? - TExitCompletion() or - TNestedCompletion(TCompletion inner, TCompletion outer, int nestLevel) { - inner = TBreakCompletion() and - outer instanceof NonNestedNormalCompletion and - nestLevel = 0 - or - inner instanceof TBooleanCompletion and - outer instanceof TMatchingCompletion and - nestLevel = 0 - or - inner instanceof NormalCompletion and - nestedEnsureCompletion(outer, nestLevel) - } - -pragma[noinline] -private predicate nestedEnsureCompletion(TCompletion outer, int nestLevel) { - ( - outer = TReturnCompletion() - or - outer = TBreakCompletion() - or - outer = TNextCompletion() - or - outer = TRedoCompletion() - or - outer = TRetryCompletion() - or - outer = TRaiseCompletion() - or - outer = TExitCompletion() - ) and - nestLevel = any(CfgImpl::Trees::BodyStmtTree t).getNestLevel() -} - -pragma[noinline] -private predicate completionIsValidForStmt(AstNode n, Completion c) { - n instanceof BreakStmt and - c = TBreakCompletion() - or - n instanceof NextStmt and - c = TNextCompletion() - or - n instanceof RedoStmt and - c = TRedoCompletion() - or - n instanceof ReturnStmt and - c = TReturnCompletion() -} - -private AstNode getARescuableBodyChild() { - exists(CfgImpl::Trees::BodyStmtTree bst | result = bst.getBodyChild(_, true) | - exists(bst.getARescue()) - or - exists(bst.getEnsure()) - ) - or - result = getARescuableBodyChild().getAChild() -} - -/** - * Holds if `c` happens in an exception-aware context, that is, it may be - * `rescue`d or `ensure`d. In such cases, we assume that the target of `c` - * may raise an exception (in addition to evaluating normally). - */ -private predicate mayRaise(Call c) { c = getARescuableBodyChild() } - -/** A completion of a statement or an expression. */ -abstract class Completion extends TCompletion { - private predicate isValidForSpecific0(AstNode n) { - this = n.(NonReturningCall).getACompletion() - or - completionIsValidForStmt(n, this) - or - mustHaveBooleanCompletion(n) and - ( - exists(boolean value | isBooleanConstant(n, value) | this = TBooleanCompletion(value)) - or - not isBooleanConstant(n, _) and - this = TBooleanCompletion(_) - ) - or - mustHaveMatchingCompletion(n) and - this = TMatchingCompletion(_) - or - n = any(RescueModifierExpr parent).getBody() and - this = [TSimpleCompletion().(TCompletion), TRaiseCompletion()] - } - - private predicate isValidForSpecific(AstNode n) { - this.isValidForSpecific0(n) - or - exists(AstNode other | n = other.getDesugared() and this.isValidForSpecific(other)) - or - mayRaise(n) and - ( - this = TRaiseCompletion() - or - not any(Completion c).isValidForSpecific0(n) and - this = TSimpleCompletion() - ) - } - - /** Holds if this completion is valid for node `n`. */ - predicate isValidFor(AstNode n) { - this.isValidForSpecific(n) - or - not any(Completion c).isValidForSpecific(n) and - this = TSimpleCompletion() - } - - /** - * Holds if this completion will continue a loop when it is the completion - * of a loop body. - */ - predicate continuesLoop() { - this instanceof NormalCompletion or - this instanceof NextCompletion - } - - /** - * Gets the inner completion. This is either the inner completion, - * when the completion is nested, or the completion itself. - */ - Completion getInnerCompletion() { result = this } - - /** - * Gets the outer completion. This is either the outer completion, - * when the completion is nested, or the completion itself. - */ - Completion getOuterCompletion() { result = this } - - /** Gets a successor type that matches this completion. */ - abstract SuccessorType getAMatchingSuccessorType(); - - /** Gets a textual representation of this completion. */ - abstract string toString(); -} - -/** Holds if node `n` has the Boolean constant value `value`. */ -private predicate isBooleanConstant(AstNode n, boolean value) { - mustHaveBooleanCompletion(n) and - ( - n.(BooleanLiteral).isTrue() and - value = true - or - n.(BooleanLiteral).isFalse() and - value = false - ) -} - -/** - * Holds if a normal completion of `n` must be a Boolean completion. - */ -private predicate mustHaveBooleanCompletion(AstNode n) { - inBooleanContext(n) and - not n instanceof NonReturningCall -} - -/** - * Holds if `n` is used in a Boolean context. That is, the value - * that `n` evaluates to determines a true/false branch successor. - */ -private predicate inBooleanContext(AstNode n) { - exists(ConditionalExpr i | - n = i.getCondition() - or - inBooleanContext(i) and - n = i.getBranch(_) - ) - or - n = any(ConditionalLoop parent).getCondition() - or - n = any(InClause parent).getCondition() - or - exists(LogicalAndExpr parent | - n = parent.getLeftOperand() - or - inBooleanContext(parent) and - n = parent.getRightOperand() - ) - or - exists(LogicalOrExpr parent | - n = parent.getLeftOperand() - or - inBooleanContext(parent) and - n = parent.getRightOperand() - ) - or - n = any(NotExpr parent | inBooleanContext(parent)).getOperand() - or - n = any(StmtSequence parent | inBooleanContext(parent)).getLastStmt() - or - exists(CaseExpr c, WhenClause w | - not exists(c.getValue()) and - c.getABranch() = w - | - w.getPattern(_) = n - or - w = n - ) -} - -/** - * Holds if a normal completion of `n` must be a matching completion. - */ -private predicate mustHaveMatchingCompletion(AstNode n) { - inMatchingContext(n) and - not n instanceof NonReturningCall -} - -/** - * Holds if `n` is used in a matching context. That is, whether or - * not the value of `n` matches, determines the successor. - */ -private predicate inMatchingContext(AstNode n) { - n = any(RescueClause r).getException(_) - or - exists(CaseExpr c, WhenClause w | - exists(c.getValue()) and - c.getABranch() = w - | - w.getPattern(_) = n - or - w = n - ) - or - n instanceof CasePattern - or - n = any(ReferencePattern p).getExpr() - or - n.(CfgImpl::Trees::DefaultValueParameterTree).hasDefaultValue() -} - -/** - * A completion that represents normal evaluation of a statement or an - * expression. - */ -abstract class NormalCompletion extends Completion { } - -abstract private class NonNestedNormalCompletion extends NormalCompletion { } - -/** A simple (normal) completion. */ -class SimpleCompletion extends NonNestedNormalCompletion, TSimpleCompletion { - override DirectSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { result = "simple" } -} - -/** - * A completion that represents evaluation of an expression, whose value determines - * the successor. Either a Boolean completion (`BooleanCompletion`), or a matching - * completion (`MatchingCompletion`). - */ -abstract class ConditionalCompletion extends NormalCompletion { - boolean value; - - bindingset[value] - ConditionalCompletion() { any() } - - /** Gets the Boolean value of this conditional completion. */ - final boolean getValue() { result = value } -} - -/** - * A completion that represents evaluation of an expression - * with a Boolean value. - */ -class BooleanCompletion extends ConditionalCompletion, NonNestedNormalCompletion, TBooleanCompletion -{ - BooleanCompletion() { this = TBooleanCompletion(value) } - - /** Gets the dual Boolean completion. */ - BooleanCompletion getDual() { result = TBooleanCompletion(value.booleanNot()) } - - override BooleanSuccessor getAMatchingSuccessorType() { result.getValue() = value } - - override string toString() { result = value.toString() } -} - -/** A Boolean `true` completion. */ -class TrueCompletion extends BooleanCompletion { - TrueCompletion() { this.getValue() = true } -} - -/** A Boolean `false` completion. */ -class FalseCompletion extends BooleanCompletion { - FalseCompletion() { this.getValue() = false } -} - -/** - * A completion that represents evaluation of a matching test, for example - * a test in a `rescue` statement. - */ -class MatchingCompletion extends ConditionalCompletion { - MatchingCompletion() { - this = TMatchingCompletion(value) - or - this = TNestedCompletion(_, TMatchingCompletion(value), _) - } - - override ConditionalSuccessor getAMatchingSuccessorType() { - this = TMatchingCompletion(result.(MatchingSuccessor).getValue()) - } - - override string toString() { if value = true then result = "match" else result = "no-match" } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a return. - */ -class ReturnCompletion extends Completion { - ReturnCompletion() { - this = TReturnCompletion() or - this = TNestedCompletion(_, TReturnCompletion(), _) - } - - override ReturnSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TReturnCompletion() and result = "return" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a break from a loop. - */ -class BreakCompletion extends Completion { - BreakCompletion() { - this = TBreakCompletion() or - this = TNestedCompletion(_, TBreakCompletion(), _) - } - - override BreakSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TBreakCompletion() and result = "break" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a continuation of a loop. - */ -class NextCompletion extends Completion { - NextCompletion() { - this = TNextCompletion() or - this = TNestedCompletion(_, TNextCompletion(), _) - } - - override ContinueSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TNextCompletion() and result = "next" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a redo of a loop iteration. - */ -class RedoCompletion extends Completion { - RedoCompletion() { - this = TRedoCompletion() or - this = TNestedCompletion(_, TRedoCompletion(), _) - } - - override RedoSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRedoCompletion() and result = "redo" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a retry. - */ -class RetryCompletion extends Completion { - RetryCompletion() { - this = TRetryCompletion() or - this = TNestedCompletion(_, TRetryCompletion(), _) - } - - override RetrySuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRetryCompletion() and result = "retry" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in a thrown exception. - */ -class RaiseCompletion extends Completion { - RaiseCompletion() { - this = TRaiseCompletion() or - this = TNestedCompletion(_, TRaiseCompletion(), _) - } - - override ExceptionSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TRaiseCompletion() and result = "raise" - } -} - -/** - * A completion that represents evaluation of a statement or an - * expression resulting in an abort/exit. - */ -class ExitCompletion extends Completion { - ExitCompletion() { - this = TExitCompletion() or - this = TNestedCompletion(_, TExitCompletion(), _) - } - - override ExitSuccessor getAMatchingSuccessorType() { any() } - - override string toString() { - // `NestedCompletion` defines `toString()` for the other case - this = TExitCompletion() and result = "exit" - } -} - -/** - * A nested completion. For example, in - * - * ```rb - * def m - * while x >= 0 - * x -= 1 - * if num > 100 - * break - * end - * end - * puts "done" - * end - * ``` - * - * the `while` loop can have a nested completion where the inner completion - * is a `break` and the outer completion is a simple successor. - */ -abstract class NestedCompletion extends Completion, TNestedCompletion { - Completion inner; - Completion outer; - int nestLevel; - - NestedCompletion() { this = TNestedCompletion(inner, outer, nestLevel) } - - /** Gets a completion that is compatible with the inner completion. */ - Completion getAnInnerCompatibleCompletion() { - result.getOuterCompletion() = this.getInnerCompletion() - } - - /** Gets the level of this nested completion. */ - final int getNestLevel() { result = nestLevel } - - override string toString() { result = outer + " [" + inner + "] (" + nestLevel + ")" } -} - -class NestedBreakCompletion extends NormalCompletion, NestedCompletion { - NestedBreakCompletion() { - inner = TBreakCompletion() and - outer instanceof NonNestedNormalCompletion - } - - override BreakCompletion getInnerCompletion() { result = inner } - - override NonNestedNormalCompletion getOuterCompletion() { result = outer } - - override Completion getAnInnerCompatibleCompletion() { - result = inner and - outer = TSimpleCompletion() - or - result = TNestedCompletion(outer, inner, _) - } - - override SuccessorType getAMatchingSuccessorType() { - outer instanceof SimpleCompletion and - result instanceof BreakSuccessor - or - result = outer.(ConditionalCompletion).getAMatchingSuccessorType() - } -} - -class NestedEnsureCompletion extends NestedCompletion { - NestedEnsureCompletion() { - inner instanceof NormalCompletion and - nestedEnsureCompletion(outer, nestLevel) - } - - override NormalCompletion getInnerCompletion() { result = inner } - - override Completion getOuterCompletion() { result = outer } - - override SuccessorType getAMatchingSuccessorType() { none() } -} - -/** - * A completion used for conditions in pattern matching: - * - * ```rb - * in x if x == 5 then puts "five" - * in x unless x == 4 then puts "not four" - * ``` - * - * The outer (Matching) completion indicates whether there is a match, and - * the inner (Boolean) completion indicates what the condition evaluated - * to. - * - * For the condition `x == 5` above, `TNestedCompletion(true, true, 0)` and - * `TNestedCompletion(false, false, 0)` are both valid completions, while - * `TNestedCompletion(true, false, 0)` and `TNestedCompletion(false, true, 0)` - * are valid completions for `x == 4`. - */ -class NestedMatchingCompletion extends NestedCompletion, MatchingCompletion { - NestedMatchingCompletion() { - inner instanceof TBooleanCompletion and - outer instanceof TMatchingCompletion - } - - override BooleanCompletion getInnerCompletion() { result = inner } - - override MatchingCompletion getOuterCompletion() { result = outer } - - override BooleanSuccessor getAMatchingSuccessorType() { - result.getValue() = this.getInnerCompletion().getValue() - } - - override string toString() { result = NestedCompletion.super.toString() } -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll deleted file mode 100644 index e66e8bad0037..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ /dev/null @@ -1,1510 +0,0 @@ -/** - * Provides an implementation for constructing control-flow graphs (CFGs) from - * abstract syntax trees (ASTs), using the shared library from `codeql.controlflow.Cfg`. - */ -overlay[local] -module; - -private import codeql.controlflow.Cfg as CfgShared -private import codeql.ruby.AST -private import codeql.ruby.AST as Ast -private import codeql.ruby.ast.internal.AST as AstInternal -private import codeql.ruby.ast.internal.Scope -private import codeql.ruby.ast.internal.Synthesis -private import codeql.ruby.ast.Scope -private import codeql.ruby.ast.internal.TreeSitter -private import codeql.ruby.ast.internal.Variable -private import codeql.ruby.controlflow.ControlFlowGraph -private import Completion - -class AstNode extends Ast::AstNode { - AstNode() { not any(Synthesis s).excludeFromControlFlowTree(this) } -} - -private module CfgInput implements CfgShared::InputSig { - private import ControlFlowGraphImpl as Impl - private import Completion as Comp - private import codeql.ruby.CFG as Cfg - - class AstNode = Impl::AstNode; - - class Completion = Comp::Completion; - - predicate completionIsNormal(Completion c) { c instanceof Comp::NormalCompletion } - - predicate completionIsSimple(Completion c) { c instanceof Comp::SimpleCompletion } - - predicate completionIsValidFor(Completion c, AstNode e) { c.isValidFor(e) } - - class CfgScope = Cfg::CfgScope; - - CfgScope getCfgScope(AstNode n) { result = Impl::getCfgScope(n) } - - predicate scopeFirst(CfgScope scope, AstNode first) { scope.(Impl::CfgScopeImpl).entry(first) } - - predicate scopeLast(CfgScope scope, AstNode last, Completion c) { - scope.(Impl::CfgScopeImpl).exit(last, c) - } - - private class SuccessorType = Cfg::SuccessorType; - - SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() } - - private predicate id(Ruby::AstNode node1, Ruby::AstNode node2) { node1 = node2 } - - private predicate idOf(Ruby::AstNode node, int id) = equivalenceRelation(id/2)(node, id) - - int idOfAstNode(AstNode node) { idOf(AstInternal::toGeneratedInclSynth(node), result) } - - int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) } -} - -private module CfgSplittingInput implements CfgShared::SplittingInputSig { - private import Splitting as S - - class SplitKindBase = S::TSplitKind; - - class Split = S::Split; -} - -private module ConditionalCompletionSplittingInput implements - CfgShared::ConditionalCompletionSplittingInputSig -{ - import Splitting::ConditionalCompletionSplitting::ConditionalCompletionSplittingInput -} - -import CfgShared::MakeWithSplitting - -abstract class CfgScopeImpl extends AstNode { - abstract predicate entry(AstNode first); - - abstract predicate exit(AstNode last, Completion c); -} - -private class ToplevelScope extends CfgScopeImpl, Toplevel { - final override predicate entry(AstNode first) { first(this, first) } - - final override predicate exit(AstNode last, Completion c) { last(this, last, c) } -} - -private class EndBlockScope extends CfgScopeImpl, EndBlock { - final override predicate entry(AstNode first) { - first(this.(Trees::EndBlockTree).getBodyChild(0, _), first) - } - - final override predicate exit(AstNode last, Completion c) { - last(this.(Trees::EndBlockTree).getLastBodyChild(), last, c) - or - last(this.(Trees::EndBlockTree).getBodyChild(_, _), last, c) and - not c instanceof NormalCompletion - } -} - -private class CallableScope extends CfgScopeImpl, Callable { - final override predicate entry(AstNode first) { - first(this.(Trees::CallableTree).getBodyChild(0), first) - } - - final override predicate exit(AstNode last, Completion c) { - this.getBody().(Trees::BodyStmtTree).last(last, c) - or - exists(int i | - not exists(this.getBody()) and - last(this.(Trees::CallableTree).getBodyChild(i), last, c) and - not exists(this.(Trees::CallableTree).getBodyChild(i + 1)) - ) - or - exists(AstNode child | - child = this.(Trees::CallableTree).getBodyChild(_) and - not child = this.getBody() and - last(child, last, c) and - not c instanceof NormalCompletion - ) - } -} - -/** Holds if `first` is first executed when entering `scope`. */ -pragma[nomagic] -predicate succEntry(CfgScopeImpl scope, AstNode first) { scope.entry(first) } - -/** Holds if `last` with completion `c` can exit `scope`. */ -pragma[nomagic] -predicate succExit(CfgScopeImpl scope, AstNode last, Completion c) { scope.exit(last, c) } - -/** Defines the CFG by dispatch on the various AST types. */ -module Trees { - private class AliasStmtTree extends StandardPreOrderTree instanceof AliasStmt { - final override ControlFlowTree getChildNode(int i) { - result = super.getNewName() and i = 0 - or - result = super.getOldName() and i = 1 - } - } - - private class ArgumentListTree extends StandardPostOrderTree instanceof ArgumentList { - final override ControlFlowTree getChildNode(int i) { result = super.getElement(i) } - } - - private class AssignExprTree extends StandardPostOrderTree instanceof AssignExpr { - AssignExprTree() { - exists(Expr left | left = super.getLeftOperand() | - left instanceof VariableAccess or - left instanceof ConstantAccess - ) - } - - final override ControlFlowTree getChildNode(int i) { - result = super.getLeftOperand() and i = 0 - or - result = super.getRightOperand() and i = 1 - } - } - - private class BeginTree extends BodyStmtTree instanceof BeginExpr { - final override predicate propagatesAbnormal(AstNode child) { none() } - } - - private class BlockArgumentTree extends StandardPostOrderTree instanceof BlockArgument { - final override ControlFlowTree getChildNode(int i) { result = super.getValue() and i = 0 } - } - - abstract private class NonDefaultValueParameterTree extends ControlFlowTree instanceof NamedParameter - { - final override predicate first(AstNode first) { - super.getDefiningAccess().(ControlFlowTree).first(first) - or - not exists(super.getDefiningAccess()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - super.getDefiningAccess().(ControlFlowTree).last(last, c) - or - not exists(super.getDefiningAccess()) and - last = this and - c.isValidFor(this) - } - - override predicate propagatesAbnormal(AstNode child) { - super.getDefiningAccess().(ControlFlowTree).propagatesAbnormal(child) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class BlockParameterTree extends NonDefaultValueParameterTree instanceof BlockParameter { - } - - class BodyStmtTree extends StmtSequenceTree instanceof BodyStmt { - /** Gets a rescue clause in this block. */ - final RescueClause getARescue() { result = super.getRescue(_) } - - /** Gets the `ensure` clause in this block, if any. */ - final StmtSequence getEnsure() { result = super.getEnsure() } - - override predicate first(AstNode first) { - first(this.getBodyChild(0, _), first) - or - not exists(this.getBodyChild(_, _)) and - first(super.getEnsure(), first) - } - - override predicate last(AstNode last, Completion c) { - exists(boolean ensurable | last = this.getAnEnsurePredecessor(c, ensurable) | - not super.hasEnsure() - or - ensurable = false - ) - or - // If the body completes normally, take the completion from the `ensure` block - this.lastEnsure(last, c, any(NormalCompletion nc), _) - or - // If the `ensure` block completes normally, it inherits any non-normal - // completion from the body - c = - any(NestedEnsureCompletion nec | - this.lastEnsure(last, nec.getAnInnerCompatibleCompletion(), nec.getOuterCompletion(), - nec.getNestLevel()) - ) - or - not exists(this.getBodyChild(_, _)) and - not exists(super.getRescue(_)) and - this.lastEnsure0(last, c) - or - last([super.getEnsure().(AstNode), this.getBodyChild(_, false)], last, c) and - not c instanceof NormalCompletion - } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(this.getBodyChild(i, _), pred, c) and - first(this.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - or - // Exceptional flow from body to first `rescue` - this.lastBody(pred, c, true) and - first(super.getRescue(0), succ) and - c instanceof RaiseCompletion - or - // Flow from one `rescue` clause to the next when there is no match - exists(RescueTree rescue, int i | rescue = super.getRescue(i) | - rescue.lastNoMatch(pred, c) and - first(super.getRescue(i + 1), succ) - ) - or - // Flow from body to `else` block when no exception - this.lastBody(pred, c, _) and - first(super.getElse(), succ) and - c instanceof NormalCompletion - or - // Flow into `ensure` block - pred = this.getAnEnsurePredecessor(c, true) and - first(super.getEnsure(), succ) - } - - /** - * Gets a last element from this block that may finish with completion `c`, such - * that control may be transferred to the `ensure` block (if it exists), but only - * if `ensurable = true`. - */ - pragma[nomagic] - private AstNode getAnEnsurePredecessor(Completion c, boolean ensurable) { - this.lastBody(result, c, ensurable) and - ( - // Any non-throw completion will always continue directly to the `ensure` block, - // unless there is an `else` block - not c instanceof RaiseCompletion and - not exists(super.getElse()) - or - // Any completion will continue to the `ensure` block when there are no `rescue` - // blocks - not exists(super.getRescue(_)) - ) - or - // Last element from any matching `rescue` block continues to the `ensure` block - last(super.getRescue(_), result, c) and - ensurable = true - or - // If the last `rescue` block does not match, continue to the `ensure` block - exists(int lst, MatchingCompletion mc | - super.getRescue(lst).(RescueTree).lastNoMatch(result, mc) and - mc.getValue() = false and - not exists(super.getRescue(lst + 1)) and - c = - any(NestedEnsureCompletion nec | - nec.getOuterCompletion() instanceof RaiseCompletion and - nec.getInnerCompletion() = mc and - nec.getNestLevel() = 0 - ) and - ensurable = true - ) - or - // Last element of `else` block continues to the `ensure` block - last(super.getElse(), result, c) and - ensurable = true - } - - pragma[nomagic] - private predicate lastEnsure0(AstNode last, Completion c) { last(super.getEnsure(), last, c) } - - /** - * Gets a descendant that belongs to the `ensure` block of this block, if any. - * Nested `ensure` blocks are not included. - */ - pragma[nomagic] - AstNode getAnEnsureDescendant() { - result = super.getEnsure() - or - exists(AstNode mid | - mid = this.getAnEnsureDescendant() and - result = mid.getAChild() and - getCfgScope(result) = getCfgScope(mid) and - not exists(BodyStmt nestedBlock | - result = nestedBlock.getEnsure() and - nestedBlock != this - ) - ) - } - - /** - * Holds if `innerBlock` has an `ensure` block and is immediately nested inside the - * `ensure` block of this block. - */ - private predicate nestedEnsure(BodyStmtTree innerBlock) { - exists(StmtSequence innerEnsure | - innerEnsure = this.getAnEnsureDescendant().getAChild() and - getCfgScope(innerEnsure) = getCfgScope(this) and - innerEnsure = innerBlock.getEnsure() - ) - } - - /** - * Gets the `ensure`-nesting level of this block. That is, the number of `ensure` - * blocks that this block is nested under. - */ - int getNestLevel() { result = count(BodyStmtTree outer | outer.nestedEnsure+(this)) } - - pragma[nomagic] - private predicate lastEnsure( - AstNode last, NormalCompletion ensure, Completion outer, int nestLevel - ) { - this.lastEnsure0(last, ensure) and - exists( - this.getAnEnsurePredecessor(any(Completion c0 | outer = c0.getOuterCompletion()), true) - ) and - nestLevel = this.getNestLevel() - } - - /** - * Holds if `last` is a last element in the body of this block. `ensurable` - * indicates whether `last` may be a predecessor of an `ensure` block. - */ - pragma[nomagic] - private predicate lastBody(AstNode last, Completion c, boolean ensurable) { - exists(boolean rescuable | - if c instanceof RaiseCompletion then ensurable = rescuable else ensurable = true - | - last(this.getBodyChild(_, rescuable), last, c) and - not c instanceof NormalCompletion - or - exists(int lst | - last(this.getBodyChild(lst, rescuable), last, c) and - not exists(this.getBodyChild(lst + 1, _)) - ) - ) - } - } - - private class BooleanLiteralTree extends LeafTree instanceof BooleanLiteral { } - - class BraceBlockTree extends CallableTree instanceof BraceBlock { - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getLocalVariable(i - super.getNumberOfParameters()) - or - result = super.getBody() and - i = super.getNumberOfParameters() + count(super.getALocalVariable()) - } - } - - class CallableTree extends PostOrderTree instanceof Callable { - final override predicate propagatesAbnormal(AstNode child) { none() } - - override predicate first(AstNode first) { first = this } - - abstract AstNode getBodyChild(int i); - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(int i | - last(this.getBodyChild(i), pred, c) and - first(this.getBodyChild(i + 1), succ) and - c instanceof NormalCompletion - ) - } - } - - private class CallTree extends StandardPostOrderTree instanceof Call { - CallTree() { - // Logical operations are handled separately - not this instanceof UnaryLogicalOperation and - not this instanceof BinaryLogicalOperation and - // Calls with the `&.` operator are desugared - not this.(MethodCall).isSafeNavigation() - } - - override ControlFlowTree getChildNode(int i) { result = super.getArgument(i) } - } - - private class CaseTree extends PostOrderTree instanceof CaseExpr, AstInternal::TCaseExpr { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getValue() or child = super.getABranch() - } - - final override predicate first(AstNode first) { - first(super.getValue(), first) - or - not exists(super.getValue()) and first(super.getBranch(0), first) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getValue(), pred, c) and - first(super.getBranch(0), succ) and - c instanceof SimpleCompletion - or - exists(int i, WhenTree branch | branch = super.getBranch(i) | - pred = branch and - first(super.getBranch(i + 1), succ) and - c.isValidFor(branch) and - c.(ConditionalCompletion).getValue() = false - ) - or - succ = this and - c instanceof NormalCompletion and - ( - last(super.getValue(), pred, c) and not exists(super.getABranch()) - or - last(super.getABranch().(WhenClause).getBody(), pred, c) - or - exists(int i, ControlFlowTree lastBranch | - lastBranch = super.getBranch(i) and - not exists(super.getBranch(i + 1)) and - last(lastBranch, pred, c) - ) - ) - } - } - - private class CaseMatchTree extends PostOrderTree instanceof CaseExpr, AstInternal::TCaseMatch { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getValue() or child = super.getABranch() - } - - final override predicate first(AstNode first) { first(super.getValue(), first) } - - final override predicate last(AstNode last, Completion c) { - super.last(last, c) - or - not exists(super.getElseBranch()) and - exists(MatchingCompletion lc, AstNode lastBranch | - lastBranch = max(int i | | super.getBranch(i) order by i) and - lc.getValue() = false and - last(lastBranch, last, lc) and - c instanceof RaiseCompletion and - not c instanceof NestedCompletion - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getValue(), pred, c) and - first(super.getBranch(0), succ) and - c instanceof SimpleCompletion - or - exists(int i, AstNode branch | branch = super.getBranch(i) | - last(branch, pred, c) and - first(super.getBranch(i + 1), succ) and - c.(MatchingCompletion).getValue() = false - ) - or - succ = this and - c instanceof NormalCompletion and - ( - last(super.getABranch(), pred, c) and - not c.(MatchingCompletion).getValue() = false - or - last(super.getElseBranch(), pred, c) - ) - } - } - - private class CaseElseBranchTree extends ControlFlowTree instanceof CaseElseBranch { - final override predicate propagatesAbnormal(AstNode child) { child = super.getBody() } - - final override predicate first(AstNode first) { first(super.getBody(), first) } - - final override predicate last(AstNode last, Completion c) { last(super.getBody(), last, c) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class PatternVariableAccessTree extends LocalVariableAccessTree instanceof LocalVariableWriteAccess, - CasePattern - { - final override predicate last(AstNode last, Completion c) { - super.last(last, c) and - c.(MatchingCompletion).getValue() = true - } - } - - private class ArrayPatternTree extends ControlFlowTree instanceof ArrayPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getPrefixElement(_) or - child = super.getRestVariableAccess() or - child = super.getSuffixElement(_) - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | - node = super.getClass() or - node = super.getPrefixElement(_) or - node = super.getSuffixElement(_) - | - last(node, last, c) - ) - ) - or - c.(MatchingCompletion).getValue() = true and - last = this and - c.isValidFor(this) and - not exists(super.getPrefixElement(_)) and - not exists(super.getRestVariableAccess()) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getPrefixElement(i) order by i), last, c) and - not exists(super.getRestVariableAccess()) - or - last(super.getRestVariableAccess(), last, c) and - not exists(super.getSuffixElement(_)) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getSuffixElement(i) order by i), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getPrefixElement(0) - or - not exists(super.getPrefixElement(_)) and - next = super.getRestVariableAccess() - ) - or - last(max(int i | | super.getPrefixElement(i) order by i), pred, c) and - first(super.getRestVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - or - exists(int i | - last(super.getPrefixElement(i), pred, c) and - first(super.getPrefixElement(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - or - last(super.getRestVariableAccess(), pred, c) and - first(super.getSuffixElement(0), succ) and - c instanceof SimpleCompletion - or - exists(int i | - last(super.getSuffixElement(i), pred, c) and - first(super.getSuffixElement(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - } - } - - private class FindPatternTree extends ControlFlowTree instanceof FindPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getPrefixVariableAccess() or - child = super.getElement(_) or - child = super.getSuffixVariableAccess() - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - last(super.getSuffixVariableAccess(), last, c) - or - last(max(int i | | super.getElement(i) order by i), last, c) and - not exists(super.getSuffixVariableAccess()) - or - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | node = super.getClass() or node = super.getElement(_) | - last(node, last, c) - ) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getPrefixVariableAccess() - or - not exists(super.getPrefixVariableAccess()) and - next = super.getElement(0) - ) - or - last(super.getPrefixVariableAccess(), pred, c) and - first(super.getElement(0), succ) and - c instanceof SimpleCompletion - or - c.(MatchingCompletion).getValue() = true and - exists(int i | - last(super.getElement(i), pred, c) and - first(super.getElement(i + 1), succ) - ) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getElement(i) order by i), pred, c) and - first(super.getSuffixVariableAccess(), succ) - } - } - - private class HashPatternTree extends ControlFlowTree instanceof HashPattern { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getClass() or - child = super.getValue(_) or - child = super.getRestVariableAccess() - } - - final override predicate first(AstNode first) { - first(super.getClass(), first) - or - not exists(super.getClass()) and first = this - } - - final override predicate last(AstNode last, Completion c) { - c.(MatchingCompletion).getValue() = false and - ( - last = this and - c.isValidFor(this) - or - exists(AstNode node | - node = super.getClass() or - node = super.getValue(_) - | - last(node, last, c) - ) - ) - or - c.(MatchingCompletion).getValue() = true and - last = this and - not exists(super.getValue(_)) and - not exists(super.getRestVariableAccess()) - or - c.(MatchingCompletion).getValue() = true and - last(max(int i | | super.getValue(i) order by i), last, c) and - not exists(super.getRestVariableAccess()) - or - last(super.getRestVariableAccess(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getClass(), pred, c) and - succ = this and - c.(MatchingCompletion).getValue() = true - or - exists(AstNode next | - pred = this and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getValue(0) - or - not exists(super.getValue(_)) and - next = super.getRestVariableAccess() - ) - or - last(max(int i | | super.getValue(i) order by i), pred, c) and - first(super.getRestVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - or - exists(int i | - last(super.getValue(i), pred, c) and - first(super.getValue(i + 1), succ) and - c.(MatchingCompletion).getValue() = true - ) - } - } - - private class LineLiteralTree extends LeafTree instanceof LineLiteral { } - - private class FileLiteralTree extends LeafTree instanceof FileLiteral { } - - private class EncodingLiteralTree extends LeafTree instanceof EncodingLiteral { } - - private class AlternativePatternTree extends PreOrderTree instanceof AlternativePattern { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnAlternative() } - - final override predicate last(AstNode last, Completion c) { - last(super.getAnAlternative(), last, c) and - c.(MatchingCompletion).getValue() = true - or - last(max(int i | | super.getAlternative(i) order by i), last, c) and - c.(MatchingCompletion).getValue() = false - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getAlternative(0), succ) and - c instanceof SimpleCompletion - or - exists(int i | - last(super.getAlternative(i), pred, c) and - first(super.getAlternative(i + 1), succ) and - c.(MatchingCompletion).getValue() = false - ) - } - } - - private class AsPatternTree extends PreOrderTree instanceof AsPattern { - final override predicate propagatesAbnormal(AstNode child) { child = super.getPattern() } - - final override predicate last(AstNode last, Completion c) { - last(super.getPattern(), last, c) and - c.(MatchingCompletion).getValue() = false - or - last(super.getVariableAccess(), last, any(SimpleCompletion x)) and - c.(MatchingCompletion).getValue() = true and - not c instanceof NestedCompletion - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getPattern(), succ) and - c instanceof SimpleCompletion - or - last(super.getPattern(), pred, c) and - first(super.getVariableAccess(), succ) and - c.(MatchingCompletion).getValue() = true - } - } - - private class ParenthesizedPatternTree extends StandardPreOrderTree instanceof ParenthesizedPattern - { - override ControlFlowTree getChildNode(int i) { result = super.getPattern() and i = 0 } - } - - private class ReferencePatternTree extends StandardPreOrderTree instanceof ReferencePattern { - override ControlFlowTree getChildNode(int i) { result = super.getExpr() and i = 0 } - } - - private class InClauseTree extends PreOrderTree instanceof InClause { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getPattern() or - child = super.getCondition() - } - - private predicate lastCondition(AstNode last, BooleanCompletion c, boolean flag) { - last(super.getCondition(), last, c) and - ( - flag = true and super.hasIfCondition() - or - flag = false and super.hasUnlessCondition() - ) - } - - final override predicate last(AstNode last, Completion c) { - last(super.getPattern(), last, c) and - c.(MatchingCompletion).getValue() = false - or - exists(BooleanCompletion bc, boolean flag, MatchingCompletion mc | - this.lastCondition(last, bc, flag) and - c = - any(NestedMatchingCompletion nmc | - nmc.getInnerCompletion() = bc and nmc.getOuterCompletion() = mc - ) - | - mc.getValue() = false and - bc.getValue() = flag.booleanNot() - or - not exists(super.getBody()) and - mc.getValue() = true and - bc.getValue() = flag - ) - or - last(super.getBody(), last, c) - or - not exists(super.getBody()) and - not exists(super.getCondition()) and - last(super.getPattern(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - first(super.getPattern(), succ) and - c instanceof SimpleCompletion - or - exists(Expr next | - last(super.getPattern(), pred, c) and - c.(MatchingCompletion).getValue() = true and - first(next, succ) - | - next = super.getCondition() - or - not exists(super.getCondition()) and next = super.getBody() - ) - or - exists(boolean flag | - this.lastCondition(pred, c, flag) and - c.(BooleanCompletion).getValue() = flag and - first(super.getBody(), succ) - ) - } - } - - private class CharacterTree extends LeafTree instanceof CharacterLiteral { } - - private class ClassDeclarationTree extends NamespaceTree instanceof ClassDeclaration { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getScopeExpr() and i = 0 and rescuable = false - or - result = super.getSuperclassExpr() and - i = count(super.getScopeExpr()) and - rescuable = true - or - result = - super - .getBodyChild(i - count(super.getScopeExpr()) - count(super.getSuperclassExpr()), - rescuable) - } - } - - private class ClassVariableTree extends LeafTree instanceof ClassVariableAccess { } - - private class ConditionalExprTree extends PostOrderTree instanceof ConditionalExpr { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getCondition() or child = super.getBranch(_) - } - - final override predicate first(AstNode first) { first(super.getCondition(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - exists(boolean b | - last(super.getCondition(), pred, c) and - b = c.(BooleanCompletion).getValue() - | - first(super.getBranch(b), succ) - or - not exists(super.getBranch(b)) and - succ = this - ) - or - last(super.getBranch(_), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - private class ConditionalLoopTree extends PostOrderTree instanceof ConditionalLoop { - final override predicate propagatesAbnormal(AstNode child) { child = super.getCondition() } - - final override predicate first(AstNode first) { first(super.getCondition(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getCondition(), pred, c) and - super.entersLoopWhenConditionIs(c.(BooleanCompletion).getValue()) and - first(super.getBody(), succ) - or - last(super.getBody(), pred, c) and - first(super.getCondition(), succ) and - c.continuesLoop() - or - last(super.getBody(), pred, c) and - first(super.getBody(), succ) and - c instanceof RedoCompletion - or - succ = this and - ( - last(super.getCondition(), pred, c) and - super.entersLoopWhenConditionIs(c.(BooleanCompletion).getValue().booleanNot()) - or - last(super.getBody(), pred, c) and - not c.continuesLoop() and - not c instanceof BreakCompletion and - not c instanceof RedoCompletion - or - last(super.getBody(), pred, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion()) - ) - } - } - - private class ConstantAccessTree extends PostOrderTree instanceof ConstantAccess { - ConstantAccessTree() { - not this instanceof ClassDeclaration and - not this instanceof ModuleDeclaration and - // constant accesses with scope expression in compound assignments are desugared - not ( - this = any(AssignOperation op).getLeftOperand() and - exists(super.getScopeExpr()) - ) - } - - final override predicate propagatesAbnormal(AstNode child) { child = super.getScopeExpr() } - - final override predicate first(AstNode first) { - first(super.getScopeExpr(), first) - or - not exists(super.getScopeExpr()) and - first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getScopeExpr(), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - /** A parameter that may have a default value. */ - abstract class DefaultValueParameterTree extends ControlFlowTree { - abstract Expr getDefaultValueExpr(); - - abstract AstNode getAccessNode(); - - predicate hasDefaultValue() { exists(this.getDefaultValueExpr()) } - - final override predicate propagatesAbnormal(AstNode child) { - child = this.getDefaultValueExpr() or child = this.getAccessNode() - } - - final override predicate first(AstNode first) { first = this.getAccessNode() } - - final override predicate last(AstNode last, Completion c) { - last(this.getDefaultValueExpr(), last, c) and - c instanceof NormalCompletion - or - last = this.getAccessNode() and - ( - not this.hasDefaultValue() and - c instanceof SimpleCompletion - or - this.hasDefaultValue() and - c.(MatchingCompletion).getValue() = true and - c.isValidFor(this) - ) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this.getAccessNode() and - first(this.getDefaultValueExpr(), succ) and - c.(MatchingCompletion).getValue() = false - } - } - - private class DestructuredParameterTree extends StandardPostOrderTree instanceof DestructuredParameter - { - final override ControlFlowTree getChildNode(int i) { result = super.getElement(i) } - } - - private class DesugaredTree extends ControlFlowTree { - ControlFlowTree desugared; - - DesugaredTree() { desugared = this.getDesugared() } - - final override predicate propagatesAbnormal(AstNode child) { - desugared.propagatesAbnormal(child) - } - - final override predicate first(AstNode first) { desugared.first(first) } - - final override predicate last(AstNode last, Completion c) { desugared.last(last, c) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - - private class DoBlockTree extends CallableTree instanceof DoBlock { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getLocalVariable(i - super.getNumberOfParameters()) - or - result = super.getBody() and - i = super.getNumberOfParameters() + count(super.getALocalVariable()) - } - } - - private class EmptyStatementTree extends LeafTree instanceof EmptyStmt { } - - class EndBlockTree extends StmtSequenceTree instanceof EndBlock { - override predicate first(AstNode first) { first = this } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(super.getBodyChild(i, _), pred, c) and - first(super.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - } - } - - private class ForwardedArgumentsTree extends LeafTree instanceof ForwardedArguments { } - - private class ForwardParameterTree extends LeafTree instanceof ForwardParameter { } - - private class GlobalVariableTree extends LeafTree instanceof GlobalVariableAccess { } - - private class HashSplatNilParameterTree extends LeafTree instanceof HashSplatNilParameter { } - - private class HashSplatParameterTree extends NonDefaultValueParameterTree instanceof HashSplatParameter - { } - - private class HereDocTree extends StandardPostOrderTree instanceof HereDoc { - final override ControlFlowTree getChildNode(int i) { result = super.getComponent(i) } - } - - private class InstanceVariableTree extends StandardPostOrderTree instanceof InstanceVariableAccess - { - final override ControlFlowTree getChildNode(int i) { result = super.getReceiver() and i = 0 } - } - - private class KeywordParameterTree extends DefaultValueParameterTree instanceof KeywordParameter { - final override Expr getDefaultValueExpr() { result = super.getDefaultValue() } - - final override AstNode getAccessNode() { result = super.getDefiningAccess() } - } - - private class LambdaTree extends CallableTree instanceof Lambda { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - } - - private class LocalVariableAccessTree extends LeafTree instanceof LocalVariableAccess { } - - private class LogicalAndTree extends PostOrderTree instanceof LogicalAndExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnOperand() } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getLeftOperand(), pred, c) and - c instanceof TrueCompletion and - first(super.getRightOperand(), succ) - or - last(super.getLeftOperand(), pred, c) and - c instanceof FalseCompletion and - succ = this - or - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class LogicalNotTree extends PostOrderTree instanceof NotExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getOperand() } - - final override predicate first(AstNode first) { first(super.getOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - succ = this and - last(super.getOperand(), pred, c) and - c instanceof NormalCompletion - } - } - - private class LogicalOrTree extends PostOrderTree instanceof LogicalOrExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getAnOperand() } - - final override predicate first(AstNode first) { first(super.getLeftOperand(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getLeftOperand(), pred, c) and - c instanceof FalseCompletion and - first(super.getRightOperand(), succ) - or - last(super.getLeftOperand(), pred, c) and - c instanceof TrueCompletion and - succ = this - or - last(super.getRightOperand(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class MethodCallTree extends CallTree instanceof MethodCall { - final override ControlFlowTree getChildNode(int i) { - result = super.getReceiver() and i = 0 - or - result = super.getArgument(i - 1) - or - result = super.getBlock() and i = 1 + super.getNumberOfArguments() - } - } - - private class MethodNameTree extends LeafTree instanceof MethodName, AstInternal::TTokenMethodName - { } - - private class MethodTree extends CallableTree instanceof Method { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - } - - private class ModuleDeclarationTree extends NamespaceTree instanceof ModuleDeclaration { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getScopeExpr() and i = 0 and rescuable = false - or - result = NamespaceTree.super.getBodyChild(i - count(super.getScopeExpr()), rescuable) - } - } - - /** - * Namespaces (i.e. modules or classes) behave like other `BodyStmt`s except they are - * executed in pre-order rather than post-order. We do this in order to insert a write for - * `self` before any subsequent reads in the namespace body. - */ - private class NamespaceTree extends BodyStmtTree instanceof Namespace { - final override predicate first(AstNode first) { first = this } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - BodyStmtTree.super.succ(pred, succ, c) - or - pred = this and - super.first(succ) and - c instanceof SimpleCompletion - } - - final override predicate last(AstNode last, Completion c) { - super.last(last, c) - or - not exists(this.getAChild(_)) and - last = this and - c.isValidFor(this) - } - } - - private class NilTree extends LeafTree instanceof NilLiteral { } - - private class NumericLiteralTree extends LeafTree instanceof NumericLiteral { } - - private class OptionalParameterTree extends DefaultValueParameterTree instanceof OptionalParameter - { - final override Expr getDefaultValueExpr() { result = super.getDefaultValue() } - - final override AstNode getAccessNode() { result = super.getDefiningAccess() } - } - - private class PairTree extends StandardPostOrderTree instanceof Pair { - final override ControlFlowTree getChildNode(int i) { - result = super.getKey() and i = 0 - or - result = super.getValue() and i = 1 - } - } - - private class RangeLiteralTree extends StandardPostOrderTree instanceof RangeLiteral { - final override ControlFlowTree getChildNode(int i) { - result = super.getBegin() and i = 0 - or - result = super.getEnd() and i = 1 - } - } - - private class RedoStmtTree extends LeafTree instanceof RedoStmt { } - - private class RescueModifierTree extends PostOrderTree instanceof RescueModifierExpr { - final override predicate propagatesAbnormal(AstNode child) { child = super.getHandler() } - - final override predicate first(AstNode first) { first(super.getBody(), first) } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getBody(), pred, c) and - ( - c instanceof RaiseCompletion and - first(super.getHandler(), succ) - or - not c instanceof RaiseCompletion and - succ = this - ) - or - last(super.getHandler(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class RescueTree extends PostOrderTree instanceof RescueClause { - final override predicate propagatesAbnormal(AstNode child) { - child = super.getAnException() or - child = super.getBody() - } - - final override predicate first(AstNode first) { - first(super.getException(0), first) - or - not exists(super.getException(0)) and - ( - first(super.getVariableExpr(), first) - or - not exists(super.getVariableExpr()) and - ( - first(super.getBody(), first) - or - not exists(super.getBody()) and first = this - ) - ) - } - - private Expr getLastException() { - exists(int i | result = super.getException(i) and not exists(super.getException(i + 1))) - } - - predicate lastNoMatch(AstNode last, Completion c) { - last(this.getLastException(), last, c) and - c.(MatchingCompletion).getValue() = false - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(super.getAnException(), pred, c) and - c.(MatchingCompletion).getValue() = true and - ( - first(super.getVariableExpr(), succ) - or - not exists(super.getVariableExpr()) and - ( - first(super.getBody(), succ) - or - not exists(super.getBody()) and succ = this - ) - ) - or - exists(int i | - last(super.getException(i), pred, c) and - c.(MatchingCompletion).getValue() = false and - first(super.getException(i + 1), succ) - ) - or - last(super.getVariableExpr(), pred, c) and - c instanceof NormalCompletion and - ( - first(super.getBody(), succ) - or - not exists(super.getBody()) and succ = this - ) - or - last(super.getBody(), pred, c) and - c instanceof NormalCompletion and - succ = this - } - } - - private class RetryStmtTree extends LeafTree instanceof RetryStmt { } - - private class ReturningStmtTree extends StandardPostOrderTree instanceof ReturningStmt { - final override ControlFlowTree getChildNode(int i) { result = super.getValue() and i = 0 } - } - - private class SimpleParameterTree extends NonDefaultValueParameterTree instanceof SimpleParameter { - } - - // Corner case: For duplicated '_' parameters, only the first occurrence has a defining - // access. For subsequent parameters we simply include the parameter itself in the CFG - private class SimpleParameterTreeDupUnderscore extends LeafTree instanceof SimpleParameter { - SimpleParameterTreeDupUnderscore() { not exists(this.getDefiningAccess()) } - } - - private class SingletonClassTree extends BodyStmtTree instanceof SingletonClass { - final override predicate first(AstNode first) { - super.first(first) - or - not exists(this.getAChild(_)) and - first = this - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - BodyStmtTree.super.succ(pred, succ, c) - or - succ = this and - super.last(pred, c) - } - - final override predicate last(AstNode last, Completion c) { - last = this and - c.isValidFor(this) - } - - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i, boolean rescuable) { - ( - result = super.getValue() and i = 0 and rescuable = false - or - result = BodyStmtTree.super.getBodyChild(i - 1, rescuable) - ) - } - } - - private class SingletonMethodTree extends CallableTree instanceof SingletonMethod { - /** Gets the `i`th child in the body of this block. */ - final override AstNode getBodyChild(int i) { - result = super.getParameter(i) - or - result = super.getBody() and i = super.getNumberOfParameters() - } - - override predicate first(AstNode first) { first(super.getObject(), first) } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - CallableTree.super.succ(pred, succ, c) - or - last(super.getObject(), pred, c) and - succ = this and - c instanceof NormalCompletion - } - } - - private class SplatParameterTree extends NonDefaultValueParameterTree instanceof SplatParameter { - } - - class StmtSequenceTree extends PostOrderTree instanceof StmtSequence { - override predicate propagatesAbnormal(AstNode child) { child = super.getAStmt() } - - override predicate first(AstNode first) { - // If this sequence contains any statements, go to the first one. - first(super.getStmt(0), first) - or - // Otherwise, treat this node as a leaf node. - not exists(super.getStmt(0)) and first = this - } - - /** Gets the `i`th child in the body of this body statement. */ - AstNode getBodyChild(int i, boolean rescuable) { - result = super.getStmt(i) and - rescuable = true - } - - final AstNode getLastBodyChild() { - exists(int i | - result = this.getBodyChild(i, _) and - not exists(this.getBodyChild(i + 1, _)) - ) - } - - override predicate succ(AstNode pred, AstNode succ, Completion c) { - // Normal left-to-right evaluation in the body - exists(int i | - last(this.getBodyChild(i, _), pred, c) and - first(this.getBodyChild(i + 1, _), succ) and - c instanceof NormalCompletion - ) - or - succ = this and - last(this.getLastBodyChild(), pred, c) and - c instanceof NormalCompletion - } - } - - private class StringConcatenationTree extends StandardPostOrderTree instanceof StringConcatenation - { - final override ControlFlowTree getChildNode(int i) { result = super.getString(i) } - } - - private class StringlikeLiteralTree extends StandardPostOrderTree instanceof StringlikeLiteral { - StringlikeLiteralTree() { - not this instanceof HereDoc and - not this instanceof AstInternal::TSimpleSymbolLiteralSynth - } - - final override ControlFlowTree getChildNode(int i) { result = super.getComponent(i) } - } - - private class StringComponentTree extends LeafTree instanceof StringComponent { - StringComponentTree() { - // Interpolations contain `StmtSequence`s, so they shouldn't be treated as leaf nodes. - not this instanceof StringInterpolationComponent and - // In the interests of brevity we treat regexes as string literals when constructing the CFG. - // Thus we must exclude regex interpolations here too. - not this instanceof RegExpInterpolationComponent - } - } - - private class ToplevelTree extends BodyStmtTree instanceof Toplevel { - final override AstNode getBodyChild(int i, boolean rescuable) { - result = super.getBeginBlock(i) and rescuable = true - or - result = BodyStmtTree.super.getBodyChild(i - count(super.getABeginBlock()), rescuable) - } - } - - private class UndefStmtTree extends StandardPreOrderTree instanceof UndefStmt { - final override ControlFlowTree getChildNode(int i) { result = super.getMethodName(i) } - } - - private class WhenTree extends ControlFlowTree instanceof WhenClause { - final override predicate propagatesAbnormal(AstNode child) { - child = [super.getAPattern(), super.getBody()] - } - - final Expr getLastPattern() { - exists(int i | - result = super.getPattern(i) and - not exists(super.getPattern(i + 1)) - ) - } - - final override predicate first(AstNode first) { first(super.getPattern(0), first) } - - final override predicate last(AstNode last, Completion c) { - last = this and - c.isValidFor(this) and - c.(ConditionalCompletion).getValue() = false - or - last(super.getBody(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { - pred = this and - c.isValidFor(this) and - c.(ConditionalCompletion).getValue() = true and - first(super.getBody(), succ) - or - exists(int i, Expr p, boolean b | - p = super.getPattern(i) and - last(p, pred, c) and - b = c.(ConditionalCompletion).getValue() - | - b = true and - succ = this - or - b = false and - first(super.getPattern(i + 1), succ) - or - not exists(super.getPattern(i + 1)) and - succ = this - ) - } - } -} - -private Scope parent(Scope n) { - result = n.getOuterScope() and - not n instanceof CfgScopeImpl -} - -cached -private CfgScope getCfgScopeImpl(AstNode n) { result = parent*(scopeOfInclSynth(n)) } - -/** Gets the CFG scope of node `n`. */ -pragma[inline] -CfgScope getCfgScope(AstNode n) { - exists(AstNode n0 | - pragma[only_bind_into](n0) = n and - pragma[only_bind_into](result) = getCfgScopeImpl(n0) - ) -} diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll index 387fb03dc9a8..e1f2e2397729 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/Guards.qll @@ -6,9 +6,15 @@ private import codeql.ruby.CFG /** Holds if the guard `guard` controls block `bb` upon evaluating to `branch`. */ pragma[nomagic] predicate guardControlsBlock(CfgNodes::AstCfgNode guard, BasicBlock bb, boolean branch) { - exists(ConditionBlock conditionBlock, ConditionalSuccessor s | + exists(BasicBlock conditionBlock, ConditionalSuccessor s | guard = conditionBlock.getLastNode() and s.getValue() = branch and conditionBlock.edgeDominates(bb, s) ) + or + exists(ConditionalSuccessor s, ControlFlowNode guardNode | + guardNode.isAfterValue(guard.getAstNode(), s) and + s.getValue() = branch and + guardNode.getBasicBlock().dominates(bb) + ) } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll index 45b299a5d2b7..36061ea5f635 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/internal/NonReturning.qll @@ -3,22 +3,22 @@ overlay[local] module; private import codeql.ruby.AST -private import Completion +private import codeql.controlflow.SuccessorType /** A call that definitely does not return (conservative analysis). */ abstract class NonReturningCall extends MethodCall { - /** Gets a valid completion for this non-returning call. */ - abstract Completion getACompletion(); + /** Gets a valid successor type for this non-returning call. */ + abstract AbruptSuccessor getASuccessorType(); } private class RaiseCall extends NonReturningCall { RaiseCall() { this.getMethodName() = "raise" } - override RaiseCompletion getACompletion() { not result instanceof NestedCompletion } + override ExceptionSuccessor getASuccessorType() { any() } } private class ExitCall extends NonReturningCall { ExitCall() { this.getMethodName() in ["abort", "exit"] } - override ExitCompletion getACompletion() { not result instanceof NestedCompletion } + override ExitSuccessor getASuccessorType() { any() } } diff --git a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll b/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll deleted file mode 100644 index 737f450b4f23..000000000000 --- a/ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll +++ /dev/null @@ -1,348 +0,0 @@ -/** - * Provides classes and predicates relevant for splitting the control flow graph. - */ -overlay[local] -module; - -private import codeql.ruby.AST as Ast -private import Completion as Comp -private import Comp -private import ControlFlowGraphImpl -private import codeql.ruby.controlflow.ControlFlowGraph - -cached -private module Cached { - cached - newtype TSplitKind = - TConditionalCompletionSplitKind() { forceCachingInSameStage() } or - TEnsureSplitKind(int nestLevel) { nestLevel = any(Trees::BodyStmtTree t).getNestLevel() } - - cached - newtype TSplit = - TConditionalCompletionSplit(ConditionalCompletion c) or - TEnsureSplit(EnsureSplitting::EnsureSplitType type, int nestLevel) { - nestLevel = any(Trees::BodyStmtTree t).getNestLevel() - } -} - -import Cached - -/** A split for a control flow node. */ -class Split extends TSplit { - /** Gets a textual representation of this split. */ - string toString() { none() } -} - -module ConditionalCompletionSplitting { - /** - * A split for conditional completions. For example, in - * - * ```rb - * def method x - * if x < 2 and x > 0 - * puts "x is 1" - * end - * end - * ``` - * - * we record whether `x < 2` and `x > 0` evaluate to `true` or `false`, and - * restrict the edges out of `x < 2 and x > 0` accordingly. - */ - class ConditionalCompletionSplit extends Split, TConditionalCompletionSplit { - ConditionalCompletion completion; - - ConditionalCompletionSplit() { this = TConditionalCompletionSplit(completion) } - - ConditionalCompletion getCompletion() { result = completion } - - override string toString() { result = completion.toString() } - } - - private class ConditionalCompletionSplitKind_ extends SplitKind, TConditionalCompletionSplitKind { - override int getListOrder() { result = 0 } - - override predicate isEnabled(AstNode n) { this.appliesTo(n) } - - override string toString() { result = "ConditionalCompletion" } - } - - module ConditionalCompletionSplittingInput { - private import Completion as Comp - - class ConditionalCompletion = Comp::ConditionalCompletion; - - class ConditionalCompletionSplitKind extends ConditionalCompletionSplitKind_, TSplitKind { } - - class ConditionalCompletionSplit = ConditionalCompletionSplitting::ConditionalCompletionSplit; - - bindingset[parent, parentCompletion] - predicate condPropagateExpr( - AstNode parent, ConditionalCompletion parentCompletion, AstNode child, - ConditionalCompletion childCompletion - ) { - child = parent.(Ast::NotExpr).getOperand() and - childCompletion.(BooleanCompletion).getDual() = parentCompletion - or - childCompletion = parentCompletion and - ( - child = parent.(Ast::LogicalAndExpr).getAnOperand() - or - child = parent.(Ast::LogicalOrExpr).getAnOperand() - or - child = parent.(Ast::StmtSequence).getLastStmt() - or - child = parent.(Ast::ConditionalExpr).getBranch(_) - ) - } - } - - int getNextListOrder() { result = 1 } - - private class ConditionalCompletionSplitImpl extends SplitImplementations::ConditionalCompletionSplitting::ConditionalCompletionSplitImpl - { - override predicate hasEntry(AstNode pred, AstNode succ, Completion c) { - super.hasEntry(pred, succ, c) - or - // a non-standard case is needed for `when` clauses - succ(pred, succ, c) and - succ instanceof Ast::WhenClause and - c = this.getCompletion() - } - } -} - -class ConditionalCompletionSplit = ConditionalCompletionSplitting::ConditionalCompletionSplit; - -module EnsureSplitting { - /** - * The type of a split `ensure` node. - * - * The type represents one of the possible ways of entering an `ensure` - * block. For example, if a block ends with a `return` statement, then - * the `ensure` block must end with a `return` as well (provided that - * the `ensure` block executes normally). - */ - class EnsureSplitType extends SuccessorType { - EnsureSplitType() { not this instanceof ConditionalSuccessor } - - /** Holds if this split type matches entry into an `ensure` block with completion `c`. */ - predicate isSplitForEntryCompletion(Completion c) { - if c instanceof NormalCompletion - then - // If the entry into the `ensure` block completes with any normal completion, - // it simply means normal execution after the `ensure` block - this instanceof DirectSuccessor - else this = c.getAMatchingSuccessorType() - } - } - - /** A node that belongs to an `ensure` block. */ - private class EnsureNode extends AstNode { - private Trees::BodyStmtTree block; - - EnsureNode() { this = block.getAnEnsureDescendant() } - - int getNestLevel() { result = block.getNestLevel() } - - /** Holds if this node is the entry node in the `ensure` block it belongs to. */ - predicate isEntryNode() { first(block.getEnsure(), this) } - - Ast::BodyStmt getBlock() { result = block } - - pragma[noinline] - predicate isEntered(AstNode pred, int nestLevel, Completion c) { - this.isEntryNode() and - nestLevel = this.getNestLevel() and - succ(pred, this, c) and - // the entry node may be reachable via a backwards loop edge; in this case - // the split has already been entered - not pred = block.getAnEnsureDescendant() - } - } - - /** - * A split for nodes belonging to an `ensure` block, which determines how to - * continue execution after leaving the `ensure` block. For example, in - * - * ```rb - * begin - * if x - * raise "Exception" - * end - * ensure - * puts "Ensure" - * end - * ``` - * - * all control flow nodes in the `ensure` block have two splits: one representing - * normal execution of the body (when `x` evaluates to `true`), and one representing - * exceptional execution of the body (when `x` evaluates to `false`). - */ - class EnsureSplit extends Split, TEnsureSplit { - private EnsureSplitType type; - private int nestLevel; - - EnsureSplit() { this = TEnsureSplit(type, nestLevel) } - - /** - * Gets the type of this `ensure` split, that is, how to continue execution after the - * `ensure` block. - */ - EnsureSplitType getType() { result = type } - - /** Gets the nesting level. */ - int getNestLevel() { result = nestLevel } - - override string toString() { - if type instanceof DirectSuccessor - then result = "" - else - if nestLevel > 0 - then result = "ensure(" + nestLevel + "): " + type.toString() - else result = "ensure: " + type.toString() - } - } - - private int getListOrder(EnsureSplitKind kind) { - result = ConditionalCompletionSplitting::getNextListOrder() + kind.getNestLevel() - } - - int getNextListOrder() { - result = max([getListOrder(_) + 1, ConditionalCompletionSplitting::getNextListOrder()]) - } - - private class EnsureSplitKind extends SplitKind, TEnsureSplitKind { - private int nestLevel; - - EnsureSplitKind() { this = TEnsureSplitKind(nestLevel) } - - /** Gets the nesting level. */ - int getNestLevel() { result = nestLevel } - - override int getListOrder() { result = getListOrder(this) } - - override string toString() { result = "ensure (" + nestLevel + ")" } - } - - private class EnsureSplitImpl extends SplitImpl instanceof EnsureSplit { - override EnsureSplitKind getKind() { result.getNestLevel() = super.getNestLevel() } - - override predicate hasEntry(AstNode pred, AstNode succ, Completion c) { - succ.(EnsureNode).isEntered(pred, super.getNestLevel(), c) and - super.getType().isSplitForEntryCompletion(c) - } - - override predicate hasEntryScope(CfgScope scope, AstNode first) { none() } - - /** - * Holds if this split applies to `pred`, where `pred` is a valid predecessor. - */ - private predicate appliesToPredecessor(AstNode pred) { - this.appliesTo(pred) and - (succ(pred, _, _) or succExit(_, pred, _)) - } - - pragma[noinline] - private predicate exit0(AstNode pred, Trees::BodyStmtTree block, int nestLevel, Completion c) { - this.appliesToPredecessor(pred) and - nestLevel = block.getNestLevel() and - block.last(pred, c) - } - - /** - * Holds if `pred` may exit this split with completion `c`. The Boolean - * `inherited` indicates whether `c` is an inherited completion from the - * body. - */ - private predicate exit(AstNode pred, Completion c, boolean inherited) { - exists(Trees::BodyStmtTree block, EnsureSplitType type | - this.exit0(pred, block, super.getNestLevel(), c) and - type = super.getType() - | - if last(block.getEnsure(), pred, c) - then - // `ensure` block can itself exit with completion `c`: either `c` must - // match this split, `c` must be an abnormal completion, or this split - // does not require another completion to be recovered - inherited = false and - ( - type = c.getAMatchingSuccessorType() - or - not c instanceof NormalCompletion - or - type instanceof DirectSuccessor - ) - else ( - // `ensure` block can exit with inherited completion `c`, which must - // match this split - inherited = true and - type = c.getAMatchingSuccessorType() and - not type instanceof DirectSuccessor - ) - ) - or - // If this split is normal, and an outer split can exit based on an inherited - // completion, we need to exit this split as well. For example, in - // - // ```rb - // def m(b1, b2) - // if b1 - // return - // end - // ensure - // begin - // if b2 - // raise "Exception" - // end - // ensure - // puts "inner ensure" - // end - // end - // ``` - // - // if the outer split for `puts "inner ensure"` is `return` and the inner split - // is "normal" (corresponding to `b1 = true` and `b2 = false`), then the inner - // split must be able to exit with a `return` completion. - this.appliesToPredecessor(pred) and - exists(EnsureSplitImpl outer | - outer.(EnsureSplit).getNestLevel() = super.getNestLevel() - 1 and - outer.exit(pred, c, inherited) and - super.getType() instanceof DirectSuccessor and - inherited = true - ) - } - - override predicate hasExit(AstNode pred, AstNode succ, Completion c) { - succ(pred, succ, c) and - ( - this.exit(pred, c, _) - or - this.exit(pred, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion(), _) - ) - } - - override predicate hasExitScope(CfgScope scope, AstNode last, Completion c) { - succExit(scope, last, c) and - ( - this.exit(last, c, _) - or - this.exit(last, c.(NestedBreakCompletion).getAnInnerCompatibleCompletion(), _) - ) - } - - override predicate hasSuccessor(AstNode pred, AstNode succ, Completion c) { - this.appliesToPredecessor(pred) and - succ(pred, succ, c) and - succ = - any(EnsureNode en | - if en.isEntryNode() and en.getBlock() != pred.(EnsureNode).getBlock() - then - // entering a nested `ensure` block - en.getNestLevel() > super.getNestLevel() - else - // staying in the same (possibly nested) `ensure` block as `pred` - en.getNestLevel() >= super.getNestLevel() - ) - } - } -} diff --git a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll index 08ca08732b6b..d95740a8c867 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/SSA.qll @@ -384,20 +384,7 @@ module Ssa { inp = SsaImpl::phiHasInputFromBlock(this, bb) } - private string getSplitString() { - result = this.getBasicBlock().getFirstNode().(CfgNodes::AstCfgNode).getSplitsString() - } - - override string toString() { - exists(string prefix | - prefix = "[" + this.getSplitString() + "] " - or - not exists(this.getSplitString()) and - prefix = "" - | - result = prefix + "phi" - ) - } + override string toString() { result = "phi" } /* * The location of a phi node is the same as the location of the first node diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll index 3c647f41bbbe..3d3e8a4d0d04 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll @@ -183,7 +183,7 @@ class NormalCall extends DataFlowCall, TNormalCall { override CfgNodes::ExprNodes::CallCfgNode asCall() { result = c } - override DataFlowCallable getEnclosingCallable() { result = TCfgScope(c.getScope()) } + override DataFlowCallable getEnclosingCallable() { result = TCfgScope(c.getEnclosingCallable()) } override string toString() { result = c.toString() } @@ -700,7 +700,7 @@ private CfgScope privateFilter(DataFlowCall call) { // This may remove some plausible targets, but also removes a lot of // implausible targets ( - isToplevelMethodInFile(result, call.asCall().getFile()) or + isToplevelMethodInFile(result, call.asCall().getLocation().getFile()) or not isToplevelMethodInFile(result, _) ) } diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll index c4b696532b66..10dab22ca193 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowPrivate.qll @@ -95,7 +95,7 @@ CfgNodes::ExprCfgNode getPostUpdateReverseStep(CfgNodes::ExprCfgNode e) { pragma[nomagic] Ssa::Definition getParameterDef(NamedParameter p) { exists(BasicBlock bb, int i | - bb.getNode(i).getAstNode() = p.getDefiningAccess() and + bb.getNode(i).injects(p.getDefiningAccess()) and result.definesAt(_, bb, i) ) } @@ -159,7 +159,7 @@ module LocalFlow { exprTo = nodeTo.asExpr() and n.getReturningNode().getAstNode() instanceof BreakStmt and exprTo.getAstNode() instanceof Loop and - nodeTo.asExpr().getAPredecessor(any(BreakSuccessor s)) = n.getReturningNode() + n.getReturningNode().getASuccessor(any(BreakSuccessor s)).getAstNode() = exprTo.getAstNode() ) or nodeFrom.asExpr() = nodeTo.(ReturningStatementNode).getReturningNode().getReturnedValueNode() @@ -285,7 +285,6 @@ predicate isNonConstantExpr(CfgNodes::ExprCfgNode n) { /** Provides logic related to captured variables. */ module VariableCapture { private import codeql.dataflow.VariableCapture as Shared - private import codeql.ruby.controlflow.BasicBlocks as BasicBlocks private predicate closureFlowStep(CfgNodes::ExprCfgNode e1, CfgNodes::ExprCfgNode e2) { e1 = getALastEvalNode(e2) @@ -296,13 +295,11 @@ module VariableCapture { ) } - private module CaptureInput implements Shared::InputSig { + private module CaptureInput implements Shared::InputSig { private import codeql.ruby.controlflow.ControlFlowGraph as Cfg private import TaintTrackingPrivate as TaintTrackingPrivate - Callable basicBlockGetEnclosingCallable(BasicBlocks::Cfg::BasicBlock bb) { - result = bb.getScope() - } + Callable basicBlockGetEnclosingCallable(BasicBlock bb) { result = bb.getScope() } class CapturedVariable extends LocalVariable { CapturedVariable() { @@ -374,7 +371,7 @@ module VariableCapture { class ClosureExpr = CaptureInput::ClosureExpr; - module Flow = Shared::Flow; + module Flow = Shared::Flow; private Flow::ClosureNode asClosureNode(Node n) { result = n.(CaptureNode).getSynthesizedCaptureNode() @@ -864,7 +861,7 @@ class ReturningStatementNode extends NodeImpl, TReturningNode { /** Gets the expression corresponding to this node. */ CfgNodes::ReturningCfgNode getReturningNode() { result = n } - override CfgScope getCfgScopeImpl() { result = n.getScope() } + override CfgScope getCfgScopeImpl() { result = n.getEnclosingCallable() } override Location getLocationImpl() { result = n.getLocation() } @@ -1364,7 +1361,7 @@ module ArgumentNodes { this.sourceArgumentOf(call.asCall(), pos) } - override CfgScope getCfgScopeImpl() { result = yield.getScope() } + override CfgScope getCfgScopeImpl() { result = yield.getEnclosingCallable() } override Location getLocationImpl() { result = yield.getLocation() } } @@ -1394,7 +1391,7 @@ module ArgumentNodes { this.sourceArgumentOf(call.asCall(), pos) } - override CfgScope getCfgScopeImpl() { result = sup.getScope() } + override CfgScope getCfgScopeImpl() { result = sup.getEnclosingCallable() } override Location getLocationImpl() { result = sup.getLocation() } } @@ -1617,7 +1614,7 @@ private module ReturnNodes { private predicate isValid(CfgNodes::ReturningCfgNode node) { exists(ReturningStmt stmt, Callable scope | stmt = node.getAstNode() and - scope = node.getScope() + scope = node.getEnclosingCallable() | stmt instanceof ReturnStmt and (scope instanceof Method or scope instanceof SingletonMethod or scope instanceof Lambda) @@ -1637,8 +1634,8 @@ private module ReturnNodes { class ExplicitReturnNode extends SourceReturnNode, ReturningStatementNode { ExplicitReturnNode() { isValid(n) and - n.getASuccessor().(CfgNodes::AnnotatedExitNode).isNormal() and - n.getScope() instanceof Callable + n.getASuccessor() instanceof ControlFlow::NormalExitNode and + n.getEnclosingCallable() instanceof Callable } override ReturnKind getKindSource() { @@ -2414,9 +2411,7 @@ module TypeInference { private predicate hasTypeCheckedRead( Ssa::Definition def, CfgNodes::ExprCfgNode caseRead, CfgNodes::ExprCfgNode read, Module m ) { - exists( - CfgNodes::ExprCfgNode pattern, ConditionBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case - | + exists(CfgNodes::ExprCfgNode pattern, BasicBlock cb, CfgNodes::ExprNodes::CaseExprCfgNode case | m = resolveConstantReadAccess(pattern.getExpr()) and cb.getLastNode() = pattern and cb.edgeDominates(read.getBasicBlock(), any(MatchingSuccessor match | match.getValue() = true)) and diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll index 74394150ca32..9f5dfd9dcc25 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/SsaImpl.qll @@ -4,13 +4,11 @@ module; private import codeql.ssa.Ssa as SsaImplCommon private import codeql.ruby.AST private import codeql.ruby.CFG as Cfg -private import codeql.ruby.controlflow.BasicBlocks as BasicBlocks -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl as ControlFlowGraphImpl private import codeql.ruby.dataflow.SSA private import codeql.ruby.ast.Variable private import Cfg::CfgNodes::ExprNodes -private class BasicBlock = BasicBlocks::Cfg::BasicBlock; +private class BasicBlock = Cfg::BasicBlock; module SsaInput implements SsaImplCommon::InputSig { private import codeql.ruby.controlflow.ControlFlowGraph as Cfg @@ -25,11 +23,11 @@ module SsaInput implements SsaImplCommon::InputSig { ( exists(Scope scope | scope = v.(SelfVariable).getDeclaringScope() | // We consider the `self` variable to have a single write at the entry to a method block... - scope = bb.(BasicBlocks::EntryBasicBlock).getScope() and + scope = bb.(Cfg::EntryBasicBlock).getScope() and i = 0 or // ...or a class or module block. - bb.getNode(i).getAstNode() = scope.(ModuleBase).getAControlFlowEntryNode() and + bb.getNode(i).isBefore(scope.(ModuleBase)) and not scope instanceof Toplevel // handled by case above ) or @@ -60,7 +58,7 @@ module SsaInput implements SsaImplCommon::InputSig { } } -import SsaImplCommon::Make as Impl +import SsaImplCommon::Make as Impl class Definition = Impl::Definition; @@ -98,12 +96,17 @@ private predicate writesCapturedVariable(Cfg::BasicBlock bb, LocalVariable v) { ) } +private predicate isAnnotatedExitBlock(BasicBlock bb) { + bb.getANode() instanceof Cfg::ControlFlow::AnnotatedExitNode +} + /** * Holds if a pseudo read of captured variable `v` should be inserted * at index `i` in exit block `bb`. */ -private predicate capturedExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, LocalVariable v) { +private predicate capturedExitRead(BasicBlock bb, int i, LocalVariable v) { writesCapturedVariable(bb.getAPredecessor*(), v) and + isAnnotatedExitBlock(bb) and i = bb.length() } @@ -112,13 +115,11 @@ private predicate capturedExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, Local * at index `i` in basic block `bb`. We do this to ensure that namespace * self-variables always get an SSA definition. */ -private predicate namespaceSelfExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, SelfVariable v) { - exists(Namespace ns, AstNode last | +private predicate namespaceSelfExitRead(BasicBlock bb, int i, SelfVariable v) { + exists(Namespace ns, Cfg::ControlFlowNode n | v.getDeclaringScope() = ns and - last = ControlFlowGraphImpl::getAControlFlowExitNode(ns) and - if last = ns - then bb.getNode(i).getAPredecessor().getAstNode() = last - else bb.getNode(i).getAstNode() = last + n.isAfter(ns) and + if n.isBefore(ns) then bb.getNode(i - 1) = n else bb.getNode(i) = n ) } @@ -129,7 +130,8 @@ private predicate namespaceSelfExitRead(Cfg::AnnotatedExitBasicBlock bb, int i, pragma[noinline] private predicate hasCapturedRead(Variable v, Cfg::CfgScope scope) { any(LocalVariableReadAccessCfgNode read | - read.getVariable() = v and scope = read.getScope().getOuterCfgScope*() + read.getVariable() = v and + scope = read.getEnclosingCallable().(Cfg::CfgScope).getOuterCfgScope*() ).getExpr().isCapturedAccess() } @@ -177,7 +179,7 @@ private predicate capturedCallRead(CallCfgNode call, Cfg::BasicBlock bb, int i, private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalVariable v) { exists(VariableReadAccess read | read.getVariable() = v and - read = bb.getNode(i).getAstNode() + bb.getNode(i).injects(read) ) } @@ -188,7 +190,8 @@ private predicate variableReadActual(Cfg::BasicBlock bb, int i, LocalVariable v) pragma[noinline] private predicate hasCapturedWrite(Variable v, Cfg::CfgScope scope) { any(LocalVariableWriteAccessCfgNode write | - write.getVariable() = v and scope = write.getScope().getOuterCfgScope*() + write.getVariable() = v and + scope = write.getEnclosingCallable().(Cfg::CfgScope).getOuterCfgScope*() ).getExpr().isCapturedAccess() } @@ -393,7 +396,7 @@ class NormalParameter extends Parameter { pragma[nomagic] Definition getParameterDef(NamedParameter p) { exists(Cfg::BasicBlock bb, int i | - bb.getNode(i).getAstNode() = p.getDefiningAccess() and + bb.getNode(i).injects(p.getDefiningAccess()) and result.definesAt(_, bb, i) ) } diff --git a/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll b/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll index eabee2ea5133..3ffdb915c6f3 100644 --- a/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll +++ b/ruby/ql/lib/codeql/ruby/frameworks/Sinatra.qll @@ -289,7 +289,7 @@ module Sinatra { private predicate blockPostSelf(DataFlow::PostUpdateNode n, DataFlow::BlockNode b) { exists(SelfVariableAccessCfgNode self | n.getPreUpdateNode().asExpr() = self and - self.getScope() = b.asExpr().getAstNode() + self.getEnclosingCallable() = b.asExpr().getAstNode() ) } diff --git a/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll b/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll index a64cd1039c17..cf752c3aaeb1 100644 --- a/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll +++ b/ruby/ql/lib/codeql/ruby/security/ConditionalBypassCustomizations.qll @@ -46,8 +46,8 @@ module ConditionalBypass { SensitiveAction action; SensitiveActionGuardConditional() { - exists(ConditionBlock cb, BasicBlock controlled | - cb.edgeDominates(controlled, _) and + exists(BasicBlock cb, BasicBlock controlled | + cb.edgeDominates(controlled, any(ConditionalSuccessor s)) and controlled.getANode() = action.asExpr() and cb.getLastNode() = this.asExpr() ) diff --git a/ruby/ql/lib/ide-contextual-queries/printCfg.ql b/ruby/ql/lib/ide-contextual-queries/printCfg.ql index 1c4cec61a3ef..c749f035f748 100644 --- a/ruby/ql/lib/ide-contextual-queries/printCfg.ql +++ b/ruby/ql/lib/ide-contextual-queries/printCfg.ql @@ -8,7 +8,6 @@ */ private import codeql.Locations -private import codeql.ruby.controlflow.internal.ControlFlowGraphImpl private import codeql.ruby.controlflow.ControlFlowGraph external string selectedSourceFile(); @@ -23,7 +22,7 @@ external int selectedSourceColumn(); private predicate selectedSourceColumnAlias = selectedSourceColumn/0; -module ViewCfgQueryInput implements ViewCfgQueryInputSig { +module ViewCfgQueryInput implements ControlFlow::ViewCfgQueryInputSig { predicate selectedSourceFile = selectedSourceFileAlias/0; predicate selectedSourceLine = selectedSourceLineAlias/0; @@ -31,11 +30,11 @@ module ViewCfgQueryInput implements ViewCfgQueryInputSig { predicate selectedSourceColumn = selectedSourceColumnAlias/0; predicate cfgScopeSpan( - CfgScope scope, File file, int startLine, int startColumn, int endLine, int endColumn + CfgScopeImpl scope, File file, int startLine, int startColumn, int endLine, int endColumn ) { file = scope.getFile() and scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn) } } -import ViewCfgQuery +import ControlFlow::ViewCfgQuery diff --git a/ruby/ql/src/experimental/performance/UseDetect.ql b/ruby/ql/src/experimental/performance/UseDetect.ql index 56ab99ae4056..61cf8ccd3f33 100644 --- a/ruby/ql/src/experimental/performance/UseDetect.ql +++ b/ruby/ql/src/experimental/performance/UseDetect.ql @@ -42,13 +42,11 @@ class EndCall extends MethodCall { } Expr getUniqueRead(Expr e) { - forex(CfgNode eNode | eNode.getAstNode() = e | - exists(Ssa::WriteDefinition def | - def.assigns(eNode) and - strictcount(def.getARead()) = 1 and - not def = any(Ssa::PhiNode phi).getAnInput() and - def.getARead().getAstNode() = result - ) + exists(Ssa::WriteDefinition def | + def.assigns(e.getControlFlowNode()) and + strictcount(def.getARead()) = 1 and + not def = any(Ssa::PhiNode phi).getAnInput() and + def.getARead().getAstNode() = result ) } diff --git a/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql b/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql index c81cdd6b2f63..67e9ba4f9c77 100644 --- a/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql +++ b/ruby/ql/src/queries/performance/DatabaseQueryInLoop.ql @@ -36,7 +36,7 @@ class LoopingCall extends DataFlow::CallNode { } /** Holds if `c` is executed as part of the body of this loop. */ - predicate executesCall(DataFlow::CallNode c) { c.asExpr().getScope() = loopScope } + predicate executesCall(DataFlow::CallNode c) { c.asExpr().getEnclosingCallable() = loopScope } } /** Holds if `ar` influences a guard that may control the execution of a loop. */ diff --git a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql index 849fb8ecd5a7..70d3191b8a72 100644 --- a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql +++ b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql @@ -19,7 +19,12 @@ import codeql.ruby.ApiGraphs pragma[nomagic] private predicate hasErbResultCall(CfgScope scope) { - scope = API::getTopLevelMember("ERB").getInstance().getAMethodCall("result").asExpr().getScope() + scope = + API::getTopLevelMember("ERB") + .getInstance() + .getAMethodCall("result") + .asExpr() + .getEnclosingCallable() } class RelevantLocalVariableWriteAccess extends LocalVariableWriteAccess { diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql index c99de9bc0a86..de648d227e72 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.ql @@ -1,5 +1,4 @@ import codeql.ruby.controlflow.ControlFlowGraph -import codeql.ruby.controlflow.BasicBlocks query predicate dominates(BasicBlock bb1, BasicBlock bb2) { bb1.dominates(bb2) } @@ -9,14 +8,10 @@ query predicate immediateDominator(BasicBlock bb1, BasicBlock bb2) { bb1.getImmediateDominator() = bb2 } -query predicate controls(ConditionBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { +query predicate controls(BasicBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { bb1.edgeDominates(bb2, t) } -query predicate successor(ConditionBlock bb1, BasicBlock bb2, SuccessorType t) { +query predicate successor(BasicBlock bb1, BasicBlock bb2, ConditionalSuccessor t) { bb1.getASuccessor(t) = bb2 } - -query predicate joinBlockPredecessor(JoinBlock bb1, BasicBlock bb2, int i) { - bb1.getJoinBlockPredecessor(i) = bb2 -} diff --git a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql index 39d0627613e9..54fc30b8eec3 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql +++ b/ruby/ql/test/library-tests/controlflow/graph/Cfg.ql @@ -1,2 +1,2 @@ import codeql.ruby.CFG -import codeql.ruby.controlflow.internal.ControlFlowGraphImpl::TestOutput +import ControlFlow::TestOutput diff --git a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql index 86609a73909c..e4f35886dd70 100644 --- a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql +++ b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.ql @@ -3,7 +3,6 @@ import codeql.ruby.dataflow.internal.DataFlowPublic import codeql.ruby.dataflow.BarrierGuards import codeql.ruby.controlflow.CfgNodes import codeql.ruby.controlflow.ControlFlowGraph -import codeql.ruby.controlflow.BasicBlocks import codeql.ruby.DataFlow import utils.test.InlineExpectationsTest @@ -13,7 +12,7 @@ query predicate newStyleBarrierGuards(DataFlow::Node n) { } query predicate controls(CfgNode condition, BasicBlock bb, ConditionalSuccessor s) { - exists(ConditionBlock cb | + exists(BasicBlock cb | cb.edgeDominates(bb, s) and condition = cb.getLastNode() ) From 1b7dde8f118f2b25d693f572d983e7e0c321c26d Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 5 Aug 2026 14:26:05 +0200 Subject: [PATCH 059/181] Ruby: Accept qltest changes due to removed splitting. --- .../controlflow/graph/Nodes.expected | 50 +- .../dataflow/local/DataflowStep.expected | 631 ++++++----------- .../dataflow/local/Nodes.expected | 64 +- .../dataflow/local/TaintStep.expected | 649 ++++++------------ 4 files changed, 454 insertions(+), 940 deletions(-) diff --git a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected index 54cf1d085433..1bb35e0987c9 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -1,10 +1,6 @@ callsWithNoArguments -| break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | | break_ensure.rb:8:6:8:13 | call to elements | -| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | | break_ensure.rb:8:6:8:18 | call to nil? | -| break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | -| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | | break_ensure.rb:20:10:20:15 | call to nil? | | break_ensure.rb:29:8:29:13 | call to nil? | | case.rb:2:8:2:9 | call to x1 | @@ -26,8 +22,7 @@ callsWithNoArguments | cfg.rb:62:7:62:12 | * ... | | cfg.rb:62:17:62:27 | * ... | | cfg.rb:90:1:93:3 | call to each | -| cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:90:5:90:5 | [true] ! ... | +| cfg.rb:90:5:90:5 | ! ... | | cfg.rb:90:5:90:5 | defined? ... | | cfg.rb:98:10:98:15 | ** ... | | cfg.rb:98:30:98:35 | ** ... | @@ -61,10 +56,9 @@ callsWithNoArguments | desugar.rb:22:18:22:29 | * ... | | desugar.rb:26:6:26:11 | * ... | | desugar.rb:26:15:26:25 | * ... | -| ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:30:4:38 | [true] ! ... | +| ifs.rb:4:30:4:38 | ! ... | | ifs.rb:20:9:20:10 | - ... | -| ifs.rb:41:6:41:10 | [false] ! ... | +| ifs.rb:41:6:41:10 | ! ... | | loops.rb:25:3:27:5 | call to each | | raise.rb:155:3:155:50 | call to each | | raise.rb:155:37:155:48 | call to nil? | @@ -72,25 +66,17 @@ callsWithNoArguments positionalArguments | break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:13:2:13 | 0 | | break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:12:3:12 | 0 | -| break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | | break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:9:10:9:23 | "elements nil" | | break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:13:14:13 | 0 | | break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:14:16:14 | 0 | -| break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | -| break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | | break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:21:14:21:20 | "y nil" | | break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:15:33:15 | 0 | -| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | -| break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | | break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:16:35:16 | 0 | -| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | -| break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | | break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:41:8:41:13 | "Done" | | break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:13:45:13 | 0 | | break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:14:47:14 | 1 | | break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:48:15:48:16 | "" | | break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:14:51:14 | 0 | -| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | | case.rb:3:29:3:37 | call to puts | case.rb:3:34:3:37 | "x2" | | case.rb:4:17:4:24 | call to puts | case.rb:4:22:4:24 | "2" | | case.rb:14:13:14:18 | ... == ... | case.rb:14:18:14:18 | 5 | @@ -263,10 +249,8 @@ positionalArguments | ifs.rb:2:6:2:10 | ... > ... | ifs.rb:2:10:2:10 | 2 | | ifs.rb:3:5:3:30 | call to puts | ifs.rb:3:10:3:30 | "x is greater than 2" | | ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:14:4:14 | 2 | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:20:4:24 | ... > ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:20:4:24 | ... > ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | +| ifs.rb:4:9:4:24 | ... and ... | ifs.rb:4:20:4:24 | ... > ... | +| ifs.rb:4:9:4:38 | ... and ... | ifs.rb:4:30:4:38 | ! ... | | ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:24:4:24 | 0 | | ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:37:4:37 | 5 | | ifs.rb:5:5:5:17 | call to puts | ifs.rb:5:10:5:17 | "x is 1" | @@ -279,8 +263,7 @@ positionalArguments | ifs.rb:38:12:38:17 | ... == ... | ifs.rb:38:17:38:17 | 2 | | ifs.rb:48:5:48:15 | call to puts | ifs.rb:48:10:48:15 | "true" | | ifs.rb:51:3:51:13 | call to puts | ifs.rb:51:8:51:13 | "done" | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:13:55:14 | b2 | +| ifs.rb:55:7:55:14 | ... \|\| ... | ifs.rb:55:13:55:14 | b2 | | ifs.rb:56:5:56:19 | call to puts | ifs.rb:56:10:56:19 | "b1 or b2" | | loops.rb:2:9:2:14 | ... >= ... | loops.rb:2:14:2:14 | 0 | | loops.rb:3:5:3:10 | call to puts | loops.rb:3:10:3:10 | x | @@ -319,16 +302,12 @@ positionalArguments | raise.rb:70:5:70:17 | call to raise | raise.rb:70:11:70:17 | "x > 2" | | raise.rb:71:9:71:13 | ... < ... | raise.rb:71:13:71:13 | 0 | | raise.rb:74:3:74:20 | call to puts | raise.rb:74:8:74:20 | "0 <= x <= 2" | -| raise.rb:76:3:76:15 | [ensure: exception] call to puts | raise.rb:76:8:76:15 | [ensure: exception] "ensure" | -| raise.rb:76:3:76:15 | [ensure: return] call to puts | raise.rb:76:8:76:15 | [ensure: return] "ensure" | | raise.rb:76:3:76:15 | call to puts | raise.rb:76:8:76:15 | "ensure" | | raise.rb:80:3:80:17 | call to puts | raise.rb:80:8:80:17 | "Begin m8" | | raise.rb:82:8:82:12 | ... > ... | raise.rb:82:12:82:12 | 2 | | raise.rb:83:7:83:19 | call to raise | raise.rb:83:13:83:19 | "x > 2" | | raise.rb:84:11:84:15 | ... < ... | raise.rb:84:15:84:15 | 0 | | raise.rb:87:5:87:22 | call to puts | raise.rb:87:10:87:22 | "0 <= x <= 2" | -| raise.rb:89:5:89:17 | [ensure: exception] call to puts | raise.rb:89:10:89:17 | [ensure: exception] "ensure" | -| raise.rb:89:5:89:17 | [ensure: return] call to puts | raise.rb:89:10:89:17 | [ensure: return] "ensure" | | raise.rb:89:5:89:17 | call to puts | raise.rb:89:10:89:17 | "ensure" | | raise.rb:91:3:91:15 | call to puts | raise.rb:91:8:91:15 | "End m8" | | raise.rb:95:3:95:17 | call to puts | raise.rb:95:8:95:17 | "Begin m9" | @@ -336,30 +315,16 @@ positionalArguments | raise.rb:98:7:98:19 | call to raise | raise.rb:98:13:98:19 | "x > 2" | | raise.rb:99:11:99:15 | ... < ... | raise.rb:99:15:99:15 | 0 | | raise.rb:102:5:102:22 | call to puts | raise.rb:102:10:102:22 | "0 <= x <= 2" | -| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | -| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | | raise.rb:104:5:104:23 | call to puts | raise.rb:104:10:104:23 | "outer ensure" | -| raise.rb:107:9:107:26 | [ensure: exception] call to raise | raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | -| raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | | raise.rb:107:9:107:26 | call to raise | raise.rb:107:15:107:26 | "b1 is true" | -| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | -| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | | raise.rb:110:7:110:25 | call to puts | raise.rb:110:12:110:25 | "inner ensure" | | raise.rb:113:3:113:15 | call to puts | raise.rb:113:8:113:15 | "End m9" | -| raise.rb:115:3:115:22 | [ensure: exception] call to puts | raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | -| raise.rb:115:3:115:22 | [ensure: return] call to puts | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | | raise.rb:115:3:115:22 | call to puts | raise.rb:115:8:115:22 | "method ensure" | -| raise.rb:117:5:117:22 | [ensure: exception] call to raise | raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | -| raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | | raise.rb:117:5:117:22 | call to raise | raise.rb:117:11:117:22 | "b2 is true" | | raise.rb:121:14:121:30 | call to raise | raise.rb:121:20:121:30 | "Exception" | | raise.rb:125:3:125:51 | call to puts | raise.rb:125:8:125:51 | "Will not get executed if p is..." | | raise.rb:131:7:131:22 | call to raise | raise.rb:131:13:131:22 | ExceptionA | | raise.rb:135:5:135:21 | call to puts | raise.rb:135:10:135:21 | "ExceptionB" | -| raise.rb:137:5:137:17 | [ensure: exception] call to puts | raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | | raise.rb:137:5:137:17 | call to puts | raise.rb:137:10:137:17 | "Ensure" | | raise.rb:139:3:139:16 | call to puts | raise.rb:139:8:139:16 | "End m11" | | raise.rb:144:5:144:12 | call to raise | raise.rb:144:11:144:12 | "" | @@ -367,8 +332,7 @@ positionalArguments | raise.rb:160:5:162:7 | call to bar | raise.rb:160:9:162:7 | -> { ... } | | raise.rb:161:7:161:14 | call to raise | raise.rb:161:13:161:14 | "" | | raise.rb:168:5:168:12 | call to raise | raise.rb:168:11:168:12 | "" | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:174:14:174:23 | ... == ... | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:174:14:174:23 | ... == ... | +| raise.rb:174:8:174:23 | ... \|\| ... | raise.rb:174:14:174:23 | ... == ... | | raise.rb:174:14:174:23 | ... == ... | raise.rb:174:20:174:23 | true | keywordArguments | cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | media | cfg.html.erb:6:54:6:58 | "all" | diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index f9b7cad4c35f..c919dc71dd5c 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -207,800 +207,700 @@ | UseUseExplosion.rb:20:13:20:17 | [post] self | UseUseExplosion.rb:20:3691:20:3696 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:35:20:39 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:3691:20:3696 | self | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [false] ( ... ) | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [true] ( ... ) | +| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | ( ... ) | | UseUseExplosion.rb:20:26:20:3684 | then ... | UseUseExplosion.rb:20:9:20:3700 | if ... | | UseUseExplosion.rb:20:31:20:3684 | if ... | UseUseExplosion.rb:20:26:20:3684 | then ... | | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:3675:20:3680 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:3675:20:3680 | self | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [false] ( ... ) | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [true] ( ... ) | +| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | ( ... ) | | UseUseExplosion.rb:20:47:20:3668 | then ... | UseUseExplosion.rb:20:31:20:3684 | if ... | | UseUseExplosion.rb:20:52:20:3668 | if ... | UseUseExplosion.rb:20:47:20:3668 | then ... | | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:3659:20:3664 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:3659:20:3664 | self | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [false] ( ... ) | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [true] ( ... ) | +| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | ( ... ) | | UseUseExplosion.rb:20:68:20:3652 | then ... | UseUseExplosion.rb:20:52:20:3668 | if ... | | UseUseExplosion.rb:20:73:20:3652 | if ... | UseUseExplosion.rb:20:68:20:3652 | then ... | | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:3643:20:3648 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:3643:20:3648 | self | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [false] ( ... ) | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [true] ( ... ) | +| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | ( ... ) | | UseUseExplosion.rb:20:89:20:3636 | then ... | UseUseExplosion.rb:20:73:20:3652 | if ... | | UseUseExplosion.rb:20:94:20:3636 | if ... | UseUseExplosion.rb:20:89:20:3636 | then ... | | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:3627:20:3632 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:3627:20:3632 | self | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [false] ( ... ) | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [true] ( ... ) | +| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | ( ... ) | | UseUseExplosion.rb:20:110:20:3620 | then ... | UseUseExplosion.rb:20:94:20:3636 | if ... | | UseUseExplosion.rb:20:115:20:3620 | if ... | UseUseExplosion.rb:20:110:20:3620 | then ... | | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:3611:20:3616 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:3611:20:3616 | self | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [false] ( ... ) | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [true] ( ... ) | +| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | ( ... ) | | UseUseExplosion.rb:20:131:20:3604 | then ... | UseUseExplosion.rb:20:115:20:3620 | if ... | | UseUseExplosion.rb:20:136:20:3604 | if ... | UseUseExplosion.rb:20:131:20:3604 | then ... | | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:3595:20:3600 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:3595:20:3600 | self | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [false] ( ... ) | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [true] ( ... ) | +| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | ( ... ) | | UseUseExplosion.rb:20:152:20:3588 | then ... | UseUseExplosion.rb:20:136:20:3604 | if ... | | UseUseExplosion.rb:20:157:20:3588 | if ... | UseUseExplosion.rb:20:152:20:3588 | then ... | | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:3579:20:3584 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:3579:20:3584 | self | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [false] ( ... ) | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [true] ( ... ) | +| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | ( ... ) | | UseUseExplosion.rb:20:173:20:3572 | then ... | UseUseExplosion.rb:20:157:20:3588 | if ... | | UseUseExplosion.rb:20:178:20:3572 | if ... | UseUseExplosion.rb:20:173:20:3572 | then ... | | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:3563:20:3568 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:3563:20:3568 | self | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [false] ( ... ) | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [true] ( ... ) | +| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | ( ... ) | | UseUseExplosion.rb:20:194:20:3556 | then ... | UseUseExplosion.rb:20:178:20:3572 | if ... | | UseUseExplosion.rb:20:199:20:3556 | if ... | UseUseExplosion.rb:20:194:20:3556 | then ... | | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:3547:20:3552 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:3547:20:3552 | self | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [false] ( ... ) | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [true] ( ... ) | +| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | ( ... ) | | UseUseExplosion.rb:20:215:20:3540 | then ... | UseUseExplosion.rb:20:199:20:3556 | if ... | | UseUseExplosion.rb:20:220:20:3540 | if ... | UseUseExplosion.rb:20:215:20:3540 | then ... | | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:3531:20:3536 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:3531:20:3536 | self | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [false] ( ... ) | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [true] ( ... ) | +| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | ( ... ) | | UseUseExplosion.rb:20:236:20:3524 | then ... | UseUseExplosion.rb:20:220:20:3540 | if ... | | UseUseExplosion.rb:20:241:20:3524 | if ... | UseUseExplosion.rb:20:236:20:3524 | then ... | | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:3515:20:3520 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:3515:20:3520 | self | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [false] ( ... ) | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [true] ( ... ) | +| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | ( ... ) | | UseUseExplosion.rb:20:257:20:3508 | then ... | UseUseExplosion.rb:20:241:20:3524 | if ... | | UseUseExplosion.rb:20:262:20:3508 | if ... | UseUseExplosion.rb:20:257:20:3508 | then ... | | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:3499:20:3504 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:3499:20:3504 | self | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [false] ( ... ) | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [true] ( ... ) | +| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | ( ... ) | | UseUseExplosion.rb:20:278:20:3492 | then ... | UseUseExplosion.rb:20:262:20:3508 | if ... | | UseUseExplosion.rb:20:283:20:3492 | if ... | UseUseExplosion.rb:20:278:20:3492 | then ... | | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:3483:20:3488 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:3483:20:3488 | self | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [false] ( ... ) | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [true] ( ... ) | +| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | ( ... ) | | UseUseExplosion.rb:20:299:20:3476 | then ... | UseUseExplosion.rb:20:283:20:3492 | if ... | | UseUseExplosion.rb:20:304:20:3476 | if ... | UseUseExplosion.rb:20:299:20:3476 | then ... | | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:3467:20:3472 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:3467:20:3472 | self | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [false] ( ... ) | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [true] ( ... ) | +| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | ( ... ) | | UseUseExplosion.rb:20:320:20:3460 | then ... | UseUseExplosion.rb:20:304:20:3476 | if ... | | UseUseExplosion.rb:20:325:20:3460 | if ... | UseUseExplosion.rb:20:320:20:3460 | then ... | | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:3451:20:3456 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:3451:20:3456 | self | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [false] ( ... ) | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [true] ( ... ) | +| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | ( ... ) | | UseUseExplosion.rb:20:341:20:3444 | then ... | UseUseExplosion.rb:20:325:20:3460 | if ... | | UseUseExplosion.rb:20:346:20:3444 | if ... | UseUseExplosion.rb:20:341:20:3444 | then ... | | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:3435:20:3440 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:3435:20:3440 | self | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [false] ( ... ) | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [true] ( ... ) | +| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | ( ... ) | | UseUseExplosion.rb:20:362:20:3428 | then ... | UseUseExplosion.rb:20:346:20:3444 | if ... | | UseUseExplosion.rb:20:367:20:3428 | if ... | UseUseExplosion.rb:20:362:20:3428 | then ... | | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:3419:20:3424 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:3419:20:3424 | self | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [false] ( ... ) | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [true] ( ... ) | +| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | ( ... ) | | UseUseExplosion.rb:20:383:20:3412 | then ... | UseUseExplosion.rb:20:367:20:3428 | if ... | | UseUseExplosion.rb:20:388:20:3412 | if ... | UseUseExplosion.rb:20:383:20:3412 | then ... | | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:3403:20:3408 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:3403:20:3408 | self | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [false] ( ... ) | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [true] ( ... ) | +| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | ( ... ) | | UseUseExplosion.rb:20:404:20:3396 | then ... | UseUseExplosion.rb:20:388:20:3412 | if ... | | UseUseExplosion.rb:20:409:20:3396 | if ... | UseUseExplosion.rb:20:404:20:3396 | then ... | | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:3387:20:3392 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:3387:20:3392 | self | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [false] ( ... ) | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [true] ( ... ) | +| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | ( ... ) | | UseUseExplosion.rb:20:425:20:3380 | then ... | UseUseExplosion.rb:20:409:20:3396 | if ... | | UseUseExplosion.rb:20:430:20:3380 | if ... | UseUseExplosion.rb:20:425:20:3380 | then ... | | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:3371:20:3376 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:3371:20:3376 | self | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [false] ( ... ) | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [true] ( ... ) | +| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | ( ... ) | | UseUseExplosion.rb:20:446:20:3364 | then ... | UseUseExplosion.rb:20:430:20:3380 | if ... | | UseUseExplosion.rb:20:451:20:3364 | if ... | UseUseExplosion.rb:20:446:20:3364 | then ... | | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:3355:20:3360 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:3355:20:3360 | self | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [false] ( ... ) | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [true] ( ... ) | +| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | ( ... ) | | UseUseExplosion.rb:20:467:20:3348 | then ... | UseUseExplosion.rb:20:451:20:3364 | if ... | | UseUseExplosion.rb:20:472:20:3348 | if ... | UseUseExplosion.rb:20:467:20:3348 | then ... | | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:3339:20:3344 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:3339:20:3344 | self | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [false] ( ... ) | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [true] ( ... ) | +| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | ( ... ) | | UseUseExplosion.rb:20:488:20:3332 | then ... | UseUseExplosion.rb:20:472:20:3348 | if ... | | UseUseExplosion.rb:20:493:20:3332 | if ... | UseUseExplosion.rb:20:488:20:3332 | then ... | | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:3323:20:3328 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:3323:20:3328 | self | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [false] ( ... ) | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [true] ( ... ) | +| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | ( ... ) | | UseUseExplosion.rb:20:509:20:3316 | then ... | UseUseExplosion.rb:20:493:20:3332 | if ... | | UseUseExplosion.rb:20:514:20:3316 | if ... | UseUseExplosion.rb:20:509:20:3316 | then ... | | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:3307:20:3312 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:3307:20:3312 | self | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [false] ( ... ) | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [true] ( ... ) | +| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | ( ... ) | | UseUseExplosion.rb:20:530:20:3300 | then ... | UseUseExplosion.rb:20:514:20:3316 | if ... | | UseUseExplosion.rb:20:535:20:3300 | if ... | UseUseExplosion.rb:20:530:20:3300 | then ... | | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:3291:20:3296 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:3291:20:3296 | self | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [false] ( ... ) | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [true] ( ... ) | +| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | ( ... ) | | UseUseExplosion.rb:20:551:20:3284 | then ... | UseUseExplosion.rb:20:535:20:3300 | if ... | | UseUseExplosion.rb:20:556:20:3284 | if ... | UseUseExplosion.rb:20:551:20:3284 | then ... | | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:3275:20:3280 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:3275:20:3280 | self | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [false] ( ... ) | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [true] ( ... ) | +| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | ( ... ) | | UseUseExplosion.rb:20:572:20:3268 | then ... | UseUseExplosion.rb:20:556:20:3284 | if ... | | UseUseExplosion.rb:20:577:20:3268 | if ... | UseUseExplosion.rb:20:572:20:3268 | then ... | | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:3259:20:3264 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:3259:20:3264 | self | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [false] ( ... ) | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [true] ( ... ) | +| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | ( ... ) | | UseUseExplosion.rb:20:593:20:3252 | then ... | UseUseExplosion.rb:20:577:20:3268 | if ... | | UseUseExplosion.rb:20:598:20:3252 | if ... | UseUseExplosion.rb:20:593:20:3252 | then ... | | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:3243:20:3248 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:3243:20:3248 | self | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [false] ( ... ) | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [true] ( ... ) | +| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | ( ... ) | | UseUseExplosion.rb:20:614:20:3236 | then ... | UseUseExplosion.rb:20:598:20:3252 | if ... | | UseUseExplosion.rb:20:619:20:3236 | if ... | UseUseExplosion.rb:20:614:20:3236 | then ... | | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:3227:20:3232 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:3227:20:3232 | self | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [false] ( ... ) | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [true] ( ... ) | +| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | ( ... ) | | UseUseExplosion.rb:20:635:20:3220 | then ... | UseUseExplosion.rb:20:619:20:3236 | if ... | | UseUseExplosion.rb:20:640:20:3220 | if ... | UseUseExplosion.rb:20:635:20:3220 | then ... | | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:3211:20:3216 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:3211:20:3216 | self | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [false] ( ... ) | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [true] ( ... ) | +| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | ( ... ) | | UseUseExplosion.rb:20:656:20:3204 | then ... | UseUseExplosion.rb:20:640:20:3220 | if ... | | UseUseExplosion.rb:20:661:20:3204 | if ... | UseUseExplosion.rb:20:656:20:3204 | then ... | | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:3195:20:3200 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:3195:20:3200 | self | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [false] ( ... ) | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [true] ( ... ) | +| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | ( ... ) | | UseUseExplosion.rb:20:677:20:3188 | then ... | UseUseExplosion.rb:20:661:20:3204 | if ... | | UseUseExplosion.rb:20:682:20:3188 | if ... | UseUseExplosion.rb:20:677:20:3188 | then ... | | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:3179:20:3184 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:3179:20:3184 | self | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [false] ( ... ) | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [true] ( ... ) | +| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | ( ... ) | | UseUseExplosion.rb:20:698:20:3172 | then ... | UseUseExplosion.rb:20:682:20:3188 | if ... | | UseUseExplosion.rb:20:703:20:3172 | if ... | UseUseExplosion.rb:20:698:20:3172 | then ... | | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:3163:20:3168 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:3163:20:3168 | self | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [false] ( ... ) | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [true] ( ... ) | +| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | ( ... ) | | UseUseExplosion.rb:20:719:20:3156 | then ... | UseUseExplosion.rb:20:703:20:3172 | if ... | | UseUseExplosion.rb:20:724:20:3156 | if ... | UseUseExplosion.rb:20:719:20:3156 | then ... | | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:3147:20:3152 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:3147:20:3152 | self | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [false] ( ... ) | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [true] ( ... ) | +| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | ( ... ) | | UseUseExplosion.rb:20:740:20:3140 | then ... | UseUseExplosion.rb:20:724:20:3156 | if ... | | UseUseExplosion.rb:20:745:20:3140 | if ... | UseUseExplosion.rb:20:740:20:3140 | then ... | | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:3131:20:3136 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:3131:20:3136 | self | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [false] ( ... ) | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [true] ( ... ) | +| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | ( ... ) | | UseUseExplosion.rb:20:761:20:3124 | then ... | UseUseExplosion.rb:20:745:20:3140 | if ... | | UseUseExplosion.rb:20:766:20:3124 | if ... | UseUseExplosion.rb:20:761:20:3124 | then ... | | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:3115:20:3120 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:3115:20:3120 | self | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [false] ( ... ) | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [true] ( ... ) | +| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | ( ... ) | | UseUseExplosion.rb:20:782:20:3108 | then ... | UseUseExplosion.rb:20:766:20:3124 | if ... | | UseUseExplosion.rb:20:787:20:3108 | if ... | UseUseExplosion.rb:20:782:20:3108 | then ... | | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:3099:20:3104 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:3099:20:3104 | self | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [false] ( ... ) | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [true] ( ... ) | +| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | ( ... ) | | UseUseExplosion.rb:20:803:20:3092 | then ... | UseUseExplosion.rb:20:787:20:3108 | if ... | | UseUseExplosion.rb:20:808:20:3092 | if ... | UseUseExplosion.rb:20:803:20:3092 | then ... | | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:3083:20:3088 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:3083:20:3088 | self | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [false] ( ... ) | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [true] ( ... ) | +| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | ( ... ) | | UseUseExplosion.rb:20:824:20:3076 | then ... | UseUseExplosion.rb:20:808:20:3092 | if ... | | UseUseExplosion.rb:20:829:20:3076 | if ... | UseUseExplosion.rb:20:824:20:3076 | then ... | | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:3067:20:3072 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:3067:20:3072 | self | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [false] ( ... ) | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [true] ( ... ) | +| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | ( ... ) | | UseUseExplosion.rb:20:845:20:3060 | then ... | UseUseExplosion.rb:20:829:20:3076 | if ... | | UseUseExplosion.rb:20:850:20:3060 | if ... | UseUseExplosion.rb:20:845:20:3060 | then ... | | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:3051:20:3056 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:3051:20:3056 | self | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [false] ( ... ) | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [true] ( ... ) | +| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | ( ... ) | | UseUseExplosion.rb:20:866:20:3044 | then ... | UseUseExplosion.rb:20:850:20:3060 | if ... | | UseUseExplosion.rb:20:871:20:3044 | if ... | UseUseExplosion.rb:20:866:20:3044 | then ... | | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:3035:20:3040 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:3035:20:3040 | self | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [false] ( ... ) | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [true] ( ... ) | +| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | ( ... ) | | UseUseExplosion.rb:20:887:20:3028 | then ... | UseUseExplosion.rb:20:871:20:3044 | if ... | | UseUseExplosion.rb:20:892:20:3028 | if ... | UseUseExplosion.rb:20:887:20:3028 | then ... | | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:3019:20:3024 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:3019:20:3024 | self | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [false] ( ... ) | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [true] ( ... ) | +| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | ( ... ) | | UseUseExplosion.rb:20:908:20:3012 | then ... | UseUseExplosion.rb:20:892:20:3028 | if ... | | UseUseExplosion.rb:20:913:20:3012 | if ... | UseUseExplosion.rb:20:908:20:3012 | then ... | | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:3003:20:3008 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:3003:20:3008 | self | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [false] ( ... ) | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [true] ( ... ) | +| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | ( ... ) | | UseUseExplosion.rb:20:929:20:2996 | then ... | UseUseExplosion.rb:20:913:20:3012 | if ... | | UseUseExplosion.rb:20:934:20:2996 | if ... | UseUseExplosion.rb:20:929:20:2996 | then ... | | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:2987:20:2992 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:2987:20:2992 | self | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [false] ( ... ) | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [true] ( ... ) | +| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | ( ... ) | | UseUseExplosion.rb:20:950:20:2980 | then ... | UseUseExplosion.rb:20:934:20:2996 | if ... | | UseUseExplosion.rb:20:955:20:2980 | if ... | UseUseExplosion.rb:20:950:20:2980 | then ... | | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:2971:20:2976 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:2971:20:2976 | self | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [false] ( ... ) | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [true] ( ... ) | +| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | ( ... ) | | UseUseExplosion.rb:20:971:20:2964 | then ... | UseUseExplosion.rb:20:955:20:2980 | if ... | | UseUseExplosion.rb:20:976:20:2964 | if ... | UseUseExplosion.rb:20:971:20:2964 | then ... | | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:2955:20:2960 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:2955:20:2960 | self | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [false] ( ... ) | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [true] ( ... ) | +| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | ( ... ) | | UseUseExplosion.rb:20:992:20:2948 | then ... | UseUseExplosion.rb:20:976:20:2964 | if ... | | UseUseExplosion.rb:20:997:20:2948 | if ... | UseUseExplosion.rb:20:992:20:2948 | then ... | | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:2939:20:2944 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:2939:20:2944 | self | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [false] ( ... ) | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [true] ( ... ) | +| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | ( ... ) | | UseUseExplosion.rb:20:1013:20:2932 | then ... | UseUseExplosion.rb:20:997:20:2948 | if ... | | UseUseExplosion.rb:20:1018:20:2932 | if ... | UseUseExplosion.rb:20:1013:20:2932 | then ... | | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:2923:20:2928 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:2923:20:2928 | self | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [false] ( ... ) | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [true] ( ... ) | +| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | ( ... ) | | UseUseExplosion.rb:20:1034:20:2916 | then ... | UseUseExplosion.rb:20:1018:20:2932 | if ... | | UseUseExplosion.rb:20:1039:20:2916 | if ... | UseUseExplosion.rb:20:1034:20:2916 | then ... | | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:2907:20:2912 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:2907:20:2912 | self | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [false] ( ... ) | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [true] ( ... ) | +| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | ( ... ) | | UseUseExplosion.rb:20:1055:20:2900 | then ... | UseUseExplosion.rb:20:1039:20:2916 | if ... | | UseUseExplosion.rb:20:1060:20:2900 | if ... | UseUseExplosion.rb:20:1055:20:2900 | then ... | | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:2891:20:2896 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:2891:20:2896 | self | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [false] ( ... ) | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [true] ( ... ) | +| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | ( ... ) | | UseUseExplosion.rb:20:1076:20:2884 | then ... | UseUseExplosion.rb:20:1060:20:2900 | if ... | | UseUseExplosion.rb:20:1081:20:2884 | if ... | UseUseExplosion.rb:20:1076:20:2884 | then ... | | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:2875:20:2880 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:2875:20:2880 | self | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [false] ( ... ) | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [true] ( ... ) | +| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | ( ... ) | | UseUseExplosion.rb:20:1097:20:2868 | then ... | UseUseExplosion.rb:20:1081:20:2884 | if ... | | UseUseExplosion.rb:20:1102:20:2868 | if ... | UseUseExplosion.rb:20:1097:20:2868 | then ... | | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:2859:20:2864 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:2859:20:2864 | self | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [false] ( ... ) | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [true] ( ... ) | +| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | ( ... ) | | UseUseExplosion.rb:20:1118:20:2852 | then ... | UseUseExplosion.rb:20:1102:20:2868 | if ... | | UseUseExplosion.rb:20:1123:20:2852 | if ... | UseUseExplosion.rb:20:1118:20:2852 | then ... | | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:2843:20:2848 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:2843:20:2848 | self | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [false] ( ... ) | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [true] ( ... ) | +| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | ( ... ) | | UseUseExplosion.rb:20:1139:20:2836 | then ... | UseUseExplosion.rb:20:1123:20:2852 | if ... | | UseUseExplosion.rb:20:1144:20:2836 | if ... | UseUseExplosion.rb:20:1139:20:2836 | then ... | | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:2827:20:2832 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:2827:20:2832 | self | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [false] ( ... ) | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [true] ( ... ) | +| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | ( ... ) | | UseUseExplosion.rb:20:1160:20:2820 | then ... | UseUseExplosion.rb:20:1144:20:2836 | if ... | | UseUseExplosion.rb:20:1165:20:2820 | if ... | UseUseExplosion.rb:20:1160:20:2820 | then ... | | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:2811:20:2816 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:2811:20:2816 | self | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [false] ( ... ) | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [true] ( ... ) | +| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | ( ... ) | | UseUseExplosion.rb:20:1181:20:2804 | then ... | UseUseExplosion.rb:20:1165:20:2820 | if ... | | UseUseExplosion.rb:20:1186:20:2804 | if ... | UseUseExplosion.rb:20:1181:20:2804 | then ... | | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:2795:20:2800 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:2795:20:2800 | self | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [false] ( ... ) | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [true] ( ... ) | +| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | ( ... ) | | UseUseExplosion.rb:20:1202:20:2788 | then ... | UseUseExplosion.rb:20:1186:20:2804 | if ... | | UseUseExplosion.rb:20:1207:20:2788 | if ... | UseUseExplosion.rb:20:1202:20:2788 | then ... | | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:2779:20:2784 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:2779:20:2784 | self | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [false] ( ... ) | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [true] ( ... ) | +| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | ( ... ) | | UseUseExplosion.rb:20:1223:20:2772 | then ... | UseUseExplosion.rb:20:1207:20:2788 | if ... | | UseUseExplosion.rb:20:1228:20:2772 | if ... | UseUseExplosion.rb:20:1223:20:2772 | then ... | | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:2763:20:2768 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:2763:20:2768 | self | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [false] ( ... ) | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [true] ( ... ) | +| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | ( ... ) | | UseUseExplosion.rb:20:1244:20:2756 | then ... | UseUseExplosion.rb:20:1228:20:2772 | if ... | | UseUseExplosion.rb:20:1249:20:2756 | if ... | UseUseExplosion.rb:20:1244:20:2756 | then ... | | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:2747:20:2752 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:2747:20:2752 | self | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [false] ( ... ) | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [true] ( ... ) | +| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | ( ... ) | | UseUseExplosion.rb:20:1265:20:2740 | then ... | UseUseExplosion.rb:20:1249:20:2756 | if ... | | UseUseExplosion.rb:20:1270:20:2740 | if ... | UseUseExplosion.rb:20:1265:20:2740 | then ... | | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:2731:20:2736 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:2731:20:2736 | self | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [false] ( ... ) | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [true] ( ... ) | +| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | ( ... ) | | UseUseExplosion.rb:20:1286:20:2724 | then ... | UseUseExplosion.rb:20:1270:20:2740 | if ... | | UseUseExplosion.rb:20:1291:20:2724 | if ... | UseUseExplosion.rb:20:1286:20:2724 | then ... | | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:2715:20:2720 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:2715:20:2720 | self | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [false] ( ... ) | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [true] ( ... ) | +| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | ( ... ) | | UseUseExplosion.rb:20:1307:20:2708 | then ... | UseUseExplosion.rb:20:1291:20:2724 | if ... | | UseUseExplosion.rb:20:1312:20:2708 | if ... | UseUseExplosion.rb:20:1307:20:2708 | then ... | | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:2699:20:2704 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:2699:20:2704 | self | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [false] ( ... ) | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [true] ( ... ) | +| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | ( ... ) | | UseUseExplosion.rb:20:1328:20:2692 | then ... | UseUseExplosion.rb:20:1312:20:2708 | if ... | | UseUseExplosion.rb:20:1333:20:2692 | if ... | UseUseExplosion.rb:20:1328:20:2692 | then ... | | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:2683:20:2688 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:2683:20:2688 | self | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [false] ( ... ) | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [true] ( ... ) | +| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | ( ... ) | | UseUseExplosion.rb:20:1349:20:2676 | then ... | UseUseExplosion.rb:20:1333:20:2692 | if ... | | UseUseExplosion.rb:20:1354:20:2676 | if ... | UseUseExplosion.rb:20:1349:20:2676 | then ... | | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:2667:20:2672 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:2667:20:2672 | self | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [false] ( ... ) | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [true] ( ... ) | +| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | ( ... ) | | UseUseExplosion.rb:20:1370:20:2660 | then ... | UseUseExplosion.rb:20:1354:20:2676 | if ... | | UseUseExplosion.rb:20:1375:20:2660 | if ... | UseUseExplosion.rb:20:1370:20:2660 | then ... | | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:2651:20:2656 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:2651:20:2656 | self | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [false] ( ... ) | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [true] ( ... ) | +| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | ( ... ) | | UseUseExplosion.rb:20:1391:20:2644 | then ... | UseUseExplosion.rb:20:1375:20:2660 | if ... | | UseUseExplosion.rb:20:1396:20:2644 | if ... | UseUseExplosion.rb:20:1391:20:2644 | then ... | | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:2635:20:2640 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:2635:20:2640 | self | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [false] ( ... ) | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [true] ( ... ) | +| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | ( ... ) | | UseUseExplosion.rb:20:1412:20:2628 | then ... | UseUseExplosion.rb:20:1396:20:2644 | if ... | | UseUseExplosion.rb:20:1417:20:2628 | if ... | UseUseExplosion.rb:20:1412:20:2628 | then ... | | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:2619:20:2624 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:2619:20:2624 | self | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [false] ( ... ) | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [true] ( ... ) | +| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | ( ... ) | | UseUseExplosion.rb:20:1433:20:2612 | then ... | UseUseExplosion.rb:20:1417:20:2628 | if ... | | UseUseExplosion.rb:20:1438:20:2612 | if ... | UseUseExplosion.rb:20:1433:20:2612 | then ... | | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:2603:20:2608 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:2603:20:2608 | self | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [false] ( ... ) | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [true] ( ... ) | +| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | ( ... ) | | UseUseExplosion.rb:20:1454:20:2596 | then ... | UseUseExplosion.rb:20:1438:20:2612 | if ... | | UseUseExplosion.rb:20:1459:20:2596 | if ... | UseUseExplosion.rb:20:1454:20:2596 | then ... | | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:2587:20:2592 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:2587:20:2592 | self | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [false] ( ... ) | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [true] ( ... ) | +| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | ( ... ) | | UseUseExplosion.rb:20:1475:20:2580 | then ... | UseUseExplosion.rb:20:1459:20:2596 | if ... | | UseUseExplosion.rb:20:1480:20:2580 | if ... | UseUseExplosion.rb:20:1475:20:2580 | then ... | | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:2571:20:2576 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:2571:20:2576 | self | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [false] ( ... ) | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [true] ( ... ) | +| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | ( ... ) | | UseUseExplosion.rb:20:1496:20:2564 | then ... | UseUseExplosion.rb:20:1480:20:2580 | if ... | | UseUseExplosion.rb:20:1501:20:2564 | if ... | UseUseExplosion.rb:20:1496:20:2564 | then ... | | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:2555:20:2560 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:2555:20:2560 | self | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [false] ( ... ) | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [true] ( ... ) | +| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | ( ... ) | | UseUseExplosion.rb:20:1517:20:2548 | then ... | UseUseExplosion.rb:20:1501:20:2564 | if ... | | UseUseExplosion.rb:20:1522:20:2548 | if ... | UseUseExplosion.rb:20:1517:20:2548 | then ... | | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:2539:20:2544 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:2539:20:2544 | self | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [false] ( ... ) | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [true] ( ... ) | +| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | ( ... ) | | UseUseExplosion.rb:20:1538:20:2532 | then ... | UseUseExplosion.rb:20:1522:20:2548 | if ... | | UseUseExplosion.rb:20:1543:20:2532 | if ... | UseUseExplosion.rb:20:1538:20:2532 | then ... | | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:2523:20:2528 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:2523:20:2528 | self | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [false] ( ... ) | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [true] ( ... ) | +| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | ( ... ) | | UseUseExplosion.rb:20:1559:20:2516 | then ... | UseUseExplosion.rb:20:1543:20:2532 | if ... | | UseUseExplosion.rb:20:1564:20:2516 | if ... | UseUseExplosion.rb:20:1559:20:2516 | then ... | | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:2507:20:2512 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:2507:20:2512 | self | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [false] ( ... ) | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [true] ( ... ) | +| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | ( ... ) | | UseUseExplosion.rb:20:1580:20:2500 | then ... | UseUseExplosion.rb:20:1564:20:2516 | if ... | | UseUseExplosion.rb:20:1585:20:2500 | if ... | UseUseExplosion.rb:20:1580:20:2500 | then ... | | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:2491:20:2496 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:2491:20:2496 | self | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [false] ( ... ) | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [true] ( ... ) | +| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | ( ... ) | | UseUseExplosion.rb:20:1601:20:2484 | then ... | UseUseExplosion.rb:20:1585:20:2500 | if ... | | UseUseExplosion.rb:20:1606:20:2484 | if ... | UseUseExplosion.rb:20:1601:20:2484 | then ... | | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:2475:20:2480 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:2475:20:2480 | self | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [false] ( ... ) | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [true] ( ... ) | +| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | ( ... ) | | UseUseExplosion.rb:20:1622:20:2468 | then ... | UseUseExplosion.rb:20:1606:20:2484 | if ... | | UseUseExplosion.rb:20:1627:20:2468 | if ... | UseUseExplosion.rb:20:1622:20:2468 | then ... | | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:2459:20:2464 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:2459:20:2464 | self | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [false] ( ... ) | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [true] ( ... ) | +| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | ( ... ) | | UseUseExplosion.rb:20:1643:20:2452 | then ... | UseUseExplosion.rb:20:1627:20:2468 | if ... | | UseUseExplosion.rb:20:1648:20:2452 | if ... | UseUseExplosion.rb:20:1643:20:2452 | then ... | | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:2443:20:2448 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:2443:20:2448 | self | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [false] ( ... ) | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [true] ( ... ) | +| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | ( ... ) | | UseUseExplosion.rb:20:1664:20:2436 | then ... | UseUseExplosion.rb:20:1648:20:2452 | if ... | | UseUseExplosion.rb:20:1669:20:2436 | if ... | UseUseExplosion.rb:20:1664:20:2436 | then ... | | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:2427:20:2432 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:2427:20:2432 | self | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [false] ( ... ) | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [true] ( ... ) | +| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | ( ... ) | | UseUseExplosion.rb:20:1685:20:2420 | then ... | UseUseExplosion.rb:20:1669:20:2436 | if ... | | UseUseExplosion.rb:20:1690:20:2420 | if ... | UseUseExplosion.rb:20:1685:20:2420 | then ... | | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:2411:20:2416 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:2411:20:2416 | self | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [false] ( ... ) | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [true] ( ... ) | +| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | ( ... ) | | UseUseExplosion.rb:20:1706:20:2404 | then ... | UseUseExplosion.rb:20:1690:20:2420 | if ... | | UseUseExplosion.rb:20:1711:20:2404 | if ... | UseUseExplosion.rb:20:1706:20:2404 | then ... | | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:2395:20:2400 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:2395:20:2400 | self | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [false] ( ... ) | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [true] ( ... ) | +| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | ( ... ) | | UseUseExplosion.rb:20:1727:20:2388 | then ... | UseUseExplosion.rb:20:1711:20:2404 | if ... | | UseUseExplosion.rb:20:1732:20:2388 | if ... | UseUseExplosion.rb:20:1727:20:2388 | then ... | | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:2379:20:2384 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:2379:20:2384 | self | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [false] ( ... ) | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [true] ( ... ) | +| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | ( ... ) | | UseUseExplosion.rb:20:1748:20:2372 | then ... | UseUseExplosion.rb:20:1732:20:2388 | if ... | | UseUseExplosion.rb:20:1753:20:2372 | if ... | UseUseExplosion.rb:20:1748:20:2372 | then ... | | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:2363:20:2368 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:2363:20:2368 | self | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [false] ( ... ) | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [true] ( ... ) | +| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | ( ... ) | | UseUseExplosion.rb:20:1769:20:2356 | then ... | UseUseExplosion.rb:20:1753:20:2372 | if ... | | UseUseExplosion.rb:20:1774:20:2356 | if ... | UseUseExplosion.rb:20:1769:20:2356 | then ... | | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:2347:20:2352 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:2347:20:2352 | self | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [false] ( ... ) | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [true] ( ... ) | +| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | ( ... ) | | UseUseExplosion.rb:20:1790:20:2340 | then ... | UseUseExplosion.rb:20:1774:20:2356 | if ... | | UseUseExplosion.rb:20:1795:20:2340 | if ... | UseUseExplosion.rb:20:1790:20:2340 | then ... | | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:2331:20:2336 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:2331:20:2336 | self | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [false] ( ... ) | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [true] ( ... ) | +| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | ( ... ) | | UseUseExplosion.rb:20:1811:20:2324 | then ... | UseUseExplosion.rb:20:1795:20:2340 | if ... | | UseUseExplosion.rb:20:1816:20:2324 | if ... | UseUseExplosion.rb:20:1811:20:2324 | then ... | | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:2315:20:2320 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:2315:20:2320 | self | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [false] ( ... ) | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [true] ( ... ) | +| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | ( ... ) | | UseUseExplosion.rb:20:1832:20:2308 | then ... | UseUseExplosion.rb:20:1816:20:2324 | if ... | | UseUseExplosion.rb:20:1837:20:2308 | if ... | UseUseExplosion.rb:20:1832:20:2308 | then ... | | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:2299:20:2304 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:2299:20:2304 | self | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [false] ( ... ) | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [true] ( ... ) | +| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | ( ... ) | | UseUseExplosion.rb:20:1853:20:2292 | then ... | UseUseExplosion.rb:20:1837:20:2308 | if ... | | UseUseExplosion.rb:20:1858:20:2292 | if ... | UseUseExplosion.rb:20:1853:20:2292 | then ... | | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:2283:20:2288 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:2283:20:2288 | self | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [false] ( ... ) | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [true] ( ... ) | +| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | ( ... ) | | UseUseExplosion.rb:20:1874:20:2276 | then ... | UseUseExplosion.rb:20:1858:20:2292 | if ... | | UseUseExplosion.rb:20:1879:20:2276 | if ... | UseUseExplosion.rb:20:1874:20:2276 | then ... | | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:2267:20:2272 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:2267:20:2272 | self | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [false] ( ... ) | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [true] ( ... ) | +| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | ( ... ) | | UseUseExplosion.rb:20:1895:20:2260 | then ... | UseUseExplosion.rb:20:1879:20:2276 | if ... | | UseUseExplosion.rb:20:1900:20:2260 | if ... | UseUseExplosion.rb:20:1895:20:2260 | then ... | | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:2251:20:2256 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:2251:20:2256 | self | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [false] ( ... ) | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [true] ( ... ) | +| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | ( ... ) | | UseUseExplosion.rb:20:1916:20:2244 | then ... | UseUseExplosion.rb:20:1900:20:2260 | if ... | | UseUseExplosion.rb:20:1921:20:2244 | if ... | UseUseExplosion.rb:20:1916:20:2244 | then ... | | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:2235:20:2240 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:2235:20:2240 | self | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [false] ( ... ) | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [true] ( ... ) | +| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | ( ... ) | | UseUseExplosion.rb:20:1936:20:2228 | then ... | UseUseExplosion.rb:20:1921:20:2244 | if ... | | UseUseExplosion.rb:20:1941:20:2228 | if ... | UseUseExplosion.rb:20:1936:20:2228 | then ... | | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:2219:20:2224 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:2219:20:2224 | self | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [false] ( ... ) | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [true] ( ... ) | +| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | ( ... ) | | UseUseExplosion.rb:20:1956:20:2212 | then ... | UseUseExplosion.rb:20:1941:20:2228 | if ... | | UseUseExplosion.rb:20:1961:20:2212 | if ... | UseUseExplosion.rb:20:1956:20:2212 | then ... | | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:2203:20:2208 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:2203:20:2208 | self | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [false] ( ... ) | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [true] ( ... ) | +| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | ( ... ) | | UseUseExplosion.rb:20:1976:20:2196 | then ... | UseUseExplosion.rb:20:1961:20:2212 | if ... | | UseUseExplosion.rb:20:1981:20:2196 | if ... | UseUseExplosion.rb:20:1976:20:2196 | then ... | | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2187:20:2192 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2187:20:2192 | self | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [false] ( ... ) | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [true] ( ... ) | +| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | ( ... ) | | UseUseExplosion.rb:20:1996:20:2180 | then ... | UseUseExplosion.rb:20:1981:20:2196 | if ... | | UseUseExplosion.rb:20:2001:20:2180 | if ... | UseUseExplosion.rb:20:1996:20:2180 | then ... | | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2171:20:2176 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2171:20:2176 | self | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [false] ( ... ) | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [true] ( ... ) | +| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | ( ... ) | | UseUseExplosion.rb:20:2016:20:2164 | then ... | UseUseExplosion.rb:20:2001:20:2180 | if ... | | UseUseExplosion.rb:20:2021:20:2164 | if ... | UseUseExplosion.rb:20:2016:20:2164 | then ... | | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2155:20:2160 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2155:20:2160 | self | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [false] ( ... ) | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [true] ( ... ) | +| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | ( ... ) | | UseUseExplosion.rb:20:2036:20:2148 | then ... | UseUseExplosion.rb:20:2021:20:2164 | if ... | | UseUseExplosion.rb:20:2041:20:2148 | if ... | UseUseExplosion.rb:20:2036:20:2148 | then ... | | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2139:20:2144 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2139:20:2144 | self | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [false] ( ... ) | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [true] ( ... ) | +| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | ( ... ) | | UseUseExplosion.rb:20:2056:20:2132 | then ... | UseUseExplosion.rb:20:2041:20:2148 | if ... | | UseUseExplosion.rb:20:2061:20:2132 | if ... | UseUseExplosion.rb:20:2056:20:2132 | then ... | | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2123:20:2128 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2123:20:2128 | self | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [false] ( ... ) | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [true] ( ... ) | +| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | ( ... ) | | UseUseExplosion.rb:20:2076:20:2116 | then ... | UseUseExplosion.rb:20:2061:20:2132 | if ... | | UseUseExplosion.rb:20:2081:20:2116 | if ... | UseUseExplosion.rb:20:2076:20:2116 | then ... | | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2107:20:2112 | self | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2107:20:2112 | self | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [false] ( ... ) | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [true] ( ... ) | +| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | ( ... ) | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(x) | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | | UseUseExplosion.rb:20:2096:20:2099 | then ... | UseUseExplosion.rb:20:2081:20:2116 | if ... | @@ -1508,798 +1408,698 @@ | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:3691:21:3696 | self | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [false] ( ... ) | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [true] ( ... ) | +| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | ( ... ) | | UseUseExplosion.rb:21:26:21:3684 | then ... | UseUseExplosion.rb:21:9:21:3700 | if ... | | UseUseExplosion.rb:21:31:21:3684 | if ... | UseUseExplosion.rb:21:26:21:3684 | then ... | | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:3675:21:3680 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:3675:21:3680 | self | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [false] ( ... ) | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [true] ( ... ) | +| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | ( ... ) | | UseUseExplosion.rb:21:47:21:3668 | then ... | UseUseExplosion.rb:21:31:21:3684 | if ... | | UseUseExplosion.rb:21:52:21:3668 | if ... | UseUseExplosion.rb:21:47:21:3668 | then ... | | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:3659:21:3664 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:3659:21:3664 | self | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [false] ( ... ) | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [true] ( ... ) | +| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | ( ... ) | | UseUseExplosion.rb:21:68:21:3652 | then ... | UseUseExplosion.rb:21:52:21:3668 | if ... | | UseUseExplosion.rb:21:73:21:3652 | if ... | UseUseExplosion.rb:21:68:21:3652 | then ... | | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:3643:21:3648 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:3643:21:3648 | self | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [false] ( ... ) | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [true] ( ... ) | +| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | ( ... ) | | UseUseExplosion.rb:21:89:21:3636 | then ... | UseUseExplosion.rb:21:73:21:3652 | if ... | | UseUseExplosion.rb:21:94:21:3636 | if ... | UseUseExplosion.rb:21:89:21:3636 | then ... | | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:3627:21:3632 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:3627:21:3632 | self | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [false] ( ... ) | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [true] ( ... ) | +| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | ( ... ) | | UseUseExplosion.rb:21:110:21:3620 | then ... | UseUseExplosion.rb:21:94:21:3636 | if ... | | UseUseExplosion.rb:21:115:21:3620 | if ... | UseUseExplosion.rb:21:110:21:3620 | then ... | | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:3611:21:3616 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:3611:21:3616 | self | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [false] ( ... ) | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [true] ( ... ) | +| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | ( ... ) | | UseUseExplosion.rb:21:131:21:3604 | then ... | UseUseExplosion.rb:21:115:21:3620 | if ... | | UseUseExplosion.rb:21:136:21:3604 | if ... | UseUseExplosion.rb:21:131:21:3604 | then ... | | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:3595:21:3600 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:3595:21:3600 | self | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [false] ( ... ) | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [true] ( ... ) | +| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | ( ... ) | | UseUseExplosion.rb:21:152:21:3588 | then ... | UseUseExplosion.rb:21:136:21:3604 | if ... | | UseUseExplosion.rb:21:157:21:3588 | if ... | UseUseExplosion.rb:21:152:21:3588 | then ... | | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:3579:21:3584 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:3579:21:3584 | self | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [false] ( ... ) | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [true] ( ... ) | +| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | ( ... ) | | UseUseExplosion.rb:21:173:21:3572 | then ... | UseUseExplosion.rb:21:157:21:3588 | if ... | | UseUseExplosion.rb:21:178:21:3572 | if ... | UseUseExplosion.rb:21:173:21:3572 | then ... | | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:3563:21:3568 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:3563:21:3568 | self | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [false] ( ... ) | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [true] ( ... ) | +| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | ( ... ) | | UseUseExplosion.rb:21:194:21:3556 | then ... | UseUseExplosion.rb:21:178:21:3572 | if ... | | UseUseExplosion.rb:21:199:21:3556 | if ... | UseUseExplosion.rb:21:194:21:3556 | then ... | | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:3547:21:3552 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:3547:21:3552 | self | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [false] ( ... ) | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [true] ( ... ) | +| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | ( ... ) | | UseUseExplosion.rb:21:215:21:3540 | then ... | UseUseExplosion.rb:21:199:21:3556 | if ... | | UseUseExplosion.rb:21:220:21:3540 | if ... | UseUseExplosion.rb:21:215:21:3540 | then ... | | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:3531:21:3536 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:3531:21:3536 | self | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [false] ( ... ) | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [true] ( ... ) | +| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | ( ... ) | | UseUseExplosion.rb:21:236:21:3524 | then ... | UseUseExplosion.rb:21:220:21:3540 | if ... | | UseUseExplosion.rb:21:241:21:3524 | if ... | UseUseExplosion.rb:21:236:21:3524 | then ... | | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:3515:21:3520 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:3515:21:3520 | self | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [false] ( ... ) | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [true] ( ... ) | +| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | ( ... ) | | UseUseExplosion.rb:21:257:21:3508 | then ... | UseUseExplosion.rb:21:241:21:3524 | if ... | | UseUseExplosion.rb:21:262:21:3508 | if ... | UseUseExplosion.rb:21:257:21:3508 | then ... | | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:3499:21:3504 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:3499:21:3504 | self | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [false] ( ... ) | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [true] ( ... ) | +| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | ( ... ) | | UseUseExplosion.rb:21:278:21:3492 | then ... | UseUseExplosion.rb:21:262:21:3508 | if ... | | UseUseExplosion.rb:21:283:21:3492 | if ... | UseUseExplosion.rb:21:278:21:3492 | then ... | | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:3483:21:3488 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:3483:21:3488 | self | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [false] ( ... ) | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [true] ( ... ) | +| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | ( ... ) | | UseUseExplosion.rb:21:299:21:3476 | then ... | UseUseExplosion.rb:21:283:21:3492 | if ... | | UseUseExplosion.rb:21:304:21:3476 | if ... | UseUseExplosion.rb:21:299:21:3476 | then ... | | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:3467:21:3472 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:3467:21:3472 | self | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [false] ( ... ) | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [true] ( ... ) | +| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | ( ... ) | | UseUseExplosion.rb:21:320:21:3460 | then ... | UseUseExplosion.rb:21:304:21:3476 | if ... | | UseUseExplosion.rb:21:325:21:3460 | if ... | UseUseExplosion.rb:21:320:21:3460 | then ... | | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:3451:21:3456 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:3451:21:3456 | self | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [false] ( ... ) | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [true] ( ... ) | +| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | ( ... ) | | UseUseExplosion.rb:21:341:21:3444 | then ... | UseUseExplosion.rb:21:325:21:3460 | if ... | | UseUseExplosion.rb:21:346:21:3444 | if ... | UseUseExplosion.rb:21:341:21:3444 | then ... | | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:3435:21:3440 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:3435:21:3440 | self | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [false] ( ... ) | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [true] ( ... ) | +| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | ( ... ) | | UseUseExplosion.rb:21:362:21:3428 | then ... | UseUseExplosion.rb:21:346:21:3444 | if ... | | UseUseExplosion.rb:21:367:21:3428 | if ... | UseUseExplosion.rb:21:362:21:3428 | then ... | | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:3419:21:3424 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:3419:21:3424 | self | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [false] ( ... ) | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [true] ( ... ) | +| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | ( ... ) | | UseUseExplosion.rb:21:383:21:3412 | then ... | UseUseExplosion.rb:21:367:21:3428 | if ... | | UseUseExplosion.rb:21:388:21:3412 | if ... | UseUseExplosion.rb:21:383:21:3412 | then ... | | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:3403:21:3408 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:3403:21:3408 | self | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [false] ( ... ) | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [true] ( ... ) | +| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | ( ... ) | | UseUseExplosion.rb:21:404:21:3396 | then ... | UseUseExplosion.rb:21:388:21:3412 | if ... | | UseUseExplosion.rb:21:409:21:3396 | if ... | UseUseExplosion.rb:21:404:21:3396 | then ... | | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:3387:21:3392 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:3387:21:3392 | self | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [false] ( ... ) | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [true] ( ... ) | +| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | ( ... ) | | UseUseExplosion.rb:21:425:21:3380 | then ... | UseUseExplosion.rb:21:409:21:3396 | if ... | | UseUseExplosion.rb:21:430:21:3380 | if ... | UseUseExplosion.rb:21:425:21:3380 | then ... | | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:3371:21:3376 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:3371:21:3376 | self | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [false] ( ... ) | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [true] ( ... ) | +| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | ( ... ) | | UseUseExplosion.rb:21:446:21:3364 | then ... | UseUseExplosion.rb:21:430:21:3380 | if ... | | UseUseExplosion.rb:21:451:21:3364 | if ... | UseUseExplosion.rb:21:446:21:3364 | then ... | | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:3355:21:3360 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:3355:21:3360 | self | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [false] ( ... ) | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [true] ( ... ) | +| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | ( ... ) | | UseUseExplosion.rb:21:467:21:3348 | then ... | UseUseExplosion.rb:21:451:21:3364 | if ... | | UseUseExplosion.rb:21:472:21:3348 | if ... | UseUseExplosion.rb:21:467:21:3348 | then ... | | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:3339:21:3344 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:3339:21:3344 | self | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [false] ( ... ) | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [true] ( ... ) | +| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | ( ... ) | | UseUseExplosion.rb:21:488:21:3332 | then ... | UseUseExplosion.rb:21:472:21:3348 | if ... | | UseUseExplosion.rb:21:493:21:3332 | if ... | UseUseExplosion.rb:21:488:21:3332 | then ... | | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:3323:21:3328 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:3323:21:3328 | self | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [false] ( ... ) | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [true] ( ... ) | +| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | ( ... ) | | UseUseExplosion.rb:21:509:21:3316 | then ... | UseUseExplosion.rb:21:493:21:3332 | if ... | | UseUseExplosion.rb:21:514:21:3316 | if ... | UseUseExplosion.rb:21:509:21:3316 | then ... | | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:3307:21:3312 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:3307:21:3312 | self | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [false] ( ... ) | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [true] ( ... ) | +| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | ( ... ) | | UseUseExplosion.rb:21:530:21:3300 | then ... | UseUseExplosion.rb:21:514:21:3316 | if ... | | UseUseExplosion.rb:21:535:21:3300 | if ... | UseUseExplosion.rb:21:530:21:3300 | then ... | | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:3291:21:3296 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:3291:21:3296 | self | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [false] ( ... ) | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [true] ( ... ) | +| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | ( ... ) | | UseUseExplosion.rb:21:551:21:3284 | then ... | UseUseExplosion.rb:21:535:21:3300 | if ... | | UseUseExplosion.rb:21:556:21:3284 | if ... | UseUseExplosion.rb:21:551:21:3284 | then ... | | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:3275:21:3280 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:3275:21:3280 | self | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [false] ( ... ) | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [true] ( ... ) | +| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | ( ... ) | | UseUseExplosion.rb:21:572:21:3268 | then ... | UseUseExplosion.rb:21:556:21:3284 | if ... | | UseUseExplosion.rb:21:577:21:3268 | if ... | UseUseExplosion.rb:21:572:21:3268 | then ... | | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:3259:21:3264 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:3259:21:3264 | self | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [false] ( ... ) | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [true] ( ... ) | +| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | ( ... ) | | UseUseExplosion.rb:21:593:21:3252 | then ... | UseUseExplosion.rb:21:577:21:3268 | if ... | | UseUseExplosion.rb:21:598:21:3252 | if ... | UseUseExplosion.rb:21:593:21:3252 | then ... | | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:3243:21:3248 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:3243:21:3248 | self | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [false] ( ... ) | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [true] ( ... ) | +| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | ( ... ) | | UseUseExplosion.rb:21:614:21:3236 | then ... | UseUseExplosion.rb:21:598:21:3252 | if ... | | UseUseExplosion.rb:21:619:21:3236 | if ... | UseUseExplosion.rb:21:614:21:3236 | then ... | | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:3227:21:3232 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:3227:21:3232 | self | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [false] ( ... ) | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [true] ( ... ) | +| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | ( ... ) | | UseUseExplosion.rb:21:635:21:3220 | then ... | UseUseExplosion.rb:21:619:21:3236 | if ... | | UseUseExplosion.rb:21:640:21:3220 | if ... | UseUseExplosion.rb:21:635:21:3220 | then ... | | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:3211:21:3216 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:3211:21:3216 | self | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [false] ( ... ) | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [true] ( ... ) | +| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | ( ... ) | | UseUseExplosion.rb:21:656:21:3204 | then ... | UseUseExplosion.rb:21:640:21:3220 | if ... | | UseUseExplosion.rb:21:661:21:3204 | if ... | UseUseExplosion.rb:21:656:21:3204 | then ... | | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:3195:21:3200 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:3195:21:3200 | self | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [false] ( ... ) | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [true] ( ... ) | +| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | ( ... ) | | UseUseExplosion.rb:21:677:21:3188 | then ... | UseUseExplosion.rb:21:661:21:3204 | if ... | | UseUseExplosion.rb:21:682:21:3188 | if ... | UseUseExplosion.rb:21:677:21:3188 | then ... | | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:3179:21:3184 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:3179:21:3184 | self | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [false] ( ... ) | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [true] ( ... ) | +| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | ( ... ) | | UseUseExplosion.rb:21:698:21:3172 | then ... | UseUseExplosion.rb:21:682:21:3188 | if ... | | UseUseExplosion.rb:21:703:21:3172 | if ... | UseUseExplosion.rb:21:698:21:3172 | then ... | | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:3163:21:3168 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:3163:21:3168 | self | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [false] ( ... ) | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [true] ( ... ) | +| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | ( ... ) | | UseUseExplosion.rb:21:719:21:3156 | then ... | UseUseExplosion.rb:21:703:21:3172 | if ... | | UseUseExplosion.rb:21:724:21:3156 | if ... | UseUseExplosion.rb:21:719:21:3156 | then ... | | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:3147:21:3152 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:3147:21:3152 | self | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [false] ( ... ) | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [true] ( ... ) | +| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | ( ... ) | | UseUseExplosion.rb:21:740:21:3140 | then ... | UseUseExplosion.rb:21:724:21:3156 | if ... | | UseUseExplosion.rb:21:745:21:3140 | if ... | UseUseExplosion.rb:21:740:21:3140 | then ... | | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:3131:21:3136 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:3131:21:3136 | self | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [false] ( ... ) | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [true] ( ... ) | +| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | ( ... ) | | UseUseExplosion.rb:21:761:21:3124 | then ... | UseUseExplosion.rb:21:745:21:3140 | if ... | | UseUseExplosion.rb:21:766:21:3124 | if ... | UseUseExplosion.rb:21:761:21:3124 | then ... | | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:3115:21:3120 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:3115:21:3120 | self | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [false] ( ... ) | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [true] ( ... ) | +| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | ( ... ) | | UseUseExplosion.rb:21:782:21:3108 | then ... | UseUseExplosion.rb:21:766:21:3124 | if ... | | UseUseExplosion.rb:21:787:21:3108 | if ... | UseUseExplosion.rb:21:782:21:3108 | then ... | | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:3099:21:3104 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:3099:21:3104 | self | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [false] ( ... ) | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [true] ( ... ) | +| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | ( ... ) | | UseUseExplosion.rb:21:803:21:3092 | then ... | UseUseExplosion.rb:21:787:21:3108 | if ... | | UseUseExplosion.rb:21:808:21:3092 | if ... | UseUseExplosion.rb:21:803:21:3092 | then ... | | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:3083:21:3088 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:3083:21:3088 | self | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [false] ( ... ) | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [true] ( ... ) | +| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | ( ... ) | | UseUseExplosion.rb:21:824:21:3076 | then ... | UseUseExplosion.rb:21:808:21:3092 | if ... | | UseUseExplosion.rb:21:829:21:3076 | if ... | UseUseExplosion.rb:21:824:21:3076 | then ... | | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:3067:21:3072 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:3067:21:3072 | self | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [false] ( ... ) | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [true] ( ... ) | +| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | ( ... ) | | UseUseExplosion.rb:21:845:21:3060 | then ... | UseUseExplosion.rb:21:829:21:3076 | if ... | | UseUseExplosion.rb:21:850:21:3060 | if ... | UseUseExplosion.rb:21:845:21:3060 | then ... | | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:3051:21:3056 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:3051:21:3056 | self | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [false] ( ... ) | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [true] ( ... ) | +| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | ( ... ) | | UseUseExplosion.rb:21:866:21:3044 | then ... | UseUseExplosion.rb:21:850:21:3060 | if ... | | UseUseExplosion.rb:21:871:21:3044 | if ... | UseUseExplosion.rb:21:866:21:3044 | then ... | | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:3035:21:3040 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:3035:21:3040 | self | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [false] ( ... ) | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [true] ( ... ) | +| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | ( ... ) | | UseUseExplosion.rb:21:887:21:3028 | then ... | UseUseExplosion.rb:21:871:21:3044 | if ... | | UseUseExplosion.rb:21:892:21:3028 | if ... | UseUseExplosion.rb:21:887:21:3028 | then ... | | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:3019:21:3024 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:3019:21:3024 | self | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [false] ( ... ) | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [true] ( ... ) | +| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | ( ... ) | | UseUseExplosion.rb:21:908:21:3012 | then ... | UseUseExplosion.rb:21:892:21:3028 | if ... | | UseUseExplosion.rb:21:913:21:3012 | if ... | UseUseExplosion.rb:21:908:21:3012 | then ... | | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:3003:21:3008 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:3003:21:3008 | self | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [false] ( ... ) | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [true] ( ... ) | +| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | ( ... ) | | UseUseExplosion.rb:21:929:21:2996 | then ... | UseUseExplosion.rb:21:913:21:3012 | if ... | | UseUseExplosion.rb:21:934:21:2996 | if ... | UseUseExplosion.rb:21:929:21:2996 | then ... | | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:2987:21:2992 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:2987:21:2992 | self | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [false] ( ... ) | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [true] ( ... ) | +| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | ( ... ) | | UseUseExplosion.rb:21:950:21:2980 | then ... | UseUseExplosion.rb:21:934:21:2996 | if ... | | UseUseExplosion.rb:21:955:21:2980 | if ... | UseUseExplosion.rb:21:950:21:2980 | then ... | | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:2971:21:2976 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:2971:21:2976 | self | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [false] ( ... ) | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [true] ( ... ) | +| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | ( ... ) | | UseUseExplosion.rb:21:971:21:2964 | then ... | UseUseExplosion.rb:21:955:21:2980 | if ... | | UseUseExplosion.rb:21:976:21:2964 | if ... | UseUseExplosion.rb:21:971:21:2964 | then ... | | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:2955:21:2960 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:2955:21:2960 | self | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [false] ( ... ) | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [true] ( ... ) | +| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | ( ... ) | | UseUseExplosion.rb:21:992:21:2948 | then ... | UseUseExplosion.rb:21:976:21:2964 | if ... | | UseUseExplosion.rb:21:997:21:2948 | if ... | UseUseExplosion.rb:21:992:21:2948 | then ... | | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:2939:21:2944 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:2939:21:2944 | self | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [false] ( ... ) | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [true] ( ... ) | +| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | ( ... ) | | UseUseExplosion.rb:21:1013:21:2932 | then ... | UseUseExplosion.rb:21:997:21:2948 | if ... | | UseUseExplosion.rb:21:1018:21:2932 | if ... | UseUseExplosion.rb:21:1013:21:2932 | then ... | | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:2923:21:2928 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:2923:21:2928 | self | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [false] ( ... ) | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [true] ( ... ) | +| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | ( ... ) | | UseUseExplosion.rb:21:1034:21:2916 | then ... | UseUseExplosion.rb:21:1018:21:2932 | if ... | | UseUseExplosion.rb:21:1039:21:2916 | if ... | UseUseExplosion.rb:21:1034:21:2916 | then ... | | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:2907:21:2912 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:2907:21:2912 | self | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [false] ( ... ) | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [true] ( ... ) | +| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | ( ... ) | | UseUseExplosion.rb:21:1055:21:2900 | then ... | UseUseExplosion.rb:21:1039:21:2916 | if ... | | UseUseExplosion.rb:21:1060:21:2900 | if ... | UseUseExplosion.rb:21:1055:21:2900 | then ... | | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:2891:21:2896 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:2891:21:2896 | self | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [false] ( ... ) | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [true] ( ... ) | +| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | ( ... ) | | UseUseExplosion.rb:21:1076:21:2884 | then ... | UseUseExplosion.rb:21:1060:21:2900 | if ... | | UseUseExplosion.rb:21:1081:21:2884 | if ... | UseUseExplosion.rb:21:1076:21:2884 | then ... | | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:2875:21:2880 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:2875:21:2880 | self | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [false] ( ... ) | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [true] ( ... ) | +| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | ( ... ) | | UseUseExplosion.rb:21:1097:21:2868 | then ... | UseUseExplosion.rb:21:1081:21:2884 | if ... | | UseUseExplosion.rb:21:1102:21:2868 | if ... | UseUseExplosion.rb:21:1097:21:2868 | then ... | | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:2859:21:2864 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:2859:21:2864 | self | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [false] ( ... ) | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [true] ( ... ) | +| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | ( ... ) | | UseUseExplosion.rb:21:1118:21:2852 | then ... | UseUseExplosion.rb:21:1102:21:2868 | if ... | | UseUseExplosion.rb:21:1123:21:2852 | if ... | UseUseExplosion.rb:21:1118:21:2852 | then ... | | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:2843:21:2848 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:2843:21:2848 | self | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [false] ( ... ) | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [true] ( ... ) | +| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | ( ... ) | | UseUseExplosion.rb:21:1139:21:2836 | then ... | UseUseExplosion.rb:21:1123:21:2852 | if ... | | UseUseExplosion.rb:21:1144:21:2836 | if ... | UseUseExplosion.rb:21:1139:21:2836 | then ... | | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:2827:21:2832 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:2827:21:2832 | self | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [false] ( ... ) | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [true] ( ... ) | +| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | ( ... ) | | UseUseExplosion.rb:21:1160:21:2820 | then ... | UseUseExplosion.rb:21:1144:21:2836 | if ... | | UseUseExplosion.rb:21:1165:21:2820 | if ... | UseUseExplosion.rb:21:1160:21:2820 | then ... | | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:2811:21:2816 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:2811:21:2816 | self | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [false] ( ... ) | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [true] ( ... ) | +| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | ( ... ) | | UseUseExplosion.rb:21:1181:21:2804 | then ... | UseUseExplosion.rb:21:1165:21:2820 | if ... | | UseUseExplosion.rb:21:1186:21:2804 | if ... | UseUseExplosion.rb:21:1181:21:2804 | then ... | | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:2795:21:2800 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:2795:21:2800 | self | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [false] ( ... ) | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [true] ( ... ) | +| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | ( ... ) | | UseUseExplosion.rb:21:1202:21:2788 | then ... | UseUseExplosion.rb:21:1186:21:2804 | if ... | | UseUseExplosion.rb:21:1207:21:2788 | if ... | UseUseExplosion.rb:21:1202:21:2788 | then ... | | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:2779:21:2784 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:2779:21:2784 | self | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [false] ( ... ) | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [true] ( ... ) | +| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | ( ... ) | | UseUseExplosion.rb:21:1223:21:2772 | then ... | UseUseExplosion.rb:21:1207:21:2788 | if ... | | UseUseExplosion.rb:21:1228:21:2772 | if ... | UseUseExplosion.rb:21:1223:21:2772 | then ... | | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:2763:21:2768 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:2763:21:2768 | self | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [false] ( ... ) | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [true] ( ... ) | +| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | ( ... ) | | UseUseExplosion.rb:21:1244:21:2756 | then ... | UseUseExplosion.rb:21:1228:21:2772 | if ... | | UseUseExplosion.rb:21:1249:21:2756 | if ... | UseUseExplosion.rb:21:1244:21:2756 | then ... | | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:2747:21:2752 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:2747:21:2752 | self | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [false] ( ... ) | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [true] ( ... ) | +| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | ( ... ) | | UseUseExplosion.rb:21:1265:21:2740 | then ... | UseUseExplosion.rb:21:1249:21:2756 | if ... | | UseUseExplosion.rb:21:1270:21:2740 | if ... | UseUseExplosion.rb:21:1265:21:2740 | then ... | | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:2731:21:2736 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:2731:21:2736 | self | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [false] ( ... ) | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [true] ( ... ) | +| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | ( ... ) | | UseUseExplosion.rb:21:1286:21:2724 | then ... | UseUseExplosion.rb:21:1270:21:2740 | if ... | | UseUseExplosion.rb:21:1291:21:2724 | if ... | UseUseExplosion.rb:21:1286:21:2724 | then ... | | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:2715:21:2720 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:2715:21:2720 | self | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [false] ( ... ) | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [true] ( ... ) | +| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | ( ... ) | | UseUseExplosion.rb:21:1307:21:2708 | then ... | UseUseExplosion.rb:21:1291:21:2724 | if ... | | UseUseExplosion.rb:21:1312:21:2708 | if ... | UseUseExplosion.rb:21:1307:21:2708 | then ... | | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:2699:21:2704 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:2699:21:2704 | self | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [false] ( ... ) | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [true] ( ... ) | +| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | ( ... ) | | UseUseExplosion.rb:21:1328:21:2692 | then ... | UseUseExplosion.rb:21:1312:21:2708 | if ... | | UseUseExplosion.rb:21:1333:21:2692 | if ... | UseUseExplosion.rb:21:1328:21:2692 | then ... | | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:2683:21:2688 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:2683:21:2688 | self | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [false] ( ... ) | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [true] ( ... ) | +| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | ( ... ) | | UseUseExplosion.rb:21:1349:21:2676 | then ... | UseUseExplosion.rb:21:1333:21:2692 | if ... | | UseUseExplosion.rb:21:1354:21:2676 | if ... | UseUseExplosion.rb:21:1349:21:2676 | then ... | | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:2667:21:2672 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:2667:21:2672 | self | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [false] ( ... ) | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [true] ( ... ) | +| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | ( ... ) | | UseUseExplosion.rb:21:1370:21:2660 | then ... | UseUseExplosion.rb:21:1354:21:2676 | if ... | | UseUseExplosion.rb:21:1375:21:2660 | if ... | UseUseExplosion.rb:21:1370:21:2660 | then ... | | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:2651:21:2656 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:2651:21:2656 | self | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [false] ( ... ) | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [true] ( ... ) | +| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | ( ... ) | | UseUseExplosion.rb:21:1391:21:2644 | then ... | UseUseExplosion.rb:21:1375:21:2660 | if ... | | UseUseExplosion.rb:21:1396:21:2644 | if ... | UseUseExplosion.rb:21:1391:21:2644 | then ... | | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:2635:21:2640 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:2635:21:2640 | self | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [false] ( ... ) | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [true] ( ... ) | +| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | ( ... ) | | UseUseExplosion.rb:21:1412:21:2628 | then ... | UseUseExplosion.rb:21:1396:21:2644 | if ... | | UseUseExplosion.rb:21:1417:21:2628 | if ... | UseUseExplosion.rb:21:1412:21:2628 | then ... | | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:2619:21:2624 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:2619:21:2624 | self | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [false] ( ... ) | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [true] ( ... ) | +| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | ( ... ) | | UseUseExplosion.rb:21:1433:21:2612 | then ... | UseUseExplosion.rb:21:1417:21:2628 | if ... | | UseUseExplosion.rb:21:1438:21:2612 | if ... | UseUseExplosion.rb:21:1433:21:2612 | then ... | | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:2603:21:2608 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:2603:21:2608 | self | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [false] ( ... ) | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [true] ( ... ) | +| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | ( ... ) | | UseUseExplosion.rb:21:1454:21:2596 | then ... | UseUseExplosion.rb:21:1438:21:2612 | if ... | | UseUseExplosion.rb:21:1459:21:2596 | if ... | UseUseExplosion.rb:21:1454:21:2596 | then ... | | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:2587:21:2592 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:2587:21:2592 | self | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [false] ( ... ) | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [true] ( ... ) | +| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | ( ... ) | | UseUseExplosion.rb:21:1475:21:2580 | then ... | UseUseExplosion.rb:21:1459:21:2596 | if ... | | UseUseExplosion.rb:21:1480:21:2580 | if ... | UseUseExplosion.rb:21:1475:21:2580 | then ... | | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:2571:21:2576 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:2571:21:2576 | self | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [false] ( ... ) | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [true] ( ... ) | +| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | ( ... ) | | UseUseExplosion.rb:21:1496:21:2564 | then ... | UseUseExplosion.rb:21:1480:21:2580 | if ... | | UseUseExplosion.rb:21:1501:21:2564 | if ... | UseUseExplosion.rb:21:1496:21:2564 | then ... | | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:2555:21:2560 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:2555:21:2560 | self | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [false] ( ... ) | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [true] ( ... ) | +| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | ( ... ) | | UseUseExplosion.rb:21:1517:21:2548 | then ... | UseUseExplosion.rb:21:1501:21:2564 | if ... | | UseUseExplosion.rb:21:1522:21:2548 | if ... | UseUseExplosion.rb:21:1517:21:2548 | then ... | | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:2539:21:2544 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:2539:21:2544 | self | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [false] ( ... ) | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [true] ( ... ) | +| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | ( ... ) | | UseUseExplosion.rb:21:1538:21:2532 | then ... | UseUseExplosion.rb:21:1522:21:2548 | if ... | | UseUseExplosion.rb:21:1543:21:2532 | if ... | UseUseExplosion.rb:21:1538:21:2532 | then ... | | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:2523:21:2528 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:2523:21:2528 | self | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [false] ( ... ) | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [true] ( ... ) | +| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | ( ... ) | | UseUseExplosion.rb:21:1559:21:2516 | then ... | UseUseExplosion.rb:21:1543:21:2532 | if ... | | UseUseExplosion.rb:21:1564:21:2516 | if ... | UseUseExplosion.rb:21:1559:21:2516 | then ... | | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:2507:21:2512 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:2507:21:2512 | self | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [false] ( ... ) | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [true] ( ... ) | +| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | ( ... ) | | UseUseExplosion.rb:21:1580:21:2500 | then ... | UseUseExplosion.rb:21:1564:21:2516 | if ... | | UseUseExplosion.rb:21:1585:21:2500 | if ... | UseUseExplosion.rb:21:1580:21:2500 | then ... | | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:2491:21:2496 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:2491:21:2496 | self | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [false] ( ... ) | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [true] ( ... ) | +| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | ( ... ) | | UseUseExplosion.rb:21:1601:21:2484 | then ... | UseUseExplosion.rb:21:1585:21:2500 | if ... | | UseUseExplosion.rb:21:1606:21:2484 | if ... | UseUseExplosion.rb:21:1601:21:2484 | then ... | | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:2475:21:2480 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:2475:21:2480 | self | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [false] ( ... ) | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [true] ( ... ) | +| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | ( ... ) | | UseUseExplosion.rb:21:1622:21:2468 | then ... | UseUseExplosion.rb:21:1606:21:2484 | if ... | | UseUseExplosion.rb:21:1627:21:2468 | if ... | UseUseExplosion.rb:21:1622:21:2468 | then ... | | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:2459:21:2464 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:2459:21:2464 | self | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [false] ( ... ) | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [true] ( ... ) | +| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | ( ... ) | | UseUseExplosion.rb:21:1643:21:2452 | then ... | UseUseExplosion.rb:21:1627:21:2468 | if ... | | UseUseExplosion.rb:21:1648:21:2452 | if ... | UseUseExplosion.rb:21:1643:21:2452 | then ... | | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:2443:21:2448 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:2443:21:2448 | self | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [false] ( ... ) | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [true] ( ... ) | +| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | ( ... ) | | UseUseExplosion.rb:21:1664:21:2436 | then ... | UseUseExplosion.rb:21:1648:21:2452 | if ... | | UseUseExplosion.rb:21:1669:21:2436 | if ... | UseUseExplosion.rb:21:1664:21:2436 | then ... | | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:2427:21:2432 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:2427:21:2432 | self | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [false] ( ... ) | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [true] ( ... ) | +| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | ( ... ) | | UseUseExplosion.rb:21:1685:21:2420 | then ... | UseUseExplosion.rb:21:1669:21:2436 | if ... | | UseUseExplosion.rb:21:1690:21:2420 | if ... | UseUseExplosion.rb:21:1685:21:2420 | then ... | | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:2411:21:2416 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:2411:21:2416 | self | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [false] ( ... ) | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [true] ( ... ) | +| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | ( ... ) | | UseUseExplosion.rb:21:1706:21:2404 | then ... | UseUseExplosion.rb:21:1690:21:2420 | if ... | | UseUseExplosion.rb:21:1711:21:2404 | if ... | UseUseExplosion.rb:21:1706:21:2404 | then ... | | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:2395:21:2400 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:2395:21:2400 | self | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [false] ( ... ) | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [true] ( ... ) | +| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | ( ... ) | | UseUseExplosion.rb:21:1727:21:2388 | then ... | UseUseExplosion.rb:21:1711:21:2404 | if ... | | UseUseExplosion.rb:21:1732:21:2388 | if ... | UseUseExplosion.rb:21:1727:21:2388 | then ... | | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:2379:21:2384 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:2379:21:2384 | self | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [false] ( ... ) | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [true] ( ... ) | +| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | ( ... ) | | UseUseExplosion.rb:21:1748:21:2372 | then ... | UseUseExplosion.rb:21:1732:21:2388 | if ... | | UseUseExplosion.rb:21:1753:21:2372 | if ... | UseUseExplosion.rb:21:1748:21:2372 | then ... | | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:2363:21:2368 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:2363:21:2368 | self | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [false] ( ... ) | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [true] ( ... ) | +| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | ( ... ) | | UseUseExplosion.rb:21:1769:21:2356 | then ... | UseUseExplosion.rb:21:1753:21:2372 | if ... | | UseUseExplosion.rb:21:1774:21:2356 | if ... | UseUseExplosion.rb:21:1769:21:2356 | then ... | | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:2347:21:2352 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:2347:21:2352 | self | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [false] ( ... ) | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [true] ( ... ) | +| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | ( ... ) | | UseUseExplosion.rb:21:1790:21:2340 | then ... | UseUseExplosion.rb:21:1774:21:2356 | if ... | | UseUseExplosion.rb:21:1795:21:2340 | if ... | UseUseExplosion.rb:21:1790:21:2340 | then ... | | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:2331:21:2336 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:2331:21:2336 | self | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [false] ( ... ) | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [true] ( ... ) | +| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | ( ... ) | | UseUseExplosion.rb:21:1811:21:2324 | then ... | UseUseExplosion.rb:21:1795:21:2340 | if ... | | UseUseExplosion.rb:21:1816:21:2324 | if ... | UseUseExplosion.rb:21:1811:21:2324 | then ... | | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:2315:21:2320 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:2315:21:2320 | self | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [false] ( ... ) | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [true] ( ... ) | +| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | ( ... ) | | UseUseExplosion.rb:21:1832:21:2308 | then ... | UseUseExplosion.rb:21:1816:21:2324 | if ... | | UseUseExplosion.rb:21:1837:21:2308 | if ... | UseUseExplosion.rb:21:1832:21:2308 | then ... | | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:2299:21:2304 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:2299:21:2304 | self | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [false] ( ... ) | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [true] ( ... ) | +| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | ( ... ) | | UseUseExplosion.rb:21:1853:21:2292 | then ... | UseUseExplosion.rb:21:1837:21:2308 | if ... | | UseUseExplosion.rb:21:1858:21:2292 | if ... | UseUseExplosion.rb:21:1853:21:2292 | then ... | | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:2283:21:2288 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:2283:21:2288 | self | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [false] ( ... ) | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [true] ( ... ) | +| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | ( ... ) | | UseUseExplosion.rb:21:1874:21:2276 | then ... | UseUseExplosion.rb:21:1858:21:2292 | if ... | | UseUseExplosion.rb:21:1879:21:2276 | if ... | UseUseExplosion.rb:21:1874:21:2276 | then ... | | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:2267:21:2272 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:2267:21:2272 | self | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [false] ( ... ) | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [true] ( ... ) | +| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | ( ... ) | | UseUseExplosion.rb:21:1895:21:2260 | then ... | UseUseExplosion.rb:21:1879:21:2276 | if ... | | UseUseExplosion.rb:21:1900:21:2260 | if ... | UseUseExplosion.rb:21:1895:21:2260 | then ... | | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:2251:21:2256 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:2251:21:2256 | self | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [false] ( ... ) | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [true] ( ... ) | +| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | ( ... ) | | UseUseExplosion.rb:21:1916:21:2244 | then ... | UseUseExplosion.rb:21:1900:21:2260 | if ... | | UseUseExplosion.rb:21:1921:21:2244 | if ... | UseUseExplosion.rb:21:1916:21:2244 | then ... | | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:2235:21:2240 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:2235:21:2240 | self | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [false] ( ... ) | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [true] ( ... ) | +| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | ( ... ) | | UseUseExplosion.rb:21:1936:21:2228 | then ... | UseUseExplosion.rb:21:1921:21:2244 | if ... | | UseUseExplosion.rb:21:1941:21:2228 | if ... | UseUseExplosion.rb:21:1936:21:2228 | then ... | | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:2219:21:2224 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:2219:21:2224 | self | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [false] ( ... ) | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [true] ( ... ) | +| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | ( ... ) | | UseUseExplosion.rb:21:1956:21:2212 | then ... | UseUseExplosion.rb:21:1941:21:2228 | if ... | | UseUseExplosion.rb:21:1961:21:2212 | if ... | UseUseExplosion.rb:21:1956:21:2212 | then ... | | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:2203:21:2208 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:2203:21:2208 | self | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [false] ( ... ) | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [true] ( ... ) | +| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | ( ... ) | | UseUseExplosion.rb:21:1976:21:2196 | then ... | UseUseExplosion.rb:21:1961:21:2212 | if ... | | UseUseExplosion.rb:21:1981:21:2196 | if ... | UseUseExplosion.rb:21:1976:21:2196 | then ... | | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2187:21:2192 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2187:21:2192 | self | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [false] ( ... ) | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [true] ( ... ) | +| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | ( ... ) | | UseUseExplosion.rb:21:1996:21:2180 | then ... | UseUseExplosion.rb:21:1981:21:2196 | if ... | | UseUseExplosion.rb:21:2001:21:2180 | if ... | UseUseExplosion.rb:21:1996:21:2180 | then ... | | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2171:21:2176 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2171:21:2176 | self | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [false] ( ... ) | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [true] ( ... ) | +| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | ( ... ) | | UseUseExplosion.rb:21:2016:21:2164 | then ... | UseUseExplosion.rb:21:2001:21:2180 | if ... | | UseUseExplosion.rb:21:2021:21:2164 | if ... | UseUseExplosion.rb:21:2016:21:2164 | then ... | | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2155:21:2160 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2155:21:2160 | self | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [false] ( ... ) | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [true] ( ... ) | +| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | ( ... ) | | UseUseExplosion.rb:21:2036:21:2148 | then ... | UseUseExplosion.rb:21:2021:21:2164 | if ... | | UseUseExplosion.rb:21:2041:21:2148 | if ... | UseUseExplosion.rb:21:2036:21:2148 | then ... | | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2139:21:2144 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2139:21:2144 | self | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [false] ( ... ) | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [true] ( ... ) | +| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | ( ... ) | | UseUseExplosion.rb:21:2056:21:2132 | then ... | UseUseExplosion.rb:21:2041:21:2148 | if ... | | UseUseExplosion.rb:21:2061:21:2132 | if ... | UseUseExplosion.rb:21:2056:21:2132 | then ... | | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2123:21:2128 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2123:21:2128 | self | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [false] ( ... ) | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [true] ( ... ) | +| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | ( ... ) | | UseUseExplosion.rb:21:2076:21:2116 | then ... | UseUseExplosion.rb:21:2061:21:2132 | if ... | | UseUseExplosion.rb:21:2081:21:2116 | if ... | UseUseExplosion.rb:21:2076:21:2116 | then ... | | UseUseExplosion.rb:21:2085:21:2089 | [post] self | UseUseExplosion.rb:21:2107:21:2112 | self | | UseUseExplosion.rb:21:2085:21:2089 | self | UseUseExplosion.rb:21:2107:21:2112 | self | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [false] ( ... ) | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [true] ( ... ) | +| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | ( ... ) | | UseUseExplosion.rb:21:2096:21:2099 | then ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2102:21:2112 | else ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2107:21:2112 | call to use | UseUseExplosion.rb:21:2102:21:2112 | else ... | @@ -2836,8 +2636,7 @@ | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:18:133:23 | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:18:133:23 | self | | local_dataflow.rb:133:12:133:12 | [post] x | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | @@ -2848,8 +2647,7 @@ | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:136:7:136:12 | self | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:136:7:136:12 | self | | local_dataflow.rb:133:22:133:22 | [post] x | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | @@ -2882,10 +2680,9 @@ | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:25:137:25 | x | -| local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | +| local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | @@ -2894,11 +2691,9 @@ | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | @@ -2907,28 +2702,24 @@ | local_dataflow.rb:141:13:141:13 | [post] x | local_dataflow.rb:141:24:141:24 | x | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:24:141:24 | x | -| local_dataflow.rb:141:19:141:37 | [false] ( ... ) | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:19:141:37 | [post] [false] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [false] ... && ... | -| local_dataflow.rb:141:19:141:37 | [post] [true] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [true] ... && ... | -| local_dataflow.rb:141:19:141:37 | [true] ( ... ) | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | [post] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] ... && ... | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:31:141:36 | self | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:31:141:36 | self | -| local_dataflow.rb:141:20:141:36 | [false] ... && ... | local_dataflow.rb:141:19:141:37 | [false] ( ... ) | -| local_dataflow.rb:141:20:141:36 | [true] ... && ... | local_dataflow.rb:141:19:141:37 | [true] ( ... ) | +| local_dataflow.rb:141:20:141:36 | ... && ... | local_dataflow.rb:141:19:141:37 | ( ... ) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:35:141:35 | x | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:35:141:35 | x | -| local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | +| local_dataflow.rb:141:30:141:36 | ! ... | local_dataflow.rb:141:20:141:36 | ... && ... | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | -| local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | @@ -2946,8 +2737,7 @@ | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:21:143:26 | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:21:143:26 | self | | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | @@ -2960,8 +2750,7 @@ | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:25:143:25 | [post] x | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(x) | diff --git a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected index 18ce6eca2c53..3f13439012e9 100644 --- a/ruby/ql/test/library-tests/dataflow/local/Nodes.expected +++ b/ruby/ql/test/library-tests/dataflow/local/Nodes.expected @@ -1235,8 +1235,7 @@ arg | local_dataflow.rb:9:12:9:12 | 2 | local_dataflow.rb:9:9:9:15 | call to [] | position 1 | | local_dataflow.rb:9:14:9:14 | 3 | local_dataflow.rb:9:9:9:15 | call to [] | position 2 | | local_dataflow.rb:10:5:13:3 | { ... } | local_dataflow.rb:10:5:13:3 | call to each | block | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [false] ! ... | self | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [true] ! ... | self | +| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | ! ... | self | | local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:10:9:10:9 | defined? ... | self | | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:10:5:13:3 | call to each | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:11:1:11:2 | call to do | self | @@ -1244,13 +1243,11 @@ arg | local_dataflow.rb:12:3:12:5 | synthetic splat argument | local_dataflow.rb:12:3:12:5 | call to p | synthetic * | | local_dataflow.rb:12:5:12:5 | x | local_dataflow.rb:12:3:12:5 | call to p | position 0 | | local_dataflow.rb:15:1:17:3 | { ... } | local_dataflow.rb:15:1:17:3 | call to each | block | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [false] ! ... | self | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [true] ! ... | self | +| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | ! ... | self | | local_dataflow.rb:15:5:15:5 | x | local_dataflow.rb:15:5:15:5 | defined? ... | self | | local_dataflow.rb:15:10:15:14 | array | local_dataflow.rb:15:1:17:3 | call to each | self | | local_dataflow.rb:19:1:21:3 | { ... } | local_dataflow.rb:19:1:21:3 | call to each | block | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [false] ! ... | self | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [true] ! ... | self | +| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | ! ... | self | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | defined? ... | self | | local_dataflow.rb:19:10:19:14 | array | local_dataflow.rb:19:1:21:3 | call to each | self | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | self | @@ -1446,15 +1443,12 @@ arg | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:132:6:132:11 | call to use | self | | local_dataflow.rb:132:6:132:11 | synthetic splat argument | local_dataflow.rb:132:6:132:11 | call to use | synthetic * | | local_dataflow.rb:132:10:132:10 | x | local_dataflow.rb:132:6:132:11 | call to use | position 0 | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | self | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | self | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | call to use | self | | local_dataflow.rb:133:8:133:13 | synthetic splat argument | local_dataflow.rb:133:8:133:13 | call to use | synthetic * | -| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | synthetic * | +| local_dataflow.rb:133:8:133:23 | synthetic splat argument | local_dataflow.rb:133:8:133:23 | ... \|\| ... | synthetic * | | local_dataflow.rb:133:12:133:12 | x | local_dataflow.rb:133:8:133:13 | call to use | position 0 | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | position 0 | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | position 0 | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | call to use | self | | local_dataflow.rb:133:18:133:23 | synthetic splat argument | local_dataflow.rb:133:18:133:23 | call to use | synthetic * | | local_dataflow.rb:133:22:133:22 | x | local_dataflow.rb:133:18:133:23 | call to use | position 0 | @@ -1464,55 +1458,39 @@ arg | local_dataflow.rb:136:7:136:12 | self | local_dataflow.rb:136:7:136:12 | call to use | self | | local_dataflow.rb:136:7:136:12 | synthetic splat argument | local_dataflow.rb:136:7:136:12 | call to use | synthetic * | | local_dataflow.rb:136:11:136:11 | x | local_dataflow.rb:136:7:136:12 | call to use | position 0 | -| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | [false] ... && ... | self | -| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | [true] ... && ... | self | +| local_dataflow.rb:137:10:137:15 | call to use | local_dataflow.rb:137:10:137:26 | ... && ... | self | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:10:137:15 | call to use | self | | local_dataflow.rb:137:10:137:15 | synthetic splat argument | local_dataflow.rb:137:10:137:15 | call to use | synthetic * | -| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | [false] ... && ... | synthetic * | -| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | [true] ... && ... | synthetic * | +| local_dataflow.rb:137:10:137:26 | synthetic splat argument | local_dataflow.rb:137:10:137:26 | ... && ... | synthetic * | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | call to use | position 0 | -| local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | position 0 | -| local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | position 0 | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [false] ! ... | self | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [true] ! ... | self | +| local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | position 0 | +| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | ! ... | self | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:21:137:26 | call to use | self | | local_dataflow.rb:137:21:137:26 | synthetic splat argument | local_dataflow.rb:137:21:137:26 | call to use | synthetic * | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:21:137:26 | call to use | position 0 | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | self | -| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | synthetic * | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [false] ! ... | self | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [true] ! ... | self | +| local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | self | +| local_dataflow.rb:141:8:141:37 | synthetic splat argument | local_dataflow.rb:141:8:141:37 | ... \|\| ... | synthetic * | +| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | ! ... | self | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:9:141:14 | call to use | self | | local_dataflow.rb:141:9:141:14 | synthetic splat argument | local_dataflow.rb:141:9:141:14 | call to use | synthetic * | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:9:141:14 | call to use | position 0 | -| local_dataflow.rb:141:19:141:37 | [false] ( ... ) | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:141:19:141:37 | [true] ( ... ) | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | position 0 | -| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | [false] ... && ... | self | -| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | [true] ... && ... | self | +| local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | position 0 | +| local_dataflow.rb:141:20:141:25 | call to use | local_dataflow.rb:141:20:141:36 | ... && ... | self | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:20:141:25 | call to use | self | | local_dataflow.rb:141:20:141:25 | synthetic splat argument | local_dataflow.rb:141:20:141:25 | call to use | synthetic * | -| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | [false] ... && ... | synthetic * | -| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | [true] ... && ... | synthetic * | +| local_dataflow.rb:141:20:141:36 | synthetic splat argument | local_dataflow.rb:141:20:141:36 | ... && ... | synthetic * | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | call to use | position 0 | -| local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | position 0 | -| local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | position 0 | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [false] ! ... | self | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [true] ! ... | self | +| local_dataflow.rb:141:30:141:36 | ! ... | local_dataflow.rb:141:20:141:36 | ... && ... | position 0 | +| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | ! ... | self | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:31:141:36 | call to use | self | | local_dataflow.rb:141:31:141:36 | synthetic splat argument | local_dataflow.rb:141:31:141:36 | call to use | synthetic * | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:31:141:36 | call to use | position 0 | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | self | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | self | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | call to use | self | | local_dataflow.rb:143:11:143:16 | synthetic splat argument | local_dataflow.rb:143:11:143:16 | call to use | synthetic * | -| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | synthetic * | -| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | synthetic * | +| local_dataflow.rb:143:11:143:26 | synthetic splat argument | local_dataflow.rb:143:11:143:26 | ... \|\| ... | synthetic * | | local_dataflow.rb:143:15:143:15 | x | local_dataflow.rb:143:11:143:16 | call to use | position 0 | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | position 0 | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | position 0 | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | position 0 | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | call to use | self | | local_dataflow.rb:143:21:143:26 | synthetic splat argument | local_dataflow.rb:143:21:143:26 | call to use | synthetic * | | local_dataflow.rb:143:25:143:25 | x | local_dataflow.rb:143:21:143:26 | call to use | position 0 | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 028746bbcdca..c81cd6fc0646 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -208,8 +208,7 @@ | UseUseExplosion.rb:20:13:20:17 | [post] self | UseUseExplosion.rb:20:3691:20:3696 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:35:20:39 | self | | UseUseExplosion.rb:20:13:20:17 | self | UseUseExplosion.rb:20:3691:20:3696 | self | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [false] ( ... ) | -| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | [true] ( ... ) | +| UseUseExplosion.rb:20:13:20:23 | ... > ... | UseUseExplosion.rb:20:12:20:24 | ( ... ) | | UseUseExplosion.rb:20:21:20:23 | 100 | UseUseExplosion.rb:20:13:20:23 | ... > ... | | UseUseExplosion.rb:20:26:20:3684 | then ... | UseUseExplosion.rb:20:9:20:3700 | if ... | | UseUseExplosion.rb:20:31:20:3684 | if ... | UseUseExplosion.rb:20:26:20:3684 | then ... | @@ -218,8 +217,7 @@ | UseUseExplosion.rb:20:35:20:39 | [post] self | UseUseExplosion.rb:20:3675:20:3680 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:56:20:60 | self | | UseUseExplosion.rb:20:35:20:39 | self | UseUseExplosion.rb:20:3675:20:3680 | self | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [false] ( ... ) | -| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | [true] ( ... ) | +| UseUseExplosion.rb:20:35:20:44 | ... > ... | UseUseExplosion.rb:20:34:20:45 | ( ... ) | | UseUseExplosion.rb:20:43:20:44 | 99 | UseUseExplosion.rb:20:35:20:44 | ... > ... | | UseUseExplosion.rb:20:47:20:3668 | then ... | UseUseExplosion.rb:20:31:20:3684 | if ... | | UseUseExplosion.rb:20:52:20:3668 | if ... | UseUseExplosion.rb:20:47:20:3668 | then ... | @@ -228,8 +226,7 @@ | UseUseExplosion.rb:20:56:20:60 | [post] self | UseUseExplosion.rb:20:3659:20:3664 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:77:20:81 | self | | UseUseExplosion.rb:20:56:20:60 | self | UseUseExplosion.rb:20:3659:20:3664 | self | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [false] ( ... ) | -| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | [true] ( ... ) | +| UseUseExplosion.rb:20:56:20:65 | ... > ... | UseUseExplosion.rb:20:55:20:66 | ( ... ) | | UseUseExplosion.rb:20:64:20:65 | 98 | UseUseExplosion.rb:20:56:20:65 | ... > ... | | UseUseExplosion.rb:20:68:20:3652 | then ... | UseUseExplosion.rb:20:52:20:3668 | if ... | | UseUseExplosion.rb:20:73:20:3652 | if ... | UseUseExplosion.rb:20:68:20:3652 | then ... | @@ -238,8 +235,7 @@ | UseUseExplosion.rb:20:77:20:81 | [post] self | UseUseExplosion.rb:20:3643:20:3648 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:98:20:102 | self | | UseUseExplosion.rb:20:77:20:81 | self | UseUseExplosion.rb:20:3643:20:3648 | self | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [false] ( ... ) | -| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | [true] ( ... ) | +| UseUseExplosion.rb:20:77:20:86 | ... > ... | UseUseExplosion.rb:20:76:20:87 | ( ... ) | | UseUseExplosion.rb:20:85:20:86 | 97 | UseUseExplosion.rb:20:77:20:86 | ... > ... | | UseUseExplosion.rb:20:89:20:3636 | then ... | UseUseExplosion.rb:20:73:20:3652 | if ... | | UseUseExplosion.rb:20:94:20:3636 | if ... | UseUseExplosion.rb:20:89:20:3636 | then ... | @@ -248,8 +244,7 @@ | UseUseExplosion.rb:20:98:20:102 | [post] self | UseUseExplosion.rb:20:3627:20:3632 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:119:20:123 | self | | UseUseExplosion.rb:20:98:20:102 | self | UseUseExplosion.rb:20:3627:20:3632 | self | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [false] ( ... ) | -| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | [true] ( ... ) | +| UseUseExplosion.rb:20:98:20:107 | ... > ... | UseUseExplosion.rb:20:97:20:108 | ( ... ) | | UseUseExplosion.rb:20:106:20:107 | 96 | UseUseExplosion.rb:20:98:20:107 | ... > ... | | UseUseExplosion.rb:20:110:20:3620 | then ... | UseUseExplosion.rb:20:94:20:3636 | if ... | | UseUseExplosion.rb:20:115:20:3620 | if ... | UseUseExplosion.rb:20:110:20:3620 | then ... | @@ -258,8 +253,7 @@ | UseUseExplosion.rb:20:119:20:123 | [post] self | UseUseExplosion.rb:20:3611:20:3616 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:140:20:144 | self | | UseUseExplosion.rb:20:119:20:123 | self | UseUseExplosion.rb:20:3611:20:3616 | self | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [false] ( ... ) | -| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | [true] ( ... ) | +| UseUseExplosion.rb:20:119:20:128 | ... > ... | UseUseExplosion.rb:20:118:20:129 | ( ... ) | | UseUseExplosion.rb:20:127:20:128 | 95 | UseUseExplosion.rb:20:119:20:128 | ... > ... | | UseUseExplosion.rb:20:131:20:3604 | then ... | UseUseExplosion.rb:20:115:20:3620 | if ... | | UseUseExplosion.rb:20:136:20:3604 | if ... | UseUseExplosion.rb:20:131:20:3604 | then ... | @@ -268,8 +262,7 @@ | UseUseExplosion.rb:20:140:20:144 | [post] self | UseUseExplosion.rb:20:3595:20:3600 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:161:20:165 | self | | UseUseExplosion.rb:20:140:20:144 | self | UseUseExplosion.rb:20:3595:20:3600 | self | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [false] ( ... ) | -| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | [true] ( ... ) | +| UseUseExplosion.rb:20:140:20:149 | ... > ... | UseUseExplosion.rb:20:139:20:150 | ( ... ) | | UseUseExplosion.rb:20:148:20:149 | 94 | UseUseExplosion.rb:20:140:20:149 | ... > ... | | UseUseExplosion.rb:20:152:20:3588 | then ... | UseUseExplosion.rb:20:136:20:3604 | if ... | | UseUseExplosion.rb:20:157:20:3588 | if ... | UseUseExplosion.rb:20:152:20:3588 | then ... | @@ -278,8 +271,7 @@ | UseUseExplosion.rb:20:161:20:165 | [post] self | UseUseExplosion.rb:20:3579:20:3584 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:182:20:186 | self | | UseUseExplosion.rb:20:161:20:165 | self | UseUseExplosion.rb:20:3579:20:3584 | self | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [false] ( ... ) | -| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | [true] ( ... ) | +| UseUseExplosion.rb:20:161:20:170 | ... > ... | UseUseExplosion.rb:20:160:20:171 | ( ... ) | | UseUseExplosion.rb:20:169:20:170 | 93 | UseUseExplosion.rb:20:161:20:170 | ... > ... | | UseUseExplosion.rb:20:173:20:3572 | then ... | UseUseExplosion.rb:20:157:20:3588 | if ... | | UseUseExplosion.rb:20:178:20:3572 | if ... | UseUseExplosion.rb:20:173:20:3572 | then ... | @@ -288,8 +280,7 @@ | UseUseExplosion.rb:20:182:20:186 | [post] self | UseUseExplosion.rb:20:3563:20:3568 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:203:20:207 | self | | UseUseExplosion.rb:20:182:20:186 | self | UseUseExplosion.rb:20:3563:20:3568 | self | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [false] ( ... ) | -| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | [true] ( ... ) | +| UseUseExplosion.rb:20:182:20:191 | ... > ... | UseUseExplosion.rb:20:181:20:192 | ( ... ) | | UseUseExplosion.rb:20:190:20:191 | 92 | UseUseExplosion.rb:20:182:20:191 | ... > ... | | UseUseExplosion.rb:20:194:20:3556 | then ... | UseUseExplosion.rb:20:178:20:3572 | if ... | | UseUseExplosion.rb:20:199:20:3556 | if ... | UseUseExplosion.rb:20:194:20:3556 | then ... | @@ -298,8 +289,7 @@ | UseUseExplosion.rb:20:203:20:207 | [post] self | UseUseExplosion.rb:20:3547:20:3552 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:224:20:228 | self | | UseUseExplosion.rb:20:203:20:207 | self | UseUseExplosion.rb:20:3547:20:3552 | self | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [false] ( ... ) | -| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | [true] ( ... ) | +| UseUseExplosion.rb:20:203:20:212 | ... > ... | UseUseExplosion.rb:20:202:20:213 | ( ... ) | | UseUseExplosion.rb:20:211:20:212 | 91 | UseUseExplosion.rb:20:203:20:212 | ... > ... | | UseUseExplosion.rb:20:215:20:3540 | then ... | UseUseExplosion.rb:20:199:20:3556 | if ... | | UseUseExplosion.rb:20:220:20:3540 | if ... | UseUseExplosion.rb:20:215:20:3540 | then ... | @@ -308,8 +298,7 @@ | UseUseExplosion.rb:20:224:20:228 | [post] self | UseUseExplosion.rb:20:3531:20:3536 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:245:20:249 | self | | UseUseExplosion.rb:20:224:20:228 | self | UseUseExplosion.rb:20:3531:20:3536 | self | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [false] ( ... ) | -| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | [true] ( ... ) | +| UseUseExplosion.rb:20:224:20:233 | ... > ... | UseUseExplosion.rb:20:223:20:234 | ( ... ) | | UseUseExplosion.rb:20:232:20:233 | 90 | UseUseExplosion.rb:20:224:20:233 | ... > ... | | UseUseExplosion.rb:20:236:20:3524 | then ... | UseUseExplosion.rb:20:220:20:3540 | if ... | | UseUseExplosion.rb:20:241:20:3524 | if ... | UseUseExplosion.rb:20:236:20:3524 | then ... | @@ -318,8 +307,7 @@ | UseUseExplosion.rb:20:245:20:249 | [post] self | UseUseExplosion.rb:20:3515:20:3520 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:266:20:270 | self | | UseUseExplosion.rb:20:245:20:249 | self | UseUseExplosion.rb:20:3515:20:3520 | self | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [false] ( ... ) | -| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | [true] ( ... ) | +| UseUseExplosion.rb:20:245:20:254 | ... > ... | UseUseExplosion.rb:20:244:20:255 | ( ... ) | | UseUseExplosion.rb:20:253:20:254 | 89 | UseUseExplosion.rb:20:245:20:254 | ... > ... | | UseUseExplosion.rb:20:257:20:3508 | then ... | UseUseExplosion.rb:20:241:20:3524 | if ... | | UseUseExplosion.rb:20:262:20:3508 | if ... | UseUseExplosion.rb:20:257:20:3508 | then ... | @@ -328,8 +316,7 @@ | UseUseExplosion.rb:20:266:20:270 | [post] self | UseUseExplosion.rb:20:3499:20:3504 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:287:20:291 | self | | UseUseExplosion.rb:20:266:20:270 | self | UseUseExplosion.rb:20:3499:20:3504 | self | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [false] ( ... ) | -| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | [true] ( ... ) | +| UseUseExplosion.rb:20:266:20:275 | ... > ... | UseUseExplosion.rb:20:265:20:276 | ( ... ) | | UseUseExplosion.rb:20:274:20:275 | 88 | UseUseExplosion.rb:20:266:20:275 | ... > ... | | UseUseExplosion.rb:20:278:20:3492 | then ... | UseUseExplosion.rb:20:262:20:3508 | if ... | | UseUseExplosion.rb:20:283:20:3492 | if ... | UseUseExplosion.rb:20:278:20:3492 | then ... | @@ -338,8 +325,7 @@ | UseUseExplosion.rb:20:287:20:291 | [post] self | UseUseExplosion.rb:20:3483:20:3488 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:308:20:312 | self | | UseUseExplosion.rb:20:287:20:291 | self | UseUseExplosion.rb:20:3483:20:3488 | self | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [false] ( ... ) | -| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | [true] ( ... ) | +| UseUseExplosion.rb:20:287:20:296 | ... > ... | UseUseExplosion.rb:20:286:20:297 | ( ... ) | | UseUseExplosion.rb:20:295:20:296 | 87 | UseUseExplosion.rb:20:287:20:296 | ... > ... | | UseUseExplosion.rb:20:299:20:3476 | then ... | UseUseExplosion.rb:20:283:20:3492 | if ... | | UseUseExplosion.rb:20:304:20:3476 | if ... | UseUseExplosion.rb:20:299:20:3476 | then ... | @@ -348,8 +334,7 @@ | UseUseExplosion.rb:20:308:20:312 | [post] self | UseUseExplosion.rb:20:3467:20:3472 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:329:20:333 | self | | UseUseExplosion.rb:20:308:20:312 | self | UseUseExplosion.rb:20:3467:20:3472 | self | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [false] ( ... ) | -| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | [true] ( ... ) | +| UseUseExplosion.rb:20:308:20:317 | ... > ... | UseUseExplosion.rb:20:307:20:318 | ( ... ) | | UseUseExplosion.rb:20:316:20:317 | 86 | UseUseExplosion.rb:20:308:20:317 | ... > ... | | UseUseExplosion.rb:20:320:20:3460 | then ... | UseUseExplosion.rb:20:304:20:3476 | if ... | | UseUseExplosion.rb:20:325:20:3460 | if ... | UseUseExplosion.rb:20:320:20:3460 | then ... | @@ -358,8 +343,7 @@ | UseUseExplosion.rb:20:329:20:333 | [post] self | UseUseExplosion.rb:20:3451:20:3456 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:350:20:354 | self | | UseUseExplosion.rb:20:329:20:333 | self | UseUseExplosion.rb:20:3451:20:3456 | self | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [false] ( ... ) | -| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | [true] ( ... ) | +| UseUseExplosion.rb:20:329:20:338 | ... > ... | UseUseExplosion.rb:20:328:20:339 | ( ... ) | | UseUseExplosion.rb:20:337:20:338 | 85 | UseUseExplosion.rb:20:329:20:338 | ... > ... | | UseUseExplosion.rb:20:341:20:3444 | then ... | UseUseExplosion.rb:20:325:20:3460 | if ... | | UseUseExplosion.rb:20:346:20:3444 | if ... | UseUseExplosion.rb:20:341:20:3444 | then ... | @@ -368,8 +352,7 @@ | UseUseExplosion.rb:20:350:20:354 | [post] self | UseUseExplosion.rb:20:3435:20:3440 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:371:20:375 | self | | UseUseExplosion.rb:20:350:20:354 | self | UseUseExplosion.rb:20:3435:20:3440 | self | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [false] ( ... ) | -| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | [true] ( ... ) | +| UseUseExplosion.rb:20:350:20:359 | ... > ... | UseUseExplosion.rb:20:349:20:360 | ( ... ) | | UseUseExplosion.rb:20:358:20:359 | 84 | UseUseExplosion.rb:20:350:20:359 | ... > ... | | UseUseExplosion.rb:20:362:20:3428 | then ... | UseUseExplosion.rb:20:346:20:3444 | if ... | | UseUseExplosion.rb:20:367:20:3428 | if ... | UseUseExplosion.rb:20:362:20:3428 | then ... | @@ -378,8 +361,7 @@ | UseUseExplosion.rb:20:371:20:375 | [post] self | UseUseExplosion.rb:20:3419:20:3424 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:392:20:396 | self | | UseUseExplosion.rb:20:371:20:375 | self | UseUseExplosion.rb:20:3419:20:3424 | self | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [false] ( ... ) | -| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | [true] ( ... ) | +| UseUseExplosion.rb:20:371:20:380 | ... > ... | UseUseExplosion.rb:20:370:20:381 | ( ... ) | | UseUseExplosion.rb:20:379:20:380 | 83 | UseUseExplosion.rb:20:371:20:380 | ... > ... | | UseUseExplosion.rb:20:383:20:3412 | then ... | UseUseExplosion.rb:20:367:20:3428 | if ... | | UseUseExplosion.rb:20:388:20:3412 | if ... | UseUseExplosion.rb:20:383:20:3412 | then ... | @@ -388,8 +370,7 @@ | UseUseExplosion.rb:20:392:20:396 | [post] self | UseUseExplosion.rb:20:3403:20:3408 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:413:20:417 | self | | UseUseExplosion.rb:20:392:20:396 | self | UseUseExplosion.rb:20:3403:20:3408 | self | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [false] ( ... ) | -| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | [true] ( ... ) | +| UseUseExplosion.rb:20:392:20:401 | ... > ... | UseUseExplosion.rb:20:391:20:402 | ( ... ) | | UseUseExplosion.rb:20:400:20:401 | 82 | UseUseExplosion.rb:20:392:20:401 | ... > ... | | UseUseExplosion.rb:20:404:20:3396 | then ... | UseUseExplosion.rb:20:388:20:3412 | if ... | | UseUseExplosion.rb:20:409:20:3396 | if ... | UseUseExplosion.rb:20:404:20:3396 | then ... | @@ -398,8 +379,7 @@ | UseUseExplosion.rb:20:413:20:417 | [post] self | UseUseExplosion.rb:20:3387:20:3392 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:434:20:438 | self | | UseUseExplosion.rb:20:413:20:417 | self | UseUseExplosion.rb:20:3387:20:3392 | self | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [false] ( ... ) | -| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | [true] ( ... ) | +| UseUseExplosion.rb:20:413:20:422 | ... > ... | UseUseExplosion.rb:20:412:20:423 | ( ... ) | | UseUseExplosion.rb:20:421:20:422 | 81 | UseUseExplosion.rb:20:413:20:422 | ... > ... | | UseUseExplosion.rb:20:425:20:3380 | then ... | UseUseExplosion.rb:20:409:20:3396 | if ... | | UseUseExplosion.rb:20:430:20:3380 | if ... | UseUseExplosion.rb:20:425:20:3380 | then ... | @@ -408,8 +388,7 @@ | UseUseExplosion.rb:20:434:20:438 | [post] self | UseUseExplosion.rb:20:3371:20:3376 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:455:20:459 | self | | UseUseExplosion.rb:20:434:20:438 | self | UseUseExplosion.rb:20:3371:20:3376 | self | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [false] ( ... ) | -| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | [true] ( ... ) | +| UseUseExplosion.rb:20:434:20:443 | ... > ... | UseUseExplosion.rb:20:433:20:444 | ( ... ) | | UseUseExplosion.rb:20:442:20:443 | 80 | UseUseExplosion.rb:20:434:20:443 | ... > ... | | UseUseExplosion.rb:20:446:20:3364 | then ... | UseUseExplosion.rb:20:430:20:3380 | if ... | | UseUseExplosion.rb:20:451:20:3364 | if ... | UseUseExplosion.rb:20:446:20:3364 | then ... | @@ -418,8 +397,7 @@ | UseUseExplosion.rb:20:455:20:459 | [post] self | UseUseExplosion.rb:20:3355:20:3360 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:476:20:480 | self | | UseUseExplosion.rb:20:455:20:459 | self | UseUseExplosion.rb:20:3355:20:3360 | self | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [false] ( ... ) | -| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | [true] ( ... ) | +| UseUseExplosion.rb:20:455:20:464 | ... > ... | UseUseExplosion.rb:20:454:20:465 | ( ... ) | | UseUseExplosion.rb:20:463:20:464 | 79 | UseUseExplosion.rb:20:455:20:464 | ... > ... | | UseUseExplosion.rb:20:467:20:3348 | then ... | UseUseExplosion.rb:20:451:20:3364 | if ... | | UseUseExplosion.rb:20:472:20:3348 | if ... | UseUseExplosion.rb:20:467:20:3348 | then ... | @@ -428,8 +406,7 @@ | UseUseExplosion.rb:20:476:20:480 | [post] self | UseUseExplosion.rb:20:3339:20:3344 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:497:20:501 | self | | UseUseExplosion.rb:20:476:20:480 | self | UseUseExplosion.rb:20:3339:20:3344 | self | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [false] ( ... ) | -| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | [true] ( ... ) | +| UseUseExplosion.rb:20:476:20:485 | ... > ... | UseUseExplosion.rb:20:475:20:486 | ( ... ) | | UseUseExplosion.rb:20:484:20:485 | 78 | UseUseExplosion.rb:20:476:20:485 | ... > ... | | UseUseExplosion.rb:20:488:20:3332 | then ... | UseUseExplosion.rb:20:472:20:3348 | if ... | | UseUseExplosion.rb:20:493:20:3332 | if ... | UseUseExplosion.rb:20:488:20:3332 | then ... | @@ -438,8 +415,7 @@ | UseUseExplosion.rb:20:497:20:501 | [post] self | UseUseExplosion.rb:20:3323:20:3328 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:518:20:522 | self | | UseUseExplosion.rb:20:497:20:501 | self | UseUseExplosion.rb:20:3323:20:3328 | self | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [false] ( ... ) | -| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | [true] ( ... ) | +| UseUseExplosion.rb:20:497:20:506 | ... > ... | UseUseExplosion.rb:20:496:20:507 | ( ... ) | | UseUseExplosion.rb:20:505:20:506 | 77 | UseUseExplosion.rb:20:497:20:506 | ... > ... | | UseUseExplosion.rb:20:509:20:3316 | then ... | UseUseExplosion.rb:20:493:20:3332 | if ... | | UseUseExplosion.rb:20:514:20:3316 | if ... | UseUseExplosion.rb:20:509:20:3316 | then ... | @@ -448,8 +424,7 @@ | UseUseExplosion.rb:20:518:20:522 | [post] self | UseUseExplosion.rb:20:3307:20:3312 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:539:20:543 | self | | UseUseExplosion.rb:20:518:20:522 | self | UseUseExplosion.rb:20:3307:20:3312 | self | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [false] ( ... ) | -| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | [true] ( ... ) | +| UseUseExplosion.rb:20:518:20:527 | ... > ... | UseUseExplosion.rb:20:517:20:528 | ( ... ) | | UseUseExplosion.rb:20:526:20:527 | 76 | UseUseExplosion.rb:20:518:20:527 | ... > ... | | UseUseExplosion.rb:20:530:20:3300 | then ... | UseUseExplosion.rb:20:514:20:3316 | if ... | | UseUseExplosion.rb:20:535:20:3300 | if ... | UseUseExplosion.rb:20:530:20:3300 | then ... | @@ -458,8 +433,7 @@ | UseUseExplosion.rb:20:539:20:543 | [post] self | UseUseExplosion.rb:20:3291:20:3296 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:560:20:564 | self | | UseUseExplosion.rb:20:539:20:543 | self | UseUseExplosion.rb:20:3291:20:3296 | self | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [false] ( ... ) | -| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | [true] ( ... ) | +| UseUseExplosion.rb:20:539:20:548 | ... > ... | UseUseExplosion.rb:20:538:20:549 | ( ... ) | | UseUseExplosion.rb:20:547:20:548 | 75 | UseUseExplosion.rb:20:539:20:548 | ... > ... | | UseUseExplosion.rb:20:551:20:3284 | then ... | UseUseExplosion.rb:20:535:20:3300 | if ... | | UseUseExplosion.rb:20:556:20:3284 | if ... | UseUseExplosion.rb:20:551:20:3284 | then ... | @@ -468,8 +442,7 @@ | UseUseExplosion.rb:20:560:20:564 | [post] self | UseUseExplosion.rb:20:3275:20:3280 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:581:20:585 | self | | UseUseExplosion.rb:20:560:20:564 | self | UseUseExplosion.rb:20:3275:20:3280 | self | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [false] ( ... ) | -| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | [true] ( ... ) | +| UseUseExplosion.rb:20:560:20:569 | ... > ... | UseUseExplosion.rb:20:559:20:570 | ( ... ) | | UseUseExplosion.rb:20:568:20:569 | 74 | UseUseExplosion.rb:20:560:20:569 | ... > ... | | UseUseExplosion.rb:20:572:20:3268 | then ... | UseUseExplosion.rb:20:556:20:3284 | if ... | | UseUseExplosion.rb:20:577:20:3268 | if ... | UseUseExplosion.rb:20:572:20:3268 | then ... | @@ -478,8 +451,7 @@ | UseUseExplosion.rb:20:581:20:585 | [post] self | UseUseExplosion.rb:20:3259:20:3264 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:602:20:606 | self | | UseUseExplosion.rb:20:581:20:585 | self | UseUseExplosion.rb:20:3259:20:3264 | self | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [false] ( ... ) | -| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | [true] ( ... ) | +| UseUseExplosion.rb:20:581:20:590 | ... > ... | UseUseExplosion.rb:20:580:20:591 | ( ... ) | | UseUseExplosion.rb:20:589:20:590 | 73 | UseUseExplosion.rb:20:581:20:590 | ... > ... | | UseUseExplosion.rb:20:593:20:3252 | then ... | UseUseExplosion.rb:20:577:20:3268 | if ... | | UseUseExplosion.rb:20:598:20:3252 | if ... | UseUseExplosion.rb:20:593:20:3252 | then ... | @@ -488,8 +460,7 @@ | UseUseExplosion.rb:20:602:20:606 | [post] self | UseUseExplosion.rb:20:3243:20:3248 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:623:20:627 | self | | UseUseExplosion.rb:20:602:20:606 | self | UseUseExplosion.rb:20:3243:20:3248 | self | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [false] ( ... ) | -| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | [true] ( ... ) | +| UseUseExplosion.rb:20:602:20:611 | ... > ... | UseUseExplosion.rb:20:601:20:612 | ( ... ) | | UseUseExplosion.rb:20:610:20:611 | 72 | UseUseExplosion.rb:20:602:20:611 | ... > ... | | UseUseExplosion.rb:20:614:20:3236 | then ... | UseUseExplosion.rb:20:598:20:3252 | if ... | | UseUseExplosion.rb:20:619:20:3236 | if ... | UseUseExplosion.rb:20:614:20:3236 | then ... | @@ -498,8 +469,7 @@ | UseUseExplosion.rb:20:623:20:627 | [post] self | UseUseExplosion.rb:20:3227:20:3232 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:644:20:648 | self | | UseUseExplosion.rb:20:623:20:627 | self | UseUseExplosion.rb:20:3227:20:3232 | self | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [false] ( ... ) | -| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | [true] ( ... ) | +| UseUseExplosion.rb:20:623:20:632 | ... > ... | UseUseExplosion.rb:20:622:20:633 | ( ... ) | | UseUseExplosion.rb:20:631:20:632 | 71 | UseUseExplosion.rb:20:623:20:632 | ... > ... | | UseUseExplosion.rb:20:635:20:3220 | then ... | UseUseExplosion.rb:20:619:20:3236 | if ... | | UseUseExplosion.rb:20:640:20:3220 | if ... | UseUseExplosion.rb:20:635:20:3220 | then ... | @@ -508,8 +478,7 @@ | UseUseExplosion.rb:20:644:20:648 | [post] self | UseUseExplosion.rb:20:3211:20:3216 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:665:20:669 | self | | UseUseExplosion.rb:20:644:20:648 | self | UseUseExplosion.rb:20:3211:20:3216 | self | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [false] ( ... ) | -| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | [true] ( ... ) | +| UseUseExplosion.rb:20:644:20:653 | ... > ... | UseUseExplosion.rb:20:643:20:654 | ( ... ) | | UseUseExplosion.rb:20:652:20:653 | 70 | UseUseExplosion.rb:20:644:20:653 | ... > ... | | UseUseExplosion.rb:20:656:20:3204 | then ... | UseUseExplosion.rb:20:640:20:3220 | if ... | | UseUseExplosion.rb:20:661:20:3204 | if ... | UseUseExplosion.rb:20:656:20:3204 | then ... | @@ -518,8 +487,7 @@ | UseUseExplosion.rb:20:665:20:669 | [post] self | UseUseExplosion.rb:20:3195:20:3200 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:686:20:690 | self | | UseUseExplosion.rb:20:665:20:669 | self | UseUseExplosion.rb:20:3195:20:3200 | self | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [false] ( ... ) | -| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | [true] ( ... ) | +| UseUseExplosion.rb:20:665:20:674 | ... > ... | UseUseExplosion.rb:20:664:20:675 | ( ... ) | | UseUseExplosion.rb:20:673:20:674 | 69 | UseUseExplosion.rb:20:665:20:674 | ... > ... | | UseUseExplosion.rb:20:677:20:3188 | then ... | UseUseExplosion.rb:20:661:20:3204 | if ... | | UseUseExplosion.rb:20:682:20:3188 | if ... | UseUseExplosion.rb:20:677:20:3188 | then ... | @@ -528,8 +496,7 @@ | UseUseExplosion.rb:20:686:20:690 | [post] self | UseUseExplosion.rb:20:3179:20:3184 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:707:20:711 | self | | UseUseExplosion.rb:20:686:20:690 | self | UseUseExplosion.rb:20:3179:20:3184 | self | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [false] ( ... ) | -| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | [true] ( ... ) | +| UseUseExplosion.rb:20:686:20:695 | ... > ... | UseUseExplosion.rb:20:685:20:696 | ( ... ) | | UseUseExplosion.rb:20:694:20:695 | 68 | UseUseExplosion.rb:20:686:20:695 | ... > ... | | UseUseExplosion.rb:20:698:20:3172 | then ... | UseUseExplosion.rb:20:682:20:3188 | if ... | | UseUseExplosion.rb:20:703:20:3172 | if ... | UseUseExplosion.rb:20:698:20:3172 | then ... | @@ -538,8 +505,7 @@ | UseUseExplosion.rb:20:707:20:711 | [post] self | UseUseExplosion.rb:20:3163:20:3168 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:728:20:732 | self | | UseUseExplosion.rb:20:707:20:711 | self | UseUseExplosion.rb:20:3163:20:3168 | self | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [false] ( ... ) | -| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | [true] ( ... ) | +| UseUseExplosion.rb:20:707:20:716 | ... > ... | UseUseExplosion.rb:20:706:20:717 | ( ... ) | | UseUseExplosion.rb:20:715:20:716 | 67 | UseUseExplosion.rb:20:707:20:716 | ... > ... | | UseUseExplosion.rb:20:719:20:3156 | then ... | UseUseExplosion.rb:20:703:20:3172 | if ... | | UseUseExplosion.rb:20:724:20:3156 | if ... | UseUseExplosion.rb:20:719:20:3156 | then ... | @@ -548,8 +514,7 @@ | UseUseExplosion.rb:20:728:20:732 | [post] self | UseUseExplosion.rb:20:3147:20:3152 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:749:20:753 | self | | UseUseExplosion.rb:20:728:20:732 | self | UseUseExplosion.rb:20:3147:20:3152 | self | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [false] ( ... ) | -| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | [true] ( ... ) | +| UseUseExplosion.rb:20:728:20:737 | ... > ... | UseUseExplosion.rb:20:727:20:738 | ( ... ) | | UseUseExplosion.rb:20:736:20:737 | 66 | UseUseExplosion.rb:20:728:20:737 | ... > ... | | UseUseExplosion.rb:20:740:20:3140 | then ... | UseUseExplosion.rb:20:724:20:3156 | if ... | | UseUseExplosion.rb:20:745:20:3140 | if ... | UseUseExplosion.rb:20:740:20:3140 | then ... | @@ -558,8 +523,7 @@ | UseUseExplosion.rb:20:749:20:753 | [post] self | UseUseExplosion.rb:20:3131:20:3136 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:770:20:774 | self | | UseUseExplosion.rb:20:749:20:753 | self | UseUseExplosion.rb:20:3131:20:3136 | self | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [false] ( ... ) | -| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | [true] ( ... ) | +| UseUseExplosion.rb:20:749:20:758 | ... > ... | UseUseExplosion.rb:20:748:20:759 | ( ... ) | | UseUseExplosion.rb:20:757:20:758 | 65 | UseUseExplosion.rb:20:749:20:758 | ... > ... | | UseUseExplosion.rb:20:761:20:3124 | then ... | UseUseExplosion.rb:20:745:20:3140 | if ... | | UseUseExplosion.rb:20:766:20:3124 | if ... | UseUseExplosion.rb:20:761:20:3124 | then ... | @@ -568,8 +532,7 @@ | UseUseExplosion.rb:20:770:20:774 | [post] self | UseUseExplosion.rb:20:3115:20:3120 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:791:20:795 | self | | UseUseExplosion.rb:20:770:20:774 | self | UseUseExplosion.rb:20:3115:20:3120 | self | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [false] ( ... ) | -| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | [true] ( ... ) | +| UseUseExplosion.rb:20:770:20:779 | ... > ... | UseUseExplosion.rb:20:769:20:780 | ( ... ) | | UseUseExplosion.rb:20:778:20:779 | 64 | UseUseExplosion.rb:20:770:20:779 | ... > ... | | UseUseExplosion.rb:20:782:20:3108 | then ... | UseUseExplosion.rb:20:766:20:3124 | if ... | | UseUseExplosion.rb:20:787:20:3108 | if ... | UseUseExplosion.rb:20:782:20:3108 | then ... | @@ -578,8 +541,7 @@ | UseUseExplosion.rb:20:791:20:795 | [post] self | UseUseExplosion.rb:20:3099:20:3104 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:812:20:816 | self | | UseUseExplosion.rb:20:791:20:795 | self | UseUseExplosion.rb:20:3099:20:3104 | self | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [false] ( ... ) | -| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | [true] ( ... ) | +| UseUseExplosion.rb:20:791:20:800 | ... > ... | UseUseExplosion.rb:20:790:20:801 | ( ... ) | | UseUseExplosion.rb:20:799:20:800 | 63 | UseUseExplosion.rb:20:791:20:800 | ... > ... | | UseUseExplosion.rb:20:803:20:3092 | then ... | UseUseExplosion.rb:20:787:20:3108 | if ... | | UseUseExplosion.rb:20:808:20:3092 | if ... | UseUseExplosion.rb:20:803:20:3092 | then ... | @@ -588,8 +550,7 @@ | UseUseExplosion.rb:20:812:20:816 | [post] self | UseUseExplosion.rb:20:3083:20:3088 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:833:20:837 | self | | UseUseExplosion.rb:20:812:20:816 | self | UseUseExplosion.rb:20:3083:20:3088 | self | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [false] ( ... ) | -| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | [true] ( ... ) | +| UseUseExplosion.rb:20:812:20:821 | ... > ... | UseUseExplosion.rb:20:811:20:822 | ( ... ) | | UseUseExplosion.rb:20:820:20:821 | 62 | UseUseExplosion.rb:20:812:20:821 | ... > ... | | UseUseExplosion.rb:20:824:20:3076 | then ... | UseUseExplosion.rb:20:808:20:3092 | if ... | | UseUseExplosion.rb:20:829:20:3076 | if ... | UseUseExplosion.rb:20:824:20:3076 | then ... | @@ -598,8 +559,7 @@ | UseUseExplosion.rb:20:833:20:837 | [post] self | UseUseExplosion.rb:20:3067:20:3072 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:854:20:858 | self | | UseUseExplosion.rb:20:833:20:837 | self | UseUseExplosion.rb:20:3067:20:3072 | self | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [false] ( ... ) | -| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | [true] ( ... ) | +| UseUseExplosion.rb:20:833:20:842 | ... > ... | UseUseExplosion.rb:20:832:20:843 | ( ... ) | | UseUseExplosion.rb:20:841:20:842 | 61 | UseUseExplosion.rb:20:833:20:842 | ... > ... | | UseUseExplosion.rb:20:845:20:3060 | then ... | UseUseExplosion.rb:20:829:20:3076 | if ... | | UseUseExplosion.rb:20:850:20:3060 | if ... | UseUseExplosion.rb:20:845:20:3060 | then ... | @@ -608,8 +568,7 @@ | UseUseExplosion.rb:20:854:20:858 | [post] self | UseUseExplosion.rb:20:3051:20:3056 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:875:20:879 | self | | UseUseExplosion.rb:20:854:20:858 | self | UseUseExplosion.rb:20:3051:20:3056 | self | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [false] ( ... ) | -| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | [true] ( ... ) | +| UseUseExplosion.rb:20:854:20:863 | ... > ... | UseUseExplosion.rb:20:853:20:864 | ( ... ) | | UseUseExplosion.rb:20:862:20:863 | 60 | UseUseExplosion.rb:20:854:20:863 | ... > ... | | UseUseExplosion.rb:20:866:20:3044 | then ... | UseUseExplosion.rb:20:850:20:3060 | if ... | | UseUseExplosion.rb:20:871:20:3044 | if ... | UseUseExplosion.rb:20:866:20:3044 | then ... | @@ -618,8 +577,7 @@ | UseUseExplosion.rb:20:875:20:879 | [post] self | UseUseExplosion.rb:20:3035:20:3040 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:896:20:900 | self | | UseUseExplosion.rb:20:875:20:879 | self | UseUseExplosion.rb:20:3035:20:3040 | self | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [false] ( ... ) | -| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | [true] ( ... ) | +| UseUseExplosion.rb:20:875:20:884 | ... > ... | UseUseExplosion.rb:20:874:20:885 | ( ... ) | | UseUseExplosion.rb:20:883:20:884 | 59 | UseUseExplosion.rb:20:875:20:884 | ... > ... | | UseUseExplosion.rb:20:887:20:3028 | then ... | UseUseExplosion.rb:20:871:20:3044 | if ... | | UseUseExplosion.rb:20:892:20:3028 | if ... | UseUseExplosion.rb:20:887:20:3028 | then ... | @@ -628,8 +586,7 @@ | UseUseExplosion.rb:20:896:20:900 | [post] self | UseUseExplosion.rb:20:3019:20:3024 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:917:20:921 | self | | UseUseExplosion.rb:20:896:20:900 | self | UseUseExplosion.rb:20:3019:20:3024 | self | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [false] ( ... ) | -| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | [true] ( ... ) | +| UseUseExplosion.rb:20:896:20:905 | ... > ... | UseUseExplosion.rb:20:895:20:906 | ( ... ) | | UseUseExplosion.rb:20:904:20:905 | 58 | UseUseExplosion.rb:20:896:20:905 | ... > ... | | UseUseExplosion.rb:20:908:20:3012 | then ... | UseUseExplosion.rb:20:892:20:3028 | if ... | | UseUseExplosion.rb:20:913:20:3012 | if ... | UseUseExplosion.rb:20:908:20:3012 | then ... | @@ -638,8 +595,7 @@ | UseUseExplosion.rb:20:917:20:921 | [post] self | UseUseExplosion.rb:20:3003:20:3008 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:938:20:942 | self | | UseUseExplosion.rb:20:917:20:921 | self | UseUseExplosion.rb:20:3003:20:3008 | self | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [false] ( ... ) | -| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | [true] ( ... ) | +| UseUseExplosion.rb:20:917:20:926 | ... > ... | UseUseExplosion.rb:20:916:20:927 | ( ... ) | | UseUseExplosion.rb:20:925:20:926 | 57 | UseUseExplosion.rb:20:917:20:926 | ... > ... | | UseUseExplosion.rb:20:929:20:2996 | then ... | UseUseExplosion.rb:20:913:20:3012 | if ... | | UseUseExplosion.rb:20:934:20:2996 | if ... | UseUseExplosion.rb:20:929:20:2996 | then ... | @@ -648,8 +604,7 @@ | UseUseExplosion.rb:20:938:20:942 | [post] self | UseUseExplosion.rb:20:2987:20:2992 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:959:20:963 | self | | UseUseExplosion.rb:20:938:20:942 | self | UseUseExplosion.rb:20:2987:20:2992 | self | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [false] ( ... ) | -| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | [true] ( ... ) | +| UseUseExplosion.rb:20:938:20:947 | ... > ... | UseUseExplosion.rb:20:937:20:948 | ( ... ) | | UseUseExplosion.rb:20:946:20:947 | 56 | UseUseExplosion.rb:20:938:20:947 | ... > ... | | UseUseExplosion.rb:20:950:20:2980 | then ... | UseUseExplosion.rb:20:934:20:2996 | if ... | | UseUseExplosion.rb:20:955:20:2980 | if ... | UseUseExplosion.rb:20:950:20:2980 | then ... | @@ -658,8 +613,7 @@ | UseUseExplosion.rb:20:959:20:963 | [post] self | UseUseExplosion.rb:20:2971:20:2976 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:980:20:984 | self | | UseUseExplosion.rb:20:959:20:963 | self | UseUseExplosion.rb:20:2971:20:2976 | self | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [false] ( ... ) | -| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | [true] ( ... ) | +| UseUseExplosion.rb:20:959:20:968 | ... > ... | UseUseExplosion.rb:20:958:20:969 | ( ... ) | | UseUseExplosion.rb:20:967:20:968 | 55 | UseUseExplosion.rb:20:959:20:968 | ... > ... | | UseUseExplosion.rb:20:971:20:2964 | then ... | UseUseExplosion.rb:20:955:20:2980 | if ... | | UseUseExplosion.rb:20:976:20:2964 | if ... | UseUseExplosion.rb:20:971:20:2964 | then ... | @@ -668,8 +622,7 @@ | UseUseExplosion.rb:20:980:20:984 | [post] self | UseUseExplosion.rb:20:2955:20:2960 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:1001:20:1005 | self | | UseUseExplosion.rb:20:980:20:984 | self | UseUseExplosion.rb:20:2955:20:2960 | self | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [false] ( ... ) | -| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | [true] ( ... ) | +| UseUseExplosion.rb:20:980:20:989 | ... > ... | UseUseExplosion.rb:20:979:20:990 | ( ... ) | | UseUseExplosion.rb:20:988:20:989 | 54 | UseUseExplosion.rb:20:980:20:989 | ... > ... | | UseUseExplosion.rb:20:992:20:2948 | then ... | UseUseExplosion.rb:20:976:20:2964 | if ... | | UseUseExplosion.rb:20:997:20:2948 | if ... | UseUseExplosion.rb:20:992:20:2948 | then ... | @@ -678,8 +631,7 @@ | UseUseExplosion.rb:20:1001:20:1005 | [post] self | UseUseExplosion.rb:20:2939:20:2944 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:1022:20:1026 | self | | UseUseExplosion.rb:20:1001:20:1005 | self | UseUseExplosion.rb:20:2939:20:2944 | self | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [false] ( ... ) | -| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | [true] ( ... ) | +| UseUseExplosion.rb:20:1001:20:1010 | ... > ... | UseUseExplosion.rb:20:1000:20:1011 | ( ... ) | | UseUseExplosion.rb:20:1009:20:1010 | 53 | UseUseExplosion.rb:20:1001:20:1010 | ... > ... | | UseUseExplosion.rb:20:1013:20:2932 | then ... | UseUseExplosion.rb:20:997:20:2948 | if ... | | UseUseExplosion.rb:20:1018:20:2932 | if ... | UseUseExplosion.rb:20:1013:20:2932 | then ... | @@ -688,8 +640,7 @@ | UseUseExplosion.rb:20:1022:20:1026 | [post] self | UseUseExplosion.rb:20:2923:20:2928 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:1043:20:1047 | self | | UseUseExplosion.rb:20:1022:20:1026 | self | UseUseExplosion.rb:20:2923:20:2928 | self | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [false] ( ... ) | -| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | [true] ( ... ) | +| UseUseExplosion.rb:20:1022:20:1031 | ... > ... | UseUseExplosion.rb:20:1021:20:1032 | ( ... ) | | UseUseExplosion.rb:20:1030:20:1031 | 52 | UseUseExplosion.rb:20:1022:20:1031 | ... > ... | | UseUseExplosion.rb:20:1034:20:2916 | then ... | UseUseExplosion.rb:20:1018:20:2932 | if ... | | UseUseExplosion.rb:20:1039:20:2916 | if ... | UseUseExplosion.rb:20:1034:20:2916 | then ... | @@ -698,8 +649,7 @@ | UseUseExplosion.rb:20:1043:20:1047 | [post] self | UseUseExplosion.rb:20:2907:20:2912 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:1064:20:1068 | self | | UseUseExplosion.rb:20:1043:20:1047 | self | UseUseExplosion.rb:20:2907:20:2912 | self | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [false] ( ... ) | -| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | [true] ( ... ) | +| UseUseExplosion.rb:20:1043:20:1052 | ... > ... | UseUseExplosion.rb:20:1042:20:1053 | ( ... ) | | UseUseExplosion.rb:20:1051:20:1052 | 51 | UseUseExplosion.rb:20:1043:20:1052 | ... > ... | | UseUseExplosion.rb:20:1055:20:2900 | then ... | UseUseExplosion.rb:20:1039:20:2916 | if ... | | UseUseExplosion.rb:20:1060:20:2900 | if ... | UseUseExplosion.rb:20:1055:20:2900 | then ... | @@ -708,8 +658,7 @@ | UseUseExplosion.rb:20:1064:20:1068 | [post] self | UseUseExplosion.rb:20:2891:20:2896 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:1085:20:1089 | self | | UseUseExplosion.rb:20:1064:20:1068 | self | UseUseExplosion.rb:20:2891:20:2896 | self | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [false] ( ... ) | -| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | [true] ( ... ) | +| UseUseExplosion.rb:20:1064:20:1073 | ... > ... | UseUseExplosion.rb:20:1063:20:1074 | ( ... ) | | UseUseExplosion.rb:20:1072:20:1073 | 50 | UseUseExplosion.rb:20:1064:20:1073 | ... > ... | | UseUseExplosion.rb:20:1076:20:2884 | then ... | UseUseExplosion.rb:20:1060:20:2900 | if ... | | UseUseExplosion.rb:20:1081:20:2884 | if ... | UseUseExplosion.rb:20:1076:20:2884 | then ... | @@ -718,8 +667,7 @@ | UseUseExplosion.rb:20:1085:20:1089 | [post] self | UseUseExplosion.rb:20:2875:20:2880 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:1106:20:1110 | self | | UseUseExplosion.rb:20:1085:20:1089 | self | UseUseExplosion.rb:20:2875:20:2880 | self | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [false] ( ... ) | -| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | [true] ( ... ) | +| UseUseExplosion.rb:20:1085:20:1094 | ... > ... | UseUseExplosion.rb:20:1084:20:1095 | ( ... ) | | UseUseExplosion.rb:20:1093:20:1094 | 49 | UseUseExplosion.rb:20:1085:20:1094 | ... > ... | | UseUseExplosion.rb:20:1097:20:2868 | then ... | UseUseExplosion.rb:20:1081:20:2884 | if ... | | UseUseExplosion.rb:20:1102:20:2868 | if ... | UseUseExplosion.rb:20:1097:20:2868 | then ... | @@ -728,8 +676,7 @@ | UseUseExplosion.rb:20:1106:20:1110 | [post] self | UseUseExplosion.rb:20:2859:20:2864 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:1127:20:1131 | self | | UseUseExplosion.rb:20:1106:20:1110 | self | UseUseExplosion.rb:20:2859:20:2864 | self | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [false] ( ... ) | -| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | [true] ( ... ) | +| UseUseExplosion.rb:20:1106:20:1115 | ... > ... | UseUseExplosion.rb:20:1105:20:1116 | ( ... ) | | UseUseExplosion.rb:20:1114:20:1115 | 48 | UseUseExplosion.rb:20:1106:20:1115 | ... > ... | | UseUseExplosion.rb:20:1118:20:2852 | then ... | UseUseExplosion.rb:20:1102:20:2868 | if ... | | UseUseExplosion.rb:20:1123:20:2852 | if ... | UseUseExplosion.rb:20:1118:20:2852 | then ... | @@ -738,8 +685,7 @@ | UseUseExplosion.rb:20:1127:20:1131 | [post] self | UseUseExplosion.rb:20:2843:20:2848 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:1148:20:1152 | self | | UseUseExplosion.rb:20:1127:20:1131 | self | UseUseExplosion.rb:20:2843:20:2848 | self | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [false] ( ... ) | -| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | [true] ( ... ) | +| UseUseExplosion.rb:20:1127:20:1136 | ... > ... | UseUseExplosion.rb:20:1126:20:1137 | ( ... ) | | UseUseExplosion.rb:20:1135:20:1136 | 47 | UseUseExplosion.rb:20:1127:20:1136 | ... > ... | | UseUseExplosion.rb:20:1139:20:2836 | then ... | UseUseExplosion.rb:20:1123:20:2852 | if ... | | UseUseExplosion.rb:20:1144:20:2836 | if ... | UseUseExplosion.rb:20:1139:20:2836 | then ... | @@ -748,8 +694,7 @@ | UseUseExplosion.rb:20:1148:20:1152 | [post] self | UseUseExplosion.rb:20:2827:20:2832 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:1169:20:1173 | self | | UseUseExplosion.rb:20:1148:20:1152 | self | UseUseExplosion.rb:20:2827:20:2832 | self | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [false] ( ... ) | -| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | [true] ( ... ) | +| UseUseExplosion.rb:20:1148:20:1157 | ... > ... | UseUseExplosion.rb:20:1147:20:1158 | ( ... ) | | UseUseExplosion.rb:20:1156:20:1157 | 46 | UseUseExplosion.rb:20:1148:20:1157 | ... > ... | | UseUseExplosion.rb:20:1160:20:2820 | then ... | UseUseExplosion.rb:20:1144:20:2836 | if ... | | UseUseExplosion.rb:20:1165:20:2820 | if ... | UseUseExplosion.rb:20:1160:20:2820 | then ... | @@ -758,8 +703,7 @@ | UseUseExplosion.rb:20:1169:20:1173 | [post] self | UseUseExplosion.rb:20:2811:20:2816 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:1190:20:1194 | self | | UseUseExplosion.rb:20:1169:20:1173 | self | UseUseExplosion.rb:20:2811:20:2816 | self | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [false] ( ... ) | -| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | [true] ( ... ) | +| UseUseExplosion.rb:20:1169:20:1178 | ... > ... | UseUseExplosion.rb:20:1168:20:1179 | ( ... ) | | UseUseExplosion.rb:20:1177:20:1178 | 45 | UseUseExplosion.rb:20:1169:20:1178 | ... > ... | | UseUseExplosion.rb:20:1181:20:2804 | then ... | UseUseExplosion.rb:20:1165:20:2820 | if ... | | UseUseExplosion.rb:20:1186:20:2804 | if ... | UseUseExplosion.rb:20:1181:20:2804 | then ... | @@ -768,8 +712,7 @@ | UseUseExplosion.rb:20:1190:20:1194 | [post] self | UseUseExplosion.rb:20:2795:20:2800 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:1211:20:1215 | self | | UseUseExplosion.rb:20:1190:20:1194 | self | UseUseExplosion.rb:20:2795:20:2800 | self | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [false] ( ... ) | -| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | [true] ( ... ) | +| UseUseExplosion.rb:20:1190:20:1199 | ... > ... | UseUseExplosion.rb:20:1189:20:1200 | ( ... ) | | UseUseExplosion.rb:20:1198:20:1199 | 44 | UseUseExplosion.rb:20:1190:20:1199 | ... > ... | | UseUseExplosion.rb:20:1202:20:2788 | then ... | UseUseExplosion.rb:20:1186:20:2804 | if ... | | UseUseExplosion.rb:20:1207:20:2788 | if ... | UseUseExplosion.rb:20:1202:20:2788 | then ... | @@ -778,8 +721,7 @@ | UseUseExplosion.rb:20:1211:20:1215 | [post] self | UseUseExplosion.rb:20:2779:20:2784 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:1232:20:1236 | self | | UseUseExplosion.rb:20:1211:20:1215 | self | UseUseExplosion.rb:20:2779:20:2784 | self | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [false] ( ... ) | -| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | [true] ( ... ) | +| UseUseExplosion.rb:20:1211:20:1220 | ... > ... | UseUseExplosion.rb:20:1210:20:1221 | ( ... ) | | UseUseExplosion.rb:20:1219:20:1220 | 43 | UseUseExplosion.rb:20:1211:20:1220 | ... > ... | | UseUseExplosion.rb:20:1223:20:2772 | then ... | UseUseExplosion.rb:20:1207:20:2788 | if ... | | UseUseExplosion.rb:20:1228:20:2772 | if ... | UseUseExplosion.rb:20:1223:20:2772 | then ... | @@ -788,8 +730,7 @@ | UseUseExplosion.rb:20:1232:20:1236 | [post] self | UseUseExplosion.rb:20:2763:20:2768 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:1253:20:1257 | self | | UseUseExplosion.rb:20:1232:20:1236 | self | UseUseExplosion.rb:20:2763:20:2768 | self | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [false] ( ... ) | -| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | [true] ( ... ) | +| UseUseExplosion.rb:20:1232:20:1241 | ... > ... | UseUseExplosion.rb:20:1231:20:1242 | ( ... ) | | UseUseExplosion.rb:20:1240:20:1241 | 42 | UseUseExplosion.rb:20:1232:20:1241 | ... > ... | | UseUseExplosion.rb:20:1244:20:2756 | then ... | UseUseExplosion.rb:20:1228:20:2772 | if ... | | UseUseExplosion.rb:20:1249:20:2756 | if ... | UseUseExplosion.rb:20:1244:20:2756 | then ... | @@ -798,8 +739,7 @@ | UseUseExplosion.rb:20:1253:20:1257 | [post] self | UseUseExplosion.rb:20:2747:20:2752 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:1274:20:1278 | self | | UseUseExplosion.rb:20:1253:20:1257 | self | UseUseExplosion.rb:20:2747:20:2752 | self | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [false] ( ... ) | -| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | [true] ( ... ) | +| UseUseExplosion.rb:20:1253:20:1262 | ... > ... | UseUseExplosion.rb:20:1252:20:1263 | ( ... ) | | UseUseExplosion.rb:20:1261:20:1262 | 41 | UseUseExplosion.rb:20:1253:20:1262 | ... > ... | | UseUseExplosion.rb:20:1265:20:2740 | then ... | UseUseExplosion.rb:20:1249:20:2756 | if ... | | UseUseExplosion.rb:20:1270:20:2740 | if ... | UseUseExplosion.rb:20:1265:20:2740 | then ... | @@ -808,8 +748,7 @@ | UseUseExplosion.rb:20:1274:20:1278 | [post] self | UseUseExplosion.rb:20:2731:20:2736 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:1295:20:1299 | self | | UseUseExplosion.rb:20:1274:20:1278 | self | UseUseExplosion.rb:20:2731:20:2736 | self | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [false] ( ... ) | -| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | [true] ( ... ) | +| UseUseExplosion.rb:20:1274:20:1283 | ... > ... | UseUseExplosion.rb:20:1273:20:1284 | ( ... ) | | UseUseExplosion.rb:20:1282:20:1283 | 40 | UseUseExplosion.rb:20:1274:20:1283 | ... > ... | | UseUseExplosion.rb:20:1286:20:2724 | then ... | UseUseExplosion.rb:20:1270:20:2740 | if ... | | UseUseExplosion.rb:20:1291:20:2724 | if ... | UseUseExplosion.rb:20:1286:20:2724 | then ... | @@ -818,8 +757,7 @@ | UseUseExplosion.rb:20:1295:20:1299 | [post] self | UseUseExplosion.rb:20:2715:20:2720 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:1316:20:1320 | self | | UseUseExplosion.rb:20:1295:20:1299 | self | UseUseExplosion.rb:20:2715:20:2720 | self | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [false] ( ... ) | -| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | [true] ( ... ) | +| UseUseExplosion.rb:20:1295:20:1304 | ... > ... | UseUseExplosion.rb:20:1294:20:1305 | ( ... ) | | UseUseExplosion.rb:20:1303:20:1304 | 39 | UseUseExplosion.rb:20:1295:20:1304 | ... > ... | | UseUseExplosion.rb:20:1307:20:2708 | then ... | UseUseExplosion.rb:20:1291:20:2724 | if ... | | UseUseExplosion.rb:20:1312:20:2708 | if ... | UseUseExplosion.rb:20:1307:20:2708 | then ... | @@ -828,8 +766,7 @@ | UseUseExplosion.rb:20:1316:20:1320 | [post] self | UseUseExplosion.rb:20:2699:20:2704 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:1337:20:1341 | self | | UseUseExplosion.rb:20:1316:20:1320 | self | UseUseExplosion.rb:20:2699:20:2704 | self | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [false] ( ... ) | -| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | [true] ( ... ) | +| UseUseExplosion.rb:20:1316:20:1325 | ... > ... | UseUseExplosion.rb:20:1315:20:1326 | ( ... ) | | UseUseExplosion.rb:20:1324:20:1325 | 38 | UseUseExplosion.rb:20:1316:20:1325 | ... > ... | | UseUseExplosion.rb:20:1328:20:2692 | then ... | UseUseExplosion.rb:20:1312:20:2708 | if ... | | UseUseExplosion.rb:20:1333:20:2692 | if ... | UseUseExplosion.rb:20:1328:20:2692 | then ... | @@ -838,8 +775,7 @@ | UseUseExplosion.rb:20:1337:20:1341 | [post] self | UseUseExplosion.rb:20:2683:20:2688 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:1358:20:1362 | self | | UseUseExplosion.rb:20:1337:20:1341 | self | UseUseExplosion.rb:20:2683:20:2688 | self | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [false] ( ... ) | -| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | [true] ( ... ) | +| UseUseExplosion.rb:20:1337:20:1346 | ... > ... | UseUseExplosion.rb:20:1336:20:1347 | ( ... ) | | UseUseExplosion.rb:20:1345:20:1346 | 37 | UseUseExplosion.rb:20:1337:20:1346 | ... > ... | | UseUseExplosion.rb:20:1349:20:2676 | then ... | UseUseExplosion.rb:20:1333:20:2692 | if ... | | UseUseExplosion.rb:20:1354:20:2676 | if ... | UseUseExplosion.rb:20:1349:20:2676 | then ... | @@ -848,8 +784,7 @@ | UseUseExplosion.rb:20:1358:20:1362 | [post] self | UseUseExplosion.rb:20:2667:20:2672 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:1379:20:1383 | self | | UseUseExplosion.rb:20:1358:20:1362 | self | UseUseExplosion.rb:20:2667:20:2672 | self | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [false] ( ... ) | -| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | [true] ( ... ) | +| UseUseExplosion.rb:20:1358:20:1367 | ... > ... | UseUseExplosion.rb:20:1357:20:1368 | ( ... ) | | UseUseExplosion.rb:20:1366:20:1367 | 36 | UseUseExplosion.rb:20:1358:20:1367 | ... > ... | | UseUseExplosion.rb:20:1370:20:2660 | then ... | UseUseExplosion.rb:20:1354:20:2676 | if ... | | UseUseExplosion.rb:20:1375:20:2660 | if ... | UseUseExplosion.rb:20:1370:20:2660 | then ... | @@ -858,8 +793,7 @@ | UseUseExplosion.rb:20:1379:20:1383 | [post] self | UseUseExplosion.rb:20:2651:20:2656 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:1400:20:1404 | self | | UseUseExplosion.rb:20:1379:20:1383 | self | UseUseExplosion.rb:20:2651:20:2656 | self | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [false] ( ... ) | -| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | [true] ( ... ) | +| UseUseExplosion.rb:20:1379:20:1388 | ... > ... | UseUseExplosion.rb:20:1378:20:1389 | ( ... ) | | UseUseExplosion.rb:20:1387:20:1388 | 35 | UseUseExplosion.rb:20:1379:20:1388 | ... > ... | | UseUseExplosion.rb:20:1391:20:2644 | then ... | UseUseExplosion.rb:20:1375:20:2660 | if ... | | UseUseExplosion.rb:20:1396:20:2644 | if ... | UseUseExplosion.rb:20:1391:20:2644 | then ... | @@ -868,8 +802,7 @@ | UseUseExplosion.rb:20:1400:20:1404 | [post] self | UseUseExplosion.rb:20:2635:20:2640 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:1421:20:1425 | self | | UseUseExplosion.rb:20:1400:20:1404 | self | UseUseExplosion.rb:20:2635:20:2640 | self | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [false] ( ... ) | -| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | [true] ( ... ) | +| UseUseExplosion.rb:20:1400:20:1409 | ... > ... | UseUseExplosion.rb:20:1399:20:1410 | ( ... ) | | UseUseExplosion.rb:20:1408:20:1409 | 34 | UseUseExplosion.rb:20:1400:20:1409 | ... > ... | | UseUseExplosion.rb:20:1412:20:2628 | then ... | UseUseExplosion.rb:20:1396:20:2644 | if ... | | UseUseExplosion.rb:20:1417:20:2628 | if ... | UseUseExplosion.rb:20:1412:20:2628 | then ... | @@ -878,8 +811,7 @@ | UseUseExplosion.rb:20:1421:20:1425 | [post] self | UseUseExplosion.rb:20:2619:20:2624 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:1442:20:1446 | self | | UseUseExplosion.rb:20:1421:20:1425 | self | UseUseExplosion.rb:20:2619:20:2624 | self | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [false] ( ... ) | -| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | [true] ( ... ) | +| UseUseExplosion.rb:20:1421:20:1430 | ... > ... | UseUseExplosion.rb:20:1420:20:1431 | ( ... ) | | UseUseExplosion.rb:20:1429:20:1430 | 33 | UseUseExplosion.rb:20:1421:20:1430 | ... > ... | | UseUseExplosion.rb:20:1433:20:2612 | then ... | UseUseExplosion.rb:20:1417:20:2628 | if ... | | UseUseExplosion.rb:20:1438:20:2612 | if ... | UseUseExplosion.rb:20:1433:20:2612 | then ... | @@ -888,8 +820,7 @@ | UseUseExplosion.rb:20:1442:20:1446 | [post] self | UseUseExplosion.rb:20:2603:20:2608 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:1463:20:1467 | self | | UseUseExplosion.rb:20:1442:20:1446 | self | UseUseExplosion.rb:20:2603:20:2608 | self | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [false] ( ... ) | -| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | [true] ( ... ) | +| UseUseExplosion.rb:20:1442:20:1451 | ... > ... | UseUseExplosion.rb:20:1441:20:1452 | ( ... ) | | UseUseExplosion.rb:20:1450:20:1451 | 32 | UseUseExplosion.rb:20:1442:20:1451 | ... > ... | | UseUseExplosion.rb:20:1454:20:2596 | then ... | UseUseExplosion.rb:20:1438:20:2612 | if ... | | UseUseExplosion.rb:20:1459:20:2596 | if ... | UseUseExplosion.rb:20:1454:20:2596 | then ... | @@ -898,8 +829,7 @@ | UseUseExplosion.rb:20:1463:20:1467 | [post] self | UseUseExplosion.rb:20:2587:20:2592 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:1484:20:1488 | self | | UseUseExplosion.rb:20:1463:20:1467 | self | UseUseExplosion.rb:20:2587:20:2592 | self | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [false] ( ... ) | -| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | [true] ( ... ) | +| UseUseExplosion.rb:20:1463:20:1472 | ... > ... | UseUseExplosion.rb:20:1462:20:1473 | ( ... ) | | UseUseExplosion.rb:20:1471:20:1472 | 31 | UseUseExplosion.rb:20:1463:20:1472 | ... > ... | | UseUseExplosion.rb:20:1475:20:2580 | then ... | UseUseExplosion.rb:20:1459:20:2596 | if ... | | UseUseExplosion.rb:20:1480:20:2580 | if ... | UseUseExplosion.rb:20:1475:20:2580 | then ... | @@ -908,8 +838,7 @@ | UseUseExplosion.rb:20:1484:20:1488 | [post] self | UseUseExplosion.rb:20:2571:20:2576 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:1505:20:1509 | self | | UseUseExplosion.rb:20:1484:20:1488 | self | UseUseExplosion.rb:20:2571:20:2576 | self | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [false] ( ... ) | -| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | [true] ( ... ) | +| UseUseExplosion.rb:20:1484:20:1493 | ... > ... | UseUseExplosion.rb:20:1483:20:1494 | ( ... ) | | UseUseExplosion.rb:20:1492:20:1493 | 30 | UseUseExplosion.rb:20:1484:20:1493 | ... > ... | | UseUseExplosion.rb:20:1496:20:2564 | then ... | UseUseExplosion.rb:20:1480:20:2580 | if ... | | UseUseExplosion.rb:20:1501:20:2564 | if ... | UseUseExplosion.rb:20:1496:20:2564 | then ... | @@ -918,8 +847,7 @@ | UseUseExplosion.rb:20:1505:20:1509 | [post] self | UseUseExplosion.rb:20:2555:20:2560 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:1526:20:1530 | self | | UseUseExplosion.rb:20:1505:20:1509 | self | UseUseExplosion.rb:20:2555:20:2560 | self | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [false] ( ... ) | -| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | [true] ( ... ) | +| UseUseExplosion.rb:20:1505:20:1514 | ... > ... | UseUseExplosion.rb:20:1504:20:1515 | ( ... ) | | UseUseExplosion.rb:20:1513:20:1514 | 29 | UseUseExplosion.rb:20:1505:20:1514 | ... > ... | | UseUseExplosion.rb:20:1517:20:2548 | then ... | UseUseExplosion.rb:20:1501:20:2564 | if ... | | UseUseExplosion.rb:20:1522:20:2548 | if ... | UseUseExplosion.rb:20:1517:20:2548 | then ... | @@ -928,8 +856,7 @@ | UseUseExplosion.rb:20:1526:20:1530 | [post] self | UseUseExplosion.rb:20:2539:20:2544 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:1547:20:1551 | self | | UseUseExplosion.rb:20:1526:20:1530 | self | UseUseExplosion.rb:20:2539:20:2544 | self | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [false] ( ... ) | -| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | [true] ( ... ) | +| UseUseExplosion.rb:20:1526:20:1535 | ... > ... | UseUseExplosion.rb:20:1525:20:1536 | ( ... ) | | UseUseExplosion.rb:20:1534:20:1535 | 28 | UseUseExplosion.rb:20:1526:20:1535 | ... > ... | | UseUseExplosion.rb:20:1538:20:2532 | then ... | UseUseExplosion.rb:20:1522:20:2548 | if ... | | UseUseExplosion.rb:20:1543:20:2532 | if ... | UseUseExplosion.rb:20:1538:20:2532 | then ... | @@ -938,8 +865,7 @@ | UseUseExplosion.rb:20:1547:20:1551 | [post] self | UseUseExplosion.rb:20:2523:20:2528 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:1568:20:1572 | self | | UseUseExplosion.rb:20:1547:20:1551 | self | UseUseExplosion.rb:20:2523:20:2528 | self | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [false] ( ... ) | -| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | [true] ( ... ) | +| UseUseExplosion.rb:20:1547:20:1556 | ... > ... | UseUseExplosion.rb:20:1546:20:1557 | ( ... ) | | UseUseExplosion.rb:20:1555:20:1556 | 27 | UseUseExplosion.rb:20:1547:20:1556 | ... > ... | | UseUseExplosion.rb:20:1559:20:2516 | then ... | UseUseExplosion.rb:20:1543:20:2532 | if ... | | UseUseExplosion.rb:20:1564:20:2516 | if ... | UseUseExplosion.rb:20:1559:20:2516 | then ... | @@ -948,8 +874,7 @@ | UseUseExplosion.rb:20:1568:20:1572 | [post] self | UseUseExplosion.rb:20:2507:20:2512 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:1589:20:1593 | self | | UseUseExplosion.rb:20:1568:20:1572 | self | UseUseExplosion.rb:20:2507:20:2512 | self | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [false] ( ... ) | -| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | [true] ( ... ) | +| UseUseExplosion.rb:20:1568:20:1577 | ... > ... | UseUseExplosion.rb:20:1567:20:1578 | ( ... ) | | UseUseExplosion.rb:20:1576:20:1577 | 26 | UseUseExplosion.rb:20:1568:20:1577 | ... > ... | | UseUseExplosion.rb:20:1580:20:2500 | then ... | UseUseExplosion.rb:20:1564:20:2516 | if ... | | UseUseExplosion.rb:20:1585:20:2500 | if ... | UseUseExplosion.rb:20:1580:20:2500 | then ... | @@ -958,8 +883,7 @@ | UseUseExplosion.rb:20:1589:20:1593 | [post] self | UseUseExplosion.rb:20:2491:20:2496 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:1610:20:1614 | self | | UseUseExplosion.rb:20:1589:20:1593 | self | UseUseExplosion.rb:20:2491:20:2496 | self | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [false] ( ... ) | -| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | [true] ( ... ) | +| UseUseExplosion.rb:20:1589:20:1598 | ... > ... | UseUseExplosion.rb:20:1588:20:1599 | ( ... ) | | UseUseExplosion.rb:20:1597:20:1598 | 25 | UseUseExplosion.rb:20:1589:20:1598 | ... > ... | | UseUseExplosion.rb:20:1601:20:2484 | then ... | UseUseExplosion.rb:20:1585:20:2500 | if ... | | UseUseExplosion.rb:20:1606:20:2484 | if ... | UseUseExplosion.rb:20:1601:20:2484 | then ... | @@ -968,8 +892,7 @@ | UseUseExplosion.rb:20:1610:20:1614 | [post] self | UseUseExplosion.rb:20:2475:20:2480 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:1631:20:1635 | self | | UseUseExplosion.rb:20:1610:20:1614 | self | UseUseExplosion.rb:20:2475:20:2480 | self | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [false] ( ... ) | -| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | [true] ( ... ) | +| UseUseExplosion.rb:20:1610:20:1619 | ... > ... | UseUseExplosion.rb:20:1609:20:1620 | ( ... ) | | UseUseExplosion.rb:20:1618:20:1619 | 24 | UseUseExplosion.rb:20:1610:20:1619 | ... > ... | | UseUseExplosion.rb:20:1622:20:2468 | then ... | UseUseExplosion.rb:20:1606:20:2484 | if ... | | UseUseExplosion.rb:20:1627:20:2468 | if ... | UseUseExplosion.rb:20:1622:20:2468 | then ... | @@ -978,8 +901,7 @@ | UseUseExplosion.rb:20:1631:20:1635 | [post] self | UseUseExplosion.rb:20:2459:20:2464 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:1652:20:1656 | self | | UseUseExplosion.rb:20:1631:20:1635 | self | UseUseExplosion.rb:20:2459:20:2464 | self | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [false] ( ... ) | -| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | [true] ( ... ) | +| UseUseExplosion.rb:20:1631:20:1640 | ... > ... | UseUseExplosion.rb:20:1630:20:1641 | ( ... ) | | UseUseExplosion.rb:20:1639:20:1640 | 23 | UseUseExplosion.rb:20:1631:20:1640 | ... > ... | | UseUseExplosion.rb:20:1643:20:2452 | then ... | UseUseExplosion.rb:20:1627:20:2468 | if ... | | UseUseExplosion.rb:20:1648:20:2452 | if ... | UseUseExplosion.rb:20:1643:20:2452 | then ... | @@ -988,8 +910,7 @@ | UseUseExplosion.rb:20:1652:20:1656 | [post] self | UseUseExplosion.rb:20:2443:20:2448 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:1673:20:1677 | self | | UseUseExplosion.rb:20:1652:20:1656 | self | UseUseExplosion.rb:20:2443:20:2448 | self | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [false] ( ... ) | -| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | [true] ( ... ) | +| UseUseExplosion.rb:20:1652:20:1661 | ... > ... | UseUseExplosion.rb:20:1651:20:1662 | ( ... ) | | UseUseExplosion.rb:20:1660:20:1661 | 22 | UseUseExplosion.rb:20:1652:20:1661 | ... > ... | | UseUseExplosion.rb:20:1664:20:2436 | then ... | UseUseExplosion.rb:20:1648:20:2452 | if ... | | UseUseExplosion.rb:20:1669:20:2436 | if ... | UseUseExplosion.rb:20:1664:20:2436 | then ... | @@ -998,8 +919,7 @@ | UseUseExplosion.rb:20:1673:20:1677 | [post] self | UseUseExplosion.rb:20:2427:20:2432 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:1694:20:1698 | self | | UseUseExplosion.rb:20:1673:20:1677 | self | UseUseExplosion.rb:20:2427:20:2432 | self | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [false] ( ... ) | -| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | [true] ( ... ) | +| UseUseExplosion.rb:20:1673:20:1682 | ... > ... | UseUseExplosion.rb:20:1672:20:1683 | ( ... ) | | UseUseExplosion.rb:20:1681:20:1682 | 21 | UseUseExplosion.rb:20:1673:20:1682 | ... > ... | | UseUseExplosion.rb:20:1685:20:2420 | then ... | UseUseExplosion.rb:20:1669:20:2436 | if ... | | UseUseExplosion.rb:20:1690:20:2420 | if ... | UseUseExplosion.rb:20:1685:20:2420 | then ... | @@ -1008,8 +928,7 @@ | UseUseExplosion.rb:20:1694:20:1698 | [post] self | UseUseExplosion.rb:20:2411:20:2416 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:1715:20:1719 | self | | UseUseExplosion.rb:20:1694:20:1698 | self | UseUseExplosion.rb:20:2411:20:2416 | self | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [false] ( ... ) | -| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | [true] ( ... ) | +| UseUseExplosion.rb:20:1694:20:1703 | ... > ... | UseUseExplosion.rb:20:1693:20:1704 | ( ... ) | | UseUseExplosion.rb:20:1702:20:1703 | 20 | UseUseExplosion.rb:20:1694:20:1703 | ... > ... | | UseUseExplosion.rb:20:1706:20:2404 | then ... | UseUseExplosion.rb:20:1690:20:2420 | if ... | | UseUseExplosion.rb:20:1711:20:2404 | if ... | UseUseExplosion.rb:20:1706:20:2404 | then ... | @@ -1018,8 +937,7 @@ | UseUseExplosion.rb:20:1715:20:1719 | [post] self | UseUseExplosion.rb:20:2395:20:2400 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:1736:20:1740 | self | | UseUseExplosion.rb:20:1715:20:1719 | self | UseUseExplosion.rb:20:2395:20:2400 | self | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [false] ( ... ) | -| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | [true] ( ... ) | +| UseUseExplosion.rb:20:1715:20:1724 | ... > ... | UseUseExplosion.rb:20:1714:20:1725 | ( ... ) | | UseUseExplosion.rb:20:1723:20:1724 | 19 | UseUseExplosion.rb:20:1715:20:1724 | ... > ... | | UseUseExplosion.rb:20:1727:20:2388 | then ... | UseUseExplosion.rb:20:1711:20:2404 | if ... | | UseUseExplosion.rb:20:1732:20:2388 | if ... | UseUseExplosion.rb:20:1727:20:2388 | then ... | @@ -1028,8 +946,7 @@ | UseUseExplosion.rb:20:1736:20:1740 | [post] self | UseUseExplosion.rb:20:2379:20:2384 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:1757:20:1761 | self | | UseUseExplosion.rb:20:1736:20:1740 | self | UseUseExplosion.rb:20:2379:20:2384 | self | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [false] ( ... ) | -| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | [true] ( ... ) | +| UseUseExplosion.rb:20:1736:20:1745 | ... > ... | UseUseExplosion.rb:20:1735:20:1746 | ( ... ) | | UseUseExplosion.rb:20:1744:20:1745 | 18 | UseUseExplosion.rb:20:1736:20:1745 | ... > ... | | UseUseExplosion.rb:20:1748:20:2372 | then ... | UseUseExplosion.rb:20:1732:20:2388 | if ... | | UseUseExplosion.rb:20:1753:20:2372 | if ... | UseUseExplosion.rb:20:1748:20:2372 | then ... | @@ -1038,8 +955,7 @@ | UseUseExplosion.rb:20:1757:20:1761 | [post] self | UseUseExplosion.rb:20:2363:20:2368 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:1778:20:1782 | self | | UseUseExplosion.rb:20:1757:20:1761 | self | UseUseExplosion.rb:20:2363:20:2368 | self | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [false] ( ... ) | -| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | [true] ( ... ) | +| UseUseExplosion.rb:20:1757:20:1766 | ... > ... | UseUseExplosion.rb:20:1756:20:1767 | ( ... ) | | UseUseExplosion.rb:20:1765:20:1766 | 17 | UseUseExplosion.rb:20:1757:20:1766 | ... > ... | | UseUseExplosion.rb:20:1769:20:2356 | then ... | UseUseExplosion.rb:20:1753:20:2372 | if ... | | UseUseExplosion.rb:20:1774:20:2356 | if ... | UseUseExplosion.rb:20:1769:20:2356 | then ... | @@ -1048,8 +964,7 @@ | UseUseExplosion.rb:20:1778:20:1782 | [post] self | UseUseExplosion.rb:20:2347:20:2352 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:1799:20:1803 | self | | UseUseExplosion.rb:20:1778:20:1782 | self | UseUseExplosion.rb:20:2347:20:2352 | self | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [false] ( ... ) | -| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | [true] ( ... ) | +| UseUseExplosion.rb:20:1778:20:1787 | ... > ... | UseUseExplosion.rb:20:1777:20:1788 | ( ... ) | | UseUseExplosion.rb:20:1786:20:1787 | 16 | UseUseExplosion.rb:20:1778:20:1787 | ... > ... | | UseUseExplosion.rb:20:1790:20:2340 | then ... | UseUseExplosion.rb:20:1774:20:2356 | if ... | | UseUseExplosion.rb:20:1795:20:2340 | if ... | UseUseExplosion.rb:20:1790:20:2340 | then ... | @@ -1058,8 +973,7 @@ | UseUseExplosion.rb:20:1799:20:1803 | [post] self | UseUseExplosion.rb:20:2331:20:2336 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:1820:20:1824 | self | | UseUseExplosion.rb:20:1799:20:1803 | self | UseUseExplosion.rb:20:2331:20:2336 | self | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [false] ( ... ) | -| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | [true] ( ... ) | +| UseUseExplosion.rb:20:1799:20:1808 | ... > ... | UseUseExplosion.rb:20:1798:20:1809 | ( ... ) | | UseUseExplosion.rb:20:1807:20:1808 | 15 | UseUseExplosion.rb:20:1799:20:1808 | ... > ... | | UseUseExplosion.rb:20:1811:20:2324 | then ... | UseUseExplosion.rb:20:1795:20:2340 | if ... | | UseUseExplosion.rb:20:1816:20:2324 | if ... | UseUseExplosion.rb:20:1811:20:2324 | then ... | @@ -1068,8 +982,7 @@ | UseUseExplosion.rb:20:1820:20:1824 | [post] self | UseUseExplosion.rb:20:2315:20:2320 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:1841:20:1845 | self | | UseUseExplosion.rb:20:1820:20:1824 | self | UseUseExplosion.rb:20:2315:20:2320 | self | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [false] ( ... ) | -| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | [true] ( ... ) | +| UseUseExplosion.rb:20:1820:20:1829 | ... > ... | UseUseExplosion.rb:20:1819:20:1830 | ( ... ) | | UseUseExplosion.rb:20:1828:20:1829 | 14 | UseUseExplosion.rb:20:1820:20:1829 | ... > ... | | UseUseExplosion.rb:20:1832:20:2308 | then ... | UseUseExplosion.rb:20:1816:20:2324 | if ... | | UseUseExplosion.rb:20:1837:20:2308 | if ... | UseUseExplosion.rb:20:1832:20:2308 | then ... | @@ -1078,8 +991,7 @@ | UseUseExplosion.rb:20:1841:20:1845 | [post] self | UseUseExplosion.rb:20:2299:20:2304 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:1862:20:1866 | self | | UseUseExplosion.rb:20:1841:20:1845 | self | UseUseExplosion.rb:20:2299:20:2304 | self | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [false] ( ... ) | -| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | [true] ( ... ) | +| UseUseExplosion.rb:20:1841:20:1850 | ... > ... | UseUseExplosion.rb:20:1840:20:1851 | ( ... ) | | UseUseExplosion.rb:20:1849:20:1850 | 13 | UseUseExplosion.rb:20:1841:20:1850 | ... > ... | | UseUseExplosion.rb:20:1853:20:2292 | then ... | UseUseExplosion.rb:20:1837:20:2308 | if ... | | UseUseExplosion.rb:20:1858:20:2292 | if ... | UseUseExplosion.rb:20:1853:20:2292 | then ... | @@ -1088,8 +1000,7 @@ | UseUseExplosion.rb:20:1862:20:1866 | [post] self | UseUseExplosion.rb:20:2283:20:2288 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:1883:20:1887 | self | | UseUseExplosion.rb:20:1862:20:1866 | self | UseUseExplosion.rb:20:2283:20:2288 | self | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [false] ( ... ) | -| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | [true] ( ... ) | +| UseUseExplosion.rb:20:1862:20:1871 | ... > ... | UseUseExplosion.rb:20:1861:20:1872 | ( ... ) | | UseUseExplosion.rb:20:1870:20:1871 | 12 | UseUseExplosion.rb:20:1862:20:1871 | ... > ... | | UseUseExplosion.rb:20:1874:20:2276 | then ... | UseUseExplosion.rb:20:1858:20:2292 | if ... | | UseUseExplosion.rb:20:1879:20:2276 | if ... | UseUseExplosion.rb:20:1874:20:2276 | then ... | @@ -1098,8 +1009,7 @@ | UseUseExplosion.rb:20:1883:20:1887 | [post] self | UseUseExplosion.rb:20:2267:20:2272 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:1904:20:1908 | self | | UseUseExplosion.rb:20:1883:20:1887 | self | UseUseExplosion.rb:20:2267:20:2272 | self | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [false] ( ... ) | -| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | [true] ( ... ) | +| UseUseExplosion.rb:20:1883:20:1892 | ... > ... | UseUseExplosion.rb:20:1882:20:1893 | ( ... ) | | UseUseExplosion.rb:20:1891:20:1892 | 11 | UseUseExplosion.rb:20:1883:20:1892 | ... > ... | | UseUseExplosion.rb:20:1895:20:2260 | then ... | UseUseExplosion.rb:20:1879:20:2276 | if ... | | UseUseExplosion.rb:20:1900:20:2260 | if ... | UseUseExplosion.rb:20:1895:20:2260 | then ... | @@ -1108,8 +1018,7 @@ | UseUseExplosion.rb:20:1904:20:1908 | [post] self | UseUseExplosion.rb:20:2251:20:2256 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:1925:20:1929 | self | | UseUseExplosion.rb:20:1904:20:1908 | self | UseUseExplosion.rb:20:2251:20:2256 | self | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [false] ( ... ) | -| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | [true] ( ... ) | +| UseUseExplosion.rb:20:1904:20:1913 | ... > ... | UseUseExplosion.rb:20:1903:20:1914 | ( ... ) | | UseUseExplosion.rb:20:1912:20:1913 | 10 | UseUseExplosion.rb:20:1904:20:1913 | ... > ... | | UseUseExplosion.rb:20:1916:20:2244 | then ... | UseUseExplosion.rb:20:1900:20:2260 | if ... | | UseUseExplosion.rb:20:1921:20:2244 | if ... | UseUseExplosion.rb:20:1916:20:2244 | then ... | @@ -1118,8 +1027,7 @@ | UseUseExplosion.rb:20:1925:20:1929 | [post] self | UseUseExplosion.rb:20:2235:20:2240 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:1945:20:1949 | self | | UseUseExplosion.rb:20:1925:20:1929 | self | UseUseExplosion.rb:20:2235:20:2240 | self | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [false] ( ... ) | -| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | [true] ( ... ) | +| UseUseExplosion.rb:20:1925:20:1933 | ... > ... | UseUseExplosion.rb:20:1924:20:1934 | ( ... ) | | UseUseExplosion.rb:20:1933:20:1933 | 9 | UseUseExplosion.rb:20:1925:20:1933 | ... > ... | | UseUseExplosion.rb:20:1936:20:2228 | then ... | UseUseExplosion.rb:20:1921:20:2244 | if ... | | UseUseExplosion.rb:20:1941:20:2228 | if ... | UseUseExplosion.rb:20:1936:20:2228 | then ... | @@ -1128,8 +1036,7 @@ | UseUseExplosion.rb:20:1945:20:1949 | [post] self | UseUseExplosion.rb:20:2219:20:2224 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:1965:20:1969 | self | | UseUseExplosion.rb:20:1945:20:1949 | self | UseUseExplosion.rb:20:2219:20:2224 | self | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [false] ( ... ) | -| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | [true] ( ... ) | +| UseUseExplosion.rb:20:1945:20:1953 | ... > ... | UseUseExplosion.rb:20:1944:20:1954 | ( ... ) | | UseUseExplosion.rb:20:1953:20:1953 | 8 | UseUseExplosion.rb:20:1945:20:1953 | ... > ... | | UseUseExplosion.rb:20:1956:20:2212 | then ... | UseUseExplosion.rb:20:1941:20:2228 | if ... | | UseUseExplosion.rb:20:1961:20:2212 | if ... | UseUseExplosion.rb:20:1956:20:2212 | then ... | @@ -1138,8 +1045,7 @@ | UseUseExplosion.rb:20:1965:20:1969 | [post] self | UseUseExplosion.rb:20:2203:20:2208 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:1985:20:1989 | self | | UseUseExplosion.rb:20:1965:20:1969 | self | UseUseExplosion.rb:20:2203:20:2208 | self | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [false] ( ... ) | -| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | [true] ( ... ) | +| UseUseExplosion.rb:20:1965:20:1973 | ... > ... | UseUseExplosion.rb:20:1964:20:1974 | ( ... ) | | UseUseExplosion.rb:20:1973:20:1973 | 7 | UseUseExplosion.rb:20:1965:20:1973 | ... > ... | | UseUseExplosion.rb:20:1976:20:2196 | then ... | UseUseExplosion.rb:20:1961:20:2212 | if ... | | UseUseExplosion.rb:20:1981:20:2196 | if ... | UseUseExplosion.rb:20:1976:20:2196 | then ... | @@ -1148,8 +1054,7 @@ | UseUseExplosion.rb:20:1985:20:1989 | [post] self | UseUseExplosion.rb:20:2187:20:2192 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2005:20:2009 | self | | UseUseExplosion.rb:20:1985:20:1989 | self | UseUseExplosion.rb:20:2187:20:2192 | self | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [false] ( ... ) | -| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | [true] ( ... ) | +| UseUseExplosion.rb:20:1985:20:1993 | ... > ... | UseUseExplosion.rb:20:1984:20:1994 | ( ... ) | | UseUseExplosion.rb:20:1993:20:1993 | 6 | UseUseExplosion.rb:20:1985:20:1993 | ... > ... | | UseUseExplosion.rb:20:1996:20:2180 | then ... | UseUseExplosion.rb:20:1981:20:2196 | if ... | | UseUseExplosion.rb:20:2001:20:2180 | if ... | UseUseExplosion.rb:20:1996:20:2180 | then ... | @@ -1158,8 +1063,7 @@ | UseUseExplosion.rb:20:2005:20:2009 | [post] self | UseUseExplosion.rb:20:2171:20:2176 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2025:20:2029 | self | | UseUseExplosion.rb:20:2005:20:2009 | self | UseUseExplosion.rb:20:2171:20:2176 | self | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [false] ( ... ) | -| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | [true] ( ... ) | +| UseUseExplosion.rb:20:2005:20:2013 | ... > ... | UseUseExplosion.rb:20:2004:20:2014 | ( ... ) | | UseUseExplosion.rb:20:2013:20:2013 | 5 | UseUseExplosion.rb:20:2005:20:2013 | ... > ... | | UseUseExplosion.rb:20:2016:20:2164 | then ... | UseUseExplosion.rb:20:2001:20:2180 | if ... | | UseUseExplosion.rb:20:2021:20:2164 | if ... | UseUseExplosion.rb:20:2016:20:2164 | then ... | @@ -1168,8 +1072,7 @@ | UseUseExplosion.rb:20:2025:20:2029 | [post] self | UseUseExplosion.rb:20:2155:20:2160 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2045:20:2049 | self | | UseUseExplosion.rb:20:2025:20:2029 | self | UseUseExplosion.rb:20:2155:20:2160 | self | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [false] ( ... ) | -| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | [true] ( ... ) | +| UseUseExplosion.rb:20:2025:20:2033 | ... > ... | UseUseExplosion.rb:20:2024:20:2034 | ( ... ) | | UseUseExplosion.rb:20:2033:20:2033 | 4 | UseUseExplosion.rb:20:2025:20:2033 | ... > ... | | UseUseExplosion.rb:20:2036:20:2148 | then ... | UseUseExplosion.rb:20:2021:20:2164 | if ... | | UseUseExplosion.rb:20:2041:20:2148 | if ... | UseUseExplosion.rb:20:2036:20:2148 | then ... | @@ -1178,8 +1081,7 @@ | UseUseExplosion.rb:20:2045:20:2049 | [post] self | UseUseExplosion.rb:20:2139:20:2144 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2065:20:2069 | self | | UseUseExplosion.rb:20:2045:20:2049 | self | UseUseExplosion.rb:20:2139:20:2144 | self | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [false] ( ... ) | -| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | [true] ( ... ) | +| UseUseExplosion.rb:20:2045:20:2053 | ... > ... | UseUseExplosion.rb:20:2044:20:2054 | ( ... ) | | UseUseExplosion.rb:20:2053:20:2053 | 3 | UseUseExplosion.rb:20:2045:20:2053 | ... > ... | | UseUseExplosion.rb:20:2056:20:2132 | then ... | UseUseExplosion.rb:20:2041:20:2148 | if ... | | UseUseExplosion.rb:20:2061:20:2132 | if ... | UseUseExplosion.rb:20:2056:20:2132 | then ... | @@ -1188,8 +1090,7 @@ | UseUseExplosion.rb:20:2065:20:2069 | [post] self | UseUseExplosion.rb:20:2123:20:2128 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2085:20:2089 | self | | UseUseExplosion.rb:20:2065:20:2069 | self | UseUseExplosion.rb:20:2123:20:2128 | self | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [false] ( ... ) | -| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | [true] ( ... ) | +| UseUseExplosion.rb:20:2065:20:2073 | ... > ... | UseUseExplosion.rb:20:2064:20:2074 | ( ... ) | | UseUseExplosion.rb:20:2073:20:2073 | 2 | UseUseExplosion.rb:20:2065:20:2073 | ... > ... | | UseUseExplosion.rb:20:2076:20:2116 | then ... | UseUseExplosion.rb:20:2061:20:2132 | if ... | | UseUseExplosion.rb:20:2081:20:2116 | if ... | UseUseExplosion.rb:20:2076:20:2116 | then ... | @@ -1198,8 +1099,7 @@ | UseUseExplosion.rb:20:2085:20:2089 | [post] self | UseUseExplosion.rb:20:2107:20:2112 | self | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | | UseUseExplosion.rb:20:2085:20:2089 | self | UseUseExplosion.rb:20:2107:20:2112 | self | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [false] ( ... ) | -| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | [true] ( ... ) | +| UseUseExplosion.rb:20:2085:20:2093 | ... > ... | UseUseExplosion.rb:20:2084:20:2094 | ( ... ) | | UseUseExplosion.rb:20:2093:20:2093 | 1 | UseUseExplosion.rb:20:2085:20:2093 | ... > ... | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(self) | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:2096:20:2099 | [input] SSA phi read(x) | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | @@ -1709,8 +1609,7 @@ | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:3691:21:3696 | self | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [false] ( ... ) | -| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | [true] ( ... ) | +| UseUseExplosion.rb:21:13:21:23 | ... > ... | UseUseExplosion.rb:21:12:21:24 | ( ... ) | | UseUseExplosion.rb:21:21:21:23 | 100 | UseUseExplosion.rb:21:13:21:23 | ... > ... | | UseUseExplosion.rb:21:26:21:3684 | then ... | UseUseExplosion.rb:21:9:21:3700 | if ... | | UseUseExplosion.rb:21:31:21:3684 | if ... | UseUseExplosion.rb:21:26:21:3684 | then ... | @@ -1719,8 +1618,7 @@ | UseUseExplosion.rb:21:35:21:39 | [post] self | UseUseExplosion.rb:21:3675:21:3680 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:56:21:60 | self | | UseUseExplosion.rb:21:35:21:39 | self | UseUseExplosion.rb:21:3675:21:3680 | self | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [false] ( ... ) | -| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | [true] ( ... ) | +| UseUseExplosion.rb:21:35:21:44 | ... > ... | UseUseExplosion.rb:21:34:21:45 | ( ... ) | | UseUseExplosion.rb:21:43:21:44 | 99 | UseUseExplosion.rb:21:35:21:44 | ... > ... | | UseUseExplosion.rb:21:47:21:3668 | then ... | UseUseExplosion.rb:21:31:21:3684 | if ... | | UseUseExplosion.rb:21:52:21:3668 | if ... | UseUseExplosion.rb:21:47:21:3668 | then ... | @@ -1729,8 +1627,7 @@ | UseUseExplosion.rb:21:56:21:60 | [post] self | UseUseExplosion.rb:21:3659:21:3664 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:77:21:81 | self | | UseUseExplosion.rb:21:56:21:60 | self | UseUseExplosion.rb:21:3659:21:3664 | self | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [false] ( ... ) | -| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | [true] ( ... ) | +| UseUseExplosion.rb:21:56:21:65 | ... > ... | UseUseExplosion.rb:21:55:21:66 | ( ... ) | | UseUseExplosion.rb:21:64:21:65 | 98 | UseUseExplosion.rb:21:56:21:65 | ... > ... | | UseUseExplosion.rb:21:68:21:3652 | then ... | UseUseExplosion.rb:21:52:21:3668 | if ... | | UseUseExplosion.rb:21:73:21:3652 | if ... | UseUseExplosion.rb:21:68:21:3652 | then ... | @@ -1739,8 +1636,7 @@ | UseUseExplosion.rb:21:77:21:81 | [post] self | UseUseExplosion.rb:21:3643:21:3648 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:98:21:102 | self | | UseUseExplosion.rb:21:77:21:81 | self | UseUseExplosion.rb:21:3643:21:3648 | self | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [false] ( ... ) | -| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | [true] ( ... ) | +| UseUseExplosion.rb:21:77:21:86 | ... > ... | UseUseExplosion.rb:21:76:21:87 | ( ... ) | | UseUseExplosion.rb:21:85:21:86 | 97 | UseUseExplosion.rb:21:77:21:86 | ... > ... | | UseUseExplosion.rb:21:89:21:3636 | then ... | UseUseExplosion.rb:21:73:21:3652 | if ... | | UseUseExplosion.rb:21:94:21:3636 | if ... | UseUseExplosion.rb:21:89:21:3636 | then ... | @@ -1749,8 +1645,7 @@ | UseUseExplosion.rb:21:98:21:102 | [post] self | UseUseExplosion.rb:21:3627:21:3632 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:119:21:123 | self | | UseUseExplosion.rb:21:98:21:102 | self | UseUseExplosion.rb:21:3627:21:3632 | self | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [false] ( ... ) | -| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | [true] ( ... ) | +| UseUseExplosion.rb:21:98:21:107 | ... > ... | UseUseExplosion.rb:21:97:21:108 | ( ... ) | | UseUseExplosion.rb:21:106:21:107 | 96 | UseUseExplosion.rb:21:98:21:107 | ... > ... | | UseUseExplosion.rb:21:110:21:3620 | then ... | UseUseExplosion.rb:21:94:21:3636 | if ... | | UseUseExplosion.rb:21:115:21:3620 | if ... | UseUseExplosion.rb:21:110:21:3620 | then ... | @@ -1759,8 +1654,7 @@ | UseUseExplosion.rb:21:119:21:123 | [post] self | UseUseExplosion.rb:21:3611:21:3616 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:140:21:144 | self | | UseUseExplosion.rb:21:119:21:123 | self | UseUseExplosion.rb:21:3611:21:3616 | self | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [false] ( ... ) | -| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | [true] ( ... ) | +| UseUseExplosion.rb:21:119:21:128 | ... > ... | UseUseExplosion.rb:21:118:21:129 | ( ... ) | | UseUseExplosion.rb:21:127:21:128 | 95 | UseUseExplosion.rb:21:119:21:128 | ... > ... | | UseUseExplosion.rb:21:131:21:3604 | then ... | UseUseExplosion.rb:21:115:21:3620 | if ... | | UseUseExplosion.rb:21:136:21:3604 | if ... | UseUseExplosion.rb:21:131:21:3604 | then ... | @@ -1769,8 +1663,7 @@ | UseUseExplosion.rb:21:140:21:144 | [post] self | UseUseExplosion.rb:21:3595:21:3600 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:161:21:165 | self | | UseUseExplosion.rb:21:140:21:144 | self | UseUseExplosion.rb:21:3595:21:3600 | self | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [false] ( ... ) | -| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | [true] ( ... ) | +| UseUseExplosion.rb:21:140:21:149 | ... > ... | UseUseExplosion.rb:21:139:21:150 | ( ... ) | | UseUseExplosion.rb:21:148:21:149 | 94 | UseUseExplosion.rb:21:140:21:149 | ... > ... | | UseUseExplosion.rb:21:152:21:3588 | then ... | UseUseExplosion.rb:21:136:21:3604 | if ... | | UseUseExplosion.rb:21:157:21:3588 | if ... | UseUseExplosion.rb:21:152:21:3588 | then ... | @@ -1779,8 +1672,7 @@ | UseUseExplosion.rb:21:161:21:165 | [post] self | UseUseExplosion.rb:21:3579:21:3584 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:182:21:186 | self | | UseUseExplosion.rb:21:161:21:165 | self | UseUseExplosion.rb:21:3579:21:3584 | self | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [false] ( ... ) | -| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | [true] ( ... ) | +| UseUseExplosion.rb:21:161:21:170 | ... > ... | UseUseExplosion.rb:21:160:21:171 | ( ... ) | | UseUseExplosion.rb:21:169:21:170 | 93 | UseUseExplosion.rb:21:161:21:170 | ... > ... | | UseUseExplosion.rb:21:173:21:3572 | then ... | UseUseExplosion.rb:21:157:21:3588 | if ... | | UseUseExplosion.rb:21:178:21:3572 | if ... | UseUseExplosion.rb:21:173:21:3572 | then ... | @@ -1789,8 +1681,7 @@ | UseUseExplosion.rb:21:182:21:186 | [post] self | UseUseExplosion.rb:21:3563:21:3568 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:203:21:207 | self | | UseUseExplosion.rb:21:182:21:186 | self | UseUseExplosion.rb:21:3563:21:3568 | self | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [false] ( ... ) | -| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | [true] ( ... ) | +| UseUseExplosion.rb:21:182:21:191 | ... > ... | UseUseExplosion.rb:21:181:21:192 | ( ... ) | | UseUseExplosion.rb:21:190:21:191 | 92 | UseUseExplosion.rb:21:182:21:191 | ... > ... | | UseUseExplosion.rb:21:194:21:3556 | then ... | UseUseExplosion.rb:21:178:21:3572 | if ... | | UseUseExplosion.rb:21:199:21:3556 | if ... | UseUseExplosion.rb:21:194:21:3556 | then ... | @@ -1799,8 +1690,7 @@ | UseUseExplosion.rb:21:203:21:207 | [post] self | UseUseExplosion.rb:21:3547:21:3552 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:224:21:228 | self | | UseUseExplosion.rb:21:203:21:207 | self | UseUseExplosion.rb:21:3547:21:3552 | self | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [false] ( ... ) | -| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | [true] ( ... ) | +| UseUseExplosion.rb:21:203:21:212 | ... > ... | UseUseExplosion.rb:21:202:21:213 | ( ... ) | | UseUseExplosion.rb:21:211:21:212 | 91 | UseUseExplosion.rb:21:203:21:212 | ... > ... | | UseUseExplosion.rb:21:215:21:3540 | then ... | UseUseExplosion.rb:21:199:21:3556 | if ... | | UseUseExplosion.rb:21:220:21:3540 | if ... | UseUseExplosion.rb:21:215:21:3540 | then ... | @@ -1809,8 +1699,7 @@ | UseUseExplosion.rb:21:224:21:228 | [post] self | UseUseExplosion.rb:21:3531:21:3536 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:245:21:249 | self | | UseUseExplosion.rb:21:224:21:228 | self | UseUseExplosion.rb:21:3531:21:3536 | self | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [false] ( ... ) | -| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | [true] ( ... ) | +| UseUseExplosion.rb:21:224:21:233 | ... > ... | UseUseExplosion.rb:21:223:21:234 | ( ... ) | | UseUseExplosion.rb:21:232:21:233 | 90 | UseUseExplosion.rb:21:224:21:233 | ... > ... | | UseUseExplosion.rb:21:236:21:3524 | then ... | UseUseExplosion.rb:21:220:21:3540 | if ... | | UseUseExplosion.rb:21:241:21:3524 | if ... | UseUseExplosion.rb:21:236:21:3524 | then ... | @@ -1819,8 +1708,7 @@ | UseUseExplosion.rb:21:245:21:249 | [post] self | UseUseExplosion.rb:21:3515:21:3520 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:266:21:270 | self | | UseUseExplosion.rb:21:245:21:249 | self | UseUseExplosion.rb:21:3515:21:3520 | self | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [false] ( ... ) | -| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | [true] ( ... ) | +| UseUseExplosion.rb:21:245:21:254 | ... > ... | UseUseExplosion.rb:21:244:21:255 | ( ... ) | | UseUseExplosion.rb:21:253:21:254 | 89 | UseUseExplosion.rb:21:245:21:254 | ... > ... | | UseUseExplosion.rb:21:257:21:3508 | then ... | UseUseExplosion.rb:21:241:21:3524 | if ... | | UseUseExplosion.rb:21:262:21:3508 | if ... | UseUseExplosion.rb:21:257:21:3508 | then ... | @@ -1829,8 +1717,7 @@ | UseUseExplosion.rb:21:266:21:270 | [post] self | UseUseExplosion.rb:21:3499:21:3504 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:287:21:291 | self | | UseUseExplosion.rb:21:266:21:270 | self | UseUseExplosion.rb:21:3499:21:3504 | self | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [false] ( ... ) | -| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | [true] ( ... ) | +| UseUseExplosion.rb:21:266:21:275 | ... > ... | UseUseExplosion.rb:21:265:21:276 | ( ... ) | | UseUseExplosion.rb:21:274:21:275 | 88 | UseUseExplosion.rb:21:266:21:275 | ... > ... | | UseUseExplosion.rb:21:278:21:3492 | then ... | UseUseExplosion.rb:21:262:21:3508 | if ... | | UseUseExplosion.rb:21:283:21:3492 | if ... | UseUseExplosion.rb:21:278:21:3492 | then ... | @@ -1839,8 +1726,7 @@ | UseUseExplosion.rb:21:287:21:291 | [post] self | UseUseExplosion.rb:21:3483:21:3488 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:308:21:312 | self | | UseUseExplosion.rb:21:287:21:291 | self | UseUseExplosion.rb:21:3483:21:3488 | self | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [false] ( ... ) | -| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | [true] ( ... ) | +| UseUseExplosion.rb:21:287:21:296 | ... > ... | UseUseExplosion.rb:21:286:21:297 | ( ... ) | | UseUseExplosion.rb:21:295:21:296 | 87 | UseUseExplosion.rb:21:287:21:296 | ... > ... | | UseUseExplosion.rb:21:299:21:3476 | then ... | UseUseExplosion.rb:21:283:21:3492 | if ... | | UseUseExplosion.rb:21:304:21:3476 | if ... | UseUseExplosion.rb:21:299:21:3476 | then ... | @@ -1849,8 +1735,7 @@ | UseUseExplosion.rb:21:308:21:312 | [post] self | UseUseExplosion.rb:21:3467:21:3472 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:329:21:333 | self | | UseUseExplosion.rb:21:308:21:312 | self | UseUseExplosion.rb:21:3467:21:3472 | self | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [false] ( ... ) | -| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | [true] ( ... ) | +| UseUseExplosion.rb:21:308:21:317 | ... > ... | UseUseExplosion.rb:21:307:21:318 | ( ... ) | | UseUseExplosion.rb:21:316:21:317 | 86 | UseUseExplosion.rb:21:308:21:317 | ... > ... | | UseUseExplosion.rb:21:320:21:3460 | then ... | UseUseExplosion.rb:21:304:21:3476 | if ... | | UseUseExplosion.rb:21:325:21:3460 | if ... | UseUseExplosion.rb:21:320:21:3460 | then ... | @@ -1859,8 +1744,7 @@ | UseUseExplosion.rb:21:329:21:333 | [post] self | UseUseExplosion.rb:21:3451:21:3456 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:350:21:354 | self | | UseUseExplosion.rb:21:329:21:333 | self | UseUseExplosion.rb:21:3451:21:3456 | self | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [false] ( ... ) | -| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | [true] ( ... ) | +| UseUseExplosion.rb:21:329:21:338 | ... > ... | UseUseExplosion.rb:21:328:21:339 | ( ... ) | | UseUseExplosion.rb:21:337:21:338 | 85 | UseUseExplosion.rb:21:329:21:338 | ... > ... | | UseUseExplosion.rb:21:341:21:3444 | then ... | UseUseExplosion.rb:21:325:21:3460 | if ... | | UseUseExplosion.rb:21:346:21:3444 | if ... | UseUseExplosion.rb:21:341:21:3444 | then ... | @@ -1869,8 +1753,7 @@ | UseUseExplosion.rb:21:350:21:354 | [post] self | UseUseExplosion.rb:21:3435:21:3440 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:371:21:375 | self | | UseUseExplosion.rb:21:350:21:354 | self | UseUseExplosion.rb:21:3435:21:3440 | self | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [false] ( ... ) | -| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | [true] ( ... ) | +| UseUseExplosion.rb:21:350:21:359 | ... > ... | UseUseExplosion.rb:21:349:21:360 | ( ... ) | | UseUseExplosion.rb:21:358:21:359 | 84 | UseUseExplosion.rb:21:350:21:359 | ... > ... | | UseUseExplosion.rb:21:362:21:3428 | then ... | UseUseExplosion.rb:21:346:21:3444 | if ... | | UseUseExplosion.rb:21:367:21:3428 | if ... | UseUseExplosion.rb:21:362:21:3428 | then ... | @@ -1879,8 +1762,7 @@ | UseUseExplosion.rb:21:371:21:375 | [post] self | UseUseExplosion.rb:21:3419:21:3424 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:392:21:396 | self | | UseUseExplosion.rb:21:371:21:375 | self | UseUseExplosion.rb:21:3419:21:3424 | self | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [false] ( ... ) | -| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | [true] ( ... ) | +| UseUseExplosion.rb:21:371:21:380 | ... > ... | UseUseExplosion.rb:21:370:21:381 | ( ... ) | | UseUseExplosion.rb:21:379:21:380 | 83 | UseUseExplosion.rb:21:371:21:380 | ... > ... | | UseUseExplosion.rb:21:383:21:3412 | then ... | UseUseExplosion.rb:21:367:21:3428 | if ... | | UseUseExplosion.rb:21:388:21:3412 | if ... | UseUseExplosion.rb:21:383:21:3412 | then ... | @@ -1889,8 +1771,7 @@ | UseUseExplosion.rb:21:392:21:396 | [post] self | UseUseExplosion.rb:21:3403:21:3408 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:413:21:417 | self | | UseUseExplosion.rb:21:392:21:396 | self | UseUseExplosion.rb:21:3403:21:3408 | self | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [false] ( ... ) | -| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | [true] ( ... ) | +| UseUseExplosion.rb:21:392:21:401 | ... > ... | UseUseExplosion.rb:21:391:21:402 | ( ... ) | | UseUseExplosion.rb:21:400:21:401 | 82 | UseUseExplosion.rb:21:392:21:401 | ... > ... | | UseUseExplosion.rb:21:404:21:3396 | then ... | UseUseExplosion.rb:21:388:21:3412 | if ... | | UseUseExplosion.rb:21:409:21:3396 | if ... | UseUseExplosion.rb:21:404:21:3396 | then ... | @@ -1899,8 +1780,7 @@ | UseUseExplosion.rb:21:413:21:417 | [post] self | UseUseExplosion.rb:21:3387:21:3392 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:434:21:438 | self | | UseUseExplosion.rb:21:413:21:417 | self | UseUseExplosion.rb:21:3387:21:3392 | self | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [false] ( ... ) | -| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | [true] ( ... ) | +| UseUseExplosion.rb:21:413:21:422 | ... > ... | UseUseExplosion.rb:21:412:21:423 | ( ... ) | | UseUseExplosion.rb:21:421:21:422 | 81 | UseUseExplosion.rb:21:413:21:422 | ... > ... | | UseUseExplosion.rb:21:425:21:3380 | then ... | UseUseExplosion.rb:21:409:21:3396 | if ... | | UseUseExplosion.rb:21:430:21:3380 | if ... | UseUseExplosion.rb:21:425:21:3380 | then ... | @@ -1909,8 +1789,7 @@ | UseUseExplosion.rb:21:434:21:438 | [post] self | UseUseExplosion.rb:21:3371:21:3376 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:455:21:459 | self | | UseUseExplosion.rb:21:434:21:438 | self | UseUseExplosion.rb:21:3371:21:3376 | self | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [false] ( ... ) | -| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | [true] ( ... ) | +| UseUseExplosion.rb:21:434:21:443 | ... > ... | UseUseExplosion.rb:21:433:21:444 | ( ... ) | | UseUseExplosion.rb:21:442:21:443 | 80 | UseUseExplosion.rb:21:434:21:443 | ... > ... | | UseUseExplosion.rb:21:446:21:3364 | then ... | UseUseExplosion.rb:21:430:21:3380 | if ... | | UseUseExplosion.rb:21:451:21:3364 | if ... | UseUseExplosion.rb:21:446:21:3364 | then ... | @@ -1919,8 +1798,7 @@ | UseUseExplosion.rb:21:455:21:459 | [post] self | UseUseExplosion.rb:21:3355:21:3360 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:476:21:480 | self | | UseUseExplosion.rb:21:455:21:459 | self | UseUseExplosion.rb:21:3355:21:3360 | self | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [false] ( ... ) | -| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | [true] ( ... ) | +| UseUseExplosion.rb:21:455:21:464 | ... > ... | UseUseExplosion.rb:21:454:21:465 | ( ... ) | | UseUseExplosion.rb:21:463:21:464 | 79 | UseUseExplosion.rb:21:455:21:464 | ... > ... | | UseUseExplosion.rb:21:467:21:3348 | then ... | UseUseExplosion.rb:21:451:21:3364 | if ... | | UseUseExplosion.rb:21:472:21:3348 | if ... | UseUseExplosion.rb:21:467:21:3348 | then ... | @@ -1929,8 +1807,7 @@ | UseUseExplosion.rb:21:476:21:480 | [post] self | UseUseExplosion.rb:21:3339:21:3344 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:497:21:501 | self | | UseUseExplosion.rb:21:476:21:480 | self | UseUseExplosion.rb:21:3339:21:3344 | self | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [false] ( ... ) | -| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | [true] ( ... ) | +| UseUseExplosion.rb:21:476:21:485 | ... > ... | UseUseExplosion.rb:21:475:21:486 | ( ... ) | | UseUseExplosion.rb:21:484:21:485 | 78 | UseUseExplosion.rb:21:476:21:485 | ... > ... | | UseUseExplosion.rb:21:488:21:3332 | then ... | UseUseExplosion.rb:21:472:21:3348 | if ... | | UseUseExplosion.rb:21:493:21:3332 | if ... | UseUseExplosion.rb:21:488:21:3332 | then ... | @@ -1939,8 +1816,7 @@ | UseUseExplosion.rb:21:497:21:501 | [post] self | UseUseExplosion.rb:21:3323:21:3328 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:518:21:522 | self | | UseUseExplosion.rb:21:497:21:501 | self | UseUseExplosion.rb:21:3323:21:3328 | self | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [false] ( ... ) | -| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | [true] ( ... ) | +| UseUseExplosion.rb:21:497:21:506 | ... > ... | UseUseExplosion.rb:21:496:21:507 | ( ... ) | | UseUseExplosion.rb:21:505:21:506 | 77 | UseUseExplosion.rb:21:497:21:506 | ... > ... | | UseUseExplosion.rb:21:509:21:3316 | then ... | UseUseExplosion.rb:21:493:21:3332 | if ... | | UseUseExplosion.rb:21:514:21:3316 | if ... | UseUseExplosion.rb:21:509:21:3316 | then ... | @@ -1949,8 +1825,7 @@ | UseUseExplosion.rb:21:518:21:522 | [post] self | UseUseExplosion.rb:21:3307:21:3312 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:539:21:543 | self | | UseUseExplosion.rb:21:518:21:522 | self | UseUseExplosion.rb:21:3307:21:3312 | self | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [false] ( ... ) | -| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | [true] ( ... ) | +| UseUseExplosion.rb:21:518:21:527 | ... > ... | UseUseExplosion.rb:21:517:21:528 | ( ... ) | | UseUseExplosion.rb:21:526:21:527 | 76 | UseUseExplosion.rb:21:518:21:527 | ... > ... | | UseUseExplosion.rb:21:530:21:3300 | then ... | UseUseExplosion.rb:21:514:21:3316 | if ... | | UseUseExplosion.rb:21:535:21:3300 | if ... | UseUseExplosion.rb:21:530:21:3300 | then ... | @@ -1959,8 +1834,7 @@ | UseUseExplosion.rb:21:539:21:543 | [post] self | UseUseExplosion.rb:21:3291:21:3296 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:560:21:564 | self | | UseUseExplosion.rb:21:539:21:543 | self | UseUseExplosion.rb:21:3291:21:3296 | self | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [false] ( ... ) | -| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | [true] ( ... ) | +| UseUseExplosion.rb:21:539:21:548 | ... > ... | UseUseExplosion.rb:21:538:21:549 | ( ... ) | | UseUseExplosion.rb:21:547:21:548 | 75 | UseUseExplosion.rb:21:539:21:548 | ... > ... | | UseUseExplosion.rb:21:551:21:3284 | then ... | UseUseExplosion.rb:21:535:21:3300 | if ... | | UseUseExplosion.rb:21:556:21:3284 | if ... | UseUseExplosion.rb:21:551:21:3284 | then ... | @@ -1969,8 +1843,7 @@ | UseUseExplosion.rb:21:560:21:564 | [post] self | UseUseExplosion.rb:21:3275:21:3280 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:581:21:585 | self | | UseUseExplosion.rb:21:560:21:564 | self | UseUseExplosion.rb:21:3275:21:3280 | self | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [false] ( ... ) | -| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | [true] ( ... ) | +| UseUseExplosion.rb:21:560:21:569 | ... > ... | UseUseExplosion.rb:21:559:21:570 | ( ... ) | | UseUseExplosion.rb:21:568:21:569 | 74 | UseUseExplosion.rb:21:560:21:569 | ... > ... | | UseUseExplosion.rb:21:572:21:3268 | then ... | UseUseExplosion.rb:21:556:21:3284 | if ... | | UseUseExplosion.rb:21:577:21:3268 | if ... | UseUseExplosion.rb:21:572:21:3268 | then ... | @@ -1979,8 +1852,7 @@ | UseUseExplosion.rb:21:581:21:585 | [post] self | UseUseExplosion.rb:21:3259:21:3264 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:602:21:606 | self | | UseUseExplosion.rb:21:581:21:585 | self | UseUseExplosion.rb:21:3259:21:3264 | self | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [false] ( ... ) | -| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | [true] ( ... ) | +| UseUseExplosion.rb:21:581:21:590 | ... > ... | UseUseExplosion.rb:21:580:21:591 | ( ... ) | | UseUseExplosion.rb:21:589:21:590 | 73 | UseUseExplosion.rb:21:581:21:590 | ... > ... | | UseUseExplosion.rb:21:593:21:3252 | then ... | UseUseExplosion.rb:21:577:21:3268 | if ... | | UseUseExplosion.rb:21:598:21:3252 | if ... | UseUseExplosion.rb:21:593:21:3252 | then ... | @@ -1989,8 +1861,7 @@ | UseUseExplosion.rb:21:602:21:606 | [post] self | UseUseExplosion.rb:21:3243:21:3248 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:623:21:627 | self | | UseUseExplosion.rb:21:602:21:606 | self | UseUseExplosion.rb:21:3243:21:3248 | self | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [false] ( ... ) | -| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | [true] ( ... ) | +| UseUseExplosion.rb:21:602:21:611 | ... > ... | UseUseExplosion.rb:21:601:21:612 | ( ... ) | | UseUseExplosion.rb:21:610:21:611 | 72 | UseUseExplosion.rb:21:602:21:611 | ... > ... | | UseUseExplosion.rb:21:614:21:3236 | then ... | UseUseExplosion.rb:21:598:21:3252 | if ... | | UseUseExplosion.rb:21:619:21:3236 | if ... | UseUseExplosion.rb:21:614:21:3236 | then ... | @@ -1999,8 +1870,7 @@ | UseUseExplosion.rb:21:623:21:627 | [post] self | UseUseExplosion.rb:21:3227:21:3232 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:644:21:648 | self | | UseUseExplosion.rb:21:623:21:627 | self | UseUseExplosion.rb:21:3227:21:3232 | self | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [false] ( ... ) | -| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | [true] ( ... ) | +| UseUseExplosion.rb:21:623:21:632 | ... > ... | UseUseExplosion.rb:21:622:21:633 | ( ... ) | | UseUseExplosion.rb:21:631:21:632 | 71 | UseUseExplosion.rb:21:623:21:632 | ... > ... | | UseUseExplosion.rb:21:635:21:3220 | then ... | UseUseExplosion.rb:21:619:21:3236 | if ... | | UseUseExplosion.rb:21:640:21:3220 | if ... | UseUseExplosion.rb:21:635:21:3220 | then ... | @@ -2009,8 +1879,7 @@ | UseUseExplosion.rb:21:644:21:648 | [post] self | UseUseExplosion.rb:21:3211:21:3216 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:665:21:669 | self | | UseUseExplosion.rb:21:644:21:648 | self | UseUseExplosion.rb:21:3211:21:3216 | self | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [false] ( ... ) | -| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | [true] ( ... ) | +| UseUseExplosion.rb:21:644:21:653 | ... > ... | UseUseExplosion.rb:21:643:21:654 | ( ... ) | | UseUseExplosion.rb:21:652:21:653 | 70 | UseUseExplosion.rb:21:644:21:653 | ... > ... | | UseUseExplosion.rb:21:656:21:3204 | then ... | UseUseExplosion.rb:21:640:21:3220 | if ... | | UseUseExplosion.rb:21:661:21:3204 | if ... | UseUseExplosion.rb:21:656:21:3204 | then ... | @@ -2019,8 +1888,7 @@ | UseUseExplosion.rb:21:665:21:669 | [post] self | UseUseExplosion.rb:21:3195:21:3200 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:686:21:690 | self | | UseUseExplosion.rb:21:665:21:669 | self | UseUseExplosion.rb:21:3195:21:3200 | self | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [false] ( ... ) | -| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | [true] ( ... ) | +| UseUseExplosion.rb:21:665:21:674 | ... > ... | UseUseExplosion.rb:21:664:21:675 | ( ... ) | | UseUseExplosion.rb:21:673:21:674 | 69 | UseUseExplosion.rb:21:665:21:674 | ... > ... | | UseUseExplosion.rb:21:677:21:3188 | then ... | UseUseExplosion.rb:21:661:21:3204 | if ... | | UseUseExplosion.rb:21:682:21:3188 | if ... | UseUseExplosion.rb:21:677:21:3188 | then ... | @@ -2029,8 +1897,7 @@ | UseUseExplosion.rb:21:686:21:690 | [post] self | UseUseExplosion.rb:21:3179:21:3184 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:707:21:711 | self | | UseUseExplosion.rb:21:686:21:690 | self | UseUseExplosion.rb:21:3179:21:3184 | self | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [false] ( ... ) | -| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | [true] ( ... ) | +| UseUseExplosion.rb:21:686:21:695 | ... > ... | UseUseExplosion.rb:21:685:21:696 | ( ... ) | | UseUseExplosion.rb:21:694:21:695 | 68 | UseUseExplosion.rb:21:686:21:695 | ... > ... | | UseUseExplosion.rb:21:698:21:3172 | then ... | UseUseExplosion.rb:21:682:21:3188 | if ... | | UseUseExplosion.rb:21:703:21:3172 | if ... | UseUseExplosion.rb:21:698:21:3172 | then ... | @@ -2039,8 +1906,7 @@ | UseUseExplosion.rb:21:707:21:711 | [post] self | UseUseExplosion.rb:21:3163:21:3168 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:728:21:732 | self | | UseUseExplosion.rb:21:707:21:711 | self | UseUseExplosion.rb:21:3163:21:3168 | self | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [false] ( ... ) | -| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | [true] ( ... ) | +| UseUseExplosion.rb:21:707:21:716 | ... > ... | UseUseExplosion.rb:21:706:21:717 | ( ... ) | | UseUseExplosion.rb:21:715:21:716 | 67 | UseUseExplosion.rb:21:707:21:716 | ... > ... | | UseUseExplosion.rb:21:719:21:3156 | then ... | UseUseExplosion.rb:21:703:21:3172 | if ... | | UseUseExplosion.rb:21:724:21:3156 | if ... | UseUseExplosion.rb:21:719:21:3156 | then ... | @@ -2049,8 +1915,7 @@ | UseUseExplosion.rb:21:728:21:732 | [post] self | UseUseExplosion.rb:21:3147:21:3152 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:749:21:753 | self | | UseUseExplosion.rb:21:728:21:732 | self | UseUseExplosion.rb:21:3147:21:3152 | self | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [false] ( ... ) | -| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | [true] ( ... ) | +| UseUseExplosion.rb:21:728:21:737 | ... > ... | UseUseExplosion.rb:21:727:21:738 | ( ... ) | | UseUseExplosion.rb:21:736:21:737 | 66 | UseUseExplosion.rb:21:728:21:737 | ... > ... | | UseUseExplosion.rb:21:740:21:3140 | then ... | UseUseExplosion.rb:21:724:21:3156 | if ... | | UseUseExplosion.rb:21:745:21:3140 | if ... | UseUseExplosion.rb:21:740:21:3140 | then ... | @@ -2059,8 +1924,7 @@ | UseUseExplosion.rb:21:749:21:753 | [post] self | UseUseExplosion.rb:21:3131:21:3136 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:770:21:774 | self | | UseUseExplosion.rb:21:749:21:753 | self | UseUseExplosion.rb:21:3131:21:3136 | self | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [false] ( ... ) | -| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | [true] ( ... ) | +| UseUseExplosion.rb:21:749:21:758 | ... > ... | UseUseExplosion.rb:21:748:21:759 | ( ... ) | | UseUseExplosion.rb:21:757:21:758 | 65 | UseUseExplosion.rb:21:749:21:758 | ... > ... | | UseUseExplosion.rb:21:761:21:3124 | then ... | UseUseExplosion.rb:21:745:21:3140 | if ... | | UseUseExplosion.rb:21:766:21:3124 | if ... | UseUseExplosion.rb:21:761:21:3124 | then ... | @@ -2069,8 +1933,7 @@ | UseUseExplosion.rb:21:770:21:774 | [post] self | UseUseExplosion.rb:21:3115:21:3120 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:791:21:795 | self | | UseUseExplosion.rb:21:770:21:774 | self | UseUseExplosion.rb:21:3115:21:3120 | self | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [false] ( ... ) | -| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | [true] ( ... ) | +| UseUseExplosion.rb:21:770:21:779 | ... > ... | UseUseExplosion.rb:21:769:21:780 | ( ... ) | | UseUseExplosion.rb:21:778:21:779 | 64 | UseUseExplosion.rb:21:770:21:779 | ... > ... | | UseUseExplosion.rb:21:782:21:3108 | then ... | UseUseExplosion.rb:21:766:21:3124 | if ... | | UseUseExplosion.rb:21:787:21:3108 | if ... | UseUseExplosion.rb:21:782:21:3108 | then ... | @@ -2079,8 +1942,7 @@ | UseUseExplosion.rb:21:791:21:795 | [post] self | UseUseExplosion.rb:21:3099:21:3104 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:812:21:816 | self | | UseUseExplosion.rb:21:791:21:795 | self | UseUseExplosion.rb:21:3099:21:3104 | self | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [false] ( ... ) | -| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | [true] ( ... ) | +| UseUseExplosion.rb:21:791:21:800 | ... > ... | UseUseExplosion.rb:21:790:21:801 | ( ... ) | | UseUseExplosion.rb:21:799:21:800 | 63 | UseUseExplosion.rb:21:791:21:800 | ... > ... | | UseUseExplosion.rb:21:803:21:3092 | then ... | UseUseExplosion.rb:21:787:21:3108 | if ... | | UseUseExplosion.rb:21:808:21:3092 | if ... | UseUseExplosion.rb:21:803:21:3092 | then ... | @@ -2089,8 +1951,7 @@ | UseUseExplosion.rb:21:812:21:816 | [post] self | UseUseExplosion.rb:21:3083:21:3088 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:833:21:837 | self | | UseUseExplosion.rb:21:812:21:816 | self | UseUseExplosion.rb:21:3083:21:3088 | self | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [false] ( ... ) | -| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | [true] ( ... ) | +| UseUseExplosion.rb:21:812:21:821 | ... > ... | UseUseExplosion.rb:21:811:21:822 | ( ... ) | | UseUseExplosion.rb:21:820:21:821 | 62 | UseUseExplosion.rb:21:812:21:821 | ... > ... | | UseUseExplosion.rb:21:824:21:3076 | then ... | UseUseExplosion.rb:21:808:21:3092 | if ... | | UseUseExplosion.rb:21:829:21:3076 | if ... | UseUseExplosion.rb:21:824:21:3076 | then ... | @@ -2099,8 +1960,7 @@ | UseUseExplosion.rb:21:833:21:837 | [post] self | UseUseExplosion.rb:21:3067:21:3072 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:854:21:858 | self | | UseUseExplosion.rb:21:833:21:837 | self | UseUseExplosion.rb:21:3067:21:3072 | self | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [false] ( ... ) | -| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | [true] ( ... ) | +| UseUseExplosion.rb:21:833:21:842 | ... > ... | UseUseExplosion.rb:21:832:21:843 | ( ... ) | | UseUseExplosion.rb:21:841:21:842 | 61 | UseUseExplosion.rb:21:833:21:842 | ... > ... | | UseUseExplosion.rb:21:845:21:3060 | then ... | UseUseExplosion.rb:21:829:21:3076 | if ... | | UseUseExplosion.rb:21:850:21:3060 | if ... | UseUseExplosion.rb:21:845:21:3060 | then ... | @@ -2109,8 +1969,7 @@ | UseUseExplosion.rb:21:854:21:858 | [post] self | UseUseExplosion.rb:21:3051:21:3056 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:875:21:879 | self | | UseUseExplosion.rb:21:854:21:858 | self | UseUseExplosion.rb:21:3051:21:3056 | self | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [false] ( ... ) | -| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | [true] ( ... ) | +| UseUseExplosion.rb:21:854:21:863 | ... > ... | UseUseExplosion.rb:21:853:21:864 | ( ... ) | | UseUseExplosion.rb:21:862:21:863 | 60 | UseUseExplosion.rb:21:854:21:863 | ... > ... | | UseUseExplosion.rb:21:866:21:3044 | then ... | UseUseExplosion.rb:21:850:21:3060 | if ... | | UseUseExplosion.rb:21:871:21:3044 | if ... | UseUseExplosion.rb:21:866:21:3044 | then ... | @@ -2119,8 +1978,7 @@ | UseUseExplosion.rb:21:875:21:879 | [post] self | UseUseExplosion.rb:21:3035:21:3040 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:896:21:900 | self | | UseUseExplosion.rb:21:875:21:879 | self | UseUseExplosion.rb:21:3035:21:3040 | self | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [false] ( ... ) | -| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | [true] ( ... ) | +| UseUseExplosion.rb:21:875:21:884 | ... > ... | UseUseExplosion.rb:21:874:21:885 | ( ... ) | | UseUseExplosion.rb:21:883:21:884 | 59 | UseUseExplosion.rb:21:875:21:884 | ... > ... | | UseUseExplosion.rb:21:887:21:3028 | then ... | UseUseExplosion.rb:21:871:21:3044 | if ... | | UseUseExplosion.rb:21:892:21:3028 | if ... | UseUseExplosion.rb:21:887:21:3028 | then ... | @@ -2129,8 +1987,7 @@ | UseUseExplosion.rb:21:896:21:900 | [post] self | UseUseExplosion.rb:21:3019:21:3024 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:917:21:921 | self | | UseUseExplosion.rb:21:896:21:900 | self | UseUseExplosion.rb:21:3019:21:3024 | self | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [false] ( ... ) | -| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | [true] ( ... ) | +| UseUseExplosion.rb:21:896:21:905 | ... > ... | UseUseExplosion.rb:21:895:21:906 | ( ... ) | | UseUseExplosion.rb:21:904:21:905 | 58 | UseUseExplosion.rb:21:896:21:905 | ... > ... | | UseUseExplosion.rb:21:908:21:3012 | then ... | UseUseExplosion.rb:21:892:21:3028 | if ... | | UseUseExplosion.rb:21:913:21:3012 | if ... | UseUseExplosion.rb:21:908:21:3012 | then ... | @@ -2139,8 +1996,7 @@ | UseUseExplosion.rb:21:917:21:921 | [post] self | UseUseExplosion.rb:21:3003:21:3008 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:938:21:942 | self | | UseUseExplosion.rb:21:917:21:921 | self | UseUseExplosion.rb:21:3003:21:3008 | self | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [false] ( ... ) | -| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | [true] ( ... ) | +| UseUseExplosion.rb:21:917:21:926 | ... > ... | UseUseExplosion.rb:21:916:21:927 | ( ... ) | | UseUseExplosion.rb:21:925:21:926 | 57 | UseUseExplosion.rb:21:917:21:926 | ... > ... | | UseUseExplosion.rb:21:929:21:2996 | then ... | UseUseExplosion.rb:21:913:21:3012 | if ... | | UseUseExplosion.rb:21:934:21:2996 | if ... | UseUseExplosion.rb:21:929:21:2996 | then ... | @@ -2149,8 +2005,7 @@ | UseUseExplosion.rb:21:938:21:942 | [post] self | UseUseExplosion.rb:21:2987:21:2992 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:959:21:963 | self | | UseUseExplosion.rb:21:938:21:942 | self | UseUseExplosion.rb:21:2987:21:2992 | self | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [false] ( ... ) | -| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | [true] ( ... ) | +| UseUseExplosion.rb:21:938:21:947 | ... > ... | UseUseExplosion.rb:21:937:21:948 | ( ... ) | | UseUseExplosion.rb:21:946:21:947 | 56 | UseUseExplosion.rb:21:938:21:947 | ... > ... | | UseUseExplosion.rb:21:950:21:2980 | then ... | UseUseExplosion.rb:21:934:21:2996 | if ... | | UseUseExplosion.rb:21:955:21:2980 | if ... | UseUseExplosion.rb:21:950:21:2980 | then ... | @@ -2159,8 +2014,7 @@ | UseUseExplosion.rb:21:959:21:963 | [post] self | UseUseExplosion.rb:21:2971:21:2976 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:980:21:984 | self | | UseUseExplosion.rb:21:959:21:963 | self | UseUseExplosion.rb:21:2971:21:2976 | self | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [false] ( ... ) | -| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | [true] ( ... ) | +| UseUseExplosion.rb:21:959:21:968 | ... > ... | UseUseExplosion.rb:21:958:21:969 | ( ... ) | | UseUseExplosion.rb:21:967:21:968 | 55 | UseUseExplosion.rb:21:959:21:968 | ... > ... | | UseUseExplosion.rb:21:971:21:2964 | then ... | UseUseExplosion.rb:21:955:21:2980 | if ... | | UseUseExplosion.rb:21:976:21:2964 | if ... | UseUseExplosion.rb:21:971:21:2964 | then ... | @@ -2169,8 +2023,7 @@ | UseUseExplosion.rb:21:980:21:984 | [post] self | UseUseExplosion.rb:21:2955:21:2960 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:1001:21:1005 | self | | UseUseExplosion.rb:21:980:21:984 | self | UseUseExplosion.rb:21:2955:21:2960 | self | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [false] ( ... ) | -| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | [true] ( ... ) | +| UseUseExplosion.rb:21:980:21:989 | ... > ... | UseUseExplosion.rb:21:979:21:990 | ( ... ) | | UseUseExplosion.rb:21:988:21:989 | 54 | UseUseExplosion.rb:21:980:21:989 | ... > ... | | UseUseExplosion.rb:21:992:21:2948 | then ... | UseUseExplosion.rb:21:976:21:2964 | if ... | | UseUseExplosion.rb:21:997:21:2948 | if ... | UseUseExplosion.rb:21:992:21:2948 | then ... | @@ -2179,8 +2032,7 @@ | UseUseExplosion.rb:21:1001:21:1005 | [post] self | UseUseExplosion.rb:21:2939:21:2944 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:1022:21:1026 | self | | UseUseExplosion.rb:21:1001:21:1005 | self | UseUseExplosion.rb:21:2939:21:2944 | self | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [false] ( ... ) | -| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | [true] ( ... ) | +| UseUseExplosion.rb:21:1001:21:1010 | ... > ... | UseUseExplosion.rb:21:1000:21:1011 | ( ... ) | | UseUseExplosion.rb:21:1009:21:1010 | 53 | UseUseExplosion.rb:21:1001:21:1010 | ... > ... | | UseUseExplosion.rb:21:1013:21:2932 | then ... | UseUseExplosion.rb:21:997:21:2948 | if ... | | UseUseExplosion.rb:21:1018:21:2932 | if ... | UseUseExplosion.rb:21:1013:21:2932 | then ... | @@ -2189,8 +2041,7 @@ | UseUseExplosion.rb:21:1022:21:1026 | [post] self | UseUseExplosion.rb:21:2923:21:2928 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:1043:21:1047 | self | | UseUseExplosion.rb:21:1022:21:1026 | self | UseUseExplosion.rb:21:2923:21:2928 | self | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [false] ( ... ) | -| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | [true] ( ... ) | +| UseUseExplosion.rb:21:1022:21:1031 | ... > ... | UseUseExplosion.rb:21:1021:21:1032 | ( ... ) | | UseUseExplosion.rb:21:1030:21:1031 | 52 | UseUseExplosion.rb:21:1022:21:1031 | ... > ... | | UseUseExplosion.rb:21:1034:21:2916 | then ... | UseUseExplosion.rb:21:1018:21:2932 | if ... | | UseUseExplosion.rb:21:1039:21:2916 | if ... | UseUseExplosion.rb:21:1034:21:2916 | then ... | @@ -2199,8 +2050,7 @@ | UseUseExplosion.rb:21:1043:21:1047 | [post] self | UseUseExplosion.rb:21:2907:21:2912 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:1064:21:1068 | self | | UseUseExplosion.rb:21:1043:21:1047 | self | UseUseExplosion.rb:21:2907:21:2912 | self | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [false] ( ... ) | -| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | [true] ( ... ) | +| UseUseExplosion.rb:21:1043:21:1052 | ... > ... | UseUseExplosion.rb:21:1042:21:1053 | ( ... ) | | UseUseExplosion.rb:21:1051:21:1052 | 51 | UseUseExplosion.rb:21:1043:21:1052 | ... > ... | | UseUseExplosion.rb:21:1055:21:2900 | then ... | UseUseExplosion.rb:21:1039:21:2916 | if ... | | UseUseExplosion.rb:21:1060:21:2900 | if ... | UseUseExplosion.rb:21:1055:21:2900 | then ... | @@ -2209,8 +2059,7 @@ | UseUseExplosion.rb:21:1064:21:1068 | [post] self | UseUseExplosion.rb:21:2891:21:2896 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:1085:21:1089 | self | | UseUseExplosion.rb:21:1064:21:1068 | self | UseUseExplosion.rb:21:2891:21:2896 | self | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [false] ( ... ) | -| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | [true] ( ... ) | +| UseUseExplosion.rb:21:1064:21:1073 | ... > ... | UseUseExplosion.rb:21:1063:21:1074 | ( ... ) | | UseUseExplosion.rb:21:1072:21:1073 | 50 | UseUseExplosion.rb:21:1064:21:1073 | ... > ... | | UseUseExplosion.rb:21:1076:21:2884 | then ... | UseUseExplosion.rb:21:1060:21:2900 | if ... | | UseUseExplosion.rb:21:1081:21:2884 | if ... | UseUseExplosion.rb:21:1076:21:2884 | then ... | @@ -2219,8 +2068,7 @@ | UseUseExplosion.rb:21:1085:21:1089 | [post] self | UseUseExplosion.rb:21:2875:21:2880 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:1106:21:1110 | self | | UseUseExplosion.rb:21:1085:21:1089 | self | UseUseExplosion.rb:21:2875:21:2880 | self | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [false] ( ... ) | -| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | [true] ( ... ) | +| UseUseExplosion.rb:21:1085:21:1094 | ... > ... | UseUseExplosion.rb:21:1084:21:1095 | ( ... ) | | UseUseExplosion.rb:21:1093:21:1094 | 49 | UseUseExplosion.rb:21:1085:21:1094 | ... > ... | | UseUseExplosion.rb:21:1097:21:2868 | then ... | UseUseExplosion.rb:21:1081:21:2884 | if ... | | UseUseExplosion.rb:21:1102:21:2868 | if ... | UseUseExplosion.rb:21:1097:21:2868 | then ... | @@ -2229,8 +2077,7 @@ | UseUseExplosion.rb:21:1106:21:1110 | [post] self | UseUseExplosion.rb:21:2859:21:2864 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:1127:21:1131 | self | | UseUseExplosion.rb:21:1106:21:1110 | self | UseUseExplosion.rb:21:2859:21:2864 | self | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [false] ( ... ) | -| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | [true] ( ... ) | +| UseUseExplosion.rb:21:1106:21:1115 | ... > ... | UseUseExplosion.rb:21:1105:21:1116 | ( ... ) | | UseUseExplosion.rb:21:1114:21:1115 | 48 | UseUseExplosion.rb:21:1106:21:1115 | ... > ... | | UseUseExplosion.rb:21:1118:21:2852 | then ... | UseUseExplosion.rb:21:1102:21:2868 | if ... | | UseUseExplosion.rb:21:1123:21:2852 | if ... | UseUseExplosion.rb:21:1118:21:2852 | then ... | @@ -2239,8 +2086,7 @@ | UseUseExplosion.rb:21:1127:21:1131 | [post] self | UseUseExplosion.rb:21:2843:21:2848 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:1148:21:1152 | self | | UseUseExplosion.rb:21:1127:21:1131 | self | UseUseExplosion.rb:21:2843:21:2848 | self | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [false] ( ... ) | -| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | [true] ( ... ) | +| UseUseExplosion.rb:21:1127:21:1136 | ... > ... | UseUseExplosion.rb:21:1126:21:1137 | ( ... ) | | UseUseExplosion.rb:21:1135:21:1136 | 47 | UseUseExplosion.rb:21:1127:21:1136 | ... > ... | | UseUseExplosion.rb:21:1139:21:2836 | then ... | UseUseExplosion.rb:21:1123:21:2852 | if ... | | UseUseExplosion.rb:21:1144:21:2836 | if ... | UseUseExplosion.rb:21:1139:21:2836 | then ... | @@ -2249,8 +2095,7 @@ | UseUseExplosion.rb:21:1148:21:1152 | [post] self | UseUseExplosion.rb:21:2827:21:2832 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:1169:21:1173 | self | | UseUseExplosion.rb:21:1148:21:1152 | self | UseUseExplosion.rb:21:2827:21:2832 | self | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [false] ( ... ) | -| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | [true] ( ... ) | +| UseUseExplosion.rb:21:1148:21:1157 | ... > ... | UseUseExplosion.rb:21:1147:21:1158 | ( ... ) | | UseUseExplosion.rb:21:1156:21:1157 | 46 | UseUseExplosion.rb:21:1148:21:1157 | ... > ... | | UseUseExplosion.rb:21:1160:21:2820 | then ... | UseUseExplosion.rb:21:1144:21:2836 | if ... | | UseUseExplosion.rb:21:1165:21:2820 | if ... | UseUseExplosion.rb:21:1160:21:2820 | then ... | @@ -2259,8 +2104,7 @@ | UseUseExplosion.rb:21:1169:21:1173 | [post] self | UseUseExplosion.rb:21:2811:21:2816 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:1190:21:1194 | self | | UseUseExplosion.rb:21:1169:21:1173 | self | UseUseExplosion.rb:21:2811:21:2816 | self | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [false] ( ... ) | -| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | [true] ( ... ) | +| UseUseExplosion.rb:21:1169:21:1178 | ... > ... | UseUseExplosion.rb:21:1168:21:1179 | ( ... ) | | UseUseExplosion.rb:21:1177:21:1178 | 45 | UseUseExplosion.rb:21:1169:21:1178 | ... > ... | | UseUseExplosion.rb:21:1181:21:2804 | then ... | UseUseExplosion.rb:21:1165:21:2820 | if ... | | UseUseExplosion.rb:21:1186:21:2804 | if ... | UseUseExplosion.rb:21:1181:21:2804 | then ... | @@ -2269,8 +2113,7 @@ | UseUseExplosion.rb:21:1190:21:1194 | [post] self | UseUseExplosion.rb:21:2795:21:2800 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:1211:21:1215 | self | | UseUseExplosion.rb:21:1190:21:1194 | self | UseUseExplosion.rb:21:2795:21:2800 | self | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [false] ( ... ) | -| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | [true] ( ... ) | +| UseUseExplosion.rb:21:1190:21:1199 | ... > ... | UseUseExplosion.rb:21:1189:21:1200 | ( ... ) | | UseUseExplosion.rb:21:1198:21:1199 | 44 | UseUseExplosion.rb:21:1190:21:1199 | ... > ... | | UseUseExplosion.rb:21:1202:21:2788 | then ... | UseUseExplosion.rb:21:1186:21:2804 | if ... | | UseUseExplosion.rb:21:1207:21:2788 | if ... | UseUseExplosion.rb:21:1202:21:2788 | then ... | @@ -2279,8 +2122,7 @@ | UseUseExplosion.rb:21:1211:21:1215 | [post] self | UseUseExplosion.rb:21:2779:21:2784 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:1232:21:1236 | self | | UseUseExplosion.rb:21:1211:21:1215 | self | UseUseExplosion.rb:21:2779:21:2784 | self | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [false] ( ... ) | -| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | [true] ( ... ) | +| UseUseExplosion.rb:21:1211:21:1220 | ... > ... | UseUseExplosion.rb:21:1210:21:1221 | ( ... ) | | UseUseExplosion.rb:21:1219:21:1220 | 43 | UseUseExplosion.rb:21:1211:21:1220 | ... > ... | | UseUseExplosion.rb:21:1223:21:2772 | then ... | UseUseExplosion.rb:21:1207:21:2788 | if ... | | UseUseExplosion.rb:21:1228:21:2772 | if ... | UseUseExplosion.rb:21:1223:21:2772 | then ... | @@ -2289,8 +2131,7 @@ | UseUseExplosion.rb:21:1232:21:1236 | [post] self | UseUseExplosion.rb:21:2763:21:2768 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:1253:21:1257 | self | | UseUseExplosion.rb:21:1232:21:1236 | self | UseUseExplosion.rb:21:2763:21:2768 | self | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [false] ( ... ) | -| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | [true] ( ... ) | +| UseUseExplosion.rb:21:1232:21:1241 | ... > ... | UseUseExplosion.rb:21:1231:21:1242 | ( ... ) | | UseUseExplosion.rb:21:1240:21:1241 | 42 | UseUseExplosion.rb:21:1232:21:1241 | ... > ... | | UseUseExplosion.rb:21:1244:21:2756 | then ... | UseUseExplosion.rb:21:1228:21:2772 | if ... | | UseUseExplosion.rb:21:1249:21:2756 | if ... | UseUseExplosion.rb:21:1244:21:2756 | then ... | @@ -2299,8 +2140,7 @@ | UseUseExplosion.rb:21:1253:21:1257 | [post] self | UseUseExplosion.rb:21:2747:21:2752 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:1274:21:1278 | self | | UseUseExplosion.rb:21:1253:21:1257 | self | UseUseExplosion.rb:21:2747:21:2752 | self | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [false] ( ... ) | -| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | [true] ( ... ) | +| UseUseExplosion.rb:21:1253:21:1262 | ... > ... | UseUseExplosion.rb:21:1252:21:1263 | ( ... ) | | UseUseExplosion.rb:21:1261:21:1262 | 41 | UseUseExplosion.rb:21:1253:21:1262 | ... > ... | | UseUseExplosion.rb:21:1265:21:2740 | then ... | UseUseExplosion.rb:21:1249:21:2756 | if ... | | UseUseExplosion.rb:21:1270:21:2740 | if ... | UseUseExplosion.rb:21:1265:21:2740 | then ... | @@ -2309,8 +2149,7 @@ | UseUseExplosion.rb:21:1274:21:1278 | [post] self | UseUseExplosion.rb:21:2731:21:2736 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:1295:21:1299 | self | | UseUseExplosion.rb:21:1274:21:1278 | self | UseUseExplosion.rb:21:2731:21:2736 | self | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [false] ( ... ) | -| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | [true] ( ... ) | +| UseUseExplosion.rb:21:1274:21:1283 | ... > ... | UseUseExplosion.rb:21:1273:21:1284 | ( ... ) | | UseUseExplosion.rb:21:1282:21:1283 | 40 | UseUseExplosion.rb:21:1274:21:1283 | ... > ... | | UseUseExplosion.rb:21:1286:21:2724 | then ... | UseUseExplosion.rb:21:1270:21:2740 | if ... | | UseUseExplosion.rb:21:1291:21:2724 | if ... | UseUseExplosion.rb:21:1286:21:2724 | then ... | @@ -2319,8 +2158,7 @@ | UseUseExplosion.rb:21:1295:21:1299 | [post] self | UseUseExplosion.rb:21:2715:21:2720 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:1316:21:1320 | self | | UseUseExplosion.rb:21:1295:21:1299 | self | UseUseExplosion.rb:21:2715:21:2720 | self | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [false] ( ... ) | -| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | [true] ( ... ) | +| UseUseExplosion.rb:21:1295:21:1304 | ... > ... | UseUseExplosion.rb:21:1294:21:1305 | ( ... ) | | UseUseExplosion.rb:21:1303:21:1304 | 39 | UseUseExplosion.rb:21:1295:21:1304 | ... > ... | | UseUseExplosion.rb:21:1307:21:2708 | then ... | UseUseExplosion.rb:21:1291:21:2724 | if ... | | UseUseExplosion.rb:21:1312:21:2708 | if ... | UseUseExplosion.rb:21:1307:21:2708 | then ... | @@ -2329,8 +2167,7 @@ | UseUseExplosion.rb:21:1316:21:1320 | [post] self | UseUseExplosion.rb:21:2699:21:2704 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:1337:21:1341 | self | | UseUseExplosion.rb:21:1316:21:1320 | self | UseUseExplosion.rb:21:2699:21:2704 | self | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [false] ( ... ) | -| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | [true] ( ... ) | +| UseUseExplosion.rb:21:1316:21:1325 | ... > ... | UseUseExplosion.rb:21:1315:21:1326 | ( ... ) | | UseUseExplosion.rb:21:1324:21:1325 | 38 | UseUseExplosion.rb:21:1316:21:1325 | ... > ... | | UseUseExplosion.rb:21:1328:21:2692 | then ... | UseUseExplosion.rb:21:1312:21:2708 | if ... | | UseUseExplosion.rb:21:1333:21:2692 | if ... | UseUseExplosion.rb:21:1328:21:2692 | then ... | @@ -2339,8 +2176,7 @@ | UseUseExplosion.rb:21:1337:21:1341 | [post] self | UseUseExplosion.rb:21:2683:21:2688 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:1358:21:1362 | self | | UseUseExplosion.rb:21:1337:21:1341 | self | UseUseExplosion.rb:21:2683:21:2688 | self | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [false] ( ... ) | -| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | [true] ( ... ) | +| UseUseExplosion.rb:21:1337:21:1346 | ... > ... | UseUseExplosion.rb:21:1336:21:1347 | ( ... ) | | UseUseExplosion.rb:21:1345:21:1346 | 37 | UseUseExplosion.rb:21:1337:21:1346 | ... > ... | | UseUseExplosion.rb:21:1349:21:2676 | then ... | UseUseExplosion.rb:21:1333:21:2692 | if ... | | UseUseExplosion.rb:21:1354:21:2676 | if ... | UseUseExplosion.rb:21:1349:21:2676 | then ... | @@ -2349,8 +2185,7 @@ | UseUseExplosion.rb:21:1358:21:1362 | [post] self | UseUseExplosion.rb:21:2667:21:2672 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:1379:21:1383 | self | | UseUseExplosion.rb:21:1358:21:1362 | self | UseUseExplosion.rb:21:2667:21:2672 | self | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [false] ( ... ) | -| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | [true] ( ... ) | +| UseUseExplosion.rb:21:1358:21:1367 | ... > ... | UseUseExplosion.rb:21:1357:21:1368 | ( ... ) | | UseUseExplosion.rb:21:1366:21:1367 | 36 | UseUseExplosion.rb:21:1358:21:1367 | ... > ... | | UseUseExplosion.rb:21:1370:21:2660 | then ... | UseUseExplosion.rb:21:1354:21:2676 | if ... | | UseUseExplosion.rb:21:1375:21:2660 | if ... | UseUseExplosion.rb:21:1370:21:2660 | then ... | @@ -2359,8 +2194,7 @@ | UseUseExplosion.rb:21:1379:21:1383 | [post] self | UseUseExplosion.rb:21:2651:21:2656 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:1400:21:1404 | self | | UseUseExplosion.rb:21:1379:21:1383 | self | UseUseExplosion.rb:21:2651:21:2656 | self | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [false] ( ... ) | -| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | [true] ( ... ) | +| UseUseExplosion.rb:21:1379:21:1388 | ... > ... | UseUseExplosion.rb:21:1378:21:1389 | ( ... ) | | UseUseExplosion.rb:21:1387:21:1388 | 35 | UseUseExplosion.rb:21:1379:21:1388 | ... > ... | | UseUseExplosion.rb:21:1391:21:2644 | then ... | UseUseExplosion.rb:21:1375:21:2660 | if ... | | UseUseExplosion.rb:21:1396:21:2644 | if ... | UseUseExplosion.rb:21:1391:21:2644 | then ... | @@ -2369,8 +2203,7 @@ | UseUseExplosion.rb:21:1400:21:1404 | [post] self | UseUseExplosion.rb:21:2635:21:2640 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:1421:21:1425 | self | | UseUseExplosion.rb:21:1400:21:1404 | self | UseUseExplosion.rb:21:2635:21:2640 | self | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [false] ( ... ) | -| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | [true] ( ... ) | +| UseUseExplosion.rb:21:1400:21:1409 | ... > ... | UseUseExplosion.rb:21:1399:21:1410 | ( ... ) | | UseUseExplosion.rb:21:1408:21:1409 | 34 | UseUseExplosion.rb:21:1400:21:1409 | ... > ... | | UseUseExplosion.rb:21:1412:21:2628 | then ... | UseUseExplosion.rb:21:1396:21:2644 | if ... | | UseUseExplosion.rb:21:1417:21:2628 | if ... | UseUseExplosion.rb:21:1412:21:2628 | then ... | @@ -2379,8 +2212,7 @@ | UseUseExplosion.rb:21:1421:21:1425 | [post] self | UseUseExplosion.rb:21:2619:21:2624 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:1442:21:1446 | self | | UseUseExplosion.rb:21:1421:21:1425 | self | UseUseExplosion.rb:21:2619:21:2624 | self | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [false] ( ... ) | -| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | [true] ( ... ) | +| UseUseExplosion.rb:21:1421:21:1430 | ... > ... | UseUseExplosion.rb:21:1420:21:1431 | ( ... ) | | UseUseExplosion.rb:21:1429:21:1430 | 33 | UseUseExplosion.rb:21:1421:21:1430 | ... > ... | | UseUseExplosion.rb:21:1433:21:2612 | then ... | UseUseExplosion.rb:21:1417:21:2628 | if ... | | UseUseExplosion.rb:21:1438:21:2612 | if ... | UseUseExplosion.rb:21:1433:21:2612 | then ... | @@ -2389,8 +2221,7 @@ | UseUseExplosion.rb:21:1442:21:1446 | [post] self | UseUseExplosion.rb:21:2603:21:2608 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:1463:21:1467 | self | | UseUseExplosion.rb:21:1442:21:1446 | self | UseUseExplosion.rb:21:2603:21:2608 | self | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [false] ( ... ) | -| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | [true] ( ... ) | +| UseUseExplosion.rb:21:1442:21:1451 | ... > ... | UseUseExplosion.rb:21:1441:21:1452 | ( ... ) | | UseUseExplosion.rb:21:1450:21:1451 | 32 | UseUseExplosion.rb:21:1442:21:1451 | ... > ... | | UseUseExplosion.rb:21:1454:21:2596 | then ... | UseUseExplosion.rb:21:1438:21:2612 | if ... | | UseUseExplosion.rb:21:1459:21:2596 | if ... | UseUseExplosion.rb:21:1454:21:2596 | then ... | @@ -2399,8 +2230,7 @@ | UseUseExplosion.rb:21:1463:21:1467 | [post] self | UseUseExplosion.rb:21:2587:21:2592 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:1484:21:1488 | self | | UseUseExplosion.rb:21:1463:21:1467 | self | UseUseExplosion.rb:21:2587:21:2592 | self | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [false] ( ... ) | -| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | [true] ( ... ) | +| UseUseExplosion.rb:21:1463:21:1472 | ... > ... | UseUseExplosion.rb:21:1462:21:1473 | ( ... ) | | UseUseExplosion.rb:21:1471:21:1472 | 31 | UseUseExplosion.rb:21:1463:21:1472 | ... > ... | | UseUseExplosion.rb:21:1475:21:2580 | then ... | UseUseExplosion.rb:21:1459:21:2596 | if ... | | UseUseExplosion.rb:21:1480:21:2580 | if ... | UseUseExplosion.rb:21:1475:21:2580 | then ... | @@ -2409,8 +2239,7 @@ | UseUseExplosion.rb:21:1484:21:1488 | [post] self | UseUseExplosion.rb:21:2571:21:2576 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:1505:21:1509 | self | | UseUseExplosion.rb:21:1484:21:1488 | self | UseUseExplosion.rb:21:2571:21:2576 | self | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [false] ( ... ) | -| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | [true] ( ... ) | +| UseUseExplosion.rb:21:1484:21:1493 | ... > ... | UseUseExplosion.rb:21:1483:21:1494 | ( ... ) | | UseUseExplosion.rb:21:1492:21:1493 | 30 | UseUseExplosion.rb:21:1484:21:1493 | ... > ... | | UseUseExplosion.rb:21:1496:21:2564 | then ... | UseUseExplosion.rb:21:1480:21:2580 | if ... | | UseUseExplosion.rb:21:1501:21:2564 | if ... | UseUseExplosion.rb:21:1496:21:2564 | then ... | @@ -2419,8 +2248,7 @@ | UseUseExplosion.rb:21:1505:21:1509 | [post] self | UseUseExplosion.rb:21:2555:21:2560 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:1526:21:1530 | self | | UseUseExplosion.rb:21:1505:21:1509 | self | UseUseExplosion.rb:21:2555:21:2560 | self | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [false] ( ... ) | -| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | [true] ( ... ) | +| UseUseExplosion.rb:21:1505:21:1514 | ... > ... | UseUseExplosion.rb:21:1504:21:1515 | ( ... ) | | UseUseExplosion.rb:21:1513:21:1514 | 29 | UseUseExplosion.rb:21:1505:21:1514 | ... > ... | | UseUseExplosion.rb:21:1517:21:2548 | then ... | UseUseExplosion.rb:21:1501:21:2564 | if ... | | UseUseExplosion.rb:21:1522:21:2548 | if ... | UseUseExplosion.rb:21:1517:21:2548 | then ... | @@ -2429,8 +2257,7 @@ | UseUseExplosion.rb:21:1526:21:1530 | [post] self | UseUseExplosion.rb:21:2539:21:2544 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:1547:21:1551 | self | | UseUseExplosion.rb:21:1526:21:1530 | self | UseUseExplosion.rb:21:2539:21:2544 | self | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [false] ( ... ) | -| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | [true] ( ... ) | +| UseUseExplosion.rb:21:1526:21:1535 | ... > ... | UseUseExplosion.rb:21:1525:21:1536 | ( ... ) | | UseUseExplosion.rb:21:1534:21:1535 | 28 | UseUseExplosion.rb:21:1526:21:1535 | ... > ... | | UseUseExplosion.rb:21:1538:21:2532 | then ... | UseUseExplosion.rb:21:1522:21:2548 | if ... | | UseUseExplosion.rb:21:1543:21:2532 | if ... | UseUseExplosion.rb:21:1538:21:2532 | then ... | @@ -2439,8 +2266,7 @@ | UseUseExplosion.rb:21:1547:21:1551 | [post] self | UseUseExplosion.rb:21:2523:21:2528 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:1568:21:1572 | self | | UseUseExplosion.rb:21:1547:21:1551 | self | UseUseExplosion.rb:21:2523:21:2528 | self | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [false] ( ... ) | -| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | [true] ( ... ) | +| UseUseExplosion.rb:21:1547:21:1556 | ... > ... | UseUseExplosion.rb:21:1546:21:1557 | ( ... ) | | UseUseExplosion.rb:21:1555:21:1556 | 27 | UseUseExplosion.rb:21:1547:21:1556 | ... > ... | | UseUseExplosion.rb:21:1559:21:2516 | then ... | UseUseExplosion.rb:21:1543:21:2532 | if ... | | UseUseExplosion.rb:21:1564:21:2516 | if ... | UseUseExplosion.rb:21:1559:21:2516 | then ... | @@ -2449,8 +2275,7 @@ | UseUseExplosion.rb:21:1568:21:1572 | [post] self | UseUseExplosion.rb:21:2507:21:2512 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:1589:21:1593 | self | | UseUseExplosion.rb:21:1568:21:1572 | self | UseUseExplosion.rb:21:2507:21:2512 | self | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [false] ( ... ) | -| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | [true] ( ... ) | +| UseUseExplosion.rb:21:1568:21:1577 | ... > ... | UseUseExplosion.rb:21:1567:21:1578 | ( ... ) | | UseUseExplosion.rb:21:1576:21:1577 | 26 | UseUseExplosion.rb:21:1568:21:1577 | ... > ... | | UseUseExplosion.rb:21:1580:21:2500 | then ... | UseUseExplosion.rb:21:1564:21:2516 | if ... | | UseUseExplosion.rb:21:1585:21:2500 | if ... | UseUseExplosion.rb:21:1580:21:2500 | then ... | @@ -2459,8 +2284,7 @@ | UseUseExplosion.rb:21:1589:21:1593 | [post] self | UseUseExplosion.rb:21:2491:21:2496 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:1610:21:1614 | self | | UseUseExplosion.rb:21:1589:21:1593 | self | UseUseExplosion.rb:21:2491:21:2496 | self | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [false] ( ... ) | -| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | [true] ( ... ) | +| UseUseExplosion.rb:21:1589:21:1598 | ... > ... | UseUseExplosion.rb:21:1588:21:1599 | ( ... ) | | UseUseExplosion.rb:21:1597:21:1598 | 25 | UseUseExplosion.rb:21:1589:21:1598 | ... > ... | | UseUseExplosion.rb:21:1601:21:2484 | then ... | UseUseExplosion.rb:21:1585:21:2500 | if ... | | UseUseExplosion.rb:21:1606:21:2484 | if ... | UseUseExplosion.rb:21:1601:21:2484 | then ... | @@ -2469,8 +2293,7 @@ | UseUseExplosion.rb:21:1610:21:1614 | [post] self | UseUseExplosion.rb:21:2475:21:2480 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:1631:21:1635 | self | | UseUseExplosion.rb:21:1610:21:1614 | self | UseUseExplosion.rb:21:2475:21:2480 | self | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [false] ( ... ) | -| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | [true] ( ... ) | +| UseUseExplosion.rb:21:1610:21:1619 | ... > ... | UseUseExplosion.rb:21:1609:21:1620 | ( ... ) | | UseUseExplosion.rb:21:1618:21:1619 | 24 | UseUseExplosion.rb:21:1610:21:1619 | ... > ... | | UseUseExplosion.rb:21:1622:21:2468 | then ... | UseUseExplosion.rb:21:1606:21:2484 | if ... | | UseUseExplosion.rb:21:1627:21:2468 | if ... | UseUseExplosion.rb:21:1622:21:2468 | then ... | @@ -2479,8 +2302,7 @@ | UseUseExplosion.rb:21:1631:21:1635 | [post] self | UseUseExplosion.rb:21:2459:21:2464 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:1652:21:1656 | self | | UseUseExplosion.rb:21:1631:21:1635 | self | UseUseExplosion.rb:21:2459:21:2464 | self | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [false] ( ... ) | -| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | [true] ( ... ) | +| UseUseExplosion.rb:21:1631:21:1640 | ... > ... | UseUseExplosion.rb:21:1630:21:1641 | ( ... ) | | UseUseExplosion.rb:21:1639:21:1640 | 23 | UseUseExplosion.rb:21:1631:21:1640 | ... > ... | | UseUseExplosion.rb:21:1643:21:2452 | then ... | UseUseExplosion.rb:21:1627:21:2468 | if ... | | UseUseExplosion.rb:21:1648:21:2452 | if ... | UseUseExplosion.rb:21:1643:21:2452 | then ... | @@ -2489,8 +2311,7 @@ | UseUseExplosion.rb:21:1652:21:1656 | [post] self | UseUseExplosion.rb:21:2443:21:2448 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:1673:21:1677 | self | | UseUseExplosion.rb:21:1652:21:1656 | self | UseUseExplosion.rb:21:2443:21:2448 | self | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [false] ( ... ) | -| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | [true] ( ... ) | +| UseUseExplosion.rb:21:1652:21:1661 | ... > ... | UseUseExplosion.rb:21:1651:21:1662 | ( ... ) | | UseUseExplosion.rb:21:1660:21:1661 | 22 | UseUseExplosion.rb:21:1652:21:1661 | ... > ... | | UseUseExplosion.rb:21:1664:21:2436 | then ... | UseUseExplosion.rb:21:1648:21:2452 | if ... | | UseUseExplosion.rb:21:1669:21:2436 | if ... | UseUseExplosion.rb:21:1664:21:2436 | then ... | @@ -2499,8 +2320,7 @@ | UseUseExplosion.rb:21:1673:21:1677 | [post] self | UseUseExplosion.rb:21:2427:21:2432 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:1694:21:1698 | self | | UseUseExplosion.rb:21:1673:21:1677 | self | UseUseExplosion.rb:21:2427:21:2432 | self | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [false] ( ... ) | -| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | [true] ( ... ) | +| UseUseExplosion.rb:21:1673:21:1682 | ... > ... | UseUseExplosion.rb:21:1672:21:1683 | ( ... ) | | UseUseExplosion.rb:21:1681:21:1682 | 21 | UseUseExplosion.rb:21:1673:21:1682 | ... > ... | | UseUseExplosion.rb:21:1685:21:2420 | then ... | UseUseExplosion.rb:21:1669:21:2436 | if ... | | UseUseExplosion.rb:21:1690:21:2420 | if ... | UseUseExplosion.rb:21:1685:21:2420 | then ... | @@ -2509,8 +2329,7 @@ | UseUseExplosion.rb:21:1694:21:1698 | [post] self | UseUseExplosion.rb:21:2411:21:2416 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:1715:21:1719 | self | | UseUseExplosion.rb:21:1694:21:1698 | self | UseUseExplosion.rb:21:2411:21:2416 | self | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [false] ( ... ) | -| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | [true] ( ... ) | +| UseUseExplosion.rb:21:1694:21:1703 | ... > ... | UseUseExplosion.rb:21:1693:21:1704 | ( ... ) | | UseUseExplosion.rb:21:1702:21:1703 | 20 | UseUseExplosion.rb:21:1694:21:1703 | ... > ... | | UseUseExplosion.rb:21:1706:21:2404 | then ... | UseUseExplosion.rb:21:1690:21:2420 | if ... | | UseUseExplosion.rb:21:1711:21:2404 | if ... | UseUseExplosion.rb:21:1706:21:2404 | then ... | @@ -2519,8 +2338,7 @@ | UseUseExplosion.rb:21:1715:21:1719 | [post] self | UseUseExplosion.rb:21:2395:21:2400 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:1736:21:1740 | self | | UseUseExplosion.rb:21:1715:21:1719 | self | UseUseExplosion.rb:21:2395:21:2400 | self | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [false] ( ... ) | -| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | [true] ( ... ) | +| UseUseExplosion.rb:21:1715:21:1724 | ... > ... | UseUseExplosion.rb:21:1714:21:1725 | ( ... ) | | UseUseExplosion.rb:21:1723:21:1724 | 19 | UseUseExplosion.rb:21:1715:21:1724 | ... > ... | | UseUseExplosion.rb:21:1727:21:2388 | then ... | UseUseExplosion.rb:21:1711:21:2404 | if ... | | UseUseExplosion.rb:21:1732:21:2388 | if ... | UseUseExplosion.rb:21:1727:21:2388 | then ... | @@ -2529,8 +2347,7 @@ | UseUseExplosion.rb:21:1736:21:1740 | [post] self | UseUseExplosion.rb:21:2379:21:2384 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:1757:21:1761 | self | | UseUseExplosion.rb:21:1736:21:1740 | self | UseUseExplosion.rb:21:2379:21:2384 | self | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [false] ( ... ) | -| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | [true] ( ... ) | +| UseUseExplosion.rb:21:1736:21:1745 | ... > ... | UseUseExplosion.rb:21:1735:21:1746 | ( ... ) | | UseUseExplosion.rb:21:1744:21:1745 | 18 | UseUseExplosion.rb:21:1736:21:1745 | ... > ... | | UseUseExplosion.rb:21:1748:21:2372 | then ... | UseUseExplosion.rb:21:1732:21:2388 | if ... | | UseUseExplosion.rb:21:1753:21:2372 | if ... | UseUseExplosion.rb:21:1748:21:2372 | then ... | @@ -2539,8 +2356,7 @@ | UseUseExplosion.rb:21:1757:21:1761 | [post] self | UseUseExplosion.rb:21:2363:21:2368 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:1778:21:1782 | self | | UseUseExplosion.rb:21:1757:21:1761 | self | UseUseExplosion.rb:21:2363:21:2368 | self | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [false] ( ... ) | -| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | [true] ( ... ) | +| UseUseExplosion.rb:21:1757:21:1766 | ... > ... | UseUseExplosion.rb:21:1756:21:1767 | ( ... ) | | UseUseExplosion.rb:21:1765:21:1766 | 17 | UseUseExplosion.rb:21:1757:21:1766 | ... > ... | | UseUseExplosion.rb:21:1769:21:2356 | then ... | UseUseExplosion.rb:21:1753:21:2372 | if ... | | UseUseExplosion.rb:21:1774:21:2356 | if ... | UseUseExplosion.rb:21:1769:21:2356 | then ... | @@ -2549,8 +2365,7 @@ | UseUseExplosion.rb:21:1778:21:1782 | [post] self | UseUseExplosion.rb:21:2347:21:2352 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:1799:21:1803 | self | | UseUseExplosion.rb:21:1778:21:1782 | self | UseUseExplosion.rb:21:2347:21:2352 | self | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [false] ( ... ) | -| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | [true] ( ... ) | +| UseUseExplosion.rb:21:1778:21:1787 | ... > ... | UseUseExplosion.rb:21:1777:21:1788 | ( ... ) | | UseUseExplosion.rb:21:1786:21:1787 | 16 | UseUseExplosion.rb:21:1778:21:1787 | ... > ... | | UseUseExplosion.rb:21:1790:21:2340 | then ... | UseUseExplosion.rb:21:1774:21:2356 | if ... | | UseUseExplosion.rb:21:1795:21:2340 | if ... | UseUseExplosion.rb:21:1790:21:2340 | then ... | @@ -2559,8 +2374,7 @@ | UseUseExplosion.rb:21:1799:21:1803 | [post] self | UseUseExplosion.rb:21:2331:21:2336 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:1820:21:1824 | self | | UseUseExplosion.rb:21:1799:21:1803 | self | UseUseExplosion.rb:21:2331:21:2336 | self | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [false] ( ... ) | -| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | [true] ( ... ) | +| UseUseExplosion.rb:21:1799:21:1808 | ... > ... | UseUseExplosion.rb:21:1798:21:1809 | ( ... ) | | UseUseExplosion.rb:21:1807:21:1808 | 15 | UseUseExplosion.rb:21:1799:21:1808 | ... > ... | | UseUseExplosion.rb:21:1811:21:2324 | then ... | UseUseExplosion.rb:21:1795:21:2340 | if ... | | UseUseExplosion.rb:21:1816:21:2324 | if ... | UseUseExplosion.rb:21:1811:21:2324 | then ... | @@ -2569,8 +2383,7 @@ | UseUseExplosion.rb:21:1820:21:1824 | [post] self | UseUseExplosion.rb:21:2315:21:2320 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:1841:21:1845 | self | | UseUseExplosion.rb:21:1820:21:1824 | self | UseUseExplosion.rb:21:2315:21:2320 | self | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [false] ( ... ) | -| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | [true] ( ... ) | +| UseUseExplosion.rb:21:1820:21:1829 | ... > ... | UseUseExplosion.rb:21:1819:21:1830 | ( ... ) | | UseUseExplosion.rb:21:1828:21:1829 | 14 | UseUseExplosion.rb:21:1820:21:1829 | ... > ... | | UseUseExplosion.rb:21:1832:21:2308 | then ... | UseUseExplosion.rb:21:1816:21:2324 | if ... | | UseUseExplosion.rb:21:1837:21:2308 | if ... | UseUseExplosion.rb:21:1832:21:2308 | then ... | @@ -2579,8 +2392,7 @@ | UseUseExplosion.rb:21:1841:21:1845 | [post] self | UseUseExplosion.rb:21:2299:21:2304 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:1862:21:1866 | self | | UseUseExplosion.rb:21:1841:21:1845 | self | UseUseExplosion.rb:21:2299:21:2304 | self | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [false] ( ... ) | -| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | [true] ( ... ) | +| UseUseExplosion.rb:21:1841:21:1850 | ... > ... | UseUseExplosion.rb:21:1840:21:1851 | ( ... ) | | UseUseExplosion.rb:21:1849:21:1850 | 13 | UseUseExplosion.rb:21:1841:21:1850 | ... > ... | | UseUseExplosion.rb:21:1853:21:2292 | then ... | UseUseExplosion.rb:21:1837:21:2308 | if ... | | UseUseExplosion.rb:21:1858:21:2292 | if ... | UseUseExplosion.rb:21:1853:21:2292 | then ... | @@ -2589,8 +2401,7 @@ | UseUseExplosion.rb:21:1862:21:1866 | [post] self | UseUseExplosion.rb:21:2283:21:2288 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:1883:21:1887 | self | | UseUseExplosion.rb:21:1862:21:1866 | self | UseUseExplosion.rb:21:2283:21:2288 | self | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [false] ( ... ) | -| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | [true] ( ... ) | +| UseUseExplosion.rb:21:1862:21:1871 | ... > ... | UseUseExplosion.rb:21:1861:21:1872 | ( ... ) | | UseUseExplosion.rb:21:1870:21:1871 | 12 | UseUseExplosion.rb:21:1862:21:1871 | ... > ... | | UseUseExplosion.rb:21:1874:21:2276 | then ... | UseUseExplosion.rb:21:1858:21:2292 | if ... | | UseUseExplosion.rb:21:1879:21:2276 | if ... | UseUseExplosion.rb:21:1874:21:2276 | then ... | @@ -2599,8 +2410,7 @@ | UseUseExplosion.rb:21:1883:21:1887 | [post] self | UseUseExplosion.rb:21:2267:21:2272 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:1904:21:1908 | self | | UseUseExplosion.rb:21:1883:21:1887 | self | UseUseExplosion.rb:21:2267:21:2272 | self | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [false] ( ... ) | -| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | [true] ( ... ) | +| UseUseExplosion.rb:21:1883:21:1892 | ... > ... | UseUseExplosion.rb:21:1882:21:1893 | ( ... ) | | UseUseExplosion.rb:21:1891:21:1892 | 11 | UseUseExplosion.rb:21:1883:21:1892 | ... > ... | | UseUseExplosion.rb:21:1895:21:2260 | then ... | UseUseExplosion.rb:21:1879:21:2276 | if ... | | UseUseExplosion.rb:21:1900:21:2260 | if ... | UseUseExplosion.rb:21:1895:21:2260 | then ... | @@ -2609,8 +2419,7 @@ | UseUseExplosion.rb:21:1904:21:1908 | [post] self | UseUseExplosion.rb:21:2251:21:2256 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:1925:21:1929 | self | | UseUseExplosion.rb:21:1904:21:1908 | self | UseUseExplosion.rb:21:2251:21:2256 | self | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [false] ( ... ) | -| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | [true] ( ... ) | +| UseUseExplosion.rb:21:1904:21:1913 | ... > ... | UseUseExplosion.rb:21:1903:21:1914 | ( ... ) | | UseUseExplosion.rb:21:1912:21:1913 | 10 | UseUseExplosion.rb:21:1904:21:1913 | ... > ... | | UseUseExplosion.rb:21:1916:21:2244 | then ... | UseUseExplosion.rb:21:1900:21:2260 | if ... | | UseUseExplosion.rb:21:1921:21:2244 | if ... | UseUseExplosion.rb:21:1916:21:2244 | then ... | @@ -2619,8 +2428,7 @@ | UseUseExplosion.rb:21:1925:21:1929 | [post] self | UseUseExplosion.rb:21:2235:21:2240 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:1945:21:1949 | self | | UseUseExplosion.rb:21:1925:21:1929 | self | UseUseExplosion.rb:21:2235:21:2240 | self | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [false] ( ... ) | -| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | [true] ( ... ) | +| UseUseExplosion.rb:21:1925:21:1933 | ... > ... | UseUseExplosion.rb:21:1924:21:1934 | ( ... ) | | UseUseExplosion.rb:21:1933:21:1933 | 9 | UseUseExplosion.rb:21:1925:21:1933 | ... > ... | | UseUseExplosion.rb:21:1936:21:2228 | then ... | UseUseExplosion.rb:21:1921:21:2244 | if ... | | UseUseExplosion.rb:21:1941:21:2228 | if ... | UseUseExplosion.rb:21:1936:21:2228 | then ... | @@ -2629,8 +2437,7 @@ | UseUseExplosion.rb:21:1945:21:1949 | [post] self | UseUseExplosion.rb:21:2219:21:2224 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:1965:21:1969 | self | | UseUseExplosion.rb:21:1945:21:1949 | self | UseUseExplosion.rb:21:2219:21:2224 | self | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [false] ( ... ) | -| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | [true] ( ... ) | +| UseUseExplosion.rb:21:1945:21:1953 | ... > ... | UseUseExplosion.rb:21:1944:21:1954 | ( ... ) | | UseUseExplosion.rb:21:1953:21:1953 | 8 | UseUseExplosion.rb:21:1945:21:1953 | ... > ... | | UseUseExplosion.rb:21:1956:21:2212 | then ... | UseUseExplosion.rb:21:1941:21:2228 | if ... | | UseUseExplosion.rb:21:1961:21:2212 | if ... | UseUseExplosion.rb:21:1956:21:2212 | then ... | @@ -2639,8 +2446,7 @@ | UseUseExplosion.rb:21:1965:21:1969 | [post] self | UseUseExplosion.rb:21:2203:21:2208 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:1985:21:1989 | self | | UseUseExplosion.rb:21:1965:21:1969 | self | UseUseExplosion.rb:21:2203:21:2208 | self | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [false] ( ... ) | -| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | [true] ( ... ) | +| UseUseExplosion.rb:21:1965:21:1973 | ... > ... | UseUseExplosion.rb:21:1964:21:1974 | ( ... ) | | UseUseExplosion.rb:21:1973:21:1973 | 7 | UseUseExplosion.rb:21:1965:21:1973 | ... > ... | | UseUseExplosion.rb:21:1976:21:2196 | then ... | UseUseExplosion.rb:21:1961:21:2212 | if ... | | UseUseExplosion.rb:21:1981:21:2196 | if ... | UseUseExplosion.rb:21:1976:21:2196 | then ... | @@ -2649,8 +2455,7 @@ | UseUseExplosion.rb:21:1985:21:1989 | [post] self | UseUseExplosion.rb:21:2187:21:2192 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2005:21:2009 | self | | UseUseExplosion.rb:21:1985:21:1989 | self | UseUseExplosion.rb:21:2187:21:2192 | self | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [false] ( ... ) | -| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | [true] ( ... ) | +| UseUseExplosion.rb:21:1985:21:1993 | ... > ... | UseUseExplosion.rb:21:1984:21:1994 | ( ... ) | | UseUseExplosion.rb:21:1993:21:1993 | 6 | UseUseExplosion.rb:21:1985:21:1993 | ... > ... | | UseUseExplosion.rb:21:1996:21:2180 | then ... | UseUseExplosion.rb:21:1981:21:2196 | if ... | | UseUseExplosion.rb:21:2001:21:2180 | if ... | UseUseExplosion.rb:21:1996:21:2180 | then ... | @@ -2659,8 +2464,7 @@ | UseUseExplosion.rb:21:2005:21:2009 | [post] self | UseUseExplosion.rb:21:2171:21:2176 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2025:21:2029 | self | | UseUseExplosion.rb:21:2005:21:2009 | self | UseUseExplosion.rb:21:2171:21:2176 | self | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [false] ( ... ) | -| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | [true] ( ... ) | +| UseUseExplosion.rb:21:2005:21:2013 | ... > ... | UseUseExplosion.rb:21:2004:21:2014 | ( ... ) | | UseUseExplosion.rb:21:2013:21:2013 | 5 | UseUseExplosion.rb:21:2005:21:2013 | ... > ... | | UseUseExplosion.rb:21:2016:21:2164 | then ... | UseUseExplosion.rb:21:2001:21:2180 | if ... | | UseUseExplosion.rb:21:2021:21:2164 | if ... | UseUseExplosion.rb:21:2016:21:2164 | then ... | @@ -2669,8 +2473,7 @@ | UseUseExplosion.rb:21:2025:21:2029 | [post] self | UseUseExplosion.rb:21:2155:21:2160 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2045:21:2049 | self | | UseUseExplosion.rb:21:2025:21:2029 | self | UseUseExplosion.rb:21:2155:21:2160 | self | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [false] ( ... ) | -| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | [true] ( ... ) | +| UseUseExplosion.rb:21:2025:21:2033 | ... > ... | UseUseExplosion.rb:21:2024:21:2034 | ( ... ) | | UseUseExplosion.rb:21:2033:21:2033 | 4 | UseUseExplosion.rb:21:2025:21:2033 | ... > ... | | UseUseExplosion.rb:21:2036:21:2148 | then ... | UseUseExplosion.rb:21:2021:21:2164 | if ... | | UseUseExplosion.rb:21:2041:21:2148 | if ... | UseUseExplosion.rb:21:2036:21:2148 | then ... | @@ -2679,8 +2482,7 @@ | UseUseExplosion.rb:21:2045:21:2049 | [post] self | UseUseExplosion.rb:21:2139:21:2144 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2065:21:2069 | self | | UseUseExplosion.rb:21:2045:21:2049 | self | UseUseExplosion.rb:21:2139:21:2144 | self | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [false] ( ... ) | -| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | [true] ( ... ) | +| UseUseExplosion.rb:21:2045:21:2053 | ... > ... | UseUseExplosion.rb:21:2044:21:2054 | ( ... ) | | UseUseExplosion.rb:21:2053:21:2053 | 3 | UseUseExplosion.rb:21:2045:21:2053 | ... > ... | | UseUseExplosion.rb:21:2056:21:2132 | then ... | UseUseExplosion.rb:21:2041:21:2148 | if ... | | UseUseExplosion.rb:21:2061:21:2132 | if ... | UseUseExplosion.rb:21:2056:21:2132 | then ... | @@ -2689,16 +2491,14 @@ | UseUseExplosion.rb:21:2065:21:2069 | [post] self | UseUseExplosion.rb:21:2123:21:2128 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2085:21:2089 | self | | UseUseExplosion.rb:21:2065:21:2069 | self | UseUseExplosion.rb:21:2123:21:2128 | self | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [false] ( ... ) | -| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | [true] ( ... ) | +| UseUseExplosion.rb:21:2065:21:2073 | ... > ... | UseUseExplosion.rb:21:2064:21:2074 | ( ... ) | | UseUseExplosion.rb:21:2073:21:2073 | 2 | UseUseExplosion.rb:21:2065:21:2073 | ... > ... | | UseUseExplosion.rb:21:2076:21:2116 | then ... | UseUseExplosion.rb:21:2061:21:2132 | if ... | | UseUseExplosion.rb:21:2081:21:2116 | if ... | UseUseExplosion.rb:21:2076:21:2116 | then ... | | UseUseExplosion.rb:21:2085:21:2089 | @prop | UseUseExplosion.rb:21:2085:21:2093 | ... > ... | | UseUseExplosion.rb:21:2085:21:2089 | [post] self | UseUseExplosion.rb:21:2107:21:2112 | self | | UseUseExplosion.rb:21:2085:21:2089 | self | UseUseExplosion.rb:21:2107:21:2112 | self | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [false] ( ... ) | -| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | [true] ( ... ) | +| UseUseExplosion.rb:21:2085:21:2093 | ... > ... | UseUseExplosion.rb:21:2084:21:2094 | ( ... ) | | UseUseExplosion.rb:21:2093:21:2093 | 1 | UseUseExplosion.rb:21:2085:21:2093 | ... > ... | | UseUseExplosion.rb:21:2096:21:2099 | then ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | | UseUseExplosion.rb:21:2102:21:2112 | else ... | UseUseExplosion.rb:21:2081:21:2116 | if ... | @@ -2994,8 +2794,7 @@ | local_dataflow.rb:10:9:10:9 | ... = ... | local_dataflow.rb:10:9:10:9 | if ... | | local_dataflow.rb:10:9:10:9 | [input] phi | local_dataflow.rb:10:9:10:9 | phi | | local_dataflow.rb:10:9:10:9 | [post] x | local_dataflow.rb:10:9:10:9 | [input] phi | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [false] ! ... | -| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | [true] ! ... | +| local_dataflow.rb:10:9:10:9 | defined? ... | local_dataflow.rb:10:9:10:9 | ! ... | | local_dataflow.rb:10:9:10:9 | nil | local_dataflow.rb:10:9:10:9 | ... = ... | | local_dataflow.rb:10:9:10:9 | nil | local_dataflow.rb:10:9:10:9 | x | | local_dataflow.rb:10:9:10:9 | x | local_dataflow.rb:10:9:10:9 | [input] phi | @@ -3016,8 +2815,7 @@ | local_dataflow.rb:15:5:15:5 | ... = ... | local_dataflow.rb:15:5:15:5 | if ... | | local_dataflow.rb:15:5:15:5 | [input] phi | local_dataflow.rb:15:5:15:5 | phi | | local_dataflow.rb:15:5:15:5 | [post] x | local_dataflow.rb:15:5:15:5 | [input] phi | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [false] ! ... | -| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | [true] ! ... | +| local_dataflow.rb:15:5:15:5 | defined? ... | local_dataflow.rb:15:5:15:5 | ! ... | | local_dataflow.rb:15:5:15:5 | nil | local_dataflow.rb:15:5:15:5 | ... = ... | | local_dataflow.rb:15:5:15:5 | nil | local_dataflow.rb:15:5:15:5 | x | | local_dataflow.rb:15:5:15:5 | x | local_dataflow.rb:15:5:15:5 | [input] phi | @@ -3035,8 +2833,7 @@ | local_dataflow.rb:19:5:19:5 | ... = ... | local_dataflow.rb:19:5:19:5 | if ... | | local_dataflow.rb:19:5:19:5 | [input] phi | local_dataflow.rb:19:5:19:5 | phi | | local_dataflow.rb:19:5:19:5 | [post] x | local_dataflow.rb:19:5:19:5 | [input] phi | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [false] ! ... | -| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | [true] ! ... | +| local_dataflow.rb:19:5:19:5 | defined? ... | local_dataflow.rb:19:5:19:5 | ! ... | | local_dataflow.rb:19:5:19:5 | nil | local_dataflow.rb:19:5:19:5 | ... = ... | | local_dataflow.rb:19:5:19:5 | nil | local_dataflow.rb:19:5:19:5 | x | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | [input] phi | @@ -3325,8 +3122,7 @@ | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | [post] self | local_dataflow.rb:133:18:133:23 | self | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:8:133:13 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(self) | | local_dataflow.rb:133:8:133:13 | self | local_dataflow.rb:133:18:133:23 | self | | local_dataflow.rb:133:12:133:12 | [post] x | local_dataflow.rb:133:8:133:13 | [input] SSA phi read(x) | @@ -3337,8 +3133,7 @@ | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | local_dataflow.rb:134:11:134:11 | x | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | [post] self | local_dataflow.rb:136:7:136:12 | self | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [false] ... \|\| ... | -| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | [true] ... \|\| ... | +| local_dataflow.rb:133:18:133:23 | call to use | local_dataflow.rb:133:8:133:23 | ... \|\| ... | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(self) | | local_dataflow.rb:133:18:133:23 | self | local_dataflow.rb:136:7:136:12 | self | | local_dataflow.rb:133:22:133:22 | [post] x | local_dataflow.rb:133:18:133:23 | [input] SSA phi read(x) | @@ -3371,61 +3166,51 @@ | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:25:137:25 | x | -| local_dataflow.rb:137:20:137:26 | [false] ! ... | local_dataflow.rb:137:10:137:26 | [false] ... && ... | +| local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:137:20:137:26 | [true] ! ... | local_dataflow.rb:137:10:137:26 | [true] ... && ... | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [false] ! ... | -| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | [true] ! ... | +| local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | ! ... | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | [post] x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [false] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:8:141:14 | [true] ! ... | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [false] ! ... | -| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | [true] ! ... | +| local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | ! ... | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:13:141:13 | [post] x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | [post] x | local_dataflow.rb:141:24:141:24 | x | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:24:141:24 | x | -| local_dataflow.rb:141:19:141:37 | [false] ( ... ) | local_dataflow.rb:141:8:141:37 | [false] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | -| local_dataflow.rb:141:19:141:37 | [post] [false] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [false] ... && ... | -| local_dataflow.rb:141:19:141:37 | [post] [true] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] [true] ... && ... | -| local_dataflow.rb:141:19:141:37 | [true] ( ... ) | local_dataflow.rb:141:8:141:37 | [true] ... \|\| ... | +| local_dataflow.rb:141:19:141:37 | [post] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] ... && ... | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | [post] self | local_dataflow.rb:141:31:141:36 | self | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | | local_dataflow.rb:141:20:141:25 | self | local_dataflow.rb:141:31:141:36 | self | -| local_dataflow.rb:141:20:141:36 | [false] ... && ... | local_dataflow.rb:141:19:141:37 | [false] ( ... ) | -| local_dataflow.rb:141:20:141:36 | [true] ... && ... | local_dataflow.rb:141:19:141:37 | [true] ( ... ) | +| local_dataflow.rb:141:20:141:36 | ... && ... | local_dataflow.rb:141:19:141:37 | ( ... ) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | [post] x | local_dataflow.rb:141:35:141:35 | x | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | | local_dataflow.rb:141:24:141:24 | x | local_dataflow.rb:141:35:141:35 | x | -| local_dataflow.rb:141:30:141:36 | [false] ! ... | local_dataflow.rb:141:20:141:36 | [false] ... && ... | +| local_dataflow.rb:141:30:141:36 | ! ... | local_dataflow.rb:141:20:141:36 | ... && ... | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | -| local_dataflow.rb:141:30:141:36 | [true] ! ... | local_dataflow.rb:141:20:141:36 | [true] ... && ... | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | [post] self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [false] ! ... | -| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | [true] ! ... | +| local_dataflow.rb:141:31:141:36 | call to use | local_dataflow.rb:141:30:141:36 | ! ... | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | | local_dataflow.rb:141:31:141:36 | self | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(self) | | local_dataflow.rb:141:35:141:35 | [post] x | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | @@ -3441,8 +3226,7 @@ | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | [post] self | local_dataflow.rb:143:21:143:26 | self | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:11:143:16 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:11:143:16 | [input] SSA phi read(self) | | local_dataflow.rb:143:11:143:16 | self | local_dataflow.rb:143:21:143:26 | self | | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | @@ -3455,8 +3239,7 @@ | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(x) | local_dataflow.rb:144:15:144:15 | x | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | [post] self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [false] ... \|\| ... | -| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | [true] ... \|\| ... | +| local_dataflow.rb:143:21:143:26 | call to use | local_dataflow.rb:143:11:143:26 | ... \|\| ... | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:21:143:26 | self | local_dataflow.rb:143:21:143:26 | [input] SSA phi read(self) | | local_dataflow.rb:143:25:143:25 | [post] x | local_dataflow.rb:143:11:143:26 | [input] SSA phi read(x) | From 54e4bb35ab007306f7a14ac928ecec8377d2cd3f Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Fri, 7 Aug 2026 14:54:22 +0200 Subject: [PATCH 060/181] Ruby: Accept qltest changes due to method body inclusion in CFG. --- .../dataflow/local/DataflowStep.expected | 15 +++ .../dataflow/local/TaintStep.expected | 16 +++ .../dataflow/params/TypeTracker.expected | 127 ++++++++++++++++++ .../type-tracker/TypeTracker.expected | 16 +++ .../active_record/ActiveRecord.expected | 7 + 5 files changed, 181 insertions(+) diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index c919dc71dd5c..da64eaf3949c 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -1404,6 +1404,7 @@ | UseUseExplosion.rb:20:3691:20:3696 | call to use | UseUseExplosion.rb:20:3686:20:3696 | else ... | | UseUseExplosion.rb:20:3691:20:3696 | self | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:3695:20:3695 | x | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | +| UseUseExplosion.rb:21:9:21:3700 | if ... | UseUseExplosion.rb:19:9:21:3700 | ... | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | | UseUseExplosion.rb:21:13:21:17 | self | UseUseExplosion.rb:21:35:21:39 | self | @@ -2325,6 +2326,7 @@ | local_dataflow.rb:5:8:5:12 | ... = ... | local_dataflow.rb:5:7:5:13 | ( ... ) | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:5:8:5:12 | ... = ... | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:6:8:6:8 | a | +| local_dataflow.rb:6:3:6:14 | ... = ... | local_dataflow.rb:2:3:6:14 | ... | | local_dataflow.rb:6:7:6:14 | ( ... ) | local_dataflow.rb:6:3:6:14 | ... = ... | | local_dataflow.rb:6:8:6:13 | ... = ... | local_dataflow.rb:6:7:6:14 | ( ... ) | | local_dataflow.rb:6:10:6:11 | ... + ... | local_dataflow.rb:6:8:6:13 | ... = ... | @@ -2352,6 +2354,7 @@ | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:11:1:11:2 | [post] self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:12:3:12:5 | self | +| local_dataflow.rb:12:3:12:5 | call to p | local_dataflow.rb:10:5:13:3 | ... | | local_dataflow.rb:15:1:17:3 | x | local_dataflow.rb:19:5:19:5 | x | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | @@ -2389,9 +2392,11 @@ | local_dataflow.rb:30:14:30:20 | "class" | local_dataflow.rb:30:5:30:24 | C | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:1 | x | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | +| local_dataflow.rb:32:14:32:21 | "method" | local_dataflow.rb:32:14:32:21 | ... | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | | local_dataflow.rb:36:13:36:13 | 7 | local_dataflow.rb:36:6:36:13 | return | +| local_dataflow.rb:38:3:38:13 | "reachable" | local_dataflow.rb:35:3:38:13 | ... | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:42:6:42:6 | x | | local_dataflow.rb:43:13:43:13 | 7 | local_dataflow.rb:43:6:43:13 | return | @@ -2403,6 +2408,7 @@ | local_dataflow.rb:50:18:50:18 | [post] x | local_dataflow.rb:51:20:51:20 | x | | local_dataflow.rb:50:18:50:18 | x | local_dataflow.rb:51:20:51:20 | x | | local_dataflow.rb:51:9:51:15 | "break" | local_dataflow.rb:51:3:51:15 | break | +| local_dataflow.rb:52:3:52:10 | "normal" | local_dataflow.rb:50:3:52:10 | ... | | local_dataflow.rb:55:5:55:13 | synthetic splat argument | local_dataflow.rb:55:5:55:13 | call to [] | | local_dataflow.rb:60:1:90:3 | self (test_case) | local_dataflow.rb:78:12:78:20 | self | | local_dataflow.rb:60:1:90:3 | self in test_case | local_dataflow.rb:60:1:90:3 | self (test_case) | @@ -2495,6 +2501,7 @@ | local_dataflow.rb:87:25:87:25 | [post] x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:25:87:25 | x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:29:87:29 | x | local_dataflow.rb:87:15:87:48 | then ... | +| local_dataflow.rb:89:3:89:9 | call to sink | local_dataflow.rb:61:3:89:28 | ... | | local_dataflow.rb:92:1:109:3 | self (and_or) | local_dataflow.rb:93:7:93:15 | self | | local_dataflow.rb:92:1:109:3 | self in and_or | local_dataflow.rb:92:1:109:3 | self (and_or) | | local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | @@ -2584,6 +2591,7 @@ | local_dataflow.rb:107:9:107:17 | [post] self | local_dataflow.rb:108:3:108:9 | self | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:5:107:7 | ... && ... | | local_dataflow.rb:107:9:107:17 | self | local_dataflow.rb:108:3:108:9 | self | +| local_dataflow.rb:108:3:108:9 | call to sink | local_dataflow.rb:93:3:108:28 | ... | | local_dataflow.rb:111:1:114:3 | self (object_dup) | local_dataflow.rb:112:3:112:21 | self | | local_dataflow.rb:111:1:114:3 | self in object_dup | local_dataflow.rb:111:1:114:3 | self (object_dup) | | local_dataflow.rb:112:3:112:21 | [post] self | local_dataflow.rb:112:8:112:16 | self | @@ -2592,6 +2600,7 @@ | local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | | local_dataflow.rb:112:8:112:16 | self | local_dataflow.rb:113:3:113:25 | self | | local_dataflow.rb:113:3:113:25 | [post] self | local_dataflow.rb:113:8:113:16 | self | +| local_dataflow.rb:113:3:113:25 | call to sink | local_dataflow.rb:112:3:113:44 | ... | | local_dataflow.rb:113:3:113:25 | self | local_dataflow.rb:113:8:113:16 | self | | local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:20 | call to dup | | local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | @@ -2608,25 +2617,31 @@ | local_dataflow.rb:118:17:118:31 | self | local_dataflow.rb:118:23:118:29 | self | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:20:118:20 | x | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:28:118:28 | x | +| local_dataflow.rb:118:23:118:29 | call to sink | local_dataflow.rb:118:23:118:29 | ... | | local_dataflow.rb:119:3:119:31 | [post] self | local_dataflow.rb:119:8:119:16 | self | +| local_dataflow.rb:119:3:119:31 | call to sink | local_dataflow.rb:117:3:119:50 | ... | | local_dataflow.rb:119:3:119:31 | self | local_dataflow.rb:119:8:119:16 | self | | local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:23 | call to tap | | local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | | local_dataflow.rb:122:1:124:3 | self (dup_tap) | local_dataflow.rb:123:3:123:50 | self | | local_dataflow.rb:122:1:124:3 | self in dup_tap | local_dataflow.rb:122:1:124:3 | self (dup_tap) | | local_dataflow.rb:123:3:123:50 | [post] self | local_dataflow.rb:123:8:123:16 | self | +| local_dataflow.rb:123:3:123:50 | call to sink | local_dataflow.rb:123:3:123:70 | ... | | local_dataflow.rb:123:3:123:50 | self | local_dataflow.rb:123:8:123:16 | self | | local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:20 | call to dup | | local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | | local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | | local_dataflow.rb:123:26:123:45 | self | local_dataflow.rb:123:32:123:43 | self | +| local_dataflow.rb:123:32:123:43 | call to puts | local_dataflow.rb:123:32:123:43 | ... | | local_dataflow.rb:126:1:128:3 | self (use) | local_dataflow.rb:127:3:127:8 | self | | local_dataflow.rb:126:1:128:3 | self in use | local_dataflow.rb:126:1:128:3 | self (use) | +| local_dataflow.rb:127:3:127:8 | call to rand | local_dataflow.rb:127:3:127:8 | ... | | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | local_dataflow.rb:132:6:132:11 | self | | local_dataflow.rb:130:1:150:3 | self in use_use_madness | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | | local_dataflow.rb:131:3:131:3 | x | local_dataflow.rb:132:10:132:10 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:3 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | +| local_dataflow.rb:132:3:149:5 | if ... | local_dataflow.rb:131:3:149:5 | ... | | local_dataflow.rb:132:6:132:11 | [post] self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:10:132:10 | [post] x | local_dataflow.rb:133:12:133:12 | x | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index c81cd6fc0646..4eaaa96538b2 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -1604,6 +1604,7 @@ | UseUseExplosion.rb:20:3691:20:3696 | call to use | UseUseExplosion.rb:20:3686:20:3696 | else ... | | UseUseExplosion.rb:20:3691:20:3696 | self | UseUseExplosion.rb:21:13:21:17 | self | | UseUseExplosion.rb:20:3695:20:3695 | x | UseUseExplosion.rb:20:9:20:3700 | SSA phi read(x) | +| UseUseExplosion.rb:21:9:21:3700 | if ... | UseUseExplosion.rb:19:9:21:3700 | ... | | UseUseExplosion.rb:21:13:21:17 | @prop | UseUseExplosion.rb:21:13:21:23 | ... > ... | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:35:21:39 | self | | UseUseExplosion.rb:21:13:21:17 | [post] self | UseUseExplosion.rb:21:3691:21:3696 | self | @@ -2772,6 +2773,7 @@ | local_dataflow.rb:5:8:5:12 | ... = ... | local_dataflow.rb:5:7:5:13 | ( ... ) | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:5:8:5:12 | ... = ... | | local_dataflow.rb:5:12:5:12 | a | local_dataflow.rb:6:8:6:8 | a | +| local_dataflow.rb:6:3:6:14 | ... = ... | local_dataflow.rb:2:3:6:14 | ... | | local_dataflow.rb:6:7:6:14 | ( ... ) | local_dataflow.rb:6:3:6:14 | ... = ... | | local_dataflow.rb:6:8:6:8 | a | local_dataflow.rb:6:10:6:11 | ... + ... | | local_dataflow.rb:6:8:6:13 | ... = ... | local_dataflow.rb:6:7:6:14 | ( ... ) | @@ -2805,6 +2807,7 @@ | local_dataflow.rb:10:14:10:18 | array | local_dataflow.rb:15:10:15:14 | array | | local_dataflow.rb:11:1:11:2 | [post] self | local_dataflow.rb:12:3:12:5 | self | | local_dataflow.rb:11:1:11:2 | self | local_dataflow.rb:12:3:12:5 | self | +| local_dataflow.rb:12:3:12:5 | call to p | local_dataflow.rb:10:5:13:3 | ... | | local_dataflow.rb:15:1:17:3 | x | local_dataflow.rb:19:5:19:5 | x | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | ... = ... | | local_dataflow.rb:15:1:17:3 | __synth__0__1 | local_dataflow.rb:15:1:17:3 | __synth__0__1 | @@ -2840,6 +2843,7 @@ | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | defined? ... | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | phi | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:20:6:20:6 | x | +| local_dataflow.rb:20:3:20:25 | if ... | local_dataflow.rb:19:1:21:3 | ... | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:20:10:20:10 | 1 | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | @@ -2850,12 +2854,14 @@ | local_dataflow.rb:30:14:30:20 | "class" | local_dataflow.rb:30:5:30:24 | C | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:1 | x | | local_dataflow.rb:32:5:32:25 | bar | local_dataflow.rb:32:1:32:25 | ... = ... | +| local_dataflow.rb:32:14:32:21 | "method" | local_dataflow.rb:32:14:32:21 | ... | | local_dataflow.rb:34:1:39:3 | synthetic splat parameter | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | | local_dataflow.rb:35:6:35:6 | x | local_dataflow.rb:35:6:35:11 | ... == ... | | local_dataflow.rb:35:11:35:11 | 4 | local_dataflow.rb:35:6:35:11 | ... == ... | | local_dataflow.rb:36:13:36:13 | 7 | local_dataflow.rb:36:6:36:13 | return | +| local_dataflow.rb:38:3:38:13 | "reachable" | local_dataflow.rb:35:3:38:13 | ... | | local_dataflow.rb:41:1:47:3 | synthetic splat parameter | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:42:6:42:6 | x | @@ -2874,6 +2880,7 @@ | local_dataflow.rb:51:9:51:15 | "break" | local_dataflow.rb:51:3:51:15 | break | | local_dataflow.rb:51:20:51:20 | x | local_dataflow.rb:51:20:51:24 | ... < ... | | local_dataflow.rb:51:24:51:24 | 9 | local_dataflow.rb:51:20:51:24 | ... < ... | +| local_dataflow.rb:52:3:52:10 | "normal" | local_dataflow.rb:50:3:52:10 | ... | | local_dataflow.rb:55:5:55:13 | Array | local_dataflow.rb:55:5:55:13 | call to [] | | local_dataflow.rb:55:5:55:13 | synthetic splat argument | local_dataflow.rb:55:5:55:13 | call to [] | | local_dataflow.rb:57:1:58:3 | synthetic splat parameter | local_dataflow.rb:57:9:57:9 | x | @@ -2978,6 +2985,7 @@ | local_dataflow.rb:87:25:87:25 | [post] x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:25:87:25 | x | local_dataflow.rb:87:29:87:29 | x | | local_dataflow.rb:87:29:87:29 | x | local_dataflow.rb:87:15:87:48 | then ... | +| local_dataflow.rb:89:3:89:9 | call to sink | local_dataflow.rb:61:3:89:28 | ... | | local_dataflow.rb:92:1:109:3 | self (and_or) | local_dataflow.rb:93:7:93:15 | self | | local_dataflow.rb:92:1:109:3 | self in and_or | local_dataflow.rb:92:1:109:3 | self (and_or) | | local_dataflow.rb:93:3:93:3 | a | local_dataflow.rb:94:8:94:8 | a | @@ -3067,6 +3075,7 @@ | local_dataflow.rb:107:9:107:17 | [post] self | local_dataflow.rb:108:3:108:9 | self | | local_dataflow.rb:107:9:107:17 | call to source | local_dataflow.rb:107:5:107:7 | ... && ... | | local_dataflow.rb:107:9:107:17 | self | local_dataflow.rb:108:3:108:9 | self | +| local_dataflow.rb:108:3:108:9 | call to sink | local_dataflow.rb:93:3:108:28 | ... | | local_dataflow.rb:111:1:114:3 | self (object_dup) | local_dataflow.rb:112:3:112:21 | self | | local_dataflow.rb:111:1:114:3 | self in object_dup | local_dataflow.rb:111:1:114:3 | self (object_dup) | | local_dataflow.rb:112:3:112:21 | [post] self | local_dataflow.rb:112:8:112:16 | self | @@ -3075,6 +3084,7 @@ | local_dataflow.rb:112:8:112:16 | call to source | local_dataflow.rb:112:8:112:20 | call to dup | | local_dataflow.rb:112:8:112:16 | self | local_dataflow.rb:113:3:113:25 | self | | local_dataflow.rb:113:3:113:25 | [post] self | local_dataflow.rb:113:8:113:16 | self | +| local_dataflow.rb:113:3:113:25 | call to sink | local_dataflow.rb:112:3:113:44 | ... | | local_dataflow.rb:113:3:113:25 | self | local_dataflow.rb:113:8:113:16 | self | | local_dataflow.rb:113:8:113:16 | call to source | local_dataflow.rb:113:8:113:20 | call to dup | | local_dataflow.rb:113:8:113:20 | call to dup | local_dataflow.rb:113:8:113:24 | call to dup | @@ -3092,27 +3102,33 @@ | local_dataflow.rb:118:17:118:31 | synthetic splat parameter | local_dataflow.rb:118:20:118:20 | x | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:20:118:20 | x | | local_dataflow.rb:118:20:118:20 | x | local_dataflow.rb:118:28:118:28 | x | +| local_dataflow.rb:118:23:118:29 | call to sink | local_dataflow.rb:118:23:118:29 | ... | | local_dataflow.rb:119:3:119:31 | [post] self | local_dataflow.rb:119:8:119:16 | self | +| local_dataflow.rb:119:3:119:31 | call to sink | local_dataflow.rb:117:3:119:50 | ... | | local_dataflow.rb:119:3:119:31 | self | local_dataflow.rb:119:8:119:16 | self | | local_dataflow.rb:119:8:119:16 | call to source | local_dataflow.rb:119:8:119:23 | call to tap | | local_dataflow.rb:119:8:119:23 | call to tap | local_dataflow.rb:119:8:119:30 | call to tap | | local_dataflow.rb:122:1:124:3 | self (dup_tap) | local_dataflow.rb:123:3:123:50 | self | | local_dataflow.rb:122:1:124:3 | self in dup_tap | local_dataflow.rb:122:1:124:3 | self (dup_tap) | | local_dataflow.rb:123:3:123:50 | [post] self | local_dataflow.rb:123:8:123:16 | self | +| local_dataflow.rb:123:3:123:50 | call to sink | local_dataflow.rb:123:3:123:70 | ... | | local_dataflow.rb:123:3:123:50 | self | local_dataflow.rb:123:8:123:16 | self | | local_dataflow.rb:123:8:123:16 | call to source | local_dataflow.rb:123:8:123:20 | call to dup | | local_dataflow.rb:123:8:123:20 | call to dup | local_dataflow.rb:123:8:123:45 | call to tap | | local_dataflow.rb:123:8:123:45 | call to tap | local_dataflow.rb:123:8:123:49 | call to dup | | local_dataflow.rb:123:26:123:45 | self | local_dataflow.rb:123:32:123:43 | self | | local_dataflow.rb:123:26:123:45 | synthetic splat parameter | local_dataflow.rb:123:29:123:29 | x | +| local_dataflow.rb:123:32:123:43 | call to puts | local_dataflow.rb:123:32:123:43 | ... | | local_dataflow.rb:126:1:128:3 | self (use) | local_dataflow.rb:127:3:127:8 | self | | local_dataflow.rb:126:1:128:3 | self in use | local_dataflow.rb:126:1:128:3 | self (use) | | local_dataflow.rb:126:1:128:3 | synthetic splat parameter | local_dataflow.rb:126:9:126:9 | x | +| local_dataflow.rb:127:3:127:8 | call to rand | local_dataflow.rb:127:3:127:8 | ... | | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | local_dataflow.rb:132:6:132:11 | self | | local_dataflow.rb:130:1:150:3 | self in use_use_madness | local_dataflow.rb:130:1:150:3 | self (use_use_madness) | | local_dataflow.rb:131:3:131:3 | x | local_dataflow.rb:132:10:132:10 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:3 | x | | local_dataflow.rb:131:7:131:8 | "" | local_dataflow.rb:131:3:131:8 | ... = ... | +| local_dataflow.rb:132:3:149:5 | if ... | local_dataflow.rb:131:3:149:5 | ... | | local_dataflow.rb:132:6:132:11 | [post] self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:6:132:11 | self | local_dataflow.rb:133:8:133:13 | self | | local_dataflow.rb:132:10:132:10 | [post] x | local_dataflow.rb:133:12:133:12 | x | diff --git a/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected b/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected index 80e9e84a83a1..7eae6c7cfd1e 100644 --- a/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected +++ b/ruby/ql/test/library-tests/dataflow/params/TypeTracker.expected @@ -3668,6 +3668,7 @@ trackEnd | params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:1:11:1:11 | x | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:1:11:1:11 | x | params_flow.rb:2:5:2:5 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:5:10:5:10 | x | | params_flow.rb:1:11:1:11 | x | params_flow.rb:5:10:5:10 | x | @@ -3869,16 +3870,20 @@ trackEnd | params_flow.rb:5:10:5:10 | x | params_flow.rb:5:10:5:10 | x | | params_flow.rb:5:10:5:10 | x | params_flow.rb:5:10:5:10 | x | | params_flow.rb:5:10:5:10 | x | params_flow.rb:6:10:6:10 | x | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:6:5:6:10 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:6:5:6:10 | call to puts | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:10:5:10:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:10:5:11:84 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:11:5:11:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:14:1:14:30 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:17:5:17:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:17:5:18:82 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:18:5:18:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:21:1:21:35 | call to keyword | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:22:1:22:35 | call to keyword | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:23:1:23:41 | call to keyword | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:26:5:26:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:26:5:30:22 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:27:5:27:22 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:28:5:28:22 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:29:5:29:22 | call to sink | @@ -3890,14 +3895,17 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:44:1:44:28 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:47:1:47:17 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:50:5:50:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:50:5:52:21 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:51:5:51:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:52:5:52:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:55:1:55:29 | call to posargs | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:58:1:58:25 | call to posargs | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:61:1:61:14 | call to posargs | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:65:5:65:13 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:65:5:65:33 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:67:1:67:17 | call to splatstuff | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:70:5:70:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:70:5:75:75 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:71:5:71:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:72:5:72:13 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:73:5:73:13 | call to sink | @@ -3906,6 +3914,7 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:78:1:78:63 | call to splatmid | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:81:1:81:37 | call to splatmid | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:84:5:84:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:84:5:90:39 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:85:5:85:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:86:5:86:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:87:5:87:10 | call to sink | @@ -3915,17 +3924,20 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:94:1:94:48 | call to pos_many | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:96:1:96:88 | call to splatmid | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:99:5:99:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:99:5:102:57 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:100:5:100:18 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:101:5:101:18 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:102:5:102:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:105:1:105:49 | call to splatmidsmall | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:106:1:106:46 | call to splatmidsmall | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:109:5:109:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:109:5:111:30 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:110:5:110:13 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:111:5:111:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:114:1:114:67 | call to splat_followed_by_keyword_param | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:118:1:118:14 | call to positional | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:121:5:121:10 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:121:5:125:39 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:122:5:122:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:123:5:123:10 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:124:5:124:10 | call to sink | @@ -3933,6 +3945,7 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:128:1:128:61 | call to destruct | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:131:1:131:46 | call to pos_many | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:134:5:134:16 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:134:5:134:36 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:137:1:137:44 | call to splatall | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:144:1:144:20 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:146:1:146:20 | call to sink | @@ -3951,20 +3964,24 @@ trackEnd | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:191:1:191:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:193:1:193:11 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:201:5:201:15 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:201:5:204:15 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:202:5:202:15 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:203:5:203:15 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:204:5:204:15 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:207:1:207:14 | call to foo | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:211:9:211:15 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:211:9:217:23 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:212:9:212:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:213:9:213:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:214:9:214:21 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:215:9:215:16 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:216:9:216:25 | call to sink | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:217:9:217:23 | yield ... | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:228:5:228:11 | call to sink | +| params_flow.rb:6:5:6:10 | call to puts | params_flow.rb:228:5:228:31 | ... | | params_flow.rb:6:5:6:10 | synthetic splat argument | params_flow.rb:6:5:6:10 | synthetic splat argument | | params_flow.rb:9:1:12:3 | &block | params_flow.rb:9:1:12:3 | &block | | params_flow.rb:9:1:12:3 | positional | params_flow.rb:9:1:12:3 | positional | @@ -3992,6 +4009,7 @@ trackEnd | params_flow.rb:9:20:9:21 | p2 | params_flow.rb:11:10:11:11 | p2 | | params_flow.rb:10:5:10:11 | call to sink | params_flow.rb:10:5:10:11 | call to sink | | params_flow.rb:10:5:10:11 | synthetic splat argument | params_flow.rb:10:5:10:11 | synthetic splat argument | +| params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:10:5:11:84 | ... | | params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:11:5:11:11 | call to sink | | params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:14:1:14:30 | call to positional | | params_flow.rb:11:5:11:11 | call to sink | params_flow.rb:44:1:44:28 | call to positional | @@ -4010,6 +4028,7 @@ trackEnd | params_flow.rb:14:12:14:19 | synthetic splat argument | params_flow.rb:14:12:14:19 | synthetic splat argument | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:14:18:14:18 | 1 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:14:18:14:18 | 1 | params_flow.rb:5:10:5:10 | x | @@ -4029,6 +4048,7 @@ trackEnd | params_flow.rb:14:22:14:29 | synthetic splat argument | params_flow.rb:14:22:14:29 | synthetic splat argument | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:14:28:14:28 | 2 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:14:28:14:28 | 2 | params_flow.rb:5:10:5:10 | x | @@ -4064,6 +4084,7 @@ trackEnd | params_flow.rb:16:18:16:19 | p2 | params_flow.rb:18:10:18:11 | p2 | | params_flow.rb:17:5:17:11 | call to sink | params_flow.rb:17:5:17:11 | call to sink | | params_flow.rb:17:5:17:11 | synthetic splat argument | params_flow.rb:17:5:17:11 | synthetic splat argument | +| params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:17:5:18:82 | ... | | params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:18:5:18:11 | call to sink | | params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:21:1:21:35 | call to keyword | | params_flow.rb:18:5:18:11 | call to sink | params_flow.rb:22:1:22:35 | call to keyword | @@ -4084,6 +4105,7 @@ trackEnd | params_flow.rb:21:13:21:20 | synthetic splat argument | params_flow.rb:21:13:21:20 | synthetic splat argument | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:21:19:21:19 | 3 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:21:19:21:19 | 3 | params_flow.rb:5:10:5:10 | x | @@ -4105,6 +4127,7 @@ trackEnd | params_flow.rb:21:27:21:34 | synthetic splat argument | params_flow.rb:21:27:21:34 | synthetic splat argument | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:21:33:21:33 | 4 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:21:33:21:33 | 4 | params_flow.rb:5:10:5:10 | x | @@ -4128,6 +4151,7 @@ trackEnd | params_flow.rb:22:13:22:20 | synthetic splat argument | params_flow.rb:22:13:22:20 | synthetic splat argument | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:22:19:22:19 | 5 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:22:19:22:19 | 5 | params_flow.rb:5:10:5:10 | x | @@ -4149,6 +4173,7 @@ trackEnd | params_flow.rb:22:27:22:34 | synthetic splat argument | params_flow.rb:22:27:22:34 | synthetic splat argument | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:22:33:22:33 | 6 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:22:33:22:33 | 6 | params_flow.rb:5:10:5:10 | x | @@ -4172,6 +4197,7 @@ trackEnd | params_flow.rb:23:16:23:23 | synthetic splat argument | params_flow.rb:23:16:23:23 | synthetic splat argument | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:23:22:23:22 | 7 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:23:22:23:22 | 7 | params_flow.rb:5:10:5:10 | x | @@ -4193,6 +4219,7 @@ trackEnd | params_flow.rb:23:33:23:40 | synthetic splat argument | params_flow.rb:23:33:23:40 | synthetic splat argument | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:23:39:23:39 | 8 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:23:39:23:39 | 8 | params_flow.rb:5:10:5:10 | x | @@ -4258,6 +4285,7 @@ trackEnd | params_flow.rb:29:11:29:21 | ...[...] | params_flow.rb:29:11:29:21 | ...[...] | | params_flow.rb:29:11:29:21 | synthetic splat argument | params_flow.rb:29:11:29:21 | synthetic splat argument | | params_flow.rb:29:18:29:20 | :p3 | params_flow.rb:29:18:29:20 | :p3 | +| params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:26:5:30:22 | ... | | params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:30:5:30:22 | call to sink | | params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:33:1:33:58 | call to kwargs | | params_flow.rb:30:5:30:22 | call to sink | params_flow.rb:35:1:35:29 | call to kwargs | @@ -4292,6 +4320,7 @@ trackEnd | params_flow.rb:33:12:33:19 | synthetic splat argument | params_flow.rb:33:12:33:19 | synthetic splat argument | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:33:18:33:18 | 9 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:33:18:33:18 | 9 | params_flow.rb:5:10:5:10 | x | @@ -4314,6 +4343,7 @@ trackEnd | params_flow.rb:33:26:33:34 | synthetic splat argument | params_flow.rb:33:26:33:34 | synthetic splat argument | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:33:32:33:33 | 10 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:33:32:33:33 | 10 | params_flow.rb:5:10:5:10 | x | @@ -4333,6 +4363,7 @@ trackEnd | params_flow.rb:33:41:33:49 | synthetic splat argument | params_flow.rb:33:41:33:49 | synthetic splat argument | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:33:47:33:48 | 11 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:33:47:33:48 | 11 | params_flow.rb:5:10:5:10 | x | @@ -4371,6 +4402,7 @@ trackEnd | params_flow.rb:34:14:34:22 | synthetic splat argument | params_flow.rb:34:14:34:22 | synthetic splat argument | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:34:20:34:21 | 12 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:34:20:34:21 | 12 | params_flow.rb:5:10:5:10 | x | @@ -4409,6 +4441,7 @@ trackEnd | params_flow.rb:35:12:35:20 | synthetic splat argument | params_flow.rb:35:12:35:20 | synthetic splat argument | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:35:18:35:19 | 13 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:35:18:35:19 | 13 | params_flow.rb:5:10:5:10 | x | @@ -4453,6 +4486,7 @@ trackEnd | params_flow.rb:37:16:37:24 | synthetic splat argument | params_flow.rb:37:16:37:24 | synthetic splat argument | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:37:22:37:23 | 14 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:37:22:37:23 | 14 | params_flow.rb:5:10:5:10 | x | @@ -4475,6 +4509,7 @@ trackEnd | params_flow.rb:37:34:37:42 | synthetic splat argument | params_flow.rb:37:34:37:42 | synthetic splat argument | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:37:40:37:41 | 15 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:37:40:37:41 | 15 | params_flow.rb:5:10:5:10 | x | @@ -4515,6 +4550,7 @@ trackEnd | params_flow.rb:40:16:40:24 | synthetic splat argument | params_flow.rb:40:16:40:24 | synthetic splat argument | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:40:22:40:23 | 16 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:40:22:40:23 | 16 | params_flow.rb:5:10:5:10 | x | @@ -4538,6 +4574,7 @@ trackEnd | params_flow.rb:41:13:41:21 | synthetic splat argument | params_flow.rb:41:13:41:21 | synthetic splat argument | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:41:19:41:20 | 17 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:41:19:41:20 | 17 | params_flow.rb:5:10:5:10 | x | @@ -4582,6 +4619,7 @@ trackEnd | params_flow.rb:43:9:43:17 | synthetic splat argument | params_flow.rb:43:9:43:17 | synthetic splat argument | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:43:15:43:16 | 17 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:43:15:43:16 | 17 | params_flow.rb:5:10:5:10 | x | @@ -4604,6 +4642,7 @@ trackEnd | params_flow.rb:44:12:44:20 | synthetic splat argument | params_flow.rb:44:12:44:20 | synthetic splat argument | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:44:18:44:19 | 16 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:44:18:44:19 | 16 | params_flow.rb:5:10:5:10 | x | @@ -4647,6 +4686,7 @@ trackEnd | params_flow.rb:46:9:46:17 | synthetic splat argument | params_flow.rb:46:9:46:17 | synthetic splat argument | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:46:15:46:16 | 18 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:46:15:46:16 | 18 | params_flow.rb:5:10:5:10 | x | @@ -4666,6 +4706,7 @@ trackEnd | params_flow.rb:46:20:46:28 | synthetic splat argument | params_flow.rb:46:20:46:28 | synthetic splat argument | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:46:26:46:27 | 19 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:46:26:46:27 | 19 | params_flow.rb:5:10:5:10 | x | @@ -4712,6 +4753,7 @@ trackEnd | params_flow.rb:51:11:51:20 | ...[...] | params_flow.rb:51:11:51:20 | ...[...] | | params_flow.rb:51:11:51:20 | synthetic splat argument | params_flow.rb:51:11:51:20 | synthetic splat argument | | params_flow.rb:51:19:51:19 | 0 | params_flow.rb:51:19:51:19 | 0 | +| params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:50:5:52:21 | ... | | params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:52:5:52:21 | call to sink | | params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:55:1:55:29 | call to posargs | | params_flow.rb:52:5:52:21 | call to sink | params_flow.rb:58:1:58:25 | call to posargs | @@ -4737,6 +4779,7 @@ trackEnd | params_flow.rb:55:9:55:17 | synthetic splat argument | params_flow.rb:55:9:55:17 | synthetic splat argument | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:55:15:55:16 | 20 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:55:15:55:16 | 20 | params_flow.rb:5:10:5:10 | x | @@ -4755,6 +4798,7 @@ trackEnd | params_flow.rb:55:20:55:28 | synthetic splat argument | params_flow.rb:55:20:55:28 | synthetic splat argument | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:55:26:55:27 | 21 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:55:26:55:27 | 21 | params_flow.rb:5:10:5:10 | x | @@ -4793,6 +4837,7 @@ trackEnd | params_flow.rb:57:9:57:17 | synthetic splat argument | params_flow.rb:57:9:57:17 | synthetic splat argument | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:57:15:57:16 | 22 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:57:15:57:16 | 22 | params_flow.rb:5:10:5:10 | x | @@ -4813,6 +4858,7 @@ trackEnd | params_flow.rb:58:9:58:17 | synthetic splat argument | params_flow.rb:58:9:58:17 | synthetic splat argument | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:58:15:58:16 | 23 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:58:15:58:16 | 23 | params_flow.rb:5:10:5:10 | x | @@ -4860,6 +4906,7 @@ trackEnd | params_flow.rb:60:9:60:17 | synthetic splat argument | params_flow.rb:60:9:60:17 | synthetic splat argument | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:60:15:60:16 | 24 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:60:15:60:16 | 24 | params_flow.rb:5:10:5:10 | x | @@ -4878,6 +4925,7 @@ trackEnd | params_flow.rb:60:20:60:28 | synthetic splat argument | params_flow.rb:60:20:60:28 | synthetic splat argument | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:60:26:60:27 | 25 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:60:26:60:27 | 25 | params_flow.rb:5:10:5:10 | x | @@ -4901,6 +4949,7 @@ trackEnd | params_flow.rb:63:8:63:16 | synthetic splat argument | params_flow.rb:63:8:63:16 | synthetic splat argument | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:63:14:63:15 | 26 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:63:14:63:15 | 26 | params_flow.rb:5:10:5:10 | x | @@ -4924,6 +4973,7 @@ trackEnd | params_flow.rb:64:16:64:17 | *x | params_flow.rb:65:10:65:10 | x | | params_flow.rb:64:17:64:17 | x | params_flow.rb:64:17:64:17 | x | | params_flow.rb:65:5:65:13 | call to sink | params_flow.rb:65:5:65:13 | call to sink | +| params_flow.rb:65:5:65:13 | call to sink | params_flow.rb:65:5:65:33 | ... | | params_flow.rb:65:5:65:13 | call to sink | params_flow.rb:67:1:67:17 | call to splatstuff | | params_flow.rb:65:5:65:13 | synthetic splat argument | params_flow.rb:65:5:65:13 | synthetic splat argument | | params_flow.rb:65:10:65:13 | ...[...] | params_flow.rb:5:10:5:10 | x | @@ -5006,6 +5056,7 @@ trackEnd | params_flow.rb:73:12:73:12 | 1 | params_flow.rb:73:12:73:12 | 1 | | params_flow.rb:74:5:74:10 | call to sink | params_flow.rb:74:5:74:10 | call to sink | | params_flow.rb:74:5:74:10 | synthetic splat argument | params_flow.rb:74:5:74:10 | synthetic splat argument | +| params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:70:5:75:75 | ... | | params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:75:5:75:10 | call to sink | | params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:78:1:78:63 | call to splatmid | | params_flow.rb:75:5:75:10 | call to sink | params_flow.rb:81:1:81:37 | call to splatmid | @@ -5024,6 +5075,7 @@ trackEnd | params_flow.rb:78:10:78:18 | synthetic splat argument | params_flow.rb:78:10:78:18 | synthetic splat argument | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:16:78:17 | 27 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:78:16:78:17 | 27 | params_flow.rb:5:10:5:10 | x | @@ -5043,6 +5095,7 @@ trackEnd | params_flow.rb:78:21:78:29 | synthetic splat argument | params_flow.rb:78:21:78:29 | synthetic splat argument | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:27:78:28 | 28 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:78:27:78:28 | 28 | params_flow.rb:5:10:5:10 | x | @@ -5056,6 +5109,7 @@ trackEnd | params_flow.rb:78:32:78:40 | synthetic splat argument | params_flow.rb:78:32:78:40 | synthetic splat argument | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:38:78:39 | 29 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:78:32:78:40 | call to taint | | params_flow.rb:78:38:78:39 | 29 | params_flow.rb:78:38:78:39 | 29 | @@ -5063,6 +5117,7 @@ trackEnd | params_flow.rb:78:43:78:51 | synthetic splat argument | params_flow.rb:78:43:78:51 | synthetic splat argument | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:49:78:50 | 30 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:78:43:78:51 | call to taint | | params_flow.rb:78:49:78:50 | 30 | params_flow.rb:78:49:78:50 | 30 | @@ -5070,6 +5125,7 @@ trackEnd | params_flow.rb:78:54:78:62 | synthetic splat argument | params_flow.rb:78:54:78:62 | synthetic splat argument | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:78:60:78:61 | 31 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:78:54:78:62 | call to taint | | params_flow.rb:78:60:78:61 | 31 | params_flow.rb:78:60:78:61 | 31 | @@ -5106,6 +5162,7 @@ trackEnd | params_flow.rb:80:9:80:17 | synthetic splat argument | params_flow.rb:80:9:80:17 | synthetic splat argument | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:15:80:16 | 33 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:80:15:80:16 | 33 | params_flow.rb:5:10:5:10 | x | @@ -5119,6 +5176,7 @@ trackEnd | params_flow.rb:80:20:80:28 | synthetic splat argument | params_flow.rb:80:20:80:28 | synthetic splat argument | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:26:80:27 | 34 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:80:20:80:28 | call to taint | | params_flow.rb:80:26:80:27 | 34 | params_flow.rb:80:26:80:27 | 34 | @@ -5126,6 +5184,7 @@ trackEnd | params_flow.rb:80:31:80:39 | synthetic splat argument | params_flow.rb:80:31:80:39 | synthetic splat argument | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:37:80:38 | 35 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:80:31:80:39 | call to taint | | params_flow.rb:80:37:80:38 | 35 | params_flow.rb:80:37:80:38 | 35 | @@ -5133,6 +5192,7 @@ trackEnd | params_flow.rb:80:42:80:50 | synthetic splat argument | params_flow.rb:80:42:80:50 | synthetic splat argument | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:80:48:80:49 | 36 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:80:42:80:50 | call to taint | | params_flow.rb:80:48:80:49 | 36 | params_flow.rb:80:48:80:49 | 36 | @@ -5149,6 +5209,7 @@ trackEnd | params_flow.rb:81:10:81:18 | synthetic splat argument | params_flow.rb:81:10:81:18 | synthetic splat argument | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:81:16:81:17 | 32 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:81:16:81:17 | 32 | params_flow.rb:5:10:5:10 | x | @@ -5163,6 +5224,7 @@ trackEnd | params_flow.rb:81:28:81:36 | synthetic splat argument | params_flow.rb:81:28:81:36 | synthetic splat argument | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:81:34:81:35 | 37 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:81:28:81:36 | call to taint | | params_flow.rb:81:34:81:35 | 37 | params_flow.rb:81:34:81:35 | 37 | @@ -5242,6 +5304,7 @@ trackEnd | params_flow.rb:88:5:88:10 | synthetic splat argument | params_flow.rb:88:5:88:10 | synthetic splat argument | | params_flow.rb:89:5:89:10 | call to sink | params_flow.rb:89:5:89:10 | call to sink | | params_flow.rb:89:5:89:10 | synthetic splat argument | params_flow.rb:89:5:89:10 | synthetic splat argument | +| params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:84:5:90:39 | ... | | params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:90:5:90:10 | call to sink | | params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:94:1:94:48 | call to pos_many | | params_flow.rb:90:5:90:10 | call to sink | params_flow.rb:131:1:131:46 | call to pos_many | @@ -5279,6 +5342,7 @@ trackEnd | params_flow.rb:93:9:93:17 | synthetic splat argument | params_flow.rb:93:9:93:17 | synthetic splat argument | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:15:93:16 | 40 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:15:93:16 | 40 | params_flow.rb:5:10:5:10 | x | @@ -5298,6 +5362,7 @@ trackEnd | params_flow.rb:93:20:93:28 | synthetic splat argument | params_flow.rb:93:20:93:28 | synthetic splat argument | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:26:93:27 | 41 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:26:93:27 | 41 | params_flow.rb:5:10:5:10 | x | @@ -5317,6 +5382,7 @@ trackEnd | params_flow.rb:93:31:93:39 | synthetic splat argument | params_flow.rb:93:31:93:39 | synthetic splat argument | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:37:93:38 | 42 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:37:93:38 | 42 | params_flow.rb:5:10:5:10 | x | @@ -5336,6 +5402,7 @@ trackEnd | params_flow.rb:93:42:93:50 | synthetic splat argument | params_flow.rb:93:42:93:50 | synthetic splat argument | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:93:48:93:49 | 43 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:93:48:93:49 | 43 | params_flow.rb:5:10:5:10 | x | @@ -5358,6 +5425,7 @@ trackEnd | params_flow.rb:94:10:94:18 | synthetic splat argument | params_flow.rb:94:10:94:18 | synthetic splat argument | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:94:16:94:17 | 38 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:94:16:94:17 | 38 | params_flow.rb:5:10:5:10 | x | @@ -5377,6 +5445,7 @@ trackEnd | params_flow.rb:94:21:94:29 | synthetic splat argument | params_flow.rb:94:21:94:29 | synthetic splat argument | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:94:27:94:28 | 39 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:94:27:94:28 | 39 | params_flow.rb:5:10:5:10 | x | @@ -5391,6 +5460,7 @@ trackEnd | params_flow.rb:94:39:94:47 | synthetic splat argument | params_flow.rb:94:39:94:47 | synthetic splat argument | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:94:45:94:46 | 44 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:94:39:94:47 | call to taint | | params_flow.rb:94:45:94:46 | 44 | params_flow.rb:94:45:94:46 | 44 | @@ -5406,6 +5476,7 @@ trackEnd | params_flow.rb:96:10:96:18 | synthetic splat argument | params_flow.rb:96:10:96:18 | synthetic splat argument | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:16:96:17 | 45 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:96:16:96:17 | 45 | params_flow.rb:5:10:5:10 | x | @@ -5425,6 +5496,7 @@ trackEnd | params_flow.rb:96:21:96:29 | synthetic splat argument | params_flow.rb:96:21:96:29 | synthetic splat argument | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:27:96:28 | 46 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:96:27:96:28 | 46 | params_flow.rb:5:10:5:10 | x | @@ -5443,6 +5515,7 @@ trackEnd | params_flow.rb:96:34:96:42 | synthetic splat argument | params_flow.rb:96:34:96:42 | synthetic splat argument | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:40:96:41 | 47 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:96:34:96:42 | call to taint | | params_flow.rb:96:40:96:41 | 47 | params_flow.rb:96:40:96:41 | 47 | @@ -5450,6 +5523,7 @@ trackEnd | params_flow.rb:96:45:96:53 | synthetic splat argument | params_flow.rb:96:45:96:53 | synthetic splat argument | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:51:96:52 | 48 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:96:45:96:53 | call to taint | | params_flow.rb:96:51:96:52 | 48 | params_flow.rb:96:51:96:52 | 48 | @@ -5457,6 +5531,7 @@ trackEnd | params_flow.rb:96:56:96:64 | synthetic splat argument | params_flow.rb:96:56:96:64 | synthetic splat argument | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:62:96:63 | 49 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:96:56:96:64 | call to taint | | params_flow.rb:96:62:96:63 | 49 | params_flow.rb:96:62:96:63 | 49 | @@ -5464,6 +5539,7 @@ trackEnd | params_flow.rb:96:68:96:76 | synthetic splat argument | params_flow.rb:96:68:96:76 | synthetic splat argument | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:74:96:75 | 50 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:96:68:96:76 | call to taint | | params_flow.rb:96:74:96:75 | 50 | params_flow.rb:96:74:96:75 | 50 | @@ -5471,6 +5547,7 @@ trackEnd | params_flow.rb:96:79:96:87 | synthetic splat argument | params_flow.rb:96:79:96:87 | synthetic splat argument | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:96:85:96:86 | 51 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:96:79:96:87 | call to taint | | params_flow.rb:96:85:96:86 | 51 | params_flow.rb:96:85:96:86 | 51 | @@ -5523,6 +5600,7 @@ trackEnd | params_flow.rb:101:10:101:18 | ...[...] | params_flow.rb:101:10:101:18 | ...[...] | | params_flow.rb:101:10:101:18 | synthetic splat argument | params_flow.rb:101:10:101:18 | synthetic splat argument | | params_flow.rb:101:17:101:17 | 1 | params_flow.rb:101:17:101:17 | 1 | +| params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:99:5:102:57 | ... | | params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:102:5:102:10 | call to sink | | params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:105:1:105:49 | call to splatmidsmall | | params_flow.rb:102:5:102:10 | call to sink | params_flow.rb:106:1:106:46 | call to splatmidsmall | @@ -5539,6 +5617,7 @@ trackEnd | params_flow.rb:105:15:105:23 | synthetic splat argument | params_flow.rb:105:15:105:23 | synthetic splat argument | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:105:21:105:22 | 52 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:105:21:105:22 | 52 | params_flow.rb:5:10:5:10 | x | @@ -5557,6 +5636,7 @@ trackEnd | params_flow.rb:105:28:105:36 | synthetic splat argument | params_flow.rb:105:28:105:36 | synthetic splat argument | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:105:34:105:35 | 53 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:105:28:105:36 | call to taint | | params_flow.rb:105:34:105:35 | 53 | params_flow.rb:105:34:105:35 | 53 | @@ -5564,6 +5644,7 @@ trackEnd | params_flow.rb:105:39:105:47 | synthetic splat argument | params_flow.rb:105:39:105:47 | synthetic splat argument | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:105:45:105:46 | 54 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:105:39:105:47 | call to taint | | params_flow.rb:105:45:105:46 | 54 | params_flow.rb:105:45:105:46 | 54 | @@ -5580,6 +5661,7 @@ trackEnd | params_flow.rb:106:15:106:23 | synthetic splat argument | params_flow.rb:106:15:106:23 | synthetic splat argument | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:106:21:106:22 | 55 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:106:21:106:22 | 55 | params_flow.rb:5:10:5:10 | x | @@ -5593,6 +5675,7 @@ trackEnd | params_flow.rb:106:26:106:34 | synthetic splat argument | params_flow.rb:106:26:106:34 | synthetic splat argument | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:106:32:106:33 | 56 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:106:26:106:34 | call to taint | | params_flow.rb:106:32:106:33 | 56 | params_flow.rb:106:32:106:33 | 56 | @@ -5600,6 +5683,7 @@ trackEnd | params_flow.rb:106:37:106:45 | synthetic splat argument | params_flow.rb:106:37:106:45 | synthetic splat argument | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:106:43:106:44 | 57 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:106:37:106:45 | call to taint | | params_flow.rb:106:43:106:44 | 57 | params_flow.rb:106:43:106:44 | 57 | @@ -5643,6 +5727,7 @@ trackEnd | params_flow.rb:110:10:110:13 | ...[...] | params_flow.rb:110:10:110:13 | ...[...] | | params_flow.rb:110:10:110:13 | synthetic splat argument | params_flow.rb:110:10:110:13 | synthetic splat argument | | params_flow.rb:110:12:110:12 | 0 | params_flow.rb:110:12:110:12 | 0 | +| params_flow.rb:111:5:111:10 | call to sink | params_flow.rb:109:5:111:30 | ... | | params_flow.rb:111:5:111:10 | call to sink | params_flow.rb:111:5:111:10 | call to sink | | params_flow.rb:111:5:111:10 | call to sink | params_flow.rb:114:1:114:67 | call to splat_followed_by_keyword_param | | params_flow.rb:111:5:111:10 | synthetic splat argument | params_flow.rb:111:5:111:10 | synthetic splat argument | @@ -5660,6 +5745,7 @@ trackEnd | params_flow.rb:114:33:114:41 | synthetic splat argument | params_flow.rb:114:33:114:41 | synthetic splat argument | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:114:39:114:40 | 58 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:114:39:114:40 | 58 | params_flow.rb:5:10:5:10 | x | @@ -5677,6 +5763,7 @@ trackEnd | params_flow.rb:114:44:114:52 | synthetic splat argument | params_flow.rb:114:44:114:52 | synthetic splat argument | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:114:50:114:51 | 59 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:114:50:114:51 | 59 | params_flow.rb:5:10:5:10 | x | @@ -5696,6 +5783,7 @@ trackEnd | params_flow.rb:114:58:114:66 | synthetic splat argument | params_flow.rb:114:58:114:66 | synthetic splat argument | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:114:64:114:65 | 60 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:114:64:114:65 | 60 | params_flow.rb:5:10:5:10 | x | @@ -5747,6 +5835,7 @@ trackEnd | params_flow.rb:117:19:117:27 | synthetic splat argument | params_flow.rb:117:19:117:27 | synthetic splat argument | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:117:25:117:26 | 61 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:117:25:117:26 | 61 | params_flow.rb:5:10:5:10 | x | @@ -5816,6 +5905,7 @@ trackEnd | params_flow.rb:123:5:123:10 | synthetic splat argument | params_flow.rb:123:5:123:10 | synthetic splat argument | | params_flow.rb:124:5:124:10 | call to sink | params_flow.rb:124:5:124:10 | call to sink | | params_flow.rb:124:5:124:10 | synthetic splat argument | params_flow.rb:124:5:124:10 | synthetic splat argument | +| params_flow.rb:125:5:125:10 | call to sink | params_flow.rb:121:5:125:39 | ... | | params_flow.rb:125:5:125:10 | call to sink | params_flow.rb:125:5:125:10 | call to sink | | params_flow.rb:125:5:125:10 | call to sink | params_flow.rb:128:1:128:61 | call to destruct | | params_flow.rb:125:5:125:10 | synthetic splat argument | params_flow.rb:125:5:125:10 | synthetic splat argument | @@ -5829,6 +5919,7 @@ trackEnd | params_flow.rb:128:11:128:19 | synthetic splat argument | params_flow.rb:128:11:128:19 | synthetic splat argument | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:17:128:18 | 62 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:128:11:128:19 | call to taint | | params_flow.rb:128:17:128:18 | 62 | params_flow.rb:128:17:128:18 | 62 | @@ -5836,6 +5927,7 @@ trackEnd | params_flow.rb:128:22:128:30 | synthetic splat argument | params_flow.rb:128:22:128:30 | synthetic splat argument | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:28:128:29 | 63 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:128:22:128:30 | call to taint | | params_flow.rb:128:28:128:29 | 63 | params_flow.rb:128:28:128:29 | 63 | @@ -5847,6 +5939,7 @@ trackEnd | params_flow.rb:128:35:128:43 | synthetic splat argument | params_flow.rb:128:35:128:43 | synthetic splat argument | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:41:128:42 | 64 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:128:35:128:43 | call to taint | | params_flow.rb:128:41:128:42 | 64 | params_flow.rb:128:41:128:42 | 64 | @@ -5859,6 +5952,7 @@ trackEnd | params_flow.rb:128:50:128:58 | synthetic splat argument | params_flow.rb:128:50:128:58 | synthetic splat argument | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:128:56:128:57 | 65 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:128:50:128:58 | call to taint | | params_flow.rb:128:56:128:57 | 65 | params_flow.rb:128:56:128:57 | 65 | @@ -5895,6 +5989,7 @@ trackEnd | params_flow.rb:130:9:130:17 | synthetic splat argument | params_flow.rb:130:9:130:17 | synthetic splat argument | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:130:15:130:16 | 66 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:130:15:130:16 | 66 | params_flow.rb:5:10:5:10 | x | @@ -5914,6 +6009,7 @@ trackEnd | params_flow.rb:130:20:130:28 | synthetic splat argument | params_flow.rb:130:20:130:28 | synthetic splat argument | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:130:26:130:27 | 67 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:130:26:130:27 | 67 | params_flow.rb:5:10:5:10 | x | @@ -5930,6 +6026,7 @@ trackEnd | params_flow.rb:131:17:131:25 | synthetic splat argument | params_flow.rb:131:17:131:25 | synthetic splat argument | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:131:23:131:24 | 68 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:131:17:131:25 | call to taint | | params_flow.rb:131:23:131:24 | 68 | params_flow.rb:131:23:131:24 | 68 | @@ -5950,6 +6047,7 @@ trackEnd | params_flow.rb:133:14:133:18 | *args | params_flow.rb:134:10:134:13 | args | | params_flow.rb:133:15:133:18 | args | params_flow.rb:133:15:133:18 | args | | params_flow.rb:134:5:134:16 | call to sink | params_flow.rb:134:5:134:16 | call to sink | +| params_flow.rb:134:5:134:16 | call to sink | params_flow.rb:134:5:134:36 | ... | | params_flow.rb:134:5:134:16 | call to sink | params_flow.rb:137:1:137:44 | call to splatall | | params_flow.rb:134:5:134:16 | synthetic splat argument | params_flow.rb:134:5:134:16 | synthetic splat argument | | params_flow.rb:134:10:134:16 | ...[...] | params_flow.rb:5:10:5:10 | x | @@ -5971,6 +6069,7 @@ trackEnd | params_flow.rb:137:12:137:20 | synthetic splat argument | params_flow.rb:137:12:137:20 | synthetic splat argument | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:137:18:137:19 | 69 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:137:12:137:20 | call to taint | | params_flow.rb:137:18:137:19 | 69 | params_flow.rb:137:18:137:19 | 69 | @@ -5982,6 +6081,7 @@ trackEnd | params_flow.rb:137:23:137:31 | synthetic splat argument | params_flow.rb:137:23:137:31 | synthetic splat argument | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:137:29:137:30 | 70 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:137:29:137:30 | 70 | params_flow.rb:5:10:5:10 | x | @@ -5993,6 +6093,7 @@ trackEnd | params_flow.rb:137:34:137:42 | synthetic splat argument | params_flow.rb:137:34:137:42 | synthetic splat argument | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:137:40:137:41 | 71 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:137:34:137:42 | call to taint | | params_flow.rb:137:40:137:41 | 71 | params_flow.rb:137:40:137:41 | 71 | @@ -6007,6 +6108,7 @@ trackEnd | params_flow.rb:140:5:140:15 | ...[...] | params_flow.rb:140:5:140:15 | ...[...] | | params_flow.rb:140:5:140:15 | [post] ...[...] | params_flow.rb:140:5:140:15 | [post] ...[...] | | params_flow.rb:140:5:140:15 | synthetic splat argument | params_flow.rb:140:5:140:15 | synthetic splat argument | +| params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:140:5:140:38 | ... | | params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:140:5:140:38 | call to insert | | params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:145:1:145:29 | call to hashSplatSideEffect | | params_flow.rb:140:5:140:38 | call to insert | params_flow.rb:150:1:150:42 | call to hashSplatSideEffect | @@ -6045,6 +6147,7 @@ trackEnd | params_flow.rb:143:24:143:32 | synthetic splat argument | params_flow.rb:143:24:143:32 | synthetic splat argument | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:143:30:143:31 | 72 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:140:27:140:37 | ...[...] | | params_flow.rb:143:30:143:31 | 72 | params_flow.rb:143:24:143:32 | call to taint | @@ -6109,6 +6212,7 @@ trackEnd | params_flow.rb:150:33:150:41 | synthetic splat argument | params_flow.rb:150:33:150:41 | synthetic splat argument | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:150:39:150:40 | 73 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:140:27:140:37 | ...[...] | | params_flow.rb:150:39:150:40 | 73 | params_flow.rb:150:33:150:41 | call to taint | @@ -6134,6 +6238,7 @@ trackEnd | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:153:28:153:29 | p2 | | params_flow.rb:153:28:153:29 | p2 | params_flow.rb:154:18:154:19 | p2 | | params_flow.rb:154:5:154:6 | [post] p1 | params_flow.rb:154:5:154:6 | [post] p1 | +| params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:154:5:154:20 | ... | | params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:154:5:154:20 | call to insert | | params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:159:1:159:27 | call to keywordSideEffect | | params_flow.rb:154:5:154:20 | call to insert | params_flow.rb:164:1:164:40 | call to keywordSideEffect | @@ -6172,6 +6277,7 @@ trackEnd | params_flow.rb:157:24:157:32 | synthetic splat argument | params_flow.rb:157:24:157:32 | synthetic splat argument | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:157:30:157:31 | 74 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:153:28:153:29 | p2 | | params_flow.rb:157:30:157:31 | 74 | params_flow.rb:153:28:153:29 | p2 | @@ -6235,6 +6341,7 @@ trackEnd | params_flow.rb:164:31:164:39 | synthetic splat argument | params_flow.rb:164:31:164:39 | synthetic splat argument | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:164:37:164:38 | 75 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:153:28:153:29 | p2 | | params_flow.rb:164:37:164:38 | 75 | params_flow.rb:153:28:153:29 | p2 | @@ -6260,6 +6367,7 @@ trackEnd | params_flow.rb:168:5:168:14 | ...[...] | params_flow.rb:168:5:168:14 | ...[...] | | params_flow.rb:168:5:168:14 | [post] ...[...] | params_flow.rb:168:5:168:14 | [post] ...[...] | | params_flow.rb:168:5:168:14 | synthetic splat argument | params_flow.rb:168:5:168:14 | synthetic splat argument | +| params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:168:5:168:36 | ... | | params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:168:5:168:36 | call to insert | | params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:173:1:173:25 | call to splatSideEffect | | params_flow.rb:168:5:168:36 | call to insert | params_flow.rb:178:1:178:30 | call to splatSideEffect | @@ -6296,6 +6404,7 @@ trackEnd | params_flow.rb:171:17:171:25 | synthetic splat argument | params_flow.rb:171:17:171:25 | synthetic splat argument | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:171:23:171:24 | 76 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:168:26:168:35 | ...[...] | | params_flow.rb:171:23:171:24 | 76 | params_flow.rb:171:17:171:25 | call to taint | @@ -6356,6 +6465,7 @@ trackEnd | params_flow.rb:178:21:178:29 | synthetic splat argument | params_flow.rb:178:21:178:29 | synthetic splat argument | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:178:27:178:28 | 77 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:168:26:168:35 | ...[...] | | params_flow.rb:178:27:178:28 | 77 | params_flow.rb:178:21:178:29 | call to taint | @@ -6381,6 +6491,7 @@ trackEnd | params_flow.rb:181:28:181:29 | p2 | params_flow.rb:181:28:181:29 | p2 | | params_flow.rb:181:28:181:29 | p2 | params_flow.rb:182:18:182:19 | p2 | | params_flow.rb:182:5:182:6 | [post] p1 | params_flow.rb:182:5:182:6 | [post] p1 | +| params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:182:5:182:20 | ... | | params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:182:5:182:20 | call to insert | | params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:187:1:187:25 | call to positionSideEffect | | params_flow.rb:182:5:182:20 | call to insert | params_flow.rb:192:1:192:33 | call to positionSideEffect | @@ -6421,6 +6532,7 @@ trackEnd | params_flow.rb:185:14:185:22 | synthetic splat argument | params_flow.rb:185:14:185:22 | synthetic splat argument | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:185:20:185:21 | 78 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:181:28:181:29 | p2 | | params_flow.rb:185:20:185:21 | 78 | params_flow.rb:181:28:181:29 | p2 | @@ -6480,6 +6592,7 @@ trackEnd | params_flow.rb:192:24:192:32 | synthetic splat argument | params_flow.rb:192:24:192:32 | synthetic splat argument | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:192:30:192:31 | 79 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:181:28:181:29 | p2 | | params_flow.rb:192:30:192:31 | 79 | params_flow.rb:181:28:181:29 | p2 | @@ -6524,6 +6637,7 @@ trackEnd | params_flow.rb:196:10:196:18 | synthetic splat argument | params_flow.rb:196:10:196:18 | synthetic splat argument | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:196:16:196:17 | 80 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:196:10:196:18 | call to taint | | params_flow.rb:196:16:196:17 | 80 | params_flow.rb:196:16:196:17 | 80 | @@ -6587,6 +6701,7 @@ trackEnd | params_flow.rb:203:11:203:14 | ...[...] | params_flow.rb:203:11:203:14 | ...[...] | | params_flow.rb:203:11:203:14 | synthetic splat argument | params_flow.rb:203:11:203:14 | synthetic splat argument | | params_flow.rb:203:13:203:13 | 0 | params_flow.rb:203:13:203:13 | 0 | +| params_flow.rb:204:5:204:15 | call to sink | params_flow.rb:201:5:204:15 | ... | | params_flow.rb:204:5:204:15 | call to sink | params_flow.rb:204:5:204:15 | call to sink | | params_flow.rb:204:5:204:15 | call to sink | params_flow.rb:207:1:207:14 | call to foo | | params_flow.rb:204:5:204:15 | synthetic splat argument | params_flow.rb:204:5:204:15 | synthetic splat argument | @@ -6681,7 +6796,9 @@ trackEnd | params_flow.rb:216:14:216:24 | synthetic splat argument | params_flow.rb:216:14:216:24 | synthetic splat argument | | params_flow.rb:216:21:216:23 | :k2 | params_flow.rb:216:21:216:23 | :k2 | | params_flow.rb:217:9:217:23 | synthetic splat argument | params_flow.rb:217:9:217:23 | synthetic splat argument | +| params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:211:9:217:23 | ... | | params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:217:9:217:23 | yield ... | +| params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:217:9:217:23 | yield ... | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:217:9:217:23 | yield block argument | params_flow.rb:217:9:217:23 | yield block argument | @@ -6695,6 +6812,7 @@ trackEnd | params_flow.rb:217:15:217:23 | synthetic splat argument | params_flow.rb:217:15:217:23 | synthetic splat argument | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:217:21:217:22 | 86 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:217:21:217:22 | 86 | params_flow.rb:5:10:5:10 | x | @@ -6760,6 +6878,7 @@ trackEnd | params_flow.rb:223:9:223:13 | ** ... | params_flow.rb:223:9:223:13 | ** ... | | params_flow.rb:223:9:223:13 | Pair | params_flow.rb:223:9:223:13 | Pair | | params_flow.rb:223:9:223:13 | k1 | params_flow.rb:223:9:223:13 | k1 | +| params_flow.rb:223:9:223:13 | super call to m | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:223:9:223:13 | super call to m | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:223:9:223:13 | super call to m | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:223:9:223:13 | synthetic hash-splat argument | params_flow.rb:210:26:210:33 | **kwargs | @@ -6793,6 +6912,7 @@ trackEnd | params_flow.rb:227:11:227:19 | synthetic splat argument | params_flow.rb:227:11:227:19 | synthetic splat argument | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:17:227:18 | 81 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:17:227:18 | 81 | params_flow.rb:5:10:5:10 | x | @@ -6813,6 +6933,7 @@ trackEnd | params_flow.rb:227:22:227:30 | synthetic splat argument | params_flow.rb:227:22:227:30 | synthetic splat argument | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:28:227:29 | 82 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:28:227:29 | 82 | params_flow.rb:5:10:5:10 | x | @@ -6833,6 +6954,7 @@ trackEnd | params_flow.rb:227:36:227:44 | synthetic splat argument | params_flow.rb:227:36:227:44 | synthetic splat argument | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:42:227:43 | 83 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:42:227:43 | 83 | params_flow.rb:5:10:5:10 | x | @@ -6855,6 +6977,7 @@ trackEnd | params_flow.rb:227:51:227:59 | synthetic splat argument | params_flow.rb:227:51:227:59 | synthetic splat argument | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:57:227:58 | 84 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:57:227:58 | 84 | params_flow.rb:5:10:5:10 | x | @@ -6877,6 +7000,7 @@ trackEnd | params_flow.rb:227:66:227:74 | synthetic splat argument | params_flow.rb:227:66:227:74 | synthetic splat argument | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:1:11:1:11 | x | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:1:11:1:11 | x | +| params_flow.rb:227:72:227:73 | 85 | params_flow.rb:2:5:2:5 | ... | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:2:5:2:5 | x | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:5:10:5:10 | x | | params_flow.rb:227:72:227:73 | 85 | params_flow.rb:5:10:5:10 | x | @@ -6902,10 +7026,13 @@ trackEnd | params_flow.rb:227:81:227:81 | x | params_flow.rb:227:81:227:81 | x | | params_flow.rb:227:81:227:81 | x | params_flow.rb:227:81:227:81 | x | | params_flow.rb:227:81:227:81 | x | params_flow.rb:228:10:228:10 | x | +| params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:211:9:217:23 | ... | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:217:9:217:23 | yield ... | +| params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:223:9:223:13 | ... | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:223:9:223:13 | super call to m | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:227:1:229:3 | call to m | | params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:228:5:228:11 | call to sink | +| params_flow.rb:228:5:228:11 | call to sink | params_flow.rb:228:5:228:31 | ... | | params_flow.rb:228:5:228:11 | synthetic splat argument | params_flow.rb:228:5:228:11 | synthetic splat argument | forwardButNoBackwardFlow backwardButNoForwardFlow diff --git a/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected b/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected index 7b308c6816cd..bfecc4ec629d 100644 --- a/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected +++ b/ruby/ql/test/library-tests/dataflow/type-tracker/TypeTracker.expected @@ -360,9 +360,11 @@ trackEnd | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:2:16:2:18 | val | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:2:16:2:18 | val | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:2:16:2:18 | val | +| type_tracker.rb:2:16:2:18 | val | type_tracker.rb:3:9:4:20 | ... | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:3:14:3:23 | call to field | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:4:9:4:20 | ... = ... | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:4:18:4:20 | val | +| type_tracker.rb:2:16:2:18 | val | type_tracker.rb:8:9:8:14 | ... | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:8:9:8:14 | @field | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:14:5:14:13 | call to field= | | type_tracker.rb:2:16:2:18 | val | type_tracker.rb:15:10:15:18 | call to field | @@ -377,6 +379,7 @@ trackEnd | type_tracker.rb:7:5:9:7 | self in field | type_tracker.rb:7:5:9:7 | self in field | | type_tracker.rb:7:5:9:7 | self in field | type_tracker.rb:8:9:8:14 | self | | type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:3:14:3:23 | call to field | +| type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:8:9:8:14 | ... | | type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:8:9:8:14 | @field | | type_tracker.rb:8:9:8:14 | @field | type_tracker.rb:15:10:15:18 | call to field | | type_tracker.rb:12:1:16:3 | &block | type_tracker.rb:12:1:16:3 | &block | @@ -408,8 +411,10 @@ trackEnd | type_tracker.rb:14:5:14:13 | synthetic splat argument | type_tracker.rb:14:5:14:13 | synthetic splat argument | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:2:16:2:18 | val | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:2:16:2:18 | val | +| type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:3:9:4:20 | ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:4:9:4:20 | ... = ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:4:18:4:20 | val | +| type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:8:9:8:14 | ... | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:8:9:8:14 | @field | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:5:14:13 | __synth__0 | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:5:14:13 | call to field= | @@ -419,6 +424,7 @@ trackEnd | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:14:17:14:23 | __synth__0 | | type_tracker.rb:14:17:14:23 | "hello" | type_tracker.rb:15:10:15:18 | call to field | | type_tracker.rb:14:17:14:23 | __synth__0 | type_tracker.rb:14:17:14:23 | __synth__0 | +| type_tracker.rb:15:5:15:18 | call to puts | type_tracker.rb:13:5:15:18 | ... | | type_tracker.rb:15:5:15:18 | call to puts | type_tracker.rb:15:5:15:18 | call to puts | | type_tracker.rb:15:5:15:18 | synthetic splat argument | type_tracker.rb:15:5:15:18 | synthetic splat argument | | type_tracker.rb:15:10:15:18 | call to field | type_tracker.rb:15:10:15:18 | call to field | @@ -439,6 +445,7 @@ trackEnd | type_tracker.rb:18:20:18:21 | p2 | type_tracker.rb:20:10:20:11 | p2 | | type_tracker.rb:19:5:19:11 | call to puts | type_tracker.rb:19:5:19:11 | call to puts | | type_tracker.rb:19:5:19:11 | synthetic splat argument | type_tracker.rb:19:5:19:11 | synthetic splat argument | +| type_tracker.rb:20:5:20:11 | call to puts | type_tracker.rb:19:5:20:11 | ... | | type_tracker.rb:20:5:20:11 | call to puts | type_tracker.rb:20:5:20:11 | call to puts | | type_tracker.rb:20:5:20:11 | call to puts | type_tracker.rb:23:1:23:16 | call to positional | | type_tracker.rb:20:5:20:11 | synthetic splat argument | type_tracker.rb:20:5:20:11 | synthetic splat argument | @@ -469,6 +476,7 @@ trackEnd | type_tracker.rb:25:18:25:19 | p2 | type_tracker.rb:27:10:27:11 | p2 | | type_tracker.rb:26:5:26:11 | call to puts | type_tracker.rb:26:5:26:11 | call to puts | | type_tracker.rb:26:5:26:11 | synthetic splat argument | type_tracker.rb:26:5:26:11 | synthetic splat argument | +| type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:26:5:27:11 | ... | | type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:27:5:27:11 | call to puts | | type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:30:1:30:21 | call to keyword | | type_tracker.rb:27:5:27:11 | call to puts | type_tracker.rb:31:1:31:21 | call to keyword | @@ -523,6 +531,7 @@ trackEnd | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:34:18:34:20 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:34:18:34:20 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:34:18:34:20 | obj | +| type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:35:12:35:14 | obj | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:36:5:36:10 | ...[...] | | type_tracker.rb:34:18:34:20 | obj | type_tracker.rb:39:5:39:12 | __synth__0 | @@ -679,16 +688,22 @@ trackEnd | type_tracker.rb:50:14:50:26 | synthetic splat argument | type_tracker.rb:50:14:50:26 | synthetic splat argument | | type_tracker.rb:50:14:50:26 | synthetic splat argument | type_tracker.rb:51:5:51:10 | array4 | | type_tracker.rb:50:14:50:26 | synthetic splat argument | type_tracker.rb:52:5:52:10 | array4 | +| type_tracker.rb:50:15:50:15 | 1 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:15:50:15 | 1 | type_tracker.rb:50:15:50:15 | 1 | | type_tracker.rb:50:15:50:15 | 1 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:17:50:17 | 2 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:17:50:17 | 2 | type_tracker.rb:50:17:50:17 | 2 | | type_tracker.rb:50:17:50:17 | 2 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:19:50:19 | 3 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:19:50:19 | 3 | type_tracker.rb:50:19:50:19 | 3 | | type_tracker.rb:50:19:50:19 | 3 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:21:50:21 | 4 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:21:50:21 | 4 | type_tracker.rb:50:21:50:21 | 4 | | type_tracker.rb:50:21:50:21 | 4 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:23:50:23 | 5 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:23:50:23 | 5 | type_tracker.rb:50:23:50:23 | 5 | | type_tracker.rb:50:23:50:23 | 5 | type_tracker.rb:52:5:52:13 | ...[...] | +| type_tracker.rb:50:25:50:25 | 6 | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:50:25:50:25 | 6 | type_tracker.rb:50:25:50:25 | 6 | | type_tracker.rb:50:25:50:25 | 6 | type_tracker.rb:52:5:52:13 | ...[...] | | type_tracker.rb:51:5:51:10 | [post] array4 | type_tracker.rb:51:5:51:10 | [post] array4 | @@ -696,6 +711,7 @@ trackEnd | type_tracker.rb:51:5:51:13 | call to []= | type_tracker.rb:51:5:51:13 | call to []= | | type_tracker.rb:51:5:51:13 | synthetic splat argument | type_tracker.rb:51:5:51:13 | synthetic splat argument | | type_tracker.rb:51:17:51:19 | __synth__0 | type_tracker.rb:51:17:51:19 | __synth__0 | +| type_tracker.rb:52:5:52:13 | ...[...] | type_tracker.rb:35:5:52:13 | ... | | type_tracker.rb:52:5:52:13 | ...[...] | type_tracker.rb:52:5:52:13 | ...[...] | | type_tracker.rb:52:5:52:13 | synthetic splat argument | type_tracker.rb:52:5:52:13 | synthetic splat argument | forwardButNoBackwardFlow diff --git a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected index 6b6fdbf22fac..1a78fc816ad9 100644 --- a/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected +++ b/ruby/ql/test/library-tests/frameworks/active_record/ActiveRecord.expected @@ -7,8 +7,10 @@ activeRecordModelClasses | associations.rb:11:1:13:3 | Tag | | associations.rb:15:1:17:3 | Comment | activeRecordInstances +| ActiveRecord.rb:9:5:9:68 | ... | | ActiveRecord.rb:9:5:9:68 | call to find | | ActiveRecord.rb:13:5:13:40 | call to find_by | +| ActiveRecord.rb:13:5:13:46 | ... | | ActiveRecord.rb:13:5:13:46 | call to users | | ActiveRecord.rb:16:3:31:5 | self (exec) | | ActiveRecord.rb:16:3:31:5 | self in exec | @@ -28,14 +30,19 @@ activeRecordInstances | ActiveRecord.rb:30:5:30:14 | self | | ActiveRecord.rb:52:5:52:51 | call to authenticate | | ActiveRecord.rb:53:5:53:30 | call to find_by_name | +| ActiveRecord.rb:67:5:79:34 | ... | | ActiveRecord.rb:72:5:74:7 | if ... | | ActiveRecord.rb:72:43:73:40 | then ... | | ActiveRecord.rb:73:7:73:40 | call to find_by | | ActiveRecord.rb:77:5:77:33 | call to find_by | | ActiveRecord.rb:79:5:79:34 | call to find | +| ActiveRecord.rb:89:5:89:24 | ... | | ActiveRecord.rb:89:5:89:24 | call to create | +| ActiveRecord.rb:93:5:93:66 | ... | | ActiveRecord.rb:93:5:93:66 | call to create | +| ActiveRecord.rb:97:5:97:68 | ... | | ActiveRecord.rb:97:5:97:68 | call to create | +| ActiveRecord.rb:101:5:101:16 | ... | | ActiveRecord.rb:101:5:101:16 | call to create | | associations.rb:19:1:19:7 | author1 | | associations.rb:19:1:19:20 | ... = ... | From c42cd270ca9c189682f3dc83e398b62b849bc3c2 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 11 Aug 2026 11:32:55 +0200 Subject: [PATCH 061/181] Ruby: Accept new nodes in END block. --- ruby/ql/test/library-tests/controlflow/graph/Nodes.expected | 1 + 1 file changed, 1 insertion(+) diff --git a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected index 1bb35e0987c9..3d0f3d6db8a1 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Nodes.expected @@ -107,6 +107,7 @@ positionalArguments | cfg.rb:9:1:9:21 | call to [] | cfg.rb:9:14:9:20 | "another" | | cfg.rb:12:3:12:8 | call to puts | cfg.rb:12:8:12:8 | 4 | | cfg.rb:16:3:16:14 | call to puts | cfg.rb:16:8:16:14 | "hello" | +| cfg.rb:20:3:20:14 | call to puts | cfg.rb:20:8:20:14 | "world" | | cfg.rb:23:1:23:6 | ... + ... | cfg.rb:23:6:23:6 | 1 | | cfg.rb:25:15:25:20 | call to puts | cfg.rb:25:20:25:20 | x | | cfg.rb:27:1:27:11 | call to puts | cfg.rb:27:6:27:11 | &... | From 958438252caf57cd4e796c2e631428f129d078dc Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 11 Aug 2026 11:43:07 +0200 Subject: [PATCH 062/181] Ruby: Accept location changes for SSA. --- .../test/library-tests/variables/ssa.expected | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/ruby/ql/test/library-tests/variables/ssa.expected b/ruby/ql/test/library-tests/variables/ssa.expected index 69222157b05a..dfea893b9490 100644 --- a/ruby/ql/test/library-tests/variables/ssa.expected +++ b/ruby/ql/test/library-tests/variables/ssa.expected @@ -38,7 +38,7 @@ definition | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | -| nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | +| nested_scopes.rb:30:7:33:9 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | | parameters.rb:1:1:62:1 | self (parameters.rb) | parameters.rb:1:1:62:1 | self | @@ -81,7 +81,7 @@ definition | parameters.rb:54:9:57:3 | x | parameters.rb:53:1:53:1 | x | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | | parameters.rb:54:19:54:19 | x | parameters.rb:53:1:53:1 | x | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | +| parameters.rb:55:4:56:9 | phi | parameters.rb:53:1:53:1 | x | | parameters.rb:59:1:61:3 | self (tuples_nested) | parameters.rb:59:1:61:3 | self | | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | | parameters.rb:59:23:59:23 | b | parameters.rb:59:23:59:23 | b | @@ -125,7 +125,7 @@ definition | ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | | ssa.rb:21:5:21:5 | x | ssa.rb:18:8:18:8 | x | | ssa.rb:25:1:30:3 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | @@ -227,7 +227,7 @@ read | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:23:16:23:16 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:11:28:16 | self | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:16:28:16 | self | -| nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | +| nested_scopes.rb:30:7:33:9 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:3:4:3:9 | self | @@ -268,7 +268,7 @@ read | parameters.rb:54:9:57:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:55:4:55:9 | self | | parameters.rb:54:9:57:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:56:4:56:9 | self | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | +| parameters.rb:55:4:56:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | | parameters.rb:59:1:61:3 | self (tuples_nested) | parameters.rb:59:1:61:3 | self | parameters.rb:60:3:60:23 | self | | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | parameters.rb:60:11:60:11 | a | | parameters.rb:59:23:59:23 | b | parameters.rb:59:23:59:23 | b | parameters.rb:60:16:60:16 | b | @@ -339,9 +339,9 @@ read | ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | | ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:12:10:12:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:25:1:30:3 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | ssa.rb:29:3:29:11 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | ssa.rb:26:15:26:22 | elements | @@ -430,7 +430,7 @@ firstRead | nested_scopes.rb:22:9:24:11 | self (show_a2) | nested_scopes.rb:22:9:24:11 | self | nested_scopes.rb:23:11:23:16 | self | | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:23:16:23:16 | a | | nested_scopes.rb:27:7:29:9 | self (show) | nested_scopes.rb:27:7:29:9 | self | nested_scopes.rb:28:11:28:16 | self | -| nested_scopes.rb:30:16:30:19 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | +| nested_scopes.rb:30:7:33:9 | self (class << ...) | nested_scopes.rb:30:7:33:9 | self | nested_scopes.rb:32:11:32:16 | self | | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:31:11:31:11 | a | nested_scopes.rb:32:16:32:16 | a | | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:40:1:40:1 | d | nested_scopes.rb:41:1:41:1 | d | | parameters.rb:1:9:5:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:3:4:3:9 | self | @@ -467,7 +467,7 @@ firstRead | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b | | parameters.rb:54:9:57:3 | self | parameters.rb:1:1:62:1 | self | parameters.rb:55:4:55:9 | self | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | +| parameters.rb:55:4:56:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | | parameters.rb:59:1:61:3 | self (tuples_nested) | parameters.rb:59:1:61:3 | self | parameters.rb:60:3:60:23 | self | | parameters.rb:59:20:59:20 | a | parameters.rb:59:20:59:20 | a | parameters.rb:60:11:60:11 | a | | parameters.rb:59:23:59:23 | b | parameters.rb:59:23:59:23 | b | parameters.rb:60:16:60:16 | b | @@ -509,7 +509,7 @@ firstRead | ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | | ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | | ssa.rb:25:1:30:3 | elem | ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:25:1:30:3 | self (m2) | ssa.rb:25:1:30:3 | self | ssa.rb:29:3:29:11 | self | | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | ssa.rb:26:15:26:22 | elements | @@ -605,8 +605,8 @@ adjacentReads | ssa.rb:6:5:6:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:7:10:7:10 | i | ssa.rb:8:10:8:10 | i | | ssa.rb:10:5:10:5 | i | ssa.rb:2:3:2:3 | i | ssa.rb:11:10:11:10 | i | ssa.rb:12:10:12:10 | i | | ssa.rb:18:1:23:3 | self (m1) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | ssa.rb:20:5:20:10 | self | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | ssa.rb:20:10:20:10 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | ssa.rb:21:5:21:5 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:19:9:19:9 | x | ssa.rb:20:10:20:10 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:39:3:39:9 | self | ssa.rb:39:8:39:9 | self | | ssa.rb:38:1:42:3 | self (m4) | ssa.rb:38:1:42:3 | self | ssa.rb:39:8:39:9 | self | ssa.rb:41:3:41:13 | self | | ssa.rb:66:11:70:5 | captured | ssa.rb:65:3:65:10 | captured | ssa.rb:68:10:68:17 | captured | ssa.rb:69:5:69:12 | captured | @@ -624,12 +624,12 @@ phi | parameters.rb:37:3:37:18 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:16 | b | | parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | e | | parameters.rb:42:3:42:18 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:15 | e | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:9:57:3 | x | -| parameters.rb:55:4:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:19 | x | +| parameters.rb:55:4:56:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:9:57:3 | x | +| parameters.rb:55:4:56:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:19 | x | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:6:5:6:5 | i | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:10:5:10:5 | i | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | -| ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | +| ssa.rb:19:3:22:5 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:26:7:26:10 | phi | ssa.rb:26:7:26:10 | elem | ssa.rb:25:1:30:3 | elem | | ssa.rb:26:7:26:10 | phi | ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:44:1:47:3 | x | @@ -637,28 +637,28 @@ phi | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:1:51:3 | y | | ssa.rb:50:3:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:14 | y | phiReadNode -| parameters.rb:26:3:26:11 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | +| parameters.rb:26:3:27:13 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | | ssa.rb:5:3:13:5 | SSA phi read(self) | ssa.rb:1:1:16:3 | self | -| ssa.rb:19:9:19:9 | SSA phi read(self) | ssa.rb:18:1:23:3 | self | +| ssa.rb:19:3:22:5 | SSA phi read(self) | ssa.rb:18:1:23:3 | self | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:90:1:103:3 | self | | ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | | ssa.rb:94:3:95:10 | SSA phi read(self) | ssa.rb:90:1:103:3 | self | | ssa.rb:94:3:95:10 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | phiReadNodeFirstRead -| parameters.rb:26:3:26:11 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name | +| parameters.rb:26:3:27:13 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name | | ssa.rb:5:3:13:5 | SSA phi read(self) | ssa.rb:1:1:16:3 | self | ssa.rb:15:3:15:8 | self | -| ssa.rb:19:9:19:9 | SSA phi read(self) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | +| ssa.rb:19:3:22:5 | SSA phi read(self) | ssa.rb:18:1:23:3 | self | ssa.rb:20:5:20:10 | self | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:90:1:103:3 | self | ssa.rb:99:5:99:10 | self | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:90:1:103:3 | self | ssa.rb:101:5:101:10 | self | | ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | ssa.rb:99:10:99:10 | x | | ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:91:3:91:3 | x | ssa.rb:101:10:101:10 | x | phiReadInput -| parameters.rb:26:3:26:11 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | -| parameters.rb:26:3:26:11 | SSA phi read(name) | parameters.rb:25:40:25:43 | SSA read(name) | +| parameters.rb:26:3:27:13 | SSA phi read(name) | parameters.rb:25:15:25:18 | name | +| parameters.rb:26:3:27:13 | SSA phi read(name) | parameters.rb:25:40:25:43 | SSA read(name) | | ssa.rb:5:3:13:5 | SSA phi read(self) | ssa.rb:8:5:8:14 | SSA read(self) | | ssa.rb:5:3:13:5 | SSA phi read(self) | ssa.rb:12:5:12:14 | SSA read(self) | -| ssa.rb:19:9:19:9 | SSA phi read(self) | ssa.rb:18:1:23:3 | self (m1) | -| ssa.rb:19:9:19:9 | SSA phi read(self) | ssa.rb:20:5:20:10 | SSA read(self) | +| ssa.rb:19:3:22:5 | SSA phi read(self) | ssa.rb:18:1:23:3 | self (m1) | +| ssa.rb:19:3:22:5 | SSA phi read(self) | ssa.rb:20:5:20:10 | SSA read(self) | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:93:5:93:10 | SSA read(self) | | ssa.rb:92:3:96:5 | SSA phi read(self) | ssa.rb:94:3:95:10 | SSA phi read(self) | | ssa.rb:92:3:96:5 | SSA phi read(x) | ssa.rb:93:10:93:10 | SSA read(x) | From a293c9830aa1b023ba198ebf9e0bea2f1205fcaa Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 11 Aug 2026 14:02:38 +0200 Subject: [PATCH 063/181] Ruby: Accept remaining qltests. --- .../test/library-tests/ast/ValueText.expected | 31 +- .../controlflow/graph/BasicBlocks.expected | 11910 +++++++--------- .../controlflow/graph/Cfg.expected | 5098 ++++--- .../barrier-guards/barrier-guards.expected | 574 +- .../dataflow/local/DataflowStep.expected | 27 +- .../dataflow/local/TaintStep.expected | 26 +- .../test/library-tests/variables/ssa.expected | 4 + 7 files changed, 9051 insertions(+), 8619 deletions(-) diff --git a/ruby/ql/test/library-tests/ast/ValueText.expected b/ruby/ql/test/library-tests/ast/ValueText.expected index 42eab5f74d9e..d662062f6470 100644 --- a/ruby/ql/test/library-tests/ast/ValueText.expected +++ b/ruby/ql/test/library-tests/ast/ValueText.expected @@ -1130,13 +1130,24 @@ exprCfgNodeValue | control/cases.rb:46:12:46:12 | 3 | 3 | int | | control/cases.rb:47:6:47:6 | 1 | 1 | int | | control/cases.rb:47:13:47:13 | 3 | 3 | int | +| control/cases.rb:49:9:49:9 | 3 | 3 | int | +| control/cases.rb:49:12:49:12 | 4 | 4 | int | | control/cases.rb:50:9:50:9 | 3 | 3 | int | | control/cases.rb:51:10:51:10 | 3 | 3 | int | +| control/cases.rb:52:6:52:6 | :a | :a | symbol | +| control/cases.rb:53:6:53:6 | :a | :a | symbol | | control/cases.rb:53:9:53:9 | 5 | 5 | int | +| control/cases.rb:54:6:54:6 | :a | :a | symbol | | control/cases.rb:54:9:54:9 | 5 | 5 | int | +| control/cases.rb:55:6:55:6 | :a | :a | symbol | | control/cases.rb:55:9:55:9 | 5 | 5 | int | +| control/cases.rb:55:12:55:12 | :b | :b | symbol | +| control/cases.rb:56:6:56:6 | :a | :a | symbol | | control/cases.rb:56:9:56:9 | 5 | 5 | int | +| control/cases.rb:56:12:56:12 | :b | :b | symbol | +| control/cases.rb:57:6:57:6 | :a | :a | symbol | | control/cases.rb:57:9:57:9 | 5 | 5 | int | +| control/cases.rb:57:12:57:12 | :b | :b | symbol | | control/cases.rb:59:7:59:7 | 5 | 5 | int | | control/cases.rb:60:7:60:7 | 5 | 5 | int | | control/cases.rb:61:7:61:7 | 1 | 1 | int | @@ -1158,11 +1169,20 @@ exprCfgNodeValue | control/cases.rb:68:14:68:14 | 4 | 4 | int | | control/cases.rb:69:10:69:10 | 3 | 3 | int | | control/cases.rb:70:11:70:11 | 3 | 3 | int | +| control/cases.rb:71:7:71:7 | :a | :a | symbol | +| control/cases.rb:72:7:72:7 | :a | :a | symbol | | control/cases.rb:72:10:72:10 | 5 | 5 | int | +| control/cases.rb:73:7:73:7 | :a | :a | symbol | | control/cases.rb:73:10:73:10 | 5 | 5 | int | +| control/cases.rb:74:7:74:7 | :a | :a | symbol | | control/cases.rb:74:10:74:10 | 5 | 5 | int | +| control/cases.rb:74:13:74:13 | :b | :b | symbol | +| control/cases.rb:75:7:75:7 | :a | :a | symbol | | control/cases.rb:75:10:75:10 | 5 | 5 | int | +| control/cases.rb:75:13:75:13 | :b | :b | symbol | +| control/cases.rb:76:7:76:7 | :a | :a | symbol | | control/cases.rb:76:10:76:10 | 5 | 5 | int | +| control/cases.rb:76:13:76:13 | :b | :b | symbol | | control/cases.rb:84:7:84:8 | 42 | 42 | int | | control/cases.rb:87:6:87:6 | 5 | 5 | int | | control/cases.rb:88:7:88:9 | foo | 42 | int | @@ -1199,8 +1219,14 @@ exprCfgNodeValue | control/cases.rb:130:11:130:11 | 1 | 1 | int | | control/cases.rb:130:14:130:14 | 2 | 2 | int | | control/cases.rb:131:18:131:18 | 1 | 1 | int | +| control/cases.rb:139:7:139:7 | :x | :x | symbol | +| control/cases.rb:140:16:140:16 | :x | :x | symbol | | control/cases.rb:140:18:140:18 | 1 | 1 | int | +| control/cases.rb:141:16:141:16 | :x | :x | symbol | | control/cases.rb:141:18:141:18 | 1 | 1 | int | +| control/cases.rb:141:21:141:21 | :a | :a | symbol | +| control/cases.rb:142:11:142:11 | :y | :y | symbol | +| control/cases.rb:144:11:144:11 | :a | :a | symbol | | control/cases.rb:144:14:144:14 | 1 | 1 | int | | control/cases.rb:148:7:148:9 | foo | 42 | int | | control/cases.rb:155:8:155:10 | foo | 42 | int | @@ -1212,6 +1238,8 @@ exprCfgNodeValue | control/cases.rb:160:10:160:10 | 1 | 1 | int | | control/cases.rb:160:13:160:13 | 2 | 2 | int | | control/cases.rb:162:1:162:20 | nil | nil | nil | +| control/cases.rb:162:10:162:10 | :x | :x | symbol | +| control/cases.rb:162:16:162:16 | :y | :y | symbol | | control/cases.rb:162:19:162:19 | 1 | 1 | int | | control/cases.rb:165:3:165:5 | foo | 42 | int | | control/cases.rb:166:6:166:6 | 1 | 1 | int | @@ -1740,6 +1768,7 @@ exprCfgNodeValue | modules/modules.rb:55:8:55:30 | "module Foo::Bar again" | module Foo::Bar again | string | | modules/modules.rb:56:17:56:17 | 4 | 4 | int | | modules/toplevel.rb:1:6:1:12 | "world" | world | string | +| modules/toplevel.rb:3:12:3:16 | "!!!" | !!! | string | | modules/toplevel.rb:5:14:5:20 | "hello" | hello | string | | operations/operations.rb:3:5:3:5 | 0 | 0 | int | | operations/operations.rb:4:5:4:5 | 0 | 0 | int | @@ -1885,8 +1914,6 @@ exprCfgNodeValue | params/params.rb:47:32:47:32 | 3 | 3 | int | | params/params.rb:49:37:49:39 | 100 | 100 | int | | params/params.rb:53:44:53:44 | 3 | 3 | int | -| params/params.rb:58:46:58:46 | 0 | 0 | int | -| params/params.rb:58:56:58:58 | 100 | 100 | int | | params/params.rb:63:14:63:19 | "Zeus" | Zeus | string | | params/params.rb:65:41:65:42 | 99 | 99 | int | | params/params.rb:70:42:70:45 | 1000 | 1000 | int | diff --git a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected index dd9e84f487a7..b4470adb57db 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected @@ -1,6546 +1,5386 @@ dominates -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:1:1:11:3 | exit m1 | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:9:5:9:23 | [ensure: exception] self | -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:1:1:11:3 | exit m1 | -| break_ensure.rb:1:1:56:4 | enter break_ensure.rb | break_ensure.rb:1:1:56:4 | enter break_ensure.rb | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:1:1:11:3 | exit m1 | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:9:5:9:23 | [ensure: exception] self | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:4:7:4:11 | break | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | -| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | -| break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:1:25:3 | enter m2 | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:14:3:24:5 | while ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:3:24:5 | while ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:3:24:5 | while ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | exit m3 | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | exit m3 (normal) | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: exception] y | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: exception] break | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | exit m3 | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | exit m3 (normal) | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:11:33:11 | [ensure: exception] y | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:36:11:36:15 | [ensure: exception] break | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | -| break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:36:11:36:15 | [ensure: exception] break | -| break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:36:11:36:15 | break | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:44:1:56:3 | enter m4 | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:45:3:55:5 | while ... | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:3:55:5 | while ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:3:55:5 | while ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:2:3:5:5 | case ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:18:3:41 | if ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:21:3:22 | self | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:29:3:37 | self | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:5:4:24 | [match] when ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:10:4:10 | 2 | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:17:4:24 | self | -| case.rb:1:1:99:4 | enter case.rb | case.rb:1:1:99:4 | enter case.rb | -| case.rb:2:3:5:5 | case ... | case.rb:2:3:5:5 | case ... | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:5:3:42 | [match] when ... | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:18:3:41 | if ... | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:21:3:22 | self | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:29:3:37 | self | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:5:4:24 | [match] when ... | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:10:4:10 | 2 | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:17:4:24 | self | -| case.rb:3:18:3:41 | if ... | case.rb:3:18:3:41 | if ... | -| case.rb:3:21:3:22 | self | case.rb:3:18:3:41 | if ... | -| case.rb:3:21:3:22 | self | case.rb:3:21:3:22 | self | -| case.rb:3:21:3:22 | self | case.rb:3:29:3:37 | self | -| case.rb:3:29:3:37 | self | case.rb:3:29:3:37 | self | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:5:4:24 | [match] when ... | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:17:4:24 | self | -| case.rb:4:5:4:24 | [no-match] when ... | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [match] when ... | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:4:10:4:10 | 2 | case.rb:4:10:4:10 | 2 | -| case.rb:4:10:4:10 | 2 | case.rb:4:17:4:24 | self | -| case.rb:4:17:4:24 | self | case.rb:4:17:4:24 | self | -| case.rb:8:1:18:3 | enter case_match | case.rb:8:1:18:3 | enter case_match | -| case.rb:8:1:18:3 | enter case_match | case.rb:9:3:17:5 | case ... | -| case.rb:8:1:18:3 | enter case_match | case.rb:11:5:11:15 | in ... then ... | -| case.rb:8:1:18:3 | enter case_match | case.rb:11:15:11:15 | 3 | -| case.rb:8:1:18:3 | enter case_match | case.rb:12:5:13:7 | in ... then ... | -| case.rb:8:1:18:3 | enter case_match | case.rb:13:7:13:7 | 4 | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:5:14:25 | in ... then ... | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:13:14:13 | x | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:25:14:25 | 6 | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:5:15:28 | in ... then ... | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:17:15:17 | x | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:28:15:28 | 7 | -| case.rb:8:1:18:3 | enter case_match | case.rb:16:10:16:10 | 8 | -| case.rb:9:3:17:5 | case ... | case.rb:9:3:17:5 | case ... | -| case.rb:11:5:11:15 | in ... then ... | case.rb:11:5:11:15 | in ... then ... | -| case.rb:11:5:11:15 | in ... then ... | case.rb:11:15:11:15 | 3 | -| case.rb:11:5:11:15 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | -| case.rb:11:5:11:15 | in ... then ... | case.rb:13:7:13:7 | 4 | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:13:14:13 | x | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:25:14:25 | 6 | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:17:15:17 | x | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:28:15:28 | 7 | -| case.rb:11:5:11:15 | in ... then ... | case.rb:16:10:16:10 | 8 | -| case.rb:11:15:11:15 | 3 | case.rb:11:15:11:15 | 3 | -| case.rb:12:5:13:7 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | -| case.rb:12:5:13:7 | in ... then ... | case.rb:13:7:13:7 | 4 | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:13:14:13 | x | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:25:14:25 | 6 | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:17:15:17 | x | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:28:15:28 | 7 | -| case.rb:12:5:13:7 | in ... then ... | case.rb:16:10:16:10 | 8 | -| case.rb:13:7:13:7 | 4 | case.rb:13:7:13:7 | 4 | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:13:14:13 | x | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:25:14:25 | 6 | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:17:15:17 | x | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:28:15:28 | 7 | -| case.rb:14:5:14:25 | in ... then ... | case.rb:16:10:16:10 | 8 | -| case.rb:14:13:14:13 | x | case.rb:14:13:14:13 | x | -| case.rb:14:13:14:13 | x | case.rb:14:25:14:25 | 6 | -| case.rb:14:13:14:13 | x | case.rb:15:5:15:28 | in ... then ... | -| case.rb:14:13:14:13 | x | case.rb:15:17:15:17 | x | -| case.rb:14:13:14:13 | x | case.rb:15:28:15:28 | 7 | -| case.rb:14:13:14:13 | x | case.rb:16:10:16:10 | 8 | -| case.rb:14:25:14:25 | 6 | case.rb:14:25:14:25 | 6 | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:1:1:11:3 | Exceptional Exit | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:1:1:11:3 | Exit | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:1:1:56:4 | Entry | break_ensure.rb:1:1:56:4 | Entry | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:2:9:2:13 | After ... < ... [false] | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:3:8:3:12 | After ... > ... [false] | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:3:8:3:12 | After ... > ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:8:6:8:18 | After call to nil? [false] | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:8:6:8:18 | After call to nil? [true] | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:13:1:25:3 | Entry | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:13:1:25:3 | Exit | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:14:3:24:5 | After while ... | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:14:9:14:13 | After ... < ... [false] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:13:1:25:3 | Exceptional Exit | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:13:1:25:3 | Exit | break_ensure.rb:13:1:25:3 | Exit | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:3:24:5 | After while ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:13:1:25:3 | Exit | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:3:24:5 | After while ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [false] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:14:9:14:13 | After ... < ... [false] | break_ensure.rb:14:9:14:13 | After ... < ... [false] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:15:5:23:7 | After begin ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:16:10:16:14 | After ... > ... [false] | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:16:10:16:14 | After ... > ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:20:10:20:15 | After call to nil? [false] | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:20:10:20:15 | After call to nil? [true] | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:27:1:42:3 | Exceptional Exit | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:27:1:42:3 | Exit | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:28:3:40:5 | After begin ... | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:29:8:29:13 | After call to nil? [false] | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:29:8:29:13 | After call to nil? [true] | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:33:11:33:15 | After ... < ... [false] | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:35:12:35:16 | After ... > ... [false] | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:35:12:35:16 | After ... > ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:44:1:56:3 | Entry | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:44:1:56:3 | Exit | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:45:3:55:5 | After while ... | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:45:9:45:13 | After ... < ... [false] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| break_ensure.rb:44:1:56:3 | Exceptional Exit | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:44:1:56:3 | Exit | break_ensure.rb:44:1:56:3 | Exit | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:3:55:5 | After while ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:44:1:56:3 | Exit | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:3:55:5 | After while ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [false] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| break_ensure.rb:45:9:45:13 | After ... < ... [false] | break_ensure.rb:45:9:45:13 | After ... < ... [false] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| break_ensure.rb:46:5:54:7 | After begin ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:47:10:47:14 | After ... > ... [false] | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:47:10:47:14 | After ... > ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:51:10:51:14 | After ... > ... [true] | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| case.rb:1:1:6:3 | Entry | case.rb:1:1:6:3 | Entry | +| case.rb:1:1:6:3 | Entry | case.rb:2:3:5:5 | After case ... | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:1:1:6:3 | Entry | case.rb:3:18:3:41 | After if ... | +| case.rb:1:1:6:3 | Entry | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:1:1:6:3 | Entry | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:1:1:6:3 | Entry | case.rb:4:10:4:10 | After 2 [match] | +| case.rb:1:1:6:3 | Entry | case.rb:4:10:4:10 | After 2 [no-match] | +| case.rb:1:1:99:4 | Entry | case.rb:1:1:99:4 | Entry | +| case.rb:2:3:5:5 | After case ... | case.rb:2:3:5:5 | After case ... | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:18:3:41 | After if ... | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [match] | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [no-match] | +| case.rb:3:18:3:41 | After if ... | case.rb:3:18:3:41 | After if ... | +| case.rb:3:21:3:22 | After call to x2 [false] | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:3:21:3:22 | After call to x2 [true] | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:4:10:4:10 | After 2 [match] | case.rb:4:10:4:10 | After 2 [match] | +| case.rb:4:10:4:10 | After 2 [no-match] | case.rb:4:10:4:10 | After 2 [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:8:1:18:3 | Entry | +| case.rb:8:1:18:3 | Entry | case.rb:9:3:17:5 | After case ... | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [match] | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:11:8:11:8 | After 1 [match] | +| case.rb:8:1:18:3 | Entry | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:8:1:18:3 | Entry | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:14:8:14:8 | After x [match] | +| case.rb:8:1:18:3 | Entry | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:8:1:18:3 | Entry | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:8:1:18:3 | Entry | case.rb:15:5:15:28 | in ... then ... | +| case.rb:8:1:18:3 | Entry | case.rb:15:8:15:8 | After x [match] | +| case.rb:8:1:18:3 | Entry | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:8:1:18:3 | Entry | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:8:1:18:3 | Entry | case.rb:16:5:16:10 | else ... | +| case.rb:9:3:17:5 | After case ... | case.rb:9:3:17:5 | After case ... | +| case.rb:10:8:10:8 | After 0 [match] | case.rb:10:8:10:8 | After 0 [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:8:14:8 | After x [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:5:15:28 | in ... then ... | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:8:15:8 | After x [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:16:5:16:10 | else ... | +| case.rb:11:8:11:8 | After 1 [match] | case.rb:11:8:11:8 | After 1 [match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:8:14:8 | After x [match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:5:15:28 | in ... then ... | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:8:15:8 | After x [match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:16:5:16:10 | else ... | +| case.rb:12:8:12:8 | After 2 [match] | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:15:5:15:28 | in ... then ... | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:15:8:15:8 | After x [match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:16:5:16:10 | else ... | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:8:14:8 | After x [match] | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:14:8:14:8 | After x [no-match] | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:14:13:14:18 | After ... == ... [false] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:14:13:14:18 | After ... == ... [true] | case.rb:14:13:14:18 | After ... == ... [true] | | case.rb:15:5:15:28 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:17 | x | -| case.rb:15:5:15:28 | in ... then ... | case.rb:15:28:15:28 | 7 | -| case.rb:15:5:15:28 | in ... then ... | case.rb:16:10:16:10 | 8 | -| case.rb:15:17:15:17 | x | case.rb:15:17:15:17 | x | -| case.rb:15:17:15:17 | x | case.rb:15:28:15:28 | 7 | -| case.rb:15:17:15:17 | x | case.rb:16:10:16:10 | 8 | -| case.rb:15:28:15:28 | 7 | case.rb:15:28:15:28 | 7 | -| case.rb:16:10:16:10 | 8 | case.rb:16:10:16:10 | 8 | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:21:3:23:5 | case ... | -| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match | -| case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | -| case.rb:21:3:23:5 | case ... | case.rb:21:3:23:5 | case ... | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | exit case_match_raise | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:27:3:29:5 | case ... | -| case.rb:26:1:30:3 | exit case_match_raise | case.rb:26:1:30:3 | exit case_match_raise | -| case.rb:26:1:30:3 | exit case_match_raise (abnormal) | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | -| case.rb:27:3:29:5 | case ... | case.rb:27:3:29:5 | case ... | -| case.rb:28:7:28:28 | enter -> { ... } | case.rb:28:7:28:28 | enter -> { ... } | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:1:39:3 | exit case_match_array | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:33:3:38:5 | case ... | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:35:5:35:11 | in ... then ... | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:35:9:35:9 | x | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:36:5:36:13 | in ... then ... | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:36:9:36:9 | x | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:5:37:27 | in ... then ... | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:12:37:12 | a | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:15:37:15 | b | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:19:37:19 | c | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:25:37:25 | e | -| case.rb:32:1:39:3 | exit case_match_array | case.rb:32:1:39:3 | exit case_match_array | -| case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:33:3:38:5 | case ... | case.rb:33:3:38:5 | case ... | -| case.rb:35:5:35:11 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:5:35:11 | in ... then ... | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | -| case.rb:35:5:35:11 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | -| case.rb:35:5:35:11 | in ... then ... | case.rb:36:9:36:9 | x | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:12:37:12 | a | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:15:37:15 | b | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:19:37:19 | c | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:25:37:25 | e | -| case.rb:35:9:35:9 | x | case.rb:35:9:35:9 | x | -| case.rb:36:5:36:13 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:12:37:12 | a | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:15:37:15 | b | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:19:37:19 | c | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:25:37:25 | e | -| case.rb:36:9:36:9 | x | case.rb:36:9:36:9 | x | -| case.rb:37:5:37:27 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:12:37:12 | a | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:15:37:15 | b | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:19:37:19 | c | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:25:37:25 | e | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:15:37:15 | b | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:19:37:19 | c | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:25:37:25 | e | -| case.rb:37:12:37:12 | a | case.rb:37:12:37:12 | a | -| case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | -| case.rb:37:12:37:12 | a | case.rb:37:19:37:19 | c | -| case.rb:37:12:37:12 | a | case.rb:37:25:37:25 | e | -| case.rb:37:15:37:15 | b | case.rb:37:15:37:15 | b | -| case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | -| case.rb:37:15:37:15 | b | case.rb:37:25:37:25 | e | -| case.rb:37:19:37:19 | c | case.rb:37:19:37:19 | c | -| case.rb:37:19:37:19 | c | case.rb:37:25:37:25 | e | -| case.rb:37:25:37:25 | e | case.rb:37:25:37:25 | e | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | exit case_match_find | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | exit case_match_find (abnormal) | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:16:43:16 | 2 | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:20:43:20 | y | -| case.rb:41:1:45:3 | exit case_match_find | case.rb:41:1:45:3 | exit case_match_find | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:41:1:45:3 | exit case_match_find (abnormal) | -| case.rb:43:10:43:10 | x | case.rb:43:10:43:10 | x | -| case.rb:43:10:43:10 | x | case.rb:43:16:43:16 | 2 | -| case.rb:43:10:43:10 | x | case.rb:43:20:43:20 | y | -| case.rb:43:16:43:16 | 2 | case.rb:43:16:43:16 | 2 | -| case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | -| case.rb:43:20:43:20 | y | case.rb:43:20:43:20 | y | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:47:1:53:3 | exit case_match_hash | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:48:3:52:5 | case ... | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:8:49:34 | { ..., ** } | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:20:49:20 | 1 | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:23:49:23 | a | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:29:49:32 | rest | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:50:5:50:25 | in ... then ... | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:50:16:50:16 | 1 | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:51:5:51:17 | in ... then ... | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:47:1:53:3 | exit case_match_hash | case.rb:47:1:53:3 | exit case_match_hash | -| case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | -| case.rb:48:3:52:5 | case ... | case.rb:48:3:52:5 | case ... | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:8:49:34 | { ..., ** } | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:23:49:23 | a | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:29:49:32 | rest | -| case.rb:49:20:49:20 | 1 | case.rb:49:20:49:20 | 1 | -| case.rb:49:20:49:20 | 1 | case.rb:49:23:49:23 | a | -| case.rb:49:20:49:20 | 1 | case.rb:49:29:49:32 | rest | -| case.rb:49:23:49:23 | a | case.rb:49:23:49:23 | a | -| case.rb:49:23:49:23 | a | case.rb:49:29:49:32 | rest | -| case.rb:49:29:49:32 | rest | case.rb:49:29:49:32 | rest | -| case.rb:50:5:50:25 | in ... then ... | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:5:50:25 | in ... then ... | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:16:50:16 | 1 | -| case.rb:50:5:50:25 | in ... then ... | case.rb:51:5:51:17 | in ... then ... | -| case.rb:50:5:50:25 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | -| case.rb:50:16:50:16 | 1 | case.rb:50:16:50:16 | 1 | -| case.rb:51:5:51:17 | in ... then ... | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:5:51:17 | in ... then ... | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:55:1:61:3 | enter case_match_variable | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:56:3:60:5 | case ... | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:58:5:58:10 | in ... then ... | -| case.rb:56:3:60:5 | case ... | case.rb:56:3:60:5 | case ... | -| case.rb:58:5:58:10 | in ... then ... | case.rb:58:5:58:10 | in ... then ... | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:63:1:67:3 | enter case_match_underscore | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:64:3:66:5 | case ... | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:65:12:65:12 | _ | -| case.rb:64:3:66:5 | case ... | case.rb:64:3:66:5 | case ... | -| case.rb:65:12:65:12 | _ | case.rb:65:12:65:12 | _ | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:1:93:3 | exit case_match_various | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:72:3:92:5 | case ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:74:5:74:11 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:75:5:75:15 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:76:5:76:18 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:77:5:77:18 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:78:5:78:19 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:79:5:79:14 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:80:5:80:12 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:81:5:81:11 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:5:82:20 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:13:82:13 | x | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:20:82:20 | 1 | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:5:83:26 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:12:83:15 | ^... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:20:83:25 | string | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:84:5:84:17 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:85:5:85:23 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:86:5:86:11 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:87:5:87:17 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:88:5:88:15 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:88:14:88:15 | 10 | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:5:89:69 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:14:89:17 | self | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:21:89:24 | true | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:28:89:32 | false | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:36:89:43 | __LINE__ | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:47:89:54 | __FILE__ | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:90:5:90:13 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:5:91:25 | in ... then ... | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:13:91:14 | "" | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:69:1:93:3 | exit case_match_various | case.rb:69:1:93:3 | exit case_match_various | -| case.rb:69:1:93:3 | exit case_match_various (abnormal) | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:72:3:92:5 | case ... | case.rb:72:3:92:5 | case ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:74:5:74:11 | in ... then ... | case.rb:74:5:74:11 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:74:5:74:11 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:74:5:74:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:75:5:75:15 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:75:5:75:15 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:75:5:75:15 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:75:5:75:15 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:76:5:76:18 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:76:5:76:18 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:76:5:76:18 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:76:5:76:18 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:77:5:77:18 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:77:5:77:18 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:77:5:77:18 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:77:5:77:18 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:78:5:78:19 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:78:5:78:19 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:78:5:78:19 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:78:5:78:19 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:79:5:79:14 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:79:5:79:14 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:79:5:79:14 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:79:5:79:14 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:80:5:80:12 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:80:5:80:12 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:80:5:80:12 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:80:5:80:12 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:81:5:81:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:81:5:81:11 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:81:5:81:11 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:81:5:81:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:82:5:82:20 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:13:82:13 | x | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:20:82:20 | 1 | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:82:5:82:20 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:82:5:82:20 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:82:13:82:13 | x | case.rb:82:13:82:13 | x | -| case.rb:82:13:82:13 | x | case.rb:82:20:82:20 | 1 | -| case.rb:82:20:82:20 | 1 | case.rb:82:20:82:20 | 1 | -| case.rb:83:5:83:26 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:12:83:15 | ^... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:83:5:83:26 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:83:5:83:26 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:83:12:83:15 | ^... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:83:12:83:15 | ^... | case.rb:83:12:83:15 | ^... | -| case.rb:83:12:83:15 | ^... | case.rb:83:20:83:25 | string | -| case.rb:83:12:83:15 | ^... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:88:14:88:15 | 10 | -| case.rb:83:12:83:15 | ^... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:89:14:89:17 | self | -| case.rb:83:12:83:15 | ^... | case.rb:89:21:89:24 | true | -| case.rb:83:12:83:15 | ^... | case.rb:89:28:89:32 | false | -| case.rb:83:12:83:15 | ^... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:83:12:83:15 | ^... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:83:12:83:15 | ^... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:83:12:83:15 | ^... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:91:13:91:14 | "" | -| case.rb:83:12:83:15 | ^... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:83:12:83:15 | ^... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:83:20:83:25 | string | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:83:20:83:25 | string | case.rb:83:20:83:25 | string | -| case.rb:83:20:83:25 | string | case.rb:84:5:84:17 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:85:5:85:23 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:86:5:86:11 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:87:5:87:17 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:88:5:88:15 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:88:14:88:15 | 10 | -| case.rb:83:20:83:25 | string | case.rb:89:5:89:69 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:89:14:89:17 | self | -| case.rb:83:20:83:25 | string | case.rb:89:21:89:24 | true | -| case.rb:83:20:83:25 | string | case.rb:89:28:89:32 | false | -| case.rb:83:20:83:25 | string | case.rb:89:36:89:43 | __LINE__ | -| case.rb:83:20:83:25 | string | case.rb:89:47:89:54 | __FILE__ | -| case.rb:83:20:83:25 | string | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:83:20:83:25 | string | case.rb:90:5:90:13 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:91:5:91:25 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:91:13:91:14 | "" | -| case.rb:83:20:83:25 | string | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:83:20:83:25 | string | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:84:5:84:17 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:84:5:84:17 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:84:5:84:17 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:85:5:85:23 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:85:5:85:23 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:85:5:85:23 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:85:8:85:23 | enter -> { ... } | case.rb:85:8:85:23 | enter -> { ... } | -| case.rb:86:5:86:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:86:5:86:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:86:5:86:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:87:5:87:17 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:87:5:87:17 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:87:5:87:17 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:88:5:88:15 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:88:5:88:15 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:88:5:88:15 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:88:14:88:15 | 10 | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:88:14:88:15 | 10 | case.rb:88:14:88:15 | 10 | -| case.rb:88:14:88:15 | 10 | case.rb:89:5:89:69 | in ... then ... | -| case.rb:88:14:88:15 | 10 | case.rb:89:14:89:17 | self | -| case.rb:88:14:88:15 | 10 | case.rb:89:21:89:24 | true | -| case.rb:88:14:88:15 | 10 | case.rb:89:28:89:32 | false | -| case.rb:88:14:88:15 | 10 | case.rb:89:36:89:43 | __LINE__ | -| case.rb:88:14:88:15 | 10 | case.rb:89:47:89:54 | __FILE__ | -| case.rb:88:14:88:15 | 10 | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:88:14:88:15 | 10 | case.rb:90:5:90:13 | in ... then ... | -| case.rb:88:14:88:15 | 10 | case.rb:91:5:91:25 | in ... then ... | -| case.rb:88:14:88:15 | 10 | case.rb:91:13:91:14 | "" | -| case.rb:88:14:88:15 | 10 | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:88:14:88:15 | 10 | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:5:89:69 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:14:89:17 | self | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:21:89:24 | true | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:28:89:32 | false | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:5:89:69 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:14:89:17 | self | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:14:89:17 | self | case.rb:89:14:89:17 | self | -| case.rb:89:14:89:17 | self | case.rb:89:21:89:24 | true | -| case.rb:89:14:89:17 | self | case.rb:89:28:89:32 | false | -| case.rb:89:14:89:17 | self | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:14:89:17 | self | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:14:89:17 | self | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:14:89:17 | self | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:14:89:17 | self | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:14:89:17 | self | case.rb:91:13:91:14 | "" | -| case.rb:89:14:89:17 | self | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:14:89:17 | self | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:21:89:24 | true | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:21:89:24 | true | case.rb:89:21:89:24 | true | -| case.rb:89:21:89:24 | true | case.rb:89:28:89:32 | false | -| case.rb:89:21:89:24 | true | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:21:89:24 | true | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:21:89:24 | true | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:21:89:24 | true | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:21:89:24 | true | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:21:89:24 | true | case.rb:91:13:91:14 | "" | -| case.rb:89:21:89:24 | true | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:21:89:24 | true | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:28:89:32 | false | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:28:89:32 | false | case.rb:89:28:89:32 | false | -| case.rb:89:28:89:32 | false | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:28:89:32 | false | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:28:89:32 | false | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:28:89:32 | false | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:28:89:32 | false | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:28:89:32 | false | case.rb:91:13:91:14 | "" | -| case.rb:89:28:89:32 | false | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:28:89:32 | false | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:36:89:43 | __LINE__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:36:89:43 | __LINE__ | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:13:91:14 | "" | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:47:89:54 | __FILE__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:47:89:54 | __FILE__ | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:13:91:14 | "" | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:90:5:90:13 | in ... then ... | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:5:91:25 | in ... then ... | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:13:91:14 | "" | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:90:5:90:13 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:90:5:90:13 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:91:5:91:25 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:13:91:14 | "" | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:91:13:91:14 | "" | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:91:13:91:14 | "" | case.rb:91:13:91:14 | "" | -| case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:91:13:91:14 | "" | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | enter case_match_guard_no_else | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:13:97:13 | x | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:25:97:25 | 6 | -| case.rb:95:1:99:3 | exit case_match_guard_no_else | 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) | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | exit case_match_guard_no_else | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | -| case.rb:97:13:97:13 | x | case.rb:97:13:97:13 | x | -| case.rb:97:13:97:13 | x | case.rb:97:25:97:25 | 6 | -| case.rb:97:25:97:25 | 6 | case.rb:97:25:97:25 | 6 | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:18:14:22:16 | if ... | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:19:19:19:32 | self | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:21:19:21:32 | self | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:18:14:22:16 | if ... | -| cfg.html.erb:19:19:19:32 | self | cfg.html.erb:19:19:19:32 | self | -| cfg.html.erb:21:19:21:32 | self | cfg.html.erb:21:19:21:32 | self | -| cfg.html.erb:29:24:31:10 | enter do ... end | cfg.html.erb:29:24:31:10 | enter do ... end | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:15:42:24 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:21:43:31 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:44:8:44:18 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:20:48:29 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:8:49:8 | b | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:16:49:16 | b | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:27:49:37 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:27:60:31 | hello | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:37:60:39 | bye | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:23:75:23 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:43:75:43 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:113:1:113:9 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:136:12:136:29 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:21:172:29 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:36:172:45 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:174:1:174:9 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:7:176:7 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:17:176:17 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:2:179:13 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:30:179:30 | i | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:182:7:182:7 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:183:3:183:3 | x | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:184:18:184:21 | redo | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:2:188:13 | self | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:30:188:30 | i | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:1:205:3 | nil | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:25:9:25:22 | enter { ... } | cfg.rb:25:9:25:22 | enter { ... } | -| cfg.rb:29:10:29:24 | enter { ... } | cfg.rb:29:10:29:24 | enter { ... } | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:15:42:24 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:21:43:31 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:44:8:44:18 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:20:48:29 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:8:49:8 | b | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:16:49:16 | b | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:27:49:37 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:27:60:31 | hello | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:37:60:39 | bye | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:23:75:23 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:43:75:43 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:113:1:113:9 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:136:12:136:29 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:21:172:29 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:36:172:45 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:174:1:174:9 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:7:176:7 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:17:176:17 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:2:179:13 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:30:179:30 | i | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:182:7:182:7 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:183:3:183:3 | x | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:184:18:184:21 | redo | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:2:188:13 | self | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:30:188:30 | i | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:1:205:3 | nil | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:42:15:42:24 | self | cfg.rb:42:15:42:24 | self | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:21:43:31 | self | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:44:8:44:18 | self | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:44:8:44:18 | self | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:44:8:44:18 | self | -| cfg.rb:43:21:43:31 | self | cfg.rb:43:21:43:31 | self | -| cfg.rb:44:8:44:18 | self | cfg.rb:44:8:44:18 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:48:20:48:29 | self | cfg.rb:48:20:48:29 | self | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:8:49:8 | b | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:16:49:16 | b | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:27:49:37 | self | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:16:49:16 | b | -| cfg.rb:49:27:49:37 | self | cfg.rb:49:27:49:37 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:60:27:60:31 | hello | cfg.rb:60:27:60:31 | hello | -| cfg.rb:60:37:60:39 | bye | cfg.rb:60:37:60:39 | bye | -| cfg.rb:63:3:66:5 | enter pattern | cfg.rb:63:3:66:5 | enter pattern | -| cfg.rb:69:3:71:5 | enter print | cfg.rb:69:3:71:5 | enter print | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:75:15:75:15 | 0 | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:43:75:43 | x | -| cfg.rb:75:35:75:36 | 10 | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:75:43:75:43 | x | cfg.rb:75:43:75:43 | x | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:90:1:93:3 | exit { ... } (normal) | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:3:91:24 | if ... | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:17:91:20 | next | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:90:1:93:3 | exit { ... } (normal) | -| cfg.rb:90:5:90:5 | [false] ! ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | x | -| cfg.rb:91:3:91:24 | if ... | cfg.rb:91:3:91:24 | if ... | -| cfg.rb:91:17:91:20 | next | cfg.rb:91:17:91:20 | next | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:1:104:3 | enter parameters | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:28:101:30 | key | -| cfg.rb:101:24:101:25 | 42 | cfg.rb:101:24:101:25 | 42 | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [match] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:16:5:16:10 | else ... | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:8:15:8 | After x [match] | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:15:8:15:8 | After x [no-match] | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:15:17:15:21 | After ... < ... [false] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:15:17:15:21 | After ... < ... [true] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:16:5:16:10 | else ... | case.rb:16:5:16:10 | else ... | +| case.rb:20:1:24:3 | Entry | case.rb:20:1:24:3 | Entry | +| case.rb:20:1:24:3 | Entry | case.rb:21:3:23:5 | After case ... | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [match] | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [no-match] | +| case.rb:21:3:23:5 | After case ... | case.rb:21:3:23:5 | After case ... | +| case.rb:22:8:22:8 | After 1 [match] | case.rb:22:8:22:8 | After 1 [match] | +| case.rb:22:8:22:8 | After 1 [no-match] | case.rb:22:8:22:8 | After 1 [no-match] | +| case.rb:26:1:30:3 | Entry | case.rb:26:1:30:3 | Entry | +| case.rb:26:1:30:3 | Entry | case.rb:27:3:29:5 | After case ... | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [match] | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [no-match] | +| case.rb:27:3:29:5 | After case ... | case.rb:27:3:29:5 | After case ... | +| case.rb:28:7:28:28 | After -> { ... } [match] | case.rb:28:7:28:28 | After -> { ... } [match] | +| case.rb:28:7:28:28 | After -> { ... } [no-match] | case.rb:28:7:28:28 | After -> { ... } [no-match] | +| case.rb:28:7:28:28 | Entry | case.rb:28:7:28:28 | Entry | +| case.rb:32:1:39:3 | Entry | case.rb:32:1:39:3 | Entry | +| case.rb:32:1:39:3 | Entry | case.rb:33:3:38:5 | After case ... | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [match] | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:32:1:39:3 | Entry | case.rb:35:8:35:10 | After [ ..., * ] [match] | +| case.rb:32:1:39:3 | Entry | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:32:1:39:3 | Entry | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:32:1:39:3 | Entry | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:32:1:39:3 | Entry | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:32:1:39:3 | Entry | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:33:3:38:5 | After case ... | case.rb:33:3:38:5 | After case ... | +| case.rb:34:8:34:9 | After [ ..., * ] [match] | case.rb:34:8:34:9 | After [ ..., * ] [match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:35:8:35:10 | After [ ..., * ] [match] | case.rb:35:8:35:10 | After [ ..., * ] [match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:36:8:36:12 | After [ ..., * ] [match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:37:8:37:26 | After [ ..., * ] [match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:37:8:37:26 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:41:1:45:3 | Entry | case.rb:41:1:45:3 | Entry | +| case.rb:41:1:45:3 | Entry | case.rb:42:3:44:5 | After case ... | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [match] | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | +| case.rb:42:3:44:5 | After case ... | case.rb:42:3:44:5 | After case ... | +| case.rb:43:8:43:21 | After [ *,...,* ] [match] | case.rb:43:8:43:21 | After [ *,...,* ] [match] | +| case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | +| case.rb:47:1:53:3 | Entry | case.rb:47:1:53:3 | Entry | +| case.rb:47:1:53:3 | Entry | case.rb:48:3:52:5 | After case ... | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [match] | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:47:1:53:3 | Entry | case.rb:50:8:50:24 | After { ..., ** } [match] | +| case.rb:47:1:53:3 | Entry | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:47:1:53:3 | Entry | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:47:1:53:3 | Entry | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:48:3:52:5 | After case ... | case.rb:48:3:52:5 | After case ... | +| case.rb:49:8:49:34 | After { ..., ** } [match] | case.rb:49:8:49:34 | After { ..., ** } [match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:50:8:50:24 | After { ..., ** } [match] | case.rb:50:8:50:24 | After { ..., ** } [match] | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:51:8:51:16 | After { ..., ** } [match] | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:51:8:51:16 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:55:1:61:3 | Entry | case.rb:55:1:61:3 | Entry | +| case.rb:55:1:61:3 | Entry | case.rb:56:3:60:5 | After case ... | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [match] | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:55:1:61:3 | Entry | case.rb:58:8:58:10 | After var [match] | +| case.rb:55:1:61:3 | Entry | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:55:1:61:3 | Entry | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:55:1:61:3 | Entry | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:56:3:60:5 | After case ... | case.rb:56:3:60:5 | After case ... | +| case.rb:57:8:57:8 | After 5 [match] | case.rb:57:8:57:8 | After 5 [match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:58:8:58:10 | After var [match] | case.rb:58:8:58:10 | After var [match] | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:59:8:59:20 | After "unreachable" [match] | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:59:8:59:20 | After "unreachable" [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:63:1:67:3 | Entry | case.rb:63:1:67:3 | Entry | +| case.rb:63:1:67:3 | Entry | case.rb:64:3:66:5 | After case ... | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [match] | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [no-match] | +| case.rb:64:3:66:5 | After case ... | case.rb:64:3:66:5 | After case ... | +| case.rb:65:8:65:28 | After ... \| ... [match] | case.rb:65:8:65:28 | After ... \| ... [match] | +| case.rb:65:8:65:28 | After ... \| ... [no-match] | case.rb:65:8:65:28 | After ... \| ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:69:1:93:3 | Entry | +| case.rb:69:1:93:3 | Entry | case.rb:72:3:92:5 | After case ... | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [match] | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:74:8:74:11 | After ^... [match] | +| case.rb:69:1:93:3 | Entry | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:69:1:93:3 | Entry | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:69:1:93:3 | Entry | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:69:1:93:3 | Entry | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:69:1:93:3 | Entry | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:69:1:93:3 | Entry | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:69:1:93:3 | Entry | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:69:1:93:3 | Entry | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:69:1:93:3 | Entry | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:69:1:93:3 | Entry | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:69:1:93:3 | Entry | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:69:1:93:3 | Entry | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:69:1:93:3 | Entry | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:69:1:93:3 | Entry | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:69:1:93:3 | Entry | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:69:1:93:3 | Entry | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:69:1:93:3 | Entry | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:69:1:93:3 | Entry | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:72:3:92:5 | After case ... | +| case.rb:73:8:73:8 | After 5 [match] | case.rb:73:8:73:8 | After 5 [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:74:8:74:11 | After ^... [match] | case.rb:74:8:74:11 | After ^... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:75:8:75:15 | After "string" [match] | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:76:8:76:18 | After call to [] [match] | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:77:8:77:18 | After call to [] [match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:82:8:82:13 | After ... => ... [match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:84:8:84:17 | After Bar [match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:85:8:85:23 | Entry | case.rb:85:8:85:23 | Entry | +| case.rb:86:8:86:11 | After :foo [match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:90:8:90:13 | After ( ... ) [match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:91:8:91:25 | After ( ... ) [match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:91:8:91:25 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:95:1:99:3 | Entry | case.rb:95:1:99:3 | Entry | +| case.rb:95:1:99:3 | Entry | case.rb:96:3:98:5 | After case ... | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [match] | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [no-match] | +| case.rb:95:1:99:3 | Entry | case.rb:97:13:97:18 | After ... == ... [false] | +| case.rb:95:1:99:3 | Entry | case.rb:97:13:97:18 | After ... == ... [true] | +| case.rb:96:3:98:5 | After case ... | case.rb:96:3:98:5 | After case ... | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:8:97:8 | After x [match] | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [false] | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [true] | +| case.rb:97:8:97:8 | After x [no-match] | case.rb:97:8:97:8 | After x [no-match] | +| case.rb:97:13:97:18 | After ... == ... [false] | case.rb:97:13:97:18 | After ... == ... [false] | +| case.rb:97:13:97:18 | After ... == ... [true] | case.rb:97:13:97:18 | After ... == ... [true] | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:5:16:31:12 | Entry | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:14:22:16 | After if ... | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [false] | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [true] | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:18:14:22:16 | After if ... | +| cfg.html.erb:18:17:18:22 | After call to admin? [false] | cfg.html.erb:18:17:18:22 | After call to admin? [false] | +| cfg.html.erb:18:17:18:22 | After call to admin? [true] | cfg.html.erb:18:17:18:22 | After call to admin? [true] | +| cfg.html.erb:29:24:31:10 | Entry | cfg.html.erb:29:24:31:10 | Entry | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:1:1:221:1 | Exceptional Exit | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:1:1:221:1 | Exit | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:25:9:25:22 | Entry | cfg.rb:25:9:25:22 | Entry | +| cfg.rb:29:10:29:24 | Entry | cfg.rb:29:10:29:24 | Entry | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:42:8:42:8 | After 1 [match] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:43:8:43:8 | After 2 [match] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:43:11:43:11 | After 3 [match] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:43:14:43:14 | After 4 [match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:43:14:43:14 | After 4 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:48:8:48:13 | After ... == ... [match] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:49:8:49:13 | After ... == ... [match] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:49:16:49:20 | After ... > ... [match] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:49:16:49:20 | After ... > ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:60:17:60:22 | After ... < ... [false] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:60:17:60:22 | After ... < ... [true] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:63:3:66:5 | Entry | cfg.rb:63:3:66:5 | Entry | +| cfg.rb:69:3:71:5 | Entry | cfg.rb:69:3:71:5 | Entry | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:75:4:75:8 | After ... < ... [true] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:75:23:75:28 | After ... > ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:75:23:75:28 | After ... > ... [true] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:90:1:93:3 | Normal Exit | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [false] | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [true] | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:90:1:93:3 | Normal Exit | +| cfg.rb:90:5:90:5 | After defined? ... [false] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:90:5:90:5 | After defined? ... [true] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:91:6:91:10 | After ... > ... [false] | cfg.rb:91:6:91:10 | After ... > ... [false] | +| cfg.rb:91:6:91:10 | After ... > ... [true] | cfg.rb:91:6:91:10 | After ... > ... [true] | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [match] | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [no-match] | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:28:101:30 | key | +| cfg.rb:101:16:101:20 | After value [match] | cfg.rb:101:16:101:20 | After value [match] | +| cfg.rb:101:16:101:20 | After value [no-match] | cfg.rb:101:16:101:20 | After value [no-match] | | cfg.rb:101:28:101:30 | key | cfg.rb:101:28:101:30 | key | -| cfg.rb:113:1:113:9 | self | cfg.rb:113:1:113:9 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:120:8:120:28 | enter -> { ... } | cfg.rb:120:8:120:28 | enter -> { ... } | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:136:12:136:29 | self | cfg.rb:136:12:136:29 | self | -| cfg.rb:145:3:148:5 | enter print | cfg.rb:145:3:148:5 | enter print | -| cfg.rb:152:1:154:3 | enter method | cfg.rb:152:1:154:3 | enter method | -| cfg.rb:156:1:156:28 | enter two_parameters | cfg.rb:156:1:156:28 | enter two_parameters | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:172:21:172:29 | self | cfg.rb:172:21:172:29 | self | -| cfg.rb:172:36:172:45 | self | cfg.rb:172:36:172:45 | self | -| cfg.rb:174:1:174:9 | self | cfg.rb:174:1:174:9 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:7:176:7 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:17:176:17 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:2:179:13 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:30:179:30 | i | -| cfg.rb:176:7:176:7 | x | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:182:7:182:7 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:183:3:183:3 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:184:18:184:21 | redo | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:2:188:13 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:30:188:30 | i | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:1:205:3 | nil | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:176:17:176:17 | x | cfg.rb:176:17:176:17 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:179:2:179:13 | self | cfg.rb:179:2:179:13 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:2:179:13 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:30:179:30 | i | -| cfg.rb:179:30:179:30 | i | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:182:7:182:7 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:183:3:183:3 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:184:18:184:21 | redo | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:2:188:13 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:30:188:30 | i | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:1:205:3 | nil | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:182:7:182:7 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:183:3:183:3 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:18:184:21 | redo | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:2:188:13 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:30:188:30 | i | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:1:205:3 | nil | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:183:3:183:3 | x | cfg.rb:183:3:183:3 | x | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:18:184:21 | redo | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:184:18:184:21 | redo | cfg.rb:184:18:184:21 | redo | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:188:2:188:13 | self | cfg.rb:188:2:188:13 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:2:188:13 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:30:188:30 | i | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:1:205:3 | nil | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:190:1:192:3 | enter run_block | cfg.rb:190:1:192:3 | enter run_block | -| cfg.rb:194:11:194:23 | enter { ... } | cfg.rb:194:11:194:23 | enter { ... } | -| cfg.rb:196:1:198:3 | enter forward_param | cfg.rb:196:1:198:3 | enter forward_param | -| cfg.rb:200:9:200:32 | enter { ... } | cfg.rb:200:9:200:32 | enter { ... } | -| cfg.rb:202:9:202:35 | enter do ... end | cfg.rb:202:9:202:35 | enter do ... end | -| cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:205:1:205:3 | nil | cfg.rb:205:1:205:3 | nil | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:205:15:205:23 | enter { ... } | cfg.rb:205:15:205:23 | enter { ... } | -| cfg.rb:207:1:211:3 | enter filter_nil | cfg.rb:207:1:211:3 | enter filter_nil | -| cfg.rb:208:15:210:5 | enter do ... end | cfg.rb:208:15:210:5 | enter do ... end | -| cfg.rb:213:14:216:3 | enter do ... end | cfg.rb:213:14:216:3 | enter do ... end | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:19:21:19:23 | 123 | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | -| constant_compound_assign.rb:5:22:5:24 | 123 | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | -| constant_compound_assign.rb:14:18:14:20 | 123 | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | -| constant_compound_assign.rb:19:21:19:23 | 123 | constant_compound_assign.rb:19:21:19:23 | 123 | -| desugar.rb:1:1:3:3 | enter m1 | desugar.rb:1:1:3:3 | enter m1 | -| desugar.rb:1:1:38:17 | enter desugar.rb | desugar.rb:1:1:38:17 | enter desugar.rb | -| desugar.rb:5:1:7:3 | enter m2 | desugar.rb:5:1:7:3 | enter m2 | -| desugar.rb:9:1:11:3 | enter m3 | desugar.rb:9:1:11:3 | enter m3 | -| desugar.rb:13:1:15:3 | enter m4 | desugar.rb:13:1:15:3 | enter m4 | -| desugar.rb:17:1:19:3 | enter m5 | desugar.rb:17:1:19:3 | enter m5 | -| desugar.rb:21:1:23:3 | enter m6 | desugar.rb:21:1:23:3 | enter m6 | -| desugar.rb:25:1:27:3 | enter m7 | desugar.rb:25:1:27:3 | enter m7 | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:1:1:6:3 | exit m1 | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:2:3:4:5 | if ... | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:3:5:3:10 | self | -| exit.rb:1:1:6:3 | exit m1 | exit.rb:1:1:6:3 | exit m1 | -| exit.rb:1:1:13:4 | enter exit.rb | exit.rb:1:1:13:4 | enter exit.rb | -| exit.rb:2:3:4:5 | if ... | exit.rb:2:3:4:5 | if ... | -| exit.rb:3:5:3:10 | self | exit.rb:3:5:3:10 | self | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:8:1:13:3 | enter m2 | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:8:1:13:3 | exit m2 | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:9:3:11:5 | if ... | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:10:5:10:18 | self | -| exit.rb:8:1:13:3 | exit m2 | exit.rb:8:1:13:3 | exit m2 | -| exit.rb:9:3:11:5 | if ... | exit.rb:9:3:11:5 | if ... | -| exit.rb:10:5:10:18 | self | exit.rb:10:5:10:18 | self | -| heredoc.rb:1:1:7:3 | enter double_heredoc | heredoc.rb:1:1:7:3 | enter double_heredoc | -| heredoc.rb:1:1:7:4 | enter heredoc.rb | heredoc.rb:1:1:7:4 | enter heredoc.rb | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:2:3:8:5 | if ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:3:5:3:30 | self | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:3:7:35 | elsif ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:9 | x | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:20:4:20 | x | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:32:4:32 | x | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:5:5:5:17 | self | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:7:5:7:35 | self | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:1:1:58:4 | enter ifs.rb | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:36:1:38:3 | conditional_method_def | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:36:1:38:17 | ... unless ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:2:3:8:5 | if ... | -| ifs.rb:3:5:3:30 | self | ifs.rb:3:5:3:30 | self | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:3:7:35 | elsif ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:3:7:35 | elsif ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:20:4:20 | x | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:9:4:9 | x | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:9:4:9 | x | ifs.rb:7:5:7:35 | self | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:7:5:7:35 | self | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:20:4:20 | x | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:20:4:20 | x | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:32:4:32 | x | ifs.rb:5:5:5:17 | self | -| ifs.rb:5:5:5:17 | self | ifs.rb:5:5:5:17 | self | -| ifs.rb:7:5:7:35 | self | ifs.rb:7:5:7:35 | self | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:11:1:16:3 | exit m2 (normal) | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:12:3:14:5 | if ... | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:13:12:13:12 | 0 | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | exit m2 (normal) | -| ifs.rb:12:3:14:5 | if ... | ifs.rb:12:3:14:5 | if ... | -| ifs.rb:13:12:13:12 | 0 | ifs.rb:13:12:13:12 | 0 | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:18:1:26:3 | enter m3 | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:19:3:24:5 | if ... | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:20:5:20:5 | x | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:21:5:23:7 | if ... | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:22:7:22:7 | x | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:19:3:24:5 | if ... | -| ifs.rb:20:5:20:5 | x | ifs.rb:20:5:20:5 | x | -| ifs.rb:20:5:20:5 | x | ifs.rb:21:5:23:7 | if ... | -| ifs.rb:20:5:20:5 | x | ifs.rb:22:7:22:7 | x | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:21:5:23:7 | if ... | -| ifs.rb:22:7:22:7 | x | ifs.rb:22:7:22:7 | x | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:10:29:51 | ... ? ... : ... | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:16:29:17 | b2 | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:21:29:22 | b3 | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:10:29:51 | ... ? ... : ... | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:16:29:17 | b2 | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:21:29:22 | b3 | -| ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:3:33:100 | if ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:3:33:100 | if ... | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:33:13:33:19 | [false] then ... | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:13:33:19 | [true] then ... | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:30:33:36 | [false] then ... | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:30:33:36 | [true] then ... | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:38:33:44 | [false] else ... | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:38:33:44 | [true] else ... | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:36:1:38:3 | conditional_method_def | ifs.rb:36:1:38:3 | conditional_method_def | -| ifs.rb:36:1:38:3 | enter conditional_method_def | ifs.rb:36:1:38:3 | enter conditional_method_def | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:36:1:38:17 | ... unless ... | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:40:1:44:3 | enter constant_condition | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:3:43:5 | if ... | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:6:41:10 | [false] ! ... | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:41:3:43:5 | if ... | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:3:43:5 | if ... | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:6:41:10 | [false] ! ... | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:47:3:50:5 | if ... | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:48:5:48:15 | self | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:49:3:49:6 | else ... | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:47:3:50:5 | if ... | -| ifs.rb:48:5:48:15 | self | ifs.rb:48:5:48:15 | self | -| ifs.rb:49:3:49:6 | else ... | ifs.rb:49:3:49:6 | else ... | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:3:57:5 | if ... | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:56:5:56:19 | self | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:3:57:5 | if ... | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:56:5:56:19 | self | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:56:5:56:19 | self | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:56:5:56:19 | self | ifs.rb:56:5:56:19 | self | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:1:1:6:3 | enter m1 | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:2:3:5:5 | while ... | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:2:9:2:9 | x | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:3:5:3:10 | self | -| loops.rb:1:1:33:4 | enter loops.rb | loops.rb:1:1:33:4 | enter loops.rb | -| loops.rb:2:3:5:5 | while ... | loops.rb:2:3:5:5 | while ... | -| loops.rb:2:9:2:9 | x | loops.rb:2:3:5:5 | while ... | -| loops.rb:2:9:2:9 | x | loops.rb:2:9:2:9 | x | -| loops.rb:2:9:2:9 | x | loops.rb:3:5:3:10 | self | -| loops.rb:3:5:3:10 | self | loops.rb:3:5:3:10 | self | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:8:1:22:3 | enter m2 | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:9:3:20:5 | while ... | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:9:9:9:9 | x | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:10:5:10:10 | self | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:13:7:13:11 | break | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:14:11:14:11 | x | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:15:7:15:10 | next | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:16:11:16:11 | x | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:17:7:17:10 | redo | -| loops.rb:9:3:20:5 | while ... | loops.rb:9:3:20:5 | while ... | -| loops.rb:9:9:9:9 | x | loops.rb:9:3:20:5 | while ... | -| loops.rb:9:9:9:9 | x | loops.rb:9:9:9:9 | x | -| loops.rb:9:9:9:9 | x | loops.rb:10:5:10:10 | self | -| loops.rb:9:9:9:9 | x | loops.rb:13:7:13:11 | break | -| loops.rb:9:9:9:9 | x | loops.rb:14:11:14:11 | x | -| loops.rb:9:9:9:9 | x | loops.rb:15:7:15:10 | next | -| loops.rb:9:9:9:9 | x | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:9:9:9:9 | x | loops.rb:16:11:16:11 | x | -| loops.rb:9:9:9:9 | x | loops.rb:17:7:17:10 | redo | -| loops.rb:10:5:10:10 | self | loops.rb:10:5:10:10 | self | -| loops.rb:10:5:10:10 | self | loops.rb:13:7:13:11 | break | -| loops.rb:10:5:10:10 | self | loops.rb:14:11:14:11 | x | -| loops.rb:10:5:10:10 | self | loops.rb:15:7:15:10 | next | -| loops.rb:10:5:10:10 | self | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:10:5:10:10 | self | loops.rb:16:11:16:11 | x | -| loops.rb:10:5:10:10 | self | loops.rb:17:7:17:10 | redo | -| loops.rb:13:7:13:11 | break | loops.rb:13:7:13:11 | break | -| loops.rb:14:11:14:11 | x | loops.rb:14:11:14:11 | x | -| loops.rb:14:11:14:11 | x | loops.rb:15:7:15:10 | next | -| loops.rb:14:11:14:11 | x | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:14:11:14:11 | x | loops.rb:16:11:16:11 | x | -| loops.rb:14:11:14:11 | x | loops.rb:17:7:17:10 | redo | -| loops.rb:15:7:15:10 | next | loops.rb:15:7:15:10 | next | -| loops.rb:16:5:17:10 | elsif ... | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:16:11:16:11 | x | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:16:11:16:11 | x | loops.rb:16:11:16:11 | x | -| loops.rb:16:11:16:11 | x | loops.rb:17:7:17:10 | redo | -| loops.rb:17:7:17:10 | redo | loops.rb:17:7:17:10 | redo | -| loops.rb:24:1:28:3 | enter m3 | loops.rb:24:1:28:3 | enter m3 | -| loops.rb:25:16:27:5 | enter do ... end | loops.rb:25:16:27:5 | enter do ... end | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:30:1:33:3 | enter m4 | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:31:3:32:5 | while ... | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:31:9:31:9 | x | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:31:15:32:5 | do ... | -| loops.rb:31:3:32:5 | while ... | loops.rb:31:3:32:5 | while ... | -| loops.rb:31:9:31:9 | x | loops.rb:31:3:32:5 | while ... | -| loops.rb:31:9:31:9 | x | loops.rb:31:9:31:9 | x | -| loops.rb:31:9:31:9 | x | loops.rb:31:15:32:5 | do ... | -| loops.rb:31:15:32:5 | do ... | loops.rb:31:15:32:5 | do ... | -| raise.rb:1:1:182:4 | enter raise.rb | raise.rb:1:1:182:4 | enter raise.rb | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:7:1:12:3 | exit m1 | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:8:3:10:5 | if ... | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:9:5:9:17 | self | -| raise.rb:7:1:12:3 | exit m1 | raise.rb:7:1:12:3 | exit m1 | -| raise.rb:8:3:10:5 | if ... | raise.rb:8:3:10:5 | if ... | -| raise.rb:9:5:9:17 | self | raise.rb:9:5:9:17 | self | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:1:23:3 | exit m2 | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:1:23:3 | exit m2 (abnormal) | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:16:5:18:7 | if ... | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:17:7:17:22 | self | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:20:5:20:18 | self | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:22:3:22:15 | self | -| raise.rb:14:1:23:3 | exit m2 | raise.rb:14:1:23:3 | exit m2 | -| raise.rb:14:1:23:3 | exit m2 (abnormal) | raise.rb:14:1:23:3 | exit m2 (abnormal) | -| raise.rb:16:5:18:7 | if ... | raise.rb:16:5:18:7 | if ... | -| raise.rb:17:7:17:22 | self | raise.rb:14:1:23:3 | exit m2 (abnormal) | -| raise.rb:17:7:17:22 | self | raise.rb:17:7:17:22 | self | -| raise.rb:17:7:17:22 | self | raise.rb:20:5:20:18 | self | -| raise.rb:20:5:20:18 | self | raise.rb:20:5:20:18 | self | -| raise.rb:22:3:22:15 | self | raise.rb:22:3:22:15 | self | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:27:5:29:7 | if ... | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:28:7:28:22 | self | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:33:3:33:15 | self | -| raise.rb:27:5:29:7 | if ... | raise.rb:27:5:29:7 | if ... | -| raise.rb:28:7:28:22 | self | raise.rb:28:7:28:22 | self | -| raise.rb:33:3:33:15 | self | raise.rb:33:3:33:15 | self | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:38:5:40:7 | if ... | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:39:7:39:22 | self | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:44:3:44:15 | self | -| raise.rb:38:5:40:7 | if ... | raise.rb:38:5:40:7 | if ... | -| raise.rb:39:7:39:22 | self | raise.rb:39:7:39:22 | self | -| raise.rb:44:3:44:15 | self | raise.rb:44:3:44:15 | self | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:49:5:51:7 | if ... | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:50:7:50:22 | self | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:54:3:54:15 | self | -| raise.rb:49:5:51:7 | if ... | raise.rb:49:5:51:7 | if ... | -| raise.rb:50:7:50:22 | self | raise.rb:50:7:50:22 | self | -| raise.rb:54:3:54:15 | self | raise.rb:54:3:54:15 | self | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:1:66:3 | exit m6 | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:1:66:3 | exit m6 (abnormal) | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:59:5:61:7 | if ... | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:60:7:60:22 | self | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:62:36:62:36 | e | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:65:3:65:15 | self | -| raise.rb:57:1:66:3 | exit m6 | raise.rb:57:1:66:3 | exit m6 | -| raise.rb:57:1:66:3 | exit m6 (abnormal) | raise.rb:57:1:66:3 | exit m6 (abnormal) | -| raise.rb:59:5:61:7 | if ... | raise.rb:59:5:61:7 | if ... | -| raise.rb:60:7:60:22 | self | raise.rb:57:1:66:3 | exit m6 (abnormal) | -| raise.rb:60:7:60:22 | self | raise.rb:60:7:60:22 | self | -| raise.rb:60:7:60:22 | self | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:60:7:60:22 | self | raise.rb:62:36:62:36 | e | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:62:36:62:36 | e | raise.rb:62:36:62:36 | e | -| raise.rb:65:3:65:15 | self | raise.rb:65:3:65:15 | self | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:1:77:3 | exit m7 | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:1:77:3 | exit m7 (normal) | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:70:5:70:17 | self | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:71:9:71:9 | x | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: exception] self | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | self | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:68:1:77:3 | exit m7 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:68:1:77:3 | exit m7 (normal) | -| raise.rb:70:5:70:17 | self | raise.rb:70:5:70:17 | self | -| raise.rb:71:3:72:18 | elsif ... | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:71:3:72:18 | elsif ... | raise.rb:76:3:76:15 | self | -| raise.rb:71:9:71:9 | x | raise.rb:68:1:77:3 | exit m7 (normal) | -| raise.rb:71:9:71:9 | x | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:71:9:71:9 | x | raise.rb:71:9:71:9 | x | -| raise.rb:71:9:71:9 | x | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | self | -| raise.rb:72:13:72:17 | x < 0 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:3:76:15 | [ensure: exception] self | -| raise.rb:76:3:76:15 | self | raise.rb:76:3:76:15 | self | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | exit m8 | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | exit m8 (normal) | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:83:7:83:19 | self | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:84:11:84:11 | x | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: exception] self | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | self | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | exit m8 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:79:1:92:3 | exit m8 (normal) | -| raise.rb:83:7:83:19 | self | raise.rb:83:7:83:19 | self | -| raise.rb:84:5:85:20 | elsif ... | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:84:5:85:20 | elsif ... | raise.rb:89:5:89:17 | self | -| raise.rb:84:11:84:11 | x | raise.rb:79:1:92:3 | exit m8 (normal) | -| raise.rb:84:11:84:11 | x | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:84:11:84:11 | x | raise.rb:84:11:84:11 | x | -| raise.rb:84:11:84:11 | x | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | self | -| raise.rb:85:15:85:19 | x < 0 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:5:89:17 | [ensure: exception] self | -| raise.rb:89:5:89:17 | self | raise.rb:89:5:89:17 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | exit m9 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | exit m9 (abnormal) | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | exit m9 (normal) | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:97:8:97:8 | x | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:98:7:98:19 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:99:11:99:11 | x | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:104:5:104:23 | [ensure: exception] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:104:5:104:23 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:7:108:9 | if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:106:10:106:11 | b1 | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:107:9:107:26 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:115:3:115:22 | [ensure: exception] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:115:3:115:22 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | [ensure: exception] if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:116:3:118:5 | if ... | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | [ensure: exception] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:117:5:117:22 | self | -| raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | exit m9 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:94:1:119:3 | exit m9 (abnormal) | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:94:1:119:3 | exit m9 (normal) | -| raise.rb:97:8:97:8 | x | raise.rb:94:1:119:3 | exit m9 (normal) | -| raise.rb:97:8:97:8 | x | raise.rb:97:8:97:8 | x | -| raise.rb:97:8:97:8 | x | raise.rb:98:7:98:19 | self | -| raise.rb:97:8:97:8 | x | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:97:8:97:8 | x | raise.rb:99:11:99:11 | x | -| raise.rb:97:8:97:8 | x | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: exception] self | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | self | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | if ... | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | b1 | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | self | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:97:8:97:8 | x | raise.rb:115:3:115:22 | self | -| raise.rb:97:8:97:8 | x | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:97:8:97:8 | x | raise.rb:116:3:118:5 | if ... | -| raise.rb:97:8:97:8 | x | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:97:8:97:8 | x | raise.rb:117:5:117:22 | self | -| raise.rb:98:7:98:19 | self | raise.rb:98:7:98:19 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:104:5:104:23 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:107:9:107:26 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:115:3:115:22 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:117:5:117:22 | self | -| raise.rb:99:11:99:11 | x | raise.rb:94:1:119:3 | exit m9 (normal) | -| raise.rb:99:11:99:11 | x | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:99:11:99:11 | x | raise.rb:99:11:99:11 | x | -| raise.rb:99:11:99:11 | x | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:99:11:99:11 | x | raise.rb:104:5:104:23 | self | -| raise.rb:99:11:99:11 | x | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:99:11:99:11 | x | raise.rb:106:7:108:9 | if ... | -| raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | b1 | -| raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | self | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:99:11:99:11 | x | raise.rb:115:3:115:22 | self | -| raise.rb:99:11:99:11 | x | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:99:11:99:11 | x | raise.rb:116:3:118:5 | if ... | -| raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | self | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:104:5:104:23 | self | raise.rb:104:5:104:23 | self | -| raise.rb:104:5:104:23 | self | raise.rb:106:7:108:9 | if ... | -| raise.rb:104:5:104:23 | self | raise.rb:106:10:106:11 | b1 | -| raise.rb:104:5:104:23 | self | raise.rb:107:9:107:26 | self | -| raise.rb:104:5:104:23 | self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:104:5:104:23 | self | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:104:5:104:23 | self | raise.rb:115:3:115:22 | self | -| raise.rb:104:5:104:23 | self | raise.rb:116:3:118:5 | if ... | -| raise.rb:104:5:104:23 | self | raise.rb:117:5:117:22 | self | -| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:106:7:108:9 | if ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:106:7:108:9 | if ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:106:7:108:9 | if ... | raise.rb:115:3:115:22 | self | -| raise.rb:106:7:108:9 | if ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:106:7:108:9 | if ... | raise.rb:117:5:117:22 | self | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | b1 | -| raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:106:10:106:11 | b1 | raise.rb:115:3:115:22 | self | -| raise.rb:106:10:106:11 | b1 | raise.rb:116:3:118:5 | if ... | -| raise.rb:106:10:106:11 | b1 | raise.rb:117:5:117:22 | self | -| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:107:9:107:26 | self | raise.rb:107:9:107:26 | self | -| raise.rb:107:9:107:26 | self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:113:14:113:19 | After ... > ... [false] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:113:14:113:19 | After ... > ... [true] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:120:8:120:28 | Entry | cfg.rb:120:8:120:28 | Entry | +| cfg.rb:136:1:136:3 | After ... / ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:136:12:136:29 | Before call to puts | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:145:3:148:5 | Entry | cfg.rb:145:3:148:5 | Entry | +| cfg.rb:152:1:154:3 | Entry | cfg.rb:152:1:154:3 | Entry | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:172:8:172:14 | After ... == ... [false] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:172:8:172:14 | After ... == ... [true] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:174:18:174:23 | After ... == ... [false] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:174:18:174:23 | After ... == ... [true] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:176:7:176:12 | After ... > ... [false] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:179:30:179:36 | After ... == ... [false] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:184:6:184:11 | After ... == ... [true] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:188:30:188:35 | After ... != ... [true] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:190:1:192:3 | Entry | cfg.rb:190:1:192:3 | Entry | +| cfg.rb:194:11:194:23 | Entry | cfg.rb:194:11:194:23 | Entry | +| cfg.rb:196:1:198:3 | Entry | cfg.rb:196:1:198:3 | Entry | +| cfg.rb:200:9:200:32 | Entry | cfg.rb:200:9:200:32 | Entry | +| cfg.rb:202:9:202:35 | Entry | cfg.rb:202:9:202:35 | Entry | +| cfg.rb:205:4:205:5 | After call to == [false] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:205:4:205:5 | After call to == [true] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:205:15:205:23 | Entry | cfg.rb:205:15:205:23 | Entry | +| cfg.rb:207:1:211:3 | Entry | cfg.rb:207:1:211:3 | Entry | +| cfg.rb:208:15:210:5 | Entry | cfg.rb:208:15:210:5 | Entry | +| cfg.rb:213:14:216:3 | Entry | cfg.rb:213:14:216:3 | Entry | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | +| desugar.rb:1:1:3:3 | Entry | desugar.rb:1:1:3:3 | Entry | +| desugar.rb:1:1:38:17 | Entry | desugar.rb:1:1:38:17 | Entry | +| desugar.rb:5:1:7:3 | Entry | desugar.rb:5:1:7:3 | Entry | +| desugar.rb:9:1:11:3 | Entry | desugar.rb:9:1:11:3 | Entry | +| desugar.rb:13:1:15:3 | Entry | desugar.rb:13:1:15:3 | Entry | +| desugar.rb:17:1:19:3 | Entry | desugar.rb:17:1:19:3 | Entry | +| desugar.rb:21:1:23:3 | Entry | desugar.rb:21:1:23:3 | Entry | +| desugar.rb:25:1:27:3 | Entry | desugar.rb:25:1:27:3 | Entry | +| exit.rb:1:1:6:3 | Entry | exit.rb:1:1:6:3 | Entry | +| exit.rb:1:1:6:3 | Entry | exit.rb:1:1:6:3 | Exit | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [false] | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [true] | +| exit.rb:1:1:6:3 | Exit | exit.rb:1:1:6:3 | Exit | +| exit.rb:1:1:13:4 | Entry | exit.rb:1:1:13:4 | Entry | +| exit.rb:2:6:2:10 | After ... > ... [false] | exit.rb:2:6:2:10 | After ... > ... [false] | +| exit.rb:2:6:2:10 | After ... > ... [true] | exit.rb:2:6:2:10 | After ... > ... [true] | +| exit.rb:8:1:13:3 | Entry | exit.rb:8:1:13:3 | Entry | +| exit.rb:8:1:13:3 | Entry | exit.rb:8:1:13:3 | Exit | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [false] | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [true] | +| exit.rb:8:1:13:3 | Exit | exit.rb:8:1:13:3 | Exit | +| exit.rb:9:6:9:10 | After ... > ... [false] | exit.rb:9:6:9:10 | After ... > ... [false] | +| exit.rb:9:6:9:10 | After ... > ... [true] | exit.rb:9:6:9:10 | After ... > ... [true] | +| heredoc.rb:1:1:7:3 | Entry | heredoc.rb:1:1:7:3 | Entry | +| heredoc.rb:1:1:7:4 | Entry | heredoc.rb:1:1:7:4 | Entry | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:3:8:5 | After if ... | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [true] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:3:7:35 | After elsif ... | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:36:1:38:17 | After ... unless ... | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [false] | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [true] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:2:3:8:5 | After if ... | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:3:7:35 | After elsif ... | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:2:6:2:10 | After ... > ... [true] | ifs.rb:2:6:2:10 | After ... > ... [true] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:3:7:35 | After elsif ... | +| ifs.rb:4:9:4:14 | After ... <= ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:4:20:4:24 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:4:32:4:37 | After ... == ... [false] | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:4:32:4:37 | After ... == ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:11:1:16:3 | Normal Exit | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [false] | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [true] | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:11:1:16:3 | Normal Exit | +| ifs.rb:12:6:12:6 | After b [false] | ifs.rb:12:6:12:6 | After b [false] | +| ifs.rb:12:6:12:6 | After b [true] | ifs.rb:12:6:12:6 | After b [true] | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:3:24:5 | After if ... | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [false] | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:5:23:7 | After if ... | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:19:3:24:5 | After if ... | +| ifs.rb:19:6:19:10 | After ... < ... [false] | ifs.rb:19:6:19:10 | After ... < ... [false] | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:5:23:7 | After if ... | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:21:5:23:7 | After if ... | +| ifs.rb:21:8:21:13 | After ... > ... [false] | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:21:8:21:13 | After ... > ... [true] | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:10:29:51 | After ... ? ... : ... | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:10:29:51 | After ... ? ... : ... | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | +| ifs.rb:29:16:29:17 | After b2 [false] | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:29:16:29:17 | After b2 [true] | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:29:21:29:22 | After b3 [false] | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:29:21:29:22 | After b3 [true] | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:3:33:100 | After if ... | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:7:33:48 | After if ... [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:7:33:48 | After if ... [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:3:33:100 | After if ... | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:7:33:48 | After if ... [false] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:7:33:48 | After if ... [true] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:33:18:33:19 | After b2 [false] | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:33:18:33:19 | After b2 [true] | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:35:33:36 | After b4 [false] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:35:33:36 | After b4 [true] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:43:33:44 | After b5 [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:43:33:44 | After b5 [true] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:36:1:38:3 | Entry | ifs.rb:36:1:38:3 | Entry | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:36:1:38:17 | After ... unless ... | +| ifs.rb:38:12:38:17 | After ... == ... [false] | ifs.rb:38:12:38:17 | After ... == ... [false] | +| ifs.rb:38:12:38:17 | After ... == ... [true] | ifs.rb:38:12:38:17 | After ... == ... [true] | +| ifs.rb:40:1:44:3 | Entry | ifs.rb:40:1:44:3 | Entry | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:3:50:5 | After if ... | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [false] | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [true] | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:47:3:50:5 | After if ... | +| ifs.rb:47:6:47:6 | After b [false] | ifs.rb:47:6:47:6 | After b [false] | +| ifs.rb:47:6:47:6 | After b [true] | ifs.rb:47:6:47:6 | After b [true] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:3:57:5 | After if ... | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [false] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [true] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:13:55:14 | After b2 [false] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:13:55:14 | After b2 [true] | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:3:57:5 | After if ... | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:7:55:8 | After b1 [false] | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [false] | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [true] | +| ifs.rb:55:7:55:8 | After b1 [true] | ifs.rb:55:7:55:8 | After b1 [true] | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | +| ifs.rb:55:13:55:14 | After b2 [false] | ifs.rb:55:13:55:14 | After b2 [false] | +| ifs.rb:55:13:55:14 | After b2 [true] | ifs.rb:55:13:55:14 | After b2 [true] | +| loops.rb:1:1:6:3 | Entry | loops.rb:1:1:6:3 | Entry | +| loops.rb:1:1:6:3 | Entry | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:1:1:6:3 | Entry | loops.rb:2:9:2:14 | After ... >= ... [false] | +| loops.rb:1:1:6:3 | Entry | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:1:1:33:4 | Entry | loops.rb:1:1:33:4 | Entry | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [false] | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:9:2:14 | After ... >= ... [false] | +| loops.rb:2:9:2:14 | After ... >= ... [true] | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:8:1:22:3 | Entry | loops.rb:8:1:22:3 | Entry | +| loops.rb:8:1:22:3 | Entry | loops.rb:9:3:20:5 | After while ... | +| loops.rb:8:1:22:3 | Entry | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:8:1:22:3 | Entry | loops.rb:9:9:9:14 | After ... >= ... [false] | +| loops.rb:8:1:22:3 | Entry | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:8:1:22:3 | Entry | loops.rb:9:15:20:5 | do ... | +| loops.rb:8:1:22:3 | Entry | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:8:1:22:3 | Entry | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:8:1:22:3 | Entry | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:8:1:22:3 | Entry | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:8:1:22:3 | Entry | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:8:1:22:3 | Entry | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:3:20:5 | After while ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:3:20:5 | After while ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [false] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:15:20:5 | do ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:9:9:9:14 | After ... >= ... [false] | loops.rb:9:9:9:14 | After ... >= ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:9:15:20:5 | do ... | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:9:15:20:5 | do ... | loops.rb:9:15:20:5 | do ... | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:9:15:20:5 | do ... | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:9:15:20:5 | do ... | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:9:15:20:5 | do ... | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:9:15:20:5 | do ... | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:12:8:12:14 | After ... > ... [true] | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:14:11:14:16 | After ... > ... [true] | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:16:11:16:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:16:11:16:16 | After ... > ... [true] | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:24:1:28:3 | Entry | loops.rb:24:1:28:3 | Entry | +| loops.rb:25:16:27:5 | Entry | loops.rb:25:16:27:5 | Entry | +| loops.rb:30:1:33:3 | Entry | loops.rb:30:1:33:3 | Entry | +| loops.rb:30:1:33:3 | Entry | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| loops.rb:30:1:33:3 | Entry | loops.rb:31:9:31:13 | After ... < ... [false] | +| loops.rb:30:1:33:3 | Entry | loops.rb:31:9:31:13 | After ... < ... [true] | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [false] | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [true] | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:9:31:13 | After ... < ... [false] | +| loops.rb:31:9:31:13 | After ... < ... [true] | loops.rb:31:9:31:13 | After ... < ... [true] | +| raise.rb:1:1:182:4 | Entry | raise.rb:1:1:182:4 | Entry | +| raise.rb:7:1:12:3 | Entry | raise.rb:7:1:12:3 | Entry | +| raise.rb:7:1:12:3 | Entry | raise.rb:7:1:12:3 | Exit | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [false] | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [true] | +| raise.rb:7:1:12:3 | Exit | raise.rb:7:1:12:3 | Exit | +| raise.rb:8:6:8:10 | After ... > ... [false] | raise.rb:8:6:8:10 | After ... > ... [false] | +| raise.rb:8:6:8:10 | After ... > ... [true] | raise.rb:8:6:8:10 | After ... > ... [true] | +| raise.rb:14:1:23:3 | Entry | raise.rb:14:1:23:3 | Entry | +| raise.rb:14:1:23:3 | Entry | raise.rb:14:1:23:3 | Exit | +| raise.rb:14:1:23:3 | Entry | raise.rb:15:3:21:5 | After begin ... | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [false] | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:14:1:23:3 | Entry | raise.rb:19:10:19:19 | After ExceptionA [match] | +| raise.rb:14:1:23:3 | Entry | raise.rb:19:10:19:19 | After ExceptionA [no-match] | +| raise.rb:14:1:23:3 | Exit | raise.rb:14:1:23:3 | Exit | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:15:3:21:5 | After begin ... | +| raise.rb:16:8:16:8 | After b [false] | raise.rb:16:8:16:8 | After b [false] | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [match] | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [no-match] | +| raise.rb:19:10:19:19 | After ExceptionA [match] | raise.rb:19:10:19:19 | After ExceptionA [match] | +| raise.rb:19:10:19:19 | After ExceptionA [no-match] | raise.rb:19:10:19:19 | After ExceptionA [no-match] | +| raise.rb:25:1:34:3 | Entry | raise.rb:25:1:34:3 | Entry | +| raise.rb:25:1:34:3 | Entry | raise.rb:26:3:32:5 | After begin ... | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [false] | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [true] | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:26:3:32:5 | After begin ... | +| raise.rb:27:8:27:8 | After b [false] | raise.rb:27:8:27:8 | After b [false] | +| raise.rb:27:8:27:8 | After b [true] | raise.rb:27:8:27:8 | After b [true] | +| raise.rb:36:1:45:3 | Entry | raise.rb:36:1:45:3 | Entry | +| raise.rb:36:1:45:3 | Entry | raise.rb:37:3:43:5 | After begin ... | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [false] | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [true] | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:37:3:43:5 | After begin ... | +| raise.rb:38:8:38:8 | After b [false] | raise.rb:38:8:38:8 | After b [false] | +| raise.rb:38:8:38:8 | After b [true] | raise.rb:38:8:38:8 | After b [true] | +| raise.rb:47:1:55:3 | Entry | raise.rb:47:1:55:3 | Entry | +| raise.rb:47:1:55:3 | Entry | raise.rb:48:3:53:5 | After begin ... | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [false] | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [true] | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:48:3:53:5 | After begin ... | +| raise.rb:49:8:49:8 | After b [false] | raise.rb:49:8:49:8 | After b [false] | +| raise.rb:49:8:49:8 | After b [true] | raise.rb:49:8:49:8 | After b [true] | +| raise.rb:57:1:66:3 | Entry | raise.rb:57:1:66:3 | Entry | +| raise.rb:57:1:66:3 | Entry | raise.rb:57:1:66:3 | Exit | +| raise.rb:57:1:66:3 | Entry | raise.rb:58:3:64:5 | After begin ... | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [false] | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:57:1:66:3 | Entry | raise.rb:62:10:62:31 | After ..., ... [match] | +| raise.rb:57:1:66:3 | Entry | raise.rb:62:10:62:31 | After ..., ... [no-match] | +| raise.rb:57:1:66:3 | Exit | raise.rb:57:1:66:3 | Exit | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:58:3:64:5 | After begin ... | +| raise.rb:59:8:59:8 | After b [false] | raise.rb:59:8:59:8 | After b [false] | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [match] | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [no-match] | +| raise.rb:62:10:62:31 | After ..., ... [match] | raise.rb:62:10:62:31 | After ..., ... [match] | +| raise.rb:62:10:62:31 | After ..., ... [no-match] | raise.rb:62:10:62:31 | After ..., ... [no-match] | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:1:77:3 | Entry | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:1:77:3 | Exceptional Exit | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:1:77:3 | Exit | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:1:77:3 | Normal Exit | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:3:76:15 | After ... | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [true] | +| raise.rb:68:1:77:3 | Entry | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:68:1:77:3 | Entry | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:68:1:77:3 | Entry | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:68:1:77:3 | Entry | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:68:1:77:3 | Exceptional Exit | raise.rb:68:1:77:3 | Exceptional Exit | +| raise.rb:68:1:77:3 | Exit | raise.rb:68:1:77:3 | Exit | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:68:1:77:3 | Normal Exit | +| raise.rb:69:3:76:15 | After ... | raise.rb:69:3:76:15 | After ... | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:69:6:69:10 | After ... > ... [true] | raise.rb:69:6:69:10 | After ... > ... [true] | +| raise.rb:71:9:71:13 | After ... < ... [false] | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:71:9:71:13 | After ... < ... [false] | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:71:9:71:13 | After ... < ... [true] | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:74:3:74:20 | After call to puts | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | Exceptional Exit | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | Exit | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | Normal Exit | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:69:3:76:15 | After ... | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:1:92:3 | Entry | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:1:92:3 | Exceptional Exit | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:1:92:3 | Exit | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:1:92:3 | Normal Exit | +| raise.rb:79:1:92:3 | Entry | raise.rb:81:3:90:5 | After begin ... | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [true] | +| raise.rb:79:1:92:3 | Entry | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:79:1:92:3 | Entry | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:79:1:92:3 | Entry | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:79:1:92:3 | Entry | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:79:1:92:3 | Exceptional Exit | raise.rb:79:1:92:3 | Exceptional Exit | +| raise.rb:79:1:92:3 | Exit | raise.rb:79:1:92:3 | Exit | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:79:1:92:3 | Normal Exit | +| raise.rb:81:3:90:5 | After begin ... | raise.rb:81:3:90:5 | After begin ... | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:82:8:82:12 | After ... > ... [true] | raise.rb:82:8:82:12 | After ... > ... [true] | +| raise.rb:84:11:84:15 | After ... < ... [false] | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:84:11:84:15 | After ... < ... [false] | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:84:11:84:15 | After ... < ... [true] | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:87:5:87:22 | After call to puts | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:79:1:92:3 | Exceptional Exit | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:79:1:92:3 | Exit | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:79:1:92:3 | Normal Exit | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:81:3:90:5 | After begin ... | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:1:119:3 | Entry | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:1:119:3 | Exceptional Exit | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:1:119:3 | Exit | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:1:119:3 | Normal Exit | +| raise.rb:94:1:119:3 | Entry | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:94:1:119:3 | Entry | raise.rb:95:3:118:5 | After ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:94:1:119:3 | Entry | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:94:1:119:3 | Entry | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:94:1:119:3 | Entry | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:94:1:119:3 | Entry | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:94:1:119:3 | Entry | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:94:1:119:3 | Entry | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:94:1:119:3 | Entry | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:94:1:119:3 | Entry | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:94:1:119:3 | Entry | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:94:1:119:3 | Entry | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:94:1:119:3 | Entry | raise.rb:116:6:116:7 | After b2 [true] | +| raise.rb:94:1:119:3 | Exceptional Exit | raise.rb:94:1:119:3 | Exceptional Exit | +| raise.rb:94:1:119:3 | Exit | raise.rb:94:1:119:3 | Exit | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:94:1:119:3 | Normal Exit | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:95:3:118:5 | After ... | raise.rb:95:3:118:5 | After ... | +| raise.rb:96:3:112:5 | After begin ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:96:3:112:5 | After begin ... | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:97:8:97:12 | After ... > ... [true] | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:99:11:99:15 | After ... < ... [false] | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:99:11:99:15 | After ... < ... [false] | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:99:11:99:15 | After ... < ... [true] | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:102:5:102:22 | After call to puts | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:106:10:106:11 | After b1 [false] | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:106:10:106:11 | After b1 [true] | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:105:5:111:7 | After begin ... | | raise.rb:109:5:110:25 | ensure ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:115:3:115:22 | self | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:117:5:117:22 | self | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | -| raise.rb:115:3:115:22 | self | raise.rb:115:3:115:22 | self | -| raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | -| raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | -| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:116:3:118:5 | [ensure: exception] if ... | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | -| raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:117:5:117:22 | self | raise.rb:117:5:117:22 | self | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:1:126:3 | exit m10 | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:125:3:125:51 | self | -| raise.rb:121:1:126:3 | exit m10 | raise.rb:121:1:126:3 | exit m10 | -| raise.rb:121:14:121:30 | self | raise.rb:121:14:121:30 | self | -| raise.rb:125:3:125:51 | self | raise.rb:125:3:125:51 | self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:128:1:140:3 | exit m11 | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:130:5:132:7 | if ... | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:131:7:131:22 | self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:133:3:133:19 | rescue ... | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:135:5:135:21 | self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: exception] self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | self | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:128:1:140:3 | exit m11 | -| raise.rb:130:5:132:7 | if ... | raise.rb:130:5:132:7 | if ... | -| raise.rb:131:7:131:22 | self | raise.rb:131:7:131:22 | self | -| raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | -| raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:131:7:131:22 | self | raise.rb:135:5:135:21 | self | -| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: exception] self | -| raise.rb:133:3:133:19 | rescue ... | raise.rb:133:3:133:19 | rescue ... | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | -| raise.rb:135:5:135:21 | self | raise.rb:135:5:135:21 | self | -| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:5:137:17 | [ensure: exception] self | -| raise.rb:137:5:137:17 | self | raise.rb:137:5:137:17 | self | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:142:1:148:3 | exit m12 (normal) | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:143:3:145:5 | if ... | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:144:5:144:12 | self | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | exit m12 (normal) | -| raise.rb:143:3:145:5 | if ... | raise.rb:143:3:145:5 | if ... | -| raise.rb:144:5:144:12 | self | raise.rb:144:5:144:12 | self | -| raise.rb:150:1:152:3 | enter m13 | raise.rb:150:1:152:3 | enter m13 | -| raise.rb:154:1:156:3 | enter m14 | raise.rb:154:1:156:3 | enter m14 | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:16:155:50 | exit { ... } | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:32 | self | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:48 | ... if ... | -| raise.rb:155:16:155:50 | exit { ... } | raise.rb:155:16:155:50 | exit { ... } | -| raise.rb:155:25:155:32 | self | raise.rb:155:25:155:32 | self | -| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:25:155:48 | ... if ... | -| raise.rb:158:1:164:3 | enter m15 | raise.rb:158:1:164:3 | enter m15 | -| raise.rb:159:7:163:5 | enter do ... end | raise.rb:159:7:163:5 | enter do ... end | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:160:9:162:7 | exit -> { ... } | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:14 | self | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:23 | ... unless ... | -| raise.rb:160:9:162:7 | exit -> { ... } | raise.rb:160:9:162:7 | exit -> { ... } | -| raise.rb:161:7:161:14 | self | raise.rb:161:7:161:14 | self | -| raise.rb:161:7:161:23 | ... unless ... | raise.rb:161:7:161:23 | ... unless ... | -| raise.rb:167:3:169:5 | enter m | raise.rb:167:3:169:5 | enter m | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:1:182:3 | exit m16 | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:1:182:3 | exit m16 (abnormal) | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:1:182:3 | exit m16 (normal) | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:8:174:23 | [true] ... \|\| ... | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:14:174:15 | b2 | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:175:14:175:14 | 1 | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:177:14:177:14 | 2 | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:180:12:180:12 | 3 | -| raise.rb:172:1:182:3 | exit m16 | raise.rb:172:1:182:3 | exit m16 | -| raise.rb:172:1:182:3 | exit m16 (abnormal) | raise.rb:172:1:182:3 | exit m16 (abnormal) | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:172:1:182:3 | exit m16 (normal) | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:174:8:174:23 | [true] ... \|\| ... | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:14:174:15 | b2 | -| raise.rb:174:14:174:15 | b2 | raise.rb:177:14:177:14 | 2 | -| raise.rb:175:14:175:14 | 1 | raise.rb:175:14:175:14 | 1 | -| raise.rb:177:14:177:14 | 2 | raise.rb:177:14:177:14 | 2 | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | -| raise.rb:180:12:180:12 | 3 | raise.rb:180:12:180:12 | 3 | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:113:3:113:15 | After call to puts | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Exceptional Exit | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Exit | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Normal Exit | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:95:3:118:5 | After ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [true] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:94:1:119:3 | Normal Exit | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:95:3:118:5 | After ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:116:6:116:7 | After b2 [true] | raise.rb:116:6:116:7 | After b2 [true] | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:1:126:3 | Entry | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:1:126:3 | Exit | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [match] | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [no-match] | +| raise.rb:121:1:126:3 | Exit | raise.rb:121:1:126:3 | Exit | +| raise.rb:121:9:121:9 | After p [match] | raise.rb:121:9:121:9 | After p [match] | +| raise.rb:121:9:121:9 | After p [no-match] | raise.rb:121:9:121:9 | After p [no-match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:128:1:140:3 | Entry | +| raise.rb:128:1:140:3 | Entry | raise.rb:128:1:140:3 | Exceptional Exit | +| raise.rb:128:1:140:3 | Entry | raise.rb:128:1:140:3 | Exit | +| raise.rb:128:1:140:3 | Entry | raise.rb:129:3:138:5 | After begin ... | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [false] | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:128:1:140:3 | Entry | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:128:1:140:3 | Exceptional Exit | raise.rb:128:1:140:3 | Exceptional Exit | +| raise.rb:128:1:140:3 | Exit | raise.rb:128:1:140:3 | Exit | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:129:3:138:5 | After begin ... | +| raise.rb:130:8:130:8 | After b [false] | raise.rb:130:8:130:8 | After b [false] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:133:10:133:19 | After ExceptionA [match] | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:134:10:134:19 | After ExceptionB [match] | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:134:10:134:19 | After ExceptionB [no-match] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:128:1:140:3 | Exceptional Exit | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:128:1:140:3 | Exit | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:129:3:138:5 | After begin ... | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:142:1:148:3 | Entry | raise.rb:142:1:148:3 | Entry | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [false] | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [true] | +| raise.rb:142:1:148:3 | Entry | raise.rb:146:1:147:10 | ensure ... | +| raise.rb:143:6:143:6 | After b [false] | raise.rb:143:6:143:6 | After b [false] | +| raise.rb:143:6:143:6 | After b [true] | raise.rb:143:6:143:6 | After b [true] | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:146:1:147:10 | ensure ... | +| raise.rb:150:1:152:3 | Entry | raise.rb:150:1:152:3 | Entry | +| raise.rb:154:1:156:3 | Entry | raise.rb:154:1:156:3 | Entry | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:16:155:50 | Entry | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:16:155:50 | Exit | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [false] | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [true] | +| raise.rb:155:16:155:50 | Exit | raise.rb:155:16:155:50 | Exit | +| raise.rb:155:37:155:48 | After call to nil? [false] | raise.rb:155:37:155:48 | After call to nil? [false] | +| raise.rb:155:37:155:48 | After call to nil? [true] | raise.rb:155:37:155:48 | After call to nil? [true] | +| raise.rb:158:1:164:3 | Entry | raise.rb:158:1:164:3 | Entry | +| raise.rb:159:7:163:5 | Entry | raise.rb:159:7:163:5 | Entry | +| raise.rb:160:9:162:7 | Entry | raise.rb:160:9:162:7 | Entry | +| raise.rb:160:9:162:7 | Entry | raise.rb:160:9:162:7 | Exit | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [false] | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [true] | +| raise.rb:160:9:162:7 | Exit | raise.rb:160:9:162:7 | Exit | +| raise.rb:161:23:161:23 | After x [false] | raise.rb:161:23:161:23 | After x [false] | +| raise.rb:161:23:161:23 | After x [true] | raise.rb:161:23:161:23 | After x [true] | +| raise.rb:167:3:169:5 | Entry | raise.rb:167:3:169:5 | Entry | +| raise.rb:172:1:182:3 | Entry | raise.rb:172:1:182:3 | Entry | +| raise.rb:172:1:182:3 | Entry | raise.rb:172:1:182:3 | Exit | +| raise.rb:172:1:182:3 | Entry | raise.rb:172:1:182:3 | Normal Exit | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [true] | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:23 | After ... \|\| ... [true] | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:14:174:23 | After ... == ... [false] | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:10:179:19 | After ExceptionA [no-match] | +| raise.rb:172:1:182:3 | Exit | raise.rb:172:1:182:3 | Exit | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:172:1:182:3 | Normal Exit | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [false] | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:179:10:179:19 | After ExceptionA [no-match] | +| raise.rb:174:8:174:9 | After b1 [true] | raise.rb:174:8:174:9 | After b1 [true] | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | +| raise.rb:174:14:174:23 | After ... == ... [false] | raise.rb:174:14:174:23 | After ... == ... [false] | +| raise.rb:174:14:174:23 | After ... == ... [true] | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [no-match] | +| raise.rb:179:10:179:19 | After ExceptionA [match] | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:179:10:179:19 | After ExceptionA [no-match] | raise.rb:179:10:179:19 | After ExceptionA [no-match] | postDominance -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:1:1:11:3 | exit m1 | -| break_ensure.rb:1:1:56:4 | enter break_ensure.rb | break_ensure.rb:1:1:56:4 | enter break_ensure.rb | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:4:7:4:11 | break | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:3:5:5:7 | if ... | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:4:7:4:11 | break | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:8:3:10:5 | if ... | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | -| break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:5:9:23 | self | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:1:25:3 | enter m2 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:13:1:25:3 | enter m2 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:3:24:5 | while ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:9:21:20 | [ensure: break] self | -| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:9:21:20 | [ensure: exception] self | -| break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:9:21:20 | self | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | exit m3 | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | exit m3 (normal) | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:5:39:7 | while ... | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:11:33:11 | [ensure: exception] y | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | -| break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | -| break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:9:37:11 | if ... | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:36:11:36:15 | [ensure: exception] break | -| break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:36:11:36:15 | [ensure: return] break | -| break_ensure.rb:36:11:36:15 | break | break_ensure.rb:36:11:36:15 | break | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:44:1:56:3 | enter m4 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:44:1:56:3 | enter m4 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:3:55:5 | while ... | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:44:1:56:3 | enter m4 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | -| break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:48:9:48:16 | self | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:15:52:16 | 10 | -| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:1:1:99:4 | enter case.rb | case.rb:1:1:99:4 | enter case.rb | -| case.rb:2:3:5:5 | case ... | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:2:3:5:5 | case ... | case.rb:2:3:5:5 | case ... | -| case.rb:2:3:5:5 | case ... | case.rb:3:5:3:42 | [match] when ... | -| case.rb:2:3:5:5 | case ... | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:2:3:5:5 | case ... | case.rb:3:18:3:41 | if ... | -| case.rb:2:3:5:5 | case ... | case.rb:3:21:3:22 | self | -| case.rb:2:3:5:5 | case ... | case.rb:3:29:3:37 | self | -| case.rb:2:3:5:5 | case ... | case.rb:4:5:4:24 | [match] when ... | -| case.rb:2:3:5:5 | case ... | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:2:3:5:5 | case ... | case.rb:4:10:4:10 | 2 | -| case.rb:2:3:5:5 | case ... | case.rb:4:17:4:24 | self | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:5:3:42 | [match] when ... | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:3:18:3:41 | if ... | case.rb:3:5:3:42 | [match] when ... | -| case.rb:3:18:3:41 | if ... | case.rb:3:18:3:41 | if ... | -| case.rb:3:18:3:41 | if ... | case.rb:3:21:3:22 | self | -| case.rb:3:18:3:41 | if ... | case.rb:3:29:3:37 | self | -| case.rb:3:21:3:22 | self | case.rb:3:5:3:42 | [match] when ... | -| case.rb:3:21:3:22 | self | case.rb:3:21:3:22 | self | -| case.rb:3:29:3:37 | self | case.rb:3:29:3:37 | self | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:5:4:24 | [match] when ... | -| case.rb:4:5:4:24 | [no-match] when ... | case.rb:4:5:4:24 | [no-match] when ... | -| case.rb:4:10:4:10 | 2 | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:4:10:4:10 | 2 | case.rb:4:10:4:10 | 2 | -| case.rb:4:17:4:24 | self | case.rb:4:5:4:24 | [match] when ... | -| case.rb:4:17:4:24 | self | case.rb:4:17:4:24 | self | -| case.rb:8:1:18:3 | enter case_match | case.rb:8:1:18:3 | enter case_match | -| case.rb:9:3:17:5 | case ... | case.rb:8:1:18:3 | enter case_match | -| case.rb:9:3:17:5 | case ... | case.rb:9:3:17:5 | case ... | -| case.rb:9:3:17:5 | case ... | case.rb:11:5:11:15 | in ... then ... | -| case.rb:9:3:17:5 | case ... | case.rb:11:15:11:15 | 3 | -| case.rb:9:3:17:5 | case ... | case.rb:12:5:13:7 | in ... then ... | -| case.rb:9:3:17:5 | case ... | case.rb:13:7:13:7 | 4 | -| case.rb:9:3:17:5 | case ... | case.rb:14:5:14:25 | in ... then ... | -| case.rb:9:3:17:5 | case ... | case.rb:14:13:14:13 | x | -| case.rb:9:3:17:5 | case ... | case.rb:14:25:14:25 | 6 | -| case.rb:9:3:17:5 | case ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:9:3:17:5 | case ... | case.rb:15:17:15:17 | x | -| case.rb:9:3:17:5 | case ... | case.rb:15:28:15:28 | 7 | -| case.rb:9:3:17:5 | case ... | case.rb:16:10:16:10 | 8 | -| case.rb:11:5:11:15 | in ... then ... | case.rb:11:5:11:15 | in ... then ... | -| case.rb:11:15:11:15 | 3 | case.rb:11:15:11:15 | 3 | -| case.rb:12:5:13:7 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | -| case.rb:13:7:13:7 | 4 | case.rb:13:7:13:7 | 4 | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | -| case.rb:14:13:14:13 | x | case.rb:14:5:14:25 | in ... then ... | -| case.rb:14:13:14:13 | x | case.rb:14:13:14:13 | x | -| case.rb:14:25:14:25 | 6 | case.rb:14:25:14:25 | 6 | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:1:1:11:3 | Exceptional Exit | break_ensure.rb:1:1:11:3 | Exceptional Exit | +| break_ensure.rb:1:1:11:3 | Exit | break_ensure.rb:1:1:11:3 | Exit | +| break_ensure.rb:1:1:56:4 | Entry | break_ensure.rb:1:1:56:4 | Entry | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:3:10:5 | After ... | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:2:9:2:13 | After ... < ... [false] | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:3:8:3:12 | After ... > ... [false] | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:3:8:3:12 | After ... > ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:2:3:6:5 | After while ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:8:6:8:18 | After call to nil? [false] | break_ensure.rb:8:6:8:18 | After call to nil? [false] | +| break_ensure.rb:8:6:8:18 | After call to nil? [true] | break_ensure.rb:8:6:8:18 | After call to nil? [true] | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:13:1:25:3 | Entry | +| break_ensure.rb:13:1:25:3 | Exceptional Exit | break_ensure.rb:13:1:25:3 | Exceptional Exit | +| break_ensure.rb:13:1:25:3 | Exit | break_ensure.rb:13:1:25:3 | Exit | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:13:1:25:3 | Entry | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:3:24:5 | After while ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:9:14:13 | After ... < ... [false] | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:13:1:25:3 | Entry | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:14:9:14:13 | After ... < ... [false] | break_ensure.rb:14:9:14:13 | After ... < ... [false] | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:15:5:23:7 | After begin ... | break_ensure.rb:15:5:23:7 | After begin ... | +| break_ensure.rb:16:10:16:14 | After ... > ... [false] | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:16:10:16:14 | After ... > ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:20:10:20:15 | After call to nil? [false] | break_ensure.rb:20:10:20:15 | After call to nil? [false] | +| break_ensure.rb:20:10:20:15 | After call to nil? [true] | break_ensure.rb:20:10:20:15 | After call to nil? [true] | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:27:1:42:3 | Exceptional Exit | break_ensure.rb:27:1:42:3 | Exceptional Exit | +| break_ensure.rb:27:1:42:3 | Exit | break_ensure.rb:27:1:42:3 | Exit | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:27:1:42:3 | Normal Exit | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:28:3:40:5 | After begin ... | break_ensure.rb:28:3:40:5 | After begin ... | +| break_ensure.rb:29:8:29:13 | After call to nil? [false] | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:29:8:29:13 | After call to nil? [true] | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:29:8:29:13 | After call to nil? [false] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:29:8:29:13 | After call to nil? [true] | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:33:11:33:15 | After ... < ... [false] | break_ensure.rb:33:11:33:15 | After ... < ... [false] | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:35:12:35:16 | After ... > ... [false] | break_ensure.rb:35:12:35:16 | After ... > ... [false] | +| break_ensure.rb:35:12:35:16 | After ... > ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [true] | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:44:1:56:3 | Entry | +| break_ensure.rb:44:1:56:3 | Exceptional Exit | break_ensure.rb:44:1:56:3 | Exceptional Exit | +| break_ensure.rb:44:1:56:3 | Exit | break_ensure.rb:44:1:56:3 | Exit | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:44:1:56:3 | Entry | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:3:55:5 | After while ... | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:9:45:13 | After ... < ... [false] | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:44:1:56:3 | Entry | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:45:9:45:13 | After ... < ... [false] | break_ensure.rb:45:9:45:13 | After ... < ... [false] | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:46:5:54:7 | After begin ... | break_ensure.rb:46:5:54:7 | After begin ... | +| break_ensure.rb:46:5:54:7 | After begin ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:47:10:47:14 | After ... > ... [false] | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:47:10:47:14 | After ... > ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:47:10:47:14 | After ... > ... [false] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:47:10:47:14 | After ... > ... [true] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:51:10:51:14 | After ... > ... [true] | break_ensure.rb:51:10:51:14 | After ... > ... [true] | +| case.rb:1:1:6:3 | Entry | case.rb:1:1:6:3 | Entry | +| case.rb:1:1:99:4 | Entry | case.rb:1:1:99:4 | Entry | +| case.rb:2:3:5:5 | After case ... | case.rb:1:1:6:3 | Entry | +| case.rb:2:3:5:5 | After case ... | case.rb:2:3:5:5 | After case ... | +| case.rb:2:3:5:5 | After case ... | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:2:3:5:5 | After case ... | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:2:3:5:5 | After case ... | case.rb:3:18:3:41 | After if ... | +| case.rb:2:3:5:5 | After case ... | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:2:3:5:5 | After case ... | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:2:3:5:5 | After case ... | case.rb:4:10:4:10 | After 2 [match] | +| case.rb:2:3:5:5 | After case ... | case.rb:4:10:4:10 | After 2 [no-match] | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:3:18:3:41 | After if ... | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:3:18:3:41 | After if ... | case.rb:3:18:3:41 | After if ... | +| case.rb:3:18:3:41 | After if ... | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:3:18:3:41 | After if ... | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:3:21:3:22 | After call to x2 [false] | case.rb:3:21:3:22 | After call to x2 [false] | +| case.rb:3:21:3:22 | After call to x2 [true] | case.rb:3:21:3:22 | After call to x2 [true] | +| case.rb:4:10:4:10 | After 2 [match] | case.rb:4:10:4:10 | After 2 [match] | +| case.rb:4:10:4:10 | After 2 [no-match] | case.rb:4:10:4:10 | After 2 [no-match] | +| case.rb:8:1:18:3 | Entry | case.rb:8:1:18:3 | Entry | +| case.rb:9:3:17:5 | After case ... | case.rb:8:1:18:3 | Entry | +| case.rb:9:3:17:5 | After case ... | case.rb:9:3:17:5 | After case ... | +| case.rb:9:3:17:5 | After case ... | case.rb:10:8:10:8 | After 0 [match] | +| case.rb:9:3:17:5 | After case ... | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:11:8:11:8 | After 1 [match] | +| case.rb:9:3:17:5 | After case ... | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:9:3:17:5 | After case ... | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:14:8:14:8 | After x [match] | +| case.rb:9:3:17:5 | After case ... | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:9:3:17:5 | After case ... | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:9:3:17:5 | After case ... | case.rb:15:5:15:28 | in ... then ... | +| case.rb:9:3:17:5 | After case ... | case.rb:15:8:15:8 | After x [match] | +| case.rb:9:3:17:5 | After case ... | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:9:3:17:5 | After case ... | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:9:3:17:5 | After case ... | case.rb:16:5:16:10 | else ... | +| case.rb:10:8:10:8 | After 0 [match] | case.rb:10:8:10:8 | After 0 [match] | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:11:8:11:8 | After 1 [match] | case.rb:11:8:11:8 | After 1 [match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:12:8:12:8 | After 2 [match] | case.rb:12:8:12:8 | After 2 [match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:8:14:8 | After x [match] | +| case.rb:14:8:14:8 | After x [no-match] | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:14:13:14:18 | After ... == ... [false] | case.rb:14:13:14:18 | After ... == ... [false] | +| case.rb:14:13:14:18 | After ... == ... [true] | case.rb:14:13:14:18 | After ... == ... [true] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:14:8:14:8 | After x [no-match] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:14:13:14:18 | After ... == ... [false] | | case.rb:15:5:15:28 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | -| case.rb:15:17:15:17 | x | case.rb:15:5:15:28 | in ... then ... | -| case.rb:15:17:15:17 | x | case.rb:15:17:15:17 | x | -| case.rb:15:28:15:28 | 7 | case.rb:15:28:15:28 | 7 | -| case.rb:16:10:16:10 | 8 | case.rb:16:10:16:10 | 8 | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match | -| case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | -| case.rb:21:3:23:5 | case ... | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:21:3:23:5 | case ... | case.rb:21:3:23:5 | case ... | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:26:1:30:3 | exit case_match_raise | case.rb:26:1:30:3 | exit case_match_raise | -| case.rb:26:1:30:3 | exit case_match_raise (abnormal) | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | -| case.rb:27:3:29:5 | case ... | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:27:3:29:5 | case ... | case.rb:27:3:29:5 | case ... | -| case.rb:28:7:28:28 | enter -> { ... } | case.rb:28:7:28:28 | enter -> { ... } | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:32:1:39:3 | exit case_match_array | case.rb:32:1:39:3 | exit case_match_array | -| case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:32:1:39:3 | exit case_match_array (abnormal) | -| case.rb:33:3:38:5 | case ... | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:33:3:38:5 | case ... | case.rb:33:3:38:5 | case ... | -| case.rb:33:3:38:5 | case ... | case.rb:35:5:35:11 | in ... then ... | -| case.rb:33:3:38:5 | case ... | case.rb:35:9:35:9 | x | -| case.rb:33:3:38:5 | case ... | case.rb:36:5:36:13 | in ... then ... | -| case.rb:33:3:38:5 | case ... | case.rb:36:9:36:9 | x | -| case.rb:33:3:38:5 | case ... | case.rb:37:5:37:27 | in ... then ... | -| case.rb:33:3:38:5 | case ... | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:33:3:38:5 | case ... | case.rb:37:12:37:12 | a | -| case.rb:33:3:38:5 | case ... | case.rb:37:15:37:15 | b | -| case.rb:33:3:38:5 | case ... | case.rb:37:19:37:19 | c | -| case.rb:33:3:38:5 | case ... | case.rb:37:25:37:25 | e | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:5:35:11 | in ... then ... | -| case.rb:35:9:35:9 | x | case.rb:35:9:35:9 | x | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | -| case.rb:36:9:36:9 | x | case.rb:36:9:36:9 | x | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:12:37:12 | a | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:12:37:12 | a | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:12:37:12 | a | case.rb:37:12:37:12 | a | -| case.rb:37:15:37:15 | b | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:15:37:15 | b | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:15:37:15 | b | case.rb:37:12:37:12 | a | -| case.rb:37:15:37:15 | b | case.rb:37:15:37:15 | b | -| case.rb:37:19:37:19 | c | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:19:37:19 | c | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:19:37:19 | c | case.rb:37:12:37:12 | a | -| case.rb:37:19:37:19 | c | case.rb:37:15:37:15 | b | -| case.rb:37:19:37:19 | c | case.rb:37:19:37:19 | c | -| case.rb:37:25:37:25 | e | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:25:37:25 | e | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:25:37:25 | e | case.rb:37:12:37:12 | a | -| case.rb:37:25:37:25 | e | case.rb:37:15:37:15 | b | -| case.rb:37:25:37:25 | e | case.rb:37:19:37:19 | c | -| case.rb:37:25:37:25 | e | case.rb:37:25:37:25 | e | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:41:1:45:3 | exit case_match_find | case.rb:41:1:45:3 | exit case_match_find | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:41:1:45:3 | exit case_match_find (abnormal) | -| case.rb:43:10:43:10 | x | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:43:10:43:10 | x | case.rb:43:10:43:10 | x | -| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:43:16:43:16 | 2 | case.rb:43:10:43:10 | x | -| case.rb:43:16:43:16 | 2 | case.rb:43:16:43:16 | 2 | -| case.rb:43:20:43:20 | y | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:43:20:43:20 | y | case.rb:43:10:43:10 | x | -| case.rb:43:20:43:20 | y | case.rb:43:16:43:16 | 2 | -| case.rb:43:20:43:20 | y | case.rb:43:20:43:20 | y | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:47:1:53:3 | exit case_match_hash | case.rb:47:1:53:3 | exit case_match_hash | -| case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | -| case.rb:48:3:52:5 | case ... | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:48:3:52:5 | case ... | case.rb:48:3:52:5 | case ... | -| case.rb:48:3:52:5 | case ... | case.rb:49:8:49:34 | { ..., ** } | -| case.rb:48:3:52:5 | case ... | case.rb:49:20:49:20 | 1 | -| case.rb:48:3:52:5 | case ... | case.rb:49:23:49:23 | a | -| case.rb:48:3:52:5 | case ... | case.rb:49:29:49:32 | rest | -| case.rb:48:3:52:5 | case ... | case.rb:50:5:50:25 | in ... then ... | -| case.rb:48:3:52:5 | case ... | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:48:3:52:5 | case ... | case.rb:50:16:50:16 | 1 | -| case.rb:48:3:52:5 | case ... | case.rb:51:5:51:17 | in ... then ... | -| case.rb:48:3:52:5 | case ... | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:8:49:34 | { ..., ** } | -| case.rb:49:20:49:20 | 1 | case.rb:49:20:49:20 | 1 | -| case.rb:49:23:49:23 | a | case.rb:49:23:49:23 | a | -| case.rb:49:29:49:32 | rest | case.rb:49:23:49:23 | a | -| case.rb:49:29:49:32 | rest | case.rb:49:29:49:32 | rest | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:5:50:25 | in ... then ... | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:50:16:50:16 | 1 | case.rb:50:16:50:16 | 1 | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:5:51:17 | in ... then ... | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:51:5:51:17 | in ... then ... | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:51:8:51:16 | { ..., ** } | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:55:1:61:3 | enter case_match_variable | -| case.rb:56:3:60:5 | case ... | case.rb:55:1:61:3 | enter case_match_variable | -| case.rb:56:3:60:5 | case ... | case.rb:56:3:60:5 | case ... | -| case.rb:56:3:60:5 | case ... | case.rb:58:5:58:10 | in ... then ... | -| case.rb:58:5:58:10 | in ... then ... | case.rb:58:5:58:10 | in ... then ... | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:63:1:67:3 | enter case_match_underscore | -| case.rb:64:3:66:5 | case ... | case.rb:63:1:67:3 | enter case_match_underscore | -| case.rb:64:3:66:5 | case ... | case.rb:64:3:66:5 | case ... | -| case.rb:64:3:66:5 | case ... | case.rb:65:12:65:12 | _ | -| case.rb:65:12:65:12 | _ | case.rb:65:12:65:12 | _ | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:69:1:93:3 | exit case_match_various | case.rb:69:1:93:3 | exit case_match_various | -| case.rb:69:1:93:3 | exit case_match_various (abnormal) | case.rb:69:1:93:3 | exit case_match_various (abnormal) | -| case.rb:72:3:92:5 | case ... | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:72:3:92:5 | case ... | case.rb:72:3:92:5 | case ... | -| case.rb:72:3:92:5 | case ... | case.rb:74:5:74:11 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:75:5:75:15 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:82:13:82:13 | x | -| case.rb:72:3:92:5 | case ... | case.rb:82:20:82:20 | 1 | -| case.rb:72:3:92:5 | case ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:83:12:83:15 | ^... | -| case.rb:72:3:92:5 | case ... | case.rb:83:20:83:25 | string | -| case.rb:72:3:92:5 | case ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:88:14:88:15 | 10 | -| case.rb:72:3:92:5 | case ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:89:14:89:17 | self | -| case.rb:72:3:92:5 | case ... | case.rb:89:21:89:24 | true | -| case.rb:72:3:92:5 | case ... | case.rb:89:28:89:32 | false | -| case.rb:72:3:92:5 | case ... | case.rb:89:36:89:43 | __LINE__ | -| case.rb:72:3:92:5 | case ... | case.rb:89:47:89:54 | __FILE__ | -| case.rb:72:3:92:5 | case ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:72:3:92:5 | case ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:72:3:92:5 | case ... | case.rb:91:13:91:14 | "" | -| case.rb:72:3:92:5 | case ... | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:72:3:92:5 | case ... | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:74:5:74:11 | in ... then ... | case.rb:74:5:74:11 | in ... then ... | -| case.rb:75:5:75:15 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:82:13:82:13 | x | case.rb:82:13:82:13 | x | -| case.rb:82:20:82:20 | 1 | case.rb:82:13:82:13 | x | -| case.rb:82:20:82:20 | 1 | case.rb:82:20:82:20 | 1 | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:83:12:83:15 | ^... | -| case.rb:83:20:83:25 | string | case.rb:83:20:83:25 | string | -| case.rb:84:5:84:17 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:85:5:85:23 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:85:8:85:23 | enter -> { ... } | case.rb:85:8:85:23 | enter -> { ... } | -| case.rb:86:5:86:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | -| case.rb:88:14:88:15 | 10 | case.rb:88:14:88:15 | 10 | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | -| case.rb:89:14:89:17 | self | case.rb:89:14:89:17 | self | -| case.rb:89:21:89:24 | true | case.rb:89:21:89:24 | true | -| case.rb:89:28:89:32 | false | case.rb:89:28:89:32 | false | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:47:89:54 | __FILE__ | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:90:5:90:13 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | -| case.rb:91:13:91:14 | "" | case.rb:91:13:91:14 | "" | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | enter case_match_guard_no_else | -| case.rb:95:1:99:3 | exit case_match_guard_no_else | 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) | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | enter case_match_guard_no_else | -| case.rb:97:13:97:13 | x | case.rb:97:13:97:13 | x | -| case.rb:97:25:97:25 | 6 | case.rb:95:1:99:3 | enter case_match_guard_no_else | -| case.rb:97:25:97:25 | 6 | case.rb:97:13:97:13 | x | -| case.rb:97:25:97:25 | 6 | case.rb:97:25:97:25 | 6 | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:18:14:22:16 | if ... | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:19:19:19:32 | self | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:21:19:21:32 | self | -| cfg.html.erb:19:19:19:32 | self | cfg.html.erb:19:19:19:32 | self | -| cfg.html.erb:21:19:21:32 | self | cfg.html.erb:21:19:21:32 | self | -| cfg.html.erb:29:24:31:10 | enter do ... end | cfg.html.erb:29:24:31:10 | enter do ... end | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:25:9:25:22 | enter { ... } | cfg.rb:25:9:25:22 | enter { ... } | -| cfg.rb:29:10:29:24 | enter { ... } | cfg.rb:29:10:29:24 | enter { ... } | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:42:15:42:24 | self | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:42:15:42:24 | self | cfg.rb:42:15:42:24 | self | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:43:21:43:31 | self | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:43:21:43:31 | self | cfg.rb:43:21:43:31 | self | -| cfg.rb:44:8:44:18 | self | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:44:8:44:18 | self | cfg.rb:44:8:44:18 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:48:20:48:29 | self | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:48:20:48:29 | self | cfg.rb:48:20:48:29 | self | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:49:8:49:8 | b | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:8:49:8 | b | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:16:49:16 | b | -| cfg.rb:49:27:49:37 | self | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:49:27:49:37 | self | cfg.rb:49:27:49:37 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:60:27:60:31 | hello | cfg.rb:60:27:60:31 | hello | -| cfg.rb:60:37:60:39 | bye | cfg.rb:60:37:60:39 | bye | -| cfg.rb:63:3:66:5 | enter pattern | cfg.rb:63:3:66:5 | enter pattern | -| cfg.rb:69:3:71:5 | enter print | cfg.rb:69:3:71:5 | enter print | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:75:15:75:15 | 0 | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:35:75:36 | 10 | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:75:43:75:43 | x | cfg.rb:75:43:75:43 | x | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:90:1:93:3 | exit { ... } (normal) | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:91:3:91:24 | if ... | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:91:17:91:20 | next | -| cfg.rb:90:5:90:5 | [false] ! ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | x | -| cfg.rb:91:3:91:24 | if ... | cfg.rb:91:3:91:24 | if ... | -| cfg.rb:91:17:91:20 | next | cfg.rb:91:17:91:20 | next | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:1:104:3 | enter parameters | -| cfg.rb:101:24:101:25 | 42 | cfg.rb:101:24:101:25 | 42 | -| cfg.rb:101:28:101:30 | key | cfg.rb:101:1:104:3 | enter parameters | -| cfg.rb:101:28:101:30 | key | cfg.rb:101:24:101:25 | 42 | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:8:15:8 | After x [match] | +| case.rb:15:8:15:8 | After x [no-match] | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:15:17:15:21 | After ... < ... [false] | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:15:17:15:21 | After ... < ... [true] | case.rb:15:17:15:21 | After ... < ... [true] | +| case.rb:16:5:16:10 | else ... | case.rb:15:8:15:8 | After x [no-match] | +| case.rb:16:5:16:10 | else ... | case.rb:15:17:15:21 | After ... < ... [false] | +| case.rb:16:5:16:10 | else ... | case.rb:16:5:16:10 | else ... | +| case.rb:20:1:24:3 | Entry | case.rb:20:1:24:3 | Entry | +| case.rb:21:3:23:5 | After case ... | case.rb:20:1:24:3 | Entry | +| case.rb:21:3:23:5 | After case ... | case.rb:21:3:23:5 | After case ... | +| case.rb:21:3:23:5 | After case ... | case.rb:22:8:22:8 | After 1 [match] | +| case.rb:21:3:23:5 | After case ... | case.rb:22:8:22:8 | After 1 [no-match] | +| case.rb:22:8:22:8 | After 1 [match] | case.rb:22:8:22:8 | After 1 [match] | +| case.rb:22:8:22:8 | After 1 [no-match] | case.rb:22:8:22:8 | After 1 [no-match] | +| case.rb:26:1:30:3 | Entry | case.rb:26:1:30:3 | Entry | +| case.rb:27:3:29:5 | After case ... | case.rb:26:1:30:3 | Entry | +| case.rb:27:3:29:5 | After case ... | case.rb:27:3:29:5 | After case ... | +| case.rb:27:3:29:5 | After case ... | case.rb:28:7:28:28 | After -> { ... } [match] | +| case.rb:27:3:29:5 | After case ... | case.rb:28:7:28:28 | After -> { ... } [no-match] | +| case.rb:28:7:28:28 | After -> { ... } [match] | case.rb:28:7:28:28 | After -> { ... } [match] | +| case.rb:28:7:28:28 | After -> { ... } [no-match] | case.rb:28:7:28:28 | After -> { ... } [no-match] | +| case.rb:28:7:28:28 | Entry | case.rb:28:7:28:28 | Entry | +| case.rb:32:1:39:3 | Entry | case.rb:32:1:39:3 | Entry | +| case.rb:33:3:38:5 | After case ... | case.rb:32:1:39:3 | Entry | +| case.rb:33:3:38:5 | After case ... | case.rb:33:3:38:5 | After case ... | +| case.rb:33:3:38:5 | After case ... | case.rb:34:8:34:9 | After [ ..., * ] [match] | +| case.rb:33:3:38:5 | After case ... | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:33:3:38:5 | After case ... | case.rb:35:8:35:10 | After [ ..., * ] [match] | +| case.rb:33:3:38:5 | After case ... | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:33:3:38:5 | After case ... | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:33:3:38:5 | After case ... | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:33:3:38:5 | After case ... | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:33:3:38:5 | After case ... | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:34:8:34:9 | After [ ..., * ] [match] | case.rb:34:8:34:9 | After [ ..., * ] [match] | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:35:8:35:10 | After [ ..., * ] [match] | case.rb:35:8:35:10 | After [ ..., * ] [match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:36:8:36:12 | After [ ..., * ] [match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:37:8:37:26 | After [ ..., * ] [match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | +| case.rb:37:8:37:26 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | +| case.rb:41:1:45:3 | Entry | case.rb:41:1:45:3 | Entry | +| case.rb:42:3:44:5 | After case ... | case.rb:41:1:45:3 | Entry | +| case.rb:42:3:44:5 | After case ... | case.rb:42:3:44:5 | After case ... | +| case.rb:42:3:44:5 | After case ... | case.rb:43:8:43:21 | After [ *,...,* ] [match] | +| case.rb:42:3:44:5 | After case ... | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | +| case.rb:43:8:43:21 | After [ *,...,* ] [match] | case.rb:43:8:43:21 | After [ *,...,* ] [match] | +| case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | +| case.rb:47:1:53:3 | Entry | case.rb:47:1:53:3 | Entry | +| case.rb:48:3:52:5 | After case ... | case.rb:47:1:53:3 | Entry | +| case.rb:48:3:52:5 | After case ... | case.rb:48:3:52:5 | After case ... | +| case.rb:48:3:52:5 | After case ... | case.rb:49:8:49:34 | After { ..., ** } [match] | +| case.rb:48:3:52:5 | After case ... | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:48:3:52:5 | After case ... | case.rb:50:8:50:24 | After { ..., ** } [match] | +| case.rb:48:3:52:5 | After case ... | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:48:3:52:5 | After case ... | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:48:3:52:5 | After case ... | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:49:8:49:34 | After { ..., ** } [match] | case.rb:49:8:49:34 | After { ..., ** } [match] | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:50:8:50:24 | After { ..., ** } [match] | case.rb:50:8:50:24 | After { ..., ** } [match] | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:51:8:51:16 | After { ..., ** } [match] | case.rb:51:8:51:16 | After { ..., ** } [match] | +| case.rb:51:8:51:16 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | +| case.rb:55:1:61:3 | Entry | case.rb:55:1:61:3 | Entry | +| case.rb:56:3:60:5 | After case ... | case.rb:55:1:61:3 | Entry | +| case.rb:56:3:60:5 | After case ... | case.rb:56:3:60:5 | After case ... | +| case.rb:56:3:60:5 | After case ... | case.rb:57:8:57:8 | After 5 [match] | +| case.rb:56:3:60:5 | After case ... | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:56:3:60:5 | After case ... | case.rb:58:8:58:10 | After var [match] | +| case.rb:56:3:60:5 | After case ... | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:56:3:60:5 | After case ... | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:56:3:60:5 | After case ... | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:57:8:57:8 | After 5 [match] | case.rb:57:8:57:8 | After 5 [match] | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:58:8:58:10 | After var [match] | case.rb:58:8:58:10 | After var [match] | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:59:8:59:20 | After "unreachable" [match] | case.rb:59:8:59:20 | After "unreachable" [match] | +| case.rb:59:8:59:20 | After "unreachable" [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | +| case.rb:63:1:67:3 | Entry | case.rb:63:1:67:3 | Entry | +| case.rb:64:3:66:5 | After case ... | case.rb:63:1:67:3 | Entry | +| case.rb:64:3:66:5 | After case ... | case.rb:64:3:66:5 | After case ... | +| case.rb:64:3:66:5 | After case ... | case.rb:65:8:65:28 | After ... \| ... [match] | +| case.rb:64:3:66:5 | After case ... | case.rb:65:8:65:28 | After ... \| ... [no-match] | +| case.rb:65:8:65:28 | After ... \| ... [match] | case.rb:65:8:65:28 | After ... \| ... [match] | +| case.rb:65:8:65:28 | After ... \| ... [no-match] | case.rb:65:8:65:28 | After ... \| ... [no-match] | +| case.rb:69:1:93:3 | Entry | case.rb:69:1:93:3 | Entry | +| case.rb:72:3:92:5 | After case ... | case.rb:69:1:93:3 | Entry | +| case.rb:72:3:92:5 | After case ... | case.rb:72:3:92:5 | After case ... | +| case.rb:72:3:92:5 | After case ... | case.rb:73:8:73:8 | After 5 [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:74:8:74:11 | After ^... [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:72:3:92:5 | After case ... | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:72:3:92:5 | After case ... | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:73:8:73:8 | After 5 [match] | case.rb:73:8:73:8 | After 5 [match] | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:74:8:74:11 | After ^... [match] | case.rb:74:8:74:11 | After ^... [match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:75:8:75:15 | After "string" [match] | case.rb:75:8:75:15 | After "string" [match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:76:8:76:18 | After call to [] [match] | case.rb:76:8:76:18 | After call to [] [match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:77:8:77:18 | After call to [] [match] | case.rb:77:8:77:18 | After call to [] [match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [match] | case.rb:79:8:79:14 | After _ .. _ [match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [match] | case.rb:80:8:80:12 | After _ .. _ [match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [match] | case.rb:81:8:81:11 | After _ .. _ [match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:82:8:82:13 | After ... => ... [match] | case.rb:82:8:82:13 | After ... => ... [match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [match] | case.rb:83:8:83:26 | After ... \| ... [match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:84:8:84:17 | After Bar [match] | case.rb:84:8:84:17 | After Bar [match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [match] | case.rb:85:8:85:23 | After -> { ... } [match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:85:8:85:23 | Entry | case.rb:85:8:85:23 | Entry | +| case.rb:86:8:86:11 | After :foo [match] | case.rb:86:8:86:11 | After :foo [match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [match] | case.rb:87:8:87:17 | After :"foo bar" [match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [match] | case.rb:88:8:88:15 | After ... \| ... [match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [match] | case.rb:89:8:89:69 | After ... \| ... [match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:90:8:90:13 | After ( ... ) [match] | case.rb:90:8:90:13 | After ( ... ) [match] | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:91:8:91:25 | After ( ... ) [match] | case.rb:91:8:91:25 | After ( ... ) [match] | +| case.rb:91:8:91:25 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | +| case.rb:95:1:99:3 | Entry | case.rb:95:1:99:3 | Entry | +| case.rb:96:3:98:5 | After case ... | case.rb:95:1:99:3 | Entry | +| case.rb:96:3:98:5 | After case ... | case.rb:96:3:98:5 | After case ... | +| case.rb:96:3:98:5 | After case ... | case.rb:97:8:97:8 | After x [match] | +| case.rb:96:3:98:5 | After case ... | case.rb:97:8:97:8 | After x [no-match] | +| case.rb:96:3:98:5 | After case ... | case.rb:97:13:97:18 | After ... == ... [false] | +| case.rb:96:3:98:5 | After case ... | case.rb:97:13:97:18 | After ... == ... [true] | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:8:97:8 | After x [match] | +| case.rb:97:8:97:8 | After x [no-match] | case.rb:97:8:97:8 | After x [no-match] | +| case.rb:97:13:97:18 | After ... == ... [false] | case.rb:97:13:97:18 | After ... == ... [false] | +| case.rb:97:13:97:18 | After ... == ... [true] | case.rb:97:13:97:18 | After ... == ... [true] | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:5:16:31:12 | Entry | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:5:16:31:12 | Entry | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:18:14:22:16 | After if ... | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:18:17:18:22 | After call to admin? [false] | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:18:17:18:22 | After call to admin? [true] | +| cfg.html.erb:18:17:18:22 | After call to admin? [false] | cfg.html.erb:18:17:18:22 | After call to admin? [false] | +| cfg.html.erb:18:17:18:22 | After call to admin? [true] | cfg.html.erb:18:17:18:22 | After call to admin? [true] | +| cfg.html.erb:29:24:31:10 | Entry | cfg.html.erb:29:24:31:10 | Entry | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:1:1:221:1 | Exceptional Exit | cfg.rb:1:1:221:1 | Exceptional Exit | +| cfg.rb:1:1:221:1 | Exit | cfg.rb:1:1:221:1 | Exit | +| cfg.rb:25:9:25:22 | Entry | cfg.rb:25:9:25:22 | Entry | +| cfg.rb:29:10:29:24 | Entry | cfg.rb:29:10:29:24 | Entry | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:42:8:42:8 | After 1 [match] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:43:8:43:8 | After 2 [match] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:43:11:43:11 | After 3 [match] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:43:14:43:14 | After 4 [match] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:43:14:43:14 | After 4 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:48:8:48:13 | After ... == ... [match] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:49:8:49:13 | After ... == ... [match] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:49:16:49:20 | After ... > ... [match] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:49:16:49:20 | After ... > ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:60:17:60:22 | After ... < ... [false] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:60:17:60:22 | After ... < ... [true] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:63:3:66:5 | Entry | cfg.rb:63:3:66:5 | Entry | +| cfg.rb:69:3:71:5 | Entry | cfg.rb:69:3:71:5 | Entry | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:4:75:8 | After ... < ... [true] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:75:23:75:28 | After ... > ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:75:23:75:28 | After ... > ... [true] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:90:1:93:3 | Normal Exit | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:91:6:91:10 | After ... > ... [false] | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:91:6:91:10 | After ... > ... [true] | +| cfg.rb:90:5:90:5 | After defined? ... [false] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:90:5:90:5 | After defined? ... [true] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:91:6:91:10 | After ... > ... [false] | cfg.rb:91:6:91:10 | After ... > ... [false] | +| cfg.rb:91:6:91:10 | After ... > ... [true] | cfg.rb:91:6:91:10 | After ... > ... [true] | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:101:16:101:20 | After value [match] | cfg.rb:101:16:101:20 | After value [match] | +| cfg.rb:101:16:101:20 | After value [no-match] | cfg.rb:101:16:101:20 | After value [no-match] | +| cfg.rb:101:28:101:30 | key | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:101:28:101:30 | key | cfg.rb:101:16:101:20 | After value [match] | +| cfg.rb:101:28:101:30 | key | cfg.rb:101:16:101:20 | After value [no-match] | | cfg.rb:101:28:101:30 | key | cfg.rb:101:28:101:30 | key | -| cfg.rb:113:1:113:9 | self | cfg.rb:113:1:113:9 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:120:8:120:28 | enter -> { ... } | cfg.rb:120:8:120:28 | enter -> { ... } | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:136:12:136:29 | self | cfg.rb:136:12:136:29 | self | -| cfg.rb:145:3:148:5 | enter print | cfg.rb:145:3:148:5 | enter print | -| cfg.rb:152:1:154:3 | enter method | cfg.rb:152:1:154:3 | enter method | -| cfg.rb:156:1:156:28 | enter two_parameters | cfg.rb:156:1:156:28 | enter two_parameters | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:172:21:172:29 | self | cfg.rb:172:21:172:29 | self | -| cfg.rb:172:36:172:45 | self | cfg.rb:172:36:172:45 | self | -| cfg.rb:174:1:174:9 | self | cfg.rb:174:1:174:9 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:176:7:176:7 | x | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:176:7:176:7 | x | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:42:15:42:24 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:176:7:176:7 | x | cfg.rb:43:21:43:31 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:44:8:44:18 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:48:20:48:29 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:49:8:49:8 | b | -| cfg.rb:176:7:176:7 | x | cfg.rb:49:16:49:16 | b | -| cfg.rb:176:7:176:7 | x | cfg.rb:49:27:49:37 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:60:27:60:31 | hello | -| cfg.rb:176:7:176:7 | x | cfg.rb:60:37:60:39 | bye | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:23:75:23 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:176:7:176:7 | x | cfg.rb:75:43:75:43 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:90:5:90:5 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:113:1:113:9 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:136:12:136:29 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:172:21:172:29 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:172:36:172:45 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:174:1:174:9 | self | -| cfg.rb:176:7:176:7 | x | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:7:176:7 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:17:176:17 | x | -| cfg.rb:176:17:176:17 | x | cfg.rb:176:17:176:17 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:179:2:179:13 | self | cfg.rb:179:2:179:13 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:179:30:179:30 | i | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:179:30:179:30 | i | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:42:15:42:24 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:179:30:179:30 | i | cfg.rb:43:21:43:31 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:44:8:44:18 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:48:20:48:29 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:49:8:49:8 | b | -| cfg.rb:179:30:179:30 | i | cfg.rb:49:16:49:16 | b | -| cfg.rb:179:30:179:30 | i | cfg.rb:49:27:49:37 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:60:27:60:31 | hello | -| cfg.rb:179:30:179:30 | i | cfg.rb:60:37:60:39 | bye | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:23:75:23 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:179:30:179:30 | i | cfg.rb:75:43:75:43 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:90:5:90:5 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:113:1:113:9 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:136:12:136:29 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:172:21:172:29 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:172:36:172:45 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:174:1:174:9 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:179:30:179:30 | i | cfg.rb:176:7:176:7 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:176:17:176:17 | x | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:2:179:13 | self | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:30:179:30 | i | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:182:7:182:7 | x | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:182:7:182:7 | x | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:182:7:182:7 | x | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:42:15:42:24 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:182:7:182:7 | x | cfg.rb:43:21:43:31 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:44:8:44:18 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:48:20:48:29 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:49:8:49:8 | b | -| cfg.rb:182:7:182:7 | x | cfg.rb:49:16:49:16 | b | -| cfg.rb:182:7:182:7 | x | cfg.rb:49:27:49:37 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:60:27:60:31 | hello | -| cfg.rb:182:7:182:7 | x | cfg.rb:60:37:60:39 | bye | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:23:75:23 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:182:7:182:7 | x | cfg.rb:75:43:75:43 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:90:5:90:5 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:113:1:113:9 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:136:12:136:29 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:172:21:172:29 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:172:36:172:45 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:174:1:174:9 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:176:7:176:7 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:176:17:176:17 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:179:2:179:13 | self | -| cfg.rb:182:7:182:7 | x | cfg.rb:179:30:179:30 | i | -| cfg.rb:182:7:182:7 | x | cfg.rb:182:7:182:7 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:183:3:183:3 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:18:184:21 | redo | -| cfg.rb:183:3:183:3 | x | cfg.rb:183:3:183:3 | x | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:18:184:21 | redo | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:184:18:184:21 | redo | cfg.rb:184:18:184:21 | redo | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:188:2:188:13 | self | cfg.rb:188:2:188:13 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:188:30:188:30 | i | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:188:30:188:30 | i | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:42:15:42:24 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:188:30:188:30 | i | cfg.rb:43:21:43:31 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:44:8:44:18 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:48:20:48:29 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:49:8:49:8 | b | -| cfg.rb:188:30:188:30 | i | cfg.rb:49:16:49:16 | b | -| cfg.rb:188:30:188:30 | i | cfg.rb:49:27:49:37 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:60:27:60:31 | hello | -| cfg.rb:188:30:188:30 | i | cfg.rb:60:37:60:39 | bye | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:23:75:23 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:188:30:188:30 | i | cfg.rb:75:43:75:43 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:90:5:90:5 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:113:1:113:9 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:136:12:136:29 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:172:21:172:29 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:172:36:172:45 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:174:1:174:9 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:176:7:176:7 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:176:17:176:17 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:179:2:179:13 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:179:30:179:30 | i | -| cfg.rb:188:30:188:30 | i | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:182:7:182:7 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:183:3:183:3 | x | -| cfg.rb:188:30:188:30 | i | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:188:30:188:30 | i | cfg.rb:184:18:184:21 | redo | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:2:188:13 | self | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:30:188:30 | i | -| cfg.rb:190:1:192:3 | enter run_block | cfg.rb:190:1:192:3 | enter run_block | -| cfg.rb:194:11:194:23 | enter { ... } | cfg.rb:194:11:194:23 | enter { ... } | -| cfg.rb:196:1:198:3 | enter forward_param | cfg.rb:196:1:198:3 | enter forward_param | -| cfg.rb:200:9:200:32 | enter { ... } | cfg.rb:200:9:200:32 | enter { ... } | -| cfg.rb:202:9:202:35 | enter do ... end | cfg.rb:202:9:202:35 | enter do ... end | -| cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:205:1:205:3 | nil | cfg.rb:205:1:205:3 | nil | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:42:15:42:24 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:43:21:43:31 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:44:8:44:18 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:48:20:48:29 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:49:3:49:37 | [no-match] when ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:49:27:49:37 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:60:27:60:31 | hello | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:60:37:60:39 | bye | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:15:75:15 | 0 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:17:75:43 | elsif ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:35:75:36 | 10 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:75:43:75:43 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:90:5:90:5 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:113:1:113:9 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:136:12:136:29 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:172:21:172:29 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:172:36:172:45 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:174:1:174:9 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:176:17:176:17 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:179:2:179:13 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:184:3:184:25 | if ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:184:18:184:21 | redo | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:188:2:188:13 | self | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:1:205:3 | __synth__0__1 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:1:205:3 | nil | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:4:205:5 | if ... | -| cfg.rb:205:15:205:23 | enter { ... } | cfg.rb:205:15:205:23 | enter { ... } | -| cfg.rb:207:1:211:3 | enter filter_nil | cfg.rb:207:1:211:3 | enter filter_nil | -| cfg.rb:208:15:210:5 | enter do ... end | cfg.rb:208:15:210:5 | enter do ... end | -| cfg.rb:213:14:216:3 | enter do ... end | cfg.rb:213:14:216:3 | enter do ... end | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:5:22:5:24 | 123 | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:14:18:14:20 | 123 | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:5:22:5:24 | 123 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | -| constant_compound_assign.rb:19:21:19:23 | 123 | constant_compound_assign.rb:19:21:19:23 | 123 | -| desugar.rb:1:1:3:3 | enter m1 | desugar.rb:1:1:3:3 | enter m1 | -| desugar.rb:1:1:38:17 | enter desugar.rb | desugar.rb:1:1:38:17 | enter desugar.rb | -| desugar.rb:5:1:7:3 | enter m2 | desugar.rb:5:1:7:3 | enter m2 | -| desugar.rb:9:1:11:3 | enter m3 | desugar.rb:9:1:11:3 | enter m3 | -| desugar.rb:13:1:15:3 | enter m4 | desugar.rb:13:1:15:3 | enter m4 | -| desugar.rb:17:1:19:3 | enter m5 | desugar.rb:17:1:19:3 | enter m5 | -| desugar.rb:21:1:23:3 | enter m6 | desugar.rb:21:1:23:3 | enter m6 | -| desugar.rb:25:1:27:3 | enter m7 | desugar.rb:25:1:27:3 | enter m7 | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:1:1:6:3 | exit m1 | exit.rb:1:1:6:3 | exit m1 | -| exit.rb:1:1:13:4 | enter exit.rb | exit.rb:1:1:13:4 | enter exit.rb | -| exit.rb:2:3:4:5 | if ... | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:2:3:4:5 | if ... | exit.rb:2:3:4:5 | if ... | -| exit.rb:3:5:3:10 | self | exit.rb:3:5:3:10 | self | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:8:1:13:3 | enter m2 | -| exit.rb:8:1:13:3 | exit m2 | exit.rb:8:1:13:3 | exit m2 | -| exit.rb:9:3:11:5 | if ... | exit.rb:8:1:13:3 | enter m2 | -| exit.rb:9:3:11:5 | if ... | exit.rb:9:3:11:5 | if ... | -| exit.rb:10:5:10:18 | self | exit.rb:10:5:10:18 | self | -| heredoc.rb:1:1:7:3 | enter double_heredoc | heredoc.rb:1:1:7:3 | enter double_heredoc | -| heredoc.rb:1:1:7:4 | enter heredoc.rb | heredoc.rb:1:1:7:4 | enter heredoc.rb | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:1:1:58:4 | enter ifs.rb | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:2:3:8:5 | if ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:3:5:3:30 | self | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:3:7:35 | elsif ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:9:4:9 | x | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:20:4:20 | x | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:32:4:32 | x | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:5:5:5:17 | self | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:7:5:7:35 | self | -| ifs.rb:3:5:3:30 | self | ifs.rb:3:5:3:30 | self | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:3:7:35 | elsif ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:20:4:20 | x | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:5:5:5:17 | self | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:7:5:7:35 | self | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:20:4:20 | x | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:32:4:32 | x | -| ifs.rb:5:5:5:17 | self | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:5:5:5:17 | self | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:5:5:5:17 | self | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:5:5:5:17 | self | ifs.rb:5:5:5:17 | self | -| ifs.rb:7:5:7:35 | self | ifs.rb:4:9:4:24 | [false] ... and ... | -| ifs.rb:7:5:7:35 | self | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:7:5:7:35 | self | ifs.rb:4:30:4:38 | [false] ! ... | -| ifs.rb:7:5:7:35 | self | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:7:5:7:35 | self | ifs.rb:7:5:7:35 | self | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | exit m2 (normal) | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:12:3:14:5 | if ... | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:13:12:13:12 | 0 | -| ifs.rb:12:3:14:5 | if ... | ifs.rb:12:3:14:5 | if ... | -| ifs.rb:13:12:13:12 | 0 | ifs.rb:13:12:13:12 | 0 | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:18:1:26:3 | enter m3 | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:18:1:26:3 | enter m3 | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:19:3:24:5 | if ... | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:20:5:20:5 | x | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:21:5:23:7 | if ... | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:22:7:22:7 | x | -| ifs.rb:20:5:20:5 | x | ifs.rb:20:5:20:5 | x | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:20:5:20:5 | x | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:21:5:23:7 | if ... | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:22:7:22:7 | x | -| ifs.rb:22:7:22:7 | x | ifs.rb:22:7:22:7 | x | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:10:29:51 | ... ? ... : ... | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:16:29:17 | b2 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:21:29:22 | b3 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:16:29:17 | b2 | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:21:29:22 | b3 | -| ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:28:29:35 | b2 \|\| b3 | -| ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:3:33:100 | if ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:13:33:19 | [false] then ... | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:13:33:19 | [true] then ... | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:30:33:36 | [false] then ... | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:30:33:36 | [true] then ... | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:38:33:44 | [false] else ... | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:38:33:44 | [true] else ... | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:13:33:19 | [true] then ... | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:21:33:44 | [true] elsif ... | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:30:33:36 | [true] then ... | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:38:33:44 | [true] else ... | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:13:33:19 | [false] then ... | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:21:33:44 | [false] elsif ... | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:30:33:36 | [false] then ... | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:38:33:44 | [false] else ... | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | -| ifs.rb:36:1:38:3 | conditional_method_def | ifs.rb:36:1:38:3 | conditional_method_def | -| ifs.rb:36:1:38:3 | enter conditional_method_def | ifs.rb:36:1:38:3 | enter conditional_method_def | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:1:1:58:4 | enter ifs.rb | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:36:1:38:3 | conditional_method_def | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:36:1:38:17 | ... unless ... | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:40:1:44:3 | enter constant_condition | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:40:1:44:3 | enter constant_condition | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:41:3:43:5 | if ... | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:41:6:41:10 | [false] ! ... | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:40:1:44:3 | enter constant_condition | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:6:41:10 | [false] ! ... | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:47:3:50:5 | if ... | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:48:5:48:15 | self | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:49:3:49:6 | else ... | -| ifs.rb:48:5:48:15 | self | ifs.rb:48:5:48:15 | self | -| ifs.rb:49:3:49:6 | else ... | ifs.rb:49:3:49:6 | else ... | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:3:57:5 | if ... | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:56:5:56:19 | self | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:6:55:15 | [false] ( ... ) | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:56:5:56:19 | self | ifs.rb:55:6:55:15 | [true] ( ... ) | -| ifs.rb:56:5:56:19 | self | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:56:5:56:19 | self | ifs.rb:56:5:56:19 | self | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:1:1:6:3 | enter m1 | -| loops.rb:1:1:33:4 | enter loops.rb | loops.rb:1:1:33:4 | enter loops.rb | -| loops.rb:2:3:5:5 | while ... | loops.rb:1:1:6:3 | enter m1 | -| loops.rb:2:3:5:5 | while ... | loops.rb:2:3:5:5 | while ... | -| loops.rb:2:3:5:5 | while ... | loops.rb:2:9:2:9 | x | -| loops.rb:2:3:5:5 | while ... | loops.rb:3:5:3:10 | self | -| loops.rb:2:9:2:9 | x | loops.rb:1:1:6:3 | enter m1 | -| loops.rb:2:9:2:9 | x | loops.rb:2:9:2:9 | x | -| loops.rb:2:9:2:9 | x | loops.rb:3:5:3:10 | self | -| loops.rb:3:5:3:10 | self | loops.rb:3:5:3:10 | self | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:8:1:22:3 | enter m2 | -| loops.rb:9:3:20:5 | while ... | loops.rb:8:1:22:3 | enter m2 | -| loops.rb:9:3:20:5 | while ... | loops.rb:9:3:20:5 | while ... | -| loops.rb:9:3:20:5 | while ... | loops.rb:9:9:9:9 | x | -| loops.rb:9:3:20:5 | while ... | loops.rb:10:5:10:10 | self | -| loops.rb:9:3:20:5 | while ... | loops.rb:13:7:13:11 | break | -| loops.rb:9:3:20:5 | while ... | loops.rb:14:11:14:11 | x | -| loops.rb:9:3:20:5 | while ... | loops.rb:15:7:15:10 | next | -| loops.rb:9:3:20:5 | while ... | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:9:3:20:5 | while ... | loops.rb:16:11:16:11 | x | -| loops.rb:9:3:20:5 | while ... | loops.rb:17:7:17:10 | redo | -| loops.rb:9:9:9:9 | x | loops.rb:8:1:22:3 | enter m2 | -| loops.rb:9:9:9:9 | x | loops.rb:9:9:9:9 | x | -| loops.rb:9:9:9:9 | x | loops.rb:15:7:15:10 | next | -| loops.rb:9:9:9:9 | x | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:10:5:10:10 | self | loops.rb:10:5:10:10 | self | -| loops.rb:10:5:10:10 | self | loops.rb:17:7:17:10 | redo | -| loops.rb:13:7:13:11 | break | loops.rb:13:7:13:11 | break | -| loops.rb:14:11:14:11 | x | loops.rb:14:11:14:11 | x | -| loops.rb:15:7:15:10 | next | loops.rb:15:7:15:10 | next | -| loops.rb:16:5:17:10 | elsif ... | loops.rb:16:5:17:10 | elsif ... | -| loops.rb:16:11:16:11 | x | loops.rb:16:11:16:11 | x | -| loops.rb:17:7:17:10 | redo | loops.rb:17:7:17:10 | redo | -| loops.rb:24:1:28:3 | enter m3 | loops.rb:24:1:28:3 | enter m3 | -| loops.rb:25:16:27:5 | enter do ... end | loops.rb:25:16:27:5 | enter do ... end | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:30:1:33:3 | enter m4 | -| loops.rb:31:3:32:5 | while ... | loops.rb:30:1:33:3 | enter m4 | -| loops.rb:31:3:32:5 | while ... | loops.rb:31:3:32:5 | while ... | -| loops.rb:31:3:32:5 | while ... | loops.rb:31:9:31:9 | x | -| loops.rb:31:3:32:5 | while ... | loops.rb:31:15:32:5 | do ... | -| loops.rb:31:9:31:9 | x | loops.rb:30:1:33:3 | enter m4 | -| loops.rb:31:9:31:9 | x | loops.rb:31:9:31:9 | x | -| loops.rb:31:9:31:9 | x | loops.rb:31:15:32:5 | do ... | -| loops.rb:31:15:32:5 | do ... | loops.rb:31:15:32:5 | do ... | -| raise.rb:1:1:182:4 | enter raise.rb | raise.rb:1:1:182:4 | enter raise.rb | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:7:1:12:3 | exit m1 | raise.rb:7:1:12:3 | exit m1 | -| raise.rb:8:3:10:5 | if ... | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:8:3:10:5 | if ... | raise.rb:8:3:10:5 | if ... | -| raise.rb:9:5:9:17 | self | raise.rb:9:5:9:17 | self | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:14:1:23:3 | exit m2 | raise.rb:14:1:23:3 | exit m2 | -| raise.rb:14:1:23:3 | exit m2 (abnormal) | raise.rb:14:1:23:3 | exit m2 (abnormal) | -| raise.rb:16:5:18:7 | if ... | raise.rb:16:5:18:7 | if ... | -| raise.rb:17:7:17:22 | self | raise.rb:17:7:17:22 | self | -| raise.rb:20:5:20:18 | self | raise.rb:17:7:17:22 | self | -| raise.rb:20:5:20:18 | self | raise.rb:20:5:20:18 | self | -| raise.rb:22:3:22:15 | self | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:22:3:22:15 | self | raise.rb:16:5:18:7 | if ... | -| raise.rb:22:3:22:15 | self | raise.rb:17:7:17:22 | self | -| raise.rb:22:3:22:15 | self | raise.rb:20:5:20:18 | self | -| raise.rb:22:3:22:15 | self | raise.rb:22:3:22:15 | self | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:27:5:29:7 | if ... | raise.rb:27:5:29:7 | if ... | -| raise.rb:28:7:28:22 | self | raise.rb:28:7:28:22 | self | -| raise.rb:33:3:33:15 | self | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:33:3:33:15 | self | raise.rb:27:5:29:7 | if ... | -| raise.rb:33:3:33:15 | self | raise.rb:28:7:28:22 | self | -| raise.rb:33:3:33:15 | self | raise.rb:33:3:33:15 | self | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:38:5:40:7 | if ... | raise.rb:38:5:40:7 | if ... | -| raise.rb:39:7:39:22 | self | raise.rb:39:7:39:22 | self | -| raise.rb:44:3:44:15 | self | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:44:3:44:15 | self | raise.rb:38:5:40:7 | if ... | -| raise.rb:44:3:44:15 | self | raise.rb:39:7:39:22 | self | -| raise.rb:44:3:44:15 | self | raise.rb:44:3:44:15 | self | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:49:5:51:7 | if ... | raise.rb:49:5:51:7 | if ... | -| raise.rb:50:7:50:22 | self | raise.rb:50:7:50:22 | self | -| raise.rb:54:3:54:15 | self | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:54:3:54:15 | self | raise.rb:49:5:51:7 | if ... | -| raise.rb:54:3:54:15 | self | raise.rb:50:7:50:22 | self | -| raise.rb:54:3:54:15 | self | raise.rb:54:3:54:15 | self | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:57:1:66:3 | exit m6 | raise.rb:57:1:66:3 | exit m6 | -| raise.rb:57:1:66:3 | exit m6 (abnormal) | raise.rb:57:1:66:3 | exit m6 (abnormal) | -| raise.rb:59:5:61:7 | if ... | raise.rb:59:5:61:7 | if ... | -| raise.rb:60:7:60:22 | self | raise.rb:60:7:60:22 | self | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:62:36:62:36 | e | raise.rb:60:7:60:22 | self | -| raise.rb:62:36:62:36 | e | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:62:36:62:36 | e | raise.rb:62:36:62:36 | e | -| raise.rb:65:3:65:15 | self | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:65:3:65:15 | self | raise.rb:59:5:61:7 | if ... | -| raise.rb:65:3:65:15 | self | raise.rb:60:7:60:22 | self | -| raise.rb:65:3:65:15 | self | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:65:3:65:15 | self | raise.rb:62:36:62:36 | e | -| raise.rb:65:3:65:15 | self | raise.rb:65:3:65:15 | self | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:68:1:77:3 | exit m7 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:68:1:77:3 | exit m7 (normal) | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:71:9:71:9 | x | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:76:3:76:15 | self | -| raise.rb:70:5:70:17 | self | raise.rb:70:5:70:17 | self | -| raise.rb:71:3:72:18 | elsif ... | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:71:9:71:9 | x | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:71:9:71:9 | x | raise.rb:71:9:71:9 | x | -| raise.rb:72:13:72:17 | x < 0 | raise.rb:72:13:72:17 | x < 0 | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:3:76:15 | [ensure: exception] self | -| raise.rb:76:3:76:15 | self | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:76:3:76:15 | self | raise.rb:76:3:76:15 | self | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | exit m8 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:79:1:92:3 | exit m8 (normal) | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:84:11:84:11 | x | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:89:5:89:17 | self | -| raise.rb:83:7:83:19 | self | raise.rb:83:7:83:19 | self | -| raise.rb:84:5:85:20 | elsif ... | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:84:11:84:11 | x | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:84:11:84:11 | x | raise.rb:84:11:84:11 | x | -| raise.rb:85:15:85:19 | x < 0 | raise.rb:85:15:85:19 | x < 0 | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:5:89:17 | [ensure: exception] self | -| raise.rb:89:5:89:17 | self | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:89:5:89:17 | self | raise.rb:89:5:89:17 | self | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | exit m9 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:94:1:119:3 | exit m9 (abnormal) | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:94:1:119:3 | exit m9 (normal) | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:97:8:97:8 | x | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:99:11:99:11 | x | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:104:5:104:23 | self | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:106:7:108:9 | if ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:106:10:106:11 | b1 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:115:3:115:22 | self | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | if ... | -| raise.rb:97:8:97:8 | x | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:97:8:97:8 | x | raise.rb:97:8:97:8 | x | -| raise.rb:98:7:98:19 | self | raise.rb:98:7:98:19 | self | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:99:11:99:11 | x | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:99:11:99:11 | x | raise.rb:97:8:97:8 | x | -| raise.rb:99:11:99:11 | x | raise.rb:99:11:99:11 | x | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | -| raise.rb:104:5:104:23 | self | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:104:5:104:23 | self | raise.rb:104:5:104:23 | self | -| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:106:7:108:9 | if ... | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:106:7:108:9 | if ... | raise.rb:104:5:104:23 | self | -| raise.rb:106:7:108:9 | if ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:106:7:108:9 | if ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:106:10:106:11 | b1 | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:106:10:106:11 | b1 | raise.rb:104:5:104:23 | self | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | b1 | -| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:107:9:107:26 | self | raise.rb:107:9:107:26 | self | -| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:104:5:104:23 | self | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:106:10:106:11 | b1 | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:113:14:113:19 | After ... > ... [false] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:113:14:113:19 | After ... > ... [true] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:120:8:120:28 | Entry | cfg.rb:120:8:120:28 | Entry | +| cfg.rb:136:1:136:3 | After ... / ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:136:12:136:29 | Before call to puts | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:145:3:148:5 | Entry | cfg.rb:145:3:148:5 | Entry | +| cfg.rb:152:1:154:3 | Entry | cfg.rb:152:1:154:3 | Entry | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:172:8:172:14 | After ... == ... [false] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:172:8:172:14 | After ... == ... [true] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:174:18:174:23 | After ... == ... [false] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:174:18:174:23 | After ... == ... [true] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [false] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [false] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:184:6:184:11 | After ... == ... [true] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:188:30:188:35 | After ... != ... [true] | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:190:1:192:3 | Entry | cfg.rb:190:1:192:3 | Entry | +| cfg.rb:194:11:194:23 | Entry | cfg.rb:194:11:194:23 | Entry | +| cfg.rb:196:1:198:3 | Entry | cfg.rb:196:1:198:3 | Entry | +| cfg.rb:200:9:200:32 | Entry | cfg.rb:200:9:200:32 | Entry | +| cfg.rb:202:9:202:35 | Entry | cfg.rb:202:9:202:35 | Entry | +| cfg.rb:205:4:205:5 | After call to == [false] | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:205:4:205:5 | After call to == [true] | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:42:8:42:8 | After 1 [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:3:43:31 | After when ... [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:8:43:8 | After 2 [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:11:43:11 | After 3 [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:14:43:14 | After 4 [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:43:14:43:14 | After 4 [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:49:3:49:37 | After when ... [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:60:17:60:22 | After ... < ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:4:75:8 | After ... < ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:17:75:43 | After elsif ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:75:23:75:28 | After ... > ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:90:5:90:5 | After defined? ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:136:1:136:3 | After ... / ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:136:12:136:29 | Before call to puts | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:172:8:172:14 | After ... == ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:174:18:174:23 | After ... == ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:184:6:184:11 | After ... == ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:205:4:205:5 | After call to == [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:205:4:205:5 | After call to == [true] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:205:4:205:5 | After if ... | +| cfg.rb:205:15:205:23 | Entry | cfg.rb:205:15:205:23 | Entry | +| cfg.rb:207:1:211:3 | Entry | cfg.rb:207:1:211:3 | Entry | +| cfg.rb:208:15:210:5 | Entry | cfg.rb:208:15:210:5 | Entry | +| cfg.rb:213:14:216:3 | Entry | cfg.rb:213:14:216:3 | Entry | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | +| desugar.rb:1:1:3:3 | Entry | desugar.rb:1:1:3:3 | Entry | +| desugar.rb:1:1:38:17 | Entry | desugar.rb:1:1:38:17 | Entry | +| desugar.rb:5:1:7:3 | Entry | desugar.rb:5:1:7:3 | Entry | +| desugar.rb:9:1:11:3 | Entry | desugar.rb:9:1:11:3 | Entry | +| desugar.rb:13:1:15:3 | Entry | desugar.rb:13:1:15:3 | Entry | +| desugar.rb:17:1:19:3 | Entry | desugar.rb:17:1:19:3 | Entry | +| desugar.rb:21:1:23:3 | Entry | desugar.rb:21:1:23:3 | Entry | +| desugar.rb:25:1:27:3 | Entry | desugar.rb:25:1:27:3 | Entry | +| exit.rb:1:1:6:3 | Entry | exit.rb:1:1:6:3 | Entry | +| exit.rb:1:1:6:3 | Exit | exit.rb:1:1:6:3 | Exit | +| exit.rb:1:1:13:4 | Entry | exit.rb:1:1:13:4 | Entry | +| exit.rb:2:6:2:10 | After ... > ... [false] | exit.rb:1:1:6:3 | Entry | +| exit.rb:2:6:2:10 | After ... > ... [false] | exit.rb:2:6:2:10 | After ... > ... [false] | +| exit.rb:2:6:2:10 | After ... > ... [true] | exit.rb:2:6:2:10 | After ... > ... [true] | +| exit.rb:8:1:13:3 | Entry | exit.rb:8:1:13:3 | Entry | +| exit.rb:8:1:13:3 | Exit | exit.rb:8:1:13:3 | Exit | +| exit.rb:9:6:9:10 | After ... > ... [false] | exit.rb:8:1:13:3 | Entry | +| exit.rb:9:6:9:10 | After ... > ... [false] | exit.rb:9:6:9:10 | After ... > ... [false] | +| exit.rb:9:6:9:10 | After ... > ... [true] | exit.rb:9:6:9:10 | After ... > ... [true] | +| heredoc.rb:1:1:7:3 | Entry | heredoc.rb:1:1:7:3 | Entry | +| heredoc.rb:1:1:7:4 | Entry | heredoc.rb:1:1:7:4 | Entry | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:2:3:8:5 | After if ... | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:2:6:2:10 | After ... > ... [true] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:3:7:35 | After elsif ... | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:2:6:2:10 | After ... > ... [true] | ifs.rb:2:6:2:10 | After ... > ... [true] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:3:7:35 | After elsif ... | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:4:9:4:14 | After ... <= ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:4:20:4:24 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:4:32:4:37 | After ... == ... [false] | ifs.rb:4:32:4:37 | After ... == ... [false] | +| ifs.rb:4:32:4:37 | After ... == ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:11:1:16:3 | Normal Exit | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:12:6:12:6 | After b [false] | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:12:6:12:6 | After b [true] | +| ifs.rb:12:6:12:6 | After b [false] | ifs.rb:12:6:12:6 | After b [false] | +| ifs.rb:12:6:12:6 | After b [true] | ifs.rb:12:6:12:6 | After b [true] | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:19:3:24:5 | After if ... | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:19:6:19:10 | After ... < ... [false] | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:21:5:23:7 | After if ... | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:19:6:19:10 | After ... < ... [false] | ifs.rb:19:6:19:10 | After ... < ... [false] | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:21:5:23:7 | After if ... | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:21:8:21:13 | After ... > ... [false] | ifs.rb:21:8:21:13 | After ... > ... [false] | +| ifs.rb:21:8:21:13 | After ... > ... [true] | ifs.rb:21:8:21:13 | After ... > ... [true] | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:10:29:51 | After ... ? ... : ... | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:29:16:29:17 | After b2 [false] | ifs.rb:29:16:29:17 | After b2 [false] | +| ifs.rb:29:16:29:17 | After b2 [true] | ifs.rb:29:16:29:17 | After b2 [true] | +| ifs.rb:29:21:29:22 | After b3 [false] | ifs.rb:29:21:29:22 | After b3 [false] | +| ifs.rb:29:21:29:22 | After b3 [true] | ifs.rb:29:21:29:22 | After b3 [true] | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:3:33:100 | After if ... | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:7:33:48 | After if ... [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:7:33:48 | After if ... [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:7:33:48 | After if ... [false] | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:7:33:48 | After if ... [true] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:33:18:33:19 | After b2 [false] | ifs.rb:33:18:33:19 | After b2 [false] | +| ifs.rb:33:18:33:19 | After b2 [true] | ifs.rb:33:18:33:19 | After b2 [true] | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:35:33:36 | After b4 [false] | ifs.rb:33:35:33:36 | After b4 [false] | +| ifs.rb:33:35:33:36 | After b4 [true] | ifs.rb:33:35:33:36 | After b4 [true] | +| ifs.rb:33:43:33:44 | After b5 [false] | ifs.rb:33:43:33:44 | After b5 [false] | +| ifs.rb:33:43:33:44 | After b5 [true] | ifs.rb:33:43:33:44 | After b5 [true] | +| ifs.rb:36:1:38:3 | Entry | ifs.rb:36:1:38:3 | Entry | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:36:1:38:17 | After ... unless ... | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:38:12:38:17 | After ... == ... [false] | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:38:12:38:17 | After ... == ... [true] | +| ifs.rb:38:12:38:17 | After ... == ... [false] | ifs.rb:38:12:38:17 | After ... == ... [false] | +| ifs.rb:38:12:38:17 | After ... == ... [true] | ifs.rb:38:12:38:17 | After ... == ... [true] | +| ifs.rb:40:1:44:3 | Entry | ifs.rb:40:1:44:3 | Entry | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:47:3:50:5 | After if ... | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:47:6:47:6 | After b [false] | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:47:6:47:6 | After b [true] | +| ifs.rb:47:6:47:6 | After b [false] | ifs.rb:47:6:47:6 | After b [false] | +| ifs.rb:47:6:47:6 | After b [true] | ifs.rb:47:6:47:6 | After b [true] | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:3:57:5 | After if ... | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:7:55:8 | After b1 [false] | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:7:55:8 | After b1 [true] | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:13:55:14 | After b2 [false] | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:13:55:14 | After b2 [true] | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:7:55:8 | After b1 [false] | +| ifs.rb:55:7:55:8 | After b1 [true] | ifs.rb:55:7:55:8 | After b1 [true] | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:55:7:55:8 | After b1 [true] | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:55:13:55:14 | After b2 [true] | +| ifs.rb:55:13:55:14 | After b2 [false] | ifs.rb:55:13:55:14 | After b2 [false] | +| ifs.rb:55:13:55:14 | After b2 [true] | ifs.rb:55:13:55:14 | After b2 [true] | +| loops.rb:1:1:6:3 | Entry | loops.rb:1:1:6:3 | Entry | +| loops.rb:1:1:33:4 | Entry | loops.rb:1:1:33:4 | Entry | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:1:1:6:3 | Entry | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:1:1:6:3 | Entry | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:9:2:14 | After ... >= ... [false] | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:2:9:2:14 | After ... >= ... [true] | loops.rb:2:9:2:14 | After ... >= ... [true] | +| loops.rb:8:1:22:3 | Entry | loops.rb:8:1:22:3 | Entry | +| loops.rb:9:3:20:5 | After while ... | loops.rb:8:1:22:3 | Entry | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:3:20:5 | After while ... | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:9:9:14 | After ... >= ... [false] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:15:20:5 | do ... | +| loops.rb:9:3:20:5 | After while ... | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:9:3:20:5 | After while ... | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:8:1:22:3 | Entry | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [false] | loops.rb:9:9:9:14 | After ... >= ... [false] | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:9:15:20:5 | do ... | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:9:15:20:5 | do ... | loops.rb:9:15:20:5 | do ... | +| loops.rb:9:15:20:5 | do ... | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:12:8:12:14 | After ... > ... [true] | loops.rb:12:8:12:14 | After ... > ... [true] | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:14:11:14:16 | After ... > ... [true] | loops.rb:14:11:14:16 | After ... > ... [true] | +| loops.rb:16:11:16:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | +| loops.rb:16:11:16:16 | After ... > ... [true] | loops.rb:16:11:16:16 | After ... > ... [true] | +| loops.rb:24:1:28:3 | Entry | loops.rb:24:1:28:3 | Entry | +| loops.rb:25:16:27:5 | Entry | loops.rb:25:16:27:5 | Entry | +| loops.rb:30:1:33:3 | Entry | loops.rb:30:1:33:3 | Entry | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:30:1:33:3 | Entry | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [true] | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:30:1:33:3 | Entry | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:9:31:13 | After ... < ... [false] | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:9:31:13 | After ... < ... [true] | +| loops.rb:31:9:31:13 | After ... < ... [true] | loops.rb:31:9:31:13 | After ... < ... [true] | +| raise.rb:1:1:182:4 | Entry | raise.rb:1:1:182:4 | Entry | +| raise.rb:7:1:12:3 | Entry | raise.rb:7:1:12:3 | Entry | +| raise.rb:7:1:12:3 | Exit | raise.rb:7:1:12:3 | Exit | +| raise.rb:8:6:8:10 | After ... > ... [false] | raise.rb:7:1:12:3 | Entry | +| raise.rb:8:6:8:10 | After ... > ... [false] | raise.rb:8:6:8:10 | After ... > ... [false] | +| raise.rb:8:6:8:10 | After ... > ... [true] | raise.rb:8:6:8:10 | After ... > ... [true] | +| raise.rb:14:1:23:3 | Entry | raise.rb:14:1:23:3 | Entry | +| raise.rb:14:1:23:3 | Exit | raise.rb:14:1:23:3 | Exit | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:14:1:23:3 | Entry | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:15:3:21:5 | After begin ... | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:16:8:16:8 | After b [false] | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:19:10:19:19 | After ExceptionA [match] | +| raise.rb:16:8:16:8 | After b [false] | raise.rb:16:8:16:8 | After b [false] | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:19:10:19:19 | After ExceptionA [match] | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:19:10:19:19 | After ExceptionA [match] | raise.rb:19:10:19:19 | After ExceptionA [match] | +| raise.rb:19:10:19:19 | After ExceptionA [no-match] | raise.rb:19:10:19:19 | After ExceptionA [no-match] | +| raise.rb:25:1:34:3 | Entry | raise.rb:25:1:34:3 | Entry | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:25:1:34:3 | Entry | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:26:3:32:5 | After begin ... | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:27:8:27:8 | After b [false] | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:27:8:27:8 | After b [true] | +| raise.rb:27:8:27:8 | After b [false] | raise.rb:27:8:27:8 | After b [false] | +| raise.rb:27:8:27:8 | After b [true] | raise.rb:27:8:27:8 | After b [true] | +| raise.rb:36:1:45:3 | Entry | raise.rb:36:1:45:3 | Entry | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:36:1:45:3 | Entry | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:37:3:43:5 | After begin ... | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:38:8:38:8 | After b [false] | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:38:8:38:8 | After b [true] | +| raise.rb:38:8:38:8 | After b [false] | raise.rb:38:8:38:8 | After b [false] | +| raise.rb:38:8:38:8 | After b [true] | raise.rb:38:8:38:8 | After b [true] | +| raise.rb:47:1:55:3 | Entry | raise.rb:47:1:55:3 | Entry | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:47:1:55:3 | Entry | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:48:3:53:5 | After begin ... | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:49:8:49:8 | After b [false] | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:49:8:49:8 | After b [true] | +| raise.rb:49:8:49:8 | After b [false] | raise.rb:49:8:49:8 | After b [false] | +| raise.rb:49:8:49:8 | After b [true] | raise.rb:49:8:49:8 | After b [true] | +| raise.rb:57:1:66:3 | Entry | raise.rb:57:1:66:3 | Entry | +| raise.rb:57:1:66:3 | Exit | raise.rb:57:1:66:3 | Exit | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:57:1:66:3 | Entry | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:58:3:64:5 | After begin ... | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:59:8:59:8 | After b [false] | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:62:10:62:31 | After ..., ... [match] | +| raise.rb:59:8:59:8 | After b [false] | raise.rb:59:8:59:8 | After b [false] | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:62:10:62:31 | After ..., ... [match] | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:62:10:62:31 | After ..., ... [match] | raise.rb:62:10:62:31 | After ..., ... [match] | +| raise.rb:62:10:62:31 | After ..., ... [no-match] | raise.rb:62:10:62:31 | After ..., ... [no-match] | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:1:77:3 | Entry | +| raise.rb:68:1:77:3 | Exceptional Exit | raise.rb:68:1:77:3 | Exceptional Exit | +| raise.rb:68:1:77:3 | Exit | raise.rb:68:1:77:3 | Exit | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:68:1:77:3 | Entry | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:68:1:77:3 | Normal Exit | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:69:3:76:15 | After ... | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:69:6:69:10 | After ... > ... [true] | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:69:3:76:15 | After ... | raise.rb:69:3:76:15 | After ... | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:69:6:69:10 | After ... > ... [true] | raise.rb:69:6:69:10 | After ... > ... [true] | +| raise.rb:71:9:71:13 | After ... < ... [false] | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:71:9:71:13 | After ... < ... [true] | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:74:3:74:20 | After call to puts | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | Entry | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:69:6:69:10 | After ... > ... [true] | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:71:9:71:13 | After ... < ... [true] | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:74:3:74:20 | After call to puts | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:1:92:3 | Entry | +| raise.rb:79:1:92:3 | Exceptional Exit | raise.rb:79:1:92:3 | Exceptional Exit | +| raise.rb:79:1:92:3 | Exit | raise.rb:79:1:92:3 | Exit | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:79:1:92:3 | Entry | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:79:1:92:3 | Normal Exit | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:81:3:90:5 | After begin ... | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:82:8:82:12 | After ... > ... [true] | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:81:3:90:5 | After begin ... | raise.rb:81:3:90:5 | After begin ... | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:82:8:82:12 | After ... > ... [true] | raise.rb:82:8:82:12 | After ... > ... [true] | +| raise.rb:84:11:84:15 | After ... < ... [false] | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:84:11:84:15 | After ... < ... [true] | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:87:5:87:22 | After call to puts | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:79:1:92:3 | Entry | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:82:8:82:12 | After ... > ... [true] | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:84:11:84:15 | After ... < ... [true] | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:87:5:87:22 | After call to puts | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:1:119:3 | Entry | +| raise.rb:94:1:119:3 | Exceptional Exit | raise.rb:94:1:119:3 | Exceptional Exit | +| raise.rb:94:1:119:3 | Exit | raise.rb:94:1:119:3 | Exit | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:94:1:119:3 | Entry | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:94:1:119:3 | Normal Exit | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:95:3:118:5 | After ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:95:3:118:5 | After ... | raise.rb:95:3:118:5 | After ... | +| raise.rb:96:3:112:5 | After begin ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:97:8:97:12 | After ... > ... [true] | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:99:11:99:15 | After ... < ... [false] | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:99:11:99:15 | After ... < ... [true] | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:102:5:102:22 | After call to puts | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:106:10:106:11 | After b1 [false] | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:106:10:106:11 | After b1 [true] | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:106:10:106:11 | After b1 [true] | | raise.rb:109:5:110:25 | ensure ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | -| raise.rb:115:3:115:22 | self | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:115:3:115:22 | self | raise.rb:104:5:104:23 | self | -| raise.rb:115:3:115:22 | self | raise.rb:106:7:108:9 | if ... | -| raise.rb:115:3:115:22 | self | raise.rb:106:10:106:11 | b1 | -| raise.rb:115:3:115:22 | self | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:115:3:115:22 | self | raise.rb:115:3:115:22 | self | -| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:116:3:118:5 | [ensure: exception] if ... | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:116:3:118:5 | [ensure: return] if ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:104:5:104:23 | self | -| raise.rb:116:3:118:5 | if ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:116:3:118:5 | if ... | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:115:3:115:22 | self | -| raise.rb:116:3:118:5 | if ... | raise.rb:116:3:118:5 | if ... | -| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | -| raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:5:117:22 | [ensure: return] self | -| raise.rb:117:5:117:22 | self | raise.rb:117:5:117:22 | self | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:121:1:126:3 | exit m10 | raise.rb:121:1:126:3 | exit m10 | -| raise.rb:121:14:121:30 | self | raise.rb:121:14:121:30 | self | -| raise.rb:125:3:125:51 | self | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:125:3:125:51 | self | raise.rb:125:3:125:51 | self | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:128:1:140:3 | exit m11 | -| raise.rb:130:5:132:7 | if ... | raise.rb:130:5:132:7 | if ... | -| raise.rb:131:7:131:22 | self | raise.rb:131:7:131:22 | self | -| raise.rb:133:3:133:19 | rescue ... | raise.rb:133:3:133:19 | rescue ... | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:135:5:135:21 | self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:135:5:135:21 | self | raise.rb:135:5:135:21 | self | -| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:5:137:17 | [ensure: exception] self | -| raise.rb:137:5:137:17 | self | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:137:5:137:17 | self | raise.rb:130:5:132:7 | if ... | -| raise.rb:137:5:137:17 | self | raise.rb:131:7:131:22 | self | -| raise.rb:137:5:137:17 | self | raise.rb:133:3:133:19 | rescue ... | -| raise.rb:137:5:137:17 | self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:137:5:137:17 | self | raise.rb:135:5:135:21 | self | -| raise.rb:137:5:137:17 | self | raise.rb:137:5:137:17 | self | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | exit m12 (normal) | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:143:3:145:5 | if ... | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:144:5:144:12 | self | -| raise.rb:143:3:145:5 | if ... | raise.rb:143:3:145:5 | if ... | -| raise.rb:144:5:144:12 | self | raise.rb:144:5:144:12 | self | -| raise.rb:150:1:152:3 | enter m13 | raise.rb:150:1:152:3 | enter m13 | -| raise.rb:154:1:156:3 | enter m14 | raise.rb:154:1:156:3 | enter m14 | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:155:16:155:50 | exit { ... } | raise.rb:155:16:155:50 | exit { ... } | -| raise.rb:155:25:155:32 | self | raise.rb:155:25:155:32 | self | -| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:25:155:48 | ... if ... | -| raise.rb:158:1:164:3 | enter m15 | raise.rb:158:1:164:3 | enter m15 | -| raise.rb:159:7:163:5 | enter do ... end | raise.rb:159:7:163:5 | enter do ... end | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:160:9:162:7 | exit -> { ... } | raise.rb:160:9:162:7 | exit -> { ... } | -| raise.rb:161:7:161:14 | self | raise.rb:161:7:161:14 | self | -| raise.rb:161:7:161:23 | ... unless ... | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:161:7:161:23 | ... unless ... | raise.rb:161:7:161:23 | ... unless ... | -| raise.rb:167:3:169:5 | enter m | raise.rb:167:3:169:5 | enter m | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:172:1:182:3 | exit m16 | raise.rb:172:1:182:3 | exit m16 | -| raise.rb:172:1:182:3 | exit m16 (abnormal) | raise.rb:172:1:182:3 | exit m16 (abnormal) | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:172:1:182:3 | exit m16 (normal) | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:174:8:174:23 | [true] ... \|\| ... | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:174:14:174:15 | b2 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:175:14:175:14 | 1 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:177:14:177:14 | 2 | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:180:12:180:12 | 3 | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:174:8:174:23 | [true] ... \|\| ... | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:14:174:15 | b2 | -| raise.rb:175:14:175:14 | 1 | raise.rb:175:14:175:14 | 1 | -| raise.rb:177:14:177:14 | 2 | raise.rb:177:14:177:14 | 2 | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:180:12:180:12 | 3 | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:180:12:180:12 | 3 | raise.rb:180:12:180:12 | 3 | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:113:3:113:15 | After call to puts | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Entry | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:94:1:119:3 | Entry | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:97:8:97:12 | After ... > ... [true] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:99:11:99:15 | After ... < ... [true] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:102:5:102:22 | After call to puts | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:106:10:106:11 | After b1 [false] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:106:10:106:11 | After b1 [true] | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:113:3:113:15 | After call to puts | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:116:6:116:7 | After b2 [true] | raise.rb:116:6:116:7 | After b2 [true] | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:1:126:3 | Entry | +| raise.rb:121:1:126:3 | Exit | raise.rb:121:1:126:3 | Exit | +| raise.rb:121:9:121:9 | After p [match] | raise.rb:121:1:126:3 | Entry | +| raise.rb:121:9:121:9 | After p [match] | raise.rb:121:9:121:9 | After p [match] | +| raise.rb:121:9:121:9 | After p [no-match] | raise.rb:121:9:121:9 | After p [no-match] | +| raise.rb:128:1:140:3 | Entry | raise.rb:128:1:140:3 | Entry | +| raise.rb:128:1:140:3 | Exceptional Exit | raise.rb:128:1:140:3 | Exceptional Exit | +| raise.rb:128:1:140:3 | Exit | raise.rb:128:1:140:3 | Exit | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:128:1:140:3 | Entry | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:129:3:138:5 | After begin ... | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:130:8:130:8 | After b [false] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:130:8:130:8 | After b [false] | raise.rb:130:8:130:8 | After b [false] | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:133:10:133:19 | After ExceptionA [match] | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:134:10:134:19 | After ExceptionB [match] | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:134:10:134:19 | After ExceptionB [no-match] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:128:1:140:3 | Entry | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:130:8:130:8 | After b [false] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:133:10:133:19 | After ExceptionA [match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:134:10:134:19 | After ExceptionB [match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:134:10:134:19 | After ExceptionB [no-match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:142:1:148:3 | Entry | raise.rb:142:1:148:3 | Entry | +| raise.rb:143:6:143:6 | After b [false] | raise.rb:143:6:143:6 | After b [false] | +| raise.rb:143:6:143:6 | After b [true] | raise.rb:143:6:143:6 | After b [true] | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:142:1:148:3 | Entry | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:143:6:143:6 | After b [false] | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:143:6:143:6 | After b [true] | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:146:1:147:10 | ensure ... | +| raise.rb:150:1:152:3 | Entry | raise.rb:150:1:152:3 | Entry | +| raise.rb:154:1:156:3 | Entry | raise.rb:154:1:156:3 | Entry | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:16:155:50 | Entry | +| raise.rb:155:16:155:50 | Exit | raise.rb:155:16:155:50 | Exit | +| raise.rb:155:37:155:48 | After call to nil? [false] | raise.rb:155:16:155:50 | Entry | +| raise.rb:155:37:155:48 | After call to nil? [false] | raise.rb:155:37:155:48 | After call to nil? [false] | +| raise.rb:155:37:155:48 | After call to nil? [true] | raise.rb:155:37:155:48 | After call to nil? [true] | +| raise.rb:158:1:164:3 | Entry | raise.rb:158:1:164:3 | Entry | +| raise.rb:159:7:163:5 | Entry | raise.rb:159:7:163:5 | Entry | +| raise.rb:160:9:162:7 | Entry | raise.rb:160:9:162:7 | Entry | +| raise.rb:160:9:162:7 | Exit | raise.rb:160:9:162:7 | Exit | +| raise.rb:161:23:161:23 | After x [false] | raise.rb:161:23:161:23 | After x [false] | +| raise.rb:161:23:161:23 | After x [true] | raise.rb:160:9:162:7 | Entry | +| raise.rb:161:23:161:23 | After x [true] | raise.rb:161:23:161:23 | After x [true] | +| raise.rb:167:3:169:5 | Entry | raise.rb:167:3:169:5 | Entry | +| raise.rb:172:1:182:3 | Entry | raise.rb:172:1:182:3 | Entry | +| raise.rb:172:1:182:3 | Exit | raise.rb:172:1:182:3 | Exit | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:172:1:182:3 | Entry | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:172:1:182:3 | Normal Exit | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:174:8:174:9 | After b1 [true] | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:174:8:174:23 | After ... \|\| ... [true] | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:174:14:174:23 | After ... == ... [false] | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:174:8:174:9 | After b1 [true] | raise.rb:174:8:174:9 | After b1 [true] | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:174:8:174:9 | After b1 [true] | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:174:14:174:23 | After ... == ... [false] | raise.rb:174:14:174:23 | After ... == ... [false] | +| raise.rb:174:14:174:23 | After ... == ... [true] | raise.rb:174:14:174:23 | After ... == ... [true] | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:179:10:179:19 | After ExceptionA [match] | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:179:10:179:19 | After ExceptionA [match] | raise.rb:179:10:179:19 | After ExceptionA [match] | +| raise.rb:179:10:179:19 | After ExceptionA [no-match] | raise.rb:179:10:179:19 | After ExceptionA [no-match] | immediateDominator -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:1:1:11:3 | enter m1 | -| break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:4:7:4:11 | break | break_ensure.rb:3:8:3:8 | x | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:2:9:2:9 | x | -| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] self | -| break_ensure.rb:9:5:9:23 | self | break_ensure.rb:2:3:6:5 | while ... | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:14:9:14:9 | x | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:16:10:16:10 | x | -| break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:17:9:17:13 | break | -| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:20:10:20:10 | [ensure: exception] y | -| break_ensure.rb:21:9:21:20 | self | break_ensure.rb:16:7:18:9 | if ... | -| break_ensure.rb:27:1:42:3 | exit m3 | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:27:1:42:3 | enter m3 | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | -| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:33:11:33:11 | [ensure: exception] y | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:33:11:33:11 | [ensure: return] y | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:33:11:33:11 | y | -| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:35:12:35:12 | [ensure: exception] x | -| break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:35:12:35:12 | [ensure: return] x | -| break_ensure.rb:36:11:36:15 | break | break_ensure.rb:35:12:35:12 | x | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:44:1:56:3 | enter m4 | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:45:9:45:9 | x | -| break_ensure.rb:48:9:48:16 | self | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:47:10:47:10 | x | -| break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:47:7:49:9 | if ... | -| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:51:10:51:10 | [ensure: exception] x | -| case.rb:2:3:5:5 | case ... | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:3:5:3:42 | [match] when ... | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:1:1:6:3 | enter if_in_case | -| case.rb:3:18:3:41 | if ... | case.rb:3:21:3:22 | self | -| case.rb:3:21:3:22 | self | case.rb:3:5:3:42 | [match] when ... | -| case.rb:3:29:3:37 | self | case.rb:3:21:3:22 | self | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:10:4:10 | 2 | -| case.rb:4:5:4:24 | [no-match] when ... | case.rb:4:10:4:10 | 2 | -| case.rb:4:10:4:10 | 2 | case.rb:3:5:3:42 | [no-match] when ... | -| case.rb:4:17:4:24 | self | case.rb:4:5:4:24 | [match] when ... | -| case.rb:9:3:17:5 | case ... | case.rb:8:1:18:3 | enter case_match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:8:1:18:3 | enter case_match | -| case.rb:11:15:11:15 | 3 | case.rb:11:5:11:15 | in ... then ... | -| case.rb:12:5:13:7 | in ... then ... | case.rb:11:5:11:15 | in ... then ... | -| case.rb:13:7:13:7 | 4 | case.rb:12:5:13:7 | in ... then ... | -| case.rb:14:5:14:25 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | -| case.rb:14:13:14:13 | x | case.rb:14:5:14:25 | in ... then ... | -| case.rb:14:25:14:25 | 6 | case.rb:14:13:14:13 | x | -| case.rb:15:5:15:28 | in ... then ... | case.rb:14:13:14:13 | x | -| case.rb:15:17:15:17 | x | case.rb:15:5:15:28 | in ... then ... | -| case.rb:15:28:15:28 | 7 | case.rb:15:17:15:17 | x | -| case.rb:16:10:16:10 | 8 | case.rb:15:17:15:17 | x | -| case.rb:20:1:24:3 | exit case_match_no_match | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:21:3:23:5 | case ... | case.rb:20:1:24:3 | enter case_match_no_match | -| case.rb:26:1:30:3 | exit case_match_raise | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:26:1:30:3 | exit case_match_raise (abnormal) | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:27:3:29:5 | case ... | case.rb:26:1:30:3 | enter case_match_raise | -| case.rb:32:1:39:3 | exit case_match_array | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:37:5:37:27 | in ... then ... | -| case.rb:33:3:38:5 | case ... | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:35:5:35:11 | in ... then ... | case.rb:32:1:39:3 | enter case_match_array | -| case.rb:35:9:35:9 | x | case.rb:35:5:35:11 | in ... then ... | -| case.rb:36:5:36:13 | in ... then ... | case.rb:35:5:35:11 | in ... then ... | -| case.rb:36:9:36:9 | x | case.rb:36:5:36:13 | in ... then ... | -| case.rb:37:5:37:27 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:5:37:27 | in ... then ... | -| case.rb:37:12:37:12 | a | case.rb:37:8:37:26 | [ ..., * ] | -| case.rb:37:15:37:15 | b | case.rb:37:12:37:12 | a | -| case.rb:37:19:37:19 | c | case.rb:37:15:37:15 | b | -| case.rb:37:25:37:25 | e | case.rb:37:19:37:19 | c | -| case.rb:41:1:45:3 | exit case_match_find | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:43:10:43:10 | x | case.rb:41:1:45:3 | enter case_match_find | -| case.rb:43:16:43:16 | 2 | case.rb:43:10:43:10 | x | -| case.rb:43:20:43:20 | y | case.rb:43:16:43:16 | 2 | -| case.rb:47:1:53:3 | exit case_match_hash | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:51:5:51:17 | in ... then ... | -| case.rb:48:3:52:5 | case ... | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:49:20:49:20 | 1 | case.rb:49:8:49:34 | { ..., ** } | -| case.rb:49:23:49:23 | a | case.rb:49:20:49:20 | 1 | -| case.rb:49:29:49:32 | rest | case.rb:49:23:49:23 | a | -| case.rb:50:5:50:25 | in ... then ... | case.rb:47:1:53:3 | enter case_match_hash | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:5:50:25 | in ... then ... | -| case.rb:50:16:50:16 | 1 | case.rb:50:8:50:24 | { ..., ** } | -| case.rb:51:5:51:17 | in ... then ... | case.rb:50:5:50:25 | in ... then ... | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:51:5:51:17 | in ... then ... | -| case.rb:56:3:60:5 | case ... | case.rb:55:1:61:3 | enter case_match_variable | -| case.rb:58:5:58:10 | in ... then ... | case.rb:55:1:61:3 | enter case_match_variable | -| case.rb:64:3:66:5 | case ... | case.rb:63:1:67:3 | enter case_match_underscore | -| case.rb:65:12:65:12 | _ | case.rb:63:1:67:3 | enter case_match_underscore | -| case.rb:69:1:93:3 | exit case_match_various | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:69:1:93:3 | exit case_match_various (abnormal) | case.rb:91:23:91:24 | { ..., ** } | -| case.rb:72:3:92:5 | case ... | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:74:5:74:11 | in ... then ... | case.rb:69:1:93:3 | enter case_match_various | -| case.rb:75:5:75:15 | in ... then ... | case.rb:74:5:74:11 | in ... then ... | -| case.rb:76:5:76:18 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | -| case.rb:77:5:77:18 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | -| case.rb:78:5:78:19 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | -| case.rb:79:5:79:14 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | -| case.rb:80:5:80:12 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | -| case.rb:81:5:81:11 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | -| case.rb:82:5:82:20 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | -| case.rb:82:13:82:13 | x | case.rb:82:5:82:20 | in ... then ... | -| case.rb:82:20:82:20 | 1 | case.rb:82:13:82:13 | x | -| case.rb:83:5:83:26 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | -| case.rb:83:12:83:15 | ^... | case.rb:83:5:83:26 | in ... then ... | -| case.rb:83:20:83:25 | string | case.rb:83:12:83:15 | ^... | -| case.rb:84:5:84:17 | in ... then ... | case.rb:83:20:83:25 | string | -| case.rb:85:5:85:23 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | -| case.rb:86:5:86:11 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | -| case.rb:87:5:87:17 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | -| case.rb:88:5:88:15 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | -| case.rb:88:14:88:15 | 10 | case.rb:88:5:88:15 | in ... then ... | -| case.rb:89:5:89:69 | in ... then ... | case.rb:88:14:88:15 | 10 | -| case.rb:89:14:89:17 | self | case.rb:89:5:89:69 | in ... then ... | -| case.rb:89:21:89:24 | true | case.rb:89:14:89:17 | self | -| case.rb:89:28:89:32 | false | case.rb:89:21:89:24 | true | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:28:89:32 | false | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:36:89:43 | __LINE__ | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:89:47:89:54 | __FILE__ | -| case.rb:90:5:90:13 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | -| case.rb:91:5:91:25 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | -| case.rb:91:13:91:14 | "" | case.rb:91:5:91:25 | in ... then ... | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:13:91:14 | "" | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:91:18:91:19 | [ ..., * ] | -| case.rb:95:1:99:3 | exit case_match_guard_no_else | case.rb:97:13:97:13 | x | -| case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | case.rb:97:13:97:13 | x | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | enter case_match_guard_no_else | -| case.rb:97:25:97:25 | 6 | case.rb:97:13:97:13 | x | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.html.erb:19:19:19:32 | self | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.html.erb:21:19:21:32 | self | cfg.html.erb:5:16:31:12 | enter cfg.html.erb | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:1:1:221:1 | enter cfg.rb | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:32:9:32:9 | 1 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:35:1:37:3 | if ... | -| cfg.rb:42:15:42:24 | self | cfg.rb:42:3:42:24 | [match] when ... | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:43:14:43:14 | 4 | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:42:3:42:24 | [no-match] when ... | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:8:43:8 | 2 | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:11:43:11 | 3 | -| cfg.rb:43:21:43:31 | self | cfg.rb:43:3:43:31 | [match] when ... | -| cfg.rb:44:8:44:18 | self | cfg.rb:43:3:43:31 | [no-match] when ... | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:41:1:45:3 | case ... | -| cfg.rb:48:20:48:29 | self | cfg.rb:48:3:48:29 | [match] when ... | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:8:49:8 | b | -| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:49:16:49:16 | b | -| cfg.rb:49:8:49:8 | b | cfg.rb:48:3:48:29 | [no-match] when ... | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:8:49:8 | b | -| cfg.rb:49:27:49:37 | self | cfg.rb:49:3:49:37 | [match] when ... | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:60:27:60:31 | hello | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:60:37:60:39 | bye | cfg.rb:47:1:50:3 | case ... | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:75:15:75:15 | 0 | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:23:75:23 | x | cfg.rb:60:17:60:40 | ... ? ... : ... | -| cfg.rb:75:35:75:36 | 10 | cfg.rb:75:23:75:23 | x | -| cfg.rb:75:43:75:43 | x | cfg.rb:75:23:75:23 | x | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:90:5:90:5 | [false] ! ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:75:1:75:47 | if ... | -| cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | [true] ! ... | -| cfg.rb:91:3:91:24 | if ... | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:91:17:91:20 | next | cfg.rb:90:1:93:3 | enter { ... } | -| cfg.rb:101:24:101:25 | 42 | cfg.rb:101:1:104:3 | enter parameters | -| cfg.rb:101:28:101:30 | key | cfg.rb:101:1:104:3 | enter parameters | -| cfg.rb:113:1:113:9 | self | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | if ... | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:136:12:136:29 | self | cfg.rb:113:1:113:19 | ... if ... | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:172:21:172:29 | self | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:172:36:172:45 | self | cfg.rb:136:1:136:29 | ... rescue ... | -| cfg.rb:174:1:174:9 | self | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:172:1:172:49 | unless ... | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:7:176:7 | x | -| cfg.rb:176:7:176:7 | x | cfg.rb:174:1:174:23 | ... unless ... | -| cfg.rb:176:17:176:17 | x | cfg.rb:176:7:176:7 | x | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:30:179:30 | i | -| cfg.rb:179:2:179:13 | self | cfg.rb:179:30:179:30 | i | -| cfg.rb:179:30:179:30 | i | cfg.rb:176:1:176:41 | until ... | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:182:7:182:7 | x | -| cfg.rb:182:7:182:7 | x | cfg.rb:179:1:179:36 | ... until ... | -| cfg.rb:183:3:183:3 | x | cfg.rb:182:7:182:7 | x | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:183:3:183:3 | x | -| cfg.rb:184:18:184:21 | redo | cfg.rb:183:3:183:3 | x | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:30:188:30 | i | -| cfg.rb:188:2:188:13 | self | cfg.rb:188:30:188:30 | i | -| cfg.rb:188:30:188:30 | i | cfg.rb:182:1:186:3 | while ... | -| cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:205:1:205:3 | nil | cfg.rb:188:1:188:35 | ... while ... | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:188:1:188:35 | ... while ... | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:5:22:5:24 | 123 | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:14:18:14:20 | 123 | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| constant_compound_assign.rb:19:21:19:23 | 123 | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | -| exit.rb:1:1:6:3 | exit m1 | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:2:3:4:5 | if ... | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:3:5:3:10 | self | exit.rb:1:1:6:3 | enter m1 | -| exit.rb:8:1:13:3 | exit m2 | exit.rb:8:1:13:3 | enter m2 | -| exit.rb:9:3:11:5 | if ... | exit.rb:8:1:13:3 | enter m2 | -| exit.rb:10:5:10:18 | self | exit.rb:8:1:13:3 | enter m2 | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:3:5:3:30 | self | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:9:4:9 | x | ifs.rb:1:1:9:3 | enter m1 | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:20:4:20 | x | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:9 | x | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:31:4:38 | [true] ( ... ) | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:31:4:38 | [false] ( ... ) | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:32:4:32 | x | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:9:4:24 | [true] ... and ... | -| ifs.rb:5:5:5:17 | self | ifs.rb:4:9:4:38 | [true] ... and ... | -| ifs.rb:7:5:7:35 | self | ifs.rb:4:9:4:38 | [false] ... and ... | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:12:3:14:5 | if ... | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:13:12:13:12 | 0 | ifs.rb:11:1:16:3 | enter m2 | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:18:1:26:3 | enter m3 | -| ifs.rb:20:5:20:5 | x | ifs.rb:18:1:26:3 | enter m3 | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:20:5:20:5 | x | -| ifs.rb:22:7:22:7 | x | ifs.rb:20:5:20:5 | x | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:28:1:30:3 | enter m4 | -| ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:10:29:23 | [true] ( ... ) | -| ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:10:29:23 | [false] ( ... ) | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:7:33:48 | [false] if ... | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:7:33:48 | [true] if ... | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:13:33:19 | [false] then ... | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:33:13:33:19 | [true] then ... | ifs.rb:33:18:33:19 | b2 | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:32:1:34:3 | enter m5 | -| ifs.rb:33:30:33:36 | [false] then ... | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:30:33:36 | [true] then ... | ifs.rb:33:35:33:36 | b4 | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:38:33:44 | [false] else ... | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:38:33:44 | [true] else ... | ifs.rb:33:43:33:44 | b5 | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:27:33:28 | b3 | -| ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:6:33:49 | [true] ( ... ) | -| ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:6:33:49 | [false] ( ... ) | -| ifs.rb:36:1:38:3 | conditional_method_def | ifs.rb:1:1:58:4 | enter ifs.rb | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:1:1:58:4 | enter ifs.rb | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:41:6:41:10 | [false] ! ... | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:40:1:44:3 | enter constant_condition | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:48:5:48:15 | self | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:49:3:49:6 | else ... | ifs.rb:46:1:52:3 | enter empty_else | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:7:55:14 | [false] ... \|\| ... | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:55:7:55:14 | [true] ... \|\| ... | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:13:55:14 | b2 | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:54:1:58:3 | enter disjunct | -| ifs.rb:56:5:56:19 | self | ifs.rb:55:6:55:15 | [true] ( ... ) | -| loops.rb:2:3:5:5 | while ... | loops.rb:2:9:2:9 | x | -| loops.rb:2:9:2:9 | x | loops.rb:1:1:6:3 | enter m1 | -| loops.rb:3:5:3:10 | self | loops.rb:2:9:2:9 | x | -| loops.rb:9:3:20:5 | while ... | loops.rb:9:9:9:9 | x | -| loops.rb:9:9:9:9 | x | loops.rb:8:1:22:3 | enter m2 | -| loops.rb:10:5:10:10 | self | loops.rb:9:9:9:9 | x | -| loops.rb:13:7:13:11 | break | loops.rb:10:5:10:10 | self | -| loops.rb:14:11:14:11 | x | loops.rb:10:5:10:10 | self | -| loops.rb:15:7:15:10 | next | loops.rb:14:11:14:11 | x | -| loops.rb:16:5:17:10 | elsif ... | loops.rb:16:11:16:11 | x | -| loops.rb:16:11:16:11 | x | loops.rb:14:11:14:11 | x | -| loops.rb:17:7:17:10 | redo | loops.rb:16:11:16:11 | x | -| loops.rb:31:3:32:5 | while ... | loops.rb:31:9:31:9 | x | -| loops.rb:31:9:31:9 | x | loops.rb:30:1:33:3 | enter m4 | -| loops.rb:31:15:32:5 | do ... | loops.rb:31:9:31:9 | x | -| raise.rb:7:1:12:3 | exit m1 | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:8:3:10:5 | if ... | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:9:5:9:17 | self | raise.rb:7:1:12:3 | enter m1 | -| raise.rb:14:1:23:3 | exit m2 | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:14:1:23:3 | exit m2 (abnormal) | raise.rb:17:7:17:22 | self | -| raise.rb:16:5:18:7 | if ... | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:17:7:17:22 | self | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:20:5:20:18 | self | raise.rb:17:7:17:22 | self | -| raise.rb:22:3:22:15 | self | raise.rb:14:1:23:3 | enter m2 | -| raise.rb:27:5:29:7 | if ... | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:28:7:28:22 | self | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:33:3:33:15 | self | raise.rb:25:1:34:3 | enter m3 | -| raise.rb:38:5:40:7 | if ... | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:39:7:39:22 | self | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:44:3:44:15 | self | raise.rb:36:1:45:3 | enter m4 | -| raise.rb:49:5:51:7 | if ... | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:50:7:50:22 | self | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:54:3:54:15 | self | raise.rb:47:1:55:3 | enter m5 | -| raise.rb:57:1:66:3 | exit m6 | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:57:1:66:3 | exit m6 (abnormal) | raise.rb:62:22:62:31 | ExceptionB | -| raise.rb:59:5:61:7 | if ... | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:60:7:60:22 | self | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:60:7:60:22 | self | -| raise.rb:62:36:62:36 | e | raise.rb:60:7:60:22 | self | -| raise.rb:65:3:65:15 | self | raise.rb:57:1:66:3 | enter m6 | -| raise.rb:68:1:77:3 | exit m7 | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:71:9:71:9 | x | -| raise.rb:70:5:70:17 | self | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:71:3:72:18 | elsif ... | raise.rb:71:9:71:9 | x | -| raise.rb:71:9:71:9 | x | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:72:13:72:17 | x < 0 | raise.rb:71:9:71:9 | x | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:68:1:77:3 | enter m7 | -| raise.rb:76:3:76:15 | self | raise.rb:71:3:72:18 | elsif ... | -| raise.rb:79:1:92:3 | exit m8 | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:84:11:84:11 | x | -| raise.rb:83:7:83:19 | self | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:84:5:85:20 | elsif ... | raise.rb:84:11:84:11 | x | -| raise.rb:84:11:84:11 | x | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:85:15:85:19 | x < 0 | raise.rb:84:11:84:11 | x | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:79:1:92:3 | enter m8 | -| raise.rb:89:5:89:17 | self | raise.rb:84:5:85:20 | elsif ... | -| raise.rb:94:1:119:3 | exit m9 | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:99:11:99:11 | x | -| raise.rb:97:8:97:8 | x | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:98:7:98:19 | self | raise.rb:97:8:97:8 | x | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:99:11:99:11 | x | -| raise.rb:99:11:99:11 | x | raise.rb:97:8:97:8 | x | -| raise.rb:100:15:100:19 | x < 0 | raise.rb:99:11:99:11 | x | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:97:8:97:8 | x | -| raise.rb:104:5:104:23 | self | raise.rb:99:5:100:20 | elsif ... | -| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:106:7:108:9 | if ... | raise.rb:106:10:106:11 | b1 | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:104:5:104:23 | [ensure: exception] self | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:100:15:100:19 | x < 0 | -| raise.rb:106:10:106:11 | b1 | raise.rb:104:5:104:23 | self | -| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:106:10:106:11 | [ensure: exception] b1 | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:106:10:106:11 | [ensure: return] b1 | -| raise.rb:107:9:107:26 | self | raise.rb:106:10:106:11 | b1 | -| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | self | -| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | [ensure: exception] self | -| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:106:7:108:9 | [ensure: exception] if ... | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:107:9:107:26 | [ensure: return] self | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:106:7:108:9 | [ensure: return] if ... | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:106:7:108:9 | if ... | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:94:1:119:3 | enter m9 | -| raise.rb:115:3:115:22 | self | raise.rb:109:5:110:25 | ensure ... | -| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:115:3:115:22 | [ensure: exception] self | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:116:3:118:5 | if ... | raise.rb:115:3:115:22 | self | -| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:115:3:115:22 | [ensure: exception] self | -| raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:109:5:110:25 | [ensure: return] ensure ... | -| raise.rb:117:5:117:22 | self | raise.rb:115:3:115:22 | self | -| raise.rb:121:1:126:3 | exit m10 | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:121:14:121:30 | self | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:125:3:125:51 | self | raise.rb:121:1:126:3 | enter m10 | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:130:5:132:7 | if ... | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:131:7:131:22 | self | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:133:3:133:19 | rescue ... | raise.rb:131:7:131:22 | self | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:131:7:131:22 | self | -| raise.rb:135:5:135:21 | self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:134:10:134:19 | ExceptionB | -| raise.rb:137:5:137:17 | self | raise.rb:128:1:140:3 | enter m11 | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:143:3:145:5 | if ... | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:144:5:144:12 | self | raise.rb:142:1:148:3 | enter m12 | -| raise.rb:155:16:155:50 | exit { ... } | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:155:25:155:32 | self | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:16:155:50 | enter { ... } | -| raise.rb:160:9:162:7 | exit -> { ... } | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:161:7:161:14 | self | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:161:7:161:23 | ... unless ... | raise.rb:160:9:162:7 | enter -> { ... } | -| raise.rb:172:1:182:3 | exit m16 | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:172:1:182:3 | exit m16 (abnormal) | raise.rb:179:10:179:19 | ExceptionA | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:174:14:174:15 | b2 | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:174:14:174:15 | b2 | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:175:14:175:14 | 1 | raise.rb:174:8:174:23 | [true] ... \|\| ... | -| raise.rb:177:14:177:14 | 2 | raise.rb:174:8:174:23 | [false] ... \|\| ... | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | enter m16 | -| raise.rb:180:12:180:12 | 3 | raise.rb:179:10:179:19 | ExceptionA | +| break_ensure.rb:1:1:11:3 | Exceptional Exit | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:1:1:11:3 | Exit | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:1:1:11:3 | Entry | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:8:3:10:5 | After if ... | +| break_ensure.rb:2:9:2:13 | After ... < ... [false] | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:3:8:3:12 | After ... > ... [false] | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:3:8:3:12 | After ... > ... [true] | break_ensure.rb:2:9:2:13 | After ... < ... [true] | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:8:6:8:18 | After call to nil? [false] | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:8:6:8:18 | After call to nil? [true] | break_ensure.rb:7:1:10:5 | ensure ... | +| break_ensure.rb:13:1:25:3 | Exceptional Exit | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:13:1:25:3 | Exit | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:13:1:25:3 | Entry | +| break_ensure.rb:14:9:14:13 | After ... < ... [false] | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | +| break_ensure.rb:15:5:23:7 | After begin ... | break_ensure.rb:20:7:22:9 | After if ... | +| break_ensure.rb:16:10:16:14 | After ... > ... [false] | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:16:10:16:14 | After ... > ... [true] | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:20:10:20:15 | After call to nil? [false] | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:20:10:20:15 | After call to nil? [true] | break_ensure.rb:19:5:22:9 | ensure ... | +| break_ensure.rb:27:1:42:3 | Exceptional Exit | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:27:1:42:3 | Exit | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:28:3:40:5 | After begin ... | break_ensure.rb:33:5:39:7 | After while ... | +| break_ensure.rb:29:8:29:13 | After call to nil? [false] | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:29:8:29:13 | After call to nil? [true] | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:27:1:42:3 | Entry | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:32:3:39:7 | ensure ... | +| break_ensure.rb:33:11:33:15 | After ... < ... [false] | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | +| break_ensure.rb:35:12:35:16 | After ... > ... [false] | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:35:12:35:16 | After ... > ... [true] | break_ensure.rb:33:11:33:15 | After ... < ... [true] | +| break_ensure.rb:44:1:56:3 | Exceptional Exit | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:44:1:56:3 | Exit | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:44:1:56:3 | Entry | +| break_ensure.rb:45:9:45:13 | After ... < ... [false] | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | +| break_ensure.rb:46:5:54:7 | After begin ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | +| break_ensure.rb:47:10:47:14 | After ... > ... [false] | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:47:10:47:14 | After ... > ... [true] | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:50:5:53:9 | ensure ... | +| break_ensure.rb:51:10:51:14 | After ... > ... [true] | break_ensure.rb:50:5:53:9 | ensure ... | +| case.rb:2:3:5:5 | After case ... | case.rb:1:1:6:3 | Entry | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:1:1:6:3 | Entry | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:1:1:6:3 | Entry | +| case.rb:3:18:3:41 | After if ... | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:3:21:3:22 | After call to x2 [false] | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:3:21:3:22 | After call to x2 [true] | case.rb:3:10:3:10 | After 1 [match] | +| case.rb:4:10:4:10 | After 2 [match] | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:4:10:4:10 | After 2 [no-match] | case.rb:3:10:3:10 | After 1 [no-match] | +| case.rb:9:3:17:5 | After case ... | case.rb:8:1:18:3 | Entry | +| case.rb:10:8:10:8 | After 0 [match] | case.rb:8:1:18:3 | Entry | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:8:1:18:3 | Entry | +| case.rb:11:8:11:8 | After 1 [match] | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:10:8:10:8 | After 0 [no-match] | +| case.rb:12:8:12:8 | After 2 [match] | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | +| case.rb:14:8:14:8 | After x [match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:14:8:14:8 | After x [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:14:13:14:18 | After ... == ... [false] | case.rb:14:8:14:8 | After x [match] | +| case.rb:14:13:14:18 | After ... == ... [true] | case.rb:14:8:14:8 | After x [match] | +| case.rb:15:5:15:28 | in ... then ... | case.rb:12:8:12:8 | After 2 [no-match] | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:5:15:28 | in ... then ... | +| case.rb:15:8:15:8 | After x [no-match] | case.rb:15:5:15:28 | in ... then ... | +| case.rb:15:17:15:21 | After ... < ... [false] | case.rb:15:8:15:8 | After x [match] | +| case.rb:15:17:15:21 | After ... < ... [true] | case.rb:15:8:15:8 | After x [match] | +| case.rb:16:5:16:10 | else ... | case.rb:15:5:15:28 | in ... then ... | +| case.rb:21:3:23:5 | After case ... | case.rb:20:1:24:3 | Entry | +| case.rb:22:8:22:8 | After 1 [match] | case.rb:20:1:24:3 | Entry | +| case.rb:22:8:22:8 | After 1 [no-match] | case.rb:20:1:24:3 | Entry | +| case.rb:27:3:29:5 | After case ... | case.rb:26:1:30:3 | Entry | +| case.rb:28:7:28:28 | After -> { ... } [match] | case.rb:26:1:30:3 | Entry | +| case.rb:28:7:28:28 | After -> { ... } [no-match] | case.rb:26:1:30:3 | Entry | +| case.rb:33:3:38:5 | After case ... | case.rb:32:1:39:3 | Entry | +| case.rb:34:8:34:9 | After [ ..., * ] [match] | case.rb:32:1:39:3 | Entry | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:32:1:39:3 | Entry | +| case.rb:35:8:35:10 | After [ ..., * ] [match] | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | +| case.rb:36:8:36:12 | After [ ..., * ] [match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | +| case.rb:37:8:37:26 | After [ ..., * ] [match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:37:8:37:26 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | +| case.rb:42:3:44:5 | After case ... | case.rb:41:1:45:3 | Entry | +| case.rb:43:8:43:21 | After [ *,...,* ] [match] | case.rb:41:1:45:3 | Entry | +| case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | case.rb:41:1:45:3 | Entry | +| case.rb:48:3:52:5 | After case ... | case.rb:47:1:53:3 | Entry | +| case.rb:49:8:49:34 | After { ..., ** } [match] | case.rb:47:1:53:3 | Entry | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:47:1:53:3 | Entry | +| case.rb:50:8:50:24 | After { ..., ** } [match] | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:49:8:49:34 | After { ..., ** } [no-match] | +| case.rb:51:8:51:16 | After { ..., ** } [match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:51:8:51:16 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | +| case.rb:56:3:60:5 | After case ... | case.rb:55:1:61:3 | Entry | +| case.rb:57:8:57:8 | After 5 [match] | case.rb:55:1:61:3 | Entry | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:55:1:61:3 | Entry | +| case.rb:58:8:58:10 | After var [match] | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:57:8:57:8 | After 5 [no-match] | +| case.rb:59:8:59:20 | After "unreachable" [match] | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:59:8:59:20 | After "unreachable" [no-match] | case.rb:58:8:58:10 | After var [no-match] | +| case.rb:64:3:66:5 | After case ... | case.rb:63:1:67:3 | Entry | +| case.rb:65:8:65:28 | After ... \| ... [match] | case.rb:63:1:67:3 | Entry | +| case.rb:65:8:65:28 | After ... \| ... [no-match] | case.rb:63:1:67:3 | Entry | +| case.rb:72:3:92:5 | After case ... | case.rb:69:1:93:3 | Entry | +| case.rb:73:8:73:8 | After 5 [match] | case.rb:69:1:93:3 | Entry | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:69:1:93:3 | Entry | +| case.rb:74:8:74:11 | After ^... [match] | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:73:8:73:8 | After 5 [no-match] | +| case.rb:75:8:75:15 | After "string" [match] | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | +| case.rb:76:8:76:18 | After call to [] [match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | +| case.rb:77:8:77:18 | After call to [] [match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | +| case.rb:82:8:82:13 | After ... => ... [match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | +| case.rb:84:8:84:17 | After Bar [match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | +| case.rb:86:8:86:11 | After :foo [match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | +| case.rb:90:8:90:13 | After ( ... ) [match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | +| case.rb:91:8:91:25 | After ( ... ) [match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:91:8:91:25 | After ( ... ) [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | +| case.rb:96:3:98:5 | After case ... | case.rb:95:1:99:3 | Entry | +| case.rb:97:8:97:8 | After x [match] | case.rb:95:1:99:3 | Entry | +| case.rb:97:8:97:8 | After x [no-match] | case.rb:95:1:99:3 | Entry | +| case.rb:97:13:97:18 | After ... == ... [false] | case.rb:97:8:97:8 | After x [match] | +| case.rb:97:13:97:18 | After ... == ... [true] | case.rb:97:8:97:8 | After x [match] | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:5:16:31:12 | Entry | +| cfg.html.erb:18:17:18:22 | After call to admin? [false] | cfg.html.erb:5:16:31:12 | Entry | +| cfg.html.erb:18:17:18:22 | After call to admin? [true] | cfg.html.erb:5:16:31:12 | Entry | +| cfg.rb:1:1:221:1 | Exceptional Exit | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:1:1:221:1 | Exit | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:42:8:42:8 | After 1 [match] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:1:1:221:1 | Entry | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:43:8:43:8 | After 2 [match] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:42:8:42:8 | After 1 [no-match] | +| cfg.rb:43:11:43:11 | After 3 [match] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | +| cfg.rb:43:14:43:14 | After 4 [match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:43:14:43:14 | After 4 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:48:8:48:13 | After ... == ... [match] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:41:1:45:3 | After case ... | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:49:8:49:13 | After ... == ... [match] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:48:8:48:13 | After ... == ... [no-match] | +| cfg.rb:49:16:49:20 | After ... > ... [match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:49:16:49:20 | After ... > ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | +| cfg.rb:60:17:60:22 | After ... < ... [false] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:60:17:60:22 | After ... < ... [true] | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:47:1:50:3 | After case ... | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:75:4:75:8 | After ... < ... [true] | cfg.rb:60:17:60:40 | After ... ? ... : ... | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:23:75:28 | After ... > ... [false] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:75:23:75:28 | After ... > ... [true] | cfg.rb:75:4:75:8 | After ... < ... [false] | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:75:1:75:47 | After if ... | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:90:5:90:5 | After defined? ... [false] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:90:5:90:5 | After defined? ... [true] | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:77:1:86:3 | After begin ... | +| cfg.rb:91:6:91:10 | After ... > ... [false] | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:91:6:91:10 | After ... > ... [true] | cfg.rb:90:1:93:3 | Entry | +| cfg.rb:101:16:101:20 | After value [match] | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:101:16:101:20 | After value [no-match] | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:101:28:101:30 | key | cfg.rb:101:1:104:3 | Entry | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:113:14:113:19 | After ... > ... [false] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:113:14:113:19 | After ... > ... [true] | cfg.rb:90:5:90:5 | After if ... | +| cfg.rb:136:1:136:3 | After ... / ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:136:12:136:29 | Before call to puts | cfg.rb:113:1:113:19 | After ... if ... | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:172:8:172:14 | After ... == ... [false] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:172:8:172:14 | After ... == ... [true] | cfg.rb:136:1:136:29 | After ... rescue ... | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:174:18:174:23 | After ... == ... [false] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:174:18:174:23 | After ... == ... [true] | cfg.rb:172:1:172:49 | After unless ... | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:174:1:174:23 | After ... unless ... | +| cfg.rb:176:7:176:12 | After ... > ... [false] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:1:176:41 | [LoopHeader] until ... | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:176:7:176:12 | After ... > ... [true] | +| cfg.rb:179:30:179:36 | After ... == ... [false] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:179:30:179:36 | After ... == ... [true] | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:182:1:186:3 | [LoopHeader] while ... | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:182:7:182:12 | After ... < ... [true] | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:184:6:184:11 | After ... == ... [true] | cfg.rb:182:14:186:3 | do ... | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:182:7:182:12 | After ... < ... [false] | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:188:30:188:35 | After ... != ... [true] | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | +| cfg.rb:205:4:205:5 | After call to == [false] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:205:4:205:5 | After call to == [true] | cfg.rb:188:30:188:35 | After ... != ... [false] | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:188:30:188:35 | After ... != ... [false] | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | Entry | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | +| exit.rb:1:1:6:3 | Exit | exit.rb:1:1:6:3 | Entry | +| exit.rb:2:6:2:10 | After ... > ... [false] | exit.rb:1:1:6:3 | Entry | +| exit.rb:2:6:2:10 | After ... > ... [true] | exit.rb:1:1:6:3 | Entry | +| exit.rb:8:1:13:3 | Exit | exit.rb:8:1:13:3 | Entry | +| exit.rb:9:6:9:10 | After ... > ... [false] | exit.rb:8:1:13:3 | Entry | +| exit.rb:9:6:9:10 | After ... > ... [true] | exit.rb:8:1:13:3 | Entry | +| ifs.rb:2:3:8:5 | After if ... | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:2:6:2:10 | After ... > ... [true] | ifs.rb:1:1:9:3 | Entry | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [false] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:2:6:2:10 | After ... > ... [false] | +| ifs.rb:4:20:4:24 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:9:4:14 | After ... <= ... [true] | +| ifs.rb:4:32:4:37 | After ... == ... [false] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:4:32:4:37 | After ... == ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:12:6:12:6 | After b [false] | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:12:6:12:6 | After b [true] | ifs.rb:11:1:16:3 | Entry | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:19:6:19:10 | After ... < ... [false] | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:18:1:26:3 | Entry | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:21:8:21:13 | After ... > ... [false] | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:21:8:21:13 | After ... > ... [true] | ifs.rb:19:6:19:10 | After ... < ... [true] | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:28:1:30:3 | Entry | +| ifs.rb:29:16:29:17 | After b2 [false] | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:29:16:29:17 | After b2 [true] | ifs.rb:29:11:29:12 | After b1 [true] | +| ifs.rb:29:21:29:22 | After b3 [false] | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:29:21:29:22 | After b3 [true] | ifs.rb:29:11:29:12 | After b1 [false] | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:32:1:34:3 | Entry | +| ifs.rb:33:18:33:19 | After b2 [false] | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:33:18:33:19 | After b2 [true] | ifs.rb:33:10:33:11 | After b1 [true] | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:10:33:11 | After b1 [false] | +| ifs.rb:33:35:33:36 | After b4 [false] | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:35:33:36 | After b4 [true] | ifs.rb:33:27:33:28 | After b3 [true] | +| ifs.rb:33:43:33:44 | After b5 [false] | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:33:43:33:44 | After b5 [true] | ifs.rb:33:27:33:28 | After b3 [false] | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:38:12:38:17 | After ... == ... [false] | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:38:12:38:17 | After ... == ... [true] | ifs.rb:1:1:58:4 | Entry | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:47:6:47:6 | After b [false] | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:47:6:47:6 | After b [true] | ifs.rb:46:1:52:3 | Entry | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:7:55:8 | After b1 [true] | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:54:1:58:3 | Entry | +| ifs.rb:55:13:55:14 | After b2 [false] | ifs.rb:55:7:55:8 | After b1 [false] | +| ifs.rb:55:13:55:14 | After b2 [true] | ifs.rb:55:7:55:8 | After b1 [false] | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:1:1:6:3 | Entry | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:2:9:2:14 | After ... >= ... [true] | loops.rb:2:3:5:5 | [LoopHeader] while ... | +| loops.rb:9:3:20:5 | After while ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:8:1:22:3 | Entry | +| loops.rb:9:9:9:14 | After ... >= ... [false] | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:9:3:20:5 | [LoopHeader] while ... | +| loops.rb:9:15:20:5 | do ... | loops.rb:9:9:9:14 | After ... >= ... [true] | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:9:15:20:5 | do ... | +| loops.rb:12:8:12:14 | After ... > ... [true] | loops.rb:9:15:20:5 | do ... | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:14:11:14:16 | After ... > ... [true] | loops.rb:12:8:12:14 | After ... > ... [false] | +| loops.rb:16:11:16:16 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:16:11:16:16 | After ... > ... [true] | loops.rb:14:11:14:16 | After ... > ... [false] | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:30:1:33:3 | Entry | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| loops.rb:31:9:31:13 | After ... < ... [true] | loops.rb:31:3:32:5 | [LoopHeader] while ... | +| raise.rb:7:1:12:3 | Exit | raise.rb:7:1:12:3 | Entry | +| raise.rb:8:6:8:10 | After ... > ... [false] | raise.rb:7:1:12:3 | Entry | +| raise.rb:8:6:8:10 | After ... > ... [true] | raise.rb:7:1:12:3 | Entry | +| raise.rb:14:1:23:3 | Exit | raise.rb:14:1:23:3 | Entry | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:14:1:23:3 | Entry | +| raise.rb:16:8:16:8 | After b [false] | raise.rb:14:1:23:3 | Entry | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:14:1:23:3 | Entry | +| raise.rb:19:10:19:19 | After ExceptionA [match] | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:19:10:19:19 | After ExceptionA [no-match] | raise.rb:16:8:16:8 | After b [true] | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:25:1:34:3 | Entry | +| raise.rb:27:8:27:8 | After b [false] | raise.rb:25:1:34:3 | Entry | +| raise.rb:27:8:27:8 | After b [true] | raise.rb:25:1:34:3 | Entry | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:36:1:45:3 | Entry | +| raise.rb:38:8:38:8 | After b [false] | raise.rb:36:1:45:3 | Entry | +| raise.rb:38:8:38:8 | After b [true] | raise.rb:36:1:45:3 | Entry | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:47:1:55:3 | Entry | +| raise.rb:49:8:49:8 | After b [false] | raise.rb:47:1:55:3 | Entry | +| raise.rb:49:8:49:8 | After b [true] | raise.rb:47:1:55:3 | Entry | +| raise.rb:57:1:66:3 | Exit | raise.rb:57:1:66:3 | Entry | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:57:1:66:3 | Entry | +| raise.rb:59:8:59:8 | After b [false] | raise.rb:57:1:66:3 | Entry | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:57:1:66:3 | Entry | +| raise.rb:62:10:62:31 | After ..., ... [match] | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:62:10:62:31 | After ..., ... [no-match] | raise.rb:59:8:59:8 | After b [true] | +| raise.rb:68:1:77:3 | Exceptional Exit | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:68:1:77:3 | Exit | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:69:3:76:15 | After ... | raise.rb:75:1:76:15 | ensure ... | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:68:1:77:3 | Entry | +| raise.rb:69:6:69:10 | After ... > ... [true] | raise.rb:68:1:77:3 | Entry | +| raise.rb:71:9:71:13 | After ... < ... [false] | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:71:9:71:13 | After ... < ... [true] | raise.rb:69:6:69:10 | After ... > ... [false] | +| raise.rb:74:3:74:20 | After call to puts | raise.rb:71:9:71:13 | After ... < ... [false] | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | Entry | +| raise.rb:79:1:92:3 | Exceptional Exit | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:79:1:92:3 | Exit | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:81:3:90:5 | After begin ... | raise.rb:88:3:89:17 | ensure ... | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:79:1:92:3 | Entry | +| raise.rb:82:8:82:12 | After ... > ... [true] | raise.rb:79:1:92:3 | Entry | +| raise.rb:84:11:84:15 | After ... < ... [false] | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:84:11:84:15 | After ... < ... [true] | raise.rb:82:8:82:12 | After ... > ... [false] | +| raise.rb:87:5:87:22 | After call to puts | raise.rb:84:11:84:15 | After ... < ... [false] | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:79:1:92:3 | Entry | +| raise.rb:94:1:119:3 | Exceptional Exit | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:94:1:119:3 | Exit | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:94:1:119:3 | Entry | +| raise.rb:95:3:118:5 | After ... | raise.rb:116:6:116:7 | After b2 [false] | +| raise.rb:96:3:112:5 | After begin ... | raise.rb:105:5:111:7 | After begin ... | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:97:8:97:12 | After ... > ... [true] | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:99:11:99:15 | After ... < ... [false] | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:99:11:99:15 | After ... < ... [true] | raise.rb:97:8:97:12 | After ... > ... [false] | +| raise.rb:102:5:102:22 | After call to puts | raise.rb:99:11:99:15 | After ... < ... [false] | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:95:3:95:17 | After call to puts | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:103:3:111:7 | ensure ... | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:110:7:110:25 | After call to puts | +| raise.rb:106:10:106:11 | After b1 [false] | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:106:10:106:11 | After b1 [true] | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:104:5:104:23 | After call to puts | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:109:5:110:25 | ensure ... | +| raise.rb:113:3:113:15 | After call to puts | raise.rb:96:3:112:5 | After begin ... | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Entry | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:116:6:116:7 | After b2 [true] | raise.rb:114:1:118:5 | ensure ... | +| raise.rb:121:1:126:3 | Exit | raise.rb:121:1:126:3 | Entry | +| raise.rb:121:9:121:9 | After p [match] | raise.rb:121:1:126:3 | Entry | +| raise.rb:121:9:121:9 | After p [no-match] | raise.rb:121:1:126:3 | Entry | +| raise.rb:128:1:140:3 | Exceptional Exit | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:128:1:140:3 | Exit | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:136:3:137:17 | ensure ... | +| raise.rb:130:8:130:8 | After b [false] | raise.rb:128:1:140:3 | Entry | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:128:1:140:3 | Entry | +| raise.rb:133:10:133:19 | After ExceptionA [match] | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:130:8:130:8 | After b [true] | +| raise.rb:134:10:134:19 | After ExceptionB [match] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:134:10:134:19 | After ExceptionB [no-match] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:128:1:140:3 | Entry | +| raise.rb:143:6:143:6 | After b [false] | raise.rb:142:1:148:3 | Entry | +| raise.rb:143:6:143:6 | After b [true] | raise.rb:142:1:148:3 | Entry | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:142:1:148:3 | Entry | +| raise.rb:155:16:155:50 | Exit | raise.rb:155:16:155:50 | Entry | +| raise.rb:155:37:155:48 | After call to nil? [false] | raise.rb:155:16:155:50 | Entry | +| raise.rb:155:37:155:48 | After call to nil? [true] | raise.rb:155:16:155:50 | Entry | +| raise.rb:160:9:162:7 | Exit | raise.rb:160:9:162:7 | Entry | +| raise.rb:161:23:161:23 | After x [false] | raise.rb:160:9:162:7 | Entry | +| raise.rb:161:23:161:23 | After x [true] | raise.rb:160:9:162:7 | Entry | +| raise.rb:172:1:182:3 | Exit | raise.rb:172:1:182:3 | Entry | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:172:1:182:3 | Entry | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:172:1:182:3 | Entry | +| raise.rb:174:8:174:9 | After b1 [true] | raise.rb:172:1:182:3 | Entry | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:172:1:182:3 | Entry | +| raise.rb:174:14:174:23 | After ... == ... [false] | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:174:14:174:23 | After ... == ... [true] | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:174:8:174:9 | After b1 [false] | +| raise.rb:179:10:179:19 | After ExceptionA [match] | raise.rb:179:3:180:12 | rescue ... | +| raise.rb:179:10:179:19 | After ExceptionA [no-match] | raise.rb:179:3:180:12 | rescue ... | controls -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:9:5:9:23 | self | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:8:3:8 | x | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:4:7:4:11 | break | true | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | false | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | true | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:7:18:9 | if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:21:9:21:20 | self | true | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:21:9:21:20 | self | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:7:18:9 | if ... | false | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:7:22:9 | if ... | false | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:21:9:21:20 | self | false | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:5:39:7 | while ... | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: return] y | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | y | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:9:37:11 | if ... | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:35:12:35:12 | x | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:36:11:36:15 | break | false | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | true | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | true | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | true | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | true | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | false | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:7:49:9 | if ... | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:10:47:10 | x | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | false | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | false | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:7:53:9 | if ... | false | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:52:15:52:16 | 10 | false | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [no-match] when ... | no-match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:18:3:41 | if ... | match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:21:3:22 | self | match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:29:3:37 | self | match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:5:4:24 | [match] when ... | no-match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:5:4:24 | [no-match] when ... | no-match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:10:4:10 | 2 | no-match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:4:17:4:24 | self | no-match | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:18:3:41 | if ... | match | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:21:3:22 | self | match | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:29:3:37 | self | match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:5:4:24 | [match] when ... | no-match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:5:4:24 | [no-match] when ... | no-match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:10:4:10 | 2 | no-match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:17:4:24 | self | no-match | -| case.rb:3:21:3:22 | self | case.rb:3:29:3:37 | self | true | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:17:4:24 | self | match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [match] when ... | match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [no-match] when ... | no-match | -| case.rb:4:10:4:10 | 2 | case.rb:4:17:4:24 | self | match | -| case.rb:8:1:18:3 | enter case_match | case.rb:11:5:11:15 | in ... then ... | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:11:15:11:15 | 3 | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:12:5:13:7 | in ... then ... | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:13:7:13:7 | 4 | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:5:14:25 | in ... then ... | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:13:14:13 | x | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:14:25:14:25 | 6 | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:5:15:28 | in ... then ... | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:17:15:17 | x | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:15:28:15:28 | 7 | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:16:10:16:10 | 8 | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:11:15:11:15 | 3 | match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:13:7:13:7 | 4 | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:13:14:13 | x | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:14:25:14:25 | 6 | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:17:15:17 | x | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:15:28:15:28 | 7 | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:16:10:16:10 | 8 | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:13:7:13:7 | 4 | match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:13:14:13 | x | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:25:14:25 | 6 | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:17:15:17 | x | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:15:28:15:28 | 7 | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:16:10:16:10 | 8 | no-match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:13:14:13 | x | match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:25:14:25 | 6 | match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:5:15:28 | in ... then ... | match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:17:15:17 | x | match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:15:28:15:28 | 7 | match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:16:10:16:10 | 8 | match | -| case.rb:14:13:14:13 | x | case.rb:14:25:14:25 | 6 | true | -| case.rb:14:13:14:13 | x | case.rb:15:5:15:28 | in ... then ... | false | -| case.rb:14:13:14:13 | x | case.rb:15:17:15:17 | x | false | -| case.rb:14:13:14:13 | x | case.rb:15:28:15:28 | 7 | false | -| case.rb:14:13:14:13 | x | case.rb:16:10:16:10 | 8 | false | -| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:17 | x | match | -| case.rb:15:5:15:28 | in ... then ... | case.rb:15:28:15:28 | 7 | match | -| case.rb:15:5:15:28 | in ... then ... | case.rb:16:10:16:10 | 8 | match | -| case.rb:15:17:15:17 | x | case.rb:15:28:15:28 | 7 | false | -| case.rb:15:17:15:17 | x | case.rb:16:10:16:10 | 8 | true | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:21:3:23:5 | case ... | match | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:27:3:29:5 | case ... | match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:1:39:3 | exit case_match_array (abnormal) | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:35:5:35:11 | in ... then ... | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:35:9:35:9 | x | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:36:5:36:13 | in ... then ... | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:36:9:36:9 | x | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:5:37:27 | in ... then ... | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:8:37:26 | [ ..., * ] | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:12:37:12 | a | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:15:37:15 | b | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:19:37:19 | c | no-match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:37:25:37:25 | e | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | false | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | true | -| case.rb:35:5:35:11 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:36:9:36:9 | x | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:12:37:12 | a | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:15:37:15 | b | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:19:37:19 | c | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:37:25:37:25 | e | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | false | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | true | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:12:37:12 | a | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:15:37:15 | b | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:19:37:19 | c | no-match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:25:37:25 | e | no-match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:12:37:12 | a | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:15:37:15 | b | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:19:37:19 | c | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:25:37:25 | e | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | false | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | true | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:15:37:15 | b | false | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:15:37:15 | b | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:15:37:15 | b | true | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:19:37:19 | c | false | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:19:37:19 | c | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:19:37:19 | c | true | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:25:37:25 | e | false | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:25:37:25 | e | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:25:37:25 | e | true | -| case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | match | -| case.rb:37:12:37:12 | a | case.rb:37:19:37:19 | c | match | -| case.rb:37:12:37:12 | a | case.rb:37:25:37:25 | e | match | -| case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | match | -| case.rb:37:15:37:15 | b | case.rb:37:25:37:25 | e | match | -| case.rb:37:19:37:19 | c | case.rb:37:25:37:25 | e | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | false | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | true | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:16:43:16 | 2 | false | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:16:43:16 | 2 | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:16:43:16 | 2 | true | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:20:43:20 | y | false | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:20:43:20 | y | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:20:43:20 | y | true | -| case.rb:43:10:43:10 | x | case.rb:43:16:43:16 | 2 | match | -| case.rb:43:10:43:10 | x | case.rb:43:20:43:20 | y | match | -| case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:8:49:34 | { ..., ** } | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:20:49:20 | 1 | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:23:49:23 | a | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:29:49:32 | rest | match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | false | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | true | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:23:49:23 | a | false | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:23:49:23 | a | match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:23:49:23 | a | true | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:29:49:32 | rest | false | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:29:49:32 | rest | match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:29:49:32 | rest | true | -| case.rb:49:20:49:20 | 1 | case.rb:49:23:49:23 | a | match | -| case.rb:49:20:49:20 | 1 | case.rb:49:29:49:32 | rest | match | -| case.rb:49:23:49:23 | a | case.rb:49:29:49:32 | rest | match | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:8:50:24 | { ..., ** } | match | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:16:50:16 | 1 | match | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | false | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | match | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | true | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | match | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:58:5:58:10 | in ... then ... | no-match | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:65:12:65:12 | _ | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:74:5:74:11 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:75:5:75:15 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:76:5:76:18 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:13:82:13 | x | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:83:20:83:25 | string | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:14:89:17 | self | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:21:89:24 | true | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:28:89:32 | false | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:13:91:14 | "" | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:13:82:13 | x | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:20:82:20 | 1 | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:13:82:13 | x | match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:20:82:20 | 1 | match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:82:13:82:13 | x | case.rb:82:20:82:20 | 1 | match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:20:83:25 | string | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:83:20:83:25 | string | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:14:89:17 | self | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:21:89:24 | true | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:28:89:32 | false | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:83:20:83:25 | string | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:83:20:83:25 | string | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:14:89:17 | self | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:21:89:24 | true | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:28:89:32 | false | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:83:20:83:25 | string | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:83:20:83:25 | string | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:83:20:83:25 | string | case.rb:91:13:91:14 | "" | no-match | -| case.rb:83:20:83:25 | string | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:83:20:83:25 | string | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:14:89:17 | self | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:21:89:24 | true | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:28:89:32 | false | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:91:13:91:14 | "" | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:21:89:24 | true | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:28:89:32 | false | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:14:89:17 | self | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:14:89:17 | self | case.rb:89:21:89:24 | true | no-match | -| case.rb:89:14:89:17 | self | case.rb:89:28:89:32 | false | no-match | -| case.rb:89:14:89:17 | self | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:14:89:17 | self | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:14:89:17 | self | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:14:89:17 | self | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:14:89:17 | self | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:14:89:17 | self | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:14:89:17 | self | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:14:89:17 | self | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:21:89:24 | true | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:21:89:24 | true | case.rb:89:28:89:32 | false | no-match | -| case.rb:89:21:89:24 | true | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:21:89:24 | true | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:21:89:24 | true | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:21:89:24 | true | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:21:89:24 | true | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:21:89:24 | true | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:21:89:24 | true | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:21:89:24 | true | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:28:89:32 | false | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:28:89:32 | false | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:28:89:32 | false | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:28:89:32 | false | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:28:89:32 | false | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:28:89:32 | false | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:28:89:32 | false | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:28:89:32 | false | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:28:89:32 | false | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:13:91:14 | "" | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:13:91:14 | "" | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:91:13:91:14 | "" | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:69:1:93:3 | exit case_match_various (abnormal) | no-match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else | match | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | match | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:13:97:13 | x | match | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:25:97:25 | 6 | match | -| case.rb:97:13:97:13 | x | case.rb:97:25:97:25 | 6 | true | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:19:19:19:32 | self | true | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:21:19:21:32 | self | false | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:32:9:32:9 | 1 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:35:1:37:3 | if ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:41:1:45:3 | case ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:3:42:24 | [match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:3:42:24 | [no-match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:42:15:42:24 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:3:43:31 | [match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:3:43:31 | [no-match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:8:43:8 | 2 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:11:43:11 | 3 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:14:43:14 | 4 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:43:21:43:31 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:44:8:44:18 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:47:1:50:3 | case ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:3:48:29 | [match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:3:48:29 | [no-match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:48:20:48:29 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:3:49:37 | [match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:3:49:37 | [no-match] when ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:8:49:8 | b | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:16:49:16 | b | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:49:27:49:37 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:17:60:40 | ... ? ... : ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:27:60:31 | hello | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:60:37:60:39 | bye | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:1:75:47 | if ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:15:75:15 | 0 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:17:75:43 | elsif ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:23:75:23 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:35:75:36 | 10 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:75:43:75:43 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | [false] ! ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | [true] ! ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | if ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:90:5:90:5 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:113:1:113:9 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:113:1:113:19 | ... if ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:136:1:136:29 | ... rescue ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:136:12:136:29 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:1:172:49 | unless ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:21:172:29 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:172:36:172:45 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:174:1:174:9 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:174:1:174:23 | ... unless ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:1:176:41 | until ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:7:176:7 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:176:17:176:17 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:1:179:36 | ... until ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:2:179:13 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:179:30:179:30 | i | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:182:1:186:3 | while ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:182:7:182:7 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:183:3:183:3 | x | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:184:3:184:25 | if ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:1:188:35 | ... while ... | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:2:188:13 | self | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:188:30:188:30 | i | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:1:205:3 | __synth__0__1 | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:205:4:205:5 | if ... | true | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:35:1:37:3 | if ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:41:1:45:3 | case ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:3:42:24 | [match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:3:42:24 | [no-match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:42:15:42:24 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:3:43:31 | [match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:3:43:31 | [no-match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:8:43:8 | 2 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:11:43:11 | 3 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:14:43:14 | 4 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:43:21:43:31 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:44:8:44:18 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:47:1:50:3 | case ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:3:48:29 | [match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:3:48:29 | [no-match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:48:20:48:29 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:3:49:37 | [match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:3:49:37 | [no-match] when ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:8:49:8 | b | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:16:49:16 | b | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:49:27:49:37 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:17:60:40 | ... ? ... : ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:27:60:31 | hello | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:60:37:60:39 | bye | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:1:75:47 | if ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:15:75:15 | 0 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:17:75:43 | elsif ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:23:75:23 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:35:75:36 | 10 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:75:43:75:43 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | [false] ! ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | [true] ! ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | if ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:90:5:90:5 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:113:1:113:9 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:113:1:113:19 | ... if ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:136:1:136:29 | ... rescue ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:136:12:136:29 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:1:172:49 | unless ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:21:172:29 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:172:36:172:45 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:174:1:174:9 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:174:1:174:23 | ... unless ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:1:176:41 | until ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:7:176:7 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:176:17:176:17 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:1:179:36 | ... until ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:2:179:13 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:179:30:179:30 | i | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:182:1:186:3 | while ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:182:7:182:7 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:183:3:183:3 | x | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:184:3:184:25 | if ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:184:18:184:21 | redo | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:1:188:35 | ... while ... | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:2:188:13 | self | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:188:30:188:30 | i | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:1:205:3 | nil | false | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:205:4:205:5 | if ... | false | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [match] when ... | match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:15:42:24 | self | match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:3:43:31 | [match] when ... | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:8:43:8 | 2 | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:11:43:11 | 3 | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:43:21:43:31 | self | no-match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [match] when ... | match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [no-match] when ... | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:20:48:29 | self | match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:3:49:37 | [match] when ... | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:8:49:8 | b | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:16:49:16 | b | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:49:27:49:37 | self | no-match | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:15:42:24 | self | match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:3:43:31 | [match] when ... | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:8:43:8 | 2 | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:11:43:11 | 3 | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:21:43:31 | self | no-match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:21:43:31 | self | match | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:11:43:11 | 3 | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:27:60:31 | hello | true | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:37:60:39 | bye | false | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:20:48:29 | self | match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:3:49:37 | [match] when ... | no-match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:8:49:8 | b | no-match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:16:49:16 | b | no-match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:27:49:37 | self | no-match | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:27:49:37 | self | match | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:16:49:16 | b | no-match | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:15:75:15 | 0 | true | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:17:75:43 | elsif ... | false | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:23:75:23 | x | false | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:35:75:36 | 10 | false | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:43:75:43 | x | false | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | true | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | false | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | x | false | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:35:75:36 | 10 | true | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:43:75:43 | x | false | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:3:91:24 | if ... | false | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:17:91:20 | next | true | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | x | true | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:113:1:113:9 | self | true | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | false | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | no-match | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | true | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:21:172:29 | self | false | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:36:172:45 | self | true | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:1:174:9 | self | false | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:1:176:41 | until ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:17:176:17 | x | false | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:1:179:36 | ... until ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:2:179:13 | self | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:179:30:179:30 | i | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:182:1:186:3 | while ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:182:7:182:7 | x | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:183:3:183:3 | x | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:184:3:184:25 | if ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:1:188:35 | ... while ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:2:188:13 | self | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:188:30:188:30 | i | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:1:205:3 | __synth__0__1 | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:205:4:205:5 | if ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:1:179:36 | ... until ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:2:179:13 | self | false | -| cfg.rb:179:30:179:30 | i | cfg.rb:182:1:186:3 | while ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:182:7:182:7 | x | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:183:3:183:3 | x | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:184:3:184:25 | if ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:1:188:35 | ... while ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:2:188:13 | self | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:188:30:188:30 | i | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:1:205:3 | __synth__0__1 | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:205:4:205:5 | if ... | true | -| cfg.rb:182:7:182:7 | x | cfg.rb:182:1:186:3 | while ... | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:183:3:183:3 | x | true | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:3:184:25 | if ... | true | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:1:188:35 | ... while ... | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:2:188:13 | self | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:188:30:188:30 | i | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:1:205:3 | nil | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:205:4:205:5 | if ... | false | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:3:184:25 | if ... | false | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:1:188:35 | ... while ... | false | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:2:188:13 | self | true | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:1:205:3 | nil | false | -| cfg.rb:188:30:188:30 | i | cfg.rb:205:4:205:5 | if ... | false | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:5:22:5:24 | 123 | false | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | false | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | false | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:2:3:4:5 | if ... | false | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:3:5:3:10 | self | true | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:9:3:11:5 | if ... | false | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:10:5:10:18 | self | true | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:3:5:3:30 | self | true | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:3:7:35 | elsif ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:9 | x | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:24 | [false] ... and ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:24 | [true] ... and ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:38 | [false] ... and ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:38 | [true] ... and ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:20:4:20 | x | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:30:4:38 | [false] ! ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:30:4:38 | [true] ! ... | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:31:4:38 | [false] ( ... ) | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:31:4:38 | [true] ( ... ) | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:32:4:32 | x | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:5:5:5:17 | self | false | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:7:5:7:35 | self | false | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:36:1:38:3 | conditional_method_def | false | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:24 | [true] ... and ... | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:20:4:20 | x | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:30:4:38 | [true] ! ... | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:32:4:32 | x | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:30:4:38 | [true] ! ... | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:31:4:38 | [false] ( ... ) | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:31:4:38 | [true] ( ... ) | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:32:4:32 | x | true | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:7:5:7:35 | self | false | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:24 | [true] ... and ... | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:30:4:38 | [true] ! ... | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:32:4:32 | x | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:9:4:38 | [true] ... and ... | false | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:30:4:38 | [true] ! ... | false | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:5:5:5:17 | self | false | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:9:4:38 | [true] ... and ... | false | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:30:4:38 | [true] ! ... | false | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | false | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | true | -| ifs.rb:4:32:4:32 | x | ifs.rb:5:5:5:17 | self | false | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:12:3:14:5 | if ... | false | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:13:12:13:12 | 0 | true | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:20:5:20:5 | x | true | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:21:5:23:7 | if ... | true | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:22:7:22:7 | x | true | -| ifs.rb:20:5:20:5 | x | ifs.rb:22:7:22:7 | x | true | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:16:29:17 | b2 | true | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:21:29:22 | b3 | false | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | false | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:28:29:35 | b2 \|\| b3 | true | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:10:29:23 | [false] ( ... ) | false | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | false | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:10:29:23 | [true] ( ... ) | true | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:28:29:35 | b2 \|\| b3 | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:13:33:19 | [false] then ... | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:13:33:19 | [true] then ... | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:18:33:19 | b2 | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:21:33:44 | [false] elsif ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:21:33:44 | [true] elsif ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:27:33:28 | b3 | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:30:33:36 | [false] then ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:30:33:36 | [true] then ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:35:33:36 | b4 | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:38:33:44 | [false] else ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:38:33:44 | [true] else ... | false | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:43:33:44 | b5 | false | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | false | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | true | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:6:33:49 | [false] ( ... ) | false | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | false | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:6:33:49 | [true] ( ... ) | true | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | true | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [false] then ... | false | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [true] then ... | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:30:33:36 | [false] then ... | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:30:33:36 | [true] then ... | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:35:33:36 | b4 | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:38:33:44 | [false] else ... | false | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:38:33:44 | [true] else ... | false | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:43:33:44 | b5 | false | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [false] then ... | false | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [true] then ... | true | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [false] else ... | false | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [true] else ... | true | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:3:43:5 | if ... | true | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:6:41:10 | [false] ! ... | true | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:3:43:5 | if ... | false | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:48:5:48:15 | self | true | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:49:3:49:6 | else ... | false | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:6:55:15 | [false] ( ... ) | false | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:7:55:14 | [false] ... \|\| ... | false | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:13:55:14 | b2 | false | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:56:5:56:19 | self | true | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:6:55:15 | [false] ( ... ) | false | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:6:55:15 | [true] ( ... ) | true | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:56:5:56:19 | self | true | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:6:55:15 | [false] ( ... ) | false | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [false] ... \|\| ... | false | -| loops.rb:2:9:2:9 | x | loops.rb:2:3:5:5 | while ... | false | -| loops.rb:2:9:2:9 | x | loops.rb:3:5:3:10 | self | true | -| loops.rb:9:9:9:9 | x | loops.rb:10:5:10:10 | self | true | -| loops.rb:9:9:9:9 | x | loops.rb:13:7:13:11 | break | true | -| loops.rb:9:9:9:9 | x | loops.rb:14:11:14:11 | x | true | -| loops.rb:9:9:9:9 | x | loops.rb:15:7:15:10 | next | true | -| loops.rb:9:9:9:9 | x | loops.rb:16:5:17:10 | elsif ... | true | -| loops.rb:9:9:9:9 | x | loops.rb:16:11:16:11 | x | true | -| loops.rb:9:9:9:9 | x | loops.rb:17:7:17:10 | redo | true | -| loops.rb:10:5:10:10 | self | loops.rb:13:7:13:11 | break | true | -| loops.rb:10:5:10:10 | self | loops.rb:14:11:14:11 | x | false | -| loops.rb:10:5:10:10 | self | loops.rb:15:7:15:10 | next | false | -| loops.rb:10:5:10:10 | self | loops.rb:16:5:17:10 | elsif ... | false | -| loops.rb:10:5:10:10 | self | loops.rb:16:11:16:11 | x | false | -| loops.rb:10:5:10:10 | self | loops.rb:17:7:17:10 | redo | false | -| loops.rb:14:11:14:11 | x | loops.rb:15:7:15:10 | next | true | -| loops.rb:14:11:14:11 | x | loops.rb:16:5:17:10 | elsif ... | false | -| loops.rb:14:11:14:11 | x | loops.rb:16:11:16:11 | x | false | -| loops.rb:14:11:14:11 | x | loops.rb:17:7:17:10 | redo | false | -| loops.rb:16:11:16:11 | x | loops.rb:16:5:17:10 | elsif ... | false | -| loops.rb:16:11:16:11 | x | loops.rb:17:7:17:10 | redo | true | -| loops.rb:31:9:31:9 | x | loops.rb:31:3:32:5 | while ... | false | -| loops.rb:31:9:31:9 | x | loops.rb:31:15:32:5 | do ... | true | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:8:3:10:5 | if ... | false | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:9:5:9:17 | self | true | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:1:23:3 | exit m2 (abnormal) | true | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:16:5:18:7 | if ... | false | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:17:7:17:22 | self | true | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:20:5:20:18 | self | true | -| raise.rb:17:7:17:22 | self | raise.rb:20:5:20:18 | self | match | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:27:5:29:7 | if ... | false | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:28:7:28:22 | self | true | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:38:5:40:7 | if ... | false | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:39:7:39:22 | self | true | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:49:5:51:7 | if ... | false | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:50:7:50:22 | self | true | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:1:66:3 | exit m6 (abnormal) | true | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:59:5:61:7 | if ... | false | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:60:7:60:22 | self | true | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:62:22:62:31 | ExceptionB | true | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:62:36:62:36 | e | true | -| raise.rb:60:7:60:22 | self | raise.rb:57:1:66:3 | exit m6 (abnormal) | no-match | -| raise.rb:60:7:60:22 | self | raise.rb:62:22:62:31 | ExceptionB | no-match | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:1:77:3 | exit m7 (normal) | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:70:5:70:17 | self | true | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:71:3:72:18 | elsif ... | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:71:9:71:9 | x | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:72:13:72:17 | x < 0 | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | self | false | -| raise.rb:71:9:71:9 | x | raise.rb:71:3:72:18 | elsif ... | false | -| raise.rb:71:9:71:9 | x | raise.rb:72:13:72:17 | x < 0 | true | -| raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | self | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:1:92:3 | exit m8 (normal) | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:83:7:83:19 | self | true | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:84:5:85:20 | elsif ... | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:84:11:84:11 | x | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:85:15:85:19 | x < 0 | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | self | false | -| raise.rb:84:11:84:11 | x | raise.rb:84:5:85:20 | elsif ... | false | -| raise.rb:84:11:84:11 | x | raise.rb:85:15:85:19 | x < 0 | true | -| raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | self | false | -| raise.rb:97:8:97:8 | x | raise.rb:94:1:119:3 | exit m9 (normal) | false | -| raise.rb:97:8:97:8 | x | raise.rb:98:7:98:19 | self | true | -| raise.rb:97:8:97:8 | x | raise.rb:99:5:100:20 | elsif ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:99:11:99:11 | x | false | -| raise.rb:97:8:97:8 | x | raise.rb:100:15:100:19 | x < 0 | false | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | self | false | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | [ensure: return] if ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:106:7:108:9 | if ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | [ensure: return] b1 | false | -| raise.rb:97:8:97:8 | x | raise.rb:106:10:106:11 | b1 | false | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | [ensure: return] self | false | -| raise.rb:97:8:97:8 | x | raise.rb:107:9:107:26 | self | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:109:5:110:25 | ensure ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:115:3:115:22 | self | false | -| raise.rb:97:8:97:8 | x | raise.rb:116:3:118:5 | [ensure: return] if ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:97:8:97:8 | x | raise.rb:117:5:117:22 | [ensure: return] self | false | -| raise.rb:97:8:97:8 | x | raise.rb:117:5:117:22 | self | false | -| raise.rb:99:11:99:11 | x | raise.rb:99:5:100:20 | elsif ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:100:15:100:19 | x < 0 | true | -| raise.rb:99:11:99:11 | x | raise.rb:104:5:104:23 | self | false | -| raise.rb:99:11:99:11 | x | raise.rb:106:7:108:9 | [ensure: return] if ... | true | -| raise.rb:99:11:99:11 | x | raise.rb:106:7:108:9 | if ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | [ensure: return] b1 | true | -| raise.rb:99:11:99:11 | x | raise.rb:106:10:106:11 | b1 | false | -| raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | [ensure: return] self | true | -| raise.rb:99:11:99:11 | x | raise.rb:107:9:107:26 | self | false | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | true | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | [ensure: return] ensure ... | true | -| raise.rb:99:11:99:11 | x | raise.rb:109:5:110:25 | ensure ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:115:3:115:22 | self | false | -| raise.rb:99:11:99:11 | x | raise.rb:116:3:118:5 | [ensure: return] if ... | true | -| raise.rb:99:11:99:11 | x | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:99:11:99:11 | x | raise.rb:117:5:117:22 | self | false | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | true | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | true | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:109:5:110:25 | [ensure: return] ensure ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:116:3:118:5 | [ensure: return] if ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:117:5:117:22 | [ensure: return] self | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | true | -| raise.rb:106:10:106:11 | b1 | raise.rb:109:5:110:25 | ensure ... | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:115:3:115:22 | self | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:117:5:117:22 | self | false | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | false | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | true | -| raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | true | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | false | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | no-match | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | true | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:125:3:125:51 | self | match | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:130:5:132:7 | if ... | false | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:131:7:131:22 | self | true | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:133:3:133:19 | rescue ... | true | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:134:10:134:19 | ExceptionB | true | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:135:5:135:21 | self | true | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:137:5:137:17 | [ensure: exception] self | true | -| raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | match | -| raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | no-match | -| raise.rb:131:7:131:22 | self | raise.rb:135:5:135:21 | self | no-match | -| raise.rb:131:7:131:22 | self | raise.rb:137:5:137:17 | [ensure: exception] self | no-match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:143:3:145:5 | if ... | false | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:144:5:144:12 | self | true | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:32 | self | true | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:48 | ... if ... | false | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:14 | self | false | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:23 | ... unless ... | true | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:14:174:15 | b2 | false | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | true | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | -| raise.rb:174:14:174:15 | b2 | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | match | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | false | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | true | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | true | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | true | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [false] | false | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [true] | true | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | false | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:13:1:25:3 | Exceptional Exit | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [false] | false | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:15:5:23:7 | After begin ... | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:19:5:22:9 | ensure ... | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:7:22:9 | After if ... | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | true | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [false] | false | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [true] | true | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | false | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | true | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [false] | false | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [true] | true | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | false | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | true | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | true | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:35:12:35:16 | After ... > ... [true] | true | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [false] | false | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [true] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:44:1:56:3 | Exceptional Exit | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [false] | false | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:46:5:54:7 | After begin ... | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:47:10:47:14 | After ... > ... [false] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:47:10:47:14 | After ... > ... [true] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:50:5:53:9 | ensure ... | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | true | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [false] | false | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [true] | true | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:44:1:56:3 | Exceptional Exit | false | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:46:5:54:7 | After begin ... | false | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | false | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | true | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [match] | match | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [no-match] | no-match | +| case.rb:1:1:6:3 | Entry | case.rb:3:18:3:41 | After if ... | match | +| case.rb:1:1:6:3 | Entry | case.rb:3:21:3:22 | After call to x2 [false] | match | +| case.rb:1:1:6:3 | Entry | case.rb:3:21:3:22 | After call to x2 [true] | match | +| case.rb:1:1:6:3 | Entry | case.rb:4:10:4:10 | After 2 [match] | no-match | +| case.rb:1:1:6:3 | Entry | case.rb:4:10:4:10 | After 2 [no-match] | no-match | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [false] | false | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [true] | true | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [match] | match | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [match] | match | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:11:8:11:8 | After 1 [match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:11:8:11:8 | After 1 [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:12:8:12:8 | After 2 [match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:12:8:12:8 | After 2 [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:14:8:14:8 | After x [match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:14:8:14:8 | After x [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:14:13:14:18 | After ... == ... [false] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:14:13:14:18 | After ... == ... [true] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:15:5:15:28 | in ... then ... | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:15:8:15:8 | After x [match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:15:8:15:8 | After x [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:15:17:15:21 | After ... < ... [false] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:15:17:15:21 | After ... < ... [true] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:16:5:16:10 | else ... | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [match] | match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:12:8:12:8 | After 2 [match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:8:14:8 | After x [match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:8:14:8 | After x [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:5:15:28 | in ... then ... | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:8:15:8 | After x [match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:8:15:8 | After x [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:17:15:21 | After ... < ... [false] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:15:17:15:21 | After ... < ... [true] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:16:5:16:10 | else ... | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [match] | match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:8:14:8 | After x [match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:8:14:8 | After x [no-match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:5:15:28 | in ... then ... | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:8:15:8 | After x [match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:8:15:8 | After x [no-match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:17:15:21 | After ... < ... [false] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:15:17:15:21 | After ... < ... [true] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:16:5:16:10 | else ... | no-match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [match] | match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [no-match] | no-match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:13:14:18 | After ... == ... [false] | match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:13:14:18 | After ... == ... [true] | match | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [false] | false | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [true] | true | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [match] | match | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [no-match] | no-match | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:21 | After ... < ... [false] | match | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:21 | After ... < ... [true] | match | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [false] | false | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [true] | true | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [match] | match | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [no-match] | no-match | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [match] | match | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [no-match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [match] | match | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:35:8:35:10 | After [ ..., * ] [match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:36:8:36:12 | After [ ..., * ] [match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:37:8:37:26 | After [ ..., * ] [match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [match] | match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | no-match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | no-match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | match | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [match] | match | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [match] | match | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [no-match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:50:8:50:24 | After { ..., ** } [match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:50:8:50:24 | After { ..., ** } [no-match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:51:8:51:16 | After { ..., ** } [match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:51:8:51:16 | After { ..., ** } [no-match] | no-match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [match] | match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | no-match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [match] | no-match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | no-match | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [match] | match | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [match] | match | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [no-match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:58:8:58:10 | After var [match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:58:8:58:10 | After var [no-match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:59:8:59:20 | After "unreachable" [match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:59:8:59:20 | After "unreachable" [no-match] | no-match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [match] | match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [no-match] | no-match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:59:8:59:20 | After "unreachable" [match] | no-match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | no-match | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [match] | match | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | no-match | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [match] | match | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [match] | match | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:74:8:74:11 | After ^... [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:74:8:74:11 | After ^... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:75:8:75:15 | After "string" [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:75:8:75:15 | After "string" [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:76:8:76:18 | After call to [] [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:77:8:77:18 | After call to [] [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [match] | match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:75:8:75:15 | After "string" [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:76:8:76:18 | After call to [] [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:77:8:77:18 | After call to [] [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [match] | match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:76:8:76:18 | After call to [] [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:77:8:77:18 | After call to [] [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [match] | match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:77:8:77:18 | After call to [] [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [match] | match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:84:8:84:17 | After Bar [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [match] | match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:86:8:86:11 | After :foo [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [match] | match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | no-match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | match | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [match] | match | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [no-match] | no-match | +| case.rb:95:1:99:3 | Entry | case.rb:97:13:97:18 | After ... == ... [false] | match | +| case.rb:95:1:99:3 | Entry | case.rb:97:13:97:18 | After ... == ... [true] | match | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [false] | false | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [true] | true | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [false] | false | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [true] | true | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [match] | match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [no-match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:3:43:31 | After when ... [match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:8:43:8 | After 2 [match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:8:43:8 | After 2 [no-match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:11:43:11 | After 3 [match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:11:43:11 | After 3 [no-match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:14:43:14 | After 4 [match] | no-match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [match] | match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:3:49:37 | After when ... [match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [match] | match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:11:43:11 | After 3 [match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [match] | match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | no-match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | no-match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | match | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [false] | false | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [true] | true | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [match] | match | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | no-match | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [match] | no-match | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | no-match | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [match] | match | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | no-match | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [false] | false | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [true] | true | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:17:75:43 | After elsif ... | false | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:23:75:28 | After ... > ... [false] | false | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:23:75:28 | After ... > ... [true] | false | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | false | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [true] | true | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [false] | false | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [true] | true | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [false] | false | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [true] | true | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | false | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | true | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [match] | match | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [no-match] | no-match | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [false] | false | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [true] | true | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [false] | false | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [false] | false | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:179:30:179:36 | After ... == ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:7:182:12 | After ... < ... [false] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:7:182:12 | After ... < ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:182:14:186:3 | do ... | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:184:6:184:11 | After ... == ... [false] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:30:188:35 | After ... != ... [false] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:188:30:188:35 | After ... != ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After call to == [false] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After call to == [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:205:4:205:5 | After if ... | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | false | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:7:182:12 | After ... < ... [false] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:7:182:12 | After ... < ... [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:182:14:186:3 | do ... | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:184:6:184:11 | After ... == ... [false] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:30:188:35 | After ... != ... [false] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:188:30:188:35 | After ... != ... [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After call to == [false] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After call to == [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:205:4:205:5 | After if ... | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [false] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [true] | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:14:186:3 | do ... | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [false] | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:30:188:35 | After ... != ... [false] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After call to == [false] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After call to == [true] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:205:4:205:5 | After if ... | false | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [false] | false | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [false] | false | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | true | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After call to == [false] | false | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After call to == [true] | false | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:205:4:205:5 | After if ... | false | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [false] | false | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [true] | true | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | false | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | true | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | false | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | true | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | false | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | true | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [false] | false | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [true] | true | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [false] | false | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [true] | true | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [true] | true | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:3:7:35 | After elsif ... | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:14 | After ... <= ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:14 | After ... <= ... [true] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:24 | After ... and ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:9:4:38 | After ... and ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:20:4:24 | After ... > ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:20:4:24 | After ... > ... [true] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:32:4:37 | After ... == ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:4:32:4:37 | After ... == ... [true] | false | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [false] | false | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [true] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | false | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [true] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [false] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:20:4:24 | After ... > ... [true] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:32:4:37 | After ... == ... [false] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:32:4:37 | After ... == ... [true] | true | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [false] | false | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | true | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:32:4:37 | After ... == ... [false] | true | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | true | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [false] | false | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | true | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [false] | false | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [true] | true | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [false] | false | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [true] | true | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:5:23:7 | After if ... | true | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:8:21:13 | After ... > ... [false] | true | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:21:8:21:13 | After ... > ... [true] | true | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [false] | false | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [true] | true | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [false] | false | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [true] | true | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:16:29:17 | After b2 [false] | true | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:16:29:17 | After b2 [true] | true | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:21:29:22 | After b3 [false] | false | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:21:29:22 | After b3 [true] | false | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [false] | false | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [true] | true | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [false] | false | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [true] | true | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [true] | true | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:18:33:19 | After b2 [false] | true | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:18:33:19 | After b2 [true] | true | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:21:33:44 | After elsif ... [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:21:33:44 | After elsif ... [true] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:27:33:28 | After b3 [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:27:33:28 | After b3 [true] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:35:33:36 | After b4 [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:35:33:36 | After b4 [true] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:43:33:44 | After b5 [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:43:33:44 | After b5 [true] | false | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [false] | false | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [true] | true | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:35:33:36 | After b4 [false] | true | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:35:33:36 | After b4 [true] | true | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:43:33:44 | After b5 [false] | false | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:43:33:44 | After b5 [true] | false | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [false] | false | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [true] | true | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [false] | false | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [true] | true | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [false] | false | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [true] | true | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [false] | false | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [true] | true | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [false] | false | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [true] | true | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:13:55:14 | After b2 [false] | false | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:13:55:14 | After b2 [true] | false | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [false] | false | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [true] | true | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [false] | false | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [true] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [false] | false | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [true] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:15:20:5 | do ... | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:12:8:12:14 | After ... > ... [false] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:12:8:12:14 | After ... > ... [true] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:14:11:14:16 | After ... > ... [false] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:14:11:14:16 | After ... > ... [true] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:16:11:16:16 | After ... > ... [false] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:16:11:16:16 | After ... > ... [true] | true | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [false] | false | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [true] | true | +| loops.rb:9:15:20:5 | do ... | loops.rb:14:11:14:16 | After ... > ... [false] | false | +| loops.rb:9:15:20:5 | do ... | loops.rb:14:11:14:16 | After ... > ... [true] | false | +| loops.rb:9:15:20:5 | do ... | loops.rb:16:11:16:16 | After ... > ... [false] | false | +| loops.rb:9:15:20:5 | do ... | loops.rb:16:11:16:16 | After ... > ... [true] | false | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | false | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [true] | true | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | false | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [true] | false | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | false | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [true] | true | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [false] | false | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [true] | true | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [false] | false | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [true] | true | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [false] | false | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [true] | true | +| raise.rb:14:1:23:3 | Entry | raise.rb:19:10:19:19 | After ExceptionA [match] | true | +| raise.rb:14:1:23:3 | Entry | raise.rb:19:10:19:19 | After ExceptionA [no-match] | true | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [match] | match | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [no-match] | no-match | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [false] | false | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [true] | true | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [false] | false | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [true] | true | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [false] | false | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [true] | true | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [false] | false | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [true] | true | +| raise.rb:57:1:66:3 | Entry | raise.rb:62:10:62:31 | After ..., ... [match] | true | +| raise.rb:57:1:66:3 | Entry | raise.rb:62:10:62:31 | After ..., ... [no-match] | true | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [match] | match | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [no-match] | no-match | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [false] | false | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [true] | true | +| raise.rb:68:1:77:3 | Entry | raise.rb:71:9:71:13 | After ... < ... [false] | false | +| raise.rb:68:1:77:3 | Entry | raise.rb:71:9:71:13 | After ... < ... [true] | false | +| raise.rb:68:1:77:3 | Entry | raise.rb:74:3:74:20 | After call to puts | false | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [false] | false | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [true] | true | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:74:3:74:20 | After call to puts | false | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [false] | false | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [true] | true | +| raise.rb:79:1:92:3 | Entry | raise.rb:84:11:84:15 | After ... < ... [false] | false | +| raise.rb:79:1:92:3 | Entry | raise.rb:84:11:84:15 | After ... < ... [true] | false | +| raise.rb:79:1:92:3 | Entry | raise.rb:87:5:87:22 | After call to puts | false | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [false] | false | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [true] | true | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:87:5:87:22 | After call to puts | false | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [false] | false | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [true] | true | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:99:11:99:15 | After ... < ... [false] | false | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:99:11:99:15 | After ... < ... [true] | false | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:102:5:102:22 | After call to puts | false | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [false] | false | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [true] | true | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:102:5:102:22 | After call to puts | false | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [false] | false | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [true] | true | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | Normal Exit | false | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:95:3:118:5 | After ... | false | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [false] | false | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [true] | true | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [match] | match | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [no-match] | no-match | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [false] | false | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [true] | true | +| raise.rb:128:1:140:3 | Entry | raise.rb:133:10:133:19 | After ExceptionA [match] | true | +| raise.rb:128:1:140:3 | Entry | raise.rb:133:10:133:19 | After ExceptionA [no-match] | true | +| raise.rb:128:1:140:3 | Entry | raise.rb:134:10:134:19 | After ExceptionB [match] | true | +| raise.rb:128:1:140:3 | Entry | raise.rb:134:10:134:19 | After ExceptionB [no-match] | true | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [match] | match | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | no-match | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:134:10:134:19 | After ExceptionB [match] | no-match | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | no-match | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [match] | match | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | no-match | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [false] | false | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [true] | true | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [false] | false | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [true] | true | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [false] | false | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [true] | true | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [false] | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [true] | true | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:14:174:23 | After ... == ... [false] | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:14:174:23 | After ... == ... [true] | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:3:180:12 | rescue ... | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:10:179:19 | After ExceptionA [match] | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:179:10:179:19 | After ExceptionA [no-match] | false | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [false] | false | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [true] | true | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [match] | match | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [no-match] | no-match | successor -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:8:3:10:5 | if ... | false | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:9:5:9:23 | self | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:3:6:5 | while ... | false | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:8:3:8 | x | true | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:8:6:8:13 | [ensure: exception] self | exception | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:2:3:6:5 | while ... | exception | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:5:5:7 | if ... | false | -| break_ensure.rb:3:8:3:8 | x | break_ensure.rb:4:7:4:11 | break | true | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | false | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:3:24:5 | while ... | false | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:16:10:16:10 | x | true | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:20:7:22:9 | if ... | false | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:21:9:21:20 | self | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:7:18:9 | if ... | false | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:16:10:16:10 | x | break_ensure.rb:20:10:20:10 | [ensure: exception] y | exception | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | false | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | false | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:29:5:31:7 | if ... | false | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:30:7:30:12 | return | true | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:33:11:33:11 | [ensure: exception] y | exception | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | false | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | false | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:5:39:7 | while ... | false | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:12:35:12 | x | true | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:9:37:11 | if ... | false | -| break_ensure.rb:35:12:35:12 | x | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:3:55:5 | while ... | false | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:47:10:47:10 | x | true | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:7:53:9 | if ... | false | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:7:49:9 | if ... | false | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:47:10:47:10 | x | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [match] when ... | match | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:3:5:3:42 | [no-match] when ... | no-match | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:21:3:22 | self | match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:10:4:10 | 2 | no-match | -| case.rb:3:21:3:22 | self | case.rb:3:18:3:41 | if ... | false | -| case.rb:3:21:3:22 | self | case.rb:3:29:3:37 | self | true | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:17:4:24 | self | match | -| case.rb:4:5:4:24 | [no-match] when ... | case.rb:2:3:5:5 | case ... | no-match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [match] when ... | match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [no-match] when ... | no-match | -| case.rb:8:1:18:3 | enter case_match | case.rb:9:3:17:5 | case ... | match | -| case.rb:8:1:18:3 | enter case_match | case.rb:11:5:11:15 | in ... then ... | no-match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:11:15:11:15 | 3 | match | -| case.rb:11:5:11:15 | in ... then ... | case.rb:12:5:13:7 | in ... then ... | no-match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:13:7:13:7 | 4 | match | -| case.rb:12:5:13:7 | in ... then ... | case.rb:14:5:14:25 | in ... then ... | no-match | -| case.rb:14:5:14:25 | in ... then ... | case.rb:14:13:14:13 | x | match | -| case.rb:14:13:14:13 | x | case.rb:14:25:14:25 | 6 | true | -| case.rb:14:13:14:13 | x | case.rb:15:5:15:28 | in ... then ... | false | -| case.rb:15:5:15:28 | in ... then ... | case.rb:15:17:15:17 | x | match | -| case.rb:15:17:15:17 | x | case.rb:15:28:15:28 | 7 | false | -| case.rb:15:17:15:17 | x | case.rb:16:10:16:10 | 8 | true | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | exception | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:21:3:23:5 | case ... | match | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | exception | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:27:3:29:5 | case ... | match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:33:3:38:5 | case ... | match | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:35:5:35:11 | in ... then ... | no-match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | false | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | match | -| case.rb:35:5:35:11 | in ... then ... | case.rb:35:9:35:9 | x | true | -| case.rb:35:5:35:11 | in ... then ... | case.rb:36:5:36:13 | in ... then ... | no-match | -| case.rb:35:9:35:9 | x | case.rb:33:3:38:5 | case ... | match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | false | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | match | -| case.rb:36:5:36:13 | in ... then ... | case.rb:36:9:36:9 | x | true | -| case.rb:36:5:36:13 | in ... then ... | case.rb:37:5:37:27 | in ... then ... | no-match | -| case.rb:36:9:36:9 | x | case.rb:33:3:38:5 | case ... | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | false | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | true | -| case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | match | -| case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | match | -| case.rb:37:19:37:19 | c | case.rb:37:25:37:25 | e | match | -| case.rb:37:25:37:25 | e | case.rb:33:3:38:5 | case ... | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | false | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | match | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:43:10:43:10 | x | true | -| case.rb:43:10:43:10 | x | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:43:10:43:10 | x | case.rb:43:16:43:16 | 2 | match | -| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:49:8:49:34 | { ..., ** } | match | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | false | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | true | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:20:49:20 | 1 | case.rb:49:23:49:23 | a | match | -| case.rb:49:20:49:20 | 1 | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:23:49:23 | a | case.rb:49:29:49:32 | rest | match | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:8:50:24 | { ..., ** } | match | -| case.rb:50:5:50:25 | in ... then ... | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | false | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | match | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | true | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:50:16:50:16 | 1 | case.rb:48:3:52:5 | case ... | match | -| case.rb:50:16:50:16 | 1 | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:51:5:51:17 | in ... then ... | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | match | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | false | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | match | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | true | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:56:3:60:5 | case ... | match | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:58:5:58:10 | in ... then ... | no-match | -| case.rb:58:5:58:10 | in ... then ... | case.rb:56:3:60:5 | case ... | match | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:64:3:66:5 | case ... | match | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:65:12:65:12 | _ | no-match | -| case.rb:65:12:65:12 | _ | case.rb:64:3:66:5 | case ... | match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:72:3:92:5 | case ... | match | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:74:5:74:11 | in ... then ... | no-match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:74:5:74:11 | in ... then ... | case.rb:75:5:75:15 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:76:5:76:18 | in ... then ... | no-match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:76:5:76:18 | in ... then ... | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:77:5:77:18 | in ... then ... | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:78:5:78:19 | in ... then ... | case.rb:79:5:79:14 | in ... then ... | no-match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:79:5:79:14 | in ... then ... | case.rb:80:5:80:12 | in ... then ... | no-match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:80:5:80:12 | in ... then ... | case.rb:81:5:81:11 | in ... then ... | no-match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:81:5:81:11 | in ... then ... | case.rb:82:5:82:20 | in ... then ... | no-match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:82:13:82:13 | x | match | -| case.rb:82:5:82:20 | in ... then ... | case.rb:83:5:83:26 | in ... then ... | no-match | -| case.rb:82:13:82:13 | x | case.rb:82:20:82:20 | 1 | match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:5:83:26 | in ... then ... | case.rb:83:12:83:15 | ^... | no-match | -| case.rb:83:12:83:15 | ^... | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:12:83:15 | ^... | case.rb:83:20:83:25 | string | no-match | -| case.rb:83:20:83:25 | string | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:20:83:25 | string | case.rb:84:5:84:17 | in ... then ... | no-match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:84:5:84:17 | in ... then ... | case.rb:85:5:85:23 | in ... then ... | no-match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:85:5:85:23 | in ... then ... | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:86:5:86:11 | in ... then ... | case.rb:87:5:87:17 | in ... then ... | no-match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:87:5:87:17 | in ... then ... | case.rb:88:5:88:15 | in ... then ... | no-match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:88:5:88:15 | in ... then ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:88:14:88:15 | 10 | case.rb:72:3:92:5 | case ... | match | -| case.rb:88:14:88:15 | 10 | case.rb:89:5:89:69 | in ... then ... | no-match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:5:89:69 | in ... then ... | case.rb:89:14:89:17 | self | no-match | -| case.rb:89:14:89:17 | self | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:14:89:17 | self | case.rb:89:21:89:24 | true | no-match | -| case.rb:89:21:89:24 | true | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:21:89:24 | true | case.rb:89:28:89:32 | false | no-match | -| case.rb:89:28:89:32 | false | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:28:89:32 | false | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:90:5:90:13 | in ... then ... | no-match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:90:5:90:13 | in ... then ... | case.rb:91:5:91:25 | in ... then ... | no-match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:5:91:25 | in ... then ... | case.rb:91:13:91:14 | "" | no-match | -| case.rb:91:13:91:14 | "" | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | exception | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | false | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | true | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:97:13:97:13 | x | match | -| case.rb:97:13:97:13 | x | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | exception | -| case.rb:97:13:97:13 | x | case.rb:97:25:97:25 | 6 | true | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:19:19:19:32 | self | true | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:21:19:21:32 | self | false | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:32:9:32:9 | 1 | true | -| cfg.rb:32:9:32:9 | 1 | cfg.rb:35:1:37:3 | if ... | false | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [match] when ... | match | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:42:3:42:24 | [no-match] when ... | no-match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [match] when ... | match | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:3:48:29 | [no-match] when ... | no-match | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:15:42:24 | self | match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:8:43:8 | 2 | no-match | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:21:43:31 | self | match | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:11:43:11 | 3 | no-match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:27:60:31 | hello | true | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:60:37:60:39 | bye | false | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:20:48:29 | self | match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:8:49:8 | b | no-match | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:27:49:37 | self | match | -| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:47:1:50:3 | case ... | no-match | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:3:49:37 | [match] when ... | match | -| cfg.rb:49:8:49:8 | b | cfg.rb:49:16:49:16 | b | no-match | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:3:49:37 | [match] when ... | match | -| cfg.rb:49:16:49:16 | b | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:15:75:15 | 0 | true | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:75:23:75:23 | x | false | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | true | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:90:5:90:5 | [true] ! ... | false | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:35:75:36 | 10 | true | -| cfg.rb:75:23:75:23 | x | cfg.rb:75:43:75:43 | x | false | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:3:91:24 | if ... | false | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:91:17:91:20 | next | true | -| cfg.rb:90:5:90:5 | [false] ! ... | cfg.rb:90:5:90:5 | if ... | false | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | x | true | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:113:1:113:9 | self | true | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:113:1:113:19 | ... if ... | false | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | false | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | no-match | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:24:101:25 | 42 | true | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:28:101:30 | key | match | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:21:172:29 | self | false | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:172:36:172:45 | self | true | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:1:174:9 | self | false | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:1:174:23 | ... unless ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:1:176:41 | until ... | true | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:17:176:17 | x | false | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:1:179:36 | ... until ... | true | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:2:179:13 | self | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:182:1:186:3 | while ... | false | -| cfg.rb:182:7:182:7 | x | cfg.rb:183:3:183:3 | x | true | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:3:184:25 | if ... | false | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:18:184:21 | redo | true | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:1:188:35 | ... while ... | false | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:2:188:13 | self | true | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | true | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:5:22:5:24 | 123 | false | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | true | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | false | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | true | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | false | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:2:3:4:5 | if ... | false | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:3:5:3:10 | self | true | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:9:3:11:5 | if ... | false | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:10:5:10:18 | self | true | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:3:5:3:30 | self | true | -| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:4:9:4:9 | x | false | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:36:1:38:3 | conditional_method_def | false | -| ifs.rb:1:1:58:4 | enter ifs.rb | ifs.rb:36:1:38:17 | ... unless ... | true | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:9:4:24 | [false] ... and ... | false | -| ifs.rb:4:9:4:9 | x | ifs.rb:4:20:4:20 | x | true | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:38 | [false] ... and ... | false | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:32:4:32 | x | true | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:7:5:7:35 | self | false | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:5:5:5:17 | self | true | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:24 | [false] ... and ... | false | -| ifs.rb:4:20:4:20 | x | ifs.rb:4:9:4:24 | [true] ... and ... | true | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:9:4:38 | [false] ... and ... | false | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:30:4:38 | [true] ! ... | false | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:30:4:38 | [false] ! ... | true | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [false] ( ... ) | false | -| ifs.rb:4:32:4:32 | x | ifs.rb:4:31:4:38 | [true] ( ... ) | true | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:12:3:14:5 | if ... | false | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:13:12:13:12 | 0 | true | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:19:3:24:5 | if ... | false | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:20:5:20:5 | x | true | -| ifs.rb:20:5:20:5 | x | ifs.rb:21:5:23:7 | if ... | false | -| ifs.rb:20:5:20:5 | x | ifs.rb:22:7:22:7 | x | true | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:16:29:17 | b2 | true | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:29:21:29:22 | b3 | false | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | false | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:28:29:35 | b2 \|\| b3 | true | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:10:29:23 | [false] ( ... ) | false | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:10:29:23 | [true] ( ... ) | true | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | false | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | true | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | false | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:18:33:19 | b2 | true | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:33:27:33:28 | b3 | false | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | false | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | true | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:6:33:49 | [false] ( ... ) | false | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:6:33:49 | [true] ( ... ) | true | -| ifs.rb:33:13:33:19 | [false] then ... | ifs.rb:33:7:33:48 | [false] if ... | false | -| ifs.rb:33:13:33:19 | [true] then ... | ifs.rb:33:7:33:48 | [true] if ... | true | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [false] then ... | false | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [true] then ... | true | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:7:33:48 | [false] if ... | false | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:7:33:48 | [true] if ... | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:35:33:36 | b4 | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:43:33:44 | b5 | false | -| ifs.rb:33:30:33:36 | [false] then ... | ifs.rb:33:21:33:44 | [false] elsif ... | false | -| ifs.rb:33:30:33:36 | [true] then ... | ifs.rb:33:21:33:44 | [true] elsif ... | true | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [false] then ... | false | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [true] then ... | true | -| ifs.rb:33:38:33:44 | [false] else ... | ifs.rb:33:21:33:44 | [false] elsif ... | false | -| ifs.rb:33:38:33:44 | [true] else ... | ifs.rb:33:21:33:44 | [true] elsif ... | true | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [false] else ... | false | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [true] else ... | true | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:6:41:10 | [false] ! ... | true | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:3:43:5 | if ... | false | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:48:5:48:15 | self | true | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:49:3:49:6 | else ... | false | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:7:55:14 | [true] ... \|\| ... | true | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:55:13:55:14 | b2 | false | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:3:57:5 | if ... | false | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:56:5:56:19 | self | true | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:6:55:15 | [false] ( ... ) | false | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:6:55:15 | [true] ( ... ) | true | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [false] ... \|\| ... | false | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [true] ... \|\| ... | true | -| loops.rb:2:9:2:9 | x | loops.rb:2:3:5:5 | while ... | false | -| loops.rb:2:9:2:9 | x | loops.rb:3:5:3:10 | self | true | -| loops.rb:9:9:9:9 | x | loops.rb:9:3:20:5 | while ... | false | -| loops.rb:9:9:9:9 | x | loops.rb:10:5:10:10 | self | true | -| loops.rb:10:5:10:10 | self | loops.rb:13:7:13:11 | break | true | -| loops.rb:10:5:10:10 | self | loops.rb:14:11:14:11 | x | false | -| loops.rb:14:11:14:11 | x | loops.rb:15:7:15:10 | next | true | -| loops.rb:14:11:14:11 | x | loops.rb:16:11:16:11 | x | false | -| loops.rb:16:11:16:11 | x | loops.rb:16:5:17:10 | elsif ... | false | -| loops.rb:16:11:16:11 | x | loops.rb:17:7:17:10 | redo | true | -| loops.rb:31:9:31:9 | x | loops.rb:31:3:32:5 | while ... | false | -| loops.rb:31:9:31:9 | x | loops.rb:31:15:32:5 | do ... | true | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:8:3:10:5 | if ... | false | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:9:5:9:17 | self | true | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:16:5:18:7 | if ... | false | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:17:7:17:22 | self | true | -| raise.rb:17:7:17:22 | self | raise.rb:14:1:23:3 | exit m2 (abnormal) | exception | -| raise.rb:17:7:17:22 | self | raise.rb:20:5:20:18 | self | match | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:27:5:29:7 | if ... | false | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:28:7:28:22 | self | true | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:38:5:40:7 | if ... | false | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:39:7:39:22 | self | true | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:49:5:51:7 | if ... | false | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:50:7:50:22 | self | true | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:59:5:61:7 | if ... | false | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:60:7:60:22 | self | true | -| raise.rb:60:7:60:22 | self | raise.rb:62:22:62:31 | ExceptionB | no-match | -| raise.rb:60:7:60:22 | self | raise.rb:62:36:62:36 | e | match | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | exception | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:36:62:36 | e | match | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:70:5:70:17 | self | true | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:71:9:71:9 | x | false | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:76:3:76:15 | [ensure: exception] self | exception | -| raise.rb:71:9:71:9 | x | raise.rb:71:3:72:18 | elsif ... | false | -| raise.rb:71:9:71:9 | x | raise.rb:72:13:72:17 | x < 0 | true | -| raise.rb:71:9:71:9 | x | raise.rb:76:3:76:15 | [ensure: exception] self | exception | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:83:7:83:19 | self | true | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:84:11:84:11 | x | false | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:89:5:89:17 | [ensure: exception] self | exception | -| raise.rb:84:11:84:11 | x | raise.rb:84:5:85:20 | elsif ... | false | -| raise.rb:84:11:84:11 | x | raise.rb:85:15:85:19 | x < 0 | true | -| raise.rb:84:11:84:11 | x | raise.rb:89:5:89:17 | [ensure: exception] self | exception | -| raise.rb:97:8:97:8 | x | raise.rb:98:7:98:19 | self | true | -| raise.rb:97:8:97:8 | x | raise.rb:99:11:99:11 | x | false | -| raise.rb:97:8:97:8 | x | raise.rb:104:5:104:23 | [ensure: exception] self | exception | -| raise.rb:99:11:99:11 | x | raise.rb:99:5:100:20 | elsif ... | false | -| raise.rb:99:11:99:11 | x | raise.rb:100:15:100:19 | x < 0 | true | -| raise.rb:99:11:99:11 | x | raise.rb:104:5:104:23 | [ensure: exception] self | exception | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:116:3:118:5 | [ensure: return] if ... | false | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:117:5:117:22 | [ensure: exception] self | true | -| raise.rb:115:3:115:22 | self | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:115:3:115:22 | self | raise.rb:117:5:117:22 | self | true | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | false | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | no-match | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:14:121:30 | self | true | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:125:3:125:51 | self | match | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:130:5:132:7 | if ... | false | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:131:7:131:22 | self | true | -| raise.rb:131:7:131:22 | self | raise.rb:133:3:133:19 | rescue ... | match | -| raise.rb:131:7:131:22 | self | raise.rb:134:10:134:19 | ExceptionB | no-match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | exception | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:143:3:145:5 | if ... | false | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:144:5:144:12 | self | true | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:32 | self | true | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:25:155:48 | ... if ... | false | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:14 | self | false | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:161:7:161:23 | ... unless ... | true | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:174:14:174:15 | b2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | true | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | -| raise.rb:174:14:174:15 | b2 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:174:14:174:15 | b2 | raise.rb:179:10:179:19 | ExceptionA | exception | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | exception | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | match | -joinBlockPredecessor -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | 1 | -| break_ensure.rb:1:1:11:3 | exit m1 | break_ensure.rb:8:3:10:5 | if ... | 0 | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:9:2:9 | x | 0 | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:3:8:3:8 | x | 1 | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:4:7:4:11 | break | 2 | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:1:1:11:3 | enter m1 | 0 | -| break_ensure.rb:2:9:2:9 | x | break_ensure.rb:3:5:5:7 | if ... | 1 | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | 0 | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:9:5:9:23 | [ensure: exception] self | 1 | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:2:3:6:5 | while ... | 0 | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:9:5:9:23 | self | 1 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:9:14:9 | x | 0 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | 1 | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | 2 | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:13:1:25:3 | enter m2 | 0 | -| break_ensure.rb:14:9:14:9 | x | break_ensure.rb:20:7:22:9 | if ... | 1 | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:17:9:17:13 | break | 0 | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:21:9:21:20 | [ensure: break] self | 1 | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | 0 | -| 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: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 | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:36:11:36:15 | [ensure: exception] break | 1 | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | 0 | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:36:11:36:15 | [ensure: return] break | 1 | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:11:33:11 | y | 0 | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:36:11:36:15 | break | 1 | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:27:1:42:3 | enter m3 | 0 | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | 1 | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:30:7:30:12 | return | 0 | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | 1 | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:29:5:31:7 | if ... | 0 | -| break_ensure.rb:33:11:33:11 | y | break_ensure.rb:35:9:37:11 | if ... | 1 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:9:45:9 | x | 0 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | 1 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | 10 | 2 | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | 3 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:44:1:56:3 | enter m4 | 0 | -| break_ensure.rb:45:9:45:9 | x | break_ensure.rb:51:7:53:9 | if ... | 1 | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:47:10:47:10 | x | 0 | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:48:9:48:16 | self | 1 | -| case.rb:2:3:5:5 | case ... | case.rb:3:18:3:41 | if ... | 0 | -| case.rb:2:3:5:5 | case ... | case.rb:4:5:4:24 | [no-match] when ... | 1 | -| case.rb:2:3:5:5 | case ... | case.rb:4:17:4:24 | self | 2 | -| case.rb:3:18:3:41 | if ... | case.rb:3:21:3:22 | self | 0 | -| case.rb:3:18:3:41 | if ... | case.rb:3:29:3:37 | self | 1 | -| case.rb:9:3:17:5 | case ... | case.rb:8:1:18:3 | enter case_match | 0 | -| case.rb:9:3:17:5 | case ... | case.rb:11:15:11:15 | 3 | 1 | -| case.rb:9:3:17:5 | case ... | case.rb:13:7:13:7 | 4 | 2 | -| 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: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: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: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 | -| case.rb:48:3:52:5 | case ... | case.rb:50:16:50:16 | 1 | 1 | -| case.rb:48:3:52:5 | case ... | case.rb:51:8:51:16 | { ..., ** } | 2 | -| case.rb:50:5:50:25 | in ... then ... | case.rb:47:1:53:3 | enter case_match_hash | 0 | -| case.rb:50:5:50:25 | in ... then ... | case.rb:49:8:49:34 | { ..., ** } | 1 | -| case.rb:50:5:50:25 | in ... then ... | case.rb:49:20:49:20 | 1 | 2 | -| case.rb:51:5:51:17 | in ... then ... | case.rb:50:5:50:25 | in ... then ... | 0 | -| case.rb:51:5:51:17 | in ... then ... | case.rb:50:8:50:24 | { ..., ** } | 1 | -| case.rb:51:5:51:17 | in ... then ... | case.rb:50:16:50:16 | 1 | 2 | -| case.rb:56:3:60:5 | case ... | case.rb:55:1:61:3 | enter case_match_variable | 0 | -| 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: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 | -| case.rb:72:3:92:5 | case ... | case.rb:76:5:76:18 | in ... then ... | 3 | -| case.rb:72:3:92:5 | case ... | case.rb:77:5:77:18 | in ... then ... | 4 | -| case.rb:72:3:92:5 | case ... | case.rb:78:5:78:19 | in ... then ... | 5 | -| case.rb:72:3:92:5 | case ... | case.rb:79:5:79:14 | in ... then ... | 6 | -| case.rb:72:3:92:5 | case ... | case.rb:80:5:80:12 | in ... then ... | 7 | -| case.rb:72:3:92:5 | case ... | case.rb:81:5:81:11 | in ... then ... | 8 | -| case.rb:72:3:92:5 | case ... | case.rb:82:20:82:20 | 1 | 9 | -| case.rb:72:3:92:5 | case ... | case.rb:83:5:83:26 | in ... then ... | 10 | -| case.rb:72:3:92:5 | case ... | case.rb:83:12:83:15 | ^... | 11 | -| case.rb:72:3:92:5 | case ... | case.rb:83:20:83:25 | string | 12 | -| case.rb:72:3:92:5 | case ... | case.rb:84:5:84:17 | in ... then ... | 13 | -| case.rb:72:3:92:5 | case ... | case.rb:85:5:85:23 | in ... then ... | 14 | -| case.rb:72:3:92:5 | case ... | case.rb:86:5:86:11 | in ... then ... | 15 | -| case.rb:72:3:92:5 | case ... | case.rb:87:5:87:17 | in ... then ... | 16 | -| case.rb:72:3:92:5 | case ... | case.rb:88:5:88:15 | in ... then ... | 17 | -| case.rb:72:3:92:5 | case ... | case.rb:88:14:88:15 | 10 | 18 | -| case.rb:72:3:92:5 | case ... | case.rb:89:5:89:69 | in ... then ... | 19 | -| case.rb:72:3:92:5 | case ... | case.rb:89:14:89:17 | self | 20 | -| case.rb:72:3:92:5 | case ... | case.rb:89:21:89:24 | true | 21 | -| case.rb:72:3:92:5 | case ... | case.rb:89:28:89:32 | false | 22 | -| case.rb:72:3:92:5 | case ... | case.rb:89:36:89:43 | __LINE__ | 23 | -| case.rb:72:3:92:5 | case ... | case.rb:89:47:89:54 | __FILE__ | 24 | -| case.rb:72:3:92:5 | case ... | case.rb:89:58:89:69 | __ENCODING__ | 25 | -| case.rb:72:3:92:5 | case ... | case.rb:90:5:90:13 | in ... then ... | 26 | -| case.rb:72:3:92:5 | case ... | case.rb:91:5:91:25 | in ... then ... | 27 | -| 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: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 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:43:21:43:31 | self | 1 | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:44:8:44:18 | self | 2 | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:8:43:8 | 2 | 0 | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:11:43:11 | 3 | 1 | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:14:43:14 | 4 | 2 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:48:20:48:29 | self | 0 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:3:49:37 | [no-match] when ... | 1 | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:49:27:49:37 | self | 2 | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:8:49:8 | b | 0 | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:16:49:16 | b | 1 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:27:60:31 | hello | 0 | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:37:60:39 | bye | 1 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:15:75:15 | 0 | 0 | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:17:75:43 | elsif ... | 1 | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:35:75:36 | 10 | 0 | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:43:75:43 | x | 1 | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:91:3:91:24 | if ... | 0 | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:91:17:91:20 | next | 1 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | [false] ! ... | 1 | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | x | 0 | -| cfg.rb:101:28:101:30 | key | cfg.rb:101:1:104:3 | enter parameters | 0 | -| cfg.rb:101:28:101:30 | key | cfg.rb:101:24:101:25 | 42 | 1 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:90:5:90:5 | if ... | 0 | -| cfg.rb:113:1:113:19 | ... if ... | cfg.rb:113:1:113:9 | self | 1 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:113:1:113:19 | ... if ... | 0 | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:136:12:136:29 | self | 1 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:21:172:29 | self | 0 | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:36:172:45 | self | 1 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:172:1:172:49 | unless ... | 0 | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:174:1:174:9 | self | 1 | -| cfg.rb:176:7:176:7 | x | cfg.rb:174:1:174:23 | ... unless ... | 0 | -| cfg.rb:176:7:176:7 | x | cfg.rb:176:17:176:17 | x | 1 | -| cfg.rb:179:30:179:30 | i | cfg.rb:176:1:176:41 | until ... | 0 | -| cfg.rb:179:30:179:30 | i | cfg.rb:179:2:179:13 | self | 1 | -| cfg.rb:182:7:182:7 | x | cfg.rb:179:1:179:36 | ... until ... | 0 | -| cfg.rb:182:7:182:7 | x | cfg.rb:184:3:184:25 | if ... | 1 | -| cfg.rb:183:3:183:3 | x | cfg.rb:182:7:182:7 | x | 0 | -| cfg.rb:183:3:183:3 | x | cfg.rb:184:18:184:21 | redo | 1 | -| cfg.rb:188:30:188:30 | i | cfg.rb:182:1:186:3 | while ... | 0 | -| cfg.rb:188:30:188:30 | i | cfg.rb:188:2:188:13 | self | 1 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:1:205:3 | __synth__0__1 | 0 | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:1:205:3 | nil | 0 | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | 0 | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:22:5:24 | 123 | 1 | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | 0 | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:18:14:20 | 123 | 1 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | 0 | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:21:19:23 | 123 | 1 | -| exit.rb:1:1:6:3 | exit m1 | exit.rb:2:3:4:5 | if ... | 0 | -| exit.rb:1:1:6:3 | exit m1 | exit.rb:3:5:3:10 | self | 1 | -| exit.rb:8:1:13:3 | exit m2 | exit.rb:9:3:11:5 | if ... | 0 | -| exit.rb:8:1:13:3 | exit m2 | exit.rb:10:5:10:18 | self | 1 | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:3:5:3:30 | self | 0 | -| ifs.rb:2:3:8:5 | if ... | ifs.rb:4:3:7:35 | elsif ... | 1 | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:5:5:5:17 | self | 0 | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:7:5:7:35 | self | 1 | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:9 | x | 0 | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:20:4:20 | x | 1 | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:9:4:24 | [false] ... and ... | 0 | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:4:30:4:38 | [false] ! ... | 1 | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:12:3:14:5 | if ... | 0 | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:13:12:13:12 | 0 | 1 | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:18:1:26:3 | enter m3 | 0 | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:21:5:23:7 | if ... | 1 | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:20:5:20:5 | x | 0 | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:22:7:22:7 | x | 1 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:28:29:35 | b2 \|\| b3 | 0 | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | 1 | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:16:29:17 | b2 | 0 | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:21:29:22 | b3 | 1 | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:16:29:17 | b2 | 0 | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:21:29:22 | b3 | 1 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | 0 | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | 1 | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:13:33:19 | [false] then ... | 0 | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:21:33:44 | [false] elsif ... | 1 | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:13:33:19 | [true] then ... | 0 | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:21:33:44 | [true] elsif ... | 1 | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:30:33:36 | [false] then ... | 0 | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:38:33:44 | [false] else ... | 1 | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:30:33:36 | [true] then ... | 0 | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:38:33:44 | [true] else ... | 1 | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:1:1:58:4 | enter ifs.rb | 0 | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:36:1:38:3 | conditional_method_def | 1 | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:48:5:48:15 | self | 0 | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:49:3:49:6 | else ... | 1 | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:6:55:15 | [false] ( ... ) | 0 | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:56:5:56:19 | self | 1 | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:54:1:58:3 | enter disjunct | 0 | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:13:55:14 | b2 | 1 | -| loops.rb:2:9:2:9 | x | loops.rb:1:1:6:3 | enter m1 | 0 | -| loops.rb:2:9:2:9 | x | loops.rb:3:5:3:10 | self | 1 | -| loops.rb:9:3:20:5 | while ... | loops.rb:9:9:9:9 | x | 0 | -| loops.rb:9:3:20:5 | while ... | loops.rb:13:7:13:11 | break | 1 | -| loops.rb:9:9:9:9 | x | loops.rb:8:1:22:3 | enter m2 | 0 | -| loops.rb:9:9:9:9 | x | loops.rb:15:7:15:10 | next | 1 | -| loops.rb:9:9:9:9 | x | loops.rb:16:5:17:10 | elsif ... | 2 | -| loops.rb:10:5:10:10 | self | loops.rb:9:9:9:9 | x | 0 | -| loops.rb:10:5:10:10 | self | loops.rb:17:7:17:10 | redo | 1 | -| loops.rb:31:9:31:9 | x | loops.rb:30:1:33:3 | enter m4 | 0 | -| 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: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 | -| raise.rb:33:3:33:15 | self | raise.rb:28:7:28:22 | self | 1 | -| raise.rb:44:3:44:15 | self | raise.rb:38:5:40:7 | if ... | 0 | -| 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: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: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: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 | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:117:5:117:22 | self | 1 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | [ensure: return] if ... | 1 | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:116:3:118:5 | if ... | 0 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:97:8:97:8 | x | 0 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:98:7:98:19 | self | 1 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:99:5:100:20 | elsif ... | 2 | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:99:11:99:11 | x | 3 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:94:1:119:3 | enter m9 | 0 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:100:15:100:19 | x < 0 | 1 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:104:5:104:23 | [ensure: exception] self | 3 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:104:5:104:23 | self | 2 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: exception] if ... | 5 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | [ensure: return] if ... | 6 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:106:7:108:9 | if ... | 4 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: exception] self | 8 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | [ensure: return] self | 9 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:107:9:107:26 | self | 7 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | 11 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | 13 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | 12 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | 14 | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:109:5:110:25 | ensure ... | 10 | -| raise.rb:121:1:126:3 | exit m10 | raise.rb:121:14:121:30 | self | 0 | -| raise.rb:121:1:126:3 | exit m10 | raise.rb:125:3:125:51 | self | 1 | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:137:5:137:17 | [ensure: exception] self | 1 | -| raise.rb:128:1:140:3 | exit m11 | raise.rb:137:5:137:17 | self | 0 | -| raise.rb:137:5:137:17 | self | raise.rb:130:5:132:7 | if ... | 0 | -| raise.rb:137:5:137:17 | self | raise.rb:133:3:133:19 | rescue ... | 1 | -| raise.rb:137:5:137:17 | self | raise.rb:135:5:135:21 | self | 2 | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:143:3:145:5 | if ... | 0 | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:144:5:144:12 | self | 1 | -| raise.rb:155:16:155:50 | exit { ... } | raise.rb:155:25:155:32 | self | 1 | -| 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 | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:172:1:182:3 | enter m16 | 0 | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:174:14:174:15 | b2 | 1 | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:174:8:174:23 | [false] ... \|\| ... | 0 | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:174:8:174:23 | [true] ... \|\| ... | 1 | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:174:14:174:15 | b2 | 2 | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | false | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | true | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [false] | false | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:3:8:3:12 | After ... > ... [true] | true | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [false] | false | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:6:8:18 | After call to nil? [true] | true | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [false] | false | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | true | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [false] | false | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:16:10:16:14 | After ... > ... [true] | true | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [false] | false | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:10:20:15 | After call to nil? [true] | true | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [false] | false | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:29:8:29:13 | After call to nil? [true] | true | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | false | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | true | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [false] | false | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:35:12:35:16 | After ... > ... [true] | true | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [false] | false | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | true | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [false] | false | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:47:10:47:14 | After ... > ... [true] | true | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | false | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | true | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [match] | match | +| case.rb:1:1:6:3 | Entry | case.rb:3:10:3:10 | After 1 [no-match] | no-match | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [false] | false | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:21:3:22 | After call to x2 [true] | true | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [match] | match | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:4:10:4:10 | After 2 [no-match] | no-match | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [match] | match | +| case.rb:8:1:18:3 | Entry | case.rb:10:8:10:8 | After 0 [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [match] | match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:11:8:11:8 | After 1 [no-match] | no-match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [match] | match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:12:8:12:8 | After 2 [no-match] | no-match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [match] | match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:14:8:14:8 | After x [no-match] | no-match | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [false] | false | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:13:14:18 | After ... == ... [true] | true | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [match] | match | +| case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | After x [no-match] | no-match | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [false] | false | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:17:15:21 | After ... < ... [true] | true | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [match] | match | +| case.rb:20:1:24:3 | Entry | case.rb:22:8:22:8 | After 1 [no-match] | no-match | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [match] | match | +| case.rb:26:1:30:3 | Entry | case.rb:28:7:28:28 | After -> { ... } [no-match] | no-match | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [match] | match | +| case.rb:32:1:39:3 | Entry | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [match] | match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | no-match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [match] | match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | no-match | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [match] | match | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [match] | match | +| case.rb:41:1:45:3 | Entry | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [match] | match | +| case.rb:47:1:53:3 | Entry | case.rb:49:8:49:34 | After { ..., ** } [no-match] | no-match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [match] | match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:50:8:50:24 | After { ..., ** } [no-match] | no-match | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [match] | match | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:51:8:51:16 | After { ..., ** } [no-match] | no-match | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [match] | match | +| case.rb:55:1:61:3 | Entry | case.rb:57:8:57:8 | After 5 [no-match] | no-match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [match] | match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:58:8:58:10 | After var [no-match] | no-match | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [match] | match | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:59:8:59:20 | After "unreachable" [no-match] | no-match | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [match] | match | +| case.rb:63:1:67:3 | Entry | case.rb:65:8:65:28 | After ... \| ... [no-match] | no-match | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [match] | match | +| case.rb:69:1:93:3 | Entry | case.rb:73:8:73:8 | After 5 [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [match] | match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:74:8:74:11 | After ^... [no-match] | no-match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [match] | match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:75:8:75:15 | After "string" [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [match] | match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [match] | match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [match] | match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [match] | match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [match] | match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [match] | match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [match] | match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [match] | match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [match] | match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [match] | match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [match] | match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [match] | match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [match] | match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [match] | match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [match] | match | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [match] | match | +| case.rb:95:1:99:3 | Entry | case.rb:97:8:97:8 | After x [no-match] | no-match | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [false] | false | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:13:97:18 | After ... == ... [true] | true | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [false] | false | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:18:17:18:22 | After call to admin? [true] | true | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [match] | match | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:42:8:42:8 | After 1 [no-match] | no-match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [match] | match | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [match] | match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:43:8:43:8 | After 2 [no-match] | no-match | +| cfg.rb:43:8:43:8 | After 2 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [match] | match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | After 3 [no-match] | no-match | +| cfg.rb:43:11:43:11 | After 3 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [match] | match | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:43:14:43:14 | After 4 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [false] | false | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:60:17:60:22 | After ... < ... [true] | true | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [match] | match | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:49:8:49:13 | After ... == ... [no-match] | no-match | +| cfg.rb:49:8:49:13 | After ... == ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | match | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [match] | match | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | After ... > ... [no-match] | no-match | +| cfg.rb:49:16:49:20 | After ... > ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | match | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [false] | false | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:75:4:75:8 | After ... < ... [true] | true | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [false] | false | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:23:75:28 | After ... > ... [true] | true | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [false] | false | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:90:5:90:5 | After defined? ... [true] | true | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [false] | false | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:91:6:91:10 | After ... > ... [true] | true | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [false] | false | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:113:14:113:19 | After ... > ... [true] | true | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [match] | match | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | After value [no-match] | no-match | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [false] | false | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:172:8:172:14 | After ... == ... [true] | true | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [false] | false | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:18:174:23 | After ... == ... [true] | true | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [false] | false | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | After ... > ... [true] | true | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [false] | false | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | After ... == ... [true] | true | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [false] | false | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | After ... < ... [true] | true | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [false] | false | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [false] | false | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | After ... != ... [true] | true | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [false] | false | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:205:4:205:5 | After call to == [true] | true | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | false | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | true | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | false | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | true | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | false | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | true | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [false] | false | +| exit.rb:1:1:6:3 | Entry | exit.rb:2:6:2:10 | After ... > ... [true] | true | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [false] | false | +| exit.rb:8:1:13:3 | Entry | exit.rb:9:6:9:10 | After ... > ... [true] | true | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [false] | false | +| ifs.rb:1:1:9:3 | Entry | ifs.rb:2:6:2:10 | After ... > ... [true] | true | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [false] | false | +| ifs.rb:1:1:58:4 | Entry | ifs.rb:38:12:38:17 | After ... == ... [true] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [false] | false | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:9:4:14 | After ... <= ... [true] | true | +| ifs.rb:4:9:4:14 | After ... <= ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | false | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [false] | false | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | After ... > ... [true] | true | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | false | +| ifs.rb:4:20:4:24 | After ... > ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | false | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [false] | false | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:32:4:37 | After ... == ... [true] | true | +| ifs.rb:4:32:4:37 | After ... == ... [true] | ifs.rb:4:9:4:38 | After ... and ... [false] | false | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [false] | false | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:12:6:12:6 | After b [true] | true | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [false] | false | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:19:6:19:10 | After ... < ... [true] | true | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [false] | false | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:21:8:21:13 | After ... > ... [true] | true | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [false] | false | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:29:11:29:12 | After b1 [true] | true | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [false] | false | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | After b3 [true] | true | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [false] | false | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | After b2 [true] | true | +| ifs.rb:29:16:29:17 | After b2 [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | false | +| ifs.rb:29:16:29:17 | After b2 [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | true | +| ifs.rb:29:21:29:22 | After b3 [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | false | +| ifs.rb:29:21:29:22 | After b3 [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | true | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [false] | false | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:33:10:33:11 | After b1 [true] | true | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [false] | false | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:27:33:28 | After b3 [true] | true | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [false] | false | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:18:33:19 | After b2 [true] | true | +| ifs.rb:33:18:33:19 | After b2 [false] | ifs.rb:33:7:33:48 | After if ... [false] | false | +| ifs.rb:33:18:33:19 | After b2 [true] | ifs.rb:33:7:33:48 | After if ... [true] | true | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:7:33:48 | After if ... [false] | false | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:7:33:48 | After if ... [true] | true | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [false] | false | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:43:33:44 | After b5 [true] | true | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [false] | false | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:35:33:36 | After b4 [true] | true | +| ifs.rb:33:35:33:36 | After b4 [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | false | +| ifs.rb:33:35:33:36 | After b4 [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | true | +| ifs.rb:33:43:33:44 | After b5 [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | false | +| ifs.rb:33:43:33:44 | After b5 [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | true | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [false] | false | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:47:6:47:6 | After b [true] | true | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [false] | false | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:55:7:55:8 | After b1 [true] | true | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [false] | false | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | After b2 [true] | true | +| ifs.rb:55:7:55:8 | After b1 [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | true | +| ifs.rb:55:13:55:14 | After b2 [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | true | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [false] | false | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | After ... >= ... [true] | true | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [false] | false | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | After ... >= ... [true] | true | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [false] | false | +| loops.rb:9:15:20:5 | do ... | loops.rb:12:8:12:14 | After ... > ... [true] | true | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [false] | false | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:11:14:16 | After ... > ... [true] | true | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [false] | false | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:11:16:16 | After ... > ... [true] | true | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [false] | false | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | After ... < ... [true] | true | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [false] | false | +| raise.rb:7:1:12:3 | Entry | raise.rb:8:6:8:10 | After ... > ... [true] | true | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [false] | false | +| raise.rb:14:1:23:3 | Entry | raise.rb:16:8:16:8 | After b [true] | true | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [match] | match | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:19:10:19:19 | After ExceptionA [no-match] | no-match | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [false] | false | +| raise.rb:25:1:34:3 | Entry | raise.rb:27:8:27:8 | After b [true] | true | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [false] | false | +| raise.rb:36:1:45:3 | Entry | raise.rb:38:8:38:8 | After b [true] | true | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [false] | false | +| raise.rb:47:1:55:3 | Entry | raise.rb:49:8:49:8 | After b [true] | true | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [false] | false | +| raise.rb:57:1:66:3 | Entry | raise.rb:59:8:59:8 | After b [true] | true | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [match] | match | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:62:10:62:31 | After ..., ... [no-match] | no-match | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [false] | false | +| raise.rb:68:1:77:3 | Entry | raise.rb:69:6:69:10 | After ... > ... [true] | true | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [false] | false | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:9:71:13 | After ... < ... [true] | true | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [false] | false | +| raise.rb:79:1:92:3 | Entry | raise.rb:82:8:82:12 | After ... > ... [true] | true | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [false] | false | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:11:84:15 | After ... < ... [true] | true | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [false] | false | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:97:8:97:12 | After ... > ... [true] | true | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [false] | false | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:11:99:15 | After ... < ... [true] | true | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [false] | false | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:106:10:106:11 | After b1 [true] | true | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [false] | false | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:116:6:116:7 | After b2 [true] | true | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [match] | match | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | After p [no-match] | no-match | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [false] | false | +| raise.rb:128:1:140:3 | Entry | raise.rb:130:8:130:8 | After b [true] | true | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [match] | match | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:133:10:133:19 | After ExceptionA [no-match] | no-match | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [match] | match | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:134:10:134:19 | After ExceptionB [no-match] | no-match | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [false] | false | +| raise.rb:142:1:148:3 | Entry | raise.rb:143:6:143:6 | After b [true] | true | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [false] | false | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:37:155:48 | After call to nil? [true] | true | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [false] | false | +| raise.rb:160:9:162:7 | Entry | raise.rb:161:23:161:23 | After x [true] | true | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [false] | false | +| raise.rb:172:1:182:3 | Entry | raise.rb:174:8:174:9 | After b1 [true] | true | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [false] | false | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | After ... == ... [true] | true | +| raise.rb:174:8:174:9 | After b1 [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | true | +| raise.rb:174:14:174:23 | After ... == ... [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | true | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [match] | match | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | After ExceptionA [no-match] | no-match | diff --git a/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected b/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected index e7ce708b63bf..a4fb2ef860f6 100644 --- a/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ruby/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -1,2392 +1,4018 @@ -| break_ensure.rb:1:1:11:3 | enter m1 | break_ensure.rb:1:8:1:8 | x | | -| break_ensure.rb:1:1:11:3 | exit m1 (abnormal) | break_ensure.rb:1:1:11:3 | exit m1 | | -| break_ensure.rb:1:1:11:3 | exit m1 (normal) | break_ensure.rb:1:1:11:3 | exit m1 | | +| break_ensure.rb:1:1:11:3 | Entry | break_ensure.rb:1:8:1:8 | x | | +| break_ensure.rb:1:1:11:3 | Exceptional Exit | break_ensure.rb:1:1:11:3 | Exit | | +| break_ensure.rb:1:1:11:3 | Normal Exit | break_ensure.rb:1:1:11:3 | Exit | | | break_ensure.rb:1:1:11:3 | m1 | break_ensure.rb:13:1:25:3 | m2 | | -| break_ensure.rb:1:1:56:4 | enter break_ensure.rb | break_ensure.rb:1:1:11:3 | m1 | | -| break_ensure.rb:1:1:56:4 | exit break_ensure.rb (normal) | break_ensure.rb:1:1:56:4 | exit break_ensure.rb | | -| break_ensure.rb:1:8:1:8 | x | break_ensure.rb:2:9:2:9 | x | | -| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:8:6:8:13 | self | | +| break_ensure.rb:1:1:56:4 | Entry | break_ensure.rb:1:1:11:3 | m1 | | +| break_ensure.rb:1:1:56:4 | Normal Exit | break_ensure.rb:1:1:56:4 | Exit | | +| break_ensure.rb:1:8:1:8 | x | break_ensure.rb:2:3:10:5 | ... | | +| break_ensure.rb:2:3:6:5 | After while ... | break_ensure.rb:7:1:10:5 | ensure ... | | +| break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | break_ensure.rb:2:9:2:13 | Before ... < ... | | +| break_ensure.rb:2:3:6:5 | while ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | | +| break_ensure.rb:2:3:10:5 | ... | break_ensure.rb:2:3:6:5 | while ... | | +| break_ensure.rb:2:3:10:5 | After ... | break_ensure.rb:1:1:11:3 | Normal Exit | | | break_ensure.rb:2:9:2:9 | x | break_ensure.rb:2:13:2:13 | 0 | | -| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:3:6:5 | while ... | false | -| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:3:8:3:8 | x | true | -| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:8:6:8:13 | [ensure: exception] self | exception | +| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:9:2:13 | After ... < ... [false] | false | +| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:2:9:2:13 | After ... < ... [true] | true | +| break_ensure.rb:2:9:2:13 | ... < ... | break_ensure.rb:7:1:10:5 | ensure ... | exception | +| break_ensure.rb:2:9:2:13 | After ... < ... [false] | break_ensure.rb:2:3:6:5 | After while ... | | +| break_ensure.rb:2:9:2:13 | After ... < ... [true] | break_ensure.rb:2:14:6:5 | do ... | | +| break_ensure.rb:2:9:2:13 | Before ... < ... | break_ensure.rb:2:9:2:9 | x | | | break_ensure.rb:2:13:2:13 | 0 | break_ensure.rb:2:9:2:13 | ... < ... | | -| break_ensure.rb:2:14:6:5 | do ... | break_ensure.rb:2:9:2:9 | x | | -| break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:2:14:6:5 | do ... | | +| break_ensure.rb:2:14:6:5 | After do ... | break_ensure.rb:2:3:6:5 | [LoopHeader] while ... | | +| break_ensure.rb:2:14:6:5 | do ... | break_ensure.rb:3:5:5:7 | if ... | | +| break_ensure.rb:3:5:5:7 | After if ... | break_ensure.rb:2:14:6:5 | After do ... | | +| break_ensure.rb:3:5:5:7 | if ... | break_ensure.rb:3:8:3:12 | Before ... > ... | | | break_ensure.rb:3:8:3:8 | x | break_ensure.rb:3:12:3:12 | 0 | | -| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:2:3:6:5 | while ... | exception | -| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:5:5:7 | if ... | false | -| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:4:7:4:11 | break | true | +| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:8:3:12 | After ... > ... [false] | false | +| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:3:8:3:12 | After ... > ... [true] | true | +| break_ensure.rb:3:8:3:12 | ... > ... | break_ensure.rb:7:1:10:5 | ensure ... | exception | +| break_ensure.rb:3:8:3:12 | After ... > ... [false] | break_ensure.rb:3:5:5:7 | After if ... | | +| break_ensure.rb:3:8:3:12 | After ... > ... [true] | break_ensure.rb:3:14:4:11 | then ... | | +| break_ensure.rb:3:8:3:12 | Before ... > ... | break_ensure.rb:3:8:3:8 | x | | | break_ensure.rb:3:12:3:12 | 0 | break_ensure.rb:3:8:3:12 | ... > ... | | -| break_ensure.rb:4:7:4:11 | break | break_ensure.rb:2:3:6:5 | while ... | break | -| break_ensure.rb:7:1:10:5 | [ensure: exception] ensure ... | break_ensure.rb:1:1:11:3 | exit m1 (abnormal) | exception | -| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:1:1:11:3 | exit m1 (normal) | | -| break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | break_ensure.rb:7:1:10:5 | [ensure: exception] ensure ... | | -| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:7:1:10:5 | ensure ... | | -| break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | | -| break_ensure.rb:8:6:8:13 | [ensure: exception] self | break_ensure.rb:8:6:8:13 | [ensure: exception] call to elements | | -| break_ensure.rb:8:6:8:13 | call to elements | break_ensure.rb:8:6:8:18 | call to nil? | | +| break_ensure.rb:3:14:4:11 | then ... | break_ensure.rb:4:7:4:11 | Before break | | +| break_ensure.rb:4:7:4:11 | Before break | break_ensure.rb:4:7:4:11 | break | | +| break_ensure.rb:4:7:4:11 | break | break_ensure.rb:2:3:6:5 | After while ... | break | +| break_ensure.rb:7:1:10:5 | After ensure ... | break_ensure.rb:1:1:11:3 | Exceptional Exit | exception | +| break_ensure.rb:7:1:10:5 | After ensure ... | break_ensure.rb:2:3:10:5 | After ... | | +| break_ensure.rb:7:1:10:5 | ensure ... | break_ensure.rb:8:3:10:5 | if ... | | +| break_ensure.rb:8:3:10:5 | After if ... | break_ensure.rb:7:1:10:5 | After ensure ... | | +| break_ensure.rb:8:3:10:5 | if ... | break_ensure.rb:8:6:8:18 | Before call to nil? | | +| break_ensure.rb:8:6:8:13 | After call to elements | break_ensure.rb:8:6:8:18 | call to nil? | | +| break_ensure.rb:8:6:8:13 | Before call to elements | break_ensure.rb:8:6:8:13 | self | | +| break_ensure.rb:8:6:8:13 | call to elements | break_ensure.rb:8:6:8:13 | After call to elements | | | break_ensure.rb:8:6:8:13 | self | break_ensure.rb:8:6:8:13 | call to elements | | -| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | false | -| break_ensure.rb:8:6:8:18 | [ensure: exception] call to nil? | break_ensure.rb:9:5:9:23 | [ensure: exception] self | true | -| break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:8:3:10:5 | if ... | false | -| break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:9:5:9:23 | self | true | -| break_ensure.rb:8:20:9:23 | [ensure: exception] then ... | break_ensure.rb:8:3:10:5 | [ensure: exception] if ... | | -| break_ensure.rb:8:20:9:23 | then ... | break_ensure.rb:8:3:10:5 | if ... | | -| break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | break_ensure.rb:8:20:9:23 | [ensure: exception] then ... | | -| break_ensure.rb:9:5:9:23 | [ensure: exception] self | break_ensure.rb:9:11:9:22 | [ensure: exception] elements nil | | -| break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:8:20:9:23 | then ... | | -| break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:11:9:22 | elements nil | | -| break_ensure.rb:9:10:9:23 | "elements nil" | break_ensure.rb:9:5:9:23 | call to puts | | -| break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | break_ensure.rb:9:5:9:23 | [ensure: exception] call to puts | | -| break_ensure.rb:9:11:9:22 | [ensure: exception] elements nil | break_ensure.rb:9:10:9:23 | [ensure: exception] "elements nil" | | +| break_ensure.rb:8:6:8:18 | After call to nil? [false] | break_ensure.rb:8:3:10:5 | After if ... | | +| break_ensure.rb:8:6:8:18 | After call to nil? [true] | break_ensure.rb:8:20:9:23 | then ... | | +| break_ensure.rb:8:6:8:18 | Before call to nil? | break_ensure.rb:8:6:8:13 | Before call to elements | | +| break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:8:6:8:18 | After call to nil? [false] | false | +| break_ensure.rb:8:6:8:18 | call to nil? | break_ensure.rb:8:6:8:18 | After call to nil? [true] | true | +| break_ensure.rb:8:20:9:23 | After then ... | break_ensure.rb:8:3:10:5 | After if ... | | +| break_ensure.rb:8:20:9:23 | then ... | break_ensure.rb:9:5:9:23 | Before call to puts | | +| break_ensure.rb:9:5:9:23 | After call to puts | break_ensure.rb:8:20:9:23 | After then ... | | +| break_ensure.rb:9:5:9:23 | Before call to puts | break_ensure.rb:9:5:9:23 | self | | +| break_ensure.rb:9:5:9:23 | call to puts | break_ensure.rb:9:5:9:23 | After call to puts | | +| break_ensure.rb:9:5:9:23 | self | break_ensure.rb:9:10:9:23 | Before "elements nil" | | +| break_ensure.rb:9:10:9:23 | "elements nil" | break_ensure.rb:9:10:9:23 | After "elements nil" | | +| break_ensure.rb:9:10:9:23 | After "elements nil" | break_ensure.rb:9:5:9:23 | call to puts | | +| break_ensure.rb:9:10:9:23 | Before "elements nil" | break_ensure.rb:9:11:9:22 | elements nil | | | break_ensure.rb:9:11:9:22 | elements nil | break_ensure.rb:9:10:9:23 | "elements nil" | | -| break_ensure.rb:13:1:25:3 | enter m2 | break_ensure.rb:13:8:13:8 | x | | -| break_ensure.rb:13:1:25:3 | exit m2 (normal) | break_ensure.rb:13:1:25:3 | exit m2 | | +| break_ensure.rb:13:1:25:3 | Entry | break_ensure.rb:13:8:13:8 | x | | +| break_ensure.rb:13:1:25:3 | Exceptional Exit | break_ensure.rb:13:1:25:3 | Exit | | +| break_ensure.rb:13:1:25:3 | Normal Exit | break_ensure.rb:13:1:25:3 | Exit | | | break_ensure.rb:13:1:25:3 | m2 | break_ensure.rb:27:1:42:3 | m3 | | | break_ensure.rb:13:8:13:8 | x | break_ensure.rb:13:11:13:11 | y | | -| break_ensure.rb:13:11:13:11 | y | break_ensure.rb:14:9:14:9 | x | | -| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:13:1:25:3 | exit m2 (normal) | | +| break_ensure.rb:13:11:13:11 | y | break_ensure.rb:14:3:24:5 | ... | | +| break_ensure.rb:14:3:24:5 | ... | break_ensure.rb:14:3:24:5 | while ... | | +| break_ensure.rb:14:3:24:5 | After ... | break_ensure.rb:13:1:25:3 | Normal Exit | | +| break_ensure.rb:14:3:24:5 | After while ... | break_ensure.rb:14:3:24:5 | After ... | | +| break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | break_ensure.rb:14:9:14:13 | Before ... < ... | | +| break_ensure.rb:14:3:24:5 | while ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | | | break_ensure.rb:14:9:14:9 | x | break_ensure.rb:14:13:14:13 | 0 | | -| break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:3:24:5 | while ... | false | -| break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:16:10:16:10 | x | true | +| break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:9:14:13 | After ... < ... [false] | false | +| break_ensure.rb:14:9:14:13 | ... < ... | break_ensure.rb:14:9:14:13 | After ... < ... [true] | true | +| break_ensure.rb:14:9:14:13 | After ... < ... [false] | break_ensure.rb:14:3:24:5 | After while ... | | +| break_ensure.rb:14:9:14:13 | After ... < ... [true] | break_ensure.rb:14:14:24:5 | do ... | | +| break_ensure.rb:14:9:14:13 | Before ... < ... | break_ensure.rb:14:9:14:9 | x | | | break_ensure.rb:14:13:14:13 | 0 | break_ensure.rb:14:9:14:13 | ... < ... | | -| break_ensure.rb:14:14:24:5 | do ... | break_ensure.rb:14:9:14:9 | x | | -| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:20:10:20:10 | y | | +| break_ensure.rb:14:14:24:5 | After do ... | break_ensure.rb:14:3:24:5 | [LoopHeader] while ... | | +| break_ensure.rb:14:14:24:5 | do ... | break_ensure.rb:15:5:23:7 | begin ... | | +| break_ensure.rb:15:5:23:7 | After begin ... | break_ensure.rb:14:14:24:5 | After do ... | | +| break_ensure.rb:15:5:23:7 | begin ... | break_ensure.rb:16:7:18:9 | if ... | | +| break_ensure.rb:16:7:18:9 | After if ... | break_ensure.rb:19:5:22:9 | ensure ... | | +| break_ensure.rb:16:7:18:9 | if ... | break_ensure.rb:16:10:16:14 | Before ... > ... | | | break_ensure.rb:16:10:16:10 | x | break_ensure.rb:16:14:16:14 | 0 | | -| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:7:18:9 | if ... | false | -| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:17:9:17:13 | break | true | -| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:20:10:20:10 | [ensure: exception] y | exception | +| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:10:16:14 | After ... > ... [false] | false | +| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:16:10:16:14 | After ... > ... [true] | true | +| break_ensure.rb:16:10:16:14 | ... > ... | break_ensure.rb:19:5:22:9 | ensure ... | exception | +| break_ensure.rb:16:10:16:14 | After ... > ... [false] | break_ensure.rb:16:7:18:9 | After if ... | | +| break_ensure.rb:16:10:16:14 | After ... > ... [true] | break_ensure.rb:16:16:17:13 | then ... | | +| break_ensure.rb:16:10:16:14 | Before ... > ... | break_ensure.rb:16:10:16:10 | x | | | break_ensure.rb:16:14:16:14 | 0 | break_ensure.rb:16:10:16:14 | ... > ... | | -| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:20:10:20:10 | [ensure: break] y | break | -| break_ensure.rb:19:5:22:9 | [ensure: break] ensure ... | break_ensure.rb:14:3:24:5 | while ... | break | -| break_ensure.rb:19:5:22:9 | [ensure: exception] ensure ... | break_ensure.rb:14:3:24:5 | while ... | exception | -| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:14:14:24:5 | do ... | | -| break_ensure.rb:20:7:22:9 | [ensure: break] if ... | break_ensure.rb:19:5:22:9 | [ensure: break] ensure ... | | -| break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | break_ensure.rb:19:5:22:9 | [ensure: exception] ensure ... | | -| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:19:5:22:9 | ensure ... | | -| break_ensure.rb:20:10:20:10 | [ensure: break] y | break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | | -| break_ensure.rb:20:10:20:10 | [ensure: exception] y | break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | | +| break_ensure.rb:16:16:17:13 | then ... | break_ensure.rb:17:9:17:13 | Before break | | +| break_ensure.rb:17:9:17:13 | Before break | break_ensure.rb:17:9:17:13 | break | | +| break_ensure.rb:17:9:17:13 | break | break_ensure.rb:19:5:22:9 | ensure ... | break | +| break_ensure.rb:19:5:22:9 | After ensure ... | break_ensure.rb:13:1:25:3 | Exceptional Exit | exception | +| break_ensure.rb:19:5:22:9 | After ensure ... | break_ensure.rb:14:3:24:5 | After while ... | break | +| break_ensure.rb:19:5:22:9 | After ensure ... | break_ensure.rb:15:5:23:7 | After begin ... | | +| break_ensure.rb:19:5:22:9 | ensure ... | break_ensure.rb:20:7:22:9 | if ... | | +| break_ensure.rb:20:7:22:9 | After if ... | break_ensure.rb:19:5:22:9 | After ensure ... | | +| break_ensure.rb:20:7:22:9 | if ... | break_ensure.rb:20:10:20:15 | Before call to nil? | | | break_ensure.rb:20:10:20:10 | y | break_ensure.rb:20:10:20:15 | call to nil? | | -| break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | false | -| break_ensure.rb:20:10:20:15 | [ensure: break] call to nil? | break_ensure.rb:21:9:21:20 | [ensure: break] self | true | -| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | false | -| break_ensure.rb:20:10:20:15 | [ensure: exception] call to nil? | break_ensure.rb:21:9:21:20 | [ensure: exception] self | true | -| break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:20:7:22:9 | if ... | false | -| break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:21:9:21:20 | self | true | -| break_ensure.rb:20:17:21:20 | [ensure: break] then ... | break_ensure.rb:20:7:22:9 | [ensure: break] if ... | | -| break_ensure.rb:20:17:21:20 | [ensure: exception] then ... | break_ensure.rb:20:7:22:9 | [ensure: exception] if ... | | -| break_ensure.rb:20:17:21:20 | then ... | break_ensure.rb:20:7:22:9 | if ... | | -| break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | break_ensure.rb:20:17:21:20 | [ensure: break] then ... | | -| break_ensure.rb:21:9:21:20 | [ensure: break] self | break_ensure.rb:21:15:21:19 | [ensure: break] y nil | | -| break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | break_ensure.rb:20:17:21:20 | [ensure: exception] then ... | | -| break_ensure.rb:21:9:21:20 | [ensure: exception] self | break_ensure.rb:21:15:21:19 | [ensure: exception] y nil | | -| break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:20:17:21:20 | then ... | | -| break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:15:21:19 | y nil | | -| break_ensure.rb:21:14:21:20 | "y nil" | break_ensure.rb:21:9:21:20 | call to puts | | -| break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | break_ensure.rb:21:9:21:20 | [ensure: break] call to puts | | -| break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | break_ensure.rb:21:9:21:20 | [ensure: exception] call to puts | | -| break_ensure.rb:21:15:21:19 | [ensure: break] y nil | break_ensure.rb:21:14:21:20 | [ensure: break] "y nil" | | -| break_ensure.rb:21:15:21:19 | [ensure: exception] y nil | break_ensure.rb:21:14:21:20 | [ensure: exception] "y nil" | | +| break_ensure.rb:20:10:20:15 | After call to nil? [false] | break_ensure.rb:20:7:22:9 | After if ... | | +| break_ensure.rb:20:10:20:15 | After call to nil? [true] | break_ensure.rb:20:17:21:20 | then ... | | +| break_ensure.rb:20:10:20:15 | Before call to nil? | break_ensure.rb:20:10:20:10 | y | | +| break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:20:10:20:15 | After call to nil? [false] | false | +| break_ensure.rb:20:10:20:15 | call to nil? | break_ensure.rb:20:10:20:15 | After call to nil? [true] | true | +| break_ensure.rb:20:17:21:20 | After then ... | break_ensure.rb:20:7:22:9 | After if ... | | +| break_ensure.rb:20:17:21:20 | then ... | break_ensure.rb:21:9:21:20 | Before call to puts | | +| break_ensure.rb:21:9:21:20 | After call to puts | break_ensure.rb:20:17:21:20 | After then ... | | +| break_ensure.rb:21:9:21:20 | Before call to puts | break_ensure.rb:21:9:21:20 | self | | +| break_ensure.rb:21:9:21:20 | call to puts | break_ensure.rb:21:9:21:20 | After call to puts | | +| break_ensure.rb:21:9:21:20 | self | break_ensure.rb:21:14:21:20 | Before "y nil" | | +| break_ensure.rb:21:14:21:20 | "y nil" | break_ensure.rb:21:14:21:20 | After "y nil" | | +| break_ensure.rb:21:14:21:20 | After "y nil" | break_ensure.rb:21:9:21:20 | call to puts | | +| break_ensure.rb:21:14:21:20 | Before "y nil" | break_ensure.rb:21:15:21:19 | y nil | | | break_ensure.rb:21:15:21:19 | y nil | break_ensure.rb:21:14:21:20 | "y nil" | | -| break_ensure.rb:27:1:42:3 | enter m3 | break_ensure.rb:27:8:27:8 | x | | -| break_ensure.rb:27:1:42:3 | exit m3 (abnormal) | break_ensure.rb:27:1:42:3 | exit m3 | | -| break_ensure.rb:27:1:42:3 | exit m3 (normal) | break_ensure.rb:27:1:42:3 | exit m3 | | +| break_ensure.rb:27:1:42:3 | Entry | break_ensure.rb:27:8:27:8 | x | | +| break_ensure.rb:27:1:42:3 | Exceptional Exit | break_ensure.rb:27:1:42:3 | Exit | | +| break_ensure.rb:27:1:42:3 | Normal Exit | break_ensure.rb:27:1:42:3 | Exit | | | break_ensure.rb:27:1:42:3 | m3 | break_ensure.rb:44:1:56:3 | m4 | | | break_ensure.rb:27:8:27:8 | x | break_ensure.rb:27:10:27:10 | y | | -| break_ensure.rb:27:10:27:10 | y | break_ensure.rb:29:8:29:8 | x | | -| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:33:11:33:11 | y | | +| break_ensure.rb:27:10:27:10 | y | break_ensure.rb:28:3:41:13 | ... | | +| break_ensure.rb:28:3:40:5 | After begin ... | break_ensure.rb:41:3:41:13 | Before call to puts | | +| break_ensure.rb:28:3:40:5 | begin ... | break_ensure.rb:29:5:31:7 | if ... | | +| break_ensure.rb:28:3:41:13 | ... | break_ensure.rb:28:3:40:5 | begin ... | | +| break_ensure.rb:28:3:41:13 | After ... | break_ensure.rb:27:1:42:3 | Normal Exit | | +| break_ensure.rb:29:5:31:7 | After if ... | break_ensure.rb:32:3:39:7 | ensure ... | | +| break_ensure.rb:29:5:31:7 | if ... | break_ensure.rb:29:8:29:13 | Before call to nil? | | | break_ensure.rb:29:8:29:8 | x | break_ensure.rb:29:8:29:13 | call to nil? | | -| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:29:5:31:7 | if ... | false | -| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:30:7:30:12 | return | true | -| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:33:11:33:11 | [ensure: exception] y | exception | -| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:33:11:33:11 | [ensure: return] y | return | -| break_ensure.rb:32:3:39:7 | [ensure: exception] ensure ... | break_ensure.rb:27:1:42:3 | exit m3 (abnormal) | exception | -| break_ensure.rb:32:3:39:7 | [ensure: return] ensure ... | break_ensure.rb:27:1:42:3 | exit m3 (normal) | return | -| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:41:3:41:13 | self | | -| break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break_ensure.rb:32:3:39:7 | [ensure: exception] ensure ... | | -| break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break_ensure.rb:32:3:39:7 | [ensure: return] ensure ... | | -| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:32:3:39:7 | ensure ... | | -| break_ensure.rb:33:11:33:11 | [ensure: exception] y | break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | | -| break_ensure.rb:33:11:33:11 | [ensure: return] y | break_ensure.rb:33:15:33:15 | [ensure: return] 0 | | +| break_ensure.rb:29:8:29:13 | After call to nil? [false] | break_ensure.rb:29:5:31:7 | After if ... | | +| break_ensure.rb:29:8:29:13 | After call to nil? [true] | break_ensure.rb:29:15:30:12 | then ... | | +| break_ensure.rb:29:8:29:13 | Before call to nil? | break_ensure.rb:29:8:29:8 | x | | +| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:29:8:29:13 | After call to nil? [false] | false | +| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:29:8:29:13 | After call to nil? [true] | true | +| break_ensure.rb:29:8:29:13 | call to nil? | break_ensure.rb:32:3:39:7 | ensure ... | exception | +| break_ensure.rb:29:15:30:12 | then ... | break_ensure.rb:30:7:30:12 | Before return | | +| break_ensure.rb:30:7:30:12 | Before return | break_ensure.rb:30:7:30:12 | return | | +| break_ensure.rb:30:7:30:12 | return | break_ensure.rb:32:3:39:7 | ensure ... | return | +| break_ensure.rb:32:3:39:7 | After ensure ... | break_ensure.rb:27:1:42:3 | Exceptional Exit | exception | +| break_ensure.rb:32:3:39:7 | After ensure ... | break_ensure.rb:27:1:42:3 | Normal Exit | return | +| break_ensure.rb:32:3:39:7 | After ensure ... | break_ensure.rb:28:3:40:5 | After begin ... | | +| break_ensure.rb:32:3:39:7 | ensure ... | break_ensure.rb:33:5:39:7 | while ... | | +| break_ensure.rb:33:5:39:7 | After while ... | break_ensure.rb:32:3:39:7 | After ensure ... | | +| break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | break_ensure.rb:33:11:33:15 | Before ... < ... | | +| break_ensure.rb:33:5:39:7 | while ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | | | break_ensure.rb:33:11:33:11 | y | break_ensure.rb:33:15:33:15 | 0 | | -| break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:5:39:7 | while ... | false | -| break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:35:12:35:12 | x | true | -| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | false | -| break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | break_ensure.rb:35:12:35:12 | [ensure: exception] x | true | -| break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | false | -| break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | break_ensure.rb:35:12:35:12 | [ensure: return] x | true | +| break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:11:33:15 | After ... < ... [false] | false | +| break_ensure.rb:33:11:33:15 | ... < ... | break_ensure.rb:33:11:33:15 | After ... < ... [true] | true | +| break_ensure.rb:33:11:33:15 | After ... < ... [false] | break_ensure.rb:33:5:39:7 | After while ... | | +| break_ensure.rb:33:11:33:15 | After ... < ... [true] | break_ensure.rb:33:16:39:7 | do ... | | +| break_ensure.rb:33:11:33:15 | Before ... < ... | break_ensure.rb:33:11:33:11 | y | | | break_ensure.rb:33:15:33:15 | 0 | break_ensure.rb:33:11:33:15 | ... < ... | | -| break_ensure.rb:33:15:33:15 | [ensure: exception] 0 | break_ensure.rb:33:11:33:15 | [ensure: exception] ... < ... | | -| break_ensure.rb:33:15:33:15 | [ensure: return] 0 | break_ensure.rb:33:11:33:15 | [ensure: return] ... < ... | | -| break_ensure.rb:33:16:39:7 | [ensure: exception] do ... | break_ensure.rb:33:11:33:11 | [ensure: exception] y | | -| break_ensure.rb:33:16:39:7 | [ensure: return] do ... | break_ensure.rb:33:11:33:11 | [ensure: return] y | | -| break_ensure.rb:33:16:39:7 | do ... | break_ensure.rb:33:11:33:11 | y | | -| break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | break_ensure.rb:33:16:39:7 | [ensure: exception] do ... | | -| break_ensure.rb:35:9:37:11 | [ensure: return] if ... | break_ensure.rb:33:16:39:7 | [ensure: return] do ... | | -| break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:33:16:39:7 | do ... | | -| break_ensure.rb:35:12:35:12 | [ensure: exception] x | break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | | -| break_ensure.rb:35:12:35:12 | [ensure: return] x | break_ensure.rb:35:16:35:16 | [ensure: return] 0 | | +| break_ensure.rb:33:16:39:7 | After do ... | break_ensure.rb:33:5:39:7 | [LoopHeader] while ... | | +| break_ensure.rb:33:16:39:7 | do ... | break_ensure.rb:34:7:38:9 | begin ... | | +| break_ensure.rb:34:7:38:9 | After begin ... | break_ensure.rb:33:16:39:7 | After do ... | | +| break_ensure.rb:34:7:38:9 | begin ... | break_ensure.rb:35:9:37:11 | if ... | | +| break_ensure.rb:35:9:37:11 | After if ... | break_ensure.rb:34:7:38:9 | After begin ... | | +| break_ensure.rb:35:9:37:11 | if ... | break_ensure.rb:35:12:35:16 | Before ... > ... | | | break_ensure.rb:35:12:35:12 | x | break_ensure.rb:35:16:35:16 | 0 | | -| break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:9:37:11 | if ... | false | -| break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:36:11:36:15 | break | true | -| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:35:9:37:11 | [ensure: exception] if ... | false | -| break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | break_ensure.rb:36:11:36:15 | [ensure: exception] break | true | -| break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:35:9:37:11 | [ensure: return] if ... | false | -| break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | break_ensure.rb:36:11:36:15 | [ensure: return] break | true | +| break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:12:35:16 | After ... > ... [false] | false | +| break_ensure.rb:35:12:35:16 | ... > ... | break_ensure.rb:35:12:35:16 | After ... > ... [true] | true | +| break_ensure.rb:35:12:35:16 | After ... > ... [false] | break_ensure.rb:35:9:37:11 | After if ... | | +| break_ensure.rb:35:12:35:16 | After ... > ... [true] | break_ensure.rb:35:18:36:15 | then ... | | +| break_ensure.rb:35:12:35:16 | Before ... > ... | break_ensure.rb:35:12:35:12 | x | | | break_ensure.rb:35:16:35:16 | 0 | break_ensure.rb:35:12:35:16 | ... > ... | | -| break_ensure.rb:35:16:35:16 | [ensure: exception] 0 | break_ensure.rb:35:12:35:16 | [ensure: exception] ... > ... | | -| break_ensure.rb:35:16:35:16 | [ensure: return] 0 | break_ensure.rb:35:12:35:16 | [ensure: return] ... > ... | | -| break_ensure.rb:36:11:36:15 | [ensure: exception] break | break_ensure.rb:33:5:39:7 | [ensure: exception] while ... | break | -| break_ensure.rb:36:11:36:15 | [ensure: return] break | break_ensure.rb:33:5:39:7 | [ensure: return] while ... | break | -| break_ensure.rb:36:11:36:15 | break | break_ensure.rb:33:5:39:7 | while ... | break | -| break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:27:1:42:3 | exit m3 (normal) | | -| break_ensure.rb:41:3:41:13 | self | break_ensure.rb:41:9:41:12 | Done | | -| break_ensure.rb:41:8:41:13 | "Done" | break_ensure.rb:41:3:41:13 | call to puts | | +| break_ensure.rb:35:18:36:15 | then ... | break_ensure.rb:36:11:36:15 | Before break | | +| break_ensure.rb:36:11:36:15 | Before break | break_ensure.rb:36:11:36:15 | break | | +| break_ensure.rb:36:11:36:15 | break | break_ensure.rb:33:5:39:7 | After while ... | break | +| break_ensure.rb:41:3:41:13 | After call to puts | break_ensure.rb:28:3:41:13 | After ... | | +| break_ensure.rb:41:3:41:13 | Before call to puts | break_ensure.rb:41:3:41:13 | self | | +| break_ensure.rb:41:3:41:13 | call to puts | break_ensure.rb:41:3:41:13 | After call to puts | | +| break_ensure.rb:41:3:41:13 | self | break_ensure.rb:41:8:41:13 | Before "Done" | | +| break_ensure.rb:41:8:41:13 | "Done" | break_ensure.rb:41:8:41:13 | After "Done" | | +| break_ensure.rb:41:8:41:13 | After "Done" | break_ensure.rb:41:3:41:13 | call to puts | | +| break_ensure.rb:41:8:41:13 | Before "Done" | break_ensure.rb:41:9:41:12 | Done | | | break_ensure.rb:41:9:41:12 | Done | break_ensure.rb:41:8:41:13 | "Done" | | -| break_ensure.rb:44:1:56:3 | enter m4 | break_ensure.rb:44:8:44:8 | x | | -| break_ensure.rb:44:1:56:3 | exit m4 (normal) | break_ensure.rb:44:1:56:3 | exit m4 | | -| break_ensure.rb:44:1:56:3 | m4 | break_ensure.rb:1:1:56:4 | exit break_ensure.rb (normal) | | -| break_ensure.rb:44:8:44:8 | x | break_ensure.rb:45:9:45:9 | x | | -| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:44:1:56:3 | exit m4 (normal) | | +| break_ensure.rb:44:1:56:3 | Entry | break_ensure.rb:44:8:44:8 | x | | +| break_ensure.rb:44:1:56:3 | Exceptional Exit | break_ensure.rb:44:1:56:3 | Exit | | +| break_ensure.rb:44:1:56:3 | Normal Exit | break_ensure.rb:44:1:56:3 | Exit | | +| break_ensure.rb:44:1:56:3 | m4 | break_ensure.rb:1:1:56:4 | Normal Exit | | +| break_ensure.rb:44:8:44:8 | x | break_ensure.rb:45:3:55:5 | ... | | +| break_ensure.rb:45:3:55:5 | ... | break_ensure.rb:45:3:55:5 | while ... | | +| break_ensure.rb:45:3:55:5 | After ... | break_ensure.rb:44:1:56:3 | Normal Exit | | +| break_ensure.rb:45:3:55:5 | After while ... | break_ensure.rb:45:3:55:5 | After ... | | +| break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | break_ensure.rb:45:9:45:13 | Before ... < ... | | +| break_ensure.rb:45:3:55:5 | while ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | | | break_ensure.rb:45:9:45:9 | x | break_ensure.rb:45:13:45:13 | 0 | | -| break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:3:55:5 | while ... | false | -| break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:47:10:47:10 | x | true | +| break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:9:45:13 | After ... < ... [false] | false | +| break_ensure.rb:45:9:45:13 | ... < ... | break_ensure.rb:45:9:45:13 | After ... < ... [true] | true | +| break_ensure.rb:45:9:45:13 | After ... < ... [false] | break_ensure.rb:45:3:55:5 | After while ... | | +| break_ensure.rb:45:9:45:13 | After ... < ... [true] | break_ensure.rb:45:14:55:5 | do ... | | +| break_ensure.rb:45:9:45:13 | Before ... < ... | break_ensure.rb:45:9:45:9 | x | | | break_ensure.rb:45:13:45:13 | 0 | break_ensure.rb:45:9:45:13 | ... < ... | | -| break_ensure.rb:45:14:55:5 | do ... | break_ensure.rb:45:9:45:9 | x | | -| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:51:10:51:10 | x | | +| break_ensure.rb:45:14:55:5 | After do ... | break_ensure.rb:45:3:55:5 | [LoopHeader] while ... | | +| break_ensure.rb:45:14:55:5 | do ... | break_ensure.rb:46:5:54:7 | begin ... | | +| break_ensure.rb:46:5:54:7 | After begin ... | break_ensure.rb:45:14:55:5 | After do ... | | +| break_ensure.rb:46:5:54:7 | begin ... | break_ensure.rb:47:7:49:9 | if ... | | +| break_ensure.rb:47:7:49:9 | After if ... | break_ensure.rb:50:5:53:9 | ensure ... | | +| break_ensure.rb:47:7:49:9 | if ... | break_ensure.rb:47:10:47:14 | Before ... > ... | | | break_ensure.rb:47:10:47:10 | x | break_ensure.rb:47:14:47:14 | 1 | | -| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:7:49:9 | if ... | false | -| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:48:9:48:16 | self | true | -| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | +| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:10:47:14 | After ... > ... [false] | false | +| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:47:10:47:14 | After ... > ... [true] | true | +| break_ensure.rb:47:10:47:14 | ... > ... | break_ensure.rb:50:5:53:9 | ensure ... | exception | +| break_ensure.rb:47:10:47:14 | After ... > ... [false] | break_ensure.rb:47:7:49:9 | After if ... | | +| break_ensure.rb:47:10:47:14 | After ... > ... [true] | break_ensure.rb:47:16:48:16 | then ... | | +| break_ensure.rb:47:10:47:14 | Before ... > ... | break_ensure.rb:47:10:47:10 | x | | | break_ensure.rb:47:14:47:14 | 1 | break_ensure.rb:47:10:47:14 | ... > ... | | -| break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:51:10:51:10 | [ensure: exception] x | exception | +| break_ensure.rb:47:16:48:16 | then ... | break_ensure.rb:48:9:48:16 | Before call to raise | | +| break_ensure.rb:48:9:48:16 | Before call to raise | break_ensure.rb:48:9:48:16 | self | | +| break_ensure.rb:48:9:48:16 | call to raise | break_ensure.rb:50:5:53:9 | ensure ... | exception | | break_ensure.rb:48:9:48:16 | self | break_ensure.rb:48:15:48:16 | "" | | | break_ensure.rb:48:15:48:16 | "" | break_ensure.rb:48:9:48:16 | call to raise | | -| break_ensure.rb:50:5:53:9 | [ensure: exception] ensure ... | break_ensure.rb:45:3:55:5 | while ... | exception | -| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:45:14:55:5 | do ... | | -| break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | break_ensure.rb:50:5:53:9 | [ensure: exception] ensure ... | | -| break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:50:5:53:9 | ensure ... | | -| break_ensure.rb:51:10:51:10 | [ensure: exception] x | break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | | +| break_ensure.rb:50:5:53:9 | After ensure ... | break_ensure.rb:44:1:56:3 | Exceptional Exit | exception | +| break_ensure.rb:50:5:53:9 | After ensure ... | break_ensure.rb:46:5:54:7 | After begin ... | | +| break_ensure.rb:50:5:53:9 | ensure ... | break_ensure.rb:51:7:53:9 | if ... | | +| break_ensure.rb:51:7:53:9 | After if ... | break_ensure.rb:50:5:53:9 | After ensure ... | | +| break_ensure.rb:51:7:53:9 | if ... | break_ensure.rb:51:10:51:14 | Before ... > ... | | | break_ensure.rb:51:10:51:10 | x | break_ensure.rb:51:14:51:14 | 0 | | -| break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:7:53:9 | if ... | false | -| break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:52:15:52:16 | 10 | true | -| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:51:7:53:9 | [ensure: exception] if ... | false | -| break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | true | +| break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:10:51:14 | After ... > ... [false] | false | +| break_ensure.rb:51:10:51:14 | ... > ... | break_ensure.rb:51:10:51:14 | After ... > ... [true] | true | +| break_ensure.rb:51:10:51:14 | After ... > ... [false] | break_ensure.rb:51:7:53:9 | After if ... | | +| break_ensure.rb:51:10:51:14 | After ... > ... [true] | break_ensure.rb:51:16:52:17 | then ... | | +| break_ensure.rb:51:10:51:14 | Before ... > ... | break_ensure.rb:51:10:51:10 | x | | | break_ensure.rb:51:14:51:14 | 0 | break_ensure.rb:51:10:51:14 | ... > ... | | -| break_ensure.rb:51:14:51:14 | [ensure: exception] 0 | break_ensure.rb:51:10:51:14 | [ensure: exception] ... > ... | | -| break_ensure.rb:52:9:52:16 | [ensure: exception] break | break_ensure.rb:45:3:55:5 | while ... | break | -| break_ensure.rb:52:9:52:16 | break | break_ensure.rb:45:3:55:5 | while ... | break | +| break_ensure.rb:51:16:52:17 | then ... | break_ensure.rb:52:9:52:16 | Before break | | +| break_ensure.rb:52:9:52:16 | Before break | break_ensure.rb:52:15:52:16 | 10 | | +| break_ensure.rb:52:9:52:16 | break | break_ensure.rb:45:3:55:5 | After while ... | break | | break_ensure.rb:52:15:52:16 | 10 | break_ensure.rb:52:9:52:16 | break | | -| break_ensure.rb:52:15:52:16 | [ensure: exception] 10 | break_ensure.rb:52:9:52:16 | [ensure: exception] break | | -| case.rb:1:1:6:3 | enter if_in_case | case.rb:2:8:2:9 | self | | -| case.rb:1:1:6:3 | exit if_in_case (normal) | case.rb:1:1:6:3 | exit if_in_case | | +| case.rb:1:1:6:3 | Entry | case.rb:2:3:5:5 | ... | | +| case.rb:1:1:6:3 | Normal Exit | case.rb:1:1:6:3 | Exit | | | case.rb:1:1:6:3 | if_in_case | case.rb:8:1:18:3 | case_match | | -| case.rb:1:1:99:4 | enter case.rb | case.rb:1:1:6:3 | if_in_case | | -| case.rb:1:1:99:4 | exit case.rb (normal) | case.rb:1:1:99:4 | exit case.rb | | -| case.rb:2:3:5:5 | case ... | case.rb:1:1:6:3 | exit if_in_case (normal) | | -| case.rb:2:8:2:9 | call to x1 | case.rb:3:10:3:10 | 1 | | +| case.rb:1:1:99:4 | Entry | case.rb:1:1:6:3 | if_in_case | | +| case.rb:1:1:99:4 | Normal Exit | case.rb:1:1:99:4 | Exit | | +| case.rb:2:3:5:5 | ... | case.rb:2:3:5:5 | case ... | | +| case.rb:2:3:5:5 | After ... | case.rb:1:1:6:3 | Normal Exit | | +| case.rb:2:3:5:5 | After case ... | case.rb:2:3:5:5 | After ... | | +| case.rb:2:3:5:5 | case ... | case.rb:2:8:2:9 | Before call to x1 | | +| case.rb:2:8:2:9 | After call to x1 | case.rb:3:5:3:42 | when ... | | +| case.rb:2:8:2:9 | Before call to x1 | case.rb:2:8:2:9 | self | | +| case.rb:2:8:2:9 | call to x1 | case.rb:2:8:2:9 | After call to x1 | | | case.rb:2:8:2:9 | self | case.rb:2:8:2:9 | call to x1 | | -| case.rb:3:5:3:42 | [match] when ... | case.rb:3:21:3:22 | self | match | -| case.rb:3:5:3:42 | [no-match] when ... | case.rb:4:10:4:10 | 2 | no-match | -| case.rb:3:10:3:10 | 1 | case.rb:3:5:3:42 | [match] when ... | match | -| case.rb:3:10:3:10 | 1 | case.rb:3:5:3:42 | [no-match] when ... | no-match | -| case.rb:3:12:3:42 | then ... | case.rb:2:3:5:5 | case ... | | -| case.rb:3:17:3:42 | ( ... ) | case.rb:3:12:3:42 | then ... | | -| case.rb:3:18:3:41 | if ... | case.rb:3:17:3:42 | ( ... ) | | -| case.rb:3:21:3:22 | call to x2 | case.rb:3:18:3:41 | if ... | false | -| case.rb:3:21:3:22 | call to x2 | case.rb:3:29:3:37 | self | true | +| case.rb:3:5:3:42 | After when ... [match] | case.rb:3:12:3:42 | then ... | | +| case.rb:3:5:3:42 | After when ... [no-match] | case.rb:4:5:4:24 | when ... | | +| case.rb:3:5:3:42 | when ... | case.rb:3:10:3:10 | 1 | | +| case.rb:3:10:3:10 | 1 | case.rb:3:10:3:10 | After 1 [match] | match | +| case.rb:3:10:3:10 | 1 | case.rb:3:10:3:10 | After 1 [no-match] | no-match | +| case.rb:3:10:3:10 | After 1 [match] | case.rb:3:5:3:42 | After when ... [match] | match | +| case.rb:3:10:3:10 | After 1 [no-match] | case.rb:3:5:3:42 | After when ... [no-match] | no-match | +| case.rb:3:12:3:42 | After then ... | case.rb:2:3:5:5 | After case ... | | +| case.rb:3:12:3:42 | then ... | case.rb:3:17:3:42 | ( ... ) | | +| case.rb:3:17:3:42 | ( ... ) | case.rb:3:18:3:41 | if ... | | +| case.rb:3:17:3:42 | After ( ... ) | case.rb:3:12:3:42 | After then ... | | +| case.rb:3:18:3:41 | After if ... | case.rb:3:17:3:42 | After ( ... ) | | +| case.rb:3:18:3:41 | if ... | case.rb:3:21:3:22 | Before call to x2 | | +| case.rb:3:21:3:22 | After call to x2 [false] | case.rb:3:18:3:41 | After if ... | | +| case.rb:3:21:3:22 | After call to x2 [true] | case.rb:3:24:3:37 | then ... | | +| case.rb:3:21:3:22 | Before call to x2 | case.rb:3:21:3:22 | self | | +| case.rb:3:21:3:22 | call to x2 | case.rb:3:21:3:22 | After call to x2 [false] | false | +| case.rb:3:21:3:22 | call to x2 | case.rb:3:21:3:22 | After call to x2 [true] | true | | case.rb:3:21:3:22 | self | case.rb:3:21:3:22 | call to x2 | | -| case.rb:3:24:3:37 | then ... | case.rb:3:18:3:41 | if ... | | -| case.rb:3:29:3:37 | call to puts | case.rb:3:24:3:37 | then ... | | -| case.rb:3:29:3:37 | self | case.rb:3:35:3:36 | x2 | | -| case.rb:3:34:3:37 | "x2" | case.rb:3:29:3:37 | call to puts | | +| case.rb:3:24:3:37 | After then ... | case.rb:3:18:3:41 | After if ... | | +| case.rb:3:24:3:37 | then ... | case.rb:3:29:3:37 | Before call to puts | | +| case.rb:3:29:3:37 | After call to puts | case.rb:3:24:3:37 | After then ... | | +| case.rb:3:29:3:37 | Before call to puts | case.rb:3:29:3:37 | self | | +| case.rb:3:29:3:37 | call to puts | case.rb:3:29:3:37 | After call to puts | | +| case.rb:3:29:3:37 | self | case.rb:3:34:3:37 | Before "x2" | | +| case.rb:3:34:3:37 | "x2" | case.rb:3:34:3:37 | After "x2" | | +| case.rb:3:34:3:37 | After "x2" | case.rb:3:29:3:37 | call to puts | | +| case.rb:3:34:3:37 | Before "x2" | case.rb:3:35:3:36 | x2 | | | case.rb:3:35:3:36 | x2 | case.rb:3:34:3:37 | "x2" | | -| case.rb:4:5:4:24 | [match] when ... | case.rb:4:17:4:24 | self | match | -| case.rb:4:5:4:24 | [no-match] when ... | case.rb:2:3:5:5 | case ... | no-match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [match] when ... | match | -| case.rb:4:10:4:10 | 2 | case.rb:4:5:4:24 | [no-match] when ... | no-match | -| case.rb:4:12:4:24 | then ... | case.rb:2:3:5:5 | case ... | | -| case.rb:4:17:4:24 | call to puts | case.rb:4:12:4:24 | then ... | | -| case.rb:4:17:4:24 | self | case.rb:4:23:4:23 | 2 | | -| case.rb:4:22:4:24 | "2" | case.rb:4:17:4:24 | call to puts | | +| case.rb:4:5:4:24 | After when ... [match] | case.rb:4:12:4:24 | then ... | | +| case.rb:4:5:4:24 | After when ... [no-match] | case.rb:2:3:5:5 | After case ... | | +| case.rb:4:5:4:24 | when ... | case.rb:4:10:4:10 | 2 | | +| case.rb:4:10:4:10 | 2 | case.rb:4:10:4:10 | After 2 [match] | match | +| case.rb:4:10:4:10 | 2 | case.rb:4:10:4:10 | After 2 [no-match] | no-match | +| case.rb:4:10:4:10 | After 2 [match] | case.rb:4:5:4:24 | After when ... [match] | match | +| case.rb:4:10:4:10 | After 2 [no-match] | case.rb:4:5:4:24 | After when ... [no-match] | no-match | +| case.rb:4:12:4:24 | After then ... | case.rb:2:3:5:5 | After case ... | | +| case.rb:4:12:4:24 | then ... | case.rb:4:17:4:24 | Before call to puts | | +| case.rb:4:17:4:24 | After call to puts | case.rb:4:12:4:24 | After then ... | | +| case.rb:4:17:4:24 | Before call to puts | case.rb:4:17:4:24 | self | | +| case.rb:4:17:4:24 | call to puts | case.rb:4:17:4:24 | After call to puts | | +| case.rb:4:17:4:24 | self | case.rb:4:22:4:24 | Before "2" | | +| case.rb:4:22:4:24 | "2" | case.rb:4:22:4:24 | After "2" | | +| case.rb:4:22:4:24 | After "2" | case.rb:4:17:4:24 | call to puts | | +| case.rb:4:22:4:24 | Before "2" | case.rb:4:23:4:23 | 2 | | | case.rb:4:23:4:23 | 2 | case.rb:4:22:4:24 | "2" | | +| case.rb:8:1:18:3 | Entry | case.rb:8:16:8:20 | value | | +| case.rb:8:1:18:3 | Normal Exit | case.rb:8:1:18:3 | Exit | | | case.rb:8:1:18:3 | case_match | case.rb:20:1:24:3 | case_match_no_match | | -| case.rb:8:1:18:3 | enter case_match | case.rb:8:16:8:20 | value | | -| case.rb:8:1:18:3 | exit case_match (normal) | case.rb:8:1:18:3 | exit case_match | | -| case.rb:8:16:8:20 | value | case.rb:9:8:9:12 | value | | -| case.rb:9:3:17:5 | case ... | case.rb:8:1:18:3 | exit case_match (normal) | | +| case.rb:8:16:8:20 | value | case.rb:9:3:17:5 | ... | | +| case.rb:9:3:17:5 | ... | case.rb:9:3:17:5 | case ... | | +| case.rb:9:3:17:5 | After ... | case.rb:8:1:18:3 | Normal Exit | | +| case.rb:9:3:17:5 | After case ... | case.rb:9:3:17:5 | After ... | | +| case.rb:9:3:17:5 | case ... | case.rb:9:8:9:12 | value | | | case.rb:9:8:9:12 | value | case.rb:10:5:10:9 | in ... then ... | | +| case.rb:10:5:10:9 | After in ... then ... [match] | case.rb:9:3:17:5 | After case ... | | +| case.rb:10:5:10:9 | After in ... then ... [no-match] | case.rb:11:5:11:15 | in ... then ... | | | case.rb:10:5:10:9 | in ... then ... | case.rb:10:8:10:8 | 0 | | -| case.rb:10:8:10:8 | 0 | case.rb:9:3:17:5 | case ... | match | -| case.rb:10:8:10:8 | 0 | case.rb:11:5:11:15 | in ... then ... | no-match | +| case.rb:10:8:10:8 | 0 | case.rb:10:8:10:8 | After 0 [match] | match | +| case.rb:10:8:10:8 | 0 | case.rb:10:8:10:8 | After 0 [no-match] | no-match | +| case.rb:10:8:10:8 | After 0 [match] | case.rb:10:5:10:9 | After in ... then ... [match] | match | +| case.rb:10:8:10:8 | After 0 [no-match] | case.rb:10:5:10:9 | After in ... then ... [no-match] | no-match | +| case.rb:11:5:11:15 | After in ... then ... [match] | case.rb:11:10:11:15 | then ... | | +| case.rb:11:5:11:15 | After in ... then ... [no-match] | case.rb:12:5:13:7 | in ... then ... | | | case.rb:11:5:11:15 | in ... then ... | case.rb:11:8:11:8 | 1 | | -| case.rb:11:8:11:8 | 1 | case.rb:11:15:11:15 | 3 | match | -| case.rb:11:8:11:8 | 1 | case.rb:12:5:13:7 | in ... then ... | no-match | -| case.rb:11:10:11:15 | then ... | case.rb:9:3:17:5 | case ... | | -| case.rb:11:15:11:15 | 3 | case.rb:11:10:11:15 | then ... | | +| case.rb:11:8:11:8 | 1 | case.rb:11:8:11:8 | After 1 [match] | match | +| case.rb:11:8:11:8 | 1 | case.rb:11:8:11:8 | After 1 [no-match] | no-match | +| case.rb:11:8:11:8 | After 1 [match] | case.rb:11:5:11:15 | After in ... then ... [match] | match | +| case.rb:11:8:11:8 | After 1 [no-match] | case.rb:11:5:11:15 | After in ... then ... [no-match] | no-match | +| case.rb:11:10:11:15 | After then ... | case.rb:9:3:17:5 | After case ... | | +| case.rb:11:10:11:15 | then ... | case.rb:11:15:11:15 | 3 | | +| case.rb:11:15:11:15 | 3 | case.rb:11:10:11:15 | After then ... | | +| case.rb:12:5:13:7 | After in ... then ... [match] | case.rb:12:9:13:7 | then ... | | +| case.rb:12:5:13:7 | After in ... then ... [no-match] | case.rb:14:5:14:25 | in ... then ... | | | case.rb:12:5:13:7 | in ... then ... | case.rb:12:8:12:8 | 2 | | -| case.rb:12:8:12:8 | 2 | case.rb:13:7:13:7 | 4 | match | -| case.rb:12:8:12:8 | 2 | case.rb:14:5:14:25 | in ... then ... | no-match | -| case.rb:12:9:13:7 | then ... | case.rb:9:3:17:5 | case ... | | -| case.rb:13:7:13:7 | 4 | case.rb:12:9:13:7 | then ... | | +| case.rb:12:8:12:8 | 2 | case.rb:12:8:12:8 | After 2 [match] | match | +| case.rb:12:8:12:8 | 2 | case.rb:12:8:12:8 | After 2 [no-match] | no-match | +| case.rb:12:8:12:8 | After 2 [match] | case.rb:12:5:13:7 | After in ... then ... [match] | match | +| case.rb:12:8:12:8 | After 2 [no-match] | case.rb:12:5:13:7 | After in ... then ... [no-match] | no-match | +| case.rb:12:9:13:7 | After then ... | case.rb:9:3:17:5 | After case ... | | +| case.rb:12:9:13:7 | then ... | case.rb:13:7:13:7 | 4 | | +| case.rb:13:7:13:7 | 4 | case.rb:12:9:13:7 | After then ... | | +| case.rb:14:5:14:25 | After in ... then ... [match] | case.rb:14:13:14:18 | Before ... == ... | | +| case.rb:14:5:14:25 | After in ... then ... [no-match] | case.rb:15:5:15:28 | in ... then ... | | | case.rb:14:5:14:25 | in ... then ... | case.rb:14:8:14:8 | x | | -| case.rb:14:8:14:8 | x | case.rb:14:13:14:13 | x | match | +| case.rb:14:8:14:8 | After x [match] | case.rb:14:5:14:25 | After in ... then ... [match] | match | +| case.rb:14:8:14:8 | After x [no-match] | case.rb:14:5:14:25 | After in ... then ... [no-match] | no-match | +| case.rb:14:8:14:8 | x | case.rb:14:8:14:8 | After x [match] | match | +| case.rb:14:8:14:8 | x | case.rb:14:8:14:8 | After x [no-match] | no-match | | case.rb:14:13:14:13 | x | case.rb:14:18:14:18 | 5 | | -| case.rb:14:13:14:18 | ... == ... | case.rb:14:25:14:25 | 6 | true | -| case.rb:14:13:14:18 | ... == ... | case.rb:15:5:15:28 | in ... then ... | false | +| case.rb:14:13:14:18 | ... == ... | case.rb:14:13:14:18 | After ... == ... [false] | false | +| case.rb:14:13:14:18 | ... == ... | case.rb:14:13:14:18 | After ... == ... [true] | true | +| case.rb:14:13:14:18 | After ... == ... [false] | case.rb:15:5:15:28 | in ... then ... | | +| case.rb:14:13:14:18 | After ... == ... [true] | case.rb:14:20:14:25 | then ... | | +| case.rb:14:13:14:18 | Before ... == ... | case.rb:14:13:14:13 | x | | | case.rb:14:18:14:18 | 5 | case.rb:14:13:14:18 | ... == ... | | -| case.rb:14:20:14:25 | then ... | case.rb:9:3:17:5 | case ... | | -| case.rb:14:25:14:25 | 6 | case.rb:14:20:14:25 | then ... | | +| case.rb:14:20:14:25 | After then ... | case.rb:9:3:17:5 | After case ... | | +| case.rb:14:20:14:25 | then ... | case.rb:14:25:14:25 | 6 | | +| case.rb:14:25:14:25 | 6 | case.rb:14:20:14:25 | After then ... | | +| case.rb:15:5:15:28 | After in ... then ... [match] | case.rb:15:17:15:21 | Before ... < ... | | +| case.rb:15:5:15:28 | After in ... then ... [no-match] | case.rb:16:5:16:10 | else ... | | | case.rb:15:5:15:28 | in ... then ... | case.rb:15:8:15:8 | x | | -| case.rb:15:8:15:8 | x | case.rb:15:17:15:17 | x | match | +| case.rb:15:8:15:8 | After x [match] | case.rb:15:5:15:28 | After in ... then ... [match] | match | +| case.rb:15:8:15:8 | After x [no-match] | case.rb:15:5:15:28 | After in ... then ... [no-match] | no-match | +| case.rb:15:8:15:8 | x | case.rb:15:8:15:8 | After x [match] | match | +| case.rb:15:8:15:8 | x | case.rb:15:8:15:8 | After x [no-match] | no-match | | case.rb:15:17:15:17 | x | case.rb:15:21:15:21 | 0 | | -| case.rb:15:17:15:21 | ... < ... | case.rb:15:28:15:28 | 7 | false | -| case.rb:15:17:15:21 | ... < ... | case.rb:16:10:16:10 | 8 | true | +| case.rb:15:17:15:21 | ... < ... | case.rb:15:17:15:21 | After ... < ... [false] | false | +| case.rb:15:17:15:21 | ... < ... | case.rb:15:17:15:21 | After ... < ... [true] | true | +| case.rb:15:17:15:21 | After ... < ... [false] | case.rb:16:5:16:10 | else ... | | +| case.rb:15:17:15:21 | After ... < ... [true] | case.rb:15:23:15:28 | then ... | | +| case.rb:15:17:15:21 | Before ... < ... | case.rb:15:17:15:17 | x | | | case.rb:15:21:15:21 | 0 | case.rb:15:17:15:21 | ... < ... | | -| case.rb:15:23:15:28 | then ... | case.rb:9:3:17:5 | case ... | | -| case.rb:15:28:15:28 | 7 | case.rb:15:23:15:28 | then ... | | -| case.rb:16:5:16:10 | else ... | case.rb:9:3:17:5 | case ... | | -| case.rb:16:10:16:10 | 8 | case.rb:16:5:16:10 | else ... | | +| case.rb:15:23:15:28 | After then ... | case.rb:9:3:17:5 | After case ... | | +| case.rb:15:23:15:28 | then ... | case.rb:15:28:15:28 | 7 | | +| case.rb:15:28:15:28 | 7 | case.rb:15:23:15:28 | After then ... | | +| case.rb:16:5:16:10 | After else ... | case.rb:9:3:17:5 | After case ... | | +| case.rb:16:5:16:10 | After else ... [match] | case.rb:16:5:16:10 | else ... | | +| case.rb:16:5:16:10 | else ... | case.rb:16:5:16:10 | After else ... [match] | match | +| case.rb:16:5:16:10 | else ... | case.rb:16:10:16:10 | 8 | | +| case.rb:16:10:16:10 | 8 | case.rb:16:5:16:10 | After else ... | | +| case.rb:20:1:24:3 | Entry | case.rb:20:25:20:29 | value | | +| case.rb:20:1:24:3 | Normal Exit | case.rb:20:1:24:3 | Exit | | | case.rb:20:1:24:3 | case_match_no_match | case.rb:26:1:30:3 | case_match_raise | | -| case.rb:20:1:24:3 | enter case_match_no_match | case.rb:20:25:20:29 | value | | -| case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | case.rb:20:1:24:3 | exit case_match_no_match | | -| case.rb:20:1:24:3 | exit case_match_no_match (normal) | case.rb:20:1:24:3 | exit case_match_no_match | | -| case.rb:20:25:20:29 | value | case.rb:21:8:21:12 | value | | -| case.rb:21:3:23:5 | case ... | case.rb:20:1:24:3 | exit case_match_no_match (normal) | | +| case.rb:20:25:20:29 | value | case.rb:21:3:23:5 | ... | | +| case.rb:21:3:23:5 | ... | case.rb:21:3:23:5 | case ... | | +| case.rb:21:3:23:5 | After ... | case.rb:20:1:24:3 | Normal Exit | | +| case.rb:21:3:23:5 | After case ... | case.rb:21:3:23:5 | After ... | | +| case.rb:21:3:23:5 | case ... | case.rb:21:8:21:12 | value | | | case.rb:21:8:21:12 | value | case.rb:22:5:22:8 | in ... then ... | | +| case.rb:22:5:22:8 | After in ... then ... [match] | case.rb:21:3:23:5 | After case ... | | +| case.rb:22:5:22:8 | After in ... then ... [no-match] | case.rb:21:3:23:5 | After case ... | | | case.rb:22:5:22:8 | in ... then ... | case.rb:22:8:22:8 | 1 | | -| case.rb:22:8:22:8 | 1 | case.rb:20:1:24:3 | exit case_match_no_match (abnormal) | exception | -| case.rb:22:8:22:8 | 1 | case.rb:21:3:23:5 | case ... | match | +| case.rb:22:8:22:8 | 1 | case.rb:22:8:22:8 | After 1 [match] | match | +| case.rb:22:8:22:8 | 1 | case.rb:22:8:22:8 | After 1 [no-match] | no-match | +| case.rb:22:8:22:8 | After 1 [match] | case.rb:22:5:22:8 | After in ... then ... [match] | match | +| case.rb:22:8:22:8 | After 1 [no-match] | case.rb:22:5:22:8 | After in ... then ... [no-match] | no-match | +| case.rb:26:1:30:3 | Entry | case.rb:26:22:26:26 | value | | +| case.rb:26:1:30:3 | Normal Exit | case.rb:26:1:30:3 | Exit | | | case.rb:26:1:30:3 | case_match_raise | case.rb:32:1:39:3 | case_match_array | | -| case.rb:26:1:30:3 | enter case_match_raise | case.rb:26:22:26:26 | value | | -| case.rb:26:1:30:3 | exit case_match_raise (abnormal) | case.rb:26:1:30:3 | exit case_match_raise | | -| case.rb:26:1:30:3 | exit case_match_raise (normal) | case.rb:26:1:30:3 | exit case_match_raise | | -| case.rb:26:22:26:26 | value | case.rb:27:8:27:12 | value | | -| case.rb:27:3:29:5 | case ... | case.rb:26:1:30:3 | exit case_match_raise (normal) | | +| case.rb:26:22:26:26 | value | case.rb:27:3:29:5 | ... | | +| case.rb:27:3:29:5 | ... | case.rb:27:3:29:5 | case ... | | +| case.rb:27:3:29:5 | After ... | case.rb:26:1:30:3 | Normal Exit | | +| case.rb:27:3:29:5 | After case ... | case.rb:27:3:29:5 | After ... | | +| case.rb:27:3:29:5 | case ... | case.rb:27:8:27:12 | value | | | case.rb:27:8:27:12 | value | case.rb:28:4:28:28 | in ... then ... | | +| case.rb:28:4:28:28 | After in ... then ... [match] | case.rb:27:3:29:5 | After case ... | | +| case.rb:28:4:28:28 | After in ... then ... [no-match] | case.rb:27:3:29:5 | After case ... | | | case.rb:28:4:28:28 | in ... then ... | case.rb:28:7:28:28 | -> { ... } | | -| case.rb:28:7:28:28 | -> { ... } | case.rb:26:1:30:3 | exit case_match_raise (abnormal) | exception | -| case.rb:28:7:28:28 | -> { ... } | case.rb:27:3:29:5 | case ... | match | -| case.rb:28:7:28:28 | enter -> { ... } | case.rb:28:10:28:10 | x | | -| case.rb:28:7:28:28 | exit -> { ... } (abnormal) | case.rb:28:7:28:28 | exit -> { ... } | | -| case.rb:28:10:28:10 | x | case.rb:28:14:28:25 | self | | -| case.rb:28:14:28:25 | call to raise | case.rb:28:7:28:28 | exit -> { ... } (abnormal) | exception | -| case.rb:28:14:28:25 | self | case.rb:28:21:28:24 | oops | | -| case.rb:28:20:28:25 | "oops" | case.rb:28:14:28:25 | call to raise | | +| case.rb:28:7:28:28 | -> { ... } | case.rb:28:7:28:28 | After -> { ... } [match] | match | +| case.rb:28:7:28:28 | -> { ... } | case.rb:28:7:28:28 | After -> { ... } [no-match] | no-match | +| case.rb:28:7:28:28 | After -> { ... } [match] | case.rb:28:4:28:28 | After in ... then ... [match] | match | +| case.rb:28:7:28:28 | After -> { ... } [no-match] | case.rb:28:4:28:28 | After in ... then ... [no-match] | no-match | +| case.rb:28:7:28:28 | Entry | case.rb:28:10:28:10 | x | | +| case.rb:28:7:28:28 | Exceptional Exit | case.rb:28:7:28:28 | Exit | | +| case.rb:28:10:28:10 | x | case.rb:28:14:28:25 | ... | | +| case.rb:28:14:28:25 | ... | case.rb:28:14:28:25 | Before call to raise | | +| case.rb:28:14:28:25 | Before call to raise | case.rb:28:14:28:25 | self | | +| case.rb:28:14:28:25 | call to raise | case.rb:28:7:28:28 | Exceptional Exit | exception | +| case.rb:28:14:28:25 | self | case.rb:28:20:28:25 | Before "oops" | | +| case.rb:28:20:28:25 | "oops" | case.rb:28:20:28:25 | After "oops" | | +| case.rb:28:20:28:25 | After "oops" | case.rb:28:14:28:25 | call to raise | | +| case.rb:28:20:28:25 | Before "oops" | case.rb:28:21:28:24 | oops | | | case.rb:28:21:28:24 | oops | case.rb:28:20:28:25 | "oops" | | +| case.rb:32:1:39:3 | Entry | case.rb:32:22:32:26 | value | | +| case.rb:32:1:39:3 | Normal Exit | case.rb:32:1:39:3 | Exit | | | case.rb:32:1:39:3 | case_match_array | case.rb:41:1:45:3 | case_match_find | | -| case.rb:32:1:39:3 | enter case_match_array | case.rb:32:22:32:26 | value | | -| case.rb:32:1:39:3 | exit case_match_array (abnormal) | case.rb:32:1:39:3 | exit case_match_array | | -| case.rb:32:1:39:3 | exit case_match_array (normal) | case.rb:32:1:39:3 | exit case_match_array | | -| case.rb:32:22:32:26 | value | case.rb:33:8:33:12 | value | | -| case.rb:33:3:38:5 | case ... | case.rb:32:1:39:3 | exit case_match_array (normal) | | +| case.rb:32:22:32:26 | value | case.rb:33:3:38:5 | ... | | +| case.rb:33:3:38:5 | ... | case.rb:33:3:38:5 | case ... | | +| case.rb:33:3:38:5 | After ... | case.rb:32:1:39:3 | Normal Exit | | +| case.rb:33:3:38:5 | After case ... | case.rb:33:3:38:5 | After ... | | +| case.rb:33:3:38:5 | case ... | case.rb:33:8:33:12 | value | | | case.rb:33:8:33:12 | value | case.rb:34:5:34:10 | in ... then ... | | +| case.rb:34:5:34:10 | After in ... then ... [match] | case.rb:33:3:38:5 | After case ... | | +| case.rb:34:5:34:10 | After in ... then ... [no-match] | case.rb:35:5:35:11 | in ... then ... | | | case.rb:34:5:34:10 | in ... then ... | case.rb:34:8:34:9 | [ ..., * ] | | -| case.rb:34:8:34:9 | [ ..., * ] | case.rb:33:3:38:5 | case ... | match | -| case.rb:34:8:34:9 | [ ..., * ] | case.rb:35:5:35:11 | in ... then ... | no-match | +| case.rb:34:8:34:9 | After [ ..., * ] [match] | case.rb:34:5:34:10 | After in ... then ... [match] | match | +| case.rb:34:8:34:9 | After [ ..., * ] [no-match] | case.rb:34:5:34:10 | After in ... then ... [no-match] | no-match | +| case.rb:34:8:34:9 | [ ..., * ] | case.rb:34:8:34:9 | After [ ..., * ] [match] | match | +| case.rb:34:8:34:9 | [ ..., * ] | case.rb:34:8:34:9 | After [ ..., * ] [no-match] | no-match | +| case.rb:35:5:35:11 | After in ... then ... [match] | case.rb:33:3:38:5 | After case ... | | +| case.rb:35:5:35:11 | After in ... then ... [no-match] | case.rb:36:5:36:13 | in ... then ... | | | case.rb:35:5:35:11 | in ... then ... | case.rb:35:8:35:10 | [ ..., * ] | | -| case.rb:35:8:35:10 | [ ..., * ] | case.rb:35:9:35:9 | x | false, match, true | -| case.rb:35:8:35:10 | [ ..., * ] | case.rb:36:5:36:13 | in ... then ... | no-match | -| case.rb:35:9:35:9 | x | case.rb:33:3:38:5 | case ... | match | +| case.rb:35:8:35:10 | After [ ..., * ] [match] | case.rb:35:5:35:11 | After in ... then ... [match] | match | +| case.rb:35:8:35:10 | After [ ..., * ] [no-match] | case.rb:35:5:35:11 | After in ... then ... [no-match] | no-match | +| case.rb:35:8:35:10 | [ ..., * ] | case.rb:35:9:35:9 | x | | +| case.rb:35:9:35:9 | x | case.rb:35:8:35:10 | After [ ..., * ] [match] | match | +| case.rb:35:9:35:9 | x | case.rb:35:8:35:10 | After [ ..., * ] [no-match] | no-match | +| case.rb:36:5:36:13 | After in ... then ... [match] | case.rb:33:3:38:5 | After case ... | | +| case.rb:36:5:36:13 | After in ... then ... [no-match] | case.rb:37:5:37:27 | in ... then ... | | | case.rb:36:5:36:13 | in ... then ... | case.rb:36:8:36:12 | [ ..., * ] | | -| case.rb:36:8:36:12 | [ ..., * ] | case.rb:36:9:36:9 | x | false, match, true | -| case.rb:36:8:36:12 | [ ..., * ] | case.rb:37:5:37:27 | in ... then ... | no-match | -| case.rb:36:9:36:9 | x | case.rb:33:3:38:5 | case ... | match | -| case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:10 | Bar | | -| case.rb:37:8:37:10 | Bar | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | -| case.rb:37:8:37:10 | Bar | case.rb:37:8:37:26 | [ ..., * ] | match | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:32:1:39:3 | exit case_match_array (abnormal) | exception | -| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:12:37:12 | a | false, match, true | -| case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | match | -| case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | match | +| case.rb:36:8:36:12 | After [ ..., * ] [match] | case.rb:36:5:36:13 | After in ... then ... [match] | match | +| case.rb:36:8:36:12 | After [ ..., * ] [no-match] | case.rb:36:5:36:13 | After in ... then ... [no-match] | no-match | +| case.rb:36:8:36:12 | [ ..., * ] | case.rb:36:9:36:9 | x | | +| case.rb:36:9:36:9 | x | case.rb:36:8:36:12 | After [ ..., * ] [match] | match | +| case.rb:36:9:36:9 | x | case.rb:36:8:36:12 | After [ ..., * ] [no-match] | no-match | +| case.rb:37:5:37:27 | After in ... then ... [match] | case.rb:33:3:38:5 | After case ... | | +| case.rb:37:5:37:27 | After in ... then ... [no-match] | case.rb:33:3:38:5 | After case ... | | +| case.rb:37:5:37:27 | in ... then ... | case.rb:37:8:37:26 | [ ..., * ] | | +| case.rb:37:8:37:10 | Bar | case.rb:37:12:37:12 | a | | +| case.rb:37:8:37:26 | After [ ..., * ] [match] | case.rb:37:5:37:27 | After in ... then ... [match] | match | +| case.rb:37:8:37:26 | After [ ..., * ] [no-match] | case.rb:37:5:37:27 | After in ... then ... [no-match] | no-match | +| case.rb:37:8:37:26 | [ ..., * ] | case.rb:37:8:37:10 | Bar | | +| case.rb:37:12:37:12 | a | case.rb:37:15:37:15 | b | | +| case.rb:37:15:37:15 | b | case.rb:37:19:37:19 | c | | | case.rb:37:19:37:19 | c | case.rb:37:22:37:22 | d | | -| case.rb:37:22:37:22 | d | case.rb:37:25:37:25 | e | match | -| case.rb:37:25:37:25 | e | case.rb:33:3:38:5 | case ... | match | +| case.rb:37:22:37:22 | d | case.rb:37:25:37:25 | e | | +| case.rb:37:25:37:25 | e | case.rb:37:8:37:26 | After [ ..., * ] [match] | match | +| case.rb:37:25:37:25 | e | case.rb:37:8:37:26 | After [ ..., * ] [no-match] | no-match | +| case.rb:41:1:45:3 | Entry | case.rb:41:21:41:25 | value | | +| case.rb:41:1:45:3 | Normal Exit | case.rb:41:1:45:3 | Exit | | | case.rb:41:1:45:3 | case_match_find | case.rb:47:1:53:3 | case_match_hash | | -| case.rb:41:1:45:3 | enter case_match_find | case.rb:41:21:41:25 | value | | -| case.rb:41:1:45:3 | exit case_match_find (abnormal) | case.rb:41:1:45:3 | exit case_match_find | | -| case.rb:41:1:45:3 | exit case_match_find (normal) | case.rb:41:1:45:3 | exit case_match_find | | -| case.rb:41:21:41:25 | value | case.rb:42:8:42:12 | value | | -| case.rb:42:3:44:5 | case ... | case.rb:41:1:45:3 | exit case_match_find (normal) | | +| case.rb:41:21:41:25 | value | case.rb:42:3:44:5 | ... | | +| case.rb:42:3:44:5 | ... | case.rb:42:3:44:5 | case ... | | +| case.rb:42:3:44:5 | After ... | case.rb:41:1:45:3 | Normal Exit | | +| case.rb:42:3:44:5 | After case ... | case.rb:42:3:44:5 | After ... | | +| case.rb:42:3:44:5 | case ... | case.rb:42:8:42:12 | value | | | case.rb:42:8:42:12 | value | case.rb:43:5:43:22 | in ... then ... | | +| case.rb:43:5:43:22 | After in ... then ... [match] | case.rb:42:3:44:5 | After case ... | | +| case.rb:43:5:43:22 | After in ... then ... [no-match] | case.rb:42:3:44:5 | After case ... | | | case.rb:43:5:43:22 | in ... then ... | case.rb:43:8:43:21 | [ *,...,* ] | | -| case.rb:43:8:43:21 | [ *,...,* ] | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:43:8:43:21 | [ *,...,* ] | case.rb:43:10:43:10 | x | false, match, true | +| case.rb:43:8:43:21 | After [ *,...,* ] [match] | case.rb:43:5:43:22 | After in ... then ... [match] | match | +| case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | case.rb:43:5:43:22 | After in ... then ... [no-match] | no-match | +| case.rb:43:8:43:21 | [ *,...,* ] | case.rb:43:10:43:10 | x | | | case.rb:43:10:43:10 | x | case.rb:43:13:43:13 | 1 | | -| case.rb:43:13:43:13 | 1 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:43:13:43:13 | 1 | case.rb:43:16:43:16 | 2 | match | -| case.rb:43:16:43:16 | 2 | case.rb:41:1:45:3 | exit case_match_find (abnormal) | exception | -| case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | match | -| case.rb:43:20:43:20 | y | case.rb:42:3:44:5 | case ... | | +| case.rb:43:13:43:13 | 1 | case.rb:43:16:43:16 | 2 | | +| case.rb:43:16:43:16 | 2 | case.rb:43:20:43:20 | y | | +| case.rb:43:20:43:20 | y | case.rb:43:8:43:21 | After [ *,...,* ] [match] | match | +| case.rb:43:20:43:20 | y | case.rb:43:8:43:21 | After [ *,...,* ] [no-match] | no-match | +| case.rb:47:1:53:3 | Entry | case.rb:47:21:47:25 | value | | +| case.rb:47:1:53:3 | Normal Exit | case.rb:47:1:53:3 | Exit | | | case.rb:47:1:53:3 | case_match_hash | case.rb:55:1:61:3 | case_match_variable | | -| case.rb:47:1:53:3 | enter case_match_hash | case.rb:47:21:47:25 | value | | -| case.rb:47:1:53:3 | exit case_match_hash (abnormal) | case.rb:47:1:53:3 | exit case_match_hash | | -| case.rb:47:1:53:3 | exit case_match_hash (normal) | case.rb:47:1:53:3 | exit case_match_hash | | -| case.rb:47:21:47:25 | value | case.rb:48:8:48:12 | value | | -| case.rb:48:3:52:5 | case ... | case.rb:47:1:53:3 | exit case_match_hash (normal) | | +| case.rb:47:21:47:25 | value | case.rb:48:3:52:5 | ... | | +| case.rb:48:3:52:5 | ... | case.rb:48:3:52:5 | case ... | | +| case.rb:48:3:52:5 | After ... | case.rb:47:1:53:3 | Normal Exit | | +| case.rb:48:3:52:5 | After case ... | case.rb:48:3:52:5 | After ... | | +| case.rb:48:3:52:5 | case ... | case.rb:48:8:48:12 | value | | | case.rb:48:8:48:12 | value | case.rb:49:5:49:35 | in ... then ... | | -| case.rb:49:5:49:35 | in ... then ... | case.rb:49:8:49:10 | Foo | | +| case.rb:49:5:49:35 | After in ... then ... [match] | case.rb:48:3:52:5 | After case ... | | +| case.rb:49:5:49:35 | After in ... then ... [no-match] | case.rb:50:5:50:25 | in ... then ... | | +| case.rb:49:5:49:35 | in ... then ... | case.rb:49:8:49:34 | { ..., ** } | | | case.rb:49:8:49:10 | Foo | case.rb:49:8:49:15 | Bar | | -| case.rb:49:8:49:15 | Bar | case.rb:49:8:49:34 | { ..., ** } | match | -| case.rb:49:8:49:15 | Bar | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:20:49:20 | 1 | false, match, true | -| case.rb:49:8:49:34 | { ..., ** } | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:20:49:20 | 1 | case.rb:49:23:49:23 | a | match | -| case.rb:49:20:49:20 | 1 | case.rb:50:5:50:25 | in ... then ... | no-match | -| case.rb:49:23:49:23 | a | case.rb:49:29:49:32 | rest | match | -| case.rb:49:29:49:32 | rest | case.rb:48:3:52:5 | case ... | | -| case.rb:50:5:50:25 | in ... then ... | case.rb:50:8:50:10 | Bar | | -| case.rb:50:8:50:10 | Bar | case.rb:50:8:50:24 | { ..., ** } | match | -| case.rb:50:8:50:10 | Bar | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:16:50:16 | 1 | false, match, true | -| case.rb:50:8:50:24 | { ..., ** } | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:50:16:50:16 | 1 | case.rb:48:3:52:5 | case ... | match | -| case.rb:50:16:50:16 | 1 | case.rb:51:5:51:17 | in ... then ... | no-match | -| case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:10 | Bar | | -| case.rb:51:8:51:10 | Bar | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | -| case.rb:51:8:51:10 | Bar | case.rb:51:8:51:16 | { ..., ** } | match | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:47:1:53:3 | exit case_match_hash (abnormal) | exception | -| case.rb:51:8:51:16 | { ..., ** } | case.rb:48:3:52:5 | case ... | false, match, true | +| case.rb:49:8:49:15 | After Bar | case.rb:49:18:49:18 | Before :x | | +| case.rb:49:8:49:15 | Bar | case.rb:49:8:49:15 | After Bar | | +| case.rb:49:8:49:15 | Before Bar | case.rb:49:8:49:10 | Foo | | +| case.rb:49:8:49:34 | After { ..., ** } [match] | case.rb:49:5:49:35 | After in ... then ... [match] | match | +| case.rb:49:8:49:34 | After { ..., ** } [no-match] | case.rb:49:5:49:35 | After in ... then ... [no-match] | no-match | +| case.rb:49:8:49:34 | { ..., ** } | case.rb:49:8:49:15 | Before Bar | | +| case.rb:49:18:49:18 | :x | case.rb:49:18:49:18 | After :x | | +| case.rb:49:18:49:18 | After :x | case.rb:49:20:49:20 | 1 | | +| case.rb:49:18:49:18 | Before :x | case.rb:49:18:49:18 | x | | +| case.rb:49:18:49:18 | x | case.rb:49:18:49:18 | :x | | +| case.rb:49:20:49:20 | 1 | case.rb:49:23:49:23 | Before :a | | +| case.rb:49:23:49:23 | :a | case.rb:49:23:49:23 | After :a | | +| case.rb:49:23:49:23 | After :a | case.rb:49:23:49:23 | a | | +| case.rb:49:23:49:23 | Before :a | case.rb:49:23:49:23 | a | | +| case.rb:49:23:49:23 | a | case.rb:49:23:49:23 | :a | | +| case.rb:49:23:49:23 | a | case.rb:49:29:49:32 | rest | | +| case.rb:49:29:49:32 | rest | case.rb:49:8:49:34 | After { ..., ** } [match] | match | +| case.rb:49:29:49:32 | rest | case.rb:49:8:49:34 | After { ..., ** } [no-match] | no-match | +| case.rb:50:5:50:25 | After in ... then ... [match] | case.rb:48:3:52:5 | After case ... | | +| case.rb:50:5:50:25 | After in ... then ... [no-match] | case.rb:51:5:51:17 | in ... then ... | | +| case.rb:50:5:50:25 | in ... then ... | case.rb:50:8:50:24 | { ..., ** } | | +| case.rb:50:8:50:10 | Bar | case.rb:50:13:50:13 | Before :a | | +| case.rb:50:8:50:24 | After { ..., ** } [match] | case.rb:50:5:50:25 | After in ... then ... [match] | match | +| case.rb:50:8:50:24 | After { ..., ** } [no-match] | case.rb:50:5:50:25 | After in ... then ... [no-match] | no-match | +| case.rb:50:8:50:24 | { ..., ** } | case.rb:50:8:50:10 | Bar | | +| case.rb:50:13:50:13 | :a | case.rb:50:13:50:13 | After :a | | +| case.rb:50:13:50:13 | After :a | case.rb:50:16:50:16 | 1 | | +| case.rb:50:13:50:13 | Before :a | case.rb:50:13:50:13 | a | | +| case.rb:50:13:50:13 | a | case.rb:50:13:50:13 | :a | | +| case.rb:50:16:50:16 | 1 | case.rb:50:8:50:24 | After { ..., ** } [match] | match | +| case.rb:50:16:50:16 | 1 | case.rb:50:8:50:24 | After { ..., ** } [no-match] | no-match | +| case.rb:51:5:51:17 | After in ... then ... [match] | case.rb:48:3:52:5 | After case ... | | +| case.rb:51:5:51:17 | After in ... then ... [no-match] | case.rb:48:3:52:5 | After case ... | | +| case.rb:51:5:51:17 | in ... then ... | case.rb:51:8:51:16 | { ..., ** } | | +| case.rb:51:8:51:10 | Bar | case.rb:51:8:51:16 | After { ..., ** } [match] | match | +| case.rb:51:8:51:10 | Bar | case.rb:51:8:51:16 | After { ..., ** } [no-match] | no-match | +| case.rb:51:8:51:16 | After { ..., ** } [match] | case.rb:51:5:51:17 | After in ... then ... [match] | match | +| case.rb:51:8:51:16 | After { ..., ** } [no-match] | case.rb:51:5:51:17 | After in ... then ... [no-match] | no-match | +| case.rb:51:8:51:16 | { ..., ** } | case.rb:51:8:51:10 | Bar | | +| case.rb:55:1:61:3 | Entry | case.rb:55:25:55:29 | value | | +| case.rb:55:1:61:3 | Normal Exit | case.rb:55:1:61:3 | Exit | | | case.rb:55:1:61:3 | case_match_variable | case.rb:63:1:67:3 | case_match_underscore | | -| case.rb:55:1:61:3 | enter case_match_variable | case.rb:55:25:55:29 | value | | -| case.rb:55:1:61:3 | exit case_match_variable (normal) | case.rb:55:1:61:3 | exit case_match_variable | | -| case.rb:55:25:55:29 | value | case.rb:56:8:56:12 | value | | -| case.rb:56:3:60:5 | case ... | case.rb:55:1:61:3 | exit case_match_variable (normal) | | +| case.rb:55:25:55:29 | value | case.rb:56:3:60:5 | ... | | +| case.rb:56:3:60:5 | ... | case.rb:56:3:60:5 | case ... | | +| case.rb:56:3:60:5 | After ... | case.rb:55:1:61:3 | Normal Exit | | +| case.rb:56:3:60:5 | After case ... | case.rb:56:3:60:5 | After ... | | +| case.rb:56:3:60:5 | case ... | case.rb:56:8:56:12 | value | | | case.rb:56:8:56:12 | value | case.rb:57:5:57:8 | in ... then ... | | +| case.rb:57:5:57:8 | After in ... then ... [match] | case.rb:56:3:60:5 | After case ... | | +| case.rb:57:5:57:8 | After in ... then ... [no-match] | case.rb:58:5:58:10 | in ... then ... | | | case.rb:57:5:57:8 | in ... then ... | case.rb:57:8:57:8 | 5 | | -| case.rb:57:8:57:8 | 5 | case.rb:56:3:60:5 | case ... | match | -| case.rb:57:8:57:8 | 5 | case.rb:58:5:58:10 | in ... then ... | no-match | +| case.rb:57:8:57:8 | 5 | case.rb:57:8:57:8 | After 5 [match] | match | +| case.rb:57:8:57:8 | 5 | case.rb:57:8:57:8 | After 5 [no-match] | no-match | +| case.rb:57:8:57:8 | After 5 [match] | case.rb:57:5:57:8 | After in ... then ... [match] | match | +| case.rb:57:8:57:8 | After 5 [no-match] | case.rb:57:5:57:8 | After in ... then ... [no-match] | no-match | +| case.rb:58:5:58:10 | After in ... then ... [match] | case.rb:56:3:60:5 | After case ... | | +| case.rb:58:5:58:10 | After in ... then ... [no-match] | case.rb:59:5:59:20 | in ... then ... | | | case.rb:58:5:58:10 | in ... then ... | case.rb:58:8:58:10 | var | | -| case.rb:58:8:58:10 | var | case.rb:56:3:60:5 | case ... | match | +| case.rb:58:8:58:10 | After var [match] | case.rb:58:5:58:10 | After in ... then ... [match] | match | +| case.rb:58:8:58:10 | After var [no-match] | case.rb:58:5:58:10 | After in ... then ... [no-match] | no-match | +| case.rb:58:8:58:10 | var | case.rb:58:8:58:10 | After var [match] | match | +| case.rb:58:8:58:10 | var | case.rb:58:8:58:10 | After var [no-match] | no-match | +| case.rb:59:5:59:20 | After in ... then ... [match] | case.rb:56:3:60:5 | After case ... | | +| case.rb:59:5:59:20 | After in ... then ... [no-match] | case.rb:56:3:60:5 | After case ... | | +| case.rb:59:5:59:20 | in ... then ... | case.rb:59:8:59:20 | Before "unreachable" | | +| case.rb:59:8:59:20 | "unreachable" | case.rb:59:8:59:20 | After "unreachable" [match] | match | +| case.rb:59:8:59:20 | "unreachable" | case.rb:59:8:59:20 | After "unreachable" [no-match] | no-match | +| case.rb:59:8:59:20 | After "unreachable" [match] | case.rb:59:5:59:20 | After in ... then ... [match] | match | +| case.rb:59:8:59:20 | After "unreachable" [no-match] | case.rb:59:5:59:20 | After in ... then ... [no-match] | no-match | +| case.rb:59:8:59:20 | Before "unreachable" | case.rb:59:9:59:19 | unreachable | | +| case.rb:59:9:59:19 | unreachable | case.rb:59:8:59:20 | "unreachable" | | +| case.rb:63:1:67:3 | Entry | case.rb:63:27:63:31 | value | | +| case.rb:63:1:67:3 | Normal Exit | case.rb:63:1:67:3 | Exit | | | case.rb:63:1:67:3 | case_match_underscore | case.rb:69:1:93:3 | case_match_various | | -| case.rb:63:1:67:3 | enter case_match_underscore | case.rb:63:27:63:31 | value | | -| case.rb:63:1:67:3 | exit case_match_underscore (normal) | case.rb:63:1:67:3 | exit case_match_underscore | | -| case.rb:63:27:63:31 | value | case.rb:64:8:64:12 | value | | -| case.rb:64:3:66:5 | case ... | case.rb:63:1:67:3 | exit case_match_underscore (normal) | | +| case.rb:63:27:63:31 | value | case.rb:64:3:66:5 | ... | | +| case.rb:64:3:66:5 | ... | case.rb:64:3:66:5 | case ... | | +| case.rb:64:3:66:5 | After ... | case.rb:63:1:67:3 | Normal Exit | | +| case.rb:64:3:66:5 | After case ... | case.rb:64:3:66:5 | After ... | | +| case.rb:64:3:66:5 | case ... | case.rb:64:8:64:12 | value | | | case.rb:64:8:64:12 | value | case.rb:65:5:65:28 | in ... then ... | | +| case.rb:65:5:65:28 | After in ... then ... [match] | case.rb:64:3:66:5 | After case ... | | +| case.rb:65:5:65:28 | After in ... then ... [no-match] | case.rb:64:3:66:5 | After case ... | | | case.rb:65:5:65:28 | in ... then ... | case.rb:65:8:65:28 | ... \| ... | | -| case.rb:65:8:65:8 | 5 | case.rb:64:3:66:5 | case ... | match | -| case.rb:65:8:65:8 | 5 | case.rb:65:12:65:12 | _ | no-match | +| case.rb:65:8:65:8 | 5 | case.rb:65:12:65:12 | _ | | | case.rb:65:8:65:28 | ... \| ... | case.rb:65:8:65:8 | 5 | | -| case.rb:65:12:65:12 | _ | case.rb:64:3:66:5 | case ... | match | +| case.rb:65:8:65:28 | After ... \| ... [match] | case.rb:65:5:65:28 | After in ... then ... [match] | match | +| case.rb:65:8:65:28 | After ... \| ... [no-match] | case.rb:65:5:65:28 | After in ... then ... [no-match] | no-match | +| case.rb:65:12:65:12 | _ | case.rb:65:16:65:28 | Before "unreachable" | | +| case.rb:65:16:65:28 | "unreachable" | case.rb:65:16:65:28 | After "unreachable" | | +| case.rb:65:16:65:28 | After "unreachable" | case.rb:65:8:65:28 | After ... \| ... [match] | match | +| case.rb:65:16:65:28 | After "unreachable" | case.rb:65:8:65:28 | After ... \| ... [no-match] | no-match | +| case.rb:65:16:65:28 | Before "unreachable" | case.rb:65:17:65:27 | unreachable | | +| case.rb:65:17:65:27 | unreachable | case.rb:65:16:65:28 | "unreachable" | | +| case.rb:69:1:93:3 | Entry | case.rb:69:24:69:28 | value | | +| case.rb:69:1:93:3 | Normal Exit | case.rb:69:1:93:3 | Exit | | | case.rb:69:1:93:3 | case_match_various | case.rb:95:1:99:3 | case_match_guard_no_else | | -| case.rb:69:1:93:3 | enter case_match_various | case.rb:69:24:69:28 | value | | -| case.rb:69:1:93:3 | exit case_match_various (abnormal) | case.rb:69:1:93:3 | exit case_match_various | | -| case.rb:69:1:93:3 | exit case_match_various (normal) | case.rb:69:1:93:3 | exit case_match_various | | -| case.rb:69:24:69:28 | value | case.rb:70:3:70:5 | foo | | +| case.rb:69:24:69:28 | value | case.rb:70:3:92:5 | ... | | | case.rb:70:3:70:5 | foo | case.rb:70:9:70:10 | 42 | | -| case.rb:70:3:70:10 | ... = ... | case.rb:72:8:72:12 | value | | +| case.rb:70:3:70:10 | ... = ... | case.rb:70:3:70:10 | After ... = ... | | +| case.rb:70:3:70:10 | After ... = ... | case.rb:72:3:92:5 | case ... | | +| case.rb:70:3:70:10 | Before ... = ... | case.rb:70:3:70:5 | foo | | +| case.rb:70:3:92:5 | ... | case.rb:70:3:70:10 | Before ... = ... | | +| case.rb:70:3:92:5 | After ... | case.rb:69:1:93:3 | Normal Exit | | | case.rb:70:9:70:10 | 42 | case.rb:70:3:70:10 | ... = ... | | -| case.rb:72:3:92:5 | case ... | case.rb:69:1:93:3 | exit case_match_various (normal) | | +| case.rb:72:3:92:5 | After case ... | case.rb:70:3:92:5 | After ... | | +| case.rb:72:3:92:5 | case ... | case.rb:72:8:72:12 | value | | | case.rb:72:8:72:12 | value | case.rb:73:5:73:8 | in ... then ... | | +| case.rb:73:5:73:8 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:73:5:73:8 | After in ... then ... [no-match] | case.rb:74:5:74:11 | in ... then ... | | | case.rb:73:5:73:8 | in ... then ... | case.rb:73:8:73:8 | 5 | | -| case.rb:73:8:73:8 | 5 | case.rb:72:3:92:5 | case ... | match | -| case.rb:73:8:73:8 | 5 | case.rb:74:5:74:11 | in ... then ... | no-match | +| case.rb:73:8:73:8 | 5 | case.rb:73:8:73:8 | After 5 [match] | match | +| case.rb:73:8:73:8 | 5 | case.rb:73:8:73:8 | After 5 [no-match] | no-match | +| case.rb:73:8:73:8 | After 5 [match] | case.rb:73:5:73:8 | After in ... then ... [match] | match | +| case.rb:73:8:73:8 | After 5 [no-match] | case.rb:73:5:73:8 | After in ... then ... [no-match] | no-match | +| case.rb:74:5:74:11 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:74:5:74:11 | After in ... then ... [no-match] | case.rb:75:5:75:15 | in ... then ... | | | case.rb:74:5:74:11 | in ... then ... | case.rb:74:8:74:11 | ^... | | +| case.rb:74:8:74:11 | After ^... [match] | case.rb:74:5:74:11 | After in ... then ... [match] | match | +| case.rb:74:8:74:11 | After ^... [no-match] | case.rb:74:5:74:11 | After in ... then ... [no-match] | no-match | | case.rb:74:8:74:11 | ^... | case.rb:74:9:74:11 | foo | | -| case.rb:74:9:74:11 | foo | case.rb:72:3:92:5 | case ... | match | -| case.rb:74:9:74:11 | foo | case.rb:75:5:75:15 | in ... then ... | no-match | -| case.rb:75:5:75:15 | in ... then ... | case.rb:75:9:75:14 | string | | -| case.rb:75:8:75:15 | "string" | case.rb:72:3:92:5 | case ... | match | -| case.rb:75:8:75:15 | "string" | case.rb:76:5:76:18 | in ... then ... | no-match | +| case.rb:74:9:74:11 | foo | case.rb:74:8:74:11 | After ^... [match] | match | +| case.rb:74:9:74:11 | foo | case.rb:74:8:74:11 | After ^... [no-match] | no-match | +| case.rb:75:5:75:15 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:75:5:75:15 | After in ... then ... [no-match] | case.rb:76:5:76:18 | in ... then ... | | +| case.rb:75:5:75:15 | in ... then ... | case.rb:75:8:75:15 | Before "string" | | +| case.rb:75:8:75:15 | "string" | case.rb:75:8:75:15 | After "string" [match] | match | +| case.rb:75:8:75:15 | "string" | case.rb:75:8:75:15 | After "string" [no-match] | no-match | +| case.rb:75:8:75:15 | After "string" [match] | case.rb:75:5:75:15 | After in ... then ... [match] | match | +| case.rb:75:8:75:15 | After "string" [no-match] | case.rb:75:5:75:15 | After in ... then ... [no-match] | no-match | +| case.rb:75:8:75:15 | Before "string" | case.rb:75:9:75:14 | string | | | case.rb:75:9:75:14 | string | case.rb:75:8:75:15 | "string" | | -| case.rb:76:5:76:18 | in ... then ... | case.rb:76:8:76:18 | Array | | -| case.rb:76:8:76:18 | Array | case.rb:76:11:76:13 | foo | | -| case.rb:76:8:76:18 | call to [] | case.rb:72:3:92:5 | case ... | match | -| case.rb:76:8:76:18 | call to [] | case.rb:77:5:77:18 | in ... then ... | no-match | -| case.rb:76:11:76:13 | "foo" | case.rb:76:15:76:17 | bar | | +| case.rb:76:5:76:18 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:76:5:76:18 | After in ... then ... [no-match] | case.rb:77:5:77:18 | in ... then ... | | +| case.rb:76:5:76:18 | in ... then ... | case.rb:76:8:76:18 | Before call to [] | | +| case.rb:76:8:76:18 | After call to [] [match] | case.rb:76:5:76:18 | After in ... then ... [match] | match | +| case.rb:76:8:76:18 | After call to [] [no-match] | case.rb:76:5:76:18 | After in ... then ... [no-match] | no-match | +| case.rb:76:8:76:18 | Array | case.rb:76:11:76:13 | Before "foo" | | +| case.rb:76:8:76:18 | Before call to [] | case.rb:76:8:76:18 | Array | | +| case.rb:76:8:76:18 | call to [] | case.rb:76:8:76:18 | After call to [] [match] | match | +| case.rb:76:8:76:18 | call to [] | case.rb:76:8:76:18 | After call to [] [no-match] | no-match | +| case.rb:76:11:76:13 | "foo" | case.rb:76:11:76:13 | After "foo" | | +| case.rb:76:11:76:13 | After "foo" | case.rb:76:15:76:17 | Before "bar" | | +| case.rb:76:11:76:13 | Before "foo" | case.rb:76:11:76:13 | foo | | | case.rb:76:11:76:13 | foo | case.rb:76:11:76:13 | "foo" | | -| case.rb:76:15:76:17 | "bar" | case.rb:76:8:76:18 | call to [] | | +| case.rb:76:15:76:17 | "bar" | case.rb:76:15:76:17 | After "bar" | | +| case.rb:76:15:76:17 | After "bar" | case.rb:76:8:76:18 | call to [] | | +| case.rb:76:15:76:17 | Before "bar" | case.rb:76:15:76:17 | bar | | | case.rb:76:15:76:17 | bar | case.rb:76:15:76:17 | "bar" | | -| case.rb:77:5:77:18 | in ... then ... | case.rb:77:8:77:18 | Array | | -| case.rb:77:8:77:18 | Array | case.rb:77:11:77:13 | foo | | -| case.rb:77:8:77:18 | call to [] | case.rb:72:3:92:5 | case ... | match | -| case.rb:77:8:77:18 | call to [] | case.rb:78:5:78:19 | in ... then ... | no-match | -| case.rb:77:11:77:13 | :"foo" | case.rb:77:15:77:17 | bar | | +| case.rb:77:5:77:18 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:77:5:77:18 | After in ... then ... [no-match] | case.rb:78:5:78:19 | in ... then ... | | +| case.rb:77:5:77:18 | in ... then ... | case.rb:77:8:77:18 | Before call to [] | | +| case.rb:77:8:77:18 | After call to [] [match] | case.rb:77:5:77:18 | After in ... then ... [match] | match | +| case.rb:77:8:77:18 | After call to [] [no-match] | case.rb:77:5:77:18 | After in ... then ... [no-match] | no-match | +| case.rb:77:8:77:18 | Array | case.rb:77:11:77:13 | Before :"foo" | | +| case.rb:77:8:77:18 | Before call to [] | case.rb:77:8:77:18 | Array | | +| case.rb:77:8:77:18 | call to [] | case.rb:77:8:77:18 | After call to [] [match] | match | +| case.rb:77:8:77:18 | call to [] | case.rb:77:8:77:18 | After call to [] [no-match] | no-match | +| case.rb:77:11:77:13 | :"foo" | case.rb:77:11:77:13 | After :"foo" | | +| case.rb:77:11:77:13 | After :"foo" | case.rb:77:15:77:17 | Before :"bar" | | +| case.rb:77:11:77:13 | Before :"foo" | case.rb:77:11:77:13 | foo | | | case.rb:77:11:77:13 | foo | case.rb:77:11:77:13 | :"foo" | | -| case.rb:77:15:77:17 | :"bar" | case.rb:77:8:77:18 | call to [] | | +| case.rb:77:15:77:17 | :"bar" | case.rb:77:15:77:17 | After :"bar" | | +| case.rb:77:15:77:17 | After :"bar" | case.rb:77:8:77:18 | call to [] | | +| case.rb:77:15:77:17 | Before :"bar" | case.rb:77:15:77:17 | bar | | | case.rb:77:15:77:17 | bar | case.rb:77:15:77:17 | :"bar" | | -| case.rb:78:5:78:19 | in ... then ... | case.rb:78:9:78:18 | .*abc[0-9] | | -| case.rb:78:8:78:19 | /.*abc[0-9]/ | case.rb:72:3:92:5 | case ... | match | -| case.rb:78:8:78:19 | /.*abc[0-9]/ | case.rb:79:5:79:14 | in ... then ... | no-match | +| case.rb:78:5:78:19 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:78:5:78:19 | After in ... then ... [no-match] | case.rb:79:5:79:14 | in ... then ... | | +| case.rb:78:5:78:19 | in ... then ... | case.rb:78:8:78:19 | Before /.*abc[0-9]/ | | +| case.rb:78:8:78:19 | /.*abc[0-9]/ | case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | match | +| case.rb:78:8:78:19 | /.*abc[0-9]/ | case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | no-match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [match] | case.rb:78:5:78:19 | After in ... then ... [match] | match | +| case.rb:78:8:78:19 | After /.*abc[0-9]/ [no-match] | case.rb:78:5:78:19 | After in ... then ... [no-match] | no-match | +| case.rb:78:8:78:19 | Before /.*abc[0-9]/ | case.rb:78:9:78:18 | .*abc[0-9] | | | case.rb:78:9:78:18 | .*abc[0-9] | case.rb:78:8:78:19 | /.*abc[0-9]/ | | -| case.rb:79:5:79:14 | in ... then ... | case.rb:79:8:79:8 | 5 | | +| case.rb:79:5:79:14 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:79:5:79:14 | After in ... then ... [no-match] | case.rb:80:5:80:12 | in ... then ... | | +| case.rb:79:5:79:14 | in ... then ... | case.rb:79:8:79:14 | Before _ .. _ | | | case.rb:79:8:79:8 | 5 | case.rb:79:13:79:14 | 10 | | -| case.rb:79:8:79:14 | _ .. _ | case.rb:72:3:92:5 | case ... | match | -| case.rb:79:8:79:14 | _ .. _ | case.rb:80:5:80:12 | in ... then ... | no-match | +| case.rb:79:8:79:14 | After _ .. _ [match] | case.rb:79:5:79:14 | After in ... then ... [match] | match | +| case.rb:79:8:79:14 | After _ .. _ [no-match] | case.rb:79:5:79:14 | After in ... then ... [no-match] | no-match | +| case.rb:79:8:79:14 | Before _ .. _ | case.rb:79:8:79:8 | 5 | | +| case.rb:79:8:79:14 | _ .. _ | case.rb:79:8:79:14 | After _ .. _ [match] | match | +| case.rb:79:8:79:14 | _ .. _ | case.rb:79:8:79:14 | After _ .. _ [no-match] | no-match | | case.rb:79:13:79:14 | 10 | case.rb:79:8:79:14 | _ .. _ | | -| case.rb:80:5:80:12 | in ... then ... | case.rb:80:11:80:12 | 10 | | -| case.rb:80:8:80:12 | _ .. _ | case.rb:72:3:92:5 | case ... | match | -| case.rb:80:8:80:12 | _ .. _ | case.rb:81:5:81:11 | in ... then ... | no-match | +| case.rb:80:5:80:12 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:80:5:80:12 | After in ... then ... [no-match] | case.rb:81:5:81:11 | in ... then ... | | +| case.rb:80:5:80:12 | in ... then ... | case.rb:80:8:80:12 | Before _ .. _ | | +| case.rb:80:8:80:12 | After _ .. _ [match] | case.rb:80:5:80:12 | After in ... then ... [match] | match | +| case.rb:80:8:80:12 | After _ .. _ [no-match] | case.rb:80:5:80:12 | After in ... then ... [no-match] | no-match | +| case.rb:80:8:80:12 | Before _ .. _ | case.rb:80:11:80:12 | 10 | | +| case.rb:80:8:80:12 | _ .. _ | case.rb:80:8:80:12 | After _ .. _ [match] | match | +| case.rb:80:8:80:12 | _ .. _ | case.rb:80:8:80:12 | After _ .. _ [no-match] | no-match | | case.rb:80:11:80:12 | 10 | case.rb:80:8:80:12 | _ .. _ | | -| case.rb:81:5:81:11 | in ... then ... | case.rb:81:8:81:8 | 5 | | +| case.rb:81:5:81:11 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:81:5:81:11 | After in ... then ... [no-match] | case.rb:82:5:82:20 | in ... then ... | | +| case.rb:81:5:81:11 | in ... then ... | case.rb:81:8:81:11 | Before _ .. _ | | | case.rb:81:8:81:8 | 5 | case.rb:81:8:81:11 | _ .. _ | | -| case.rb:81:8:81:11 | _ .. _ | case.rb:72:3:92:5 | case ... | match | -| case.rb:81:8:81:11 | _ .. _ | case.rb:82:5:82:20 | in ... then ... | no-match | +| case.rb:81:8:81:11 | After _ .. _ [match] | case.rb:81:5:81:11 | After in ... then ... [match] | match | +| case.rb:81:8:81:11 | After _ .. _ [no-match] | case.rb:81:5:81:11 | After in ... then ... [no-match] | no-match | +| case.rb:81:8:81:11 | Before _ .. _ | case.rb:81:8:81:8 | 5 | | +| case.rb:81:8:81:11 | _ .. _ | case.rb:81:8:81:11 | After _ .. _ [match] | match | +| case.rb:81:8:81:11 | _ .. _ | case.rb:81:8:81:11 | After _ .. _ [no-match] | no-match | +| case.rb:82:5:82:20 | After in ... then ... [match] | case.rb:82:15:82:20 | then ... | | +| case.rb:82:5:82:20 | After in ... then ... [no-match] | case.rb:83:5:83:26 | in ... then ... | | | case.rb:82:5:82:20 | in ... then ... | case.rb:82:8:82:13 | ... => ... | | -| case.rb:82:8:82:8 | 5 | case.rb:82:13:82:13 | x | match | -| case.rb:82:8:82:8 | 5 | case.rb:83:5:83:26 | in ... then ... | no-match | +| case.rb:82:8:82:8 | 5 | case.rb:82:13:82:13 | x | | | case.rb:82:8:82:13 | ... => ... | case.rb:82:8:82:8 | 5 | | -| case.rb:82:13:82:13 | x | case.rb:82:20:82:20 | 1 | match | -| case.rb:82:15:82:20 | then ... | case.rb:72:3:92:5 | case ... | | -| case.rb:82:20:82:20 | 1 | case.rb:82:15:82:20 | then ... | | +| case.rb:82:8:82:13 | After ... => ... [match] | case.rb:82:5:82:20 | After in ... then ... [match] | match | +| case.rb:82:8:82:13 | After ... => ... [no-match] | case.rb:82:5:82:20 | After in ... then ... [no-match] | no-match | +| case.rb:82:13:82:13 | x | case.rb:82:8:82:13 | After ... => ... [match] | match | +| case.rb:82:13:82:13 | x | case.rb:82:8:82:13 | After ... => ... [no-match] | no-match | +| case.rb:82:15:82:20 | After then ... | case.rb:72:3:92:5 | After case ... | | +| case.rb:82:15:82:20 | then ... | case.rb:82:20:82:20 | 1 | | +| case.rb:82:20:82:20 | 1 | case.rb:82:15:82:20 | After then ... | | +| case.rb:83:5:83:26 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:83:5:83:26 | After in ... then ... [no-match] | case.rb:84:5:84:17 | in ... then ... | | | case.rb:83:5:83:26 | in ... then ... | case.rb:83:8:83:26 | ... \| ... | | -| case.rb:83:8:83:8 | 5 | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:8:83:8 | 5 | case.rb:83:12:83:15 | ^... | no-match | +| case.rb:83:8:83:8 | 5 | case.rb:83:12:83:15 | ^... | | | case.rb:83:8:83:26 | ... \| ... | case.rb:83:8:83:8 | 5 | | +| case.rb:83:8:83:26 | After ... \| ... [match] | case.rb:83:5:83:26 | After in ... then ... [match] | match | +| case.rb:83:8:83:26 | After ... \| ... [no-match] | case.rb:83:5:83:26 | After in ... then ... [no-match] | no-match | +| case.rb:83:12:83:15 | After ^... | case.rb:83:19:83:26 | Before "string" | | | case.rb:83:12:83:15 | ^... | case.rb:83:13:83:15 | foo | | -| case.rb:83:13:83:15 | foo | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:13:83:15 | foo | case.rb:83:20:83:25 | string | no-match | -| case.rb:83:19:83:26 | "string" | case.rb:72:3:92:5 | case ... | match | -| case.rb:83:19:83:26 | "string" | case.rb:84:5:84:17 | in ... then ... | no-match | +| case.rb:83:13:83:15 | foo | case.rb:83:12:83:15 | After ^... | | +| case.rb:83:19:83:26 | "string" | case.rb:83:19:83:26 | After "string" | | +| case.rb:83:19:83:26 | After "string" | case.rb:83:8:83:26 | After ... \| ... [match] | match | +| case.rb:83:19:83:26 | After "string" | case.rb:83:8:83:26 | After ... \| ... [no-match] | no-match | +| case.rb:83:19:83:26 | Before "string" | case.rb:83:20:83:25 | string | | | case.rb:83:20:83:25 | string | case.rb:83:19:83:26 | "string" | | -| case.rb:84:5:84:17 | in ... then ... | case.rb:84:8:84:12 | Foo | | +| case.rb:84:5:84:17 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:84:5:84:17 | After in ... then ... [no-match] | case.rb:85:5:85:23 | in ... then ... | | +| case.rb:84:5:84:17 | in ... then ... | case.rb:84:8:84:17 | Before Bar | | | case.rb:84:8:84:12 | Foo | case.rb:84:8:84:17 | Bar | | -| case.rb:84:8:84:17 | Bar | case.rb:72:3:92:5 | case ... | match | -| case.rb:84:8:84:17 | Bar | case.rb:85:5:85:23 | in ... then ... | no-match | +| case.rb:84:8:84:17 | After Bar [match] | case.rb:84:5:84:17 | After in ... then ... [match] | match | +| case.rb:84:8:84:17 | After Bar [no-match] | case.rb:84:5:84:17 | After in ... then ... [no-match] | no-match | +| case.rb:84:8:84:17 | Bar | case.rb:84:8:84:17 | After Bar [match] | match | +| case.rb:84:8:84:17 | Bar | case.rb:84:8:84:17 | After Bar [no-match] | no-match | +| case.rb:84:8:84:17 | Before Bar | case.rb:84:8:84:12 | Foo | | +| case.rb:85:5:85:23 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:85:5:85:23 | After in ... then ... [no-match] | case.rb:86:5:86:11 | in ... then ... | | | case.rb:85:5:85:23 | in ... then ... | case.rb:85:8:85:23 | -> { ... } | | -| case.rb:85:8:85:23 | -> { ... } | case.rb:72:3:92:5 | case ... | match | -| case.rb:85:8:85:23 | -> { ... } | case.rb:86:5:86:11 | in ... then ... | no-match | -| case.rb:85:8:85:23 | enter -> { ... } | case.rb:85:11:85:11 | x | | -| case.rb:85:8:85:23 | exit -> { ... } (normal) | case.rb:85:8:85:23 | exit -> { ... } | | -| case.rb:85:11:85:11 | x | case.rb:85:15:85:15 | x | | +| case.rb:85:8:85:23 | -> { ... } | case.rb:85:8:85:23 | After -> { ... } [match] | match | +| case.rb:85:8:85:23 | -> { ... } | case.rb:85:8:85:23 | After -> { ... } [no-match] | no-match | +| case.rb:85:8:85:23 | After -> { ... } [match] | case.rb:85:5:85:23 | After in ... then ... [match] | match | +| case.rb:85:8:85:23 | After -> { ... } [no-match] | case.rb:85:5:85:23 | After in ... then ... [no-match] | no-match | +| case.rb:85:8:85:23 | Entry | case.rb:85:11:85:11 | x | | +| case.rb:85:8:85:23 | Normal Exit | case.rb:85:8:85:23 | Exit | | +| case.rb:85:11:85:11 | x | case.rb:85:15:85:21 | ... | | | case.rb:85:15:85:15 | x | case.rb:85:20:85:21 | 10 | | -| case.rb:85:15:85:21 | ... == ... | case.rb:85:8:85:23 | exit -> { ... } (normal) | | +| case.rb:85:15:85:21 | ... | case.rb:85:15:85:21 | Before ... == ... | | +| case.rb:85:15:85:21 | ... == ... | case.rb:85:15:85:21 | After ... == ... | | +| case.rb:85:15:85:21 | After ... | case.rb:85:8:85:23 | Normal Exit | | +| case.rb:85:15:85:21 | After ... == ... | case.rb:85:15:85:21 | After ... | | +| case.rb:85:15:85:21 | Before ... == ... | case.rb:85:15:85:15 | x | | | case.rb:85:20:85:21 | 10 | case.rb:85:15:85:21 | ... == ... | | -| case.rb:86:5:86:11 | in ... then ... | case.rb:86:8:86:11 | foo | | -| case.rb:86:8:86:11 | :foo | case.rb:72:3:92:5 | case ... | match | -| case.rb:86:8:86:11 | :foo | case.rb:87:5:87:17 | in ... then ... | no-match | +| case.rb:86:5:86:11 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:86:5:86:11 | After in ... then ... [no-match] | case.rb:87:5:87:17 | in ... then ... | | +| case.rb:86:5:86:11 | in ... then ... | case.rb:86:8:86:11 | Before :foo | | +| case.rb:86:8:86:11 | :foo | case.rb:86:8:86:11 | After :foo [match] | match | +| case.rb:86:8:86:11 | :foo | case.rb:86:8:86:11 | After :foo [no-match] | no-match | +| case.rb:86:8:86:11 | After :foo [match] | case.rb:86:5:86:11 | After in ... then ... [match] | match | +| case.rb:86:8:86:11 | After :foo [no-match] | case.rb:86:5:86:11 | After in ... then ... [no-match] | no-match | +| case.rb:86:8:86:11 | Before :foo | case.rb:86:8:86:11 | foo | | | case.rb:86:8:86:11 | foo | case.rb:86:8:86:11 | :foo | | -| case.rb:87:5:87:17 | in ... then ... | case.rb:87:10:87:16 | foo bar | | -| case.rb:87:8:87:17 | :"foo bar" | case.rb:72:3:92:5 | case ... | match | -| case.rb:87:8:87:17 | :"foo bar" | case.rb:88:5:88:15 | in ... then ... | no-match | +| case.rb:87:5:87:17 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:87:5:87:17 | After in ... then ... [no-match] | case.rb:88:5:88:15 | in ... then ... | | +| case.rb:87:5:87:17 | in ... then ... | case.rb:87:8:87:17 | Before :"foo bar" | | +| case.rb:87:8:87:17 | :"foo bar" | case.rb:87:8:87:17 | After :"foo bar" [match] | match | +| case.rb:87:8:87:17 | :"foo bar" | case.rb:87:8:87:17 | After :"foo bar" [no-match] | no-match | +| case.rb:87:8:87:17 | After :"foo bar" [match] | case.rb:87:5:87:17 | After in ... then ... [match] | match | +| case.rb:87:8:87:17 | After :"foo bar" [no-match] | case.rb:87:5:87:17 | After in ... then ... [no-match] | no-match | +| case.rb:87:8:87:17 | Before :"foo bar" | case.rb:87:10:87:16 | foo bar | | | case.rb:87:10:87:16 | foo bar | case.rb:87:8:87:17 | :"foo bar" | | +| case.rb:88:5:88:15 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:88:5:88:15 | After in ... then ... [no-match] | case.rb:89:5:89:69 | in ... then ... | | | case.rb:88:5:88:15 | in ... then ... | case.rb:88:8:88:15 | ... \| ... | | -| case.rb:88:8:88:9 | - ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:88:8:88:9 | - ... | case.rb:88:14:88:15 | 10 | no-match | -| case.rb:88:8:88:15 | ... \| ... | case.rb:88:9:88:9 | 5 | | +| case.rb:88:8:88:9 | - ... | case.rb:88:8:88:9 | After - ... | | +| case.rb:88:8:88:9 | After - ... | case.rb:88:13:88:15 | Before + ... | | +| case.rb:88:8:88:9 | Before - ... | case.rb:88:9:88:9 | 5 | | +| case.rb:88:8:88:15 | ... \| ... | case.rb:88:8:88:9 | Before - ... | | +| case.rb:88:8:88:15 | After ... \| ... [match] | case.rb:88:5:88:15 | After in ... then ... [match] | match | +| case.rb:88:8:88:15 | After ... \| ... [no-match] | case.rb:88:5:88:15 | After in ... then ... [no-match] | no-match | | case.rb:88:9:88:9 | 5 | case.rb:88:8:88:9 | - ... | | -| case.rb:88:13:88:15 | + ... | case.rb:72:3:92:5 | case ... | match | -| case.rb:88:13:88:15 | + ... | case.rb:89:5:89:69 | in ... then ... | no-match | +| case.rb:88:13:88:15 | + ... | case.rb:88:13:88:15 | After + ... | | +| case.rb:88:13:88:15 | After + ... | case.rb:88:8:88:15 | After ... \| ... [match] | match | +| case.rb:88:13:88:15 | After + ... | case.rb:88:8:88:15 | After ... \| ... [no-match] | no-match | +| case.rb:88:13:88:15 | Before + ... | case.rb:88:14:88:15 | 10 | | | case.rb:88:14:88:15 | 10 | case.rb:88:13:88:15 | + ... | | +| case.rb:89:5:89:69 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:89:5:89:69 | After in ... then ... [no-match] | case.rb:90:5:90:13 | in ... then ... | | | case.rb:89:5:89:69 | in ... then ... | case.rb:89:8:89:69 | ... \| ... | | -| case.rb:89:8:89:10 | nil | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:8:89:10 | nil | case.rb:89:14:89:17 | self | no-match | +| case.rb:89:8:89:10 | nil | case.rb:89:14:89:17 | self | | | case.rb:89:8:89:69 | ... \| ... | case.rb:89:8:89:10 | nil | | -| case.rb:89:14:89:17 | self | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:14:89:17 | self | case.rb:89:21:89:24 | true | no-match | -| case.rb:89:21:89:24 | true | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:21:89:24 | true | case.rb:89:28:89:32 | false | no-match | -| case.rb:89:28:89:32 | false | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:28:89:32 | false | case.rb:89:36:89:43 | __LINE__ | no-match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:36:89:43 | __LINE__ | case.rb:89:47:89:54 | __FILE__ | no-match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:47:89:54 | __FILE__ | case.rb:89:58:89:69 | __ENCODING__ | no-match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:72:3:92:5 | case ... | match | -| case.rb:89:58:89:69 | __ENCODING__ | case.rb:90:5:90:13 | in ... then ... | no-match | +| case.rb:89:8:89:69 | After ... \| ... [match] | case.rb:89:5:89:69 | After in ... then ... [match] | match | +| case.rb:89:8:89:69 | After ... \| ... [no-match] | case.rb:89:5:89:69 | After in ... then ... [no-match] | no-match | +| case.rb:89:14:89:17 | self | case.rb:89:21:89:24 | true | | +| case.rb:89:21:89:24 | true | case.rb:89:28:89:32 | false | | +| case.rb:89:28:89:32 | false | case.rb:89:36:89:43 | __LINE__ | | +| case.rb:89:36:89:43 | __LINE__ | case.rb:89:47:89:54 | __FILE__ | | +| case.rb:89:47:89:54 | __FILE__ | case.rb:89:58:89:69 | __ENCODING__ | | +| case.rb:89:58:89:69 | __ENCODING__ | case.rb:89:8:89:69 | After ... \| ... [match] | match | +| case.rb:89:58:89:69 | __ENCODING__ | case.rb:89:8:89:69 | After ... \| ... [no-match] | no-match | +| case.rb:90:5:90:13 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:90:5:90:13 | After in ... then ... [no-match] | case.rb:91:5:91:25 | in ... then ... | | | case.rb:90:5:90:13 | in ... then ... | case.rb:90:8:90:13 | ( ... ) | | -| case.rb:90:8:90:13 | ( ... ) | case.rb:90:9:90:9 | 1 | | +| case.rb:90:8:90:13 | ( ... ) | case.rb:90:9:90:12 | Before _ .. _ | | +| case.rb:90:8:90:13 | After ( ... ) [match] | case.rb:90:5:90:13 | After in ... then ... [match] | match | +| case.rb:90:8:90:13 | After ( ... ) [no-match] | case.rb:90:5:90:13 | After in ... then ... [no-match] | no-match | | case.rb:90:9:90:9 | 1 | case.rb:90:9:90:12 | _ .. _ | | -| case.rb:90:9:90:12 | _ .. _ | case.rb:72:3:92:5 | case ... | match | -| case.rb:90:9:90:12 | _ .. _ | case.rb:91:5:91:25 | in ... then ... | no-match | +| case.rb:90:9:90:12 | After _ .. _ | case.rb:90:8:90:13 | After ( ... ) [match] | match | +| case.rb:90:9:90:12 | After _ .. _ | case.rb:90:8:90:13 | After ( ... ) [no-match] | no-match | +| case.rb:90:9:90:12 | Before _ .. _ | case.rb:90:9:90:9 | 1 | | +| case.rb:90:9:90:12 | _ .. _ | case.rb:90:9:90:12 | After _ .. _ | | +| case.rb:91:5:91:25 | After in ... then ... [match] | case.rb:72:3:92:5 | After case ... | | +| case.rb:91:5:91:25 | After in ... then ... [no-match] | case.rb:72:3:92:5 | After case ... | | | case.rb:91:5:91:25 | in ... then ... | case.rb:91:8:91:25 | ( ... ) | | | case.rb:91:8:91:25 | ( ... ) | case.rb:91:9:91:24 | ... \| ... | | -| case.rb:91:9:91:9 | 0 | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:9:91:9 | 0 | case.rb:91:13:91:14 | "" | no-match | +| case.rb:91:8:91:25 | After ( ... ) [match] | case.rb:91:5:91:25 | After in ... then ... [match] | match | +| case.rb:91:8:91:25 | After ( ... ) [no-match] | case.rb:91:5:91:25 | After in ... then ... [no-match] | no-match | +| case.rb:91:9:91:9 | 0 | case.rb:91:13:91:14 | "" | | | case.rb:91:9:91:24 | ... \| ... | case.rb:91:9:91:9 | 0 | | -| case.rb:91:13:91:14 | "" | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | no-match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:72:3:92:5 | case ... | match | -| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | no-match | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:69:1:93:3 | exit case_match_various (abnormal) | exception | -| case.rb:91:23:91:24 | { ..., ** } | case.rb:72:3:92:5 | case ... | false, match, true | -| case.rb:95:1:99:3 | case_match_guard_no_else | case.rb:1:1:99:4 | exit case.rb (normal) | | -| case.rb:95:1:99:3 | enter case_match_guard_no_else | case.rb:95:30:95:34 | value | | -| case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | case.rb:95:1:99:3 | exit case_match_guard_no_else | | -| case.rb:95:1:99:3 | exit case_match_guard_no_else (normal) | case.rb:95:1:99:3 | exit case_match_guard_no_else | | -| case.rb:95:30:95:34 | value | case.rb:96:8:96:12 | value | | -| case.rb:96:3:98:5 | case ... | case.rb:95:1:99:3 | exit case_match_guard_no_else (normal) | | +| case.rb:91:9:91:24 | After ... \| ... | case.rb:91:8:91:25 | After ( ... ) [match] | match | +| case.rb:91:9:91:24 | After ... \| ... | case.rb:91:8:91:25 | After ( ... ) [no-match] | no-match | +| case.rb:91:13:91:14 | "" | case.rb:91:18:91:19 | [ ..., * ] | | +| case.rb:91:18:91:19 | [ ..., * ] | case.rb:91:23:91:24 | { ..., ** } | | +| case.rb:91:23:91:24 | { ..., ** } | case.rb:91:9:91:24 | After ... \| ... | | +| case.rb:95:1:99:3 | Entry | case.rb:95:30:95:34 | value | | +| case.rb:95:1:99:3 | Normal Exit | case.rb:95:1:99:3 | Exit | | +| case.rb:95:1:99:3 | case_match_guard_no_else | case.rb:1:1:99:4 | Normal Exit | | +| case.rb:95:30:95:34 | value | case.rb:96:3:98:5 | ... | | +| case.rb:96:3:98:5 | ... | case.rb:96:3:98:5 | case ... | | +| case.rb:96:3:98:5 | After ... | case.rb:95:1:99:3 | Normal Exit | | +| case.rb:96:3:98:5 | After case ... | case.rb:96:3:98:5 | After ... | | +| case.rb:96:3:98:5 | case ... | case.rb:96:8:96:12 | value | | | case.rb:96:8:96:12 | value | case.rb:97:5:97:25 | in ... then ... | | +| case.rb:97:5:97:25 | After in ... then ... [match] | case.rb:97:13:97:18 | Before ... == ... | | +| case.rb:97:5:97:25 | After in ... then ... [no-match] | case.rb:96:3:98:5 | After case ... | | | case.rb:97:5:97:25 | in ... then ... | case.rb:97:8:97:8 | x | | -| case.rb:97:8:97:8 | x | case.rb:97:13:97:13 | x | match | +| case.rb:97:8:97:8 | After x [match] | case.rb:97:5:97:25 | After in ... then ... [match] | match | +| case.rb:97:8:97:8 | After x [no-match] | case.rb:97:5:97:25 | After in ... then ... [no-match] | no-match | +| case.rb:97:8:97:8 | x | case.rb:97:8:97:8 | After x [match] | match | +| case.rb:97:8:97:8 | x | case.rb:97:8:97:8 | After x [no-match] | no-match | | case.rb:97:13:97:13 | x | case.rb:97:18:97:18 | 5 | | -| case.rb:97:13:97:18 | ... == ... | case.rb:95:1:99:3 | exit case_match_guard_no_else (abnormal) | exception | -| case.rb:97:13:97:18 | ... == ... | case.rb:97:25:97:25 | 6 | true | +| case.rb:97:13:97:18 | ... == ... | case.rb:97:13:97:18 | After ... == ... [false] | false | +| case.rb:97:13:97:18 | ... == ... | case.rb:97:13:97:18 | After ... == ... [true] | true | +| case.rb:97:13:97:18 | After ... == ... [false] | case.rb:96:3:98:5 | After case ... | | +| case.rb:97:13:97:18 | After ... == ... [true] | case.rb:97:20:97:25 | then ... | | +| case.rb:97:13:97:18 | Before ... == ... | case.rb:97:13:97:13 | x | | | case.rb:97:18:97:18 | 5 | case.rb:97:13:97:18 | ... == ... | | -| case.rb:97:20:97:25 | then ... | case.rb:96:3:98:5 | case ... | | -| case.rb:97:25:97:25 | 6 | case.rb:97:20:97:25 | then ... | | -| cfg.html.erb:5:16:5:21 | @title | cfg.html.erb:6:9:6:58 | self | | +| case.rb:97:20:97:25 | After then ... | case.rb:96:3:98:5 | After case ... | | +| case.rb:97:20:97:25 | then ... | case.rb:97:25:97:25 | 6 | | +| case.rb:97:25:97:25 | 6 | case.rb:97:20:97:25 | After then ... | | +| cfg.html.erb:5:16:5:21 | @title | cfg.html.erb:5:16:5:21 | After @title | | +| cfg.html.erb:5:16:5:21 | After @title | cfg.html.erb:6:9:6:58 | Before call to stylesheet_link_tag | | +| cfg.html.erb:5:16:5:21 | Before @title | cfg.html.erb:5:16:5:21 | self | | | cfg.html.erb:5:16:5:21 | self | cfg.html.erb:5:16:5:21 | @title | | -| cfg.html.erb:5:16:31:12 | enter cfg.html.erb | cfg.html.erb:5:16:5:21 | self | | -| cfg.html.erb:5:16:31:12 | exit cfg.html.erb (normal) | cfg.html.erb:5:16:31:12 | exit cfg.html.erb | | -| cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | cfg.html.erb:12:11:12:33 | self | | -| cfg.html.erb:6:9:6:58 | self | cfg.html.erb:6:30:6:40 | application | | -| cfg.html.erb:6:29:6:41 | "application" | cfg.html.erb:6:44:6:49 | media | | +| cfg.html.erb:5:16:31:12 | Entry | cfg.html.erb:5:16:5:21 | Before @title | | +| cfg.html.erb:5:16:31:12 | Normal Exit | cfg.html.erb:5:16:31:12 | Exit | | +| cfg.html.erb:6:9:6:58 | After call to stylesheet_link_tag | cfg.html.erb:12:11:12:33 | Before call to link_to | | +| cfg.html.erb:6:9:6:58 | Before call to stylesheet_link_tag | cfg.html.erb:6:9:6:58 | self | | +| cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | cfg.html.erb:6:9:6:58 | After call to stylesheet_link_tag | | +| cfg.html.erb:6:9:6:58 | self | cfg.html.erb:6:29:6:41 | Before "application" | | +| cfg.html.erb:6:29:6:41 | "application" | cfg.html.erb:6:29:6:41 | After "application" | | +| cfg.html.erb:6:29:6:41 | After "application" | cfg.html.erb:6:44:6:58 | Before Pair | | +| cfg.html.erb:6:29:6:41 | Before "application" | cfg.html.erb:6:30:6:40 | application | | | cfg.html.erb:6:30:6:40 | application | cfg.html.erb:6:29:6:41 | "application" | | -| cfg.html.erb:6:44:6:49 | :media | cfg.html.erb:6:55:6:57 | all | | +| cfg.html.erb:6:44:6:49 | :media | cfg.html.erb:6:44:6:49 | After :media | | +| cfg.html.erb:6:44:6:49 | After :media | cfg.html.erb:6:54:6:58 | Before "all" | | +| cfg.html.erb:6:44:6:49 | Before :media | cfg.html.erb:6:44:6:49 | media | | | cfg.html.erb:6:44:6:49 | media | cfg.html.erb:6:44:6:49 | :media | | -| cfg.html.erb:6:44:6:58 | Pair | cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | | -| cfg.html.erb:6:54:6:58 | "all" | cfg.html.erb:6:44:6:58 | Pair | | +| cfg.html.erb:6:44:6:58 | After Pair | cfg.html.erb:6:9:6:58 | call to stylesheet_link_tag | | +| cfg.html.erb:6:44:6:58 | Before Pair | cfg.html.erb:6:44:6:49 | Before :media | | +| cfg.html.erb:6:44:6:58 | Pair | cfg.html.erb:6:44:6:58 | After Pair | | +| cfg.html.erb:6:54:6:58 | "all" | cfg.html.erb:6:54:6:58 | After "all" | | +| cfg.html.erb:6:54:6:58 | After "all" | cfg.html.erb:6:44:6:58 | Pair | | +| cfg.html.erb:6:54:6:58 | Before "all" | cfg.html.erb:6:55:6:57 | all | | | cfg.html.erb:6:55:6:57 | all | cfg.html.erb:6:54:6:58 | "all" | | -| cfg.html.erb:12:11:12:33 | call to link_to | cfg.html.erb:15:19:15:32 | self | | -| cfg.html.erb:12:11:12:33 | self | cfg.html.erb:12:20:12:20 | A | | -| cfg.html.erb:12:19:12:21 | "A" | cfg.html.erb:12:24:12:24 | self | | +| cfg.html.erb:12:11:12:33 | After call to link_to | cfg.html.erb:15:19:15:32 | Before call to link_to | | +| cfg.html.erb:12:11:12:33 | Before call to link_to | cfg.html.erb:12:11:12:33 | self | | +| cfg.html.erb:12:11:12:33 | call to link_to | cfg.html.erb:12:11:12:33 | After call to link_to | | +| cfg.html.erb:12:11:12:33 | self | cfg.html.erb:12:19:12:21 | Before "A" | | +| cfg.html.erb:12:19:12:21 | "A" | cfg.html.erb:12:19:12:21 | After "A" | | +| cfg.html.erb:12:19:12:21 | After "A" | cfg.html.erb:12:24:12:24 | Before call to a | | +| cfg.html.erb:12:19:12:21 | Before "A" | cfg.html.erb:12:20:12:20 | A | | | cfg.html.erb:12:20:12:20 | A | cfg.html.erb:12:19:12:21 | "A" | | -| cfg.html.erb:12:24:12:24 | call to a | cfg.html.erb:12:27:12:28 | id | | +| cfg.html.erb:12:24:12:24 | After call to a | cfg.html.erb:12:27:12:33 | Before Pair | | +| cfg.html.erb:12:24:12:24 | Before call to a | cfg.html.erb:12:24:12:24 | self | | +| cfg.html.erb:12:24:12:24 | call to a | cfg.html.erb:12:24:12:24 | After call to a | | | cfg.html.erb:12:24:12:24 | self | cfg.html.erb:12:24:12:24 | call to a | | -| cfg.html.erb:12:27:12:28 | :id | cfg.html.erb:12:32:12:32 | a | | +| cfg.html.erb:12:27:12:28 | :id | cfg.html.erb:12:27:12:28 | After :id | | +| cfg.html.erb:12:27:12:28 | After :id | cfg.html.erb:12:31:12:33 | Before "a" | | +| cfg.html.erb:12:27:12:28 | Before :id | cfg.html.erb:12:27:12:28 | id | | | cfg.html.erb:12:27:12:28 | id | cfg.html.erb:12:27:12:28 | :id | | -| cfg.html.erb:12:27:12:33 | Pair | cfg.html.erb:12:11:12:33 | call to link_to | | -| cfg.html.erb:12:31:12:33 | "a" | cfg.html.erb:12:27:12:33 | Pair | | +| cfg.html.erb:12:27:12:33 | After Pair | cfg.html.erb:12:11:12:33 | call to link_to | | +| cfg.html.erb:12:27:12:33 | Before Pair | cfg.html.erb:12:27:12:28 | Before :id | | +| cfg.html.erb:12:27:12:33 | Pair | cfg.html.erb:12:27:12:33 | After Pair | | +| cfg.html.erb:12:31:12:33 | "a" | cfg.html.erb:12:31:12:33 | After "a" | | +| cfg.html.erb:12:31:12:33 | After "a" | cfg.html.erb:12:27:12:33 | Pair | | +| cfg.html.erb:12:31:12:33 | Before "a" | cfg.html.erb:12:32:12:32 | a | | | cfg.html.erb:12:32:12:32 | a | cfg.html.erb:12:31:12:33 | "a" | | -| cfg.html.erb:15:19:15:32 | call to link_to | cfg.html.erb:16:19:16:32 | self | | -| cfg.html.erb:15:19:15:32 | self | cfg.html.erb:15:28:15:28 | B | | -| cfg.html.erb:15:27:15:29 | "B" | cfg.html.erb:15:32:15:32 | self | | +| cfg.html.erb:15:19:15:32 | After call to link_to | cfg.html.erb:16:19:16:32 | Before call to link_to | | +| cfg.html.erb:15:19:15:32 | Before call to link_to | cfg.html.erb:15:19:15:32 | self | | +| cfg.html.erb:15:19:15:32 | call to link_to | cfg.html.erb:15:19:15:32 | After call to link_to | | +| cfg.html.erb:15:19:15:32 | self | cfg.html.erb:15:27:15:29 | Before "B" | | +| cfg.html.erb:15:27:15:29 | "B" | cfg.html.erb:15:27:15:29 | After "B" | | +| cfg.html.erb:15:27:15:29 | After "B" | cfg.html.erb:15:32:15:32 | Before call to a | | +| cfg.html.erb:15:27:15:29 | Before "B" | cfg.html.erb:15:28:15:28 | B | | | cfg.html.erb:15:28:15:28 | B | cfg.html.erb:15:27:15:29 | "B" | | -| cfg.html.erb:15:32:15:32 | call to a | cfg.html.erb:15:19:15:32 | call to link_to | | +| cfg.html.erb:15:32:15:32 | After call to a | cfg.html.erb:15:19:15:32 | call to link_to | | +| cfg.html.erb:15:32:15:32 | Before call to a | cfg.html.erb:15:32:15:32 | self | | +| cfg.html.erb:15:32:15:32 | call to a | cfg.html.erb:15:32:15:32 | After call to a | | | cfg.html.erb:15:32:15:32 | self | cfg.html.erb:15:32:15:32 | call to a | | -| cfg.html.erb:16:19:16:32 | call to link_to | cfg.html.erb:18:17:18:22 | self | | -| cfg.html.erb:16:19:16:32 | self | cfg.html.erb:16:28:16:28 | C | | -| cfg.html.erb:16:27:16:29 | "C" | cfg.html.erb:16:32:16:32 | self | | +| cfg.html.erb:16:19:16:32 | After call to link_to | cfg.html.erb:18:14:22:16 | if ... | | +| cfg.html.erb:16:19:16:32 | Before call to link_to | cfg.html.erb:16:19:16:32 | self | | +| cfg.html.erb:16:19:16:32 | call to link_to | cfg.html.erb:16:19:16:32 | After call to link_to | | +| cfg.html.erb:16:19:16:32 | self | cfg.html.erb:16:27:16:29 | Before "C" | | +| cfg.html.erb:16:27:16:29 | "C" | cfg.html.erb:16:27:16:29 | After "C" | | +| cfg.html.erb:16:27:16:29 | After "C" | cfg.html.erb:16:32:16:32 | Before call to b | | +| cfg.html.erb:16:27:16:29 | Before "C" | cfg.html.erb:16:28:16:28 | C | | | cfg.html.erb:16:28:16:28 | C | cfg.html.erb:16:27:16:29 | "C" | | -| cfg.html.erb:16:32:16:32 | call to b | cfg.html.erb:16:19:16:32 | call to link_to | | +| cfg.html.erb:16:32:16:32 | After call to b | cfg.html.erb:16:19:16:32 | call to link_to | | +| cfg.html.erb:16:32:16:32 | Before call to b | cfg.html.erb:16:32:16:32 | self | | +| cfg.html.erb:16:32:16:32 | call to b | cfg.html.erb:16:32:16:32 | After call to b | | | cfg.html.erb:16:32:16:32 | self | cfg.html.erb:16:32:16:32 | call to b | | -| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:29:8:29:17 | self | | -| cfg.html.erb:18:17:18:22 | call to admin? | cfg.html.erb:19:19:19:32 | self | true | -| cfg.html.erb:18:17:18:22 | call to admin? | cfg.html.erb:21:19:21:32 | self | false | +| cfg.html.erb:18:14:22:16 | After if ... | cfg.html.erb:29:8:31:10 | Before call to each | | +| cfg.html.erb:18:14:22:16 | if ... | cfg.html.erb:18:17:18:22 | Before call to admin? | | +| cfg.html.erb:18:17:18:22 | After call to admin? [false] | cfg.html.erb:20:14:21:34 | else ... | | +| cfg.html.erb:18:17:18:22 | After call to admin? [true] | cfg.html.erb:18:24:19:34 | then ... | | +| cfg.html.erb:18:17:18:22 | Before call to admin? | cfg.html.erb:18:17:18:22 | self | | +| cfg.html.erb:18:17:18:22 | call to admin? | cfg.html.erb:18:17:18:22 | After call to admin? [false] | false | +| cfg.html.erb:18:17:18:22 | call to admin? | cfg.html.erb:18:17:18:22 | After call to admin? [true] | true | | cfg.html.erb:18:17:18:22 | self | cfg.html.erb:18:17:18:22 | call to admin? | | -| cfg.html.erb:18:24:19:34 | then ... | cfg.html.erb:18:14:22:16 | if ... | | -| cfg.html.erb:19:19:19:32 | call to link_to | cfg.html.erb:18:24:19:34 | then ... | | -| cfg.html.erb:19:19:19:32 | self | cfg.html.erb:19:28:19:28 | D | | -| cfg.html.erb:19:27:19:29 | "D" | cfg.html.erb:19:32:19:32 | self | | +| cfg.html.erb:18:24:19:34 | After then ... | cfg.html.erb:18:14:22:16 | After if ... | | +| cfg.html.erb:18:24:19:34 | then ... | cfg.html.erb:19:19:19:32 | Before call to link_to | | +| cfg.html.erb:19:19:19:32 | After call to link_to | cfg.html.erb:18:24:19:34 | After then ... | | +| cfg.html.erb:19:19:19:32 | Before call to link_to | cfg.html.erb:19:19:19:32 | self | | +| cfg.html.erb:19:19:19:32 | call to link_to | cfg.html.erb:19:19:19:32 | After call to link_to | | +| cfg.html.erb:19:19:19:32 | self | cfg.html.erb:19:27:19:29 | Before "D" | | +| cfg.html.erb:19:27:19:29 | "D" | cfg.html.erb:19:27:19:29 | After "D" | | +| cfg.html.erb:19:27:19:29 | After "D" | cfg.html.erb:19:32:19:32 | Before call to d | | +| cfg.html.erb:19:27:19:29 | Before "D" | cfg.html.erb:19:28:19:28 | D | | | cfg.html.erb:19:28:19:28 | D | cfg.html.erb:19:27:19:29 | "D" | | -| cfg.html.erb:19:32:19:32 | call to d | cfg.html.erb:19:19:19:32 | call to link_to | | +| cfg.html.erb:19:32:19:32 | After call to d | cfg.html.erb:19:19:19:32 | call to link_to | | +| cfg.html.erb:19:32:19:32 | Before call to d | cfg.html.erb:19:32:19:32 | self | | +| cfg.html.erb:19:32:19:32 | call to d | cfg.html.erb:19:32:19:32 | After call to d | | | cfg.html.erb:19:32:19:32 | self | cfg.html.erb:19:32:19:32 | call to d | | -| cfg.html.erb:20:14:21:34 | else ... | cfg.html.erb:18:14:22:16 | if ... | | -| cfg.html.erb:21:19:21:32 | call to link_to | cfg.html.erb:20:14:21:34 | else ... | | -| cfg.html.erb:21:19:21:32 | self | cfg.html.erb:21:28:21:28 | E | | -| cfg.html.erb:21:27:21:29 | "E" | cfg.html.erb:21:32:21:32 | self | | +| cfg.html.erb:20:14:21:34 | After else ... | cfg.html.erb:18:14:22:16 | After if ... | | +| cfg.html.erb:20:14:21:34 | else ... | cfg.html.erb:21:19:21:32 | Before call to link_to | | +| cfg.html.erb:21:19:21:32 | After call to link_to | cfg.html.erb:20:14:21:34 | After else ... | | +| cfg.html.erb:21:19:21:32 | Before call to link_to | cfg.html.erb:21:19:21:32 | self | | +| cfg.html.erb:21:19:21:32 | call to link_to | cfg.html.erb:21:19:21:32 | After call to link_to | | +| cfg.html.erb:21:19:21:32 | self | cfg.html.erb:21:27:21:29 | Before "E" | | +| cfg.html.erb:21:27:21:29 | "E" | cfg.html.erb:21:27:21:29 | After "E" | | +| cfg.html.erb:21:27:21:29 | After "E" | cfg.html.erb:21:32:21:32 | Before call to e | | +| cfg.html.erb:21:27:21:29 | Before "E" | cfg.html.erb:21:28:21:28 | E | | | cfg.html.erb:21:28:21:28 | E | cfg.html.erb:21:27:21:29 | "E" | | -| cfg.html.erb:21:32:21:32 | call to e | cfg.html.erb:21:19:21:32 | call to link_to | | +| cfg.html.erb:21:32:21:32 | After call to e | cfg.html.erb:21:19:21:32 | call to link_to | | +| cfg.html.erb:21:32:21:32 | Before call to e | cfg.html.erb:21:32:21:32 | self | | +| cfg.html.erb:21:32:21:32 | call to e | cfg.html.erb:21:32:21:32 | After call to e | | | cfg.html.erb:21:32:21:32 | self | cfg.html.erb:21:32:21:32 | call to e | | -| cfg.html.erb:29:8:29:17 | call to collection | cfg.html.erb:29:24:31:10 | do ... end | | +| cfg.html.erb:29:8:29:17 | After call to collection | cfg.html.erb:29:24:31:10 | do ... end | | +| cfg.html.erb:29:8:29:17 | Before call to collection | cfg.html.erb:29:8:29:17 | self | | +| cfg.html.erb:29:8:29:17 | call to collection | cfg.html.erb:29:8:29:17 | After call to collection | | | cfg.html.erb:29:8:29:17 | self | cfg.html.erb:29:8:29:17 | call to collection | | -| cfg.html.erb:29:8:31:10 | call to each | cfg.html.erb:5:16:31:12 | exit cfg.html.erb (normal) | | +| cfg.html.erb:29:8:31:10 | After call to each | cfg.html.erb:5:16:31:12 | Normal Exit | | +| cfg.html.erb:29:8:31:10 | Before call to each | cfg.html.erb:29:8:29:17 | Before call to collection | | +| cfg.html.erb:29:8:31:10 | call to each | cfg.html.erb:29:8:31:10 | After call to each | | +| cfg.html.erb:29:24:31:10 | Entry | cfg.html.erb:29:28:29:30 | key | | +| cfg.html.erb:29:24:31:10 | Normal Exit | cfg.html.erb:29:24:31:10 | Exit | | | cfg.html.erb:29:24:31:10 | do ... end | cfg.html.erb:29:8:31:10 | call to each | | -| cfg.html.erb:29:24:31:10 | enter do ... end | cfg.html.erb:29:28:29:30 | key | | -| cfg.html.erb:29:24:31:10 | exit do ... end (normal) | cfg.html.erb:29:24:31:10 | exit do ... end | | | cfg.html.erb:29:28:29:30 | key | cfg.html.erb:29:33:29:37 | value | | -| cfg.html.erb:29:33:29:37 | value | cfg.html.erb:30:23:30:25 | key | | +| cfg.html.erb:29:33:29:37 | value | cfg.html.erb:30:23:30:41 | ... | | | cfg.html.erb:30:23:30:25 | key | cfg.html.erb:30:35:30:39 | value | | -| cfg.html.erb:30:35:30:39 | value | cfg.html.erb:29:24:31:10 | exit do ... end (normal) | | -| cfg.rb:1:1:1:12 | bar | cfg.rb:3:1:3:13 | alias ... | | -| cfg.rb:1:1:221:1 | enter cfg.rb | cfg.rb:16:3:16:14 | self | | -| cfg.rb:1:1:221:1 | exit cfg.rb (normal) | cfg.rb:1:1:221:1 | exit cfg.rb | | -| cfg.rb:3:1:3:13 | alias ... | cfg.rb:3:7:3:9 | foo | | +| cfg.html.erb:30:23:30:41 | ... | cfg.html.erb:30:23:30:25 | key | | +| cfg.html.erb:30:23:30:41 | After ... | cfg.html.erb:29:24:31:10 | Normal Exit | | +| cfg.html.erb:30:35:30:39 | value | cfg.html.erb:30:23:30:41 | After ... | | +| cfg.rb:1:1:1:12 | bar | cfg.rb:3:1:3:13 | Before alias ... | | +| cfg.rb:1:1:221:1 | Entry | cfg.rb:15:1:17:1 | BEGIN { ... } | | +| cfg.rb:1:1:221:1 | Exceptional Exit | cfg.rb:1:1:221:1 | Exit | | +| cfg.rb:1:1:221:1 | Normal Exit | cfg.rb:1:1:221:1 | Exit | | +| cfg.rb:3:1:3:13 | After alias ... | cfg.rb:5:1:5:6 | Before ... = ... | | +| cfg.rb:3:1:3:13 | Before alias ... | cfg.rb:3:7:3:9 | foo | | +| cfg.rb:3:1:3:13 | alias ... | cfg.rb:3:1:3:13 | After alias ... | | | cfg.rb:3:7:3:9 | foo | cfg.rb:3:11:3:13 | bar | | -| cfg.rb:3:11:3:13 | bar | cfg.rb:5:1:5:1 | b | | +| cfg.rb:3:11:3:13 | bar | cfg.rb:3:1:3:13 | alias ... | | | cfg.rb:5:1:5:1 | b | cfg.rb:5:5:5:6 | 42 | | -| cfg.rb:5:1:5:6 | ... = ... | cfg.rb:7:1:7:21 | Array | | +| cfg.rb:5:1:5:6 | ... = ... | cfg.rb:5:1:5:6 | After ... = ... | | +| cfg.rb:5:1:5:6 | After ... = ... | cfg.rb:7:1:7:21 | Before call to [] | | +| cfg.rb:5:1:5:6 | Before ... = ... | cfg.rb:5:1:5:1 | b | | | cfg.rb:5:5:5:6 | 42 | cfg.rb:5:1:5:6 | ... = ... | | -| cfg.rb:7:1:7:21 | Array | cfg.rb:7:4:7:6 | one | | -| cfg.rb:7:1:7:21 | call to [] | cfg.rb:9:1:9:21 | Array | | -| cfg.rb:7:4:7:6 | one | cfg.rb:7:10:7:10 | b | | -| cfg.rb:7:4:7:12 | :"one#{...}" | cfg.rb:7:14:7:20 | another | | -| cfg.rb:7:7:7:12 | #{...} | cfg.rb:7:4:7:12 | :"one#{...}" | | -| cfg.rb:7:10:7:10 | b | cfg.rb:7:7:7:12 | #{...} | | -| cfg.rb:7:14:7:20 | :"another" | cfg.rb:7:1:7:21 | call to [] | | +| cfg.rb:7:1:7:21 | After call to [] | cfg.rb:9:1:9:21 | Before call to [] | | +| cfg.rb:7:1:7:21 | Array | cfg.rb:7:4:7:12 | Before :"one#{...}" | | +| cfg.rb:7:1:7:21 | Before call to [] | cfg.rb:7:1:7:21 | Array | | +| cfg.rb:7:1:7:21 | call to [] | cfg.rb:7:1:7:21 | After call to [] | | +| cfg.rb:7:4:7:6 | one | cfg.rb:7:7:7:12 | #{...} | | +| cfg.rb:7:4:7:12 | :"one#{...}" | cfg.rb:7:4:7:12 | After :"one#{...}" | | +| cfg.rb:7:4:7:12 | After :"one#{...}" | cfg.rb:7:14:7:20 | Before :"another" | | +| cfg.rb:7:4:7:12 | Before :"one#{...}" | cfg.rb:7:4:7:6 | one | | +| cfg.rb:7:7:7:12 | #{...} | cfg.rb:7:10:7:10 | b | | +| cfg.rb:7:7:7:12 | After #{...} | cfg.rb:7:4:7:12 | :"one#{...}" | | +| cfg.rb:7:10:7:10 | b | cfg.rb:7:7:7:12 | After #{...} | | +| cfg.rb:7:14:7:20 | :"another" | cfg.rb:7:14:7:20 | After :"another" | | +| cfg.rb:7:14:7:20 | After :"another" | cfg.rb:7:1:7:21 | call to [] | | +| cfg.rb:7:14:7:20 | Before :"another" | cfg.rb:7:14:7:20 | another | | | cfg.rb:7:14:7:20 | another | cfg.rb:7:14:7:20 | :"another" | | -| cfg.rb:9:1:9:21 | Array | cfg.rb:9:4:9:6 | one | | -| cfg.rb:9:1:9:21 | call to [] | cfg.rb:12:3:12:8 | self | | -| cfg.rb:9:4:9:6 | one | cfg.rb:9:10:9:10 | b | | -| cfg.rb:9:4:9:12 | "one#{...}" | cfg.rb:9:14:9:20 | another | | -| cfg.rb:9:7:9:12 | #{...} | cfg.rb:9:4:9:12 | "one#{...}" | | -| cfg.rb:9:10:9:10 | b | cfg.rb:9:7:9:12 | #{...} | | -| cfg.rb:9:14:9:20 | "another" | cfg.rb:9:1:9:21 | call to [] | | +| cfg.rb:9:1:9:21 | After call to [] | cfg.rb:11:1:13:3 | begin ... | | +| cfg.rb:9:1:9:21 | Array | cfg.rb:9:4:9:12 | Before "one#{...}" | | +| cfg.rb:9:1:9:21 | Before call to [] | cfg.rb:9:1:9:21 | Array | | +| cfg.rb:9:1:9:21 | call to [] | cfg.rb:9:1:9:21 | After call to [] | | +| cfg.rb:9:4:9:6 | one | cfg.rb:9:7:9:12 | #{...} | | +| cfg.rb:9:4:9:12 | "one#{...}" | cfg.rb:9:4:9:12 | After "one#{...}" | | +| cfg.rb:9:4:9:12 | After "one#{...}" | cfg.rb:9:14:9:20 | Before "another" | | +| cfg.rb:9:4:9:12 | Before "one#{...}" | cfg.rb:9:4:9:6 | one | | +| cfg.rb:9:7:9:12 | #{...} | cfg.rb:9:10:9:10 | b | | +| cfg.rb:9:7:9:12 | After #{...} | cfg.rb:9:4:9:12 | "one#{...}" | | +| cfg.rb:9:10:9:10 | b | cfg.rb:9:7:9:12 | After #{...} | | +| cfg.rb:9:14:9:20 | "another" | cfg.rb:9:14:9:20 | After "another" | | +| cfg.rb:9:14:9:20 | After "another" | cfg.rb:9:1:9:21 | call to [] | | +| cfg.rb:9:14:9:20 | Before "another" | cfg.rb:9:14:9:20 | another | | | cfg.rb:9:14:9:20 | another | cfg.rb:9:14:9:20 | "another" | | -| cfg.rb:12:3:12:8 | call to puts | cfg.rb:19:1:21:1 | END { ... } | | +| cfg.rb:11:1:13:3 | After begin ... | cfg.rb:19:1:21:1 | END { ... } | | +| cfg.rb:11:1:13:3 | begin ... | cfg.rb:12:3:12:8 | Before call to puts | | +| cfg.rb:12:3:12:8 | After call to puts | cfg.rb:11:1:13:3 | After begin ... | | +| cfg.rb:12:3:12:8 | Before call to puts | cfg.rb:12:3:12:8 | self | | +| cfg.rb:12:3:12:8 | call to puts | cfg.rb:12:3:12:8 | After call to puts | | | cfg.rb:12:3:12:8 | self | cfg.rb:12:8:12:8 | 4 | | | cfg.rb:12:8:12:8 | 4 | cfg.rb:12:3:12:8 | call to puts | | -| cfg.rb:15:1:17:1 | BEGIN { ... } | cfg.rb:1:1:1:12 | bar | | -| cfg.rb:16:3:16:14 | call to puts | cfg.rb:15:1:17:1 | BEGIN { ... } | | -| cfg.rb:16:3:16:14 | self | cfg.rb:16:9:16:13 | hello | | -| cfg.rb:16:8:16:14 | "hello" | cfg.rb:16:3:16:14 | call to puts | | +| cfg.rb:15:1:17:1 | After BEGIN { ... } | cfg.rb:1:1:1:12 | bar | | +| cfg.rb:15:1:17:1 | BEGIN { ... } | cfg.rb:16:3:16:14 | Before call to puts | | +| cfg.rb:16:3:16:14 | After call to puts | cfg.rb:15:1:17:1 | After BEGIN { ... } | | +| cfg.rb:16:3:16:14 | Before call to puts | cfg.rb:16:3:16:14 | self | | +| cfg.rb:16:3:16:14 | call to puts | cfg.rb:16:3:16:14 | After call to puts | | +| cfg.rb:16:3:16:14 | self | cfg.rb:16:8:16:14 | Before "hello" | | +| cfg.rb:16:8:16:14 | "hello" | cfg.rb:16:8:16:14 | After "hello" | | +| cfg.rb:16:8:16:14 | After "hello" | cfg.rb:16:3:16:14 | call to puts | | +| cfg.rb:16:8:16:14 | Before "hello" | cfg.rb:16:9:16:13 | hello | | | cfg.rb:16:9:16:13 | hello | cfg.rb:16:8:16:14 | "hello" | | -| cfg.rb:19:1:21:1 | END { ... } | cfg.rb:23:1:23:2 | 41 | | +| cfg.rb:19:1:21:1 | After END { ... } | cfg.rb:23:1:23:6 | Before ... + ... | | +| cfg.rb:19:1:21:1 | END { ... } | cfg.rb:20:3:20:14 | Before call to puts | | +| cfg.rb:20:3:20:14 | After call to puts | cfg.rb:19:1:21:1 | After END { ... } | | +| cfg.rb:20:3:20:14 | Before call to puts | cfg.rb:20:3:20:14 | self | | +| cfg.rb:20:3:20:14 | call to puts | cfg.rb:20:3:20:14 | After call to puts | | +| cfg.rb:20:3:20:14 | self | cfg.rb:20:8:20:14 | Before "world" | | +| cfg.rb:20:8:20:14 | "world" | cfg.rb:20:8:20:14 | After "world" | | +| cfg.rb:20:8:20:14 | After "world" | cfg.rb:20:3:20:14 | call to puts | | +| cfg.rb:20:8:20:14 | Before "world" | cfg.rb:20:9:20:13 | world | | +| cfg.rb:20:9:20:13 | world | cfg.rb:20:8:20:14 | "world" | | | cfg.rb:23:1:23:2 | 41 | cfg.rb:23:6:23:6 | 1 | | -| cfg.rb:23:1:23:6 | ... + ... | cfg.rb:25:1:25:1 | 2 | | +| cfg.rb:23:1:23:6 | ... + ... | cfg.rb:23:1:23:6 | After ... + ... | | +| cfg.rb:23:1:23:6 | After ... + ... | cfg.rb:25:1:25:22 | Before call to times | | +| cfg.rb:23:1:23:6 | Before ... + ... | cfg.rb:23:1:23:2 | 41 | | | cfg.rb:23:6:23:6 | 1 | cfg.rb:23:1:23:6 | ... + ... | | | cfg.rb:25:1:25:1 | 2 | cfg.rb:25:9:25:22 | { ... } | | -| cfg.rb:25:1:25:22 | call to times | cfg.rb:27:1:27:11 | self | | -| cfg.rb:25:9:25:22 | enter { ... } | cfg.rb:25:12:25:12 | x | | -| cfg.rb:25:9:25:22 | exit { ... } (normal) | cfg.rb:25:9:25:22 | exit { ... } | | +| cfg.rb:25:1:25:22 | After call to times | cfg.rb:27:1:27:11 | Before call to puts | | +| cfg.rb:25:1:25:22 | Before call to times | cfg.rb:25:1:25:1 | 2 | | +| cfg.rb:25:1:25:22 | call to times | cfg.rb:25:1:25:22 | After call to times | | +| cfg.rb:25:9:25:22 | Entry | cfg.rb:25:12:25:12 | x | | +| cfg.rb:25:9:25:22 | Normal Exit | cfg.rb:25:9:25:22 | Exit | | | cfg.rb:25:9:25:22 | { ... } | cfg.rb:25:1:25:22 | call to times | | -| cfg.rb:25:12:25:12 | x | cfg.rb:25:15:25:20 | self | | -| cfg.rb:25:15:25:20 | call to puts | cfg.rb:25:9:25:22 | exit { ... } (normal) | | +| cfg.rb:25:12:25:12 | x | cfg.rb:25:15:25:20 | ... | | +| cfg.rb:25:15:25:20 | ... | cfg.rb:25:15:25:20 | Before call to puts | | +| cfg.rb:25:15:25:20 | After ... | cfg.rb:25:9:25:22 | Normal Exit | | +| cfg.rb:25:15:25:20 | After call to puts | cfg.rb:25:15:25:20 | After ... | | +| cfg.rb:25:15:25:20 | Before call to puts | cfg.rb:25:15:25:20 | self | | +| cfg.rb:25:15:25:20 | call to puts | cfg.rb:25:15:25:20 | After call to puts | | | cfg.rb:25:15:25:20 | self | cfg.rb:25:20:25:20 | x | | | cfg.rb:25:20:25:20 | x | cfg.rb:25:15:25:20 | call to puts | | -| cfg.rb:27:1:27:11 | call to puts | cfg.rb:29:1:29:4 | Proc | | -| cfg.rb:27:1:27:11 | self | cfg.rb:27:7:27:11 | puts | | -| cfg.rb:27:6:27:11 | &... | cfg.rb:27:1:27:11 | call to puts | | -| cfg.rb:27:7:27:11 | :puts | cfg.rb:27:6:27:11 | &... | | +| cfg.rb:27:1:27:11 | After call to puts | cfg.rb:29:1:29:24 | Before call to new | | +| cfg.rb:27:1:27:11 | Before call to puts | cfg.rb:27:1:27:11 | self | | +| cfg.rb:27:1:27:11 | call to puts | cfg.rb:27:1:27:11 | After call to puts | | +| cfg.rb:27:1:27:11 | self | cfg.rb:27:6:27:11 | Before &... | | +| cfg.rb:27:6:27:11 | &... | cfg.rb:27:6:27:11 | After &... | | +| cfg.rb:27:6:27:11 | After &... | cfg.rb:27:1:27:11 | call to puts | | +| cfg.rb:27:6:27:11 | Before &... | cfg.rb:27:7:27:11 | Before :puts | | +| cfg.rb:27:7:27:11 | :puts | cfg.rb:27:7:27:11 | After :puts | | +| cfg.rb:27:7:27:11 | After :puts | cfg.rb:27:6:27:11 | &... | | +| cfg.rb:27:7:27:11 | Before :puts | cfg.rb:27:7:27:11 | puts | | | cfg.rb:27:7:27:11 | puts | cfg.rb:27:7:27:11 | :puts | | | cfg.rb:29:1:29:4 | Proc | cfg.rb:29:10:29:24 | { ... } | | -| cfg.rb:29:1:29:24 | call to new | cfg.rb:31:7:31:10 | true | | -| cfg.rb:29:10:29:24 | enter { ... } | cfg.rb:29:14:29:14 | x | | -| cfg.rb:29:10:29:24 | exit { ... } (normal) | cfg.rb:29:10:29:24 | exit { ... } | | +| cfg.rb:29:1:29:24 | After call to new | cfg.rb:31:1:33:3 | while ... | | +| cfg.rb:29:1:29:24 | Before call to new | cfg.rb:29:1:29:4 | Proc | | +| cfg.rb:29:1:29:24 | call to new | cfg.rb:29:1:29:24 | After call to new | | +| cfg.rb:29:10:29:24 | Entry | cfg.rb:29:14:29:14 | x | | +| cfg.rb:29:10:29:24 | Normal Exit | cfg.rb:29:10:29:24 | Exit | | | cfg.rb:29:10:29:24 | { ... } | cfg.rb:29:1:29:24 | call to new | | -| cfg.rb:29:14:29:14 | x | cfg.rb:29:17:29:17 | x | | +| cfg.rb:29:14:29:14 | x | cfg.rb:29:17:29:22 | ... | | | cfg.rb:29:17:29:17 | x | cfg.rb:29:17:29:22 | call to call | | -| cfg.rb:29:17:29:22 | call to call | cfg.rb:29:10:29:24 | exit { ... } (normal) | | -| cfg.rb:31:1:33:3 | while ... | cfg.rb:35:4:35:8 | false | | -| cfg.rb:31:7:31:10 | true | cfg.rb:32:9:32:9 | 1 | true | -| cfg.rb:32:3:32:9 | break | cfg.rb:31:1:33:3 | while ... | break | +| cfg.rb:29:17:29:22 | ... | cfg.rb:29:17:29:22 | Before call to call | | +| cfg.rb:29:17:29:22 | After ... | cfg.rb:29:10:29:24 | Normal Exit | | +| cfg.rb:29:17:29:22 | After call to call | cfg.rb:29:17:29:22 | After ... | | +| cfg.rb:29:17:29:22 | Before call to call | cfg.rb:29:17:29:17 | x | | +| cfg.rb:29:17:29:22 | call to call | cfg.rb:29:17:29:22 | After call to call | | +| cfg.rb:31:1:33:3 | After while ... | cfg.rb:35:1:37:3 | if ... | | +| cfg.rb:31:1:33:3 | [LoopHeader] while ... | cfg.rb:31:7:31:10 | true | | +| cfg.rb:31:1:33:3 | while ... | cfg.rb:31:1:33:3 | [LoopHeader] while ... | | +| cfg.rb:31:7:31:10 | After true [true] | cfg.rb:31:11:33:3 | do ... | | +| cfg.rb:31:7:31:10 | true | cfg.rb:31:7:31:10 | After true [true] | true | +| cfg.rb:31:11:33:3 | do ... | cfg.rb:32:3:32:9 | Before break | | +| cfg.rb:32:3:32:9 | Before break | cfg.rb:32:9:32:9 | 1 | | +| cfg.rb:32:3:32:9 | break | cfg.rb:31:1:33:3 | After while ... | break | | cfg.rb:32:9:32:9 | 1 | cfg.rb:32:3:32:9 | break | | -| cfg.rb:35:1:37:3 | if ... | cfg.rb:39:1:39:4 | self | | -| cfg.rb:35:4:35:8 | false | cfg.rb:35:1:37:3 | if ... | false | +| cfg.rb:35:1:37:3 | After if ... | cfg.rb:39:1:39:12 | Before call to puts | | +| cfg.rb:35:1:37:3 | if ... | cfg.rb:35:4:35:8 | false | | +| cfg.rb:35:4:35:8 | After false [false] | cfg.rb:35:1:37:3 | After if ... | | +| cfg.rb:35:4:35:8 | false | cfg.rb:35:4:35:8 | After false [false] | false | | cfg.rb:39:1:39:4 | self | cfg.rb:39:11:39:12 | 42 | | -| cfg.rb:39:1:39:12 | call to puts | cfg.rb:41:6:41:7 | 10 | | +| cfg.rb:39:1:39:12 | After call to puts | cfg.rb:41:1:45:3 | case ... | | +| cfg.rb:39:1:39:12 | Before call to puts | cfg.rb:39:1:39:4 | self | | +| cfg.rb:39:1:39:12 | call to puts | cfg.rb:39:1:39:12 | After call to puts | | | cfg.rb:39:11:39:12 | 42 | cfg.rb:39:1:39:12 | call to puts | | -| cfg.rb:41:1:45:3 | case ... | cfg.rb:47:1:50:3 | true | | -| cfg.rb:41:6:41:7 | 10 | cfg.rb:42:8:42:8 | 1 | | -| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:15:42:24 | self | match | -| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:8:43:8 | 2 | no-match | -| cfg.rb:42:8:42:8 | 1 | cfg.rb:42:3:42:24 | [match] when ... | match | -| cfg.rb:42:8:42:8 | 1 | cfg.rb:42:3:42:24 | [no-match] when ... | no-match | -| cfg.rb:42:10:42:24 | then ... | cfg.rb:41:1:45:3 | case ... | | -| cfg.rb:42:15:42:24 | call to puts | cfg.rb:42:10:42:24 | then ... | | -| cfg.rb:42:15:42:24 | self | cfg.rb:42:21:42:23 | one | | -| cfg.rb:42:20:42:24 | "one" | cfg.rb:42:15:42:24 | call to puts | | +| cfg.rb:41:1:45:3 | After case ... | cfg.rb:47:1:50:3 | case ... | | +| cfg.rb:41:1:45:3 | case ... | cfg.rb:41:6:41:7 | 10 | | +| cfg.rb:41:6:41:7 | 10 | cfg.rb:42:3:42:24 | when ... | | +| cfg.rb:42:3:42:24 | After when ... [match] | cfg.rb:42:10:42:24 | then ... | | +| cfg.rb:42:3:42:24 | After when ... [no-match] | cfg.rb:43:3:43:31 | when ... | | +| cfg.rb:42:3:42:24 | when ... | cfg.rb:42:8:42:8 | 1 | | +| cfg.rb:42:8:42:8 | 1 | cfg.rb:42:8:42:8 | After 1 [match] | match | +| cfg.rb:42:8:42:8 | 1 | cfg.rb:42:8:42:8 | After 1 [no-match] | no-match | +| cfg.rb:42:8:42:8 | After 1 [match] | cfg.rb:42:3:42:24 | After when ... [match] | match | +| cfg.rb:42:8:42:8 | After 1 [no-match] | cfg.rb:42:3:42:24 | After when ... [no-match] | no-match | +| cfg.rb:42:10:42:24 | After then ... | cfg.rb:41:1:45:3 | After case ... | | +| cfg.rb:42:10:42:24 | then ... | cfg.rb:42:15:42:24 | Before call to puts | | +| cfg.rb:42:15:42:24 | After call to puts | cfg.rb:42:10:42:24 | After then ... | | +| cfg.rb:42:15:42:24 | Before call to puts | cfg.rb:42:15:42:24 | self | | +| cfg.rb:42:15:42:24 | call to puts | cfg.rb:42:15:42:24 | After call to puts | | +| cfg.rb:42:15:42:24 | self | cfg.rb:42:20:42:24 | Before "one" | | +| cfg.rb:42:20:42:24 | "one" | cfg.rb:42:20:42:24 | After "one" | | +| cfg.rb:42:20:42:24 | After "one" | cfg.rb:42:15:42:24 | call to puts | | +| cfg.rb:42:20:42:24 | Before "one" | cfg.rb:42:21:42:23 | one | | | cfg.rb:42:21:42:23 | one | cfg.rb:42:20:42:24 | "one" | | -| cfg.rb:43:3:43:31 | [match] when ... | cfg.rb:43:21:43:31 | self | match | -| cfg.rb:43:3:43:31 | [no-match] when ... | cfg.rb:44:8:44:18 | self | no-match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:11:43:11 | 3 | no-match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:14:43:14 | 4 | no-match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [match] when ... | match | -| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:3:43:31 | [no-match] when ... | no-match | -| cfg.rb:43:16:43:31 | then ... | cfg.rb:41:1:45:3 | case ... | | -| cfg.rb:43:21:43:31 | call to puts | cfg.rb:43:16:43:31 | then ... | | -| cfg.rb:43:21:43:31 | self | cfg.rb:43:27:43:30 | some | | -| cfg.rb:43:26:43:31 | "some" | cfg.rb:43:21:43:31 | call to puts | | +| cfg.rb:43:3:43:31 | After when ... [match] | cfg.rb:43:16:43:31 | then ... | | +| cfg.rb:43:3:43:31 | After when ... [no-match] | cfg.rb:44:3:44:18 | else ... | | +| cfg.rb:43:3:43:31 | when ... | cfg.rb:43:8:43:8 | 2 | | +| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:8:43:8 | After 2 [match] | match | +| cfg.rb:43:8:43:8 | 2 | cfg.rb:43:8:43:8 | After 2 [no-match] | no-match | +| cfg.rb:43:8:43:8 | After 2 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:43:8:43:8 | After 2 [no-match] | cfg.rb:43:11:43:11 | 3 | | +| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:11:43:11 | After 3 [match] | match | +| cfg.rb:43:11:43:11 | 3 | cfg.rb:43:11:43:11 | After 3 [no-match] | no-match | +| cfg.rb:43:11:43:11 | After 3 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:43:11:43:11 | After 3 [no-match] | cfg.rb:43:14:43:14 | 4 | | +| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:14:43:14 | After 4 [match] | match | +| cfg.rb:43:14:43:14 | 4 | cfg.rb:43:14:43:14 | After 4 [no-match] | no-match | +| cfg.rb:43:14:43:14 | After 4 [match] | cfg.rb:43:3:43:31 | After when ... [match] | match | +| cfg.rb:43:14:43:14 | After 4 [no-match] | cfg.rb:43:3:43:31 | After when ... [no-match] | no-match | +| cfg.rb:43:16:43:31 | After then ... | cfg.rb:41:1:45:3 | After case ... | | +| cfg.rb:43:16:43:31 | then ... | cfg.rb:43:21:43:31 | Before call to puts | | +| cfg.rb:43:21:43:31 | After call to puts | cfg.rb:43:16:43:31 | After then ... | | +| cfg.rb:43:21:43:31 | Before call to puts | cfg.rb:43:21:43:31 | self | | +| cfg.rb:43:21:43:31 | call to puts | cfg.rb:43:21:43:31 | After call to puts | | +| cfg.rb:43:21:43:31 | self | cfg.rb:43:26:43:31 | Before "some" | | +| cfg.rb:43:26:43:31 | "some" | cfg.rb:43:26:43:31 | After "some" | | +| cfg.rb:43:26:43:31 | After "some" | cfg.rb:43:21:43:31 | call to puts | | +| cfg.rb:43:26:43:31 | Before "some" | cfg.rb:43:27:43:30 | some | | | cfg.rb:43:27:43:30 | some | cfg.rb:43:26:43:31 | "some" | | -| cfg.rb:44:3:44:18 | else ... | cfg.rb:41:1:45:3 | case ... | | -| cfg.rb:44:8:44:18 | call to puts | cfg.rb:44:3:44:18 | else ... | | -| cfg.rb:44:8:44:18 | self | cfg.rb:44:14:44:17 | many | | -| cfg.rb:44:13:44:18 | "many" | cfg.rb:44:8:44:18 | call to puts | | +| cfg.rb:44:3:44:18 | After else ... | cfg.rb:41:1:45:3 | After case ... | | +| cfg.rb:44:3:44:18 | After else ... [match] | cfg.rb:44:3:44:18 | else ... | | +| cfg.rb:44:3:44:18 | else ... | cfg.rb:44:3:44:18 | After else ... [match] | match | +| cfg.rb:44:3:44:18 | else ... | cfg.rb:44:8:44:18 | Before call to puts | | +| cfg.rb:44:8:44:18 | After call to puts | cfg.rb:44:3:44:18 | After else ... | | +| cfg.rb:44:8:44:18 | Before call to puts | cfg.rb:44:8:44:18 | self | | +| cfg.rb:44:8:44:18 | call to puts | cfg.rb:44:8:44:18 | After call to puts | | +| cfg.rb:44:8:44:18 | self | cfg.rb:44:13:44:18 | Before "many" | | +| cfg.rb:44:13:44:18 | "many" | cfg.rb:44:13:44:18 | After "many" | | +| cfg.rb:44:13:44:18 | After "many" | cfg.rb:44:8:44:18 | call to puts | | +| cfg.rb:44:13:44:18 | Before "many" | cfg.rb:44:14:44:17 | many | | | cfg.rb:44:14:44:17 | many | cfg.rb:44:13:44:18 | "many" | | -| cfg.rb:47:1:50:3 | case ... | cfg.rb:52:1:52:7 | chained | | -| cfg.rb:47:1:50:3 | true | cfg.rb:48:8:48:8 | b | | -| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:20:48:29 | self | match | -| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:8:49:8 | b | no-match | +| cfg.rb:47:1:50:3 | After case ... | cfg.rb:52:1:52:35 | Before ... = ... | | +| cfg.rb:47:1:50:3 | case ... | cfg.rb:47:1:50:3 | true | | +| cfg.rb:47:1:50:3 | true | cfg.rb:48:3:48:29 | when ... | | +| cfg.rb:48:3:48:29 | After when ... [match] | cfg.rb:48:15:48:29 | then ... | | +| cfg.rb:48:3:48:29 | After when ... [no-match] | cfg.rb:49:3:49:37 | when ... | | +| cfg.rb:48:3:48:29 | when ... | cfg.rb:48:8:48:13 | Before ... == ... | | | cfg.rb:48:8:48:8 | b | cfg.rb:48:13:48:13 | 1 | | -| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:3:48:29 | [match] when ... | match | -| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:3:48:29 | [no-match] when ... | no-match | +| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:8:48:13 | After ... == ... [match] | match | +| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:8:48:13 | After ... == ... [no-match] | no-match | +| cfg.rb:48:8:48:13 | After ... == ... [match] | cfg.rb:48:3:48:29 | After when ... [match] | match | +| cfg.rb:48:8:48:13 | After ... == ... [no-match] | cfg.rb:48:3:48:29 | After when ... [no-match] | no-match | +| cfg.rb:48:8:48:13 | Before ... == ... | cfg.rb:48:8:48:8 | b | | | cfg.rb:48:13:48:13 | 1 | cfg.rb:48:8:48:13 | ... == ... | | -| cfg.rb:48:15:48:29 | then ... | cfg.rb:47:1:50:3 | case ... | | -| cfg.rb:48:20:48:29 | call to puts | cfg.rb:48:15:48:29 | then ... | | -| cfg.rb:48:20:48:29 | self | cfg.rb:48:26:48:28 | one | | -| cfg.rb:48:25:48:29 | "one" | cfg.rb:48:20:48:29 | call to puts | | +| cfg.rb:48:15:48:29 | After then ... | cfg.rb:47:1:50:3 | After case ... | | +| cfg.rb:48:15:48:29 | then ... | cfg.rb:48:20:48:29 | Before call to puts | | +| cfg.rb:48:20:48:29 | After call to puts | cfg.rb:48:15:48:29 | After then ... | | +| cfg.rb:48:20:48:29 | Before call to puts | cfg.rb:48:20:48:29 | self | | +| cfg.rb:48:20:48:29 | call to puts | cfg.rb:48:20:48:29 | After call to puts | | +| cfg.rb:48:20:48:29 | self | cfg.rb:48:25:48:29 | Before "one" | | +| cfg.rb:48:25:48:29 | "one" | cfg.rb:48:25:48:29 | After "one" | | +| cfg.rb:48:25:48:29 | After "one" | cfg.rb:48:20:48:29 | call to puts | | +| cfg.rb:48:25:48:29 | Before "one" | cfg.rb:48:26:48:28 | one | | | cfg.rb:48:26:48:28 | one | cfg.rb:48:25:48:29 | "one" | | -| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:27:49:37 | self | match | -| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:47:1:50:3 | case ... | no-match | +| cfg.rb:49:3:49:37 | After when ... [match] | cfg.rb:49:22:49:37 | then ... | | +| cfg.rb:49:3:49:37 | After when ... [no-match] | cfg.rb:47:1:50:3 | After case ... | | +| cfg.rb:49:3:49:37 | when ... | cfg.rb:49:8:49:13 | Before ... == ... | | | cfg.rb:49:8:49:8 | b | cfg.rb:49:13:49:13 | 0 | | -| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:3:49:37 | [match] when ... | match | -| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:16:49:16 | b | no-match | +| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:8:49:13 | After ... == ... [match] | match | +| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:8:49:13 | After ... == ... [no-match] | no-match | +| cfg.rb:49:8:49:13 | After ... == ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | match | +| cfg.rb:49:8:49:13 | After ... == ... [no-match] | cfg.rb:49:16:49:20 | Before ... > ... | | +| cfg.rb:49:8:49:13 | Before ... == ... | cfg.rb:49:8:49:8 | b | | | cfg.rb:49:13:49:13 | 0 | cfg.rb:49:8:49:13 | ... == ... | | | cfg.rb:49:16:49:16 | b | cfg.rb:49:20:49:20 | 1 | | -| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:3:49:37 | [match] when ... | match | -| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:3:49:37 | [no-match] when ... | no-match | +| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:16:49:20 | After ... > ... [match] | match | +| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:16:49:20 | After ... > ... [no-match] | no-match | +| cfg.rb:49:16:49:20 | After ... > ... [match] | cfg.rb:49:3:49:37 | After when ... [match] | match | +| cfg.rb:49:16:49:20 | After ... > ... [no-match] | cfg.rb:49:3:49:37 | After when ... [no-match] | no-match | +| cfg.rb:49:16:49:20 | Before ... > ... | cfg.rb:49:16:49:16 | b | | | cfg.rb:49:20:49:20 | 1 | cfg.rb:49:16:49:20 | ... > ... | | -| cfg.rb:49:22:49:37 | then ... | cfg.rb:47:1:50:3 | case ... | | -| cfg.rb:49:27:49:37 | call to puts | cfg.rb:49:22:49:37 | then ... | | -| cfg.rb:49:27:49:37 | self | cfg.rb:49:33:49:36 | some | | -| cfg.rb:49:32:49:37 | "some" | cfg.rb:49:27:49:37 | call to puts | | +| cfg.rb:49:22:49:37 | After then ... | cfg.rb:47:1:50:3 | After case ... | | +| cfg.rb:49:22:49:37 | then ... | cfg.rb:49:27:49:37 | Before call to puts | | +| cfg.rb:49:27:49:37 | After call to puts | cfg.rb:49:22:49:37 | After then ... | | +| cfg.rb:49:27:49:37 | Before call to puts | cfg.rb:49:27:49:37 | self | | +| cfg.rb:49:27:49:37 | call to puts | cfg.rb:49:27:49:37 | After call to puts | | +| cfg.rb:49:27:49:37 | self | cfg.rb:49:32:49:37 | Before "some" | | +| cfg.rb:49:32:49:37 | "some" | cfg.rb:49:32:49:37 | After "some" | | +| cfg.rb:49:32:49:37 | After "some" | cfg.rb:49:27:49:37 | call to puts | | +| cfg.rb:49:32:49:37 | Before "some" | cfg.rb:49:33:49:36 | some | | | cfg.rb:49:33:49:36 | some | cfg.rb:49:32:49:37 | "some" | | -| cfg.rb:52:1:52:7 | chained | cfg.rb:52:12:52:12 | a | | -| cfg.rb:52:1:52:35 | ... = ... | cfg.rb:54:1:54:9 | character | | -| cfg.rb:52:11:52:13 | "a" | cfg.rb:52:18:52:24 | chained | | -| cfg.rb:52:11:52:35 | "..." "..." | cfg.rb:52:1:52:35 | ... = ... | | +| cfg.rb:52:1:52:7 | chained | cfg.rb:52:11:52:35 | Before "..." "..." | | +| cfg.rb:52:1:52:35 | ... = ... | cfg.rb:52:1:52:35 | After ... = ... | | +| cfg.rb:52:1:52:35 | After ... = ... | cfg.rb:54:1:54:17 | Before ... = ... | | +| cfg.rb:52:1:52:35 | Before ... = ... | cfg.rb:52:1:52:7 | chained | | +| cfg.rb:52:11:52:13 | "a" | cfg.rb:52:11:52:13 | After "a" | | +| cfg.rb:52:11:52:13 | After "a" | cfg.rb:52:15:52:26 | Before "#{...}" | | +| cfg.rb:52:11:52:13 | Before "a" | cfg.rb:52:12:52:12 | a | | +| cfg.rb:52:11:52:35 | "..." "..." | cfg.rb:52:11:52:35 | After "..." "..." | | +| cfg.rb:52:11:52:35 | After "..." "..." | cfg.rb:52:1:52:35 | ... = ... | | +| cfg.rb:52:11:52:35 | Before "..." "..." | cfg.rb:52:11:52:13 | Before "a" | | | cfg.rb:52:12:52:12 | a | cfg.rb:52:11:52:13 | "a" | | -| cfg.rb:52:15:52:26 | "#{...}" | cfg.rb:52:29:52:34 | string | | -| cfg.rb:52:16:52:25 | #{...} | cfg.rb:52:15:52:26 | "#{...}" | | -| cfg.rb:52:18:52:24 | chained | cfg.rb:52:16:52:25 | #{...} | | -| cfg.rb:52:28:52:35 | "string" | cfg.rb:52:11:52:35 | "..." "..." | | +| cfg.rb:52:15:52:26 | "#{...}" | cfg.rb:52:15:52:26 | After "#{...}" | | +| cfg.rb:52:15:52:26 | After "#{...}" | cfg.rb:52:28:52:35 | Before "string" | | +| cfg.rb:52:15:52:26 | Before "#{...}" | cfg.rb:52:16:52:25 | #{...} | | +| cfg.rb:52:16:52:25 | #{...} | cfg.rb:52:18:52:24 | chained | | +| cfg.rb:52:16:52:25 | After #{...} | cfg.rb:52:15:52:26 | "#{...}" | | +| cfg.rb:52:18:52:24 | chained | cfg.rb:52:16:52:25 | After #{...} | | +| cfg.rb:52:28:52:35 | "string" | cfg.rb:52:28:52:35 | After "string" | | +| cfg.rb:52:28:52:35 | After "string" | cfg.rb:52:11:52:35 | "..." "..." | | +| cfg.rb:52:28:52:35 | Before "string" | cfg.rb:52:29:52:34 | string | | | cfg.rb:52:29:52:34 | string | cfg.rb:52:28:52:35 | "string" | | | cfg.rb:54:1:54:9 | character | cfg.rb:54:13:54:17 | ?\\x40 | | -| cfg.rb:54:1:54:17 | ... = ... | cfg.rb:58:1:72:3 | Silly | | +| cfg.rb:54:1:54:17 | ... = ... | cfg.rb:54:1:54:17 | After ... = ... | | +| cfg.rb:54:1:54:17 | After ... = ... | cfg.rb:58:1:72:3 | Silly | | +| cfg.rb:54:1:54:17 | Before ... = ... | cfg.rb:54:1:54:9 | character | | | cfg.rb:54:13:54:17 | ?\\x40 | cfg.rb:54:1:54:17 | ... = ... | | +| cfg.rb:58:1:72:3 | After Silly | cfg.rb:74:1:74:6 | Before ... = ... | | | cfg.rb:58:1:72:3 | Silly | cfg.rb:58:15:58:20 | Object | | -| cfg.rb:58:15:58:20 | Object | cfg.rb:59:3:59:9 | complex | | -| cfg.rb:59:3:59:9 | complex | cfg.rb:59:13:59:14 | 10 | | -| cfg.rb:59:3:59:17 | ... = ... | cfg.rb:60:3:60:13 | conditional | | +| cfg.rb:58:15:58:20 | Object | cfg.rb:59:3:59:17 | Before ... = ... | | +| cfg.rb:59:3:59:9 | complex | cfg.rb:59:13:59:17 | Before ... - ... | | +| cfg.rb:59:3:59:17 | ... = ... | cfg.rb:59:3:59:17 | After ... = ... | | +| cfg.rb:59:3:59:17 | After ... = ... | cfg.rb:60:3:60:40 | Before ... = ... | | +| cfg.rb:59:3:59:17 | Before ... = ... | cfg.rb:59:3:59:9 | complex | | | cfg.rb:59:13:59:14 | 10 | cfg.rb:59:16:59:17 | 2i | | -| cfg.rb:59:13:59:17 | ... - ... | cfg.rb:59:3:59:17 | ... = ... | | +| cfg.rb:59:13:59:17 | ... - ... | cfg.rb:59:13:59:17 | After ... - ... | | +| cfg.rb:59:13:59:17 | After ... - ... | cfg.rb:59:3:59:17 | ... = ... | | +| cfg.rb:59:13:59:17 | Before ... - ... | cfg.rb:59:13:59:14 | 10 | | | cfg.rb:59:16:59:17 | 2i | cfg.rb:59:13:59:17 | ... - ... | | -| cfg.rb:60:3:60:13 | conditional | cfg.rb:60:17:60:17 | self | | -| cfg.rb:60:3:60:40 | ... = ... | cfg.rb:61:3:61:3 | C | | -| cfg.rb:60:17:60:17 | call to b | cfg.rb:60:21:60:22 | 10 | | +| cfg.rb:60:3:60:13 | conditional | cfg.rb:60:17:60:40 | ... ? ... : ... | | +| cfg.rb:60:3:60:40 | ... = ... | cfg.rb:60:3:60:40 | After ... = ... | | +| cfg.rb:60:3:60:40 | After ... = ... | cfg.rb:61:3:61:16 | Before ... = ... | | +| cfg.rb:60:3:60:40 | Before ... = ... | cfg.rb:60:3:60:13 | conditional | | +| cfg.rb:60:17:60:17 | After call to b | cfg.rb:60:21:60:22 | 10 | | +| cfg.rb:60:17:60:17 | Before call to b | cfg.rb:60:17:60:17 | self | | +| cfg.rb:60:17:60:17 | call to b | cfg.rb:60:17:60:17 | After call to b | | | cfg.rb:60:17:60:17 | self | cfg.rb:60:17:60:17 | call to b | | -| cfg.rb:60:17:60:22 | ... < ... | cfg.rb:60:27:60:31 | hello | true | -| cfg.rb:60:17:60:22 | ... < ... | cfg.rb:60:37:60:39 | bye | false | -| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:3:60:40 | ... = ... | | +| cfg.rb:60:17:60:22 | ... < ... | cfg.rb:60:17:60:22 | After ... < ... [false] | false | +| cfg.rb:60:17:60:22 | ... < ... | cfg.rb:60:17:60:22 | After ... < ... [true] | true | +| cfg.rb:60:17:60:22 | After ... < ... [false] | cfg.rb:60:36:60:40 | Before "bye" | | +| cfg.rb:60:17:60:22 | After ... < ... [true] | cfg.rb:60:26:60:32 | Before "hello" | | +| cfg.rb:60:17:60:22 | Before ... < ... | cfg.rb:60:17:60:17 | Before call to b | | +| cfg.rb:60:17:60:40 | ... ? ... : ... | cfg.rb:60:17:60:22 | Before ... < ... | | +| cfg.rb:60:17:60:40 | After ... ? ... : ... | cfg.rb:60:3:60:40 | ... = ... | | | cfg.rb:60:21:60:22 | 10 | cfg.rb:60:17:60:22 | ... < ... | | -| cfg.rb:60:26:60:32 | "hello" | cfg.rb:60:17:60:40 | ... ? ... : ... | | +| cfg.rb:60:26:60:32 | "hello" | cfg.rb:60:26:60:32 | After "hello" | | +| cfg.rb:60:26:60:32 | After "hello" | cfg.rb:60:17:60:40 | After ... ? ... : ... | | +| cfg.rb:60:26:60:32 | Before "hello" | cfg.rb:60:27:60:31 | hello | | | cfg.rb:60:27:60:31 | hello | cfg.rb:60:26:60:32 | "hello" | | -| cfg.rb:60:36:60:40 | "bye" | cfg.rb:60:17:60:40 | ... ? ... : ... | | +| cfg.rb:60:36:60:40 | "bye" | cfg.rb:60:36:60:40 | After "bye" | | +| cfg.rb:60:36:60:40 | After "bye" | cfg.rb:60:17:60:40 | After ... ? ... : ... | | +| cfg.rb:60:36:60:40 | Before "bye" | cfg.rb:60:37:60:39 | bye | | | cfg.rb:60:37:60:39 | bye | cfg.rb:60:36:60:40 | "bye" | | -| cfg.rb:61:3:61:3 | C | cfg.rb:61:8:61:15 | constant | | -| cfg.rb:61:3:61:16 | ... = ... | cfg.rb:62:17:62:27 | __synth__2 | | -| cfg.rb:61:7:61:16 | "constant" | cfg.rb:61:3:61:16 | ... = ... | | +| cfg.rb:61:3:61:3 | C | cfg.rb:61:7:61:16 | Before "constant" | | +| cfg.rb:61:3:61:16 | ... = ... | cfg.rb:61:3:61:16 | After ... = ... | | +| cfg.rb:61:3:61:16 | After ... = ... | cfg.rb:62:3:62:27 | ... | | +| cfg.rb:61:3:61:16 | Before ... = ... | cfg.rb:61:3:61:3 | C | | +| cfg.rb:61:7:61:16 | "constant" | cfg.rb:61:7:61:16 | After "constant" | | +| cfg.rb:61:7:61:16 | After "constant" | cfg.rb:61:3:61:16 | ... = ... | | +| cfg.rb:61:7:61:16 | Before "constant" | cfg.rb:61:8:61:15 | constant | | | cfg.rb:61:8:61:15 | constant | cfg.rb:61:7:61:16 | "constant" | | -| cfg.rb:62:3:62:27 | ... | cfg.rb:63:3:66:5 | pattern | | +| cfg.rb:62:3:62:27 | ... | cfg.rb:62:17:62:27 | Before ... = ... | | +| cfg.rb:62:3:62:27 | After ... | cfg.rb:63:3:66:5 | pattern | | | cfg.rb:62:4:62:4 | 0 | cfg.rb:62:4:62:4 | call to [] | | -| cfg.rb:62:4:62:4 | ... = ... | cfg.rb:62:7:62:12 | __synth__2__1 | | +| cfg.rb:62:4:62:4 | ... = ... | cfg.rb:62:4:62:4 | After ... = ... | | +| cfg.rb:62:4:62:4 | After ... = ... | cfg.rb:62:7:62:12 | ... | | +| cfg.rb:62:4:62:4 | After call to [] | cfg.rb:62:4:62:4 | ... = ... | | +| cfg.rb:62:4:62:4 | Before ... = ... | cfg.rb:62:4:62:4 | x | | +| cfg.rb:62:4:62:4 | Before call to [] | cfg.rb:62:4:62:4 | __synth__2 | | | cfg.rb:62:4:62:4 | __synth__2 | cfg.rb:62:4:62:4 | 0 | | -| cfg.rb:62:4:62:4 | call to [] | cfg.rb:62:4:62:4 | ... = ... | | -| cfg.rb:62:4:62:4 | x | cfg.rb:62:4:62:4 | __synth__2 | | +| cfg.rb:62:4:62:4 | call to [] | cfg.rb:62:4:62:4 | After call to [] | | +| cfg.rb:62:4:62:4 | x | cfg.rb:62:4:62:4 | Before call to [] | | | cfg.rb:62:7:62:12 | 1 | cfg.rb:62:7:62:12 | call to [] | | -| cfg.rb:62:7:62:12 | * ... | cfg.rb:62:7:62:12 | ... = ... | | -| cfg.rb:62:7:62:12 | ... | cfg.rb:62:3:62:27 | ... | | -| cfg.rb:62:7:62:12 | ... = ... | cfg.rb:62:8:62:8 | y | | +| cfg.rb:62:7:62:12 | * ... | cfg.rb:62:7:62:12 | After * ... | | +| cfg.rb:62:7:62:12 | ... | cfg.rb:62:7:62:12 | Before ... = ... | | +| cfg.rb:62:7:62:12 | ... = ... | cfg.rb:62:7:62:12 | After ... = ... | | +| cfg.rb:62:7:62:12 | After * ... | cfg.rb:62:7:62:12 | ... = ... | | +| cfg.rb:62:7:62:12 | After ... | cfg.rb:62:3:62:27 | After ... | | +| cfg.rb:62:7:62:12 | After ... = ... | cfg.rb:62:8:62:8 | Before ... = ... | | +| cfg.rb:62:7:62:12 | After call to [] | cfg.rb:62:7:62:12 | * ... | | +| cfg.rb:62:7:62:12 | Before * ... | cfg.rb:62:7:62:12 | Before call to [] | | +| cfg.rb:62:7:62:12 | Before ... = ... | cfg.rb:62:7:62:12 | __synth__2__1 | | +| cfg.rb:62:7:62:12 | Before call to [] | cfg.rb:62:7:62:12 | __synth__2 | | | cfg.rb:62:7:62:12 | __synth__2 | cfg.rb:62:7:62:12 | 1 | | -| cfg.rb:62:7:62:12 | __synth__2__1 | cfg.rb:62:7:62:12 | __synth__2 | | -| cfg.rb:62:7:62:12 | call to [] | cfg.rb:62:7:62:12 | * ... | | +| cfg.rb:62:7:62:12 | __synth__2__1 | cfg.rb:62:7:62:12 | Before * ... | | +| cfg.rb:62:7:62:12 | call to [] | cfg.rb:62:7:62:12 | After call to [] | | | cfg.rb:62:8:62:8 | 0 | cfg.rb:62:8:62:8 | call to [] | | -| cfg.rb:62:8:62:8 | ... = ... | cfg.rb:62:11:62:11 | z | | +| cfg.rb:62:8:62:8 | ... = ... | cfg.rb:62:8:62:8 | After ... = ... | | +| cfg.rb:62:8:62:8 | After ... = ... | cfg.rb:62:11:62:11 | Before ... = ... | | +| cfg.rb:62:8:62:8 | After call to [] | cfg.rb:62:8:62:8 | ... = ... | | +| cfg.rb:62:8:62:8 | Before ... = ... | cfg.rb:62:8:62:8 | y | | +| cfg.rb:62:8:62:8 | Before call to [] | cfg.rb:62:8:62:8 | __synth__2__1 | | | cfg.rb:62:8:62:8 | __synth__2__1 | cfg.rb:62:8:62:8 | 0 | | -| cfg.rb:62:8:62:8 | call to [] | cfg.rb:62:8:62:8 | ... = ... | | -| cfg.rb:62:8:62:8 | y | cfg.rb:62:8:62:8 | __synth__2__1 | | +| cfg.rb:62:8:62:8 | call to [] | cfg.rb:62:8:62:8 | After call to [] | | +| cfg.rb:62:8:62:8 | y | cfg.rb:62:8:62:8 | Before call to [] | | | cfg.rb:62:11:62:11 | 1 | cfg.rb:62:11:62:11 | call to [] | | -| cfg.rb:62:11:62:11 | ... = ... | cfg.rb:62:7:62:12 | ... | | +| cfg.rb:62:11:62:11 | ... = ... | cfg.rb:62:11:62:11 | After ... = ... | | +| cfg.rb:62:11:62:11 | After ... = ... | cfg.rb:62:7:62:12 | After ... | | +| cfg.rb:62:11:62:11 | After call to [] | cfg.rb:62:11:62:11 | ... = ... | | +| cfg.rb:62:11:62:11 | Before ... = ... | cfg.rb:62:11:62:11 | z | | +| cfg.rb:62:11:62:11 | Before call to [] | cfg.rb:62:11:62:11 | __synth__2__1 | | | cfg.rb:62:11:62:11 | __synth__2__1 | cfg.rb:62:11:62:11 | 1 | | -| cfg.rb:62:11:62:11 | call to [] | cfg.rb:62:11:62:11 | ... = ... | | -| cfg.rb:62:11:62:11 | z | cfg.rb:62:11:62:11 | __synth__2__1 | | -| cfg.rb:62:17:62:27 | * ... | cfg.rb:62:17:62:27 | ... = ... | | -| cfg.rb:62:17:62:27 | ... = ... | cfg.rb:62:4:62:4 | x | | +| cfg.rb:62:11:62:11 | call to [] | cfg.rb:62:11:62:11 | After call to [] | | +| cfg.rb:62:11:62:11 | z | cfg.rb:62:11:62:11 | Before call to [] | | +| cfg.rb:62:17:62:27 | * ... | cfg.rb:62:17:62:27 | After * ... | | +| cfg.rb:62:17:62:27 | ... = ... | cfg.rb:62:17:62:27 | After ... = ... | | +| cfg.rb:62:17:62:27 | After * ... | cfg.rb:62:17:62:27 | ... = ... | | +| cfg.rb:62:17:62:27 | After ... = ... | cfg.rb:62:4:62:4 | Before ... = ... | | +| cfg.rb:62:17:62:27 | After call to [] | cfg.rb:62:17:62:27 | * ... | | | cfg.rb:62:17:62:27 | Array | cfg.rb:62:18:62:18 | 1 | | -| cfg.rb:62:17:62:27 | __synth__2 | cfg.rb:62:17:62:27 | Array | | -| cfg.rb:62:17:62:27 | call to [] | cfg.rb:62:17:62:27 | * ... | | -| cfg.rb:62:18:62:18 | 1 | cfg.rb:62:21:62:26 | Array | | +| cfg.rb:62:17:62:27 | Before * ... | cfg.rb:62:17:62:27 | Before call to [] | | +| cfg.rb:62:17:62:27 | Before ... = ... | cfg.rb:62:17:62:27 | __synth__2 | | +| cfg.rb:62:17:62:27 | Before call to [] | cfg.rb:62:17:62:27 | Array | | +| cfg.rb:62:17:62:27 | __synth__2 | cfg.rb:62:17:62:27 | Before * ... | | +| cfg.rb:62:17:62:27 | call to [] | cfg.rb:62:17:62:27 | After call to [] | | +| cfg.rb:62:18:62:18 | 1 | cfg.rb:62:21:62:26 | Before call to [] | | +| cfg.rb:62:21:62:26 | After call to [] | cfg.rb:62:17:62:27 | call to [] | | | cfg.rb:62:21:62:26 | Array | cfg.rb:62:22:62:22 | 2 | | -| cfg.rb:62:21:62:26 | call to [] | cfg.rb:62:17:62:27 | call to [] | | +| cfg.rb:62:21:62:26 | Before call to [] | cfg.rb:62:21:62:26 | Array | | +| cfg.rb:62:21:62:26 | call to [] | cfg.rb:62:21:62:26 | After call to [] | | | cfg.rb:62:22:62:22 | 2 | cfg.rb:62:25:62:25 | 3 | | | cfg.rb:62:25:62:25 | 3 | cfg.rb:62:21:62:26 | call to [] | | -| cfg.rb:63:3:66:5 | enter pattern | cfg.rb:63:17:63:17 | a | | -| cfg.rb:63:3:66:5 | exit pattern (normal) | cfg.rb:63:3:66:5 | exit pattern | | -| cfg.rb:63:3:66:5 | pattern | cfg.rb:67:3:67:7 | items | | -| cfg.rb:63:16:63:20 | (..., ...) | cfg.rb:64:5:64:10 | self | | +| cfg.rb:63:3:66:5 | Entry | cfg.rb:63:16:63:20 | (..., ...) | | +| cfg.rb:63:3:66:5 | Normal Exit | cfg.rb:63:3:66:5 | Exit | | +| cfg.rb:63:3:66:5 | pattern | cfg.rb:67:3:67:19 | Before ... = ... | | +| cfg.rb:63:16:63:20 | (..., ...) | cfg.rb:63:17:63:17 | a | | +| cfg.rb:63:16:63:20 | After (..., ...) | cfg.rb:64:5:65:10 | ... | | | cfg.rb:63:17:63:17 | a | cfg.rb:63:19:63:19 | b | | -| cfg.rb:63:19:63:19 | b | cfg.rb:63:16:63:20 | (..., ...) | | -| cfg.rb:64:5:64:10 | call to puts | cfg.rb:65:5:65:10 | self | | +| cfg.rb:63:19:63:19 | b | cfg.rb:63:16:63:20 | After (..., ...) | | +| cfg.rb:64:5:64:10 | After call to puts | cfg.rb:65:5:65:10 | Before call to puts | | +| cfg.rb:64:5:64:10 | Before call to puts | cfg.rb:64:5:64:10 | self | | +| cfg.rb:64:5:64:10 | call to puts | cfg.rb:64:5:64:10 | After call to puts | | | cfg.rb:64:5:64:10 | self | cfg.rb:64:10:64:10 | a | | +| cfg.rb:64:5:65:10 | ... | cfg.rb:64:5:64:10 | Before call to puts | | +| cfg.rb:64:5:65:10 | After ... | cfg.rb:63:3:66:5 | Normal Exit | | | cfg.rb:64:10:64:10 | a | cfg.rb:64:5:64:10 | call to puts | | -| cfg.rb:65:5:65:10 | call to puts | cfg.rb:63:3:66:5 | exit pattern (normal) | | +| cfg.rb:65:5:65:10 | After call to puts | cfg.rb:64:5:65:10 | After ... | | +| cfg.rb:65:5:65:10 | Before call to puts | cfg.rb:65:5:65:10 | self | | +| cfg.rb:65:5:65:10 | call to puts | cfg.rb:65:5:65:10 | After call to puts | | | cfg.rb:65:5:65:10 | self | cfg.rb:65:10:65:10 | b | | | cfg.rb:65:10:65:10 | b | cfg.rb:65:5:65:10 | call to puts | | -| cfg.rb:67:3:67:7 | items | cfg.rb:67:11:67:19 | Array | | -| cfg.rb:67:3:67:19 | ... = ... | cfg.rb:68:3:68:15 | self | | +| cfg.rb:67:3:67:7 | items | cfg.rb:67:11:67:19 | Before call to [] | | +| cfg.rb:67:3:67:19 | ... = ... | cfg.rb:67:3:67:19 | After ... = ... | | +| cfg.rb:67:3:67:19 | After ... = ... | cfg.rb:68:3:68:15 | Before call to puts | | +| cfg.rb:67:3:67:19 | Before ... = ... | cfg.rb:67:3:67:7 | items | | +| cfg.rb:67:11:67:19 | After call to [] | cfg.rb:67:3:67:19 | ... = ... | | | cfg.rb:67:11:67:19 | Array | cfg.rb:67:12:67:12 | 1 | | -| cfg.rb:67:11:67:19 | call to [] | cfg.rb:67:3:67:19 | ... = ... | | +| cfg.rb:67:11:67:19 | Before call to [] | cfg.rb:67:11:67:19 | Array | | +| cfg.rb:67:11:67:19 | call to [] | cfg.rb:67:11:67:19 | After call to [] | | | cfg.rb:67:12:67:12 | 1 | cfg.rb:67:15:67:15 | 2 | | | cfg.rb:67:15:67:15 | 2 | cfg.rb:67:18:67:18 | 3 | | | cfg.rb:67:18:67:18 | 3 | cfg.rb:67:11:67:19 | call to [] | | -| cfg.rb:68:3:68:15 | call to puts | cfg.rb:69:3:71:5 | print | | -| cfg.rb:68:3:68:15 | self | cfg.rb:68:8:68:12 | items | | +| cfg.rb:68:3:68:15 | After call to puts | cfg.rb:69:3:71:5 | print | | +| cfg.rb:68:3:68:15 | Before call to puts | cfg.rb:68:3:68:15 | self | | +| cfg.rb:68:3:68:15 | call to puts | cfg.rb:68:3:68:15 | After call to puts | | +| cfg.rb:68:3:68:15 | self | cfg.rb:68:8:68:15 | Before ...[...] | | | cfg.rb:68:8:68:12 | items | cfg.rb:68:14:68:14 | 2 | | -| cfg.rb:68:8:68:15 | ...[...] | cfg.rb:68:3:68:15 | call to puts | | +| cfg.rb:68:8:68:15 | ...[...] | cfg.rb:68:8:68:15 | After ...[...] | | +| cfg.rb:68:8:68:15 | After ...[...] | cfg.rb:68:3:68:15 | call to puts | | +| cfg.rb:68:8:68:15 | Before ...[...] | cfg.rb:68:8:68:12 | items | | | cfg.rb:68:14:68:14 | 2 | cfg.rb:68:8:68:15 | ...[...] | | -| cfg.rb:69:3:71:5 | enter print | cfg.rb:70:5:70:16 | self | | -| cfg.rb:69:3:71:5 | exit print (normal) | cfg.rb:69:3:71:5 | exit print | | -| cfg.rb:69:3:71:5 | print | cfg.rb:74:1:74:1 | x | | -| cfg.rb:70:5:70:16 | call to puts | cfg.rb:69:3:71:5 | exit print (normal) | | -| cfg.rb:70:5:70:16 | self | cfg.rb:70:11:70:15 | silly | | -| cfg.rb:70:10:70:16 | "silly" | cfg.rb:70:5:70:16 | call to puts | | +| cfg.rb:69:3:71:5 | Entry | cfg.rb:70:5:70:16 | ... | | +| cfg.rb:69:3:71:5 | Normal Exit | cfg.rb:69:3:71:5 | Exit | | +| cfg.rb:69:3:71:5 | print | cfg.rb:58:1:72:3 | After Silly | | +| cfg.rb:70:5:70:16 | ... | cfg.rb:70:5:70:16 | Before call to puts | | +| cfg.rb:70:5:70:16 | After ... | cfg.rb:69:3:71:5 | Normal Exit | | +| cfg.rb:70:5:70:16 | After call to puts | cfg.rb:70:5:70:16 | After ... | | +| cfg.rb:70:5:70:16 | Before call to puts | cfg.rb:70:5:70:16 | self | | +| cfg.rb:70:5:70:16 | call to puts | cfg.rb:70:5:70:16 | After call to puts | | +| cfg.rb:70:5:70:16 | self | cfg.rb:70:10:70:16 | Before "silly" | | +| cfg.rb:70:10:70:16 | "silly" | cfg.rb:70:10:70:16 | After "silly" | | +| cfg.rb:70:10:70:16 | After "silly" | cfg.rb:70:5:70:16 | call to puts | | +| cfg.rb:70:10:70:16 | Before "silly" | cfg.rb:70:11:70:15 | silly | | | cfg.rb:70:11:70:15 | silly | cfg.rb:70:10:70:16 | "silly" | | | cfg.rb:74:1:74:1 | x | cfg.rb:74:5:74:6 | 42 | | -| cfg.rb:74:1:74:6 | ... = ... | cfg.rb:75:4:75:4 | x | | +| cfg.rb:74:1:74:6 | ... = ... | cfg.rb:74:1:74:6 | After ... = ... | | +| cfg.rb:74:1:74:6 | After ... = ... | cfg.rb:75:1:75:47 | if ... | | +| cfg.rb:74:1:74:6 | Before ... = ... | cfg.rb:74:1:74:1 | x | | | cfg.rb:74:5:74:6 | 42 | cfg.rb:74:1:74:6 | ... = ... | | -| cfg.rb:75:1:75:47 | if ... | cfg.rb:78:3:78:3 | ; | | +| cfg.rb:75:1:75:47 | After if ... | cfg.rb:77:1:86:3 | begin ... | | +| cfg.rb:75:1:75:47 | if ... | cfg.rb:75:4:75:8 | Before ... < ... | | | cfg.rb:75:4:75:4 | x | cfg.rb:75:8:75:8 | 0 | | -| cfg.rb:75:4:75:8 | ... < ... | cfg.rb:75:15:75:15 | 0 | true | -| cfg.rb:75:4:75:8 | ... < ... | cfg.rb:75:23:75:23 | x | false | +| cfg.rb:75:4:75:8 | ... < ... | cfg.rb:75:4:75:8 | After ... < ... [false] | false | +| cfg.rb:75:4:75:8 | ... < ... | cfg.rb:75:4:75:8 | After ... < ... [true] | true | +| cfg.rb:75:4:75:8 | After ... < ... [false] | cfg.rb:75:17:75:43 | elsif ... | | +| cfg.rb:75:4:75:8 | After ... < ... [true] | cfg.rb:75:10:75:15 | then ... | | +| cfg.rb:75:4:75:8 | Before ... < ... | cfg.rb:75:4:75:4 | x | | | cfg.rb:75:8:75:8 | 0 | cfg.rb:75:4:75:8 | ... < ... | | -| cfg.rb:75:10:75:15 | then ... | cfg.rb:75:1:75:47 | if ... | | -| cfg.rb:75:15:75:15 | 0 | cfg.rb:75:10:75:15 | then ... | | -| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:1:75:47 | if ... | | +| cfg.rb:75:10:75:15 | After then ... | cfg.rb:75:1:75:47 | After if ... | | +| cfg.rb:75:10:75:15 | then ... | cfg.rb:75:15:75:15 | 0 | | +| cfg.rb:75:15:75:15 | 0 | cfg.rb:75:10:75:15 | After then ... | | +| cfg.rb:75:17:75:43 | After elsif ... | cfg.rb:75:1:75:47 | After if ... | | +| cfg.rb:75:17:75:43 | elsif ... | cfg.rb:75:23:75:28 | Before ... > ... | | | cfg.rb:75:23:75:23 | x | cfg.rb:75:27:75:28 | 10 | | -| cfg.rb:75:23:75:28 | ... > ... | cfg.rb:75:35:75:36 | 10 | true | -| cfg.rb:75:23:75:28 | ... > ... | cfg.rb:75:43:75:43 | x | false | +| cfg.rb:75:23:75:28 | ... > ... | cfg.rb:75:23:75:28 | After ... > ... [false] | false | +| cfg.rb:75:23:75:28 | ... > ... | cfg.rb:75:23:75:28 | After ... > ... [true] | true | +| cfg.rb:75:23:75:28 | After ... > ... [false] | cfg.rb:75:38:75:43 | else ... | | +| cfg.rb:75:23:75:28 | After ... > ... [true] | cfg.rb:75:30:75:36 | then ... | | +| cfg.rb:75:23:75:28 | Before ... > ... | cfg.rb:75:23:75:23 | x | | | cfg.rb:75:27:75:28 | 10 | cfg.rb:75:23:75:28 | ... > ... | | -| cfg.rb:75:30:75:36 | then ... | cfg.rb:75:17:75:43 | elsif ... | | -| cfg.rb:75:35:75:36 | 10 | cfg.rb:75:30:75:36 | then ... | | -| cfg.rb:75:38:75:43 | else ... | cfg.rb:75:17:75:43 | elsif ... | | -| cfg.rb:75:43:75:43 | x | cfg.rb:75:38:75:43 | else ... | | -| cfg.rb:78:3:78:3 | ; | cfg.rb:83:3:83:11 | self | | -| cfg.rb:82:1:83:11 | else ... | cfg.rb:85:3:85:12 | self | | -| cfg.rb:83:3:83:11 | call to puts | cfg.rb:82:1:83:11 | else ... | | -| cfg.rb:83:3:83:11 | self | cfg.rb:83:9:83:10 | ok | | -| cfg.rb:83:8:83:11 | "ok" | cfg.rb:83:3:83:11 | call to puts | | +| cfg.rb:75:30:75:36 | After then ... | cfg.rb:75:17:75:43 | After elsif ... | | +| cfg.rb:75:30:75:36 | then ... | cfg.rb:75:35:75:36 | 10 | | +| cfg.rb:75:35:75:36 | 10 | cfg.rb:75:30:75:36 | After then ... | | +| cfg.rb:75:38:75:43 | After else ... | cfg.rb:75:17:75:43 | After elsif ... | | +| cfg.rb:75:38:75:43 | else ... | cfg.rb:75:43:75:43 | x | | +| cfg.rb:75:43:75:43 | x | cfg.rb:75:38:75:43 | After else ... | | +| cfg.rb:77:1:86:3 | After begin ... | cfg.rb:88:1:88:23 | Before ... = ... | | +| cfg.rb:77:1:86:3 | begin ... | cfg.rb:78:3:78:3 | ; | | +| cfg.rb:78:3:78:3 | ; | cfg.rb:82:1:83:11 | else ... | | +| cfg.rb:82:1:83:11 | After else ... | cfg.rb:84:1:85:12 | ensure ... | | +| cfg.rb:82:1:83:11 | else ... | cfg.rb:83:3:83:11 | Before call to puts | | +| cfg.rb:83:3:83:11 | After call to puts | cfg.rb:82:1:83:11 | After else ... | | +| cfg.rb:83:3:83:11 | Before call to puts | cfg.rb:83:3:83:11 | self | | +| cfg.rb:83:3:83:11 | call to puts | cfg.rb:83:3:83:11 | After call to puts | | +| cfg.rb:83:3:83:11 | self | cfg.rb:83:8:83:11 | Before "ok" | | +| cfg.rb:83:8:83:11 | "ok" | cfg.rb:83:8:83:11 | After "ok" | | +| cfg.rb:83:8:83:11 | After "ok" | cfg.rb:83:3:83:11 | call to puts | | +| cfg.rb:83:8:83:11 | Before "ok" | cfg.rb:83:9:83:10 | ok | | | cfg.rb:83:9:83:10 | ok | cfg.rb:83:8:83:11 | "ok" | | -| cfg.rb:84:1:85:12 | ensure ... | cfg.rb:88:1:88:6 | escape | | -| cfg.rb:85:3:85:12 | call to puts | cfg.rb:84:1:85:12 | ensure ... | | -| cfg.rb:85:3:85:12 | self | cfg.rb:85:9:85:11 | end | | -| cfg.rb:85:8:85:12 | "end" | cfg.rb:85:3:85:12 | call to puts | | +| cfg.rb:84:1:85:12 | After ensure ... | cfg.rb:1:1:221:1 | Exceptional Exit | exception | +| cfg.rb:84:1:85:12 | After ensure ... | cfg.rb:77:1:86:3 | After begin ... | | +| cfg.rb:84:1:85:12 | ensure ... | cfg.rb:85:3:85:12 | Before call to puts | | +| cfg.rb:85:3:85:12 | After call to puts | cfg.rb:84:1:85:12 | After ensure ... | | +| cfg.rb:85:3:85:12 | Before call to puts | cfg.rb:85:3:85:12 | self | | +| cfg.rb:85:3:85:12 | call to puts | cfg.rb:85:3:85:12 | After call to puts | | +| cfg.rb:85:3:85:12 | self | cfg.rb:85:8:85:12 | Before "end" | | +| cfg.rb:85:8:85:12 | "end" | cfg.rb:85:8:85:12 | After "end" | | +| cfg.rb:85:8:85:12 | After "end" | cfg.rb:85:3:85:12 | call to puts | | +| cfg.rb:85:8:85:12 | Before "end" | cfg.rb:85:9:85:11 | end | | | cfg.rb:85:9:85:11 | end | cfg.rb:85:8:85:12 | "end" | | -| cfg.rb:88:1:88:6 | escape | cfg.rb:88:11:88:16 | \\u1234 | | -| cfg.rb:88:1:88:23 | ... = ... | cfg.rb:90:5:90:5 | x | | -| cfg.rb:88:10:88:23 | "\\u1234#{...}\\n" | cfg.rb:88:1:88:23 | ... = ... | | -| cfg.rb:88:11:88:16 | \\u1234 | cfg.rb:88:19:88:19 | x | | -| cfg.rb:88:17:88:20 | #{...} | cfg.rb:88:21:88:22 | \\n | | -| cfg.rb:88:19:88:19 | x | cfg.rb:88:17:88:20 | #{...} | | +| cfg.rb:88:1:88:6 | escape | cfg.rb:88:10:88:23 | Before "\\u1234#{...}\\n" | | +| cfg.rb:88:1:88:23 | ... = ... | cfg.rb:88:1:88:23 | After ... = ... | | +| cfg.rb:88:1:88:23 | After ... = ... | cfg.rb:90:1:93:3 | ... | | +| cfg.rb:88:1:88:23 | Before ... = ... | cfg.rb:88:1:88:6 | escape | | +| cfg.rb:88:10:88:23 | "\\u1234#{...}\\n" | cfg.rb:88:10:88:23 | After "\\u1234#{...}\\n" | | +| cfg.rb:88:10:88:23 | After "\\u1234#{...}\\n" | cfg.rb:88:1:88:23 | ... = ... | | +| cfg.rb:88:10:88:23 | Before "\\u1234#{...}\\n" | cfg.rb:88:11:88:16 | \\u1234 | | +| cfg.rb:88:11:88:16 | \\u1234 | cfg.rb:88:17:88:20 | #{...} | | +| cfg.rb:88:17:88:20 | #{...} | cfg.rb:88:19:88:19 | x | | +| cfg.rb:88:17:88:20 | After #{...} | cfg.rb:88:21:88:22 | \\n | | +| cfg.rb:88:19:88:19 | x | cfg.rb:88:17:88:20 | After #{...} | | | cfg.rb:88:21:88:22 | \\n | cfg.rb:88:10:88:23 | "\\u1234#{...}\\n" | | -| cfg.rb:90:1:93:3 | ... | cfg.rb:95:1:95:7 | $global | | -| cfg.rb:90:1:93:3 | ... = ... | cfg.rb:91:6:91:6 | x | | +| cfg.rb:90:1:93:3 | ... | cfg.rb:90:1:93:3 | Before ... = ... | | +| cfg.rb:90:1:93:3 | ... | cfg.rb:90:5:90:5 | if ... | | +| cfg.rb:90:1:93:3 | ... = ... | cfg.rb:90:1:93:3 | After ... = ... | | +| cfg.rb:90:1:93:3 | After ... | cfg.rb:90:1:93:3 | Normal Exit | | +| cfg.rb:90:1:93:3 | After ... | cfg.rb:95:1:95:12 | Before ... = ... | | +| cfg.rb:90:1:93:3 | After ... = ... | cfg.rb:91:3:91:24 | if ... | | +| cfg.rb:90:1:93:3 | After call to each | cfg.rb:90:1:93:3 | After ... | | +| cfg.rb:90:1:93:3 | Before ... = ... | cfg.rb:90:5:90:5 | x | | +| cfg.rb:90:1:93:3 | Before call to each | cfg.rb:90:10:90:26 | Before call to [] | | +| cfg.rb:90:1:93:3 | Entry | cfg.rb:90:1:93:3 | __synth__0__1 | | +| cfg.rb:90:1:93:3 | Normal Exit | cfg.rb:90:1:93:3 | Exit | | +| cfg.rb:90:1:93:3 | __synth__0__1 | cfg.rb:90:1:93:3 | ... | | | cfg.rb:90:1:93:3 | __synth__0__1 | cfg.rb:90:1:93:3 | ... = ... | | -| cfg.rb:90:1:93:3 | __synth__0__1 | cfg.rb:90:5:90:5 | x | | -| cfg.rb:90:1:93:3 | call to each | cfg.rb:90:1:93:3 | ... | | -| cfg.rb:90:1:93:3 | enter { ... } | cfg.rb:90:1:93:3 | __synth__0__1 | | -| cfg.rb:90:1:93:3 | exit { ... } (normal) | cfg.rb:90:1:93:3 | exit { ... } | | +| cfg.rb:90:1:93:3 | call to each | cfg.rb:90:1:93:3 | After call to each | | | cfg.rb:90:1:93:3 | { ... } | cfg.rb:90:1:93:3 | call to each | | -| cfg.rb:90:5:90:5 | ... = ... | cfg.rb:90:5:90:5 | if ... | | -| cfg.rb:90:5:90:5 | [false] ! ... | cfg.rb:90:5:90:5 | if ... | false | -| cfg.rb:90:5:90:5 | [true] ! ... | cfg.rb:90:5:90:5 | x | true | -| cfg.rb:90:5:90:5 | defined? ... | cfg.rb:90:5:90:5 | [false] ! ... | true | -| cfg.rb:90:5:90:5 | defined? ... | cfg.rb:90:5:90:5 | [true] ! ... | false | -| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:10:90:26 | Array | | +| cfg.rb:90:5:90:5 | ! ... | cfg.rb:90:5:90:5 | Before defined? ... | | +| cfg.rb:90:5:90:5 | ... = ... | cfg.rb:90:5:90:5 | After ... = ... | | +| cfg.rb:90:5:90:5 | After ! ... [false] | cfg.rb:90:5:90:5 | After if ... | | +| cfg.rb:90:5:90:5 | After ! ... [true] | cfg.rb:90:5:90:5 | Before ... = ... | | +| cfg.rb:90:5:90:5 | After ... = ... | cfg.rb:90:5:90:5 | After if ... | | +| cfg.rb:90:5:90:5 | After defined? ... [false] | cfg.rb:90:5:90:5 | After ! ... [true] | true | +| cfg.rb:90:5:90:5 | After defined? ... [true] | cfg.rb:90:5:90:5 | After ! ... [false] | false | +| cfg.rb:90:5:90:5 | After if ... | cfg.rb:90:1:93:3 | Before call to each | | +| cfg.rb:90:5:90:5 | Before ... = ... | cfg.rb:90:5:90:5 | x | | +| cfg.rb:90:5:90:5 | Before defined? ... | cfg.rb:90:5:90:5 | x | | +| cfg.rb:90:5:90:5 | defined? ... | cfg.rb:90:5:90:5 | After defined? ... [false] | false | +| cfg.rb:90:5:90:5 | defined? ... | cfg.rb:90:5:90:5 | After defined? ... [true] | true | +| cfg.rb:90:5:90:5 | if ... | cfg.rb:90:5:90:5 | ! ... | | | cfg.rb:90:5:90:5 | nil | cfg.rb:90:5:90:5 | ... = ... | | | cfg.rb:90:5:90:5 | x | cfg.rb:90:1:93:3 | __synth__0__1 | | | cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | defined? ... | | | cfg.rb:90:5:90:5 | x | cfg.rb:90:5:90:5 | nil | | +| cfg.rb:90:10:90:26 | After call to [] | cfg.rb:90:1:93:3 | { ... } | | | cfg.rb:90:10:90:26 | Array | cfg.rb:90:11:90:13 | 1.4 | | -| cfg.rb:90:10:90:26 | call to [] | cfg.rb:90:1:93:3 | { ... } | | +| cfg.rb:90:10:90:26 | Before call to [] | cfg.rb:90:10:90:26 | Array | | +| cfg.rb:90:10:90:26 | call to [] | cfg.rb:90:10:90:26 | After call to [] | | | cfg.rb:90:11:90:13 | 1.4 | cfg.rb:90:16:90:18 | 2.5 | | | cfg.rb:90:16:90:18 | 2.5 | cfg.rb:90:21:90:25 | 3.4e5 | | | cfg.rb:90:21:90:25 | 3.4e5 | cfg.rb:90:10:90:26 | call to [] | | -| cfg.rb:91:3:91:24 | if ... | cfg.rb:92:3:92:8 | self | | +| cfg.rb:91:3:91:24 | After if ... | cfg.rb:92:3:92:8 | Before call to puts | | +| cfg.rb:91:3:91:24 | if ... | cfg.rb:91:6:91:10 | Before ... > ... | | | cfg.rb:91:6:91:6 | x | cfg.rb:91:10:91:10 | 3 | | -| cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:3:91:24 | if ... | false | -| cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:17:91:20 | next | true | +| cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:6:91:10 | After ... > ... [false] | false | +| cfg.rb:91:6:91:10 | ... > ... | cfg.rb:91:6:91:10 | After ... > ... [true] | true | +| cfg.rb:91:6:91:10 | After ... > ... [false] | cfg.rb:91:3:91:24 | After if ... | | +| cfg.rb:91:6:91:10 | After ... > ... [true] | cfg.rb:91:12:91:20 | then ... | | +| cfg.rb:91:6:91:10 | Before ... > ... | cfg.rb:91:6:91:6 | x | | | cfg.rb:91:10:91:10 | 3 | cfg.rb:91:6:91:10 | ... > ... | | -| cfg.rb:91:17:91:20 | next | cfg.rb:90:1:93:3 | exit { ... } (normal) | continue | -| cfg.rb:92:3:92:8 | call to puts | cfg.rb:90:1:93:3 | exit { ... } (normal) | | +| cfg.rb:91:12:91:20 | then ... | cfg.rb:91:17:91:20 | Before next | | +| cfg.rb:91:17:91:20 | Before next | cfg.rb:91:17:91:20 | next | | +| cfg.rb:91:17:91:20 | next | cfg.rb:90:1:93:3 | Normal Exit | continue | +| cfg.rb:92:3:92:8 | After call to puts | cfg.rb:90:1:93:3 | After ... | | +| cfg.rb:92:3:92:8 | Before call to puts | cfg.rb:92:3:92:8 | self | | +| cfg.rb:92:3:92:8 | call to puts | cfg.rb:92:3:92:8 | After call to puts | | | cfg.rb:92:3:92:8 | self | cfg.rb:92:8:92:8 | x | | | cfg.rb:92:8:92:8 | x | cfg.rb:92:3:92:8 | call to puts | | | cfg.rb:95:1:95:7 | $global | cfg.rb:95:11:95:12 | 42 | | -| cfg.rb:95:1:95:12 | ... = ... | cfg.rb:97:1:97:4 | map1 | | +| cfg.rb:95:1:95:12 | ... = ... | cfg.rb:95:1:95:12 | After ... = ... | | +| cfg.rb:95:1:95:12 | After ... = ... | cfg.rb:97:1:97:39 | Before ... = ... | | +| cfg.rb:95:1:95:12 | Before ... = ... | cfg.rb:95:1:95:7 | $global | | | cfg.rb:95:11:95:12 | 42 | cfg.rb:95:1:95:12 | ... = ... | | -| cfg.rb:97:1:97:4 | map1 | cfg.rb:97:8:97:39 | Hash | | -| cfg.rb:97:1:97:39 | ... = ... | cfg.rb:98:1:98:4 | map2 | | -| cfg.rb:97:8:97:39 | Hash | cfg.rb:97:11:97:11 | a | | -| cfg.rb:97:8:97:39 | call to [] | cfg.rb:97:1:97:39 | ... = ... | | -| cfg.rb:97:10:97:12 | "a" | cfg.rb:97:18:97:18 | b | | -| cfg.rb:97:10:97:19 | Pair | cfg.rb:97:23:97:23 | c | | +| cfg.rb:97:1:97:4 | map1 | cfg.rb:97:8:97:39 | Before call to [] | | +| cfg.rb:97:1:97:39 | ... = ... | cfg.rb:97:1:97:39 | After ... = ... | | +| cfg.rb:97:1:97:39 | After ... = ... | cfg.rb:98:1:98:36 | Before ... = ... | | +| cfg.rb:97:1:97:39 | Before ... = ... | cfg.rb:97:1:97:4 | map1 | | +| cfg.rb:97:8:97:39 | After call to [] | cfg.rb:97:1:97:39 | ... = ... | | +| cfg.rb:97:8:97:39 | Before call to [] | cfg.rb:97:8:97:39 | Hash | | +| cfg.rb:97:8:97:39 | Hash | cfg.rb:97:10:97:19 | Before Pair | | +| cfg.rb:97:8:97:39 | call to [] | cfg.rb:97:8:97:39 | After call to [] | | +| cfg.rb:97:10:97:12 | "a" | cfg.rb:97:10:97:12 | After "a" | | +| cfg.rb:97:10:97:12 | After "a" | cfg.rb:97:17:97:19 | Before "b" | | +| cfg.rb:97:10:97:12 | Before "a" | cfg.rb:97:11:97:11 | a | | +| cfg.rb:97:10:97:19 | After Pair | cfg.rb:97:22:97:29 | Before Pair | | +| cfg.rb:97:10:97:19 | Before Pair | cfg.rb:97:10:97:12 | Before "a" | | +| cfg.rb:97:10:97:19 | Pair | cfg.rb:97:10:97:19 | After Pair | | | cfg.rb:97:11:97:11 | a | cfg.rb:97:10:97:12 | "a" | | -| cfg.rb:97:17:97:19 | "b" | cfg.rb:97:10:97:19 | Pair | | +| cfg.rb:97:17:97:19 | "b" | cfg.rb:97:17:97:19 | After "b" | | +| cfg.rb:97:17:97:19 | After "b" | cfg.rb:97:10:97:19 | Pair | | +| cfg.rb:97:17:97:19 | Before "b" | cfg.rb:97:18:97:18 | b | | | cfg.rb:97:18:97:18 | b | cfg.rb:97:17:97:19 | "b" | | -| cfg.rb:97:22:97:24 | "c" | cfg.rb:97:28:97:28 | d | | -| cfg.rb:97:22:97:29 | Pair | cfg.rb:97:32:97:32 | e | | +| cfg.rb:97:22:97:24 | "c" | cfg.rb:97:22:97:24 | After "c" | | +| cfg.rb:97:22:97:24 | After "c" | cfg.rb:97:27:97:29 | Before "d" | | +| cfg.rb:97:22:97:24 | Before "c" | cfg.rb:97:23:97:23 | c | | +| cfg.rb:97:22:97:29 | After Pair | cfg.rb:97:32:97:37 | Before Pair | | +| cfg.rb:97:22:97:29 | Before Pair | cfg.rb:97:22:97:24 | Before "c" | | +| cfg.rb:97:22:97:29 | Pair | cfg.rb:97:22:97:29 | After Pair | | | cfg.rb:97:23:97:23 | c | cfg.rb:97:22:97:24 | "c" | | -| cfg.rb:97:27:97:29 | "d" | cfg.rb:97:22:97:29 | Pair | | +| cfg.rb:97:27:97:29 | "d" | cfg.rb:97:27:97:29 | After "d" | | +| cfg.rb:97:27:97:29 | After "d" | cfg.rb:97:22:97:29 | Pair | | +| cfg.rb:97:27:97:29 | Before "d" | cfg.rb:97:28:97:28 | d | | | cfg.rb:97:28:97:28 | d | cfg.rb:97:27:97:29 | "d" | | -| cfg.rb:97:32:97:32 | :e | cfg.rb:97:36:97:36 | f | | +| cfg.rb:97:32:97:32 | :e | cfg.rb:97:32:97:32 | After :e | | +| cfg.rb:97:32:97:32 | After :e | cfg.rb:97:35:97:37 | Before "f" | | +| cfg.rb:97:32:97:32 | Before :e | cfg.rb:97:32:97:32 | e | | | cfg.rb:97:32:97:32 | e | cfg.rb:97:32:97:32 | :e | | -| cfg.rb:97:32:97:37 | Pair | cfg.rb:97:8:97:39 | call to [] | | -| cfg.rb:97:35:97:37 | "f" | cfg.rb:97:32:97:37 | Pair | | +| cfg.rb:97:32:97:37 | After Pair | cfg.rb:97:8:97:39 | call to [] | | +| cfg.rb:97:32:97:37 | Before Pair | cfg.rb:97:32:97:32 | Before :e | | +| cfg.rb:97:32:97:37 | Pair | cfg.rb:97:32:97:37 | After Pair | | +| cfg.rb:97:35:97:37 | "f" | cfg.rb:97:35:97:37 | After "f" | | +| cfg.rb:97:35:97:37 | After "f" | cfg.rb:97:32:97:37 | Pair | | +| cfg.rb:97:35:97:37 | Before "f" | cfg.rb:97:36:97:36 | f | | | cfg.rb:97:36:97:36 | f | cfg.rb:97:35:97:37 | "f" | | -| cfg.rb:98:1:98:4 | map2 | cfg.rb:98:8:98:36 | Hash | | -| cfg.rb:98:1:98:36 | ... = ... | cfg.rb:101:1:104:3 | parameters | | -| cfg.rb:98:8:98:36 | Hash | cfg.rb:98:12:98:15 | map1 | | -| cfg.rb:98:8:98:36 | call to [] | cfg.rb:98:1:98:36 | ... = ... | | -| cfg.rb:98:10:98:15 | ** ... | cfg.rb:98:19:98:19 | x | | +| cfg.rb:98:1:98:4 | map2 | cfg.rb:98:8:98:36 | Before call to [] | | +| cfg.rb:98:1:98:36 | ... = ... | cfg.rb:98:1:98:36 | After ... = ... | | +| cfg.rb:98:1:98:36 | After ... = ... | cfg.rb:101:1:104:3 | parameters | | +| cfg.rb:98:1:98:36 | Before ... = ... | cfg.rb:98:1:98:4 | map2 | | +| cfg.rb:98:8:98:36 | After call to [] | cfg.rb:98:1:98:36 | ... = ... | | +| cfg.rb:98:8:98:36 | Before call to [] | cfg.rb:98:8:98:36 | Hash | | +| cfg.rb:98:8:98:36 | Hash | cfg.rb:98:10:98:15 | Before ** ... | | +| cfg.rb:98:8:98:36 | call to [] | cfg.rb:98:8:98:36 | After call to [] | | +| cfg.rb:98:10:98:15 | ** ... | cfg.rb:98:10:98:15 | After ** ... | | +| cfg.rb:98:10:98:15 | After ** ... | cfg.rb:98:18:98:27 | Before Pair | | +| cfg.rb:98:10:98:15 | Before ** ... | cfg.rb:98:12:98:15 | map1 | | | cfg.rb:98:12:98:15 | map1 | cfg.rb:98:10:98:15 | ** ... | | -| cfg.rb:98:18:98:20 | "x" | cfg.rb:98:26:98:26 | y | | -| cfg.rb:98:18:98:27 | Pair | cfg.rb:98:32:98:35 | map1 | | +| cfg.rb:98:18:98:20 | "x" | cfg.rb:98:18:98:20 | After "x" | | +| cfg.rb:98:18:98:20 | After "x" | cfg.rb:98:25:98:27 | Before "y" | | +| cfg.rb:98:18:98:20 | Before "x" | cfg.rb:98:19:98:19 | x | | +| cfg.rb:98:18:98:27 | After Pair | cfg.rb:98:30:98:35 | Before ** ... | | +| cfg.rb:98:18:98:27 | Before Pair | cfg.rb:98:18:98:20 | Before "x" | | +| cfg.rb:98:18:98:27 | Pair | cfg.rb:98:18:98:27 | After Pair | | | cfg.rb:98:19:98:19 | x | cfg.rb:98:18:98:20 | "x" | | -| cfg.rb:98:25:98:27 | "y" | cfg.rb:98:18:98:27 | Pair | | +| cfg.rb:98:25:98:27 | "y" | cfg.rb:98:25:98:27 | After "y" | | +| cfg.rb:98:25:98:27 | After "y" | cfg.rb:98:18:98:27 | Pair | | +| cfg.rb:98:25:98:27 | Before "y" | cfg.rb:98:26:98:26 | y | | | cfg.rb:98:26:98:26 | y | cfg.rb:98:25:98:27 | "y" | | -| cfg.rb:98:30:98:35 | ** ... | cfg.rb:98:8:98:36 | call to [] | | +| cfg.rb:98:30:98:35 | ** ... | cfg.rb:98:30:98:35 | After ** ... | | +| cfg.rb:98:30:98:35 | After ** ... | cfg.rb:98:8:98:36 | call to [] | | +| cfg.rb:98:30:98:35 | Before ** ... | cfg.rb:98:32:98:35 | map1 | | | cfg.rb:98:32:98:35 | map1 | cfg.rb:98:30:98:35 | ** ... | | -| cfg.rb:101:1:104:3 | enter parameters | cfg.rb:101:16:101:20 | value | | -| cfg.rb:101:1:104:3 | exit parameters (normal) | cfg.rb:101:1:104:3 | exit parameters | | -| cfg.rb:101:1:104:3 | parameters | cfg.rb:106:1:106:4 | type | | -| cfg.rb:101:16:101:20 | value | cfg.rb:101:24:101:25 | 42 | false, no-match, true | -| cfg.rb:101:16:101:20 | value | cfg.rb:101:28:101:30 | key | match | +| cfg.rb:101:1:104:3 | Entry | cfg.rb:101:16:101:20 | value | | +| cfg.rb:101:1:104:3 | Normal Exit | cfg.rb:101:1:104:3 | Exit | | +| cfg.rb:101:1:104:3 | parameters | cfg.rb:106:1:106:17 | Before ... = ... | | +| cfg.rb:101:16:101:20 | After value [match] | cfg.rb:101:28:101:30 | key | | +| cfg.rb:101:16:101:20 | After value [no-match] | cfg.rb:101:24:101:25 | 42 | | +| cfg.rb:101:16:101:20 | value | cfg.rb:101:16:101:20 | After value [match] | match | +| cfg.rb:101:16:101:20 | value | cfg.rb:101:16:101:20 | After value [no-match] | no-match | | cfg.rb:101:24:101:25 | 42 | cfg.rb:101:28:101:30 | key | | | cfg.rb:101:28:101:30 | key | cfg.rb:101:36:101:41 | kwargs | | -| cfg.rb:101:36:101:41 | kwargs | cfg.rb:102:3:102:12 | self | | -| cfg.rb:102:3:102:12 | call to puts | cfg.rb:103:10:103:15 | kwargs | | +| cfg.rb:101:36:101:41 | kwargs | cfg.rb:102:3:103:20 | ... | | +| cfg.rb:102:3:102:12 | After call to puts | cfg.rb:103:3:103:20 | Before return | | +| cfg.rb:102:3:102:12 | Before call to puts | cfg.rb:102:3:102:12 | self | | +| cfg.rb:102:3:102:12 | call to puts | cfg.rb:102:3:102:12 | After call to puts | | | cfg.rb:102:3:102:12 | self | cfg.rb:102:8:102:12 | value | | +| cfg.rb:102:3:103:20 | ... | cfg.rb:102:3:102:12 | Before call to puts | | | cfg.rb:102:8:102:12 | value | cfg.rb:102:3:102:12 | call to puts | | -| cfg.rb:103:3:103:20 | return | cfg.rb:101:1:104:3 | exit parameters (normal) | return | +| cfg.rb:103:3:103:20 | Before return | cfg.rb:103:10:103:20 | Before ...[...] | | +| cfg.rb:103:3:103:20 | return | cfg.rb:101:1:104:3 | Normal Exit | return | | cfg.rb:103:10:103:15 | kwargs | cfg.rb:103:17:103:19 | key | | -| cfg.rb:103:10:103:20 | ...[...] | cfg.rb:103:3:103:20 | return | | +| cfg.rb:103:10:103:20 | ...[...] | cfg.rb:103:10:103:20 | After ...[...] | | +| cfg.rb:103:10:103:20 | After ...[...] | cfg.rb:103:3:103:20 | return | | +| cfg.rb:103:10:103:20 | Before ...[...] | cfg.rb:103:10:103:15 | kwargs | | | cfg.rb:103:17:103:19 | key | cfg.rb:103:10:103:20 | ...[...] | | -| cfg.rb:106:1:106:4 | type | cfg.rb:106:10:106:16 | healthy | | -| cfg.rb:106:1:106:17 | ... = ... | cfg.rb:107:1:107:5 | table | | -| cfg.rb:106:9:106:17 | "healthy" | cfg.rb:106:1:106:17 | ... = ... | | +| cfg.rb:106:1:106:4 | type | cfg.rb:106:9:106:17 | Before "healthy" | | +| cfg.rb:106:1:106:17 | ... = ... | cfg.rb:106:1:106:17 | After ... = ... | | +| cfg.rb:106:1:106:17 | After ... = ... | cfg.rb:107:1:107:14 | Before ... = ... | | +| cfg.rb:106:1:106:17 | Before ... = ... | cfg.rb:106:1:106:4 | type | | +| cfg.rb:106:9:106:17 | "healthy" | cfg.rb:106:9:106:17 | After "healthy" | | +| cfg.rb:106:9:106:17 | After "healthy" | cfg.rb:106:1:106:17 | ... = ... | | +| cfg.rb:106:9:106:17 | Before "healthy" | cfg.rb:106:10:106:16 | healthy | | | cfg.rb:106:10:106:16 | healthy | cfg.rb:106:9:106:17 | "healthy" | | -| cfg.rb:107:1:107:5 | table | cfg.rb:107:10:107:13 | food | | -| cfg.rb:107:1:107:14 | ... = ... | cfg.rb:108:1:108:12 | self | | -| cfg.rb:107:9:107:14 | "food" | cfg.rb:107:1:107:14 | ... = ... | | +| cfg.rb:107:1:107:5 | table | cfg.rb:107:9:107:14 | Before "food" | | +| cfg.rb:107:1:107:14 | ... = ... | cfg.rb:107:1:107:14 | After ... = ... | | +| cfg.rb:107:1:107:14 | After ... = ... | cfg.rb:108:1:108:12 | Before call to puts | | +| cfg.rb:107:1:107:14 | Before ... = ... | cfg.rb:107:1:107:5 | table | | +| cfg.rb:107:9:107:14 | "food" | cfg.rb:107:9:107:14 | After "food" | | +| cfg.rb:107:9:107:14 | After "food" | cfg.rb:107:1:107:14 | ... = ... | | +| cfg.rb:107:9:107:14 | Before "food" | cfg.rb:107:10:107:13 | food | | | cfg.rb:107:10:107:13 | food | cfg.rb:107:9:107:14 | "food" | | -| cfg.rb:108:1:108:12 | call to puts | cfg.rb:113:14:113:14 | b | | -| cfg.rb:108:1:108:12 | self | cfg.rb:108:13:109:14 | \nSELECT * FROM | | -| cfg.rb:108:6:108:12 | ( ... ) | cfg.rb:108:1:108:12 | call to puts | | -| cfg.rb:108:7:108:11 | < ... | | +| cfg.rb:113:1:113:19 | After ... if ... | cfg.rb:115:1:118:3 | C | | +| cfg.rb:113:6:113:9 | "hi" | cfg.rb:113:6:113:9 | After "hi" | | +| cfg.rb:113:6:113:9 | After "hi" | cfg.rb:113:1:113:9 | call to puts | | +| cfg.rb:113:6:113:9 | Before "hi" | cfg.rb:113:7:113:8 | hi | | | cfg.rb:113:7:113:8 | hi | cfg.rb:113:6:113:9 | "hi" | | | cfg.rb:113:14:113:14 | b | cfg.rb:113:18:113:19 | 10 | | -| cfg.rb:113:14:113:19 | ... > ... | cfg.rb:113:1:113:9 | self | true | -| cfg.rb:113:14:113:19 | ... > ... | cfg.rb:113:1:113:19 | ... if ... | false | +| cfg.rb:113:14:113:19 | ... > ... | cfg.rb:113:14:113:19 | After ... > ... [false] | false | +| cfg.rb:113:14:113:19 | ... > ... | cfg.rb:113:14:113:19 | After ... > ... [true] | true | +| cfg.rb:113:14:113:19 | After ... > ... [false] | cfg.rb:113:1:113:19 | After ... if ... | | +| cfg.rb:113:14:113:19 | After ... > ... [true] | cfg.rb:113:1:113:9 | Before call to puts | | +| cfg.rb:113:14:113:19 | Before ... > ... | cfg.rb:113:14:113:14 | b | | | cfg.rb:113:18:113:19 | 10 | cfg.rb:113:14:113:19 | ... > ... | | -| cfg.rb:115:1:118:3 | C | cfg.rb:116:3:116:8 | self | | -| cfg.rb:116:3:116:8 | @field | cfg.rb:116:12:116:13 | 42 | | +| cfg.rb:115:1:118:3 | After C | cfg.rb:120:1:120:28 | Before ... = ... | | +| cfg.rb:115:1:118:3 | C | cfg.rb:116:3:116:13 | Before ... = ... | | +| cfg.rb:116:3:116:8 | @field | cfg.rb:116:3:116:8 | After @field | | +| cfg.rb:116:3:116:8 | After @field | cfg.rb:116:12:116:13 | 42 | | +| cfg.rb:116:3:116:8 | Before @field | cfg.rb:116:3:116:8 | self | | | cfg.rb:116:3:116:8 | self | cfg.rb:116:3:116:8 | @field | | -| cfg.rb:116:3:116:13 | ... = ... | cfg.rb:117:3:117:16 | @@static_field | | +| cfg.rb:116:3:116:13 | ... = ... | cfg.rb:116:3:116:13 | After ... = ... | | +| cfg.rb:116:3:116:13 | After ... = ... | cfg.rb:117:3:117:21 | Before ... = ... | | +| cfg.rb:116:3:116:13 | Before ... = ... | cfg.rb:116:3:116:8 | Before @field | | | cfg.rb:116:12:116:13 | 42 | cfg.rb:116:3:116:13 | ... = ... | | | cfg.rb:117:3:117:16 | @@static_field | cfg.rb:117:20:117:21 | 10 | | -| cfg.rb:117:3:117:21 | ... = ... | cfg.rb:120:1:120:4 | swap | | +| cfg.rb:117:3:117:21 | ... = ... | cfg.rb:117:3:117:21 | After ... = ... | | +| cfg.rb:117:3:117:21 | After ... = ... | cfg.rb:115:1:118:3 | After C | | +| cfg.rb:117:3:117:21 | Before ... = ... | cfg.rb:117:3:117:16 | @@static_field | | | cfg.rb:117:20:117:21 | 10 | cfg.rb:117:3:117:21 | ... = ... | | | cfg.rb:120:1:120:4 | swap | cfg.rb:120:8:120:28 | -> { ... } | | -| cfg.rb:120:1:120:28 | ... = ... | cfg.rb:122:1:131:3 | M | | +| cfg.rb:120:1:120:28 | ... = ... | cfg.rb:120:1:120:28 | After ... = ... | | +| cfg.rb:120:1:120:28 | After ... = ... | cfg.rb:122:1:131:3 | M | | +| cfg.rb:120:1:120:28 | Before ... = ... | cfg.rb:120:1:120:4 | swap | | | cfg.rb:120:8:120:28 | -> { ... } | cfg.rb:120:1:120:28 | ... = ... | | -| cfg.rb:120:8:120:28 | enter -> { ... } | cfg.rb:120:12:120:12 | x | | -| cfg.rb:120:8:120:28 | exit -> { ... } (normal) | cfg.rb:120:8:120:28 | exit -> { ... } | | -| cfg.rb:120:11:120:16 | (..., ...) | cfg.rb:120:21:120:26 | Array | | +| cfg.rb:120:8:120:28 | Entry | cfg.rb:120:11:120:16 | (..., ...) | | +| cfg.rb:120:8:120:28 | Normal Exit | cfg.rb:120:8:120:28 | Exit | | +| cfg.rb:120:11:120:16 | (..., ...) | cfg.rb:120:12:120:12 | x | | +| cfg.rb:120:11:120:16 | After (..., ...) | cfg.rb:120:21:120:26 | ... | | | cfg.rb:120:12:120:12 | x | cfg.rb:120:15:120:15 | y | | -| cfg.rb:120:15:120:15 | y | cfg.rb:120:11:120:16 | (..., ...) | | +| cfg.rb:120:15:120:15 | y | cfg.rb:120:11:120:16 | After (..., ...) | | +| cfg.rb:120:21:120:26 | ... | cfg.rb:120:21:120:26 | Before call to [] | | +| cfg.rb:120:21:120:26 | After ... | cfg.rb:120:8:120:28 | Normal Exit | | +| cfg.rb:120:21:120:26 | After call to [] | cfg.rb:120:21:120:26 | After ... | | | cfg.rb:120:21:120:26 | Array | cfg.rb:120:22:120:22 | y | | -| cfg.rb:120:21:120:26 | call to [] | cfg.rb:120:8:120:28 | exit -> { ... } (normal) | | +| cfg.rb:120:21:120:26 | Before call to [] | cfg.rb:120:21:120:26 | Array | | +| cfg.rb:120:21:120:26 | call to [] | cfg.rb:120:21:120:26 | After call to [] | | | cfg.rb:120:22:120:22 | y | cfg.rb:120:25:120:25 | x | | | cfg.rb:120:25:120:25 | x | cfg.rb:120:21:120:26 | call to [] | | -| cfg.rb:122:1:131:3 | M | cfg.rb:123:2:123:8 | nothing | | +| cfg.rb:122:1:131:3 | After M | cfg.rb:133:1:133:21 | EmptyClass | | +| cfg.rb:122:1:131:3 | M | cfg.rb:123:2:123:14 | Before ... = ... | | | cfg.rb:123:2:123:8 | nothing | cfg.rb:123:12:123:14 | nil | | -| cfg.rb:123:2:123:14 | ... = ... | cfg.rb:124:2:124:5 | some | | +| cfg.rb:123:2:123:14 | ... = ... | cfg.rb:123:2:123:14 | After ... = ... | | +| cfg.rb:123:2:123:14 | After ... = ... | cfg.rb:124:2:124:9 | Before ... = ... | | +| cfg.rb:123:2:123:14 | Before ... = ... | cfg.rb:123:2:123:8 | nothing | | | cfg.rb:123:12:123:14 | nil | cfg.rb:123:2:123:14 | ... = ... | | | cfg.rb:124:2:124:5 | some | cfg.rb:124:9:124:9 | 2 | | -| cfg.rb:124:2:124:9 | ... = ... | cfg.rb:125:2:125:5 | some | | +| cfg.rb:124:2:124:9 | ... = ... | cfg.rb:124:2:124:9 | After ... = ... | | +| cfg.rb:124:2:124:9 | After ... = ... | cfg.rb:125:2:125:11 | Before ... = ... | | +| cfg.rb:124:2:124:9 | Before ... = ... | cfg.rb:124:2:124:5 | some | | | cfg.rb:124:9:124:9 | 2 | cfg.rb:124:2:124:9 | ... = ... | | -| cfg.rb:125:2:125:5 | some | cfg.rb:125:2:125:5 | some | | +| cfg.rb:125:2:125:5 | some | cfg.rb:125:7:125:8 | Before ... + ... | | | cfg.rb:125:2:125:5 | some | cfg.rb:125:10:125:11 | 10 | | -| cfg.rb:125:2:125:11 | ... = ... | cfg.rb:126:2:126:5 | last | | -| cfg.rb:125:7:125:8 | ... + ... | cfg.rb:125:2:125:11 | ... = ... | | +| cfg.rb:125:2:125:11 | ... = ... | cfg.rb:125:2:125:11 | After ... = ... | | +| cfg.rb:125:2:125:11 | After ... = ... | cfg.rb:126:2:126:17 | Before ... = ... | | +| cfg.rb:125:2:125:11 | Before ... = ... | cfg.rb:125:2:125:5 | some | | +| cfg.rb:125:7:125:8 | ... + ... | cfg.rb:125:7:125:8 | After ... + ... | | +| cfg.rb:125:7:125:8 | After ... + ... | cfg.rb:125:2:125:11 | ... = ... | | +| cfg.rb:125:7:125:8 | Before ... + ... | cfg.rb:125:2:125:5 | some | | | cfg.rb:125:10:125:11 | 10 | cfg.rb:125:7:125:8 | ... + ... | | -| cfg.rb:126:2:126:5 | last | cfg.rb:126:10:126:10 | 2 | | -| cfg.rb:126:2:126:17 | ... = ... | cfg.rb:127:2:127:6 | range | | -| cfg.rb:126:9:126:17 | ( ... ) | cfg.rb:126:2:126:17 | ... = ... | | +| cfg.rb:126:2:126:5 | last | cfg.rb:126:9:126:17 | ( ... ) | | +| cfg.rb:126:2:126:17 | ... = ... | cfg.rb:126:2:126:17 | After ... = ... | | +| cfg.rb:126:2:126:17 | After ... = ... | cfg.rb:127:2:127:13 | Before ... = ... | | +| cfg.rb:126:2:126:17 | Before ... = ... | cfg.rb:126:2:126:5 | last | | +| cfg.rb:126:9:126:17 | ( ... ) | cfg.rb:126:10:126:10 | 2 | | +| cfg.rb:126:9:126:17 | After ( ... ) | cfg.rb:126:2:126:17 | ... = ... | | | cfg.rb:126:10:126:10 | 2 | cfg.rb:126:13:126:13 | 4 | | | cfg.rb:126:13:126:13 | 4 | cfg.rb:126:16:126:16 | 7 | | -| cfg.rb:126:16:126:16 | 7 | cfg.rb:126:9:126:17 | ( ... ) | | -| cfg.rb:127:2:127:6 | range | cfg.rb:127:10:127:10 | 0 | | -| cfg.rb:127:2:127:13 | ... = ... | cfg.rb:128:2:128:5 | half | | +| cfg.rb:126:16:126:16 | 7 | cfg.rb:126:9:126:17 | After ( ... ) | | +| cfg.rb:127:2:127:6 | range | cfg.rb:127:10:127:13 | Before _ .. _ | | +| cfg.rb:127:2:127:13 | ... = ... | cfg.rb:127:2:127:13 | After ... = ... | | +| cfg.rb:127:2:127:13 | After ... = ... | cfg.rb:128:2:128:19 | Before ... = ... | | +| cfg.rb:127:2:127:13 | Before ... = ... | cfg.rb:127:2:127:6 | range | | | cfg.rb:127:10:127:10 | 0 | cfg.rb:127:13:127:13 | 9 | | -| cfg.rb:127:10:127:13 | _ .. _ | cfg.rb:127:2:127:13 | ... = ... | | +| cfg.rb:127:10:127:13 | After _ .. _ | cfg.rb:127:2:127:13 | ... = ... | | +| cfg.rb:127:10:127:13 | Before _ .. _ | cfg.rb:127:10:127:10 | 0 | | +| cfg.rb:127:10:127:13 | _ .. _ | cfg.rb:127:10:127:13 | After _ .. _ | | | cfg.rb:127:13:127:13 | 9 | cfg.rb:127:10:127:13 | _ .. _ | | -| cfg.rb:128:2:128:5 | half | cfg.rb:128:9:128:9 | 1 | | -| cfg.rb:128:2:128:19 | ... = ... | cfg.rb:129:2:129:6 | regex | | +| cfg.rb:128:2:128:5 | half | cfg.rb:128:9:128:19 | Before ... + ... | | +| cfg.rb:128:2:128:19 | ... = ... | cfg.rb:128:2:128:19 | After ... = ... | | +| cfg.rb:128:2:128:19 | After ... = ... | cfg.rb:129:2:129:29 | Before ... = ... | | +| cfg.rb:128:2:128:19 | Before ... = ... | cfg.rb:128:2:128:5 | half | | | cfg.rb:128:9:128:9 | 1 | cfg.rb:128:11:128:12 | 3r | | -| cfg.rb:128:9:128:12 | ... / ... | cfg.rb:128:16:128:16 | 1 | | -| cfg.rb:128:9:128:19 | ... + ... | cfg.rb:128:2:128:19 | ... = ... | | +| cfg.rb:128:9:128:12 | ... / ... | cfg.rb:128:9:128:12 | After ... / ... | | +| cfg.rb:128:9:128:12 | After ... / ... | cfg.rb:128:16:128:19 | Before ... / ... | | +| cfg.rb:128:9:128:12 | Before ... / ... | cfg.rb:128:9:128:9 | 1 | | +| cfg.rb:128:9:128:19 | ... + ... | cfg.rb:128:9:128:19 | After ... + ... | | +| cfg.rb:128:9:128:19 | After ... + ... | cfg.rb:128:2:128:19 | ... = ... | | +| cfg.rb:128:9:128:19 | Before ... + ... | cfg.rb:128:9:128:12 | Before ... / ... | | | cfg.rb:128:11:128:12 | 3r | cfg.rb:128:9:128:12 | ... / ... | | | cfg.rb:128:16:128:16 | 1 | cfg.rb:128:18:128:19 | 6r | | -| cfg.rb:128:16:128:19 | ... / ... | cfg.rb:128:9:128:19 | ... + ... | | +| cfg.rb:128:16:128:19 | ... / ... | cfg.rb:128:16:128:19 | After ... / ... | | +| cfg.rb:128:16:128:19 | After ... / ... | cfg.rb:128:9:128:19 | ... + ... | | +| cfg.rb:128:16:128:19 | Before ... / ... | cfg.rb:128:16:128:16 | 1 | | | cfg.rb:128:18:128:19 | 6r | cfg.rb:128:16:128:19 | ... / ... | | -| cfg.rb:129:2:129:6 | regex | cfg.rb:129:11:129:15 | hello | | -| cfg.rb:129:2:129:29 | ... = ... | cfg.rb:130:2:130:9 | Constant | | -| cfg.rb:129:10:129:29 | /hello\\s+[#{...}]/ | cfg.rb:129:2:129:29 | ... = ... | | +| cfg.rb:129:2:129:6 | regex | cfg.rb:129:10:129:29 | Before /hello\\s+[#{...}]/ | | +| cfg.rb:129:2:129:29 | ... = ... | cfg.rb:129:2:129:29 | After ... = ... | | +| cfg.rb:129:2:129:29 | After ... = ... | cfg.rb:130:2:130:13 | Before ... = ... | | +| cfg.rb:129:2:129:29 | Before ... = ... | cfg.rb:129:2:129:6 | regex | | +| cfg.rb:129:10:129:29 | /hello\\s+[#{...}]/ | cfg.rb:129:10:129:29 | After /hello\\s+[#{...}]/ | | +| cfg.rb:129:10:129:29 | After /hello\\s+[#{...}]/ | cfg.rb:129:2:129:29 | ... = ... | | +| cfg.rb:129:10:129:29 | Before /hello\\s+[#{...}]/ | cfg.rb:129:11:129:15 | hello | | | cfg.rb:129:11:129:15 | hello | cfg.rb:129:16:129:17 | \\s | | | cfg.rb:129:16:129:17 | \\s | cfg.rb:129:18:129:19 | +[ | | -| cfg.rb:129:18:129:19 | +[ | cfg.rb:129:22:129:26 | range | | -| cfg.rb:129:20:129:27 | #{...} | cfg.rb:129:28:129:28 | ] | | -| cfg.rb:129:22:129:26 | range | cfg.rb:129:20:129:27 | #{...} | | +| cfg.rb:129:18:129:19 | +[ | cfg.rb:129:20:129:27 | #{...} | | +| cfg.rb:129:20:129:27 | #{...} | cfg.rb:129:22:129:26 | range | | +| cfg.rb:129:20:129:27 | After #{...} | cfg.rb:129:28:129:28 | ] | | +| cfg.rb:129:22:129:26 | range | cfg.rb:129:20:129:27 | After #{...} | | | cfg.rb:129:28:129:28 | ] | cfg.rb:129:10:129:29 | /hello\\s+[#{...}]/ | | | cfg.rb:130:2:130:9 | Constant | cfg.rb:130:13:130:13 | 5 | | -| cfg.rb:130:2:130:13 | ... = ... | cfg.rb:133:1:133:21 | EmptyClass | | +| cfg.rb:130:2:130:13 | ... = ... | cfg.rb:130:2:130:13 | After ... = ... | | +| cfg.rb:130:2:130:13 | After ... = ... | cfg.rb:122:1:131:3 | After M | | +| cfg.rb:130:2:130:13 | Before ... = ... | cfg.rb:130:2:130:9 | Constant | | | cfg.rb:130:13:130:13 | 5 | cfg.rb:130:2:130:13 | ... = ... | | | cfg.rb:133:1:133:21 | EmptyClass | cfg.rb:134:1:134:23 | EmptyModule | | -| cfg.rb:134:1:134:23 | EmptyModule | cfg.rb:136:1:136:1 | 1 | | +| cfg.rb:134:1:134:23 | EmptyModule | cfg.rb:136:1:136:29 | ... rescue ... | | | cfg.rb:136:1:136:1 | 1 | cfg.rb:136:3:136:3 | 0 | | -| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:1:136:29 | ... rescue ... | | -| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:12:136:29 | self | exception | -| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:138:17:138:23 | __synth__2 | | +| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:1:136:3 | After ... / ... | | +| cfg.rb:136:1:136:3 | ... / ... | cfg.rb:136:12:136:29 | Before call to puts | exception | +| cfg.rb:136:1:136:3 | After ... / ... | cfg.rb:136:1:136:29 | After ... rescue ... | | +| cfg.rb:136:1:136:3 | Before ... / ... | cfg.rb:136:1:136:1 | 1 | | +| cfg.rb:136:1:136:29 | ... rescue ... | cfg.rb:136:1:136:3 | Before ... / ... | | +| cfg.rb:136:1:136:29 | After ... rescue ... | cfg.rb:138:1:138:23 | ... | | | cfg.rb:136:3:136:3 | 0 | cfg.rb:136:1:136:3 | ... / ... | | -| cfg.rb:136:12:136:29 | call to puts | cfg.rb:136:1:136:29 | ... rescue ... | | -| cfg.rb:136:12:136:29 | self | cfg.rb:136:18:136:28 | div by zero | | -| cfg.rb:136:17:136:29 | "div by zero" | cfg.rb:136:12:136:29 | call to puts | | +| cfg.rb:136:12:136:29 | After call to puts | cfg.rb:136:1:136:29 | After ... rescue ... | | +| cfg.rb:136:12:136:29 | Before call to puts | cfg.rb:136:12:136:29 | self | | +| cfg.rb:136:12:136:29 | call to puts | cfg.rb:136:12:136:29 | After call to puts | | +| cfg.rb:136:12:136:29 | self | cfg.rb:136:17:136:29 | Before "div by zero" | | +| cfg.rb:136:17:136:29 | "div by zero" | cfg.rb:136:17:136:29 | After "div by zero" | | +| cfg.rb:136:17:136:29 | After "div by zero" | cfg.rb:136:12:136:29 | call to puts | | +| cfg.rb:136:17:136:29 | Before "div by zero" | cfg.rb:136:18:136:28 | div by zero | | | cfg.rb:136:18:136:28 | div by zero | cfg.rb:136:17:136:29 | "div by zero" | | -| cfg.rb:138:1:138:23 | ... | cfg.rb:140:1:140:1 | M | | +| cfg.rb:138:1:138:23 | ... | cfg.rb:138:17:138:23 | Before ... = ... | | +| cfg.rb:138:1:138:23 | After ... | cfg.rb:140:1:140:11 | Before Constant | | | cfg.rb:138:3:138:6 | 0 | cfg.rb:138:3:138:6 | -2 | | | cfg.rb:138:3:138:6 | -2 | cfg.rb:138:3:138:6 | _ .. _ | | -| cfg.rb:138:3:138:6 | ... = ... | cfg.rb:138:9:138:12 | last | | -| cfg.rb:138:3:138:6 | _ .. _ | cfg.rb:138:3:138:6 | call to [] | | -| cfg.rb:138:3:138:6 | __synth__2 | cfg.rb:138:3:138:6 | 0 | | -| cfg.rb:138:3:138:6 | call to [] | cfg.rb:138:3:138:6 | ... = ... | | -| cfg.rb:138:3:138:6 | init | cfg.rb:138:3:138:6 | __synth__2 | | +| cfg.rb:138:3:138:6 | ... = ... | cfg.rb:138:3:138:6 | After ... = ... | | +| cfg.rb:138:3:138:6 | After ... = ... | cfg.rb:138:9:138:12 | Before ... = ... | | +| cfg.rb:138:3:138:6 | After _ .. _ | cfg.rb:138:3:138:6 | call to [] | | +| cfg.rb:138:3:138:6 | After call to [] | cfg.rb:138:3:138:6 | ... = ... | | +| cfg.rb:138:3:138:6 | Before ... = ... | cfg.rb:138:3:138:6 | init | | +| cfg.rb:138:3:138:6 | Before _ .. _ | cfg.rb:138:3:138:6 | 0 | | +| cfg.rb:138:3:138:6 | Before call to [] | cfg.rb:138:3:138:6 | __synth__2 | | +| cfg.rb:138:3:138:6 | _ .. _ | cfg.rb:138:3:138:6 | After _ .. _ | | +| cfg.rb:138:3:138:6 | __synth__2 | cfg.rb:138:3:138:6 | Before _ .. _ | | +| cfg.rb:138:3:138:6 | call to [] | cfg.rb:138:3:138:6 | After call to [] | | +| cfg.rb:138:3:138:6 | init | cfg.rb:138:3:138:6 | Before call to [] | | | cfg.rb:138:9:138:12 | -1 | cfg.rb:138:9:138:12 | call to [] | | -| cfg.rb:138:9:138:12 | ... = ... | cfg.rb:138:1:138:23 | ... | | +| cfg.rb:138:9:138:12 | ... = ... | cfg.rb:138:9:138:12 | After ... = ... | | +| cfg.rb:138:9:138:12 | After ... = ... | cfg.rb:138:1:138:23 | After ... | | +| cfg.rb:138:9:138:12 | After call to [] | cfg.rb:138:9:138:12 | ... = ... | | +| cfg.rb:138:9:138:12 | Before ... = ... | cfg.rb:138:9:138:12 | last | | +| cfg.rb:138:9:138:12 | Before call to [] | cfg.rb:138:9:138:12 | __synth__2 | | | cfg.rb:138:9:138:12 | __synth__2 | cfg.rb:138:9:138:12 | -1 | | -| cfg.rb:138:9:138:12 | call to [] | cfg.rb:138:9:138:12 | ... = ... | | -| cfg.rb:138:9:138:12 | last | cfg.rb:138:9:138:12 | __synth__2 | | +| cfg.rb:138:9:138:12 | call to [] | cfg.rb:138:9:138:12 | After call to [] | | +| cfg.rb:138:9:138:12 | last | cfg.rb:138:9:138:12 | Before call to [] | | | cfg.rb:138:17:138:17 | 1 | cfg.rb:138:20:138:20 | 2 | | -| cfg.rb:138:17:138:23 | * ... | cfg.rb:138:17:138:23 | ... = ... | | -| cfg.rb:138:17:138:23 | ... = ... | cfg.rb:138:3:138:6 | init | | -| cfg.rb:138:17:138:23 | ..., ... | cfg.rb:138:17:138:23 | * ... | | -| cfg.rb:138:17:138:23 | __synth__2 | cfg.rb:138:17:138:17 | 1 | | +| cfg.rb:138:17:138:23 | * ... | cfg.rb:138:17:138:23 | After * ... | | +| cfg.rb:138:17:138:23 | ... = ... | cfg.rb:138:17:138:23 | After ... = ... | | +| cfg.rb:138:17:138:23 | ..., ... | cfg.rb:138:17:138:23 | After ..., ... | | +| cfg.rb:138:17:138:23 | After * ... | cfg.rb:138:17:138:23 | ... = ... | | +| cfg.rb:138:17:138:23 | After ... = ... | cfg.rb:138:3:138:6 | Before ... = ... | | +| cfg.rb:138:17:138:23 | After ..., ... | cfg.rb:138:17:138:23 | * ... | | +| cfg.rb:138:17:138:23 | Before * ... | cfg.rb:138:17:138:23 | Before ..., ... | | +| cfg.rb:138:17:138:23 | Before ... = ... | cfg.rb:138:17:138:23 | __synth__2 | | +| cfg.rb:138:17:138:23 | Before ..., ... | cfg.rb:138:17:138:17 | 1 | | +| cfg.rb:138:17:138:23 | __synth__2 | cfg.rb:138:17:138:23 | Before * ... | | | cfg.rb:138:20:138:20 | 2 | cfg.rb:138:23:138:23 | 3 | | | cfg.rb:138:23:138:23 | 3 | cfg.rb:138:17:138:23 | ..., ... | | | cfg.rb:140:1:140:1 | M | cfg.rb:140:1:140:11 | Constant | | -| cfg.rb:140:1:140:11 | Constant | cfg.rb:141:1:141:1 | M | | +| cfg.rb:140:1:140:11 | After Constant | cfg.rb:141:1:141:18 | Before Constant | | +| cfg.rb:140:1:140:11 | Before Constant | cfg.rb:140:1:140:1 | M | | +| cfg.rb:140:1:140:11 | Constant | cfg.rb:140:1:140:11 | After Constant | | | cfg.rb:141:1:141:1 | M | cfg.rb:141:1:141:8 | call to itself | | -| cfg.rb:141:1:141:8 | call to itself | cfg.rb:141:1:141:18 | Constant | | -| cfg.rb:141:1:141:18 | Constant | cfg.rb:143:10:143:14 | Silly | | -| cfg.rb:143:1:149:3 | class << ... | cfg.rb:151:1:151:5 | silly | | +| cfg.rb:141:1:141:8 | After call to itself | cfg.rb:141:1:141:18 | Constant | | +| cfg.rb:141:1:141:8 | Before call to itself | cfg.rb:141:1:141:1 | M | | +| cfg.rb:141:1:141:8 | call to itself | cfg.rb:141:1:141:8 | After call to itself | | +| cfg.rb:141:1:141:18 | After Constant | cfg.rb:143:1:149:3 | class << ... | | +| cfg.rb:141:1:141:18 | Before Constant | cfg.rb:141:1:141:8 | Before call to itself | | +| cfg.rb:141:1:141:18 | Constant | cfg.rb:141:1:141:18 | After Constant | | +| cfg.rb:143:1:149:3 | After class << ... | cfg.rb:151:1:151:17 | Before ... = ... | | +| cfg.rb:143:1:149:3 | class << ... | cfg.rb:143:10:143:21 | Before call to itself | | | cfg.rb:143:10:143:14 | Silly | cfg.rb:143:10:143:21 | call to itself | | -| cfg.rb:143:10:143:21 | call to itself | cfg.rb:144:3:144:19 | setter= | | +| cfg.rb:143:10:143:21 | After call to itself | cfg.rb:144:3:144:19 | setter= | | +| cfg.rb:143:10:143:21 | Before call to itself | cfg.rb:143:10:143:14 | Silly | | +| cfg.rb:143:10:143:21 | call to itself | cfg.rb:143:10:143:21 | After call to itself | | | cfg.rb:144:3:144:19 | setter= | cfg.rb:145:3:148:5 | print | | -| cfg.rb:145:3:148:5 | enter print | cfg.rb:146:5:146:20 | self | | -| cfg.rb:145:3:148:5 | exit print (normal) | cfg.rb:145:3:148:5 | exit print | | -| cfg.rb:145:3:148:5 | print | cfg.rb:143:1:149:3 | class << ... | | -| cfg.rb:146:5:146:20 | call to puts | cfg.rb:147:5:147:22 | self | | -| cfg.rb:146:5:146:20 | self | cfg.rb:146:11:146:19 | singleton | | -| cfg.rb:146:10:146:20 | "singleton" | cfg.rb:146:5:146:20 | call to puts | | +| cfg.rb:145:3:148:5 | Entry | cfg.rb:146:5:147:22 | ... | | +| cfg.rb:145:3:148:5 | Normal Exit | cfg.rb:145:3:148:5 | Exit | | +| cfg.rb:145:3:148:5 | print | cfg.rb:143:1:149:3 | After class << ... | | +| cfg.rb:146:5:146:20 | After call to puts | cfg.rb:147:5:147:22 | Before call to puts | | +| cfg.rb:146:5:146:20 | Before call to puts | cfg.rb:146:5:146:20 | self | | +| cfg.rb:146:5:146:20 | call to puts | cfg.rb:146:5:146:20 | After call to puts | | +| cfg.rb:146:5:146:20 | self | cfg.rb:146:10:146:20 | Before "singleton" | | +| cfg.rb:146:5:147:22 | ... | cfg.rb:146:5:146:20 | Before call to puts | | +| cfg.rb:146:5:147:22 | After ... | cfg.rb:145:3:148:5 | Normal Exit | | +| cfg.rb:146:10:146:20 | "singleton" | cfg.rb:146:10:146:20 | After "singleton" | | +| cfg.rb:146:10:146:20 | After "singleton" | cfg.rb:146:5:146:20 | call to puts | | +| cfg.rb:146:10:146:20 | Before "singleton" | cfg.rb:146:11:146:19 | singleton | | | cfg.rb:146:11:146:19 | singleton | cfg.rb:146:10:146:20 | "singleton" | | -| cfg.rb:147:5:147:22 | call to puts | cfg.rb:145:3:148:5 | exit print (normal) | | -| cfg.rb:147:5:147:22 | self | cfg.rb:147:10:147:14 | super call to print | | -| cfg.rb:147:10:147:14 | super call to print | cfg.rb:147:10:147:22 | call to print | | -| cfg.rb:147:10:147:22 | call to print | cfg.rb:147:5:147:22 | call to puts | | -| cfg.rb:151:1:151:5 | silly | cfg.rb:151:9:151:13 | Silly | | -| cfg.rb:151:1:151:17 | ... = ... | cfg.rb:152:5:152:9 | silly | | +| cfg.rb:147:5:147:22 | After call to puts | cfg.rb:146:5:147:22 | After ... | | +| cfg.rb:147:5:147:22 | Before call to puts | cfg.rb:147:5:147:22 | self | | +| cfg.rb:147:5:147:22 | call to puts | cfg.rb:147:5:147:22 | After call to puts | | +| cfg.rb:147:5:147:22 | self | cfg.rb:147:10:147:22 | Before call to print | | +| cfg.rb:147:10:147:14 | After super call to print | cfg.rb:147:10:147:22 | call to print | | +| cfg.rb:147:10:147:14 | Before super call to print | cfg.rb:147:10:147:14 | super call to print | | +| cfg.rb:147:10:147:14 | super call to print | cfg.rb:147:10:147:14 | After super call to print | | +| cfg.rb:147:10:147:22 | After call to print | cfg.rb:147:5:147:22 | call to puts | | +| cfg.rb:147:10:147:22 | Before call to print | cfg.rb:147:10:147:14 | Before super call to print | | +| cfg.rb:147:10:147:22 | call to print | cfg.rb:147:10:147:22 | After call to print | | +| cfg.rb:151:1:151:5 | silly | cfg.rb:151:9:151:17 | Before call to new | | +| cfg.rb:151:1:151:17 | ... = ... | cfg.rb:151:1:151:17 | After ... = ... | | +| cfg.rb:151:1:151:17 | After ... = ... | cfg.rb:152:1:154:3 | Before method | | +| cfg.rb:151:1:151:17 | Before ... = ... | cfg.rb:151:1:151:5 | silly | | | cfg.rb:151:9:151:13 | Silly | cfg.rb:151:9:151:17 | call to new | | -| cfg.rb:151:9:151:17 | call to new | cfg.rb:151:1:151:17 | ... = ... | | -| cfg.rb:152:1:154:3 | enter method | cfg.rb:152:19:152:19 | x | | -| cfg.rb:152:1:154:3 | exit method (normal) | cfg.rb:152:1:154:3 | exit method | | -| cfg.rb:152:1:154:3 | method | cfg.rb:156:1:156:28 | two_parameters | | +| cfg.rb:151:9:151:17 | After call to new | cfg.rb:151:1:151:17 | ... = ... | | +| cfg.rb:151:9:151:17 | Before call to new | cfg.rb:151:9:151:13 | Silly | | +| cfg.rb:151:9:151:17 | call to new | cfg.rb:151:9:151:17 | After call to new | | +| cfg.rb:152:1:154:3 | After method | cfg.rb:156:1:156:28 | two_parameters | | +| cfg.rb:152:1:154:3 | Before method | cfg.rb:152:5:152:9 | silly | | +| cfg.rb:152:1:154:3 | Entry | cfg.rb:152:19:152:19 | x | | +| cfg.rb:152:1:154:3 | Normal Exit | cfg.rb:152:1:154:3 | Exit | | +| cfg.rb:152:1:154:3 | method | cfg.rb:152:1:154:3 | After method | | | cfg.rb:152:5:152:9 | silly | cfg.rb:152:1:154:3 | method | | -| cfg.rb:152:19:152:19 | x | cfg.rb:153:3:153:8 | self | | -| cfg.rb:153:3:153:8 | call to puts | cfg.rb:152:1:154:3 | exit method (normal) | | +| cfg.rb:152:19:152:19 | x | cfg.rb:153:3:153:8 | ... | | +| cfg.rb:153:3:153:8 | ... | cfg.rb:153:3:153:8 | Before call to puts | | +| cfg.rb:153:3:153:8 | After ... | cfg.rb:152:1:154:3 | Normal Exit | | +| cfg.rb:153:3:153:8 | After call to puts | cfg.rb:153:3:153:8 | After ... | | +| cfg.rb:153:3:153:8 | Before call to puts | cfg.rb:153:3:153:8 | self | | +| cfg.rb:153:3:153:8 | call to puts | cfg.rb:153:3:153:8 | After call to puts | | | cfg.rb:153:3:153:8 | self | cfg.rb:153:8:153:8 | x | | | cfg.rb:153:8:153:8 | x | cfg.rb:153:3:153:8 | call to puts | | -| cfg.rb:156:1:156:28 | enter two_parameters | cfg.rb:156:21:156:21 | a | | -| cfg.rb:156:1:156:28 | exit two_parameters (normal) | cfg.rb:156:1:156:28 | exit two_parameters | | -| cfg.rb:156:1:156:28 | two_parameters | cfg.rb:158:1:158:22 | self | | -| cfg.rb:156:21:156:21 | a | cfg.rb:156:23:156:23 | b | | -| cfg.rb:156:23:156:23 | b | cfg.rb:156:1:156:28 | exit two_parameters (normal) | | -| cfg.rb:158:1:158:22 | call to two_parameters | cfg.rb:160:1:160:10 | scriptfile | | -| cfg.rb:158:1:158:22 | self | cfg.rb:158:17:158:21 | Array | | -| cfg.rb:158:16:158:21 | * ... | cfg.rb:158:1:158:22 | call to two_parameters | | +| cfg.rb:156:1:156:28 | two_parameters | cfg.rb:158:1:158:22 | Before call to two_parameters | | +| cfg.rb:158:1:158:22 | After call to two_parameters | cfg.rb:160:1:160:32 | Before ... = ... | | +| cfg.rb:158:1:158:22 | Before call to two_parameters | cfg.rb:158:1:158:22 | self | | +| cfg.rb:158:1:158:22 | call to two_parameters | cfg.rb:158:1:158:22 | After call to two_parameters | | +| cfg.rb:158:1:158:22 | self | cfg.rb:158:16:158:21 | Before * ... | | +| cfg.rb:158:16:158:21 | * ... | cfg.rb:158:16:158:21 | After * ... | | +| cfg.rb:158:16:158:21 | After * ... | cfg.rb:158:1:158:22 | call to two_parameters | | +| cfg.rb:158:16:158:21 | Before * ... | cfg.rb:158:17:158:21 | Before call to [] | | +| cfg.rb:158:17:158:21 | After call to [] | cfg.rb:158:16:158:21 | * ... | | | cfg.rb:158:17:158:21 | Array | cfg.rb:158:18:158:18 | 1 | | -| cfg.rb:158:17:158:21 | call to [] | cfg.rb:158:16:158:21 | * ... | | +| cfg.rb:158:17:158:21 | Before call to [] | cfg.rb:158:17:158:21 | Array | | +| cfg.rb:158:17:158:21 | call to [] | cfg.rb:158:17:158:21 | After call to [] | | | cfg.rb:158:18:158:18 | 1 | cfg.rb:158:20:158:20 | 2 | | | cfg.rb:158:20:158:20 | 2 | cfg.rb:158:17:158:21 | call to [] | | -| cfg.rb:160:1:160:10 | scriptfile | cfg.rb:160:15:160:19 | cat " | | -| cfg.rb:160:1:160:32 | ... = ... | cfg.rb:162:1:162:6 | symbol | | -| cfg.rb:160:14:160:32 | `cat "#{...}"` | cfg.rb:160:1:160:32 | ... = ... | | -| cfg.rb:160:15:160:19 | cat " | cfg.rb:160:22:160:29 | self | | -| cfg.rb:160:20:160:30 | #{...} | cfg.rb:160:31:160:31 | " | | -| cfg.rb:160:22:160:29 | call to __FILE__ | cfg.rb:160:20:160:30 | #{...} | | +| cfg.rb:160:1:160:10 | scriptfile | cfg.rb:160:14:160:32 | Before `cat "#{...}"` | | +| cfg.rb:160:1:160:32 | ... = ... | cfg.rb:160:1:160:32 | After ... = ... | | +| cfg.rb:160:1:160:32 | After ... = ... | cfg.rb:162:1:162:15 | Before ... = ... | | +| cfg.rb:160:1:160:32 | Before ... = ... | cfg.rb:160:1:160:10 | scriptfile | | +| cfg.rb:160:14:160:32 | After `cat "#{...}"` | cfg.rb:160:1:160:32 | ... = ... | | +| cfg.rb:160:14:160:32 | Before `cat "#{...}"` | cfg.rb:160:15:160:19 | cat " | | +| cfg.rb:160:14:160:32 | `cat "#{...}"` | cfg.rb:160:14:160:32 | After `cat "#{...}"` | | +| cfg.rb:160:15:160:19 | cat " | cfg.rb:160:20:160:30 | #{...} | | +| cfg.rb:160:20:160:30 | #{...} | cfg.rb:160:22:160:29 | Before call to __FILE__ | | +| cfg.rb:160:20:160:30 | After #{...} | cfg.rb:160:31:160:31 | " | | +| cfg.rb:160:22:160:29 | After call to __FILE__ | cfg.rb:160:20:160:30 | After #{...} | | +| cfg.rb:160:22:160:29 | Before call to __FILE__ | cfg.rb:160:22:160:29 | self | | +| cfg.rb:160:22:160:29 | call to __FILE__ | cfg.rb:160:22:160:29 | After call to __FILE__ | | | cfg.rb:160:22:160:29 | self | cfg.rb:160:22:160:29 | call to __FILE__ | | | cfg.rb:160:31:160:31 | " | cfg.rb:160:14:160:32 | `cat "#{...}"` | | -| cfg.rb:162:1:162:6 | symbol | cfg.rb:162:10:162:15 | hello | | -| cfg.rb:162:1:162:15 | ... = ... | cfg.rb:164:1:164:16 | delimited_symbol | | -| cfg.rb:162:10:162:15 | :hello | cfg.rb:162:1:162:15 | ... = ... | | +| cfg.rb:162:1:162:6 | symbol | cfg.rb:162:10:162:15 | Before :hello | | +| cfg.rb:162:1:162:15 | ... = ... | cfg.rb:162:1:162:15 | After ... = ... | | +| cfg.rb:162:1:162:15 | After ... = ... | cfg.rb:164:1:164:42 | Before ... = ... | | +| cfg.rb:162:1:162:15 | Before ... = ... | cfg.rb:162:1:162:6 | symbol | | +| cfg.rb:162:10:162:15 | :hello | cfg.rb:162:10:162:15 | After :hello | | +| cfg.rb:162:10:162:15 | After :hello | cfg.rb:162:1:162:15 | ... = ... | | +| cfg.rb:162:10:162:15 | Before :hello | cfg.rb:162:10:162:15 | hello | | | cfg.rb:162:10:162:15 | hello | cfg.rb:162:10:162:15 | :hello | | -| cfg.rb:164:1:164:16 | delimited_symbol | cfg.rb:164:22:164:29 | goodbye- | | -| cfg.rb:164:1:164:42 | ... = ... | cfg.rb:166:1:166:1 | x | | -| cfg.rb:164:20:164:42 | :"goodbye-#{...}" | cfg.rb:164:1:164:42 | ... = ... | | -| cfg.rb:164:22:164:29 | goodbye- | cfg.rb:164:33:164:34 | 12 | | -| cfg.rb:164:30:164:41 | #{...} | cfg.rb:164:20:164:42 | :"goodbye-#{...}" | | +| cfg.rb:164:1:164:16 | delimited_symbol | cfg.rb:164:20:164:42 | Before :"goodbye-#{...}" | | +| cfg.rb:164:1:164:42 | ... = ... | cfg.rb:164:1:164:42 | After ... = ... | | +| cfg.rb:164:1:164:42 | After ... = ... | cfg.rb:166:1:166:8 | Before ... = ... | | +| cfg.rb:164:1:164:42 | Before ... = ... | cfg.rb:164:1:164:16 | delimited_symbol | | +| cfg.rb:164:20:164:42 | :"goodbye-#{...}" | cfg.rb:164:20:164:42 | After :"goodbye-#{...}" | | +| cfg.rb:164:20:164:42 | After :"goodbye-#{...}" | cfg.rb:164:1:164:42 | ... = ... | | +| cfg.rb:164:20:164:42 | Before :"goodbye-#{...}" | cfg.rb:164:22:164:29 | goodbye- | | +| cfg.rb:164:22:164:29 | goodbye- | cfg.rb:164:30:164:41 | #{...} | | +| cfg.rb:164:30:164:41 | #{...} | cfg.rb:164:33:164:39 | Before ... + ... | | +| cfg.rb:164:30:164:41 | After #{...} | cfg.rb:164:20:164:42 | :"goodbye-#{...}" | | | cfg.rb:164:33:164:34 | 12 | cfg.rb:164:38:164:39 | 13 | | -| cfg.rb:164:33:164:39 | ... + ... | cfg.rb:164:30:164:41 | #{...} | | +| cfg.rb:164:33:164:39 | ... + ... | cfg.rb:164:33:164:39 | After ... + ... | | +| cfg.rb:164:33:164:39 | After ... + ... | cfg.rb:164:30:164:41 | After #{...} | | +| cfg.rb:164:33:164:39 | Before ... + ... | cfg.rb:164:33:164:34 | 12 | | | cfg.rb:164:38:164:39 | 13 | cfg.rb:164:33:164:39 | ... + ... | | | cfg.rb:166:1:166:1 | x | cfg.rb:166:5:166:8 | true | | -| cfg.rb:166:1:166:8 | ... = ... | cfg.rb:167:1:167:1 | x | | +| cfg.rb:166:1:166:8 | ... = ... | cfg.rb:166:1:166:8 | After ... = ... | | +| cfg.rb:166:1:166:8 | After ... = ... | cfg.rb:167:1:167:10 | Before ... = ... | | +| cfg.rb:166:1:166:8 | Before ... = ... | cfg.rb:166:1:166:1 | x | | | cfg.rb:166:5:166:8 | true | cfg.rb:166:1:166:8 | ... = ... | | -| cfg.rb:167:1:167:1 | x | cfg.rb:167:7:167:10 | true | | -| cfg.rb:167:1:167:10 | ... = ... | cfg.rb:168:1:168:1 | x | | -| cfg.rb:167:5:167:10 | ! ... | cfg.rb:167:1:167:10 | ... = ... | | -| cfg.rb:167:7:167:10 | true | cfg.rb:167:5:167:10 | ! ... | | -| cfg.rb:168:1:168:1 | x | cfg.rb:168:7:168:8 | 42 | | -| cfg.rb:168:1:168:8 | ... = ... | cfg.rb:170:1:170:20 | undef ... | | -| cfg.rb:168:5:168:8 | - ... | cfg.rb:168:1:168:8 | ... = ... | | +| cfg.rb:167:1:167:1 | x | cfg.rb:167:5:167:10 | ! ... | | +| cfg.rb:167:1:167:10 | ... = ... | cfg.rb:167:1:167:10 | After ... = ... | | +| cfg.rb:167:1:167:10 | After ... = ... | cfg.rb:168:1:168:8 | Before ... = ... | | +| cfg.rb:167:1:167:10 | Before ... = ... | cfg.rb:167:1:167:1 | x | | +| cfg.rb:167:5:167:10 | ! ... | cfg.rb:167:7:167:10 | true | | +| cfg.rb:167:5:167:10 | After ! ... | cfg.rb:167:1:167:10 | ... = ... | | +| cfg.rb:167:7:167:10 | true | cfg.rb:167:5:167:10 | After ! ... | | +| cfg.rb:168:1:168:1 | x | cfg.rb:168:5:168:8 | Before - ... | | +| cfg.rb:168:1:168:8 | ... = ... | cfg.rb:168:1:168:8 | After ... = ... | | +| cfg.rb:168:1:168:8 | After ... = ... | cfg.rb:170:1:170:20 | Before undef ... | | +| cfg.rb:168:1:168:8 | Before ... = ... | cfg.rb:168:1:168:1 | x | | +| cfg.rb:168:5:168:8 | - ... | cfg.rb:168:5:168:8 | After - ... | | +| cfg.rb:168:5:168:8 | After - ... | cfg.rb:168:1:168:8 | ... = ... | | +| cfg.rb:168:5:168:8 | Before - ... | cfg.rb:168:7:168:8 | 42 | | | cfg.rb:168:7:168:8 | 42 | cfg.rb:168:5:168:8 | - ... | | -| cfg.rb:170:1:170:20 | undef ... | cfg.rb:170:7:170:20 | two_parameters | | -| cfg.rb:170:7:170:20 | two_parameters | cfg.rb:172:8:172:8 | x | | -| cfg.rb:172:1:172:49 | unless ... | cfg.rb:174:18:174:18 | x | | +| cfg.rb:170:1:170:20 | After undef ... | cfg.rb:172:1:172:49 | unless ... | | +| cfg.rb:170:1:170:20 | Before undef ... | cfg.rb:170:7:170:20 | two_parameters | | +| cfg.rb:170:1:170:20 | undef ... | cfg.rb:170:1:170:20 | After undef ... | | +| cfg.rb:170:7:170:20 | two_parameters | cfg.rb:170:1:170:20 | undef ... | | +| cfg.rb:172:1:172:49 | After unless ... | cfg.rb:174:1:174:23 | ... unless ... | | +| cfg.rb:172:1:172:49 | unless ... | cfg.rb:172:8:172:14 | Before ... == ... | | | cfg.rb:172:8:172:8 | x | cfg.rb:172:13:172:14 | 10 | | -| cfg.rb:172:8:172:14 | ... == ... | cfg.rb:172:21:172:29 | self | false | -| cfg.rb:172:8:172:14 | ... == ... | cfg.rb:172:36:172:45 | self | true | +| cfg.rb:172:8:172:14 | ... == ... | cfg.rb:172:8:172:14 | After ... == ... [false] | false | +| cfg.rb:172:8:172:14 | ... == ... | cfg.rb:172:8:172:14 | After ... == ... [true] | true | +| cfg.rb:172:8:172:14 | After ... == ... [false] | cfg.rb:172:16:172:29 | then ... | | +| cfg.rb:172:8:172:14 | After ... == ... [true] | cfg.rb:172:31:172:45 | else ... | | +| cfg.rb:172:8:172:14 | Before ... == ... | cfg.rb:172:8:172:8 | x | | | cfg.rb:172:13:172:14 | 10 | cfg.rb:172:8:172:14 | ... == ... | | -| cfg.rb:172:16:172:29 | then ... | cfg.rb:172:1:172:49 | unless ... | | -| cfg.rb:172:21:172:29 | call to puts | cfg.rb:172:16:172:29 | then ... | | -| cfg.rb:172:21:172:29 | self | cfg.rb:172:27:172:28 | hi | | -| cfg.rb:172:26:172:29 | "hi" | cfg.rb:172:21:172:29 | call to puts | | +| cfg.rb:172:16:172:29 | After then ... | cfg.rb:172:1:172:49 | After unless ... | | +| cfg.rb:172:16:172:29 | then ... | cfg.rb:172:21:172:29 | Before call to puts | | +| cfg.rb:172:21:172:29 | After call to puts | cfg.rb:172:16:172:29 | After then ... | | +| cfg.rb:172:21:172:29 | Before call to puts | cfg.rb:172:21:172:29 | self | | +| cfg.rb:172:21:172:29 | call to puts | cfg.rb:172:21:172:29 | After call to puts | | +| cfg.rb:172:21:172:29 | self | cfg.rb:172:26:172:29 | Before "hi" | | +| cfg.rb:172:26:172:29 | "hi" | cfg.rb:172:26:172:29 | After "hi" | | +| cfg.rb:172:26:172:29 | After "hi" | cfg.rb:172:21:172:29 | call to puts | | +| cfg.rb:172:26:172:29 | Before "hi" | cfg.rb:172:27:172:28 | hi | | | cfg.rb:172:27:172:28 | hi | cfg.rb:172:26:172:29 | "hi" | | -| cfg.rb:172:31:172:45 | else ... | cfg.rb:172:1:172:49 | unless ... | | -| cfg.rb:172:36:172:45 | call to puts | cfg.rb:172:31:172:45 | else ... | | -| cfg.rb:172:36:172:45 | self | cfg.rb:172:42:172:44 | bye | | -| cfg.rb:172:41:172:45 | "bye" | cfg.rb:172:36:172:45 | call to puts | | +| cfg.rb:172:31:172:45 | After else ... | cfg.rb:172:1:172:49 | After unless ... | | +| cfg.rb:172:31:172:45 | else ... | cfg.rb:172:36:172:45 | Before call to puts | | +| cfg.rb:172:36:172:45 | After call to puts | cfg.rb:172:31:172:45 | After else ... | | +| cfg.rb:172:36:172:45 | Before call to puts | cfg.rb:172:36:172:45 | self | | +| cfg.rb:172:36:172:45 | call to puts | cfg.rb:172:36:172:45 | After call to puts | | +| cfg.rb:172:36:172:45 | self | cfg.rb:172:41:172:45 | Before "bye" | | +| cfg.rb:172:41:172:45 | "bye" | cfg.rb:172:41:172:45 | After "bye" | | +| cfg.rb:172:41:172:45 | After "bye" | cfg.rb:172:36:172:45 | call to puts | | +| cfg.rb:172:41:172:45 | Before "bye" | cfg.rb:172:42:172:44 | bye | | | cfg.rb:172:42:172:44 | bye | cfg.rb:172:41:172:45 | "bye" | | -| cfg.rb:174:1:174:9 | call to puts | cfg.rb:174:1:174:23 | ... unless ... | | -| cfg.rb:174:1:174:9 | self | cfg.rb:174:7:174:8 | hi | | -| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:176:7:176:7 | x | | -| cfg.rb:174:6:174:9 | "hi" | cfg.rb:174:1:174:9 | call to puts | | +| cfg.rb:174:1:174:9 | After call to puts | cfg.rb:174:1:174:23 | After ... unless ... | | +| cfg.rb:174:1:174:9 | Before call to puts | cfg.rb:174:1:174:9 | self | | +| cfg.rb:174:1:174:9 | call to puts | cfg.rb:174:1:174:9 | After call to puts | | +| cfg.rb:174:1:174:9 | self | cfg.rb:174:6:174:9 | Before "hi" | | +| cfg.rb:174:1:174:23 | ... unless ... | cfg.rb:174:18:174:23 | Before ... == ... | | +| cfg.rb:174:1:174:23 | After ... unless ... | cfg.rb:176:1:176:41 | until ... | | +| cfg.rb:174:6:174:9 | "hi" | cfg.rb:174:6:174:9 | After "hi" | | +| cfg.rb:174:6:174:9 | After "hi" | cfg.rb:174:1:174:9 | call to puts | | +| cfg.rb:174:6:174:9 | Before "hi" | cfg.rb:174:7:174:8 | hi | | | cfg.rb:174:7:174:8 | hi | cfg.rb:174:6:174:9 | "hi" | | | cfg.rb:174:18:174:18 | x | cfg.rb:174:23:174:23 | 0 | | -| cfg.rb:174:18:174:23 | ... == ... | cfg.rb:174:1:174:9 | self | false | -| cfg.rb:174:18:174:23 | ... == ... | cfg.rb:174:1:174:23 | ... unless ... | true | +| cfg.rb:174:18:174:23 | ... == ... | cfg.rb:174:18:174:23 | After ... == ... [false] | false | +| cfg.rb:174:18:174:23 | ... == ... | cfg.rb:174:18:174:23 | After ... == ... [true] | true | +| cfg.rb:174:18:174:23 | After ... == ... [false] | cfg.rb:174:1:174:9 | Before call to puts | | +| cfg.rb:174:18:174:23 | After ... == ... [true] | cfg.rb:174:1:174:23 | After ... unless ... | | +| cfg.rb:174:18:174:23 | Before ... == ... | cfg.rb:174:18:174:18 | x | | | cfg.rb:174:23:174:23 | 0 | cfg.rb:174:18:174:23 | ... == ... | | -| cfg.rb:176:1:176:41 | until ... | cfg.rb:178:1:178:1 | i | | +| cfg.rb:176:1:176:41 | After until ... | cfg.rb:178:1:178:5 | Before ... = ... | | +| cfg.rb:176:1:176:41 | [LoopHeader] until ... | cfg.rb:176:7:176:12 | Before ... > ... | | +| cfg.rb:176:1:176:41 | until ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | | | cfg.rb:176:7:176:7 | x | cfg.rb:176:11:176:12 | 10 | | -| cfg.rb:176:7:176:12 | ... > ... | cfg.rb:176:1:176:41 | until ... | true | -| cfg.rb:176:7:176:12 | ... > ... | cfg.rb:176:17:176:17 | x | false | +| cfg.rb:176:7:176:12 | ... > ... | cfg.rb:176:7:176:12 | After ... > ... [false] | false | +| cfg.rb:176:7:176:12 | ... > ... | cfg.rb:176:7:176:12 | After ... > ... [true] | true | +| cfg.rb:176:7:176:12 | After ... > ... [false] | cfg.rb:176:14:176:41 | do ... | | +| cfg.rb:176:7:176:12 | After ... > ... [true] | cfg.rb:176:1:176:41 | After until ... | | +| cfg.rb:176:7:176:12 | Before ... > ... | cfg.rb:176:7:176:7 | x | | | cfg.rb:176:11:176:12 | 10 | cfg.rb:176:7:176:12 | ... > ... | | -| cfg.rb:176:14:176:41 | do ... | cfg.rb:176:7:176:7 | x | | -| cfg.rb:176:17:176:17 | x | cfg.rb:176:17:176:17 | x | | +| cfg.rb:176:14:176:41 | After do ... | cfg.rb:176:1:176:41 | [LoopHeader] until ... | | +| cfg.rb:176:14:176:41 | do ... | cfg.rb:176:17:176:23 | Before ... = ... | | +| cfg.rb:176:17:176:17 | x | cfg.rb:176:19:176:20 | Before ... + ... | | | cfg.rb:176:17:176:17 | x | cfg.rb:176:22:176:23 | 10 | | -| cfg.rb:176:17:176:23 | ... = ... | cfg.rb:176:26:176:37 | self | | -| cfg.rb:176:19:176:20 | ... + ... | cfg.rb:176:17:176:23 | ... = ... | | +| cfg.rb:176:17:176:23 | ... = ... | cfg.rb:176:17:176:23 | After ... = ... | | +| cfg.rb:176:17:176:23 | After ... = ... | cfg.rb:176:26:176:37 | Before call to puts | | +| cfg.rb:176:17:176:23 | Before ... = ... | cfg.rb:176:17:176:17 | x | | +| cfg.rb:176:19:176:20 | ... + ... | cfg.rb:176:19:176:20 | After ... + ... | | +| cfg.rb:176:19:176:20 | After ... + ... | cfg.rb:176:17:176:23 | ... = ... | | +| cfg.rb:176:19:176:20 | Before ... + ... | cfg.rb:176:17:176:17 | x | | | cfg.rb:176:22:176:23 | 10 | cfg.rb:176:19:176:20 | ... + ... | | -| cfg.rb:176:26:176:37 | call to puts | cfg.rb:176:14:176:41 | do ... | | -| cfg.rb:176:26:176:37 | self | cfg.rb:176:32:176:36 | hello | | -| cfg.rb:176:31:176:37 | "hello" | cfg.rb:176:26:176:37 | call to puts | | +| cfg.rb:176:26:176:37 | After call to puts | cfg.rb:176:14:176:41 | After do ... | | +| cfg.rb:176:26:176:37 | Before call to puts | cfg.rb:176:26:176:37 | self | | +| cfg.rb:176:26:176:37 | call to puts | cfg.rb:176:26:176:37 | After call to puts | | +| cfg.rb:176:26:176:37 | self | cfg.rb:176:31:176:37 | Before "hello" | | +| cfg.rb:176:31:176:37 | "hello" | cfg.rb:176:31:176:37 | After "hello" | | +| cfg.rb:176:31:176:37 | After "hello" | cfg.rb:176:26:176:37 | call to puts | | +| cfg.rb:176:31:176:37 | Before "hello" | cfg.rb:176:32:176:36 | hello | | | cfg.rb:176:32:176:36 | hello | cfg.rb:176:31:176:37 | "hello" | | | cfg.rb:178:1:178:1 | i | cfg.rb:178:5:178:5 | 0 | | -| cfg.rb:178:1:178:5 | ... = ... | cfg.rb:179:30:179:30 | i | | +| cfg.rb:178:1:178:5 | ... = ... | cfg.rb:178:1:178:5 | After ... = ... | | +| cfg.rb:178:1:178:5 | After ... = ... | cfg.rb:179:1:179:36 | ... until ... | | +| cfg.rb:178:1:178:5 | Before ... = ... | cfg.rb:178:1:178:1 | i | | | cfg.rb:178:5:178:5 | 0 | cfg.rb:178:1:178:5 | ... = ... | | -| cfg.rb:179:1:179:22 | ( ... ) | cfg.rb:179:30:179:30 | i | | -| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:181:1:181:1 | x | | -| cfg.rb:179:2:179:13 | call to puts | cfg.rb:179:16:179:16 | i | | -| cfg.rb:179:2:179:13 | self | cfg.rb:179:8:179:12 | hello | | -| cfg.rb:179:7:179:13 | "hello" | cfg.rb:179:2:179:13 | call to puts | | +| cfg.rb:179:1:179:22 | ( ... ) | cfg.rb:179:2:179:13 | Before call to puts | | +| cfg.rb:179:1:179:22 | After ( ... ) | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | | +| cfg.rb:179:1:179:36 | ... until ... | cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | | +| cfg.rb:179:1:179:36 | After ... until ... | cfg.rb:181:1:181:5 | Before ... = ... | | +| cfg.rb:179:1:179:36 | [LoopHeader] ... until ... | cfg.rb:179:30:179:36 | Before ... == ... | | +| cfg.rb:179:2:179:13 | After call to puts | cfg.rb:179:16:179:21 | Before ... = ... | | +| cfg.rb:179:2:179:13 | Before call to puts | cfg.rb:179:2:179:13 | self | | +| cfg.rb:179:2:179:13 | call to puts | cfg.rb:179:2:179:13 | After call to puts | | +| cfg.rb:179:2:179:13 | self | cfg.rb:179:7:179:13 | Before "hello" | | +| cfg.rb:179:7:179:13 | "hello" | cfg.rb:179:7:179:13 | After "hello" | | +| cfg.rb:179:7:179:13 | After "hello" | cfg.rb:179:2:179:13 | call to puts | | +| cfg.rb:179:7:179:13 | Before "hello" | cfg.rb:179:8:179:12 | hello | | | cfg.rb:179:8:179:12 | hello | cfg.rb:179:7:179:13 | "hello" | | -| cfg.rb:179:16:179:16 | i | cfg.rb:179:16:179:16 | i | | +| cfg.rb:179:16:179:16 | i | cfg.rb:179:18:179:19 | Before ... + ... | | | cfg.rb:179:16:179:16 | i | cfg.rb:179:21:179:21 | 1 | | -| cfg.rb:179:16:179:21 | ... = ... | cfg.rb:179:1:179:22 | ( ... ) | | -| cfg.rb:179:18:179:19 | ... + ... | cfg.rb:179:16:179:21 | ... = ... | | +| cfg.rb:179:16:179:21 | ... = ... | cfg.rb:179:16:179:21 | After ... = ... | | +| cfg.rb:179:16:179:21 | After ... = ... | cfg.rb:179:1:179:22 | After ( ... ) | | +| cfg.rb:179:16:179:21 | Before ... = ... | cfg.rb:179:16:179:16 | i | | +| cfg.rb:179:18:179:19 | ... + ... | cfg.rb:179:18:179:19 | After ... + ... | | +| cfg.rb:179:18:179:19 | After ... + ... | cfg.rb:179:16:179:21 | ... = ... | | +| cfg.rb:179:18:179:19 | Before ... + ... | cfg.rb:179:16:179:16 | i | | | cfg.rb:179:21:179:21 | 1 | cfg.rb:179:18:179:19 | ... + ... | | | cfg.rb:179:30:179:30 | i | cfg.rb:179:35:179:36 | 10 | | -| cfg.rb:179:30:179:36 | ... == ... | cfg.rb:179:1:179:36 | ... until ... | true | -| cfg.rb:179:30:179:36 | ... == ... | cfg.rb:179:2:179:13 | self | false | +| cfg.rb:179:30:179:36 | ... == ... | cfg.rb:179:30:179:36 | After ... == ... [false] | false | +| cfg.rb:179:30:179:36 | ... == ... | cfg.rb:179:30:179:36 | After ... == ... [true] | true | +| cfg.rb:179:30:179:36 | After ... == ... [false] | cfg.rb:179:1:179:22 | ( ... ) | | +| cfg.rb:179:30:179:36 | After ... == ... [true] | cfg.rb:179:1:179:36 | After ... until ... | | +| cfg.rb:179:30:179:36 | Before ... == ... | cfg.rb:179:30:179:30 | i | | | cfg.rb:179:35:179:36 | 10 | cfg.rb:179:30:179:36 | ... == ... | | | cfg.rb:181:1:181:1 | x | cfg.rb:181:5:181:5 | 0 | | -| cfg.rb:181:1:181:5 | ... = ... | cfg.rb:182:7:182:7 | x | | +| cfg.rb:181:1:181:5 | ... = ... | cfg.rb:181:1:181:5 | After ... = ... | | +| cfg.rb:181:1:181:5 | After ... = ... | cfg.rb:182:1:186:3 | while ... | | +| cfg.rb:181:1:181:5 | Before ... = ... | cfg.rb:181:1:181:1 | x | | | cfg.rb:181:5:181:5 | 0 | cfg.rb:181:1:181:5 | ... = ... | | -| cfg.rb:182:1:186:3 | while ... | cfg.rb:188:30:188:30 | i | | +| cfg.rb:182:1:186:3 | After while ... | cfg.rb:188:1:188:35 | ... while ... | | +| cfg.rb:182:1:186:3 | [LoopHeader] while ... | cfg.rb:182:7:182:12 | Before ... < ... | | +| cfg.rb:182:1:186:3 | while ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | | | cfg.rb:182:7:182:7 | x | cfg.rb:182:11:182:12 | 10 | | -| cfg.rb:182:7:182:12 | ... < ... | cfg.rb:182:1:186:3 | while ... | false | -| cfg.rb:182:7:182:12 | ... < ... | cfg.rb:183:3:183:3 | x | true | +| cfg.rb:182:7:182:12 | ... < ... | cfg.rb:182:7:182:12 | After ... < ... [false] | false | +| cfg.rb:182:7:182:12 | ... < ... | cfg.rb:182:7:182:12 | After ... < ... [true] | true | +| cfg.rb:182:7:182:12 | After ... < ... [false] | cfg.rb:182:1:186:3 | After while ... | | +| cfg.rb:182:7:182:12 | After ... < ... [true] | cfg.rb:182:14:186:3 | do ... | | +| cfg.rb:182:7:182:12 | Before ... < ... | cfg.rb:182:7:182:7 | x | | | cfg.rb:182:11:182:12 | 10 | cfg.rb:182:7:182:12 | ... < ... | | -| cfg.rb:182:14:186:3 | do ... | cfg.rb:182:7:182:7 | x | | -| cfg.rb:183:3:183:3 | x | cfg.rb:183:3:183:3 | x | | +| cfg.rb:182:14:186:3 | After do ... | cfg.rb:182:1:186:3 | [LoopHeader] while ... | | +| cfg.rb:182:14:186:3 | do ... | cfg.rb:183:3:183:8 | Before ... = ... | | +| cfg.rb:183:3:183:3 | x | cfg.rb:183:5:183:6 | Before ... + ... | | | cfg.rb:183:3:183:3 | x | cfg.rb:183:8:183:8 | 1 | | -| cfg.rb:183:3:183:8 | ... = ... | cfg.rb:184:6:184:6 | x | | -| cfg.rb:183:5:183:6 | ... + ... | cfg.rb:183:3:183:8 | ... = ... | | +| cfg.rb:183:3:183:8 | ... = ... | cfg.rb:183:3:183:8 | After ... = ... | | +| cfg.rb:183:3:183:8 | After ... = ... | cfg.rb:184:3:184:25 | if ... | | +| cfg.rb:183:3:183:8 | Before ... = ... | cfg.rb:183:3:183:3 | x | | +| cfg.rb:183:5:183:6 | ... + ... | cfg.rb:183:5:183:6 | After ... + ... | | +| cfg.rb:183:5:183:6 | After ... + ... | cfg.rb:183:3:183:8 | ... = ... | | +| cfg.rb:183:5:183:6 | Before ... + ... | cfg.rb:183:3:183:3 | x | | | cfg.rb:183:8:183:8 | 1 | cfg.rb:183:5:183:6 | ... + ... | | -| cfg.rb:184:3:184:25 | if ... | cfg.rb:185:3:185:8 | self | | +| cfg.rb:184:3:184:25 | After if ... | cfg.rb:185:3:185:8 | Before call to puts | | +| cfg.rb:184:3:184:25 | if ... | cfg.rb:184:6:184:11 | Before ... == ... | | | cfg.rb:184:6:184:6 | x | cfg.rb:184:11:184:11 | 5 | | -| cfg.rb:184:6:184:11 | ... == ... | cfg.rb:184:3:184:25 | if ... | false | -| cfg.rb:184:6:184:11 | ... == ... | cfg.rb:184:18:184:21 | redo | true | +| cfg.rb:184:6:184:11 | ... == ... | cfg.rb:184:6:184:11 | After ... == ... [false] | false | +| cfg.rb:184:6:184:11 | ... == ... | cfg.rb:184:6:184:11 | After ... == ... [true] | true | +| cfg.rb:184:6:184:11 | After ... == ... [false] | cfg.rb:184:3:184:25 | After if ... | | +| cfg.rb:184:6:184:11 | After ... == ... [true] | cfg.rb:184:13:184:21 | then ... | | +| cfg.rb:184:6:184:11 | Before ... == ... | cfg.rb:184:6:184:6 | x | | | cfg.rb:184:11:184:11 | 5 | cfg.rb:184:6:184:11 | ... == ... | | -| cfg.rb:184:18:184:21 | redo | cfg.rb:183:3:183:3 | x | redo | -| cfg.rb:185:3:185:8 | call to puts | cfg.rb:182:14:186:3 | do ... | | +| cfg.rb:184:13:184:21 | then ... | cfg.rb:184:18:184:21 | Before redo | | +| cfg.rb:184:18:184:21 | Before redo | cfg.rb:184:18:184:21 | redo | | +| cfg.rb:184:18:184:21 | redo | cfg.rb:182:14:186:3 | do ... | redo | +| cfg.rb:185:3:185:8 | After call to puts | cfg.rb:182:14:186:3 | After do ... | | +| cfg.rb:185:3:185:8 | Before call to puts | cfg.rb:185:3:185:8 | self | | +| cfg.rb:185:3:185:8 | call to puts | cfg.rb:185:3:185:8 | After call to puts | | | cfg.rb:185:3:185:8 | self | cfg.rb:185:8:185:8 | x | | | cfg.rb:185:8:185:8 | x | cfg.rb:185:3:185:8 | call to puts | | -| cfg.rb:188:1:188:22 | ( ... ) | cfg.rb:188:30:188:30 | i | | -| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:190:1:192:3 | run_block | | -| cfg.rb:188:2:188:13 | call to puts | cfg.rb:188:16:188:16 | i | | -| cfg.rb:188:2:188:13 | self | cfg.rb:188:8:188:12 | hello | | -| cfg.rb:188:7:188:13 | "hello" | cfg.rb:188:2:188:13 | call to puts | | +| cfg.rb:188:1:188:22 | ( ... ) | cfg.rb:188:2:188:13 | Before call to puts | | +| cfg.rb:188:1:188:22 | After ( ... ) | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | | +| cfg.rb:188:1:188:35 | ... while ... | cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | | +| cfg.rb:188:1:188:35 | After ... while ... | cfg.rb:190:1:192:3 | run_block | | +| cfg.rb:188:1:188:35 | [LoopHeader] ... while ... | cfg.rb:188:30:188:35 | Before ... != ... | | +| cfg.rb:188:2:188:13 | After call to puts | cfg.rb:188:16:188:21 | Before ... = ... | | +| cfg.rb:188:2:188:13 | Before call to puts | cfg.rb:188:2:188:13 | self | | +| cfg.rb:188:2:188:13 | call to puts | cfg.rb:188:2:188:13 | After call to puts | | +| cfg.rb:188:2:188:13 | self | cfg.rb:188:7:188:13 | Before "hello" | | +| cfg.rb:188:7:188:13 | "hello" | cfg.rb:188:7:188:13 | After "hello" | | +| cfg.rb:188:7:188:13 | After "hello" | cfg.rb:188:2:188:13 | call to puts | | +| cfg.rb:188:7:188:13 | Before "hello" | cfg.rb:188:8:188:12 | hello | | | cfg.rb:188:8:188:12 | hello | cfg.rb:188:7:188:13 | "hello" | | -| cfg.rb:188:16:188:16 | i | cfg.rb:188:16:188:16 | i | | +| cfg.rb:188:16:188:16 | i | cfg.rb:188:18:188:19 | Before ... - ... | | | cfg.rb:188:16:188:16 | i | cfg.rb:188:21:188:21 | 1 | | -| cfg.rb:188:16:188:21 | ... = ... | cfg.rb:188:1:188:22 | ( ... ) | | -| cfg.rb:188:18:188:19 | ... - ... | cfg.rb:188:16:188:21 | ... = ... | | +| cfg.rb:188:16:188:21 | ... = ... | cfg.rb:188:16:188:21 | After ... = ... | | +| cfg.rb:188:16:188:21 | After ... = ... | cfg.rb:188:1:188:22 | After ( ... ) | | +| cfg.rb:188:16:188:21 | Before ... = ... | cfg.rb:188:16:188:16 | i | | +| cfg.rb:188:18:188:19 | ... - ... | cfg.rb:188:18:188:19 | After ... - ... | | +| cfg.rb:188:18:188:19 | After ... - ... | cfg.rb:188:16:188:21 | ... = ... | | +| cfg.rb:188:18:188:19 | Before ... - ... | cfg.rb:188:16:188:16 | i | | | cfg.rb:188:21:188:21 | 1 | cfg.rb:188:18:188:19 | ... - ... | | | cfg.rb:188:30:188:30 | i | cfg.rb:188:35:188:35 | 0 | | -| cfg.rb:188:30:188:35 | ... != ... | cfg.rb:188:1:188:35 | ... while ... | false | -| cfg.rb:188:30:188:35 | ... != ... | cfg.rb:188:2:188:13 | self | true | +| cfg.rb:188:30:188:35 | ... != ... | cfg.rb:188:30:188:35 | After ... != ... [false] | false | +| cfg.rb:188:30:188:35 | ... != ... | cfg.rb:188:30:188:35 | After ... != ... [true] | true | +| cfg.rb:188:30:188:35 | After ... != ... [false] | cfg.rb:188:1:188:35 | After ... while ... | | +| cfg.rb:188:30:188:35 | After ... != ... [true] | cfg.rb:188:1:188:22 | ( ... ) | | +| cfg.rb:188:30:188:35 | Before ... != ... | cfg.rb:188:30:188:30 | i | | | cfg.rb:188:35:188:35 | 0 | cfg.rb:188:30:188:35 | ... != ... | | -| cfg.rb:190:1:192:3 | enter run_block | cfg.rb:191:9:191:10 | 42 | | -| cfg.rb:190:1:192:3 | exit run_block (normal) | cfg.rb:190:1:192:3 | exit run_block | | -| cfg.rb:190:1:192:3 | run_block | cfg.rb:194:1:194:23 | self | | -| cfg.rb:191:3:191:10 | yield ... | cfg.rb:190:1:192:3 | exit run_block (normal) | | +| cfg.rb:190:1:192:3 | Entry | cfg.rb:191:3:191:10 | ... | | +| cfg.rb:190:1:192:3 | Normal Exit | cfg.rb:190:1:192:3 | Exit | | +| cfg.rb:190:1:192:3 | run_block | cfg.rb:194:1:194:23 | Before call to run_block | | +| cfg.rb:191:3:191:10 | ... | cfg.rb:191:3:191:10 | Before yield ... | | +| cfg.rb:191:3:191:10 | After ... | cfg.rb:190:1:192:3 | Normal Exit | | +| cfg.rb:191:3:191:10 | After yield ... | cfg.rb:191:3:191:10 | After ... | | +| cfg.rb:191:3:191:10 | Before yield ... | cfg.rb:191:9:191:10 | 42 | | +| cfg.rb:191:3:191:10 | yield ... | cfg.rb:191:3:191:10 | After yield ... | | | cfg.rb:191:9:191:10 | 42 | cfg.rb:191:3:191:10 | yield ... | | -| cfg.rb:194:1:194:23 | call to run_block | cfg.rb:196:1:198:3 | forward_param | | +| cfg.rb:194:1:194:23 | After call to run_block | cfg.rb:196:1:198:3 | forward_param | | +| cfg.rb:194:1:194:23 | Before call to run_block | cfg.rb:194:1:194:23 | self | | +| cfg.rb:194:1:194:23 | call to run_block | cfg.rb:194:1:194:23 | After call to run_block | | | cfg.rb:194:1:194:23 | self | cfg.rb:194:11:194:23 | { ... } | | -| cfg.rb:194:11:194:23 | enter { ... } | cfg.rb:194:14:194:14 | x | | -| cfg.rb:194:11:194:23 | exit { ... } (normal) | cfg.rb:194:11:194:23 | exit { ... } | | +| cfg.rb:194:11:194:23 | Entry | cfg.rb:194:14:194:14 | x | | +| cfg.rb:194:11:194:23 | Normal Exit | cfg.rb:194:11:194:23 | Exit | | | cfg.rb:194:11:194:23 | { ... } | cfg.rb:194:1:194:23 | call to run_block | | -| cfg.rb:194:14:194:14 | x | cfg.rb:194:16:194:21 | self | | -| cfg.rb:194:16:194:21 | call to puts | cfg.rb:194:11:194:23 | exit { ... } (normal) | | +| cfg.rb:194:14:194:14 | x | cfg.rb:194:16:194:21 | ... | | +| cfg.rb:194:16:194:21 | ... | cfg.rb:194:16:194:21 | Before call to puts | | +| cfg.rb:194:16:194:21 | After ... | cfg.rb:194:11:194:23 | Normal Exit | | +| cfg.rb:194:16:194:21 | After call to puts | cfg.rb:194:16:194:21 | After ... | | +| cfg.rb:194:16:194:21 | Before call to puts | cfg.rb:194:16:194:21 | self | | +| cfg.rb:194:16:194:21 | call to puts | cfg.rb:194:16:194:21 | After call to puts | | | cfg.rb:194:16:194:21 | self | cfg.rb:194:21:194:21 | x | | | cfg.rb:194:21:194:21 | x | cfg.rb:194:16:194:21 | call to puts | | -| cfg.rb:196:1:198:3 | enter forward_param | cfg.rb:196:19:196:19 | a | | -| cfg.rb:196:1:198:3 | exit forward_param (normal) | cfg.rb:196:1:198:3 | exit forward_param | | -| cfg.rb:196:1:198:3 | forward_param | cfg.rb:200:1:200:1 | 1 | | +| cfg.rb:196:1:198:3 | Entry | cfg.rb:196:19:196:19 | a | | +| cfg.rb:196:1:198:3 | Normal Exit | cfg.rb:196:1:198:3 | Exit | | +| cfg.rb:196:1:198:3 | forward_param | cfg.rb:200:1:200:32 | Before call to times | | | cfg.rb:196:19:196:19 | a | cfg.rb:196:22:196:22 | b | | | cfg.rb:196:22:196:22 | b | cfg.rb:196:25:196:27 | ... | | -| cfg.rb:196:25:196:27 | ... | cfg.rb:197:3:197:13 | self | | -| cfg.rb:197:3:197:13 | call to bar | cfg.rb:196:1:198:3 | exit forward_param (normal) | | +| cfg.rb:196:25:196:27 | ... | cfg.rb:197:3:197:13 | ... | | +| cfg.rb:197:3:197:13 | ... | cfg.rb:197:3:197:13 | Before call to bar | | +| cfg.rb:197:3:197:13 | After ... | cfg.rb:196:1:198:3 | Normal Exit | | +| cfg.rb:197:3:197:13 | After call to bar | cfg.rb:197:3:197:13 | After ... | | +| cfg.rb:197:3:197:13 | Before call to bar | cfg.rb:197:3:197:13 | self | | +| cfg.rb:197:3:197:13 | call to bar | cfg.rb:197:3:197:13 | After call to bar | | | cfg.rb:197:3:197:13 | self | cfg.rb:197:7:197:7 | b | | | cfg.rb:197:7:197:7 | b | cfg.rb:197:10:197:12 | ... | | | cfg.rb:197:10:197:12 | ... | cfg.rb:197:3:197:13 | call to bar | | | cfg.rb:200:1:200:1 | 1 | cfg.rb:200:9:200:32 | { ... } | | -| cfg.rb:200:1:200:32 | call to times | cfg.rb:202:1:202:1 | 2 | | -| cfg.rb:200:9:200:32 | enter { ... } | cfg.rb:200:12:200:12 | a | | -| cfg.rb:200:9:200:32 | exit { ... } (normal) | cfg.rb:200:9:200:32 | exit { ... } | | +| cfg.rb:200:1:200:32 | After call to times | cfg.rb:202:1:202:35 | Before call to times | | +| cfg.rb:200:1:200:32 | Before call to times | cfg.rb:200:1:200:1 | 1 | | +| cfg.rb:200:1:200:32 | call to times | cfg.rb:200:1:200:32 | After call to times | | +| cfg.rb:200:9:200:32 | Entry | cfg.rb:200:12:200:12 | a | | +| cfg.rb:200:9:200:32 | Normal Exit | cfg.rb:200:9:200:32 | Exit | | | cfg.rb:200:9:200:32 | { ... } | cfg.rb:200:1:200:32 | call to times | | -| cfg.rb:200:12:200:12 | a | cfg.rb:200:15:200:15 | b | | -| cfg.rb:200:15:200:15 | b | cfg.rb:200:18:200:23 | Kernel | | +| cfg.rb:200:12:200:12 | a | cfg.rb:200:18:200:30 | ... | | | cfg.rb:200:18:200:23 | Kernel | cfg.rb:200:30:200:30 | a | | -| cfg.rb:200:18:200:30 | call to puts | cfg.rb:200:9:200:32 | exit { ... } (normal) | | +| cfg.rb:200:18:200:30 | ... | cfg.rb:200:18:200:30 | Before call to puts | | +| cfg.rb:200:18:200:30 | After ... | cfg.rb:200:9:200:32 | Normal Exit | | +| cfg.rb:200:18:200:30 | After call to puts | cfg.rb:200:18:200:30 | After ... | | +| cfg.rb:200:18:200:30 | Before call to puts | cfg.rb:200:18:200:23 | Kernel | | +| cfg.rb:200:18:200:30 | call to puts | cfg.rb:200:18:200:30 | After call to puts | | | cfg.rb:200:30:200:30 | a | cfg.rb:200:18:200:30 | call to puts | | | cfg.rb:202:1:202:1 | 2 | cfg.rb:202:9:202:35 | do ... end | | -| cfg.rb:202:1:202:35 | call to times | cfg.rb:205:1:205:3 | __synth__0__1 | | +| cfg.rb:202:1:202:35 | After call to times | cfg.rb:205:1:205:23 | ... | | +| cfg.rb:202:1:202:35 | Before call to times | cfg.rb:202:1:202:1 | 2 | | +| cfg.rb:202:1:202:35 | call to times | cfg.rb:202:1:202:35 | After call to times | | +| cfg.rb:202:9:202:35 | Entry | cfg.rb:202:13:202:13 | c | | +| cfg.rb:202:9:202:35 | Normal Exit | cfg.rb:202:9:202:35 | Exit | | | cfg.rb:202:9:202:35 | do ... end | cfg.rb:202:1:202:35 | call to times | | -| cfg.rb:202:9:202:35 | enter do ... end | cfg.rb:202:13:202:13 | c | | -| cfg.rb:202:9:202:35 | exit do ... end (normal) | cfg.rb:202:9:202:35 | exit do ... end | | -| cfg.rb:202:13:202:13 | c | cfg.rb:202:16:202:16 | d | | -| cfg.rb:202:16:202:16 | d | cfg.rb:202:19:202:24 | Kernel | | +| cfg.rb:202:13:202:13 | c | cfg.rb:202:19:202:31 | ... | | | cfg.rb:202:19:202:24 | Kernel | cfg.rb:202:31:202:31 | c | | -| cfg.rb:202:19:202:31 | call to puts | cfg.rb:202:9:202:35 | exit do ... end (normal) | | +| cfg.rb:202:19:202:31 | ... | cfg.rb:202:19:202:31 | Before call to puts | | +| cfg.rb:202:19:202:31 | After ... | cfg.rb:202:9:202:35 | Normal Exit | | +| cfg.rb:202:19:202:31 | After call to puts | cfg.rb:202:19:202:31 | After ... | | +| cfg.rb:202:19:202:31 | Before call to puts | cfg.rb:202:19:202:24 | Kernel | | +| cfg.rb:202:19:202:31 | call to puts | cfg.rb:202:19:202:31 | After call to puts | | | cfg.rb:202:31:202:31 | c | cfg.rb:202:19:202:31 | call to puts | | -| cfg.rb:205:1:205:3 | ... = ... | cfg.rb:205:4:205:5 | nil | | -| cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:1:205:3 | self | | +| cfg.rb:205:1:205:3 | ... = ... | cfg.rb:205:1:205:3 | After ... = ... | | +| cfg.rb:205:1:205:3 | After ... = ... | cfg.rb:205:4:205:5 | if ... | | +| cfg.rb:205:1:205:3 | After call to foo | cfg.rb:205:1:205:3 | ... = ... | | +| cfg.rb:205:1:205:3 | Before ... = ... | cfg.rb:205:1:205:3 | __synth__0__1 | | +| cfg.rb:205:1:205:3 | Before call to foo | cfg.rb:205:1:205:3 | self | | +| cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:1:205:3 | Before call to foo | | | cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:4:205:5 | call to == | | | cfg.rb:205:1:205:3 | __synth__0__1 | cfg.rb:205:10:205:10 | 1 | | -| cfg.rb:205:1:205:3 | call to foo | cfg.rb:205:1:205:3 | ... = ... | | -| cfg.rb:205:1:205:3 | nil | cfg.rb:205:4:205:5 | if ... | | +| cfg.rb:205:1:205:3 | call to foo | cfg.rb:205:1:205:3 | After call to foo | | +| cfg.rb:205:1:205:3 | nil | cfg.rb:205:4:205:5 | After if ... | | | cfg.rb:205:1:205:3 | self | cfg.rb:205:1:205:3 | call to foo | | -| cfg.rb:205:1:205:23 | ... | cfg.rb:207:1:211:3 | filter_nil | | -| cfg.rb:205:1:205:23 | call to bar | cfg.rb:205:4:205:5 | if ... | | -| cfg.rb:205:4:205:5 | call to == | cfg.rb:205:1:205:3 | __synth__0__1 | false | -| cfg.rb:205:4:205:5 | call to == | cfg.rb:205:1:205:3 | nil | true | -| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:1:205:23 | ... | | +| cfg.rb:205:1:205:23 | ... | cfg.rb:205:1:205:3 | Before ... = ... | | +| cfg.rb:205:1:205:23 | After ... | cfg.rb:207:1:211:3 | filter_nil | | +| cfg.rb:205:1:205:23 | After call to bar | cfg.rb:205:4:205:5 | After if ... | | +| cfg.rb:205:1:205:23 | Before call to bar | cfg.rb:205:1:205:3 | __synth__0__1 | | +| cfg.rb:205:1:205:23 | call to bar | cfg.rb:205:1:205:23 | After call to bar | | +| cfg.rb:205:4:205:5 | After call to == [false] | cfg.rb:205:1:205:23 | Before call to bar | | +| cfg.rb:205:4:205:5 | After call to == [true] | cfg.rb:205:1:205:3 | nil | | +| cfg.rb:205:4:205:5 | After if ... | cfg.rb:205:1:205:23 | After ... | | +| cfg.rb:205:4:205:5 | Before call to == | cfg.rb:205:4:205:5 | nil | | +| cfg.rb:205:4:205:5 | call to == | cfg.rb:205:4:205:5 | After call to == [false] | false | +| cfg.rb:205:4:205:5 | call to == | cfg.rb:205:4:205:5 | After call to == [true] | true | +| cfg.rb:205:4:205:5 | if ... | cfg.rb:205:4:205:5 | Before call to == | | | cfg.rb:205:4:205:5 | nil | cfg.rb:205:1:205:3 | __synth__0__1 | | | cfg.rb:205:10:205:10 | 1 | cfg.rb:205:12:205:12 | 2 | | | cfg.rb:205:12:205:12 | 2 | cfg.rb:205:15:205:23 | { ... } | | -| cfg.rb:205:15:205:23 | enter { ... } | cfg.rb:205:18:205:18 | x | | -| cfg.rb:205:15:205:23 | exit { ... } (normal) | cfg.rb:205:15:205:23 | exit { ... } | | +| cfg.rb:205:15:205:23 | Entry | cfg.rb:205:18:205:18 | x | | +| cfg.rb:205:15:205:23 | Normal Exit | cfg.rb:205:15:205:23 | Exit | | | cfg.rb:205:15:205:23 | { ... } | cfg.rb:205:1:205:23 | call to bar | | -| cfg.rb:205:18:205:18 | x | cfg.rb:205:21:205:21 | x | | -| cfg.rb:205:21:205:21 | x | cfg.rb:205:15:205:23 | exit { ... } (normal) | | -| cfg.rb:207:1:211:3 | enter filter_nil | cfg.rb:207:16:207:19 | list | | -| cfg.rb:207:1:211:3 | exit filter_nil (normal) | cfg.rb:207:1:211:3 | exit filter_nil | | -| cfg.rb:207:1:211:3 | filter_nil | cfg.rb:213:1:216:3 | self | | -| cfg.rb:207:16:207:19 | list | cfg.rb:208:3:208:6 | list | | +| cfg.rb:205:18:205:18 | x | cfg.rb:205:21:205:21 | ... | | +| cfg.rb:205:21:205:21 | ... | cfg.rb:205:21:205:21 | x | | +| cfg.rb:205:21:205:21 | After ... | cfg.rb:205:15:205:23 | Normal Exit | | +| cfg.rb:205:21:205:21 | x | cfg.rb:205:21:205:21 | After ... | | +| cfg.rb:207:1:211:3 | Entry | cfg.rb:207:16:207:19 | list | | +| cfg.rb:207:1:211:3 | Normal Exit | cfg.rb:207:1:211:3 | Exit | | +| cfg.rb:207:1:211:3 | filter_nil | cfg.rb:213:1:216:3 | Before call to do_something | | +| cfg.rb:207:16:207:19 | list | cfg.rb:208:3:210:5 | ... | | | cfg.rb:208:3:208:6 | list | cfg.rb:208:15:210:5 | do ... end | | -| cfg.rb:208:3:210:5 | call to reject | cfg.rb:207:1:211:3 | exit filter_nil (normal) | | +| cfg.rb:208:3:210:5 | ... | cfg.rb:208:3:210:5 | Before call to reject | | +| cfg.rb:208:3:210:5 | After ... | cfg.rb:207:1:211:3 | Normal Exit | | +| cfg.rb:208:3:210:5 | After call to reject | cfg.rb:208:3:210:5 | After ... | | +| cfg.rb:208:3:210:5 | Before call to reject | cfg.rb:208:3:208:6 | list | | +| cfg.rb:208:3:210:5 | call to reject | cfg.rb:208:3:210:5 | After call to reject | | +| cfg.rb:208:15:210:5 | Entry | cfg.rb:208:19:208:22 | elem | | +| cfg.rb:208:15:210:5 | Normal Exit | cfg.rb:208:15:210:5 | Exit | | | cfg.rb:208:15:210:5 | do ... end | cfg.rb:208:3:210:5 | call to reject | | -| cfg.rb:208:15:210:5 | enter do ... end | cfg.rb:208:19:208:22 | elem | | -| cfg.rb:208:15:210:5 | exit do ... end (normal) | cfg.rb:208:15:210:5 | exit do ... end | | | cfg.rb:208:19:208:22 | elem | cfg.rb:208:25:208:25 | __synth__0 | | | cfg.rb:208:25:208:25 | __synth__0 | cfg.rb:208:28:208:29 | __synth__0 | | -| cfg.rb:208:28:208:29 | __synth__0 | cfg.rb:209:5:209:8 | elem | | +| cfg.rb:208:28:208:29 | __synth__0 | cfg.rb:209:5:209:13 | ... | | | cfg.rb:209:5:209:8 | elem | cfg.rb:209:5:209:13 | call to nil? | | -| cfg.rb:209:5:209:13 | call to nil? | cfg.rb:208:15:210:5 | exit do ... end (normal) | | -| cfg.rb:213:1:216:3 | call to do_something | cfg.rb:1:1:221:1 | exit cfg.rb (normal) | | +| cfg.rb:209:5:209:13 | ... | cfg.rb:209:5:209:13 | Before call to nil? | | +| cfg.rb:209:5:209:13 | After ... | cfg.rb:208:15:210:5 | Normal Exit | | +| cfg.rb:209:5:209:13 | After call to nil? | cfg.rb:209:5:209:13 | After ... | | +| cfg.rb:209:5:209:13 | Before call to nil? | cfg.rb:209:5:209:8 | elem | | +| cfg.rb:209:5:209:13 | call to nil? | cfg.rb:209:5:209:13 | After call to nil? | | +| cfg.rb:213:1:216:3 | After call to do_something | cfg.rb:1:1:221:1 | Normal Exit | | +| cfg.rb:213:1:216:3 | Before call to do_something | cfg.rb:213:1:216:3 | self | | +| cfg.rb:213:1:216:3 | call to do_something | cfg.rb:213:1:216:3 | After call to do_something | | | cfg.rb:213:1:216:3 | self | cfg.rb:213:14:216:3 | do ... end | | +| cfg.rb:213:14:216:3 | Entry | cfg.rb:214:3:215:16 | ... | | +| cfg.rb:213:14:216:3 | Normal Exit | cfg.rb:213:14:216:3 | Exit | | | cfg.rb:213:14:216:3 | do ... end | cfg.rb:213:1:216:3 | call to do_something | | -| cfg.rb:213:14:216:3 | enter do ... end | cfg.rb:214:3:214:6 | self | | -| cfg.rb:213:14:216:3 | exit do ... end (normal) | cfg.rb:213:14:216:3 | exit do ... end | | | cfg.rb:214:3:214:6 | self | cfg.rb:214:3:214:16 | call to something | | -| cfg.rb:214:3:214:16 | call to something | cfg.rb:215:3:215:16 | self | | -| cfg.rb:215:3:215:16 | call to something_else | cfg.rb:213:14:216:3 | exit do ... end (normal) | | +| cfg.rb:214:3:214:16 | After call to something | cfg.rb:215:3:215:16 | Before call to something_else | | +| cfg.rb:214:3:214:16 | Before call to something | cfg.rb:214:3:214:6 | self | | +| cfg.rb:214:3:214:16 | call to something | cfg.rb:214:3:214:16 | After call to something | | +| cfg.rb:214:3:215:16 | ... | cfg.rb:214:3:214:16 | Before call to something | | +| cfg.rb:214:3:215:16 | After ... | cfg.rb:213:14:216:3 | Normal Exit | | +| cfg.rb:215:3:215:16 | After call to something_else | cfg.rb:214:3:215:16 | After ... | | +| cfg.rb:215:3:215:16 | Before call to something_else | cfg.rb:215:3:215:16 | self | | +| cfg.rb:215:3:215:16 | call to something_else | cfg.rb:215:3:215:16 | After call to something_else | | | cfg.rb:215:3:215:16 | self | cfg.rb:215:3:215:16 | call to something_else | | +| constant_compound_assign.rb:1:1:9:3 | After Foo | constant_compound_assign.rb:11:1:12:3 | top_before | | | constant_compound_assign.rb:1:1:9:3 | Foo | constant_compound_assign.rb:2:5:3:7 | foo_before | | -| constant_compound_assign.rb:1:1:22:4 | enter constant_compound_assign.rb | constant_compound_assign.rb:1:1:9:3 | Foo | | -| constant_compound_assign.rb:1:1:22:4 | exit constant_compound_assign.rb (normal) | constant_compound_assign.rb:1:1:22:4 | exit constant_compound_assign.rb | | -| constant_compound_assign.rb:2:5:3:7 | foo_before | constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | | -| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | | -| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | true | -| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:22:5:24 | 123 | false | -| constant_compound_assign.rb:5:5:5:24 | ... = ... | constant_compound_assign.rb:7:5:8:7 | foo_after | | -| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:5:5:24 | ... = ... | | -| constant_compound_assign.rb:5:22:5:24 | 123 | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | | -| constant_compound_assign.rb:7:5:8:7 | foo_after | constant_compound_assign.rb:11:1:12:3 | top_before | | -| constant_compound_assign.rb:11:1:12:3 | top_before | constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | | -| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | | -| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | true | -| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:18:14:20 | 123 | false | -| constant_compound_assign.rb:14:1:14:20 | ... = ... | constant_compound_assign.rb:16:1:17:3 | top_after | | -| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:1:14:20 | ... = ... | | -| constant_compound_assign.rb:14:18:14:20 | 123 | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | | -| constant_compound_assign.rb:16:1:17:3 | top_after | constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | | -| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | | -| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | true | -| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:21:19:23 | 123 | false | -| constant_compound_assign.rb:19:1:19:23 | ... = ... | constant_compound_assign.rb:21:1:22:3 | top_after2 | | -| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:1:19:23 | ... = ... | | -| constant_compound_assign.rb:19:21:19:23 | 123 | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | | -| constant_compound_assign.rb:21:1:22:3 | top_after2 | constant_compound_assign.rb:1:1:22:4 | exit constant_compound_assign.rb (normal) | | -| desugar.rb:1:1:3:3 | enter m1 | desugar.rb:1:8:1:8 | x | | -| desugar.rb:1:1:3:3 | exit m1 (normal) | desugar.rb:1:1:3:3 | exit m1 | | +| constant_compound_assign.rb:1:1:22:4 | Entry | constant_compound_assign.rb:1:1:9:3 | Foo | | +| constant_compound_assign.rb:1:1:22:4 | Normal Exit | constant_compound_assign.rb:1:1:22:4 | Exit | | +| constant_compound_assign.rb:2:5:3:7 | foo_before | constant_compound_assign.rb:5:5:5:24 | Before ... = ... | | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | constant_compound_assign.rb:5:22:5:24 | 123 | | +| constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | | +| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [false] | false | +| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:5:5:16 | After FOO_CONSTANT [true] | true | +| constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | | +| constant_compound_assign.rb:5:5:5:24 | ... = ... | constant_compound_assign.rb:5:5:5:24 | After ... = ... | | +| constant_compound_assign.rb:5:5:5:24 | After ... = ... | constant_compound_assign.rb:7:5:8:7 | foo_after | | +| constant_compound_assign.rb:5:5:5:24 | Before ... = ... | constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | | +| constant_compound_assign.rb:5:18:5:20 | ... \|\| ... | constant_compound_assign.rb:5:5:5:16 | FOO_CONSTANT | | +| constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | constant_compound_assign.rb:5:5:5:24 | ... = ... | | +| constant_compound_assign.rb:5:22:5:24 | 123 | constant_compound_assign.rb:5:18:5:20 | After ... \|\| ... | | +| constant_compound_assign.rb:7:5:8:7 | foo_after | constant_compound_assign.rb:1:1:9:3 | After Foo | | +| constant_compound_assign.rb:11:1:12:3 | top_before | constant_compound_assign.rb:14:1:14:20 | Before ... = ... | | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | constant_compound_assign.rb:14:18:14:20 | 123 | | +| constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | | +| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [false] | false | +| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:1:14:12 | After TOP_CONSTANT [true] | true | +| constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | | +| constant_compound_assign.rb:14:1:14:20 | ... = ... | constant_compound_assign.rb:14:1:14:20 | After ... = ... | | +| constant_compound_assign.rb:14:1:14:20 | After ... = ... | constant_compound_assign.rb:16:1:17:3 | top_after | | +| constant_compound_assign.rb:14:1:14:20 | Before ... = ... | constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | | +| constant_compound_assign.rb:14:14:14:16 | ... \|\| ... | constant_compound_assign.rb:14:1:14:12 | TOP_CONSTANT | | +| constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | constant_compound_assign.rb:14:1:14:20 | ... = ... | | +| constant_compound_assign.rb:14:18:14:20 | 123 | constant_compound_assign.rb:14:14:14:16 | After ... \|\| ... | | +| constant_compound_assign.rb:16:1:17:3 | top_after | constant_compound_assign.rb:19:1:19:23 | Before ... = ... | | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | constant_compound_assign.rb:19:21:19:23 | 123 | | +| constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | | +| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [false] | false | +| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:1:19:15 | After TOP_CONSTANT2 [true] | true | +| constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | | +| constant_compound_assign.rb:19:1:19:23 | ... = ... | constant_compound_assign.rb:19:1:19:23 | After ... = ... | | +| constant_compound_assign.rb:19:1:19:23 | After ... = ... | constant_compound_assign.rb:21:1:22:3 | top_after2 | | +| constant_compound_assign.rb:19:1:19:23 | Before ... = ... | constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | | +| constant_compound_assign.rb:19:17:19:19 | ... \|\| ... | constant_compound_assign.rb:19:1:19:15 | TOP_CONSTANT2 | | +| constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | constant_compound_assign.rb:19:1:19:23 | ... = ... | | +| constant_compound_assign.rb:19:21:19:23 | 123 | constant_compound_assign.rb:19:17:19:19 | After ... \|\| ... | | +| constant_compound_assign.rb:21:1:22:3 | top_after2 | constant_compound_assign.rb:1:1:22:4 | Normal Exit | | +| desugar.rb:1:1:3:3 | Entry | desugar.rb:1:8:1:8 | x | | +| desugar.rb:1:1:3:3 | Normal Exit | desugar.rb:1:1:3:3 | Exit | | | desugar.rb:1:1:3:3 | m1 | desugar.rb:5:1:7:3 | m2 | | -| desugar.rb:1:1:38:17 | enter desugar.rb | desugar.rb:1:1:3:3 | m1 | | -| desugar.rb:1:1:38:17 | exit desugar.rb (normal) | desugar.rb:1:1:38:17 | exit desugar.rb | | -| desugar.rb:1:8:1:8 | x | desugar.rb:2:3:2:3 | x | | -| desugar.rb:2:3:2:3 | x | desugar.rb:2:3:2:3 | x | | +| desugar.rb:1:1:38:17 | Entry | desugar.rb:1:1:3:3 | m1 | | +| desugar.rb:1:1:38:17 | Normal Exit | desugar.rb:1:1:38:17 | Exit | | +| desugar.rb:1:8:1:8 | x | desugar.rb:2:3:2:8 | ... | | +| desugar.rb:2:3:2:3 | x | desugar.rb:2:5:2:6 | Before ... + ... | | | desugar.rb:2:3:2:3 | x | desugar.rb:2:8:2:8 | 1 | | -| desugar.rb:2:3:2:8 | ... = ... | desugar.rb:1:1:3:3 | exit m1 (normal) | | -| desugar.rb:2:5:2:6 | ... + ... | desugar.rb:2:3:2:8 | ... = ... | | +| desugar.rb:2:3:2:8 | ... | desugar.rb:2:3:2:8 | Before ... = ... | | +| desugar.rb:2:3:2:8 | ... = ... | desugar.rb:2:3:2:8 | After ... = ... | | +| desugar.rb:2:3:2:8 | After ... | desugar.rb:1:1:3:3 | Normal Exit | | +| desugar.rb:2:3:2:8 | After ... = ... | desugar.rb:2:3:2:8 | After ... | | +| desugar.rb:2:3:2:8 | Before ... = ... | desugar.rb:2:3:2:3 | x | | +| desugar.rb:2:5:2:6 | ... + ... | desugar.rb:2:5:2:6 | After ... + ... | | +| desugar.rb:2:5:2:6 | After ... + ... | desugar.rb:2:3:2:8 | ... = ... | | +| desugar.rb:2:5:2:6 | Before ... + ... | desugar.rb:2:3:2:3 | x | | | desugar.rb:2:8:2:8 | 1 | desugar.rb:2:5:2:6 | ... + ... | | -| desugar.rb:5:1:7:3 | enter m2 | desugar.rb:5:8:5:8 | x | | -| desugar.rb:5:1:7:3 | exit m2 (normal) | desugar.rb:5:1:7:3 | exit m2 | | +| desugar.rb:5:1:7:3 | Entry | desugar.rb:5:8:5:8 | x | | +| desugar.rb:5:1:7:3 | Normal Exit | desugar.rb:5:1:7:3 | Exit | | | desugar.rb:5:1:7:3 | m2 | desugar.rb:9:1:11:3 | m3 | | -| desugar.rb:5:8:5:8 | x | desugar.rb:6:3:6:3 | x | | +| desugar.rb:5:8:5:8 | x | desugar.rb:6:3:6:17 | ... | | | desugar.rb:6:3:6:3 | x | desugar.rb:6:3:6:7 | call to foo | | -| desugar.rb:6:3:6:7 | call to foo | desugar.rb:6:17:6:17 | __synth__0 | | -| desugar.rb:6:3:6:13 | __synth__0 | desugar.rb:6:3:6:17 | ... | | -| desugar.rb:6:3:6:13 | call to count= | desugar.rb:6:3:6:13 | __synth__0 | | -| desugar.rb:6:3:6:17 | ... | desugar.rb:5:1:7:3 | exit m2 (normal) | | +| desugar.rb:6:3:6:7 | After call to foo | desugar.rb:6:17:6:17 | Before ... = ... | | +| desugar.rb:6:3:6:7 | Before call to foo | desugar.rb:6:3:6:3 | x | | +| desugar.rb:6:3:6:7 | call to foo | desugar.rb:6:3:6:7 | After call to foo | | +| desugar.rb:6:3:6:13 | After call to count= | desugar.rb:6:3:6:13 | __synth__0 | | +| desugar.rb:6:3:6:13 | Before call to count= | desugar.rb:6:3:6:7 | Before call to foo | | +| desugar.rb:6:3:6:13 | __synth__0 | desugar.rb:6:3:6:17 | After ... | | +| desugar.rb:6:3:6:13 | call to count= | desugar.rb:6:3:6:13 | After call to count= | | +| desugar.rb:6:3:6:17 | ... | desugar.rb:6:3:6:13 | Before call to count= | | +| desugar.rb:6:3:6:17 | ... | desugar.rb:6:3:6:17 | ... | | +| desugar.rb:6:3:6:17 | After ... | desugar.rb:5:1:7:3 | Normal Exit | | +| desugar.rb:6:3:6:17 | After ... | desugar.rb:6:3:6:17 | After ... | | | desugar.rb:6:17:6:17 | 1 | desugar.rb:6:17:6:17 | ... = ... | | -| desugar.rb:6:17:6:17 | ... = ... | desugar.rb:6:3:6:13 | call to count= | | +| desugar.rb:6:17:6:17 | ... = ... | desugar.rb:6:17:6:17 | After ... = ... | | +| desugar.rb:6:17:6:17 | After ... = ... | desugar.rb:6:3:6:13 | call to count= | | +| desugar.rb:6:17:6:17 | Before ... = ... | desugar.rb:6:17:6:17 | __synth__0 | | | desugar.rb:6:17:6:17 | __synth__0 | desugar.rb:6:17:6:17 | 1 | | -| desugar.rb:9:1:11:3 | enter m3 | desugar.rb:9:8:9:8 | x | | -| desugar.rb:9:1:11:3 | exit m3 (normal) | desugar.rb:9:1:11:3 | exit m3 | | +| desugar.rb:9:1:11:3 | Entry | desugar.rb:9:8:9:8 | x | | +| desugar.rb:9:1:11:3 | Normal Exit | desugar.rb:9:1:11:3 | Exit | | | desugar.rb:9:1:11:3 | m3 | desugar.rb:13:1:15:3 | m4 | | -| desugar.rb:9:8:9:8 | x | desugar.rb:10:3:10:3 | x | | +| desugar.rb:9:8:9:8 | x | desugar.rb:10:3:10:14 | ... | | | desugar.rb:10:3:10:3 | x | desugar.rb:10:3:10:7 | call to foo | | -| desugar.rb:10:3:10:7 | call to foo | desugar.rb:10:9:10:9 | 0 | | -| desugar.rb:10:3:10:10 | __synth__0 | desugar.rb:10:3:10:14 | ... | | -| desugar.rb:10:3:10:10 | call to []= | desugar.rb:10:3:10:10 | __synth__0 | | -| desugar.rb:10:3:10:14 | ... | desugar.rb:9:1:11:3 | exit m3 (normal) | | -| desugar.rb:10:9:10:9 | 0 | desugar.rb:10:14:10:14 | __synth__0 | | +| desugar.rb:10:3:10:7 | After call to foo | desugar.rb:10:9:10:9 | 0 | | +| desugar.rb:10:3:10:7 | Before call to foo | desugar.rb:10:3:10:3 | x | | +| desugar.rb:10:3:10:7 | call to foo | desugar.rb:10:3:10:7 | After call to foo | | +| desugar.rb:10:3:10:10 | After call to []= | desugar.rb:10:3:10:10 | __synth__0 | | +| desugar.rb:10:3:10:10 | Before call to []= | desugar.rb:10:3:10:7 | Before call to foo | | +| desugar.rb:10:3:10:10 | __synth__0 | desugar.rb:10:3:10:14 | After ... | | +| desugar.rb:10:3:10:10 | call to []= | desugar.rb:10:3:10:10 | After call to []= | | +| desugar.rb:10:3:10:14 | ... | desugar.rb:10:3:10:10 | Before call to []= | | +| desugar.rb:10:3:10:14 | ... | desugar.rb:10:3:10:14 | ... | | +| desugar.rb:10:3:10:14 | After ... | desugar.rb:9:1:11:3 | Normal Exit | | +| desugar.rb:10:3:10:14 | After ... | desugar.rb:10:3:10:14 | After ... | | +| desugar.rb:10:9:10:9 | 0 | desugar.rb:10:14:10:14 | Before ... = ... | | | desugar.rb:10:14:10:14 | 1 | desugar.rb:10:14:10:14 | ... = ... | | -| desugar.rb:10:14:10:14 | ... = ... | desugar.rb:10:3:10:10 | call to []= | | +| desugar.rb:10:14:10:14 | ... = ... | desugar.rb:10:14:10:14 | After ... = ... | | +| desugar.rb:10:14:10:14 | After ... = ... | desugar.rb:10:3:10:10 | call to []= | | +| desugar.rb:10:14:10:14 | Before ... = ... | desugar.rb:10:14:10:14 | __synth__0 | | | desugar.rb:10:14:10:14 | __synth__0 | desugar.rb:10:14:10:14 | 1 | | -| desugar.rb:13:1:15:3 | enter m4 | desugar.rb:13:8:13:8 | x | | -| desugar.rb:13:1:15:3 | exit m4 (normal) | desugar.rb:13:1:15:3 | exit m4 | | +| desugar.rb:13:1:15:3 | Entry | desugar.rb:13:8:13:8 | x | | +| desugar.rb:13:1:15:3 | Normal Exit | desugar.rb:13:1:15:3 | Exit | | | desugar.rb:13:1:15:3 | m4 | desugar.rb:17:1:19:3 | m5 | | -| desugar.rb:13:8:13:8 | x | desugar.rb:14:3:14:7 | __synth__0 | | +| desugar.rb:13:8:13:8 | x | desugar.rb:14:3:14:18 | ... | | | desugar.rb:14:3:14:3 | x | desugar.rb:14:3:14:7 | call to foo | | -| desugar.rb:14:3:14:7 | ... = ... | desugar.rb:14:15:14:16 | __synth__1 | | -| desugar.rb:14:3:14:7 | __synth__0 | desugar.rb:14:3:14:3 | x | | +| desugar.rb:14:3:14:7 | ... = ... | desugar.rb:14:3:14:7 | After ... = ... | | +| desugar.rb:14:3:14:7 | After ... = ... | desugar.rb:14:15:14:16 | Before ... = ... | | +| desugar.rb:14:3:14:7 | After call to foo | desugar.rb:14:3:14:7 | ... = ... | | +| desugar.rb:14:3:14:7 | Before ... = ... | desugar.rb:14:3:14:7 | __synth__0 | | +| desugar.rb:14:3:14:7 | Before call to foo | desugar.rb:14:3:14:3 | x | | +| desugar.rb:14:3:14:7 | __synth__0 | desugar.rb:14:3:14:7 | Before call to foo | | | desugar.rb:14:3:14:7 | __synth__0 | desugar.rb:14:3:14:13 | __synth__1 | | | desugar.rb:14:3:14:7 | __synth__0 | desugar.rb:14:3:14:13 | call to count | | -| desugar.rb:14:3:14:7 | call to foo | desugar.rb:14:3:14:7 | ... = ... | | +| desugar.rb:14:3:14:7 | call to foo | desugar.rb:14:3:14:7 | After call to foo | | +| desugar.rb:14:3:14:13 | After call to count | desugar.rb:14:18:14:18 | 1 | | +| desugar.rb:14:3:14:13 | After call to count= | desugar.rb:14:15:14:16 | __synth__1 | | +| desugar.rb:14:3:14:13 | Before call to count | desugar.rb:14:3:14:7 | __synth__0 | | +| desugar.rb:14:3:14:13 | Before call to count= | desugar.rb:14:3:14:7 | __synth__0 | | | desugar.rb:14:3:14:13 | __synth__1 | desugar.rb:14:3:14:13 | call to count= | | -| desugar.rb:14:3:14:13 | call to count | desugar.rb:14:18:14:18 | 1 | | -| desugar.rb:14:3:14:13 | call to count= | desugar.rb:14:15:14:16 | __synth__1 | | -| desugar.rb:14:3:14:18 | ... | desugar.rb:13:1:15:3 | exit m4 (normal) | | -| desugar.rb:14:15:14:16 | ... + ... | desugar.rb:14:15:14:16 | ... = ... | | -| desugar.rb:14:15:14:16 | ... = ... | desugar.rb:14:3:14:7 | __synth__0 | | -| desugar.rb:14:15:14:16 | __synth__1 | desugar.rb:14:3:14:7 | __synth__0 | | -| desugar.rb:14:15:14:16 | __synth__1 | desugar.rb:14:3:14:18 | ... | | +| desugar.rb:14:3:14:13 | call to count | desugar.rb:14:3:14:13 | After call to count | | +| desugar.rb:14:3:14:13 | call to count= | desugar.rb:14:3:14:13 | After call to count= | | +| desugar.rb:14:3:14:18 | ... | desugar.rb:14:3:14:7 | Before ... = ... | | +| desugar.rb:14:3:14:18 | ... | desugar.rb:14:3:14:18 | ... | | +| desugar.rb:14:3:14:18 | After ... | desugar.rb:13:1:15:3 | Normal Exit | | +| desugar.rb:14:3:14:18 | After ... | desugar.rb:14:3:14:18 | After ... | | +| desugar.rb:14:15:14:16 | ... + ... | desugar.rb:14:15:14:16 | After ... + ... | | +| desugar.rb:14:15:14:16 | ... = ... | desugar.rb:14:15:14:16 | After ... = ... | | +| desugar.rb:14:15:14:16 | After ... + ... | desugar.rb:14:15:14:16 | ... = ... | | +| desugar.rb:14:15:14:16 | After ... = ... | desugar.rb:14:3:14:13 | Before call to count= | | +| desugar.rb:14:15:14:16 | Before ... + ... | desugar.rb:14:3:14:13 | Before call to count | | +| desugar.rb:14:15:14:16 | Before ... = ... | desugar.rb:14:15:14:16 | __synth__1 | | +| desugar.rb:14:15:14:16 | __synth__1 | desugar.rb:14:3:14:18 | After ... | | +| desugar.rb:14:15:14:16 | __synth__1 | desugar.rb:14:15:14:16 | Before ... + ... | | | desugar.rb:14:18:14:18 | 1 | desugar.rb:14:15:14:16 | ... + ... | | -| desugar.rb:17:1:19:3 | enter m5 | desugar.rb:17:8:17:8 | x | | -| desugar.rb:17:1:19:3 | exit m5 (normal) | desugar.rb:17:1:19:3 | exit m5 | | +| desugar.rb:17:1:19:3 | Entry | desugar.rb:17:8:17:8 | x | | +| desugar.rb:17:1:19:3 | Normal Exit | desugar.rb:17:1:19:3 | Exit | | | desugar.rb:17:1:19:3 | m5 | desugar.rb:21:1:23:3 | m6 | | | desugar.rb:17:8:17:8 | x | desugar.rb:17:11:17:11 | y | | -| desugar.rb:17:11:17:11 | y | desugar.rb:18:3:18:7 | __synth__0 | | +| desugar.rb:17:11:17:11 | y | desugar.rb:18:3:18:33 | ... | | | desugar.rb:18:3:18:3 | x | desugar.rb:18:3:18:7 | call to foo | | -| desugar.rb:18:3:18:7 | ... = ... | desugar.rb:18:9:18:9 | __synth__1 | | -| desugar.rb:18:3:18:7 | __synth__0 | desugar.rb:18:3:18:3 | x | | +| desugar.rb:18:3:18:7 | ... = ... | desugar.rb:18:3:18:7 | After ... = ... | | +| desugar.rb:18:3:18:7 | After ... = ... | desugar.rb:18:9:18:9 | Before ... = ... | | +| desugar.rb:18:3:18:7 | After call to foo | desugar.rb:18:3:18:7 | ... = ... | | +| desugar.rb:18:3:18:7 | Before ... = ... | desugar.rb:18:3:18:7 | __synth__0 | | +| desugar.rb:18:3:18:7 | Before call to foo | desugar.rb:18:3:18:3 | x | | +| desugar.rb:18:3:18:7 | __synth__0 | desugar.rb:18:3:18:7 | Before call to foo | | | desugar.rb:18:3:18:7 | __synth__0 | desugar.rb:18:9:18:9 | __synth__1 | | | desugar.rb:18:3:18:7 | __synth__0 | desugar.rb:18:9:18:9 | __synth__1 | | -| desugar.rb:18:3:18:7 | call to foo | desugar.rb:18:3:18:7 | ... = ... | | +| desugar.rb:18:3:18:7 | call to foo | desugar.rb:18:3:18:7 | After call to foo | | +| desugar.rb:18:3:18:28 | After call to [] | desugar.rb:18:33:18:33 | 1 | | +| desugar.rb:18:3:18:28 | After call to []= | desugar.rb:18:30:18:31 | __synth__4 | | +| desugar.rb:18:3:18:28 | Before call to [] | desugar.rb:18:3:18:7 | __synth__0 | | +| desugar.rb:18:3:18:28 | Before call to []= | desugar.rb:18:3:18:7 | __synth__0 | | | desugar.rb:18:3:18:28 | __synth__4 | desugar.rb:18:3:18:28 | call to []= | | -| desugar.rb:18:3:18:28 | call to [] | desugar.rb:18:33:18:33 | 1 | | -| desugar.rb:18:3:18:28 | call to []= | desugar.rb:18:30:18:31 | __synth__4 | | -| desugar.rb:18:3:18:33 | ... | desugar.rb:17:1:19:3 | exit m5 (normal) | | +| desugar.rb:18:3:18:28 | call to [] | desugar.rb:18:3:18:28 | After call to [] | | +| desugar.rb:18:3:18:28 | call to []= | desugar.rb:18:3:18:28 | After call to []= | | +| desugar.rb:18:3:18:33 | ... | desugar.rb:18:3:18:7 | Before ... = ... | | +| desugar.rb:18:3:18:33 | ... | desugar.rb:18:3:18:33 | ... | | +| desugar.rb:18:3:18:33 | After ... | desugar.rb:17:1:19:3 | Normal Exit | | +| desugar.rb:18:3:18:33 | After ... | desugar.rb:18:3:18:33 | After ... | | | desugar.rb:18:9:18:9 | 0 | desugar.rb:18:9:18:9 | ... = ... | | -| desugar.rb:18:9:18:9 | ... = ... | desugar.rb:18:12:18:16 | __synth__2 | | +| desugar.rb:18:9:18:9 | ... = ... | desugar.rb:18:9:18:9 | After ... = ... | | +| desugar.rb:18:9:18:9 | After ... = ... | desugar.rb:18:12:18:16 | Before ... = ... | | +| desugar.rb:18:9:18:9 | Before ... = ... | desugar.rb:18:9:18:9 | __synth__1 | | | desugar.rb:18:9:18:9 | __synth__1 | desugar.rb:18:9:18:9 | 0 | | | desugar.rb:18:9:18:9 | __synth__1 | desugar.rb:18:12:18:16 | __synth__2 | | | desugar.rb:18:9:18:9 | __synth__1 | desugar.rb:18:12:18:16 | __synth__2 | | | desugar.rb:18:12:18:12 | y | desugar.rb:18:12:18:16 | call to bar | | -| desugar.rb:18:12:18:16 | ... = ... | desugar.rb:18:19:18:27 | __synth__3 | | -| desugar.rb:18:12:18:16 | __synth__2 | desugar.rb:18:12:18:12 | y | | +| desugar.rb:18:12:18:16 | ... = ... | desugar.rb:18:12:18:16 | After ... = ... | | +| desugar.rb:18:12:18:16 | After ... = ... | desugar.rb:18:19:18:27 | Before ... = ... | | +| desugar.rb:18:12:18:16 | After call to bar | desugar.rb:18:12:18:16 | ... = ... | | +| desugar.rb:18:12:18:16 | Before ... = ... | desugar.rb:18:12:18:16 | __synth__2 | | +| desugar.rb:18:12:18:16 | Before call to bar | desugar.rb:18:12:18:12 | y | | +| desugar.rb:18:12:18:16 | __synth__2 | desugar.rb:18:12:18:16 | Before call to bar | | | desugar.rb:18:12:18:16 | __synth__2 | desugar.rb:18:19:18:27 | __synth__3 | | | desugar.rb:18:12:18:16 | __synth__2 | desugar.rb:18:19:18:27 | __synth__3 | | -| desugar.rb:18:12:18:16 | call to bar | desugar.rb:18:12:18:16 | ... = ... | | +| desugar.rb:18:12:18:16 | call to bar | desugar.rb:18:12:18:16 | After call to bar | | | desugar.rb:18:19:18:19 | x | desugar.rb:18:19:18:23 | call to baz | | -| desugar.rb:18:19:18:23 | call to baz | desugar.rb:18:27:18:27 | 3 | | -| desugar.rb:18:19:18:27 | ... + ... | desugar.rb:18:19:18:27 | ... = ... | | -| desugar.rb:18:19:18:27 | ... = ... | desugar.rb:18:30:18:31 | __synth__4 | | +| desugar.rb:18:19:18:23 | After call to baz | desugar.rb:18:27:18:27 | 3 | | +| desugar.rb:18:19:18:23 | Before call to baz | desugar.rb:18:19:18:19 | x | | +| desugar.rb:18:19:18:23 | call to baz | desugar.rb:18:19:18:23 | After call to baz | | +| desugar.rb:18:19:18:27 | ... + ... | desugar.rb:18:19:18:27 | After ... + ... | | +| desugar.rb:18:19:18:27 | ... = ... | desugar.rb:18:19:18:27 | After ... = ... | | +| desugar.rb:18:19:18:27 | After ... + ... | desugar.rb:18:19:18:27 | ... = ... | | +| desugar.rb:18:19:18:27 | After ... = ... | desugar.rb:18:30:18:31 | Before ... = ... | | +| desugar.rb:18:19:18:27 | Before ... + ... | desugar.rb:18:19:18:23 | Before call to baz | | +| desugar.rb:18:19:18:27 | Before ... = ... | desugar.rb:18:19:18:27 | __synth__3 | | | desugar.rb:18:19:18:27 | __synth__3 | desugar.rb:18:3:18:28 | __synth__4 | | | desugar.rb:18:19:18:27 | __synth__3 | desugar.rb:18:3:18:28 | call to [] | | -| desugar.rb:18:19:18:27 | __synth__3 | desugar.rb:18:19:18:19 | x | | +| desugar.rb:18:19:18:27 | __synth__3 | desugar.rb:18:19:18:27 | Before ... + ... | | | desugar.rb:18:27:18:27 | 3 | desugar.rb:18:19:18:27 | ... + ... | | -| desugar.rb:18:30:18:31 | ... + ... | desugar.rb:18:30:18:31 | ... = ... | | -| desugar.rb:18:30:18:31 | ... = ... | desugar.rb:18:3:18:7 | __synth__0 | | -| desugar.rb:18:30:18:31 | __synth__4 | desugar.rb:18:3:18:7 | __synth__0 | | -| desugar.rb:18:30:18:31 | __synth__4 | desugar.rb:18:3:18:33 | ... | | +| desugar.rb:18:30:18:31 | ... + ... | desugar.rb:18:30:18:31 | After ... + ... | | +| desugar.rb:18:30:18:31 | ... = ... | desugar.rb:18:30:18:31 | After ... = ... | | +| desugar.rb:18:30:18:31 | After ... + ... | desugar.rb:18:30:18:31 | ... = ... | | +| desugar.rb:18:30:18:31 | After ... = ... | desugar.rb:18:3:18:28 | Before call to []= | | +| desugar.rb:18:30:18:31 | Before ... + ... | desugar.rb:18:3:18:28 | Before call to [] | | +| desugar.rb:18:30:18:31 | Before ... = ... | desugar.rb:18:30:18:31 | __synth__4 | | +| desugar.rb:18:30:18:31 | __synth__4 | desugar.rb:18:3:18:33 | After ... | | +| desugar.rb:18:30:18:31 | __synth__4 | desugar.rb:18:30:18:31 | Before ... + ... | | | desugar.rb:18:33:18:33 | 1 | desugar.rb:18:30:18:31 | ... + ... | | -| desugar.rb:21:1:23:3 | enter m6 | desugar.rb:22:10:22:10 | __synth__2 | | -| desugar.rb:21:1:23:3 | exit m6 (normal) | desugar.rb:21:1:23:3 | exit m6 | | +| desugar.rb:21:1:23:3 | Entry | desugar.rb:22:3:22:29 | ... | | +| desugar.rb:21:1:23:3 | Normal Exit | desugar.rb:21:1:23:3 | Exit | | | desugar.rb:21:1:23:3 | m6 | desugar.rb:25:1:27:3 | m7 | | | desugar.rb:22:3:22:3 | 0 | desugar.rb:22:3:22:3 | call to [] | | -| desugar.rb:22:3:22:3 | ... = ... | desugar.rb:22:7:22:7 | y | | +| desugar.rb:22:3:22:3 | ... = ... | desugar.rb:22:3:22:3 | After ... = ... | | +| desugar.rb:22:3:22:3 | After ... = ... | desugar.rb:22:7:22:7 | Before ... = ... | | +| desugar.rb:22:3:22:3 | After call to [] | desugar.rb:22:3:22:3 | ... = ... | | +| desugar.rb:22:3:22:3 | Before ... = ... | desugar.rb:22:3:22:3 | x | | +| desugar.rb:22:3:22:3 | Before call to [] | desugar.rb:22:3:22:3 | __synth__3 | | | desugar.rb:22:3:22:3 | __synth__3 | desugar.rb:22:3:22:3 | 0 | | -| desugar.rb:22:3:22:3 | call to [] | desugar.rb:22:3:22:3 | ... = ... | | -| desugar.rb:22:3:22:3 | x | desugar.rb:22:3:22:3 | __synth__3 | | -| desugar.rb:22:3:22:29 | ... | desugar.rb:21:1:23:3 | exit m6 (normal) | | +| desugar.rb:22:3:22:3 | call to [] | desugar.rb:22:3:22:3 | After call to [] | | +| desugar.rb:22:3:22:3 | x | desugar.rb:22:3:22:3 | Before call to [] | | +| desugar.rb:22:3:22:29 | ... | desugar.rb:22:3:22:29 | ... | | +| desugar.rb:22:3:22:29 | ... | desugar.rb:22:10:22:10 | Before ... = ... | | +| desugar.rb:22:3:22:29 | After ... | desugar.rb:21:1:23:3 | Normal Exit | | +| desugar.rb:22:3:22:29 | After ... | desugar.rb:22:3:22:29 | After ... | | | desugar.rb:22:7:22:7 | 1 | desugar.rb:22:7:22:7 | -2 | | | desugar.rb:22:7:22:7 | -2 | desugar.rb:22:7:22:7 | _ .. _ | | -| desugar.rb:22:7:22:7 | ... = ... | desugar.rb:22:10:22:14 | __synth__2 | | -| desugar.rb:22:7:22:7 | _ .. _ | desugar.rb:22:7:22:7 | call to [] | | -| desugar.rb:22:7:22:7 | __synth__3 | desugar.rb:22:7:22:7 | 1 | | -| desugar.rb:22:7:22:7 | call to [] | desugar.rb:22:7:22:7 | ... = ... | | -| desugar.rb:22:7:22:7 | y | desugar.rb:22:7:22:7 | __synth__3 | | -| desugar.rb:22:10:22:10 | ... = ... | desugar.rb:22:18:22:29 | __synth__3 | | -| desugar.rb:22:10:22:10 | __synth__2 | desugar.rb:22:10:22:10 | self | | -| desugar.rb:22:10:22:10 | call to z | desugar.rb:22:10:22:10 | ... = ... | | +| desugar.rb:22:7:22:7 | ... = ... | desugar.rb:22:7:22:7 | After ... = ... | | +| desugar.rb:22:7:22:7 | After ... = ... | desugar.rb:22:10:22:14 | ... | | +| desugar.rb:22:7:22:7 | After _ .. _ | desugar.rb:22:7:22:7 | call to [] | | +| desugar.rb:22:7:22:7 | After call to [] | desugar.rb:22:7:22:7 | ... = ... | | +| desugar.rb:22:7:22:7 | Before ... = ... | desugar.rb:22:7:22:7 | y | | +| desugar.rb:22:7:22:7 | Before _ .. _ | desugar.rb:22:7:22:7 | 1 | | +| desugar.rb:22:7:22:7 | Before call to [] | desugar.rb:22:7:22:7 | __synth__3 | | +| desugar.rb:22:7:22:7 | _ .. _ | desugar.rb:22:7:22:7 | After _ .. _ | | +| desugar.rb:22:7:22:7 | __synth__3 | desugar.rb:22:7:22:7 | Before _ .. _ | | +| desugar.rb:22:7:22:7 | call to [] | desugar.rb:22:7:22:7 | After call to [] | | +| desugar.rb:22:7:22:7 | y | desugar.rb:22:7:22:7 | Before call to [] | | +| desugar.rb:22:10:22:10 | ... = ... | desugar.rb:22:10:22:10 | After ... = ... | | +| desugar.rb:22:10:22:10 | After ... = ... | desugar.rb:22:18:22:29 | Before ... = ... | | +| desugar.rb:22:10:22:10 | After call to z | desugar.rb:22:10:22:10 | ... = ... | | +| desugar.rb:22:10:22:10 | Before ... = ... | desugar.rb:22:10:22:10 | __synth__2 | | +| desugar.rb:22:10:22:10 | Before call to z | desugar.rb:22:10:22:10 | self | | +| desugar.rb:22:10:22:10 | __synth__2 | desugar.rb:22:10:22:10 | Before call to z | | +| desugar.rb:22:10:22:10 | call to z | desugar.rb:22:10:22:10 | After call to z | | | desugar.rb:22:10:22:10 | self | desugar.rb:22:10:22:10 | call to z | | | desugar.rb:22:10:22:14 | -1 | desugar.rb:22:10:22:14 | call to [] | | -| desugar.rb:22:10:22:14 | ... | desugar.rb:22:3:22:29 | ... | | -| desugar.rb:22:10:22:14 | ... = ... | desugar.rb:22:10:22:14 | call to bar= | | -| desugar.rb:22:10:22:14 | __synth__0__1 | desugar.rb:22:10:22:14 | ... | | -| desugar.rb:22:10:22:14 | __synth__0__1 | desugar.rb:22:10:22:14 | __synth__3 | | -| desugar.rb:22:10:22:14 | __synth__2 | desugar.rb:22:10:22:14 | __synth__0__1 | | +| desugar.rb:22:10:22:14 | ... | desugar.rb:22:10:22:14 | Before call to bar= | | +| desugar.rb:22:10:22:14 | ... = ... | desugar.rb:22:10:22:14 | After ... = ... | | +| desugar.rb:22:10:22:14 | After ... | desugar.rb:22:3:22:29 | After ... | | +| desugar.rb:22:10:22:14 | After ... = ... | desugar.rb:22:10:22:14 | call to bar= | | +| desugar.rb:22:10:22:14 | After call to [] | desugar.rb:22:10:22:14 | ... = ... | | +| desugar.rb:22:10:22:14 | After call to bar= | desugar.rb:22:10:22:14 | __synth__0__1 | | +| desugar.rb:22:10:22:14 | Before ... = ... | desugar.rb:22:10:22:14 | __synth__0__1 | | +| desugar.rb:22:10:22:14 | Before call to [] | desugar.rb:22:10:22:14 | __synth__3 | | +| desugar.rb:22:10:22:14 | Before call to bar= | desugar.rb:22:10:22:14 | __synth__2 | | +| desugar.rb:22:10:22:14 | __synth__0__1 | desugar.rb:22:10:22:14 | After ... | | +| desugar.rb:22:10:22:14 | __synth__0__1 | desugar.rb:22:10:22:14 | Before call to [] | | +| desugar.rb:22:10:22:14 | __synth__2 | desugar.rb:22:10:22:14 | Before ... = ... | | | desugar.rb:22:10:22:14 | __synth__3 | desugar.rb:22:10:22:14 | -1 | | -| desugar.rb:22:10:22:14 | call to [] | desugar.rb:22:10:22:14 | ... = ... | | -| desugar.rb:22:10:22:14 | call to bar= | desugar.rb:22:10:22:14 | __synth__0__1 | | -| desugar.rb:22:18:22:29 | * ... | desugar.rb:22:18:22:29 | ... = ... | | -| desugar.rb:22:18:22:29 | ... = ... | desugar.rb:22:3:22:3 | x | | +| desugar.rb:22:10:22:14 | call to [] | desugar.rb:22:10:22:14 | After call to [] | | +| desugar.rb:22:10:22:14 | call to bar= | desugar.rb:22:10:22:14 | After call to bar= | | +| desugar.rb:22:18:22:29 | * ... | desugar.rb:22:18:22:29 | After * ... | | +| desugar.rb:22:18:22:29 | ... = ... | desugar.rb:22:18:22:29 | After ... = ... | | +| desugar.rb:22:18:22:29 | After * ... | desugar.rb:22:18:22:29 | ... = ... | | +| desugar.rb:22:18:22:29 | After ... = ... | desugar.rb:22:3:22:3 | Before ... = ... | | +| desugar.rb:22:18:22:29 | After call to [] | desugar.rb:22:18:22:29 | * ... | | | desugar.rb:22:18:22:29 | Array | desugar.rb:22:19:22:19 | 1 | | -| desugar.rb:22:18:22:29 | __synth__3 | desugar.rb:22:18:22:29 | Array | | -| desugar.rb:22:18:22:29 | call to [] | desugar.rb:22:18:22:29 | * ... | | +| desugar.rb:22:18:22:29 | Before * ... | desugar.rb:22:18:22:29 | Before call to [] | | +| desugar.rb:22:18:22:29 | Before ... = ... | desugar.rb:22:18:22:29 | __synth__3 | | +| desugar.rb:22:18:22:29 | Before call to [] | desugar.rb:22:18:22:29 | Array | | +| desugar.rb:22:18:22:29 | __synth__3 | desugar.rb:22:18:22:29 | Before * ... | | +| desugar.rb:22:18:22:29 | call to [] | desugar.rb:22:18:22:29 | After call to [] | | | desugar.rb:22:19:22:19 | 1 | desugar.rb:22:22:22:22 | 2 | | | desugar.rb:22:22:22:22 | 2 | desugar.rb:22:25:22:25 | 3 | | | desugar.rb:22:25:22:25 | 3 | desugar.rb:22:28:22:28 | 4 | | | desugar.rb:22:28:22:28 | 4 | desugar.rb:22:18:22:29 | call to [] | | -| desugar.rb:25:1:27:3 | enter m7 | desugar.rb:26:15:26:25 | __synth__2 | | -| desugar.rb:25:1:27:3 | exit m7 (normal) | desugar.rb:25:1:27:3 | exit m7 | | +| desugar.rb:25:1:27:3 | Entry | desugar.rb:26:3:26:25 | ... | | +| desugar.rb:25:1:27:3 | Normal Exit | desugar.rb:25:1:27:3 | Exit | | | desugar.rb:25:1:27:3 | m7 | desugar.rb:29:1:35:3 | X | | | desugar.rb:26:3:26:3 | 0 | desugar.rb:26:3:26:3 | call to [] | | -| desugar.rb:26:3:26:3 | ... = ... | desugar.rb:26:6:26:11 | __synth__2__1 | | +| desugar.rb:26:3:26:3 | ... = ... | desugar.rb:26:3:26:3 | After ... = ... | | +| desugar.rb:26:3:26:3 | After ... = ... | desugar.rb:26:6:26:11 | ... | | +| desugar.rb:26:3:26:3 | After call to [] | desugar.rb:26:3:26:3 | ... = ... | | +| desugar.rb:26:3:26:3 | Before ... = ... | desugar.rb:26:3:26:3 | x | | +| desugar.rb:26:3:26:3 | Before call to [] | desugar.rb:26:3:26:3 | __synth__2 | | | desugar.rb:26:3:26:3 | __synth__2 | desugar.rb:26:3:26:3 | 0 | | -| desugar.rb:26:3:26:3 | call to [] | desugar.rb:26:3:26:3 | ... = ... | | -| desugar.rb:26:3:26:3 | x | desugar.rb:26:3:26:3 | __synth__2 | | -| desugar.rb:26:3:26:25 | ... | desugar.rb:25:1:27:3 | exit m7 (normal) | | +| desugar.rb:26:3:26:3 | call to [] | desugar.rb:26:3:26:3 | After call to [] | | +| desugar.rb:26:3:26:3 | x | desugar.rb:26:3:26:3 | Before call to [] | | +| desugar.rb:26:3:26:25 | ... | desugar.rb:26:3:26:25 | ... | | +| desugar.rb:26:3:26:25 | ... | desugar.rb:26:15:26:25 | Before ... = ... | | +| desugar.rb:26:3:26:25 | After ... | desugar.rb:25:1:27:3 | Normal Exit | | +| desugar.rb:26:3:26:25 | After ... | desugar.rb:26:3:26:25 | After ... | | | desugar.rb:26:6:26:11 | 1 | desugar.rb:26:6:26:11 | call to [] | | -| desugar.rb:26:6:26:11 | * ... | desugar.rb:26:6:26:11 | ... = ... | | -| desugar.rb:26:6:26:11 | ... | desugar.rb:26:3:26:25 | ... | | -| desugar.rb:26:6:26:11 | ... = ... | desugar.rb:26:7:26:7 | y | | +| desugar.rb:26:6:26:11 | * ... | desugar.rb:26:6:26:11 | After * ... | | +| desugar.rb:26:6:26:11 | ... | desugar.rb:26:6:26:11 | Before ... = ... | | +| desugar.rb:26:6:26:11 | ... = ... | desugar.rb:26:6:26:11 | After ... = ... | | +| desugar.rb:26:6:26:11 | After * ... | desugar.rb:26:6:26:11 | ... = ... | | +| desugar.rb:26:6:26:11 | After ... | desugar.rb:26:3:26:25 | After ... | | +| desugar.rb:26:6:26:11 | After ... = ... | desugar.rb:26:7:26:7 | Before ... = ... | | +| desugar.rb:26:6:26:11 | After call to [] | desugar.rb:26:6:26:11 | * ... | | +| desugar.rb:26:6:26:11 | Before * ... | desugar.rb:26:6:26:11 | Before call to [] | | +| desugar.rb:26:6:26:11 | Before ... = ... | desugar.rb:26:6:26:11 | __synth__2__1 | | +| desugar.rb:26:6:26:11 | Before call to [] | desugar.rb:26:6:26:11 | __synth__2 | | | desugar.rb:26:6:26:11 | __synth__2 | desugar.rb:26:6:26:11 | 1 | | -| desugar.rb:26:6:26:11 | __synth__2__1 | desugar.rb:26:6:26:11 | __synth__2 | | -| desugar.rb:26:6:26:11 | call to [] | desugar.rb:26:6:26:11 | * ... | | +| desugar.rb:26:6:26:11 | __synth__2__1 | desugar.rb:26:6:26:11 | Before * ... | | +| desugar.rb:26:6:26:11 | call to [] | desugar.rb:26:6:26:11 | After call to [] | | | desugar.rb:26:7:26:7 | 0 | desugar.rb:26:7:26:7 | call to [] | | -| desugar.rb:26:7:26:7 | ... = ... | desugar.rb:26:10:26:10 | z | | +| desugar.rb:26:7:26:7 | ... = ... | desugar.rb:26:7:26:7 | After ... = ... | | +| desugar.rb:26:7:26:7 | After ... = ... | desugar.rb:26:10:26:10 | Before ... = ... | | +| desugar.rb:26:7:26:7 | After call to [] | desugar.rb:26:7:26:7 | ... = ... | | +| desugar.rb:26:7:26:7 | Before ... = ... | desugar.rb:26:7:26:7 | y | | +| desugar.rb:26:7:26:7 | Before call to [] | desugar.rb:26:7:26:7 | __synth__2__1 | | | desugar.rb:26:7:26:7 | __synth__2__1 | desugar.rb:26:7:26:7 | 0 | | -| desugar.rb:26:7:26:7 | call to [] | desugar.rb:26:7:26:7 | ... = ... | | -| desugar.rb:26:7:26:7 | y | desugar.rb:26:7:26:7 | __synth__2__1 | | +| desugar.rb:26:7:26:7 | call to [] | desugar.rb:26:7:26:7 | After call to [] | | +| desugar.rb:26:7:26:7 | y | desugar.rb:26:7:26:7 | Before call to [] | | | desugar.rb:26:10:26:10 | 1 | desugar.rb:26:10:26:10 | call to [] | | -| desugar.rb:26:10:26:10 | ... = ... | desugar.rb:26:6:26:11 | ... | | +| desugar.rb:26:10:26:10 | ... = ... | desugar.rb:26:10:26:10 | After ... = ... | | +| desugar.rb:26:10:26:10 | After ... = ... | desugar.rb:26:6:26:11 | After ... | | +| desugar.rb:26:10:26:10 | After call to [] | desugar.rb:26:10:26:10 | ... = ... | | +| desugar.rb:26:10:26:10 | Before ... = ... | desugar.rb:26:10:26:10 | z | | +| desugar.rb:26:10:26:10 | Before call to [] | desugar.rb:26:10:26:10 | __synth__2__1 | | | desugar.rb:26:10:26:10 | __synth__2__1 | desugar.rb:26:10:26:10 | 1 | | -| desugar.rb:26:10:26:10 | call to [] | desugar.rb:26:10:26:10 | ... = ... | | -| desugar.rb:26:10:26:10 | z | desugar.rb:26:10:26:10 | __synth__2__1 | | -| desugar.rb:26:15:26:25 | * ... | desugar.rb:26:15:26:25 | ... = ... | | -| desugar.rb:26:15:26:25 | ... = ... | desugar.rb:26:3:26:3 | x | | +| desugar.rb:26:10:26:10 | call to [] | desugar.rb:26:10:26:10 | After call to [] | | +| desugar.rb:26:10:26:10 | z | desugar.rb:26:10:26:10 | Before call to [] | | +| desugar.rb:26:15:26:25 | * ... | desugar.rb:26:15:26:25 | After * ... | | +| desugar.rb:26:15:26:25 | ... = ... | desugar.rb:26:15:26:25 | After ... = ... | | +| desugar.rb:26:15:26:25 | After * ... | desugar.rb:26:15:26:25 | ... = ... | | +| desugar.rb:26:15:26:25 | After ... = ... | desugar.rb:26:3:26:3 | Before ... = ... | | +| desugar.rb:26:15:26:25 | After call to [] | desugar.rb:26:15:26:25 | * ... | | | desugar.rb:26:15:26:25 | Array | desugar.rb:26:16:26:16 | 1 | | -| desugar.rb:26:15:26:25 | __synth__2 | desugar.rb:26:15:26:25 | Array | | -| desugar.rb:26:15:26:25 | call to [] | desugar.rb:26:15:26:25 | * ... | | -| desugar.rb:26:16:26:16 | 1 | desugar.rb:26:19:26:24 | Array | | +| desugar.rb:26:15:26:25 | Before * ... | desugar.rb:26:15:26:25 | Before call to [] | | +| desugar.rb:26:15:26:25 | Before ... = ... | desugar.rb:26:15:26:25 | __synth__2 | | +| desugar.rb:26:15:26:25 | Before call to [] | desugar.rb:26:15:26:25 | Array | | +| desugar.rb:26:15:26:25 | __synth__2 | desugar.rb:26:15:26:25 | Before * ... | | +| desugar.rb:26:15:26:25 | call to [] | desugar.rb:26:15:26:25 | After call to [] | | +| desugar.rb:26:16:26:16 | 1 | desugar.rb:26:19:26:24 | Before call to [] | | +| desugar.rb:26:19:26:24 | After call to [] | desugar.rb:26:15:26:25 | call to [] | | | desugar.rb:26:19:26:24 | Array | desugar.rb:26:20:26:20 | 2 | | -| desugar.rb:26:19:26:24 | call to [] | desugar.rb:26:15:26:25 | call to [] | | +| desugar.rb:26:19:26:24 | Before call to [] | desugar.rb:26:19:26:24 | Array | | +| desugar.rb:26:19:26:24 | call to [] | desugar.rb:26:19:26:24 | After call to [] | | | desugar.rb:26:20:26:20 | 2 | desugar.rb:26:23:26:23 | 3 | | | desugar.rb:26:23:26:23 | 3 | desugar.rb:26:19:26:24 | call to [] | | -| desugar.rb:29:1:35:3 | X | desugar.rb:30:3:30:4 | self | | -| desugar.rb:30:3:30:4 | @x | desugar.rb:30:8:30:8 | 1 | | +| desugar.rb:29:1:35:3 | After X | desugar.rb:37:1:37:15 | Before ... = ... | | +| desugar.rb:29:1:35:3 | X | desugar.rb:30:3:30:8 | Before ... = ... | | +| desugar.rb:30:3:30:4 | @x | desugar.rb:30:3:30:4 | After @x | | +| desugar.rb:30:3:30:4 | After @x | desugar.rb:30:8:30:8 | 1 | | +| desugar.rb:30:3:30:4 | Before @x | desugar.rb:30:3:30:4 | self | | | desugar.rb:30:3:30:4 | self | desugar.rb:30:3:30:4 | @x | | -| desugar.rb:30:3:30:8 | ... = ... | desugar.rb:31:3:31:4 | self | | +| desugar.rb:30:3:30:8 | ... = ... | desugar.rb:30:3:30:8 | After ... = ... | | +| desugar.rb:30:3:30:8 | After ... = ... | desugar.rb:31:3:31:9 | Before ... = ... | | +| desugar.rb:30:3:30:8 | Before ... = ... | desugar.rb:30:3:30:4 | Before @x | | | desugar.rb:30:8:30:8 | 1 | desugar.rb:30:3:30:8 | ... = ... | | -| desugar.rb:31:3:31:4 | @x | desugar.rb:31:3:31:4 | self | | -| desugar.rb:31:3:31:4 | @x | desugar.rb:31:9:31:9 | 2 | | +| desugar.rb:31:3:31:4 | @x | desugar.rb:31:3:31:4 | After @x | | +| desugar.rb:31:3:31:4 | @x | desugar.rb:31:3:31:4 | After @x | | +| desugar.rb:31:3:31:4 | After @x | desugar.rb:31:6:31:7 | Before ... + ... | | +| desugar.rb:31:3:31:4 | After @x | desugar.rb:31:9:31:9 | 2 | | +| desugar.rb:31:3:31:4 | Before @x | desugar.rb:31:3:31:4 | self | | +| desugar.rb:31:3:31:4 | Before @x | desugar.rb:31:3:31:4 | self | | | desugar.rb:31:3:31:4 | self | desugar.rb:31:3:31:4 | @x | | | desugar.rb:31:3:31:4 | self | desugar.rb:31:3:31:4 | @x | | -| desugar.rb:31:3:31:9 | ... = ... | desugar.rb:33:3:33:5 | @@y | | -| desugar.rb:31:6:31:7 | ... + ... | desugar.rb:31:3:31:9 | ... = ... | | +| desugar.rb:31:3:31:9 | ... = ... | desugar.rb:31:3:31:9 | After ... = ... | | +| desugar.rb:31:3:31:9 | After ... = ... | desugar.rb:33:3:33:9 | Before ... = ... | | +| desugar.rb:31:3:31:9 | Before ... = ... | desugar.rb:31:3:31:4 | Before @x | | +| desugar.rb:31:6:31:7 | ... + ... | desugar.rb:31:6:31:7 | After ... + ... | | +| desugar.rb:31:6:31:7 | After ... + ... | desugar.rb:31:3:31:9 | ... = ... | | +| desugar.rb:31:6:31:7 | Before ... + ... | desugar.rb:31:3:31:4 | Before @x | | | desugar.rb:31:9:31:9 | 2 | desugar.rb:31:6:31:7 | ... + ... | | | desugar.rb:33:3:33:5 | @@y | desugar.rb:33:9:33:9 | 3 | | -| desugar.rb:33:3:33:9 | ... = ... | desugar.rb:34:3:34:5 | @@y | | +| desugar.rb:33:3:33:9 | ... = ... | desugar.rb:33:3:33:9 | After ... = ... | | +| desugar.rb:33:3:33:9 | After ... = ... | desugar.rb:34:3:34:10 | Before ... = ... | | +| desugar.rb:33:3:33:9 | Before ... = ... | desugar.rb:33:3:33:5 | @@y | | | desugar.rb:33:9:33:9 | 3 | desugar.rb:33:3:33:9 | ... = ... | | -| desugar.rb:34:3:34:5 | @@y | desugar.rb:34:3:34:5 | @@y | | +| desugar.rb:34:3:34:5 | @@y | desugar.rb:34:7:34:8 | Before ... / ... | | | desugar.rb:34:3:34:5 | @@y | desugar.rb:34:10:34:10 | 4 | | -| desugar.rb:34:3:34:10 | ... = ... | desugar.rb:37:1:37:11 | $global_var | | -| desugar.rb:34:7:34:8 | ... / ... | desugar.rb:34:3:34:10 | ... = ... | | +| desugar.rb:34:3:34:10 | ... = ... | desugar.rb:34:3:34:10 | After ... = ... | | +| desugar.rb:34:3:34:10 | After ... = ... | desugar.rb:29:1:35:3 | After X | | +| desugar.rb:34:3:34:10 | Before ... = ... | desugar.rb:34:3:34:5 | @@y | | +| desugar.rb:34:7:34:8 | ... / ... | desugar.rb:34:7:34:8 | After ... / ... | | +| desugar.rb:34:7:34:8 | After ... / ... | desugar.rb:34:3:34:10 | ... = ... | | +| desugar.rb:34:7:34:8 | Before ... / ... | desugar.rb:34:3:34:5 | @@y | | | desugar.rb:34:10:34:10 | 4 | desugar.rb:34:7:34:8 | ... / ... | | | desugar.rb:37:1:37:11 | $global_var | desugar.rb:37:15:37:15 | 5 | | -| desugar.rb:37:1:37:15 | ... = ... | desugar.rb:38:1:38:11 | $global_var | | +| desugar.rb:37:1:37:15 | ... = ... | desugar.rb:37:1:37:15 | After ... = ... | | +| desugar.rb:37:1:37:15 | After ... = ... | desugar.rb:38:1:38:16 | Before ... = ... | | +| desugar.rb:37:1:37:15 | Before ... = ... | desugar.rb:37:1:37:11 | $global_var | | | desugar.rb:37:15:37:15 | 5 | desugar.rb:37:1:37:15 | ... = ... | | -| desugar.rb:38:1:38:11 | $global_var | desugar.rb:38:1:38:11 | $global_var | | +| desugar.rb:38:1:38:11 | $global_var | desugar.rb:38:13:38:14 | Before ... * ... | | | desugar.rb:38:1:38:11 | $global_var | desugar.rb:38:16:38:16 | 6 | | -| desugar.rb:38:1:38:16 | ... = ... | desugar.rb:1:1:38:17 | exit desugar.rb (normal) | | -| desugar.rb:38:13:38:14 | ... * ... | desugar.rb:38:1:38:16 | ... = ... | | +| desugar.rb:38:1:38:16 | ... = ... | desugar.rb:38:1:38:16 | After ... = ... | | +| desugar.rb:38:1:38:16 | After ... = ... | desugar.rb:1:1:38:17 | Normal Exit | | +| desugar.rb:38:1:38:16 | Before ... = ... | desugar.rb:38:1:38:11 | $global_var | | +| desugar.rb:38:13:38:14 | ... * ... | desugar.rb:38:13:38:14 | After ... * ... | | +| desugar.rb:38:13:38:14 | After ... * ... | desugar.rb:38:1:38:16 | ... = ... | | +| desugar.rb:38:13:38:14 | Before ... * ... | desugar.rb:38:1:38:11 | $global_var | | | desugar.rb:38:16:38:16 | 6 | desugar.rb:38:13:38:14 | ... * ... | | -| exit.rb:1:1:6:3 | enter m1 | exit.rb:1:8:1:8 | x | | -| exit.rb:1:1:6:3 | exit m1 (abnormal) | exit.rb:1:1:6:3 | exit m1 | | -| exit.rb:1:1:6:3 | exit m1 (normal) | exit.rb:1:1:6:3 | exit m1 | | +| exit.rb:1:1:6:3 | Entry | exit.rb:1:8:1:8 | x | | +| exit.rb:1:1:6:3 | Exceptional Exit | exit.rb:1:1:6:3 | Exit | | +| exit.rb:1:1:6:3 | Normal Exit | exit.rb:1:1:6:3 | Exit | | | exit.rb:1:1:6:3 | m1 | exit.rb:8:1:13:3 | m2 | | -| exit.rb:1:1:13:4 | enter exit.rb | exit.rb:1:1:6:3 | m1 | | -| exit.rb:1:1:13:4 | exit exit.rb (normal) | exit.rb:1:1:13:4 | exit exit.rb | | -| exit.rb:1:8:1:8 | x | exit.rb:2:6:2:6 | x | | -| exit.rb:2:3:4:5 | if ... | exit.rb:5:3:5:15 | self | | +| exit.rb:1:1:13:4 | Entry | exit.rb:1:1:6:3 | m1 | | +| exit.rb:1:1:13:4 | Normal Exit | exit.rb:1:1:13:4 | Exit | | +| exit.rb:1:8:1:8 | x | exit.rb:2:3:5:15 | ... | | +| exit.rb:2:3:4:5 | After if ... | exit.rb:5:3:5:15 | Before call to puts | | +| exit.rb:2:3:4:5 | if ... | exit.rb:2:6:2:10 | Before ... > ... | | +| exit.rb:2:3:5:15 | ... | exit.rb:2:3:4:5 | if ... | | +| exit.rb:2:3:5:15 | After ... | exit.rb:1:1:6:3 | Normal Exit | | | exit.rb:2:6:2:6 | x | exit.rb:2:10:2:10 | 2 | | -| exit.rb:2:6:2:10 | ... > ... | exit.rb:2:3:4:5 | if ... | false | -| exit.rb:2:6:2:10 | ... > ... | exit.rb:3:5:3:10 | self | true | +| exit.rb:2:6:2:10 | ... > ... | exit.rb:2:6:2:10 | After ... > ... [false] | false | +| exit.rb:2:6:2:10 | ... > ... | exit.rb:2:6:2:10 | After ... > ... [true] | true | +| exit.rb:2:6:2:10 | After ... > ... [false] | exit.rb:2:3:4:5 | After if ... | | +| exit.rb:2:6:2:10 | After ... > ... [true] | exit.rb:2:11:3:10 | then ... | | +| exit.rb:2:6:2:10 | Before ... > ... | exit.rb:2:6:2:6 | x | | | exit.rb:2:10:2:10 | 2 | exit.rb:2:6:2:10 | ... > ... | | -| exit.rb:3:5:3:10 | call to exit | exit.rb:1:1:6:3 | exit m1 (abnormal) | exit | +| exit.rb:2:11:3:10 | then ... | exit.rb:3:5:3:10 | Before call to exit | | +| exit.rb:3:5:3:10 | Before call to exit | exit.rb:3:5:3:10 | self | | +| exit.rb:3:5:3:10 | call to exit | exit.rb:1:1:6:3 | Exceptional Exit | exit | | exit.rb:3:5:3:10 | self | exit.rb:3:10:3:10 | 1 | | | exit.rb:3:10:3:10 | 1 | exit.rb:3:5:3:10 | call to exit | | -| exit.rb:5:3:5:15 | call to puts | exit.rb:1:1:6:3 | exit m1 (normal) | | -| exit.rb:5:3:5:15 | self | exit.rb:5:9:5:14 | x <= 2 | | -| exit.rb:5:8:5:15 | "x <= 2" | exit.rb:5:3:5:15 | call to puts | | +| exit.rb:5:3:5:15 | After call to puts | exit.rb:2:3:5:15 | After ... | | +| exit.rb:5:3:5:15 | Before call to puts | exit.rb:5:3:5:15 | self | | +| exit.rb:5:3:5:15 | call to puts | exit.rb:5:3:5:15 | After call to puts | | +| exit.rb:5:3:5:15 | self | exit.rb:5:8:5:15 | Before "x <= 2" | | +| exit.rb:5:8:5:15 | "x <= 2" | exit.rb:5:8:5:15 | After "x <= 2" | | +| exit.rb:5:8:5:15 | After "x <= 2" | exit.rb:5:3:5:15 | call to puts | | +| exit.rb:5:8:5:15 | Before "x <= 2" | exit.rb:5:9:5:14 | x <= 2 | | | exit.rb:5:9:5:14 | x <= 2 | exit.rb:5:8:5:15 | "x <= 2" | | -| exit.rb:8:1:13:3 | enter m2 | exit.rb:8:8:8:8 | x | | -| exit.rb:8:1:13:3 | exit m2 (abnormal) | exit.rb:8:1:13:3 | exit m2 | | -| exit.rb:8:1:13:3 | exit m2 (normal) | exit.rb:8:1:13:3 | exit m2 | | -| exit.rb:8:1:13:3 | m2 | exit.rb:1:1:13:4 | exit exit.rb (normal) | | -| exit.rb:8:8:8:8 | x | exit.rb:9:6:9:6 | x | | -| exit.rb:9:3:11:5 | if ... | exit.rb:12:3:12:15 | self | | +| exit.rb:8:1:13:3 | Entry | exit.rb:8:8:8:8 | x | | +| exit.rb:8:1:13:3 | Exceptional Exit | exit.rb:8:1:13:3 | Exit | | +| exit.rb:8:1:13:3 | Normal Exit | exit.rb:8:1:13:3 | Exit | | +| exit.rb:8:1:13:3 | m2 | exit.rb:1:1:13:4 | Normal Exit | | +| exit.rb:8:8:8:8 | x | exit.rb:9:3:12:15 | ... | | +| exit.rb:9:3:11:5 | After if ... | exit.rb:12:3:12:15 | Before call to puts | | +| exit.rb:9:3:11:5 | if ... | exit.rb:9:6:9:10 | Before ... > ... | | +| exit.rb:9:3:12:15 | ... | exit.rb:9:3:11:5 | if ... | | +| exit.rb:9:3:12:15 | After ... | exit.rb:8:1:13:3 | Normal Exit | | | exit.rb:9:6:9:6 | x | exit.rb:9:10:9:10 | 2 | | -| exit.rb:9:6:9:10 | ... > ... | exit.rb:9:3:11:5 | if ... | false | -| exit.rb:9:6:9:10 | ... > ... | exit.rb:10:5:10:18 | self | true | +| exit.rb:9:6:9:10 | ... > ... | exit.rb:9:6:9:10 | After ... > ... [false] | false | +| exit.rb:9:6:9:10 | ... > ... | exit.rb:9:6:9:10 | After ... > ... [true] | true | +| exit.rb:9:6:9:10 | After ... > ... [false] | exit.rb:9:3:11:5 | After if ... | | +| exit.rb:9:6:9:10 | After ... > ... [true] | exit.rb:9:11:10:18 | then ... | | +| exit.rb:9:6:9:10 | Before ... > ... | exit.rb:9:6:9:6 | x | | | exit.rb:9:10:9:10 | 2 | exit.rb:9:6:9:10 | ... > ... | | -| exit.rb:10:5:10:18 | call to abort | exit.rb:8:1:13:3 | exit m2 (abnormal) | exit | -| exit.rb:10:5:10:18 | self | exit.rb:10:12:10:17 | abort! | | -| exit.rb:10:11:10:18 | "abort!" | exit.rb:10:5:10:18 | call to abort | | +| exit.rb:9:11:10:18 | then ... | exit.rb:10:5:10:18 | Before call to abort | | +| exit.rb:10:5:10:18 | Before call to abort | exit.rb:10:5:10:18 | self | | +| exit.rb:10:5:10:18 | call to abort | exit.rb:8:1:13:3 | Exceptional Exit | exit | +| exit.rb:10:5:10:18 | self | exit.rb:10:11:10:18 | Before "abort!" | | +| exit.rb:10:11:10:18 | "abort!" | exit.rb:10:11:10:18 | After "abort!" | | +| exit.rb:10:11:10:18 | After "abort!" | exit.rb:10:5:10:18 | call to abort | | +| exit.rb:10:11:10:18 | Before "abort!" | exit.rb:10:12:10:17 | abort! | | | exit.rb:10:12:10:17 | abort! | exit.rb:10:11:10:18 | "abort!" | | -| exit.rb:12:3:12:15 | call to puts | exit.rb:8:1:13:3 | exit m2 (normal) | | -| exit.rb:12:3:12:15 | self | exit.rb:12:9:12:14 | x <= 2 | | -| exit.rb:12:8:12:15 | "x <= 2" | exit.rb:12:3:12:15 | call to puts | | +| exit.rb:12:3:12:15 | After call to puts | exit.rb:9:3:12:15 | After ... | | +| exit.rb:12:3:12:15 | Before call to puts | exit.rb:12:3:12:15 | self | | +| exit.rb:12:3:12:15 | call to puts | exit.rb:12:3:12:15 | After call to puts | | +| exit.rb:12:3:12:15 | self | exit.rb:12:8:12:15 | Before "x <= 2" | | +| exit.rb:12:8:12:15 | "x <= 2" | exit.rb:12:8:12:15 | After "x <= 2" | | +| exit.rb:12:8:12:15 | After "x <= 2" | exit.rb:12:3:12:15 | call to puts | | +| exit.rb:12:8:12:15 | Before "x <= 2" | exit.rb:12:9:12:14 | x <= 2 | | | exit.rb:12:9:12:14 | x <= 2 | exit.rb:12:8:12:15 | "x <= 2" | | -| heredoc.rb:1:1:7:3 | double_heredoc | heredoc.rb:1:1:7:4 | exit heredoc.rb (normal) | | -| heredoc.rb:1:1:7:3 | enter double_heredoc | heredoc.rb:2:3:2:16 | self | | -| heredoc.rb:1:1:7:3 | exit double_heredoc (normal) | heredoc.rb:1:1:7:3 | exit double_heredoc | | -| heredoc.rb:1:1:7:4 | enter heredoc.rb | heredoc.rb:1:1:7:3 | double_heredoc | | -| heredoc.rb:1:1:7:4 | exit heredoc.rb (normal) | heredoc.rb:1:1:7:4 | exit heredoc.rb | | -| heredoc.rb:2:3:2:16 | call to puts | heredoc.rb:1:1:7:3 | exit double_heredoc (normal) | | -| heredoc.rb:2:3:2:16 | self | heredoc.rb:2:17:3:10 | \n hello\n | | -| heredoc.rb:2:8:2:10 | < ... | | | ifs.rb:2:6:2:6 | x | ifs.rb:2:10:2:10 | 2 | | -| ifs.rb:2:6:2:10 | ... > ... | ifs.rb:3:5:3:30 | self | true | -| ifs.rb:2:6:2:10 | ... > ... | ifs.rb:4:9:4:9 | x | false | +| ifs.rb:2:6:2:10 | ... > ... | ifs.rb:2:6:2:10 | After ... > ... [false] | false | +| ifs.rb:2:6:2:10 | ... > ... | ifs.rb:2:6:2:10 | After ... > ... [true] | true | +| ifs.rb:2:6:2:10 | After ... > ... [false] | ifs.rb:4:3:7:35 | elsif ... | | +| ifs.rb:2:6:2:10 | After ... > ... [true] | ifs.rb:2:11:3:30 | then ... | | +| ifs.rb:2:6:2:10 | Before ... > ... | ifs.rb:2:6:2:6 | x | | | ifs.rb:2:10:2:10 | 2 | ifs.rb:2:6:2:10 | ... > ... | | -| ifs.rb:2:11:3:30 | then ... | ifs.rb:2:3:8:5 | if ... | | -| ifs.rb:3:5:3:30 | call to puts | ifs.rb:2:11:3:30 | then ... | | -| ifs.rb:3:5:3:30 | self | ifs.rb:3:11:3:29 | x is greater than 2 | | -| ifs.rb:3:10:3:30 | "x is greater than 2" | ifs.rb:3:5:3:30 | call to puts | | +| ifs.rb:2:11:3:30 | After then ... | ifs.rb:2:3:8:5 | After if ... | | +| ifs.rb:2:11:3:30 | then ... | ifs.rb:3:5:3:30 | Before call to puts | | +| ifs.rb:3:5:3:30 | After call to puts | ifs.rb:2:11:3:30 | After then ... | | +| ifs.rb:3:5:3:30 | Before call to puts | ifs.rb:3:5:3:30 | self | | +| ifs.rb:3:5:3:30 | call to puts | ifs.rb:3:5:3:30 | After call to puts | | +| ifs.rb:3:5:3:30 | self | ifs.rb:3:10:3:30 | Before "x is greater than 2" | | +| ifs.rb:3:10:3:30 | "x is greater than 2" | ifs.rb:3:10:3:30 | After "x is greater than 2" | | +| ifs.rb:3:10:3:30 | After "x is greater than 2" | ifs.rb:3:5:3:30 | call to puts | | +| ifs.rb:3:10:3:30 | Before "x is greater than 2" | ifs.rb:3:11:3:29 | x is greater than 2 | | | ifs.rb:3:11:3:29 | x is greater than 2 | ifs.rb:3:10:3:30 | "x is greater than 2" | | -| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:2:3:8:5 | if ... | | +| ifs.rb:4:3:7:35 | After elsif ... | ifs.rb:2:3:8:5 | After if ... | | +| ifs.rb:4:3:7:35 | elsif ... | ifs.rb:4:9:4:38 | ... and ... | | | ifs.rb:4:9:4:9 | x | ifs.rb:4:14:4:14 | 2 | | -| ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:9:4:24 | [false] ... and ... | false | -| ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:20:4:20 | x | true | -| ifs.rb:4:9:4:24 | [false] ... and ... | ifs.rb:4:9:4:38 | [false] ... and ... | false | -| ifs.rb:4:9:4:24 | [true] ... and ... | ifs.rb:4:32:4:32 | x | true | -| ifs.rb:4:9:4:38 | [false] ... and ... | ifs.rb:7:5:7:35 | self | false | -| ifs.rb:4:9:4:38 | [true] ... and ... | ifs.rb:5:5:5:17 | self | true | +| ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:9:4:14 | After ... <= ... [false] | false | +| ifs.rb:4:9:4:14 | ... <= ... | ifs.rb:4:9:4:14 | After ... <= ... [true] | true | +| ifs.rb:4:9:4:14 | After ... <= ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | false | +| ifs.rb:4:9:4:14 | After ... <= ... [true] | ifs.rb:4:20:4:24 | Before ... > ... | | +| ifs.rb:4:9:4:14 | Before ... <= ... | ifs.rb:4:9:4:9 | x | | +| ifs.rb:4:9:4:24 | ... and ... | ifs.rb:4:9:4:14 | Before ... <= ... | | +| ifs.rb:4:9:4:24 | After ... and ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | false | +| ifs.rb:4:9:4:24 | After ... and ... [true] | ifs.rb:4:30:4:38 | ! ... | | +| ifs.rb:4:9:4:38 | ... and ... | ifs.rb:4:9:4:24 | ... and ... | | +| ifs.rb:4:9:4:38 | After ... and ... [false] | ifs.rb:6:3:7:35 | else ... | | +| ifs.rb:4:9:4:38 | After ... and ... [true] | ifs.rb:4:39:5:17 | then ... | | | ifs.rb:4:14:4:14 | 2 | ifs.rb:4:9:4:14 | ... <= ... | | | ifs.rb:4:20:4:20 | x | ifs.rb:4:24:4:24 | 0 | | -| ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:9:4:24 | [false] ... and ... | false | -| ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:9:4:24 | [true] ... and ... | true | +| ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:20:4:24 | After ... > ... [false] | false | +| ifs.rb:4:20:4:24 | ... > ... | ifs.rb:4:20:4:24 | After ... > ... [true] | true | +| ifs.rb:4:20:4:24 | After ... > ... [false] | ifs.rb:4:9:4:24 | After ... and ... [false] | false | +| ifs.rb:4:20:4:24 | After ... > ... [true] | ifs.rb:4:9:4:24 | After ... and ... [true] | true | +| ifs.rb:4:20:4:24 | Before ... > ... | ifs.rb:4:20:4:20 | x | | | ifs.rb:4:24:4:24 | 0 | ifs.rb:4:20:4:24 | ... > ... | | -| ifs.rb:4:30:4:38 | [false] ! ... | ifs.rb:4:9:4:38 | [false] ... and ... | false | -| ifs.rb:4:30:4:38 | [true] ! ... | ifs.rb:4:9:4:38 | [true] ... and ... | true | -| ifs.rb:4:31:4:38 | [false] ( ... ) | ifs.rb:4:30:4:38 | [true] ! ... | false | -| ifs.rb:4:31:4:38 | [true] ( ... ) | ifs.rb:4:30:4:38 | [false] ! ... | true | +| ifs.rb:4:30:4:38 | ! ... | ifs.rb:4:31:4:38 | ( ... ) | | +| ifs.rb:4:30:4:38 | After ! ... [false] | ifs.rb:4:9:4:38 | After ... and ... [false] | false | +| ifs.rb:4:30:4:38 | After ! ... [true] | ifs.rb:4:9:4:38 | After ... and ... [true] | true | +| ifs.rb:4:31:4:38 | ( ... ) | ifs.rb:4:32:4:37 | Before ... == ... | | +| ifs.rb:4:31:4:38 | After ( ... ) [false] | ifs.rb:4:30:4:38 | After ! ... [true] | true | +| ifs.rb:4:31:4:38 | After ( ... ) [true] | ifs.rb:4:30:4:38 | After ! ... [false] | false | | ifs.rb:4:32:4:32 | x | ifs.rb:4:37:4:37 | 5 | | -| ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:31:4:38 | [false] ( ... ) | false | -| ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:31:4:38 | [true] ( ... ) | true | +| ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:32:4:37 | After ... == ... [false] | false | +| ifs.rb:4:32:4:37 | ... == ... | ifs.rb:4:32:4:37 | After ... == ... [true] | true | +| ifs.rb:4:32:4:37 | After ... == ... [false] | ifs.rb:4:31:4:38 | After ( ... ) [false] | false | +| ifs.rb:4:32:4:37 | After ... == ... [true] | ifs.rb:4:31:4:38 | After ( ... ) [true] | true | +| ifs.rb:4:32:4:37 | Before ... == ... | ifs.rb:4:32:4:32 | x | | | ifs.rb:4:37:4:37 | 5 | ifs.rb:4:32:4:37 | ... == ... | | -| ifs.rb:4:39:5:17 | then ... | ifs.rb:4:3:7:35 | elsif ... | | -| ifs.rb:5:5:5:17 | call to puts | ifs.rb:4:39:5:17 | then ... | | -| ifs.rb:5:5:5:17 | self | ifs.rb:5:11:5:16 | x is 1 | | -| ifs.rb:5:10:5:17 | "x is 1" | ifs.rb:5:5:5:17 | call to puts | | +| ifs.rb:4:39:5:17 | After then ... | ifs.rb:4:3:7:35 | After elsif ... | | +| ifs.rb:4:39:5:17 | then ... | ifs.rb:5:5:5:17 | Before call to puts | | +| ifs.rb:5:5:5:17 | After call to puts | ifs.rb:4:39:5:17 | After then ... | | +| ifs.rb:5:5:5:17 | Before call to puts | ifs.rb:5:5:5:17 | self | | +| ifs.rb:5:5:5:17 | call to puts | ifs.rb:5:5:5:17 | After call to puts | | +| ifs.rb:5:5:5:17 | self | ifs.rb:5:10:5:17 | Before "x is 1" | | +| ifs.rb:5:10:5:17 | "x is 1" | ifs.rb:5:10:5:17 | After "x is 1" | | +| ifs.rb:5:10:5:17 | After "x is 1" | ifs.rb:5:5:5:17 | call to puts | | +| ifs.rb:5:10:5:17 | Before "x is 1" | ifs.rb:5:11:5:16 | x is 1 | | | ifs.rb:5:11:5:16 | x is 1 | ifs.rb:5:10:5:17 | "x is 1" | | -| ifs.rb:6:3:7:35 | else ... | ifs.rb:4:3:7:35 | elsif ... | | -| ifs.rb:7:5:7:35 | call to puts | ifs.rb:6:3:7:35 | else ... | | -| ifs.rb:7:5:7:35 | self | ifs.rb:7:11:7:34 | I can't guess the number | | -| ifs.rb:7:10:7:35 | "I can't guess the number" | ifs.rb:7:5:7:35 | call to puts | | +| ifs.rb:6:3:7:35 | After else ... | ifs.rb:4:3:7:35 | After elsif ... | | +| ifs.rb:6:3:7:35 | else ... | ifs.rb:7:5:7:35 | Before call to puts | | +| ifs.rb:7:5:7:35 | After call to puts | ifs.rb:6:3:7:35 | After else ... | | +| ifs.rb:7:5:7:35 | Before call to puts | ifs.rb:7:5:7:35 | self | | +| ifs.rb:7:5:7:35 | call to puts | ifs.rb:7:5:7:35 | After call to puts | | +| ifs.rb:7:5:7:35 | self | ifs.rb:7:10:7:35 | Before "I can't guess the number" | | +| ifs.rb:7:10:7:35 | "I can't guess the number" | ifs.rb:7:10:7:35 | After "I can't guess the number" | | +| ifs.rb:7:10:7:35 | After "I can't guess the number" | ifs.rb:7:5:7:35 | call to puts | | +| ifs.rb:7:10:7:35 | Before "I can't guess the number" | ifs.rb:7:11:7:34 | I can't guess the number | | | ifs.rb:7:11:7:34 | I can't guess the number | ifs.rb:7:10:7:35 | "I can't guess the number" | | -| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:11:8:11:8 | b | | -| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | exit m2 | | +| ifs.rb:11:1:16:3 | Entry | ifs.rb:11:8:11:8 | b | | +| ifs.rb:11:1:16:3 | Normal Exit | ifs.rb:11:1:16:3 | Exit | | | ifs.rb:11:1:16:3 | m2 | ifs.rb:18:1:26:3 | m3 | | -| ifs.rb:11:8:11:8 | b | ifs.rb:12:6:12:6 | b | | -| ifs.rb:12:3:14:5 | if ... | ifs.rb:15:10:15:10 | 1 | | -| ifs.rb:12:6:12:6 | b | ifs.rb:12:3:14:5 | if ... | false | -| ifs.rb:12:6:12:6 | b | ifs.rb:13:12:13:12 | 0 | true | -| ifs.rb:13:5:13:12 | return | ifs.rb:11:1:16:3 | exit m2 (normal) | return | +| ifs.rb:11:8:11:8 | b | ifs.rb:12:3:15:10 | ... | | +| ifs.rb:12:3:14:5 | After if ... | ifs.rb:15:3:15:10 | Before return | | +| ifs.rb:12:3:14:5 | if ... | ifs.rb:12:6:12:6 | b | | +| ifs.rb:12:3:15:10 | ... | ifs.rb:12:3:14:5 | if ... | | +| ifs.rb:12:6:12:6 | After b [false] | ifs.rb:12:3:14:5 | After if ... | | +| ifs.rb:12:6:12:6 | After b [true] | ifs.rb:12:7:13:12 | then ... | | +| ifs.rb:12:6:12:6 | b | ifs.rb:12:6:12:6 | After b [false] | false | +| ifs.rb:12:6:12:6 | b | ifs.rb:12:6:12:6 | After b [true] | true | +| ifs.rb:12:7:13:12 | then ... | ifs.rb:13:5:13:12 | Before return | | +| ifs.rb:13:5:13:12 | Before return | ifs.rb:13:12:13:12 | 0 | | +| ifs.rb:13:5:13:12 | return | ifs.rb:11:1:16:3 | Normal Exit | return | | ifs.rb:13:12:13:12 | 0 | ifs.rb:13:5:13:12 | return | | -| ifs.rb:15:3:15:10 | return | ifs.rb:11:1:16:3 | exit m2 (normal) | return | +| ifs.rb:15:3:15:10 | Before return | ifs.rb:15:10:15:10 | 1 | | +| ifs.rb:15:3:15:10 | return | ifs.rb:11:1:16:3 | Normal Exit | return | | ifs.rb:15:10:15:10 | 1 | ifs.rb:15:3:15:10 | return | | -| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:18:8:18:8 | x | | -| ifs.rb:18:1:26:3 | exit m3 (normal) | ifs.rb:18:1:26:3 | exit m3 | | +| ifs.rb:18:1:26:3 | Entry | ifs.rb:18:8:18:8 | x | | +| ifs.rb:18:1:26:3 | Normal Exit | ifs.rb:18:1:26:3 | Exit | | | ifs.rb:18:1:26:3 | m3 | ifs.rb:28:1:30:3 | m4 | | -| ifs.rb:18:8:18:8 | x | ifs.rb:19:6:19:6 | x | | -| ifs.rb:19:3:24:5 | if ... | ifs.rb:25:3:25:8 | self | | +| ifs.rb:18:8:18:8 | x | ifs.rb:19:3:25:8 | ... | | +| ifs.rb:19:3:24:5 | After if ... | ifs.rb:25:3:25:8 | Before call to puts | | +| ifs.rb:19:3:24:5 | if ... | ifs.rb:19:6:19:10 | Before ... < ... | | +| ifs.rb:19:3:25:8 | ... | ifs.rb:19:3:24:5 | if ... | | +| ifs.rb:19:3:25:8 | After ... | ifs.rb:18:1:26:3 | Normal Exit | | | ifs.rb:19:6:19:6 | x | ifs.rb:19:10:19:10 | 0 | | -| ifs.rb:19:6:19:10 | ... < ... | ifs.rb:19:3:24:5 | if ... | false | -| ifs.rb:19:6:19:10 | ... < ... | ifs.rb:20:5:20:5 | x | true | +| ifs.rb:19:6:19:10 | ... < ... | ifs.rb:19:6:19:10 | After ... < ... [false] | false | +| ifs.rb:19:6:19:10 | ... < ... | ifs.rb:19:6:19:10 | After ... < ... [true] | true | +| ifs.rb:19:6:19:10 | After ... < ... [false] | ifs.rb:19:3:24:5 | After if ... | | +| ifs.rb:19:6:19:10 | After ... < ... [true] | ifs.rb:19:11:23:7 | then ... | | +| ifs.rb:19:6:19:10 | Before ... < ... | ifs.rb:19:6:19:6 | x | | | ifs.rb:19:10:19:10 | 0 | ifs.rb:19:6:19:10 | ... < ... | | -| ifs.rb:19:11:23:7 | then ... | ifs.rb:19:3:24:5 | if ... | | -| ifs.rb:20:5:20:5 | x | ifs.rb:20:10:20:10 | x | | -| ifs.rb:20:5:20:10 | ... = ... | ifs.rb:21:8:21:8 | x | | -| ifs.rb:20:9:20:10 | - ... | ifs.rb:20:5:20:10 | ... = ... | | +| ifs.rb:19:11:23:7 | After then ... | ifs.rb:19:3:24:5 | After if ... | | +| ifs.rb:19:11:23:7 | then ... | ifs.rb:20:5:20:10 | Before ... = ... | | +| ifs.rb:20:5:20:5 | x | ifs.rb:20:9:20:10 | Before - ... | | +| ifs.rb:20:5:20:10 | ... = ... | ifs.rb:20:5:20:10 | After ... = ... | | +| ifs.rb:20:5:20:10 | After ... = ... | ifs.rb:21:5:23:7 | if ... | | +| ifs.rb:20:5:20:10 | Before ... = ... | ifs.rb:20:5:20:5 | x | | +| ifs.rb:20:9:20:10 | - ... | ifs.rb:20:9:20:10 | After - ... | | +| ifs.rb:20:9:20:10 | After - ... | ifs.rb:20:5:20:10 | ... = ... | | +| ifs.rb:20:9:20:10 | Before - ... | ifs.rb:20:10:20:10 | x | | | ifs.rb:20:10:20:10 | x | ifs.rb:20:9:20:10 | - ... | | -| ifs.rb:21:5:23:7 | if ... | ifs.rb:19:11:23:7 | then ... | | +| ifs.rb:21:5:23:7 | After if ... | ifs.rb:19:11:23:7 | After then ... | | +| ifs.rb:21:5:23:7 | if ... | ifs.rb:21:8:21:13 | Before ... > ... | | | ifs.rb:21:8:21:8 | x | ifs.rb:21:12:21:13 | 10 | | -| ifs.rb:21:8:21:13 | ... > ... | ifs.rb:21:5:23:7 | if ... | false | -| ifs.rb:21:8:21:13 | ... > ... | ifs.rb:22:7:22:7 | x | true | +| ifs.rb:21:8:21:13 | ... > ... | ifs.rb:21:8:21:13 | After ... > ... [false] | false | +| ifs.rb:21:8:21:13 | ... > ... | ifs.rb:21:8:21:13 | After ... > ... [true] | true | +| ifs.rb:21:8:21:13 | After ... > ... [false] | ifs.rb:21:5:23:7 | After if ... | | +| ifs.rb:21:8:21:13 | After ... > ... [true] | ifs.rb:21:14:22:15 | then ... | | +| ifs.rb:21:8:21:13 | Before ... > ... | ifs.rb:21:8:21:8 | x | | | ifs.rb:21:12:21:13 | 10 | ifs.rb:21:8:21:13 | ... > ... | | -| ifs.rb:21:14:22:15 | then ... | ifs.rb:21:5:23:7 | if ... | | -| ifs.rb:22:7:22:7 | x | ifs.rb:22:11:22:11 | x | | -| ifs.rb:22:7:22:15 | ... = ... | ifs.rb:21:14:22:15 | then ... | | +| ifs.rb:21:14:22:15 | After then ... | ifs.rb:21:5:23:7 | After if ... | | +| ifs.rb:21:14:22:15 | then ... | ifs.rb:22:7:22:15 | Before ... = ... | | +| ifs.rb:22:7:22:7 | x | ifs.rb:22:11:22:15 | Before ... - ... | | +| ifs.rb:22:7:22:15 | ... = ... | ifs.rb:22:7:22:15 | After ... = ... | | +| ifs.rb:22:7:22:15 | After ... = ... | ifs.rb:21:14:22:15 | After then ... | | +| ifs.rb:22:7:22:15 | Before ... = ... | ifs.rb:22:7:22:7 | x | | | ifs.rb:22:11:22:11 | x | ifs.rb:22:15:22:15 | 1 | | -| ifs.rb:22:11:22:15 | ... - ... | ifs.rb:22:7:22:15 | ... = ... | | +| ifs.rb:22:11:22:15 | ... - ... | ifs.rb:22:11:22:15 | After ... - ... | | +| ifs.rb:22:11:22:15 | After ... - ... | ifs.rb:22:7:22:15 | ... = ... | | +| ifs.rb:22:11:22:15 | Before ... - ... | ifs.rb:22:11:22:11 | x | | | ifs.rb:22:15:22:15 | 1 | ifs.rb:22:11:22:15 | ... - ... | | -| ifs.rb:25:3:25:8 | call to puts | ifs.rb:18:1:26:3 | exit m3 (normal) | | +| ifs.rb:25:3:25:8 | After call to puts | ifs.rb:19:3:25:8 | After ... | | +| ifs.rb:25:3:25:8 | Before call to puts | ifs.rb:25:3:25:8 | self | | +| ifs.rb:25:3:25:8 | call to puts | ifs.rb:25:3:25:8 | After call to puts | | | ifs.rb:25:3:25:8 | self | ifs.rb:25:8:25:8 | x | | | ifs.rb:25:8:25:8 | x | ifs.rb:25:3:25:8 | call to puts | | -| ifs.rb:28:1:30:3 | enter m4 | ifs.rb:28:9:28:10 | b1 | | -| ifs.rb:28:1:30:3 | exit m4 (normal) | ifs.rb:28:1:30:3 | exit m4 | | +| ifs.rb:28:1:30:3 | Entry | ifs.rb:28:9:28:10 | b1 | | +| ifs.rb:28:1:30:3 | Normal Exit | ifs.rb:28:1:30:3 | Exit | | | ifs.rb:28:1:30:3 | m4 | ifs.rb:32:1:34:3 | m5 | | | ifs.rb:28:9:28:10 | b1 | ifs.rb:28:13:28:14 | b2 | | | ifs.rb:28:13:28:14 | b2 | ifs.rb:28:17:28:18 | b3 | | -| ifs.rb:28:17:28:18 | b3 | ifs.rb:29:11:29:12 | b1 | | -| ifs.rb:29:3:29:51 | return | ifs.rb:28:1:30:3 | exit m4 (normal) | return | -| ifs.rb:29:10:29:23 | [false] ( ... ) | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | false | -| ifs.rb:29:10:29:23 | [true] ( ... ) | ifs.rb:29:28:29:35 | b2 \|\| b3 | true | -| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:3:29:51 | return | | -| ifs.rb:29:11:29:12 | b1 | ifs.rb:29:16:29:17 | b2 | true | -| ifs.rb:29:11:29:12 | b1 | ifs.rb:29:21:29:22 | b3 | false | -| ifs.rb:29:11:29:22 | [false] ... ? ... : ... | ifs.rb:29:10:29:23 | [false] ( ... ) | false | -| ifs.rb:29:11:29:22 | [true] ... ? ... : ... | ifs.rb:29:10:29:23 | [true] ( ... ) | true | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | false | -| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | true | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:11:29:22 | [false] ... ? ... : ... | false | -| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:11:29:22 | [true] ... ? ... : ... | true | -| ifs.rb:29:27:29:36 | "b2 \|\| b3" | ifs.rb:29:10:29:51 | ... ? ... : ... | | +| ifs.rb:28:17:28:18 | b3 | ifs.rb:29:3:29:51 | ... | | +| ifs.rb:29:3:29:51 | ... | ifs.rb:29:3:29:51 | Before return | | +| ifs.rb:29:3:29:51 | Before return | ifs.rb:29:10:29:51 | ... ? ... : ... | | +| ifs.rb:29:3:29:51 | return | ifs.rb:28:1:30:3 | Normal Exit | return | +| ifs.rb:29:10:29:23 | ( ... ) | ifs.rb:29:11:29:22 | ... ? ... : ... | | +| ifs.rb:29:10:29:23 | After ( ... ) [false] | ifs.rb:29:40:29:51 | Before "!b2 \|\| !b3" | | +| ifs.rb:29:10:29:23 | After ( ... ) [true] | ifs.rb:29:27:29:36 | Before "b2 \|\| b3" | | +| ifs.rb:29:10:29:51 | ... ? ... : ... | ifs.rb:29:10:29:23 | ( ... ) | | +| ifs.rb:29:10:29:51 | After ... ? ... : ... | ifs.rb:29:3:29:51 | return | | +| ifs.rb:29:11:29:12 | After b1 [false] | ifs.rb:29:21:29:22 | b3 | | +| ifs.rb:29:11:29:12 | After b1 [true] | ifs.rb:29:16:29:17 | b2 | | +| ifs.rb:29:11:29:12 | b1 | ifs.rb:29:11:29:12 | After b1 [false] | false | +| ifs.rb:29:11:29:12 | b1 | ifs.rb:29:11:29:12 | After b1 [true] | true | +| ifs.rb:29:11:29:22 | ... ? ... : ... | ifs.rb:29:11:29:12 | b1 | | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | ifs.rb:29:10:29:23 | After ( ... ) [false] | false | +| ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | ifs.rb:29:10:29:23 | After ( ... ) [true] | true | +| ifs.rb:29:16:29:17 | After b2 [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | false | +| ifs.rb:29:16:29:17 | After b2 [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | true | +| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:16:29:17 | After b2 [false] | false | +| ifs.rb:29:16:29:17 | b2 | ifs.rb:29:16:29:17 | After b2 [true] | true | +| ifs.rb:29:21:29:22 | After b3 [false] | ifs.rb:29:11:29:22 | After ... ? ... : ... [false] | false | +| ifs.rb:29:21:29:22 | After b3 [true] | ifs.rb:29:11:29:22 | After ... ? ... : ... [true] | true | +| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:21:29:22 | After b3 [false] | false | +| ifs.rb:29:21:29:22 | b3 | ifs.rb:29:21:29:22 | After b3 [true] | true | +| ifs.rb:29:27:29:36 | "b2 \|\| b3" | ifs.rb:29:27:29:36 | After "b2 \|\| b3" | | +| ifs.rb:29:27:29:36 | After "b2 \|\| b3" | ifs.rb:29:10:29:51 | After ... ? ... : ... | | +| ifs.rb:29:27:29:36 | Before "b2 \|\| b3" | ifs.rb:29:28:29:35 | b2 \|\| b3 | | | ifs.rb:29:28:29:35 | b2 \|\| b3 | ifs.rb:29:27:29:36 | "b2 \|\| b3" | | -| ifs.rb:29:40:29:51 | "!b2 \|\| !b3" | ifs.rb:29:10:29:51 | ... ? ... : ... | | +| ifs.rb:29:40:29:51 | "!b2 \|\| !b3" | ifs.rb:29:40:29:51 | After "!b2 \|\| !b3" | | +| ifs.rb:29:40:29:51 | After "!b2 \|\| !b3" | ifs.rb:29:10:29:51 | After ... ? ... : ... | | +| ifs.rb:29:40:29:51 | Before "!b2 \|\| !b3" | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | | | ifs.rb:29:41:29:50 | !b2 \|\| !b3 | ifs.rb:29:40:29:51 | "!b2 \|\| !b3" | | -| ifs.rb:32:1:34:3 | enter m5 | ifs.rb:32:9:32:10 | b1 | | -| ifs.rb:32:1:34:3 | exit m5 (normal) | ifs.rb:32:1:34:3 | exit m5 | | -| ifs.rb:32:1:34:3 | m5 | ifs.rb:38:12:38:12 | 1 | | +| ifs.rb:32:1:34:3 | Entry | ifs.rb:32:9:32:10 | b1 | | +| ifs.rb:32:1:34:3 | Normal Exit | ifs.rb:32:1:34:3 | Exit | | +| ifs.rb:32:1:34:3 | m5 | ifs.rb:36:1:38:17 | ... unless ... | | | ifs.rb:32:9:32:10 | b1 | ifs.rb:32:13:32:14 | b2 | | | ifs.rb:32:13:32:14 | b2 | ifs.rb:32:17:32:18 | b3 | | | ifs.rb:32:17:32:18 | b3 | ifs.rb:32:21:32:22 | b4 | | | ifs.rb:32:21:32:22 | b4 | ifs.rb:32:25:32:26 | b5 | | -| ifs.rb:32:25:32:26 | b5 | ifs.rb:33:10:33:11 | b1 | | -| ifs.rb:33:3:33:100 | if ... | ifs.rb:32:1:34:3 | exit m5 (normal) | | -| ifs.rb:33:6:33:49 | [false] ( ... ) | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | false | -| ifs.rb:33:6:33:49 | [true] ( ... ) | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | true | -| ifs.rb:33:7:33:48 | [false] if ... | ifs.rb:33:6:33:49 | [false] ( ... ) | false | -| ifs.rb:33:7:33:48 | [true] if ... | ifs.rb:33:6:33:49 | [true] ( ... ) | true | -| ifs.rb:33:10:33:11 | b1 | ifs.rb:33:18:33:19 | b2 | true | -| ifs.rb:33:10:33:11 | b1 | ifs.rb:33:27:33:28 | b3 | false | -| ifs.rb:33:13:33:19 | [false] then ... | ifs.rb:33:7:33:48 | [false] if ... | false | -| ifs.rb:33:13:33:19 | [true] then ... | ifs.rb:33:7:33:48 | [true] if ... | true | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [false] then ... | false | -| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:13:33:19 | [true] then ... | true | -| ifs.rb:33:21:33:44 | [false] elsif ... | ifs.rb:33:7:33:48 | [false] if ... | false | -| ifs.rb:33:21:33:44 | [true] elsif ... | ifs.rb:33:7:33:48 | [true] if ... | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:35:33:36 | b4 | true | -| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:43:33:44 | b5 | false | -| ifs.rb:33:30:33:36 | [false] then ... | ifs.rb:33:21:33:44 | [false] elsif ... | false | -| ifs.rb:33:30:33:36 | [true] then ... | ifs.rb:33:21:33:44 | [true] elsif ... | true | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [false] then ... | false | -| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:30:33:36 | [true] then ... | true | -| ifs.rb:33:38:33:44 | [false] else ... | ifs.rb:33:21:33:44 | [false] elsif ... | false | -| ifs.rb:33:38:33:44 | [true] else ... | ifs.rb:33:21:33:44 | [true] elsif ... | true | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [false] else ... | false | -| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:38:33:44 | [true] else ... | true | -| ifs.rb:33:51:33:71 | then ... | ifs.rb:33:3:33:100 | if ... | | -| ifs.rb:33:56:33:71 | "b2 \|\| b4 \|\| b5" | ifs.rb:33:51:33:71 | then ... | | +| ifs.rb:32:25:32:26 | b5 | ifs.rb:33:3:33:100 | ... | | +| ifs.rb:33:3:33:100 | ... | ifs.rb:33:3:33:100 | if ... | | +| ifs.rb:33:3:33:100 | After ... | ifs.rb:32:1:34:3 | Normal Exit | | +| ifs.rb:33:3:33:100 | After if ... | ifs.rb:33:3:33:100 | After ... | | +| ifs.rb:33:3:33:100 | if ... | ifs.rb:33:6:33:49 | ( ... ) | | +| ifs.rb:33:6:33:49 | ( ... ) | ifs.rb:33:7:33:48 | if ... | | +| ifs.rb:33:6:33:49 | After ( ... ) [false] | ifs.rb:33:73:33:96 | else ... | | +| ifs.rb:33:6:33:49 | After ( ... ) [true] | ifs.rb:33:51:33:71 | then ... | | +| ifs.rb:33:7:33:48 | After if ... [false] | ifs.rb:33:6:33:49 | After ( ... ) [false] | false | +| ifs.rb:33:7:33:48 | After if ... [true] | ifs.rb:33:6:33:49 | After ( ... ) [true] | true | +| ifs.rb:33:7:33:48 | if ... | ifs.rb:33:10:33:11 | b1 | | +| ifs.rb:33:10:33:11 | After b1 [false] | ifs.rb:33:21:33:44 | elsif ... | | +| ifs.rb:33:10:33:11 | After b1 [true] | ifs.rb:33:13:33:19 | then ... | | +| ifs.rb:33:10:33:11 | b1 | ifs.rb:33:10:33:11 | After b1 [false] | false | +| ifs.rb:33:10:33:11 | b1 | ifs.rb:33:10:33:11 | After b1 [true] | true | +| ifs.rb:33:13:33:19 | After then ... [false] | ifs.rb:33:7:33:48 | After if ... [false] | false | +| ifs.rb:33:13:33:19 | After then ... [true] | ifs.rb:33:7:33:48 | After if ... [true] | true | +| ifs.rb:33:13:33:19 | then ... | ifs.rb:33:18:33:19 | b2 | | +| ifs.rb:33:18:33:19 | After b2 [false] | ifs.rb:33:13:33:19 | After then ... [false] | false | +| ifs.rb:33:18:33:19 | After b2 [true] | ifs.rb:33:13:33:19 | After then ... [true] | true | +| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:18:33:19 | After b2 [false] | false | +| ifs.rb:33:18:33:19 | b2 | ifs.rb:33:18:33:19 | After b2 [true] | true | +| ifs.rb:33:21:33:44 | After elsif ... [false] | ifs.rb:33:7:33:48 | After if ... [false] | false | +| ifs.rb:33:21:33:44 | After elsif ... [true] | ifs.rb:33:7:33:48 | After if ... [true] | true | +| ifs.rb:33:21:33:44 | elsif ... | ifs.rb:33:27:33:28 | b3 | | +| ifs.rb:33:27:33:28 | After b3 [false] | ifs.rb:33:38:33:44 | else ... | | +| ifs.rb:33:27:33:28 | After b3 [true] | ifs.rb:33:30:33:36 | then ... | | +| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:27:33:28 | After b3 [false] | false | +| ifs.rb:33:27:33:28 | b3 | ifs.rb:33:27:33:28 | After b3 [true] | true | +| ifs.rb:33:30:33:36 | After then ... [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | false | +| ifs.rb:33:30:33:36 | After then ... [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | true | +| ifs.rb:33:30:33:36 | then ... | ifs.rb:33:35:33:36 | b4 | | +| ifs.rb:33:35:33:36 | After b4 [false] | ifs.rb:33:30:33:36 | After then ... [false] | false | +| ifs.rb:33:35:33:36 | After b4 [true] | ifs.rb:33:30:33:36 | After then ... [true] | true | +| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:35:33:36 | After b4 [false] | false | +| ifs.rb:33:35:33:36 | b4 | ifs.rb:33:35:33:36 | After b4 [true] | true | +| ifs.rb:33:38:33:44 | After else ... [false] | ifs.rb:33:21:33:44 | After elsif ... [false] | false | +| ifs.rb:33:38:33:44 | After else ... [true] | ifs.rb:33:21:33:44 | After elsif ... [true] | true | +| ifs.rb:33:38:33:44 | else ... | ifs.rb:33:43:33:44 | b5 | | +| ifs.rb:33:43:33:44 | After b5 [false] | ifs.rb:33:38:33:44 | After else ... [false] | false | +| ifs.rb:33:43:33:44 | After b5 [true] | ifs.rb:33:38:33:44 | After else ... [true] | true | +| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:43:33:44 | After b5 [false] | false | +| ifs.rb:33:43:33:44 | b5 | ifs.rb:33:43:33:44 | After b5 [true] | true | +| ifs.rb:33:51:33:71 | After then ... | ifs.rb:33:3:33:100 | After if ... | | +| ifs.rb:33:51:33:71 | then ... | ifs.rb:33:56:33:71 | Before "b2 \|\| b4 \|\| b5" | | +| ifs.rb:33:56:33:71 | "b2 \|\| b4 \|\| b5" | ifs.rb:33:56:33:71 | After "b2 \|\| b4 \|\| b5" | | +| ifs.rb:33:56:33:71 | After "b2 \|\| b4 \|\| b5" | ifs.rb:33:51:33:71 | After then ... | | +| ifs.rb:33:56:33:71 | Before "b2 \|\| b4 \|\| b5" | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | | | ifs.rb:33:57:33:70 | b2 \|\| b4 \|\| b5 | ifs.rb:33:56:33:71 | "b2 \|\| b4 \|\| b5" | | -| ifs.rb:33:73:33:96 | else ... | ifs.rb:33:3:33:100 | if ... | | -| ifs.rb:33:78:33:96 | "!b2 \|\| !b4 \|\| !b5" | ifs.rb:33:73:33:96 | else ... | | +| ifs.rb:33:73:33:96 | After else ... | ifs.rb:33:3:33:100 | After if ... | | +| ifs.rb:33:73:33:96 | else ... | ifs.rb:33:78:33:96 | Before "!b2 \|\| !b4 \|\| !b5" | | +| ifs.rb:33:78:33:96 | "!b2 \|\| !b4 \|\| !b5" | ifs.rb:33:78:33:96 | After "!b2 \|\| !b4 \|\| !b5" | | +| ifs.rb:33:78:33:96 | After "!b2 \|\| !b4 \|\| !b5" | ifs.rb:33:73:33:96 | After else ... | | +| ifs.rb:33:78:33:96 | Before "!b2 \|\| !b4 \|\| !b5" | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | | | ifs.rb:33:79:33:95 | !b2 \|\| !b4 \|\| !b5 | ifs.rb:33:78:33:96 | "!b2 \|\| !b4 \|\| !b5" | | -| ifs.rb:36:1:38:3 | conditional_method_def | ifs.rb:36:1:38:17 | ... unless ... | | -| ifs.rb:36:1:38:3 | enter conditional_method_def | ifs.rb:37:3:37:12 | self | | -| ifs.rb:36:1:38:3 | exit conditional_method_def (normal) | ifs.rb:36:1:38:3 | exit conditional_method_def | | -| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:40:1:44:3 | constant_condition | | -| ifs.rb:37:3:37:12 | call to puts | ifs.rb:36:1:38:3 | exit conditional_method_def (normal) | | -| ifs.rb:37:3:37:12 | self | ifs.rb:37:9:37:11 | bla | | -| ifs.rb:37:8:37:12 | "bla" | ifs.rb:37:3:37:12 | call to puts | | +| ifs.rb:36:1:38:3 | Entry | ifs.rb:37:3:37:12 | ... | | +| ifs.rb:36:1:38:3 | Normal Exit | ifs.rb:36:1:38:3 | Exit | | +| ifs.rb:36:1:38:3 | conditional_method_def | ifs.rb:36:1:38:17 | After ... unless ... | | +| ifs.rb:36:1:38:17 | ... unless ... | ifs.rb:38:12:38:17 | Before ... == ... | | +| ifs.rb:36:1:38:17 | After ... unless ... | ifs.rb:40:1:44:3 | constant_condition | | +| ifs.rb:37:3:37:12 | ... | ifs.rb:37:3:37:12 | Before call to puts | | +| ifs.rb:37:3:37:12 | After ... | ifs.rb:36:1:38:3 | Normal Exit | | +| ifs.rb:37:3:37:12 | After call to puts | ifs.rb:37:3:37:12 | After ... | | +| ifs.rb:37:3:37:12 | Before call to puts | ifs.rb:37:3:37:12 | self | | +| ifs.rb:37:3:37:12 | call to puts | ifs.rb:37:3:37:12 | After call to puts | | +| ifs.rb:37:3:37:12 | self | ifs.rb:37:8:37:12 | Before "bla" | | +| ifs.rb:37:8:37:12 | "bla" | ifs.rb:37:8:37:12 | After "bla" | | +| ifs.rb:37:8:37:12 | After "bla" | ifs.rb:37:3:37:12 | call to puts | | +| ifs.rb:37:8:37:12 | Before "bla" | ifs.rb:37:9:37:11 | bla | | | ifs.rb:37:9:37:11 | bla | ifs.rb:37:8:37:12 | "bla" | | | ifs.rb:38:12:38:12 | 1 | ifs.rb:38:17:38:17 | 2 | | -| ifs.rb:38:12:38:17 | ... == ... | ifs.rb:36:1:38:3 | conditional_method_def | false | -| ifs.rb:38:12:38:17 | ... == ... | ifs.rb:36:1:38:17 | ... unless ... | true | +| ifs.rb:38:12:38:17 | ... == ... | ifs.rb:38:12:38:17 | After ... == ... [false] | false | +| ifs.rb:38:12:38:17 | ... == ... | ifs.rb:38:12:38:17 | After ... == ... [true] | true | +| ifs.rb:38:12:38:17 | After ... == ... [false] | ifs.rb:36:1:38:3 | conditional_method_def | | +| ifs.rb:38:12:38:17 | After ... == ... [true] | ifs.rb:36:1:38:17 | After ... unless ... | | +| ifs.rb:38:12:38:17 | Before ... == ... | ifs.rb:38:12:38:12 | 1 | | | ifs.rb:38:17:38:17 | 2 | ifs.rb:38:12:38:17 | ... == ... | | +| ifs.rb:40:1:44:3 | Entry | ifs.rb:41:3:43:5 | ... | | +| ifs.rb:40:1:44:3 | Normal Exit | ifs.rb:40:1:44:3 | Exit | | | ifs.rb:40:1:44:3 | constant_condition | ifs.rb:46:1:52:3 | empty_else | | -| ifs.rb:40:1:44:3 | enter constant_condition | ifs.rb:41:7:41:10 | true | | -| ifs.rb:40:1:44:3 | exit constant_condition (normal) | ifs.rb:40:1:44:3 | exit constant_condition | | -| ifs.rb:41:3:43:5 | if ... | ifs.rb:40:1:44:3 | exit constant_condition (normal) | | -| ifs.rb:41:6:41:10 | [false] ! ... | ifs.rb:41:3:43:5 | if ... | false | -| ifs.rb:41:7:41:10 | true | ifs.rb:41:6:41:10 | [false] ! ... | true | +| ifs.rb:41:3:43:5 | ... | ifs.rb:41:3:43:5 | if ... | | +| ifs.rb:41:3:43:5 | After ... | ifs.rb:40:1:44:3 | Normal Exit | | +| ifs.rb:41:3:43:5 | After if ... | ifs.rb:41:3:43:5 | After ... | | +| ifs.rb:41:3:43:5 | if ... | ifs.rb:41:6:41:10 | ! ... | | +| ifs.rb:41:6:41:10 | ! ... | ifs.rb:41:7:41:10 | true | | +| ifs.rb:41:6:41:10 | After ! ... [false] | ifs.rb:41:3:43:5 | After if ... | | +| ifs.rb:41:7:41:10 | After true [true] | ifs.rb:41:6:41:10 | After ! ... [false] | false | +| ifs.rb:41:7:41:10 | true | ifs.rb:41:7:41:10 | After true [true] | true | +| ifs.rb:46:1:52:3 | Entry | ifs.rb:46:16:46:16 | b | | +| ifs.rb:46:1:52:3 | Normal Exit | ifs.rb:46:1:52:3 | Exit | | | ifs.rb:46:1:52:3 | empty_else | ifs.rb:54:1:58:3 | disjunct | | -| ifs.rb:46:1:52:3 | enter empty_else | ifs.rb:46:16:46:16 | b | | -| ifs.rb:46:1:52:3 | exit empty_else (normal) | ifs.rb:46:1:52:3 | exit empty_else | | -| ifs.rb:46:16:46:16 | b | ifs.rb:47:6:47:6 | b | | -| ifs.rb:47:3:50:5 | if ... | ifs.rb:51:3:51:13 | self | | -| ifs.rb:47:6:47:6 | b | ifs.rb:48:5:48:15 | self | true | -| ifs.rb:47:6:47:6 | b | ifs.rb:49:3:49:6 | else ... | false | -| ifs.rb:47:8:48:15 | then ... | ifs.rb:47:3:50:5 | if ... | | -| ifs.rb:48:5:48:15 | call to puts | ifs.rb:47:8:48:15 | then ... | | -| ifs.rb:48:5:48:15 | self | ifs.rb:48:11:48:14 | true | | -| ifs.rb:48:10:48:15 | "true" | ifs.rb:48:5:48:15 | call to puts | | +| ifs.rb:46:16:46:16 | b | ifs.rb:47:3:51:13 | ... | | +| ifs.rb:47:3:50:5 | After if ... | ifs.rb:51:3:51:13 | Before call to puts | | +| ifs.rb:47:3:50:5 | if ... | ifs.rb:47:6:47:6 | b | | +| ifs.rb:47:3:51:13 | ... | ifs.rb:47:3:50:5 | if ... | | +| ifs.rb:47:3:51:13 | After ... | ifs.rb:46:1:52:3 | Normal Exit | | +| ifs.rb:47:6:47:6 | After b [false] | ifs.rb:49:3:49:6 | else ... | | +| ifs.rb:47:6:47:6 | After b [true] | ifs.rb:47:8:48:15 | then ... | | +| ifs.rb:47:6:47:6 | b | ifs.rb:47:6:47:6 | After b [false] | false | +| ifs.rb:47:6:47:6 | b | ifs.rb:47:6:47:6 | After b [true] | true | +| ifs.rb:47:8:48:15 | After then ... | ifs.rb:47:3:50:5 | After if ... | | +| ifs.rb:47:8:48:15 | then ... | ifs.rb:48:5:48:15 | Before call to puts | | +| ifs.rb:48:5:48:15 | After call to puts | ifs.rb:47:8:48:15 | After then ... | | +| ifs.rb:48:5:48:15 | Before call to puts | ifs.rb:48:5:48:15 | self | | +| ifs.rb:48:5:48:15 | call to puts | ifs.rb:48:5:48:15 | After call to puts | | +| ifs.rb:48:5:48:15 | self | ifs.rb:48:10:48:15 | Before "true" | | +| ifs.rb:48:10:48:15 | "true" | ifs.rb:48:10:48:15 | After "true" | | +| ifs.rb:48:10:48:15 | After "true" | ifs.rb:48:5:48:15 | call to puts | | +| ifs.rb:48:10:48:15 | Before "true" | ifs.rb:48:11:48:14 | true | | | ifs.rb:48:11:48:14 | true | ifs.rb:48:10:48:15 | "true" | | -| ifs.rb:49:3:49:6 | else ... | ifs.rb:47:3:50:5 | if ... | | -| ifs.rb:51:3:51:13 | call to puts | ifs.rb:46:1:52:3 | exit empty_else (normal) | | -| ifs.rb:51:3:51:13 | self | ifs.rb:51:9:51:12 | done | | -| ifs.rb:51:8:51:13 | "done" | ifs.rb:51:3:51:13 | call to puts | | +| ifs.rb:49:3:49:6 | else ... | ifs.rb:47:3:50:5 | After if ... | | +| ifs.rb:51:3:51:13 | After call to puts | ifs.rb:47:3:51:13 | After ... | | +| ifs.rb:51:3:51:13 | Before call to puts | ifs.rb:51:3:51:13 | self | | +| ifs.rb:51:3:51:13 | call to puts | ifs.rb:51:3:51:13 | After call to puts | | +| ifs.rb:51:3:51:13 | self | ifs.rb:51:8:51:13 | Before "done" | | +| ifs.rb:51:8:51:13 | "done" | ifs.rb:51:8:51:13 | After "done" | | +| ifs.rb:51:8:51:13 | After "done" | ifs.rb:51:3:51:13 | call to puts | | +| ifs.rb:51:8:51:13 | Before "done" | ifs.rb:51:9:51:12 | done | | | ifs.rb:51:9:51:12 | done | ifs.rb:51:8:51:13 | "done" | | -| ifs.rb:54:1:58:3 | disjunct | ifs.rb:1:1:58:4 | exit ifs.rb (normal) | | -| ifs.rb:54:1:58:3 | enter disjunct | ifs.rb:54:15:54:16 | b1 | | -| ifs.rb:54:1:58:3 | exit disjunct (normal) | ifs.rb:54:1:58:3 | exit disjunct | | +| ifs.rb:54:1:58:3 | Entry | ifs.rb:54:15:54:16 | b1 | | +| ifs.rb:54:1:58:3 | Normal Exit | ifs.rb:54:1:58:3 | Exit | | +| ifs.rb:54:1:58:3 | disjunct | ifs.rb:1:1:58:4 | Normal Exit | | | ifs.rb:54:15:54:16 | b1 | ifs.rb:54:19:54:20 | b2 | | -| ifs.rb:54:19:54:20 | b2 | ifs.rb:55:7:55:8 | b1 | | -| ifs.rb:55:3:57:5 | if ... | ifs.rb:54:1:58:3 | exit disjunct (normal) | | -| ifs.rb:55:6:55:15 | [false] ( ... ) | ifs.rb:55:3:57:5 | if ... | false | -| ifs.rb:55:6:55:15 | [true] ( ... ) | ifs.rb:56:5:56:19 | self | true | -| ifs.rb:55:7:55:8 | b1 | ifs.rb:55:7:55:14 | [true] ... \|\| ... | true | -| ifs.rb:55:7:55:8 | b1 | ifs.rb:55:13:55:14 | b2 | false | -| ifs.rb:55:7:55:14 | [false] ... \|\| ... | ifs.rb:55:6:55:15 | [false] ( ... ) | false | -| ifs.rb:55:7:55:14 | [true] ... \|\| ... | ifs.rb:55:6:55:15 | [true] ( ... ) | true | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [false] ... \|\| ... | false | -| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:7:55:14 | [true] ... \|\| ... | true | -| ifs.rb:55:17:56:19 | then ... | ifs.rb:55:3:57:5 | if ... | | -| ifs.rb:56:5:56:19 | call to puts | ifs.rb:55:17:56:19 | then ... | | -| ifs.rb:56:5:56:19 | self | ifs.rb:56:11:56:18 | b1 or b2 | | -| ifs.rb:56:10:56:19 | "b1 or b2" | ifs.rb:56:5:56:19 | call to puts | | +| ifs.rb:54:19:54:20 | b2 | ifs.rb:55:3:57:5 | ... | | +| ifs.rb:55:3:57:5 | ... | ifs.rb:55:3:57:5 | if ... | | +| ifs.rb:55:3:57:5 | After ... | ifs.rb:54:1:58:3 | Normal Exit | | +| ifs.rb:55:3:57:5 | After if ... | ifs.rb:55:3:57:5 | After ... | | +| ifs.rb:55:3:57:5 | if ... | ifs.rb:55:6:55:15 | ( ... ) | | +| ifs.rb:55:6:55:15 | ( ... ) | ifs.rb:55:7:55:14 | ... \|\| ... | | +| ifs.rb:55:6:55:15 | After ( ... ) [false] | ifs.rb:55:3:57:5 | After if ... | | +| ifs.rb:55:6:55:15 | After ( ... ) [true] | ifs.rb:55:17:56:19 | then ... | | +| ifs.rb:55:7:55:8 | After b1 [false] | ifs.rb:55:13:55:14 | b2 | | +| ifs.rb:55:7:55:8 | After b1 [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | true | +| ifs.rb:55:7:55:8 | b1 | ifs.rb:55:7:55:8 | After b1 [false] | false | +| ifs.rb:55:7:55:8 | b1 | ifs.rb:55:7:55:8 | After b1 [true] | true | +| ifs.rb:55:7:55:14 | ... \|\| ... | ifs.rb:55:7:55:8 | b1 | | +| ifs.rb:55:7:55:14 | After ... \|\| ... [false] | ifs.rb:55:6:55:15 | After ( ... ) [false] | false | +| ifs.rb:55:7:55:14 | After ... \|\| ... [true] | ifs.rb:55:6:55:15 | After ( ... ) [true] | true | +| ifs.rb:55:13:55:14 | After b2 [false] | ifs.rb:55:7:55:14 | After ... \|\| ... [false] | false | +| ifs.rb:55:13:55:14 | After b2 [true] | ifs.rb:55:7:55:14 | After ... \|\| ... [true] | true | +| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:13:55:14 | After b2 [false] | false | +| ifs.rb:55:13:55:14 | b2 | ifs.rb:55:13:55:14 | After b2 [true] | true | +| ifs.rb:55:17:56:19 | After then ... | ifs.rb:55:3:57:5 | After if ... | | +| ifs.rb:55:17:56:19 | then ... | ifs.rb:56:5:56:19 | Before call to puts | | +| ifs.rb:56:5:56:19 | After call to puts | ifs.rb:55:17:56:19 | After then ... | | +| ifs.rb:56:5:56:19 | Before call to puts | ifs.rb:56:5:56:19 | self | | +| ifs.rb:56:5:56:19 | call to puts | ifs.rb:56:5:56:19 | After call to puts | | +| ifs.rb:56:5:56:19 | self | ifs.rb:56:10:56:19 | Before "b1 or b2" | | +| ifs.rb:56:10:56:19 | "b1 or b2" | ifs.rb:56:10:56:19 | After "b1 or b2" | | +| ifs.rb:56:10:56:19 | After "b1 or b2" | ifs.rb:56:5:56:19 | call to puts | | +| ifs.rb:56:10:56:19 | Before "b1 or b2" | ifs.rb:56:11:56:18 | b1 or b2 | | | ifs.rb:56:11:56:18 | b1 or b2 | ifs.rb:56:10:56:19 | "b1 or b2" | | -| loops.rb:1:1:6:3 | enter m1 | loops.rb:1:8:1:8 | x | | -| loops.rb:1:1:6:3 | exit m1 (normal) | loops.rb:1:1:6:3 | exit m1 | | +| loops.rb:1:1:6:3 | Entry | loops.rb:1:8:1:8 | x | | +| loops.rb:1:1:6:3 | Normal Exit | loops.rb:1:1:6:3 | Exit | | | loops.rb:1:1:6:3 | m1 | loops.rb:8:1:22:3 | m2 | | -| loops.rb:1:1:33:4 | enter loops.rb | loops.rb:1:1:6:3 | m1 | | -| loops.rb:1:1:33:4 | exit loops.rb (normal) | loops.rb:1:1:33:4 | exit loops.rb | | -| loops.rb:1:8:1:8 | x | loops.rb:2:9:2:9 | x | | -| loops.rb:2:3:5:5 | while ... | loops.rb:1:1:6:3 | exit m1 (normal) | | +| loops.rb:1:1:33:4 | Entry | loops.rb:1:1:6:3 | m1 | | +| loops.rb:1:1:33:4 | Normal Exit | loops.rb:1:1:33:4 | Exit | | +| loops.rb:1:8:1:8 | x | loops.rb:2:3:5:5 | ... | | +| loops.rb:2:3:5:5 | ... | loops.rb:2:3:5:5 | while ... | | +| loops.rb:2:3:5:5 | After ... | loops.rb:1:1:6:3 | Normal Exit | | +| loops.rb:2:3:5:5 | After while ... | loops.rb:2:3:5:5 | After ... | | +| loops.rb:2:3:5:5 | [LoopHeader] while ... | loops.rb:2:9:2:14 | Before ... >= ... | | +| loops.rb:2:3:5:5 | while ... | loops.rb:2:3:5:5 | [LoopHeader] while ... | | | loops.rb:2:9:2:9 | x | loops.rb:2:14:2:14 | 0 | | -| loops.rb:2:9:2:14 | ... >= ... | loops.rb:2:3:5:5 | while ... | false | -| loops.rb:2:9:2:14 | ... >= ... | loops.rb:3:5:3:10 | self | true | +| loops.rb:2:9:2:14 | ... >= ... | loops.rb:2:9:2:14 | After ... >= ... [false] | false | +| loops.rb:2:9:2:14 | ... >= ... | loops.rb:2:9:2:14 | After ... >= ... [true] | true | +| loops.rb:2:9:2:14 | After ... >= ... [false] | loops.rb:2:3:5:5 | After while ... | | +| loops.rb:2:9:2:14 | After ... >= ... [true] | loops.rb:2:15:5:5 | do ... | | +| loops.rb:2:9:2:14 | Before ... >= ... | loops.rb:2:9:2:9 | x | | | loops.rb:2:14:2:14 | 0 | loops.rb:2:9:2:14 | ... >= ... | | -| loops.rb:2:15:5:5 | do ... | loops.rb:2:9:2:9 | x | | -| loops.rb:3:5:3:10 | call to puts | loops.rb:4:5:4:5 | x | | +| loops.rb:2:15:5:5 | After do ... | loops.rb:2:3:5:5 | [LoopHeader] while ... | | +| loops.rb:2:15:5:5 | do ... | loops.rb:3:5:3:10 | Before call to puts | | +| loops.rb:3:5:3:10 | After call to puts | loops.rb:4:5:4:10 | Before ... = ... | | +| loops.rb:3:5:3:10 | Before call to puts | loops.rb:3:5:3:10 | self | | +| loops.rb:3:5:3:10 | call to puts | loops.rb:3:5:3:10 | After call to puts | | | loops.rb:3:5:3:10 | self | loops.rb:3:10:3:10 | x | | | loops.rb:3:10:3:10 | x | loops.rb:3:5:3:10 | call to puts | | -| loops.rb:4:5:4:5 | x | loops.rb:4:5:4:5 | x | | +| loops.rb:4:5:4:5 | x | loops.rb:4:7:4:8 | Before ... - ... | | | loops.rb:4:5:4:5 | x | loops.rb:4:10:4:10 | 1 | | -| loops.rb:4:5:4:10 | ... = ... | loops.rb:2:15:5:5 | do ... | | -| loops.rb:4:7:4:8 | ... - ... | loops.rb:4:5:4:10 | ... = ... | | +| loops.rb:4:5:4:10 | ... = ... | loops.rb:4:5:4:10 | After ... = ... | | +| loops.rb:4:5:4:10 | After ... = ... | loops.rb:2:15:5:5 | After do ... | | +| loops.rb:4:5:4:10 | Before ... = ... | loops.rb:4:5:4:5 | x | | +| loops.rb:4:7:4:8 | ... - ... | loops.rb:4:7:4:8 | After ... - ... | | +| loops.rb:4:7:4:8 | After ... - ... | loops.rb:4:5:4:10 | ... = ... | | +| loops.rb:4:7:4:8 | Before ... - ... | loops.rb:4:5:4:5 | x | | | loops.rb:4:10:4:10 | 1 | loops.rb:4:7:4:8 | ... - ... | | -| loops.rb:8:1:22:3 | enter m2 | loops.rb:8:8:8:8 | x | | -| loops.rb:8:1:22:3 | exit m2 (normal) | loops.rb:8:1:22:3 | exit m2 | | +| loops.rb:8:1:22:3 | Entry | loops.rb:8:8:8:8 | x | | +| loops.rb:8:1:22:3 | Normal Exit | loops.rb:8:1:22:3 | Exit | | | loops.rb:8:1:22:3 | m2 | loops.rb:24:1:28:3 | m3 | | -| loops.rb:8:8:8:8 | x | loops.rb:9:9:9:9 | x | | -| loops.rb:9:3:20:5 | while ... | loops.rb:21:3:21:13 | self | | +| loops.rb:8:8:8:8 | x | loops.rb:9:3:21:13 | ... | | +| loops.rb:9:3:20:5 | After while ... | loops.rb:21:3:21:13 | Before call to puts | | +| loops.rb:9:3:20:5 | [LoopHeader] while ... | loops.rb:9:9:9:14 | Before ... >= ... | | +| loops.rb:9:3:20:5 | while ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | | +| loops.rb:9:3:21:13 | ... | loops.rb:9:3:20:5 | while ... | | +| loops.rb:9:3:21:13 | After ... | loops.rb:8:1:22:3 | Normal Exit | | | loops.rb:9:9:9:9 | x | loops.rb:9:14:9:14 | 0 | | -| loops.rb:9:9:9:14 | ... >= ... | loops.rb:9:3:20:5 | while ... | false | -| loops.rb:9:9:9:14 | ... >= ... | loops.rb:10:5:10:10 | self | true | +| loops.rb:9:9:9:14 | ... >= ... | loops.rb:9:9:9:14 | After ... >= ... [false] | false | +| loops.rb:9:9:9:14 | ... >= ... | loops.rb:9:9:9:14 | After ... >= ... [true] | true | +| loops.rb:9:9:9:14 | After ... >= ... [false] | loops.rb:9:3:20:5 | After while ... | | +| loops.rb:9:9:9:14 | After ... >= ... [true] | loops.rb:9:15:20:5 | do ... | | +| loops.rb:9:9:9:14 | Before ... >= ... | loops.rb:9:9:9:9 | x | | | loops.rb:9:14:9:14 | 0 | loops.rb:9:9:9:14 | ... >= ... | | -| loops.rb:9:15:20:5 | do ... | loops.rb:9:9:9:9 | x | | -| loops.rb:10:5:10:10 | call to puts | loops.rb:11:5:11:5 | x | | +| loops.rb:9:15:20:5 | After do ... | loops.rb:9:3:20:5 | [LoopHeader] while ... | | +| loops.rb:9:15:20:5 | do ... | loops.rb:10:5:10:10 | Before call to puts | | +| loops.rb:10:5:10:10 | After call to puts | loops.rb:11:5:11:10 | Before ... = ... | | +| loops.rb:10:5:10:10 | Before call to puts | loops.rb:10:5:10:10 | self | | +| loops.rb:10:5:10:10 | call to puts | loops.rb:10:5:10:10 | After call to puts | | | loops.rb:10:5:10:10 | self | loops.rb:10:10:10:10 | x | | | loops.rb:10:10:10:10 | x | loops.rb:10:5:10:10 | call to puts | | -| loops.rb:11:5:11:5 | x | loops.rb:11:5:11:5 | x | | +| loops.rb:11:5:11:5 | x | loops.rb:11:7:11:8 | Before ... - ... | | | loops.rb:11:5:11:5 | x | loops.rb:11:10:11:10 | 1 | | -| loops.rb:11:5:11:10 | ... = ... | loops.rb:12:8:12:8 | x | | -| loops.rb:11:7:11:8 | ... - ... | loops.rb:11:5:11:10 | ... = ... | | +| loops.rb:11:5:11:10 | ... = ... | loops.rb:11:5:11:10 | After ... = ... | | +| loops.rb:11:5:11:10 | After ... = ... | loops.rb:12:5:18:7 | if ... | | +| loops.rb:11:5:11:10 | Before ... = ... | loops.rb:11:5:11:5 | x | | +| loops.rb:11:7:11:8 | ... - ... | loops.rb:11:7:11:8 | After ... - ... | | +| loops.rb:11:7:11:8 | After ... - ... | loops.rb:11:5:11:10 | ... = ... | | +| loops.rb:11:7:11:8 | Before ... - ... | loops.rb:11:5:11:5 | x | | | loops.rb:11:10:11:10 | 1 | loops.rb:11:7:11:8 | ... - ... | | -| loops.rb:12:5:18:7 | if ... | loops.rb:19:5:19:15 | self | | +| loops.rb:12:5:18:7 | After if ... | loops.rb:19:5:19:15 | Before call to puts | | +| loops.rb:12:5:18:7 | if ... | loops.rb:12:8:12:14 | Before ... > ... | | | loops.rb:12:8:12:8 | x | loops.rb:12:12:12:14 | 100 | | -| loops.rb:12:8:12:14 | ... > ... | loops.rb:13:7:13:11 | break | true | -| loops.rb:12:8:12:14 | ... > ... | loops.rb:14:11:14:11 | x | false | +| loops.rb:12:8:12:14 | ... > ... | loops.rb:12:8:12:14 | After ... > ... [false] | false | +| loops.rb:12:8:12:14 | ... > ... | loops.rb:12:8:12:14 | After ... > ... [true] | true | +| loops.rb:12:8:12:14 | After ... > ... [false] | loops.rb:14:5:17:10 | elsif ... | | +| loops.rb:12:8:12:14 | After ... > ... [true] | loops.rb:12:15:13:11 | then ... | | +| loops.rb:12:8:12:14 | Before ... > ... | loops.rb:12:8:12:8 | x | | | loops.rb:12:12:12:14 | 100 | loops.rb:12:8:12:14 | ... > ... | | -| loops.rb:13:7:13:11 | break | loops.rb:9:3:20:5 | while ... | break | -| loops.rb:14:5:17:10 | elsif ... | loops.rb:12:5:18:7 | if ... | | +| loops.rb:12:15:13:11 | then ... | loops.rb:13:7:13:11 | Before break | | +| loops.rb:13:7:13:11 | Before break | loops.rb:13:7:13:11 | break | | +| loops.rb:13:7:13:11 | break | loops.rb:9:3:20:5 | After while ... | break | +| loops.rb:14:5:17:10 | After elsif ... | loops.rb:12:5:18:7 | After if ... | | +| loops.rb:14:5:17:10 | elsif ... | loops.rb:14:11:14:16 | Before ... > ... | | | loops.rb:14:11:14:11 | x | loops.rb:14:15:14:16 | 50 | | -| loops.rb:14:11:14:16 | ... > ... | loops.rb:15:7:15:10 | next | true | -| loops.rb:14:11:14:16 | ... > ... | loops.rb:16:11:16:11 | x | false | +| loops.rb:14:11:14:16 | ... > ... | loops.rb:14:11:14:16 | After ... > ... [false] | false | +| loops.rb:14:11:14:16 | ... > ... | loops.rb:14:11:14:16 | After ... > ... [true] | true | +| loops.rb:14:11:14:16 | After ... > ... [false] | loops.rb:16:5:17:10 | elsif ... | | +| loops.rb:14:11:14:16 | After ... > ... [true] | loops.rb:14:17:15:10 | then ... | | +| loops.rb:14:11:14:16 | Before ... > ... | loops.rb:14:11:14:11 | x | | | loops.rb:14:15:14:16 | 50 | loops.rb:14:11:14:16 | ... > ... | | -| loops.rb:15:7:15:10 | next | loops.rb:9:9:9:9 | x | continue | -| loops.rb:16:5:17:10 | elsif ... | loops.rb:14:5:17:10 | elsif ... | | +| loops.rb:14:17:15:10 | then ... | loops.rb:15:7:15:10 | Before next | | +| loops.rb:15:7:15:10 | Before next | loops.rb:15:7:15:10 | next | | +| loops.rb:15:7:15:10 | next | loops.rb:9:3:20:5 | [LoopHeader] while ... | continue | +| loops.rb:16:5:17:10 | After elsif ... | loops.rb:14:5:17:10 | After elsif ... | | +| loops.rb:16:5:17:10 | elsif ... | loops.rb:16:11:16:16 | Before ... > ... | | | loops.rb:16:11:16:11 | x | loops.rb:16:15:16:16 | 10 | | -| loops.rb:16:11:16:16 | ... > ... | loops.rb:16:5:17:10 | elsif ... | false | -| loops.rb:16:11:16:16 | ... > ... | loops.rb:17:7:17:10 | redo | true | +| loops.rb:16:11:16:16 | ... > ... | loops.rb:16:11:16:16 | After ... > ... [false] | false | +| loops.rb:16:11:16:16 | ... > ... | loops.rb:16:11:16:16 | After ... > ... [true] | true | +| loops.rb:16:11:16:16 | After ... > ... [false] | loops.rb:16:5:17:10 | After elsif ... | | +| loops.rb:16:11:16:16 | After ... > ... [true] | loops.rb:16:17:17:10 | then ... | | +| loops.rb:16:11:16:16 | Before ... > ... | loops.rb:16:11:16:11 | x | | | loops.rb:16:15:16:16 | 10 | loops.rb:16:11:16:16 | ... > ... | | -| loops.rb:17:7:17:10 | redo | loops.rb:10:5:10:10 | self | redo | -| loops.rb:19:5:19:15 | call to puts | loops.rb:9:15:20:5 | do ... | | -| loops.rb:19:5:19:15 | self | loops.rb:19:11:19:14 | Iter | | -| loops.rb:19:10:19:15 | "Iter" | loops.rb:19:5:19:15 | call to puts | | +| loops.rb:16:17:17:10 | then ... | loops.rb:17:7:17:10 | Before redo | | +| loops.rb:17:7:17:10 | Before redo | loops.rb:17:7:17:10 | redo | | +| loops.rb:17:7:17:10 | redo | loops.rb:9:15:20:5 | do ... | redo | +| loops.rb:19:5:19:15 | After call to puts | loops.rb:9:15:20:5 | After do ... | | +| loops.rb:19:5:19:15 | Before call to puts | loops.rb:19:5:19:15 | self | | +| loops.rb:19:5:19:15 | call to puts | loops.rb:19:5:19:15 | After call to puts | | +| loops.rb:19:5:19:15 | self | loops.rb:19:10:19:15 | Before "Iter" | | +| loops.rb:19:10:19:15 | "Iter" | loops.rb:19:10:19:15 | After "Iter" | | +| loops.rb:19:10:19:15 | After "Iter" | loops.rb:19:5:19:15 | call to puts | | +| loops.rb:19:10:19:15 | Before "Iter" | loops.rb:19:11:19:14 | Iter | | | loops.rb:19:11:19:14 | Iter | loops.rb:19:10:19:15 | "Iter" | | -| loops.rb:21:3:21:13 | call to puts | loops.rb:8:1:22:3 | exit m2 (normal) | | -| loops.rb:21:3:21:13 | self | loops.rb:21:9:21:12 | Done | | -| loops.rb:21:8:21:13 | "Done" | loops.rb:21:3:21:13 | call to puts | | +| loops.rb:21:3:21:13 | After call to puts | loops.rb:9:3:21:13 | After ... | | +| loops.rb:21:3:21:13 | Before call to puts | loops.rb:21:3:21:13 | self | | +| loops.rb:21:3:21:13 | call to puts | loops.rb:21:3:21:13 | After call to puts | | +| loops.rb:21:3:21:13 | self | loops.rb:21:8:21:13 | Before "Done" | | +| loops.rb:21:8:21:13 | "Done" | loops.rb:21:8:21:13 | After "Done" | | +| loops.rb:21:8:21:13 | After "Done" | loops.rb:21:3:21:13 | call to puts | | +| loops.rb:21:8:21:13 | Before "Done" | loops.rb:21:9:21:12 | Done | | | loops.rb:21:9:21:12 | Done | loops.rb:21:8:21:13 | "Done" | | -| loops.rb:24:1:28:3 | enter m3 | loops.rb:25:3:25:9 | Array | | -| loops.rb:24:1:28:3 | exit m3 (normal) | loops.rb:24:1:28:3 | exit m3 | | +| loops.rb:24:1:28:3 | Entry | loops.rb:25:3:27:5 | ... | | +| loops.rb:24:1:28:3 | Normal Exit | loops.rb:24:1:28:3 | Exit | | | loops.rb:24:1:28:3 | m3 | loops.rb:30:1:33:3 | m4 | | +| loops.rb:25:3:25:9 | After call to [] | loops.rb:25:16:27:5 | do ... end | | | loops.rb:25:3:25:9 | Array | loops.rb:25:4:25:4 | 1 | | -| loops.rb:25:3:25:9 | call to [] | loops.rb:25:16:27:5 | do ... end | | -| loops.rb:25:3:27:5 | call to each | loops.rb:24:1:28:3 | exit m3 (normal) | | +| loops.rb:25:3:25:9 | Before call to [] | loops.rb:25:3:25:9 | Array | | +| loops.rb:25:3:25:9 | call to [] | loops.rb:25:3:25:9 | After call to [] | | +| loops.rb:25:3:27:5 | ... | loops.rb:25:3:27:5 | Before call to each | | +| loops.rb:25:3:27:5 | After ... | loops.rb:24:1:28:3 | Normal Exit | | +| loops.rb:25:3:27:5 | After call to each | loops.rb:25:3:27:5 | After ... | | +| loops.rb:25:3:27:5 | Before call to each | loops.rb:25:3:25:9 | Before call to [] | | +| loops.rb:25:3:27:5 | call to each | loops.rb:25:3:27:5 | After call to each | | | loops.rb:25:4:25:4 | 1 | loops.rb:25:6:25:6 | 2 | | | loops.rb:25:6:25:6 | 2 | loops.rb:25:8:25:8 | 3 | | | loops.rb:25:8:25:8 | 3 | loops.rb:25:3:25:9 | call to [] | | +| loops.rb:25:16:27:5 | Entry | loops.rb:25:20:25:20 | x | | +| loops.rb:25:16:27:5 | Normal Exit | loops.rb:25:16:27:5 | Exit | | | loops.rb:25:16:27:5 | do ... end | loops.rb:25:3:27:5 | call to each | | -| loops.rb:25:16:27:5 | enter do ... end | loops.rb:25:20:25:20 | x | | -| loops.rb:25:16:27:5 | exit do ... end (normal) | loops.rb:25:16:27:5 | exit do ... end | | -| loops.rb:25:20:25:20 | x | loops.rb:26:5:26:10 | self | | -| loops.rb:26:5:26:10 | call to puts | loops.rb:25:16:27:5 | exit do ... end (normal) | | +| loops.rb:25:20:25:20 | x | loops.rb:26:5:26:10 | ... | | +| loops.rb:26:5:26:10 | ... | loops.rb:26:5:26:10 | Before call to puts | | +| loops.rb:26:5:26:10 | After ... | loops.rb:25:16:27:5 | Normal Exit | | +| loops.rb:26:5:26:10 | After call to puts | loops.rb:26:5:26:10 | After ... | | +| loops.rb:26:5:26:10 | Before call to puts | loops.rb:26:5:26:10 | self | | +| loops.rb:26:5:26:10 | call to puts | loops.rb:26:5:26:10 | After call to puts | | | loops.rb:26:5:26:10 | self | loops.rb:26:10:26:10 | x | | | loops.rb:26:10:26:10 | x | loops.rb:26:5:26:10 | call to puts | | -| loops.rb:30:1:33:3 | enter m4 | loops.rb:30:8:30:8 | x | | -| loops.rb:30:1:33:3 | exit m4 (normal) | loops.rb:30:1:33:3 | exit m4 | | -| loops.rb:30:1:33:3 | m4 | loops.rb:1:1:33:4 | exit loops.rb (normal) | | +| loops.rb:30:1:33:3 | Entry | loops.rb:30:8:30:8 | x | | +| loops.rb:30:1:33:3 | Normal Exit | loops.rb:30:1:33:3 | Exit | | +| loops.rb:30:1:33:3 | m4 | loops.rb:1:1:33:4 | Normal Exit | | | loops.rb:30:8:30:8 | x | loops.rb:30:11:30:11 | y | | -| loops.rb:30:11:30:11 | y | loops.rb:31:9:31:9 | x | | -| loops.rb:31:3:32:5 | while ... | loops.rb:30:1:33:3 | exit m4 (normal) | | +| loops.rb:30:11:30:11 | y | loops.rb:31:3:32:5 | ... | | +| loops.rb:31:3:32:5 | ... | loops.rb:31:3:32:5 | while ... | | +| loops.rb:31:3:32:5 | After ... | loops.rb:30:1:33:3 | Normal Exit | | +| loops.rb:31:3:32:5 | After while ... | loops.rb:31:3:32:5 | After ... | | +| loops.rb:31:3:32:5 | [LoopHeader] while ... | loops.rb:31:9:31:13 | Before ... < ... | | +| loops.rb:31:3:32:5 | while ... | loops.rb:31:3:32:5 | [LoopHeader] while ... | | | loops.rb:31:9:31:9 | x | loops.rb:31:13:31:13 | y | | -| loops.rb:31:9:31:13 | ... < ... | loops.rb:31:3:32:5 | while ... | false | -| loops.rb:31:9:31:13 | ... < ... | loops.rb:31:15:32:5 | do ... | true | +| loops.rb:31:9:31:13 | ... < ... | loops.rb:31:9:31:13 | After ... < ... [false] | false | +| loops.rb:31:9:31:13 | ... < ... | loops.rb:31:9:31:13 | After ... < ... [true] | true | +| loops.rb:31:9:31:13 | After ... < ... [false] | loops.rb:31:3:32:5 | After while ... | | +| loops.rb:31:9:31:13 | After ... < ... [true] | loops.rb:31:15:32:5 | do ... | | +| loops.rb:31:9:31:13 | Before ... < ... | loops.rb:31:9:31:9 | x | | | loops.rb:31:13:31:13 | y | loops.rb:31:9:31:13 | ... < ... | | -| loops.rb:31:15:32:5 | do ... | loops.rb:31:9:31:9 | x | | +| loops.rb:31:15:32:5 | do ... | loops.rb:31:3:32:5 | [LoopHeader] while ... | | +| raise.rb:1:1:2:3 | After ExceptionA | raise.rb:4:1:5:3 | ExceptionB | | | raise.rb:1:1:2:3 | ExceptionA | raise.rb:1:20:1:28 | Exception | | -| raise.rb:1:1:182:4 | enter raise.rb | raise.rb:1:1:2:3 | ExceptionA | | -| raise.rb:1:1:182:4 | exit raise.rb (normal) | raise.rb:1:1:182:4 | exit raise.rb | | -| raise.rb:1:20:1:28 | Exception | raise.rb:4:1:5:3 | ExceptionB | | +| raise.rb:1:1:182:4 | Entry | raise.rb:1:1:2:3 | ExceptionA | | +| raise.rb:1:1:182:4 | Normal Exit | raise.rb:1:1:182:4 | Exit | | +| raise.rb:1:20:1:28 | Exception | raise.rb:1:1:2:3 | After ExceptionA | | +| raise.rb:4:1:5:3 | After ExceptionB | raise.rb:7:1:12:3 | m1 | | | raise.rb:4:1:5:3 | ExceptionB | raise.rb:4:20:4:28 | Exception | | -| raise.rb:4:20:4:28 | Exception | raise.rb:7:1:12:3 | m1 | | -| raise.rb:7:1:12:3 | enter m1 | raise.rb:7:8:7:8 | x | | -| raise.rb:7:1:12:3 | exit m1 (abnormal) | raise.rb:7:1:12:3 | exit m1 | | -| raise.rb:7:1:12:3 | exit m1 (normal) | raise.rb:7:1:12:3 | exit m1 | | +| raise.rb:4:20:4:28 | Exception | raise.rb:4:1:5:3 | After ExceptionB | | +| raise.rb:7:1:12:3 | Entry | raise.rb:7:8:7:8 | x | | +| raise.rb:7:1:12:3 | Exceptional Exit | raise.rb:7:1:12:3 | Exit | | +| raise.rb:7:1:12:3 | Normal Exit | raise.rb:7:1:12:3 | Exit | | | raise.rb:7:1:12:3 | m1 | raise.rb:14:1:23:3 | m2 | | -| raise.rb:7:8:7:8 | x | raise.rb:8:6:8:6 | x | | -| raise.rb:8:3:10:5 | if ... | raise.rb:11:3:11:15 | self | | +| raise.rb:7:8:7:8 | x | raise.rb:8:3:11:15 | ... | | +| raise.rb:8:3:10:5 | After if ... | raise.rb:11:3:11:15 | Before call to puts | | +| raise.rb:8:3:10:5 | if ... | raise.rb:8:6:8:10 | Before ... > ... | | +| raise.rb:8:3:11:15 | ... | raise.rb:8:3:10:5 | if ... | | +| raise.rb:8:3:11:15 | After ... | raise.rb:7:1:12:3 | Normal Exit | | | raise.rb:8:6:8:6 | x | raise.rb:8:10:8:10 | 2 | | -| raise.rb:8:6:8:10 | ... > ... | raise.rb:8:3:10:5 | if ... | false | -| raise.rb:8:6:8:10 | ... > ... | raise.rb:9:5:9:17 | self | true | +| raise.rb:8:6:8:10 | ... > ... | raise.rb:8:6:8:10 | After ... > ... [false] | false | +| raise.rb:8:6:8:10 | ... > ... | raise.rb:8:6:8:10 | After ... > ... [true] | true | +| raise.rb:8:6:8:10 | After ... > ... [false] | raise.rb:8:3:10:5 | After if ... | | +| raise.rb:8:6:8:10 | After ... > ... [true] | raise.rb:8:11:9:17 | then ... | | +| raise.rb:8:6:8:10 | Before ... > ... | raise.rb:8:6:8:6 | x | | | raise.rb:8:10:8:10 | 2 | raise.rb:8:6:8:10 | ... > ... | | -| raise.rb:9:5:9:17 | call to raise | raise.rb:7:1:12:3 | exit m1 (abnormal) | exception | -| raise.rb:9:5:9:17 | self | raise.rb:9:12:9:16 | x > 2 | | -| raise.rb:9:11:9:17 | "x > 2" | raise.rb:9:5:9:17 | call to raise | | +| raise.rb:8:11:9:17 | then ... | raise.rb:9:5:9:17 | Before call to raise | | +| raise.rb:9:5:9:17 | Before call to raise | raise.rb:9:5:9:17 | self | | +| raise.rb:9:5:9:17 | call to raise | raise.rb:7:1:12:3 | Exceptional Exit | exception | +| raise.rb:9:5:9:17 | self | raise.rb:9:11:9:17 | Before "x > 2" | | +| raise.rb:9:11:9:17 | "x > 2" | raise.rb:9:11:9:17 | After "x > 2" | | +| raise.rb:9:11:9:17 | After "x > 2" | raise.rb:9:5:9:17 | call to raise | | +| raise.rb:9:11:9:17 | Before "x > 2" | raise.rb:9:12:9:16 | x > 2 | | | raise.rb:9:12:9:16 | x > 2 | raise.rb:9:11:9:17 | "x > 2" | | -| raise.rb:11:3:11:15 | call to puts | raise.rb:7:1:12:3 | exit m1 (normal) | | -| raise.rb:11:3:11:15 | self | raise.rb:11:9:11:14 | x <= 2 | | -| raise.rb:11:8:11:15 | "x <= 2" | raise.rb:11:3:11:15 | call to puts | | +| raise.rb:11:3:11:15 | After call to puts | raise.rb:8:3:11:15 | After ... | | +| raise.rb:11:3:11:15 | Before call to puts | raise.rb:11:3:11:15 | self | | +| raise.rb:11:3:11:15 | call to puts | raise.rb:11:3:11:15 | After call to puts | | +| raise.rb:11:3:11:15 | self | raise.rb:11:8:11:15 | Before "x <= 2" | | +| raise.rb:11:8:11:15 | "x <= 2" | raise.rb:11:8:11:15 | After "x <= 2" | | +| raise.rb:11:8:11:15 | After "x <= 2" | raise.rb:11:3:11:15 | call to puts | | +| raise.rb:11:8:11:15 | Before "x <= 2" | raise.rb:11:9:11:14 | x <= 2 | | | raise.rb:11:9:11:14 | x <= 2 | raise.rb:11:8:11:15 | "x <= 2" | | -| raise.rb:14:1:23:3 | enter m2 | raise.rb:14:8:14:8 | b | | -| raise.rb:14:1:23:3 | exit m2 (abnormal) | raise.rb:14:1:23:3 | exit m2 | | -| raise.rb:14:1:23:3 | exit m2 (normal) | raise.rb:14:1:23:3 | exit m2 | | +| raise.rb:14:1:23:3 | Entry | raise.rb:14:8:14:8 | b | | +| raise.rb:14:1:23:3 | Exceptional Exit | raise.rb:14:1:23:3 | Exit | | +| raise.rb:14:1:23:3 | Normal Exit | raise.rb:14:1:23:3 | Exit | | | raise.rb:14:1:23:3 | m2 | raise.rb:25:1:34:3 | m3 | | -| raise.rb:14:8:14:8 | b | raise.rb:16:8:16:8 | b | | -| raise.rb:16:5:18:7 | if ... | raise.rb:22:3:22:15 | self | | -| raise.rb:16:8:16:8 | b | raise.rb:16:5:18:7 | if ... | false | -| raise.rb:16:8:16:8 | b | raise.rb:17:7:17:22 | self | true | -| raise.rb:17:7:17:22 | call to raise | raise.rb:19:10:19:19 | ExceptionA | exception | +| raise.rb:14:8:14:8 | b | raise.rb:15:3:22:15 | ... | | +| raise.rb:15:3:21:5 | After begin ... | raise.rb:22:3:22:15 | Before call to puts | | +| raise.rb:15:3:21:5 | begin ... | raise.rb:16:5:18:7 | if ... | | +| raise.rb:15:3:22:15 | ... | raise.rb:15:3:21:5 | begin ... | | +| raise.rb:15:3:22:15 | After ... | raise.rb:14:1:23:3 | Normal Exit | | +| raise.rb:16:5:18:7 | After if ... | raise.rb:15:3:21:5 | After begin ... | | +| raise.rb:16:5:18:7 | if ... | raise.rb:16:8:16:8 | b | | +| raise.rb:16:8:16:8 | After b [false] | raise.rb:16:5:18:7 | After if ... | | +| raise.rb:16:8:16:8 | After b [true] | raise.rb:16:9:17:22 | then ... | | +| raise.rb:16:8:16:8 | b | raise.rb:16:8:16:8 | After b [false] | false | +| raise.rb:16:8:16:8 | b | raise.rb:16:8:16:8 | After b [true] | true | +| raise.rb:16:9:17:22 | then ... | raise.rb:17:7:17:22 | Before call to raise | | +| raise.rb:17:7:17:22 | Before call to raise | raise.rb:17:7:17:22 | self | | +| raise.rb:17:7:17:22 | call to raise | raise.rb:19:3:20:18 | rescue ... | exception | | raise.rb:17:7:17:22 | self | raise.rb:17:13:17:22 | ExceptionA | | | raise.rb:17:13:17:22 | ExceptionA | raise.rb:17:7:17:22 | call to raise | | -| raise.rb:19:3:20:18 | rescue ... | raise.rb:22:3:22:15 | self | | -| raise.rb:19:10:19:19 | ExceptionA | raise.rb:14:1:23:3 | exit m2 (abnormal) | exception | -| raise.rb:19:10:19:19 | ExceptionA | raise.rb:20:5:20:18 | self | match | -| raise.rb:19:20:20:18 | then ... | raise.rb:19:3:20:18 | rescue ... | | -| raise.rb:20:5:20:18 | call to puts | raise.rb:19:20:20:18 | then ... | | -| raise.rb:20:5:20:18 | self | raise.rb:20:11:20:17 | Rescued | | -| raise.rb:20:10:20:18 | "Rescued" | raise.rb:20:5:20:18 | call to puts | | +| raise.rb:19:3:20:18 | After rescue ... [no-match] | raise.rb:14:1:23:3 | Exceptional Exit | exception | +| raise.rb:19:3:20:18 | rescue ... | raise.rb:19:10:19:19 | ExceptionA | | +| raise.rb:19:10:19:19 | After ExceptionA [match] | raise.rb:19:20:20:18 | then ... | | +| raise.rb:19:10:19:19 | After ExceptionA [no-match] | raise.rb:19:3:20:18 | After rescue ... [no-match] | no-match | +| raise.rb:19:10:19:19 | ExceptionA | raise.rb:19:10:19:19 | After ExceptionA [match] | match | +| raise.rb:19:10:19:19 | ExceptionA | raise.rb:19:10:19:19 | After ExceptionA [no-match] | no-match | +| raise.rb:19:20:20:18 | After then ... | raise.rb:15:3:21:5 | After begin ... | | +| raise.rb:19:20:20:18 | then ... | raise.rb:20:5:20:18 | Before call to puts | | +| raise.rb:20:5:20:18 | After call to puts | raise.rb:19:20:20:18 | After then ... | | +| raise.rb:20:5:20:18 | Before call to puts | raise.rb:20:5:20:18 | self | | +| raise.rb:20:5:20:18 | call to puts | raise.rb:20:5:20:18 | After call to puts | | +| raise.rb:20:5:20:18 | self | raise.rb:20:10:20:18 | Before "Rescued" | | +| raise.rb:20:10:20:18 | "Rescued" | raise.rb:20:10:20:18 | After "Rescued" | | +| raise.rb:20:10:20:18 | After "Rescued" | raise.rb:20:5:20:18 | call to puts | | +| raise.rb:20:10:20:18 | Before "Rescued" | raise.rb:20:11:20:17 | Rescued | | | raise.rb:20:11:20:17 | Rescued | raise.rb:20:10:20:18 | "Rescued" | | -| raise.rb:22:3:22:15 | call to puts | raise.rb:14:1:23:3 | exit m2 (normal) | | -| raise.rb:22:3:22:15 | self | raise.rb:22:9:22:14 | End m2 | | -| raise.rb:22:8:22:15 | "End m2" | raise.rb:22:3:22:15 | call to puts | | +| raise.rb:22:3:22:15 | After call to puts | raise.rb:15:3:22:15 | After ... | | +| raise.rb:22:3:22:15 | Before call to puts | raise.rb:22:3:22:15 | self | | +| raise.rb:22:3:22:15 | call to puts | raise.rb:22:3:22:15 | After call to puts | | +| raise.rb:22:3:22:15 | self | raise.rb:22:8:22:15 | Before "End m2" | | +| raise.rb:22:8:22:15 | "End m2" | raise.rb:22:8:22:15 | After "End m2" | | +| raise.rb:22:8:22:15 | After "End m2" | raise.rb:22:3:22:15 | call to puts | | +| raise.rb:22:8:22:15 | Before "End m2" | raise.rb:22:9:22:14 | End m2 | | | raise.rb:22:9:22:14 | End m2 | raise.rb:22:8:22:15 | "End m2" | | -| raise.rb:25:1:34:3 | enter m3 | raise.rb:25:8:25:8 | b | | -| raise.rb:25:1:34:3 | exit m3 (normal) | raise.rb:25:1:34:3 | exit m3 | | +| raise.rb:25:1:34:3 | Entry | raise.rb:25:8:25:8 | b | | +| raise.rb:25:1:34:3 | Normal Exit | raise.rb:25:1:34:3 | Exit | | | raise.rb:25:1:34:3 | m3 | raise.rb:36:1:45:3 | m4 | | -| raise.rb:25:8:25:8 | b | raise.rb:27:8:27:8 | b | | -| raise.rb:27:5:29:7 | if ... | raise.rb:33:3:33:15 | self | | -| raise.rb:27:8:27:8 | b | raise.rb:27:5:29:7 | if ... | false | -| raise.rb:27:8:27:8 | b | raise.rb:28:7:28:22 | self | true | -| raise.rb:28:7:28:22 | call to raise | raise.rb:31:5:31:18 | self | exception | +| raise.rb:25:8:25:8 | b | raise.rb:26:3:33:15 | ... | | +| raise.rb:26:3:32:5 | After begin ... | raise.rb:33:3:33:15 | Before call to puts | | +| raise.rb:26:3:32:5 | begin ... | raise.rb:27:5:29:7 | if ... | | +| raise.rb:26:3:33:15 | ... | raise.rb:26:3:32:5 | begin ... | | +| raise.rb:26:3:33:15 | After ... | raise.rb:25:1:34:3 | Normal Exit | | +| raise.rb:27:5:29:7 | After if ... | raise.rb:26:3:32:5 | After begin ... | | +| raise.rb:27:5:29:7 | if ... | raise.rb:27:8:27:8 | b | | +| raise.rb:27:8:27:8 | After b [false] | raise.rb:27:5:29:7 | After if ... | | +| raise.rb:27:8:27:8 | After b [true] | raise.rb:27:9:28:22 | then ... | | +| raise.rb:27:8:27:8 | b | raise.rb:27:8:27:8 | After b [false] | false | +| raise.rb:27:8:27:8 | b | raise.rb:27:8:27:8 | After b [true] | true | +| raise.rb:27:9:28:22 | then ... | raise.rb:28:7:28:22 | Before call to raise | | +| raise.rb:28:7:28:22 | Before call to raise | raise.rb:28:7:28:22 | self | | +| raise.rb:28:7:28:22 | call to raise | raise.rb:30:3:31:18 | rescue ... | exception | | raise.rb:28:7:28:22 | self | raise.rb:28:13:28:22 | ExceptionA | | | raise.rb:28:13:28:22 | ExceptionA | raise.rb:28:7:28:22 | call to raise | | -| raise.rb:30:3:31:18 | rescue ... | raise.rb:33:3:33:15 | self | | -| raise.rb:30:9:31:18 | then ... | raise.rb:30:3:31:18 | rescue ... | | -| raise.rb:31:5:31:18 | call to puts | raise.rb:30:9:31:18 | then ... | | -| raise.rb:31:5:31:18 | self | raise.rb:31:11:31:17 | Rescued | | -| raise.rb:31:10:31:18 | "Rescued" | raise.rb:31:5:31:18 | call to puts | | +| raise.rb:30:3:31:18 | rescue ... | raise.rb:30:9:31:18 | then ... | | +| raise.rb:30:9:31:18 | After then ... | raise.rb:26:3:32:5 | After begin ... | | +| raise.rb:30:9:31:18 | then ... | raise.rb:31:5:31:18 | Before call to puts | | +| raise.rb:31:5:31:18 | After call to puts | raise.rb:30:9:31:18 | After then ... | | +| raise.rb:31:5:31:18 | Before call to puts | raise.rb:31:5:31:18 | self | | +| raise.rb:31:5:31:18 | call to puts | raise.rb:31:5:31:18 | After call to puts | | +| raise.rb:31:5:31:18 | self | raise.rb:31:10:31:18 | Before "Rescued" | | +| raise.rb:31:10:31:18 | "Rescued" | raise.rb:31:10:31:18 | After "Rescued" | | +| raise.rb:31:10:31:18 | After "Rescued" | raise.rb:31:5:31:18 | call to puts | | +| raise.rb:31:10:31:18 | Before "Rescued" | raise.rb:31:11:31:17 | Rescued | | | raise.rb:31:11:31:17 | Rescued | raise.rb:31:10:31:18 | "Rescued" | | -| raise.rb:33:3:33:15 | call to puts | raise.rb:25:1:34:3 | exit m3 (normal) | | -| raise.rb:33:3:33:15 | self | raise.rb:33:9:33:14 | End m3 | | -| raise.rb:33:8:33:15 | "End m3" | raise.rb:33:3:33:15 | call to puts | | +| raise.rb:33:3:33:15 | After call to puts | raise.rb:26:3:33:15 | After ... | | +| raise.rb:33:3:33:15 | Before call to puts | raise.rb:33:3:33:15 | self | | +| raise.rb:33:3:33:15 | call to puts | raise.rb:33:3:33:15 | After call to puts | | +| raise.rb:33:3:33:15 | self | raise.rb:33:8:33:15 | Before "End m3" | | +| raise.rb:33:8:33:15 | "End m3" | raise.rb:33:8:33:15 | After "End m3" | | +| raise.rb:33:8:33:15 | After "End m3" | raise.rb:33:3:33:15 | call to puts | | +| raise.rb:33:8:33:15 | Before "End m3" | raise.rb:33:9:33:14 | End m3 | | | raise.rb:33:9:33:14 | End m3 | raise.rb:33:8:33:15 | "End m3" | | -| raise.rb:36:1:45:3 | enter m4 | raise.rb:36:8:36:8 | b | | -| raise.rb:36:1:45:3 | exit m4 (normal) | raise.rb:36:1:45:3 | exit m4 | | +| raise.rb:36:1:45:3 | Entry | raise.rb:36:8:36:8 | b | | +| raise.rb:36:1:45:3 | Normal Exit | raise.rb:36:1:45:3 | Exit | | | raise.rb:36:1:45:3 | m4 | raise.rb:47:1:55:3 | m5 | | -| raise.rb:36:8:36:8 | b | raise.rb:38:8:38:8 | b | | -| raise.rb:38:5:40:7 | if ... | raise.rb:44:3:44:15 | self | | -| raise.rb:38:8:38:8 | b | raise.rb:38:5:40:7 | if ... | false | -| raise.rb:38:8:38:8 | b | raise.rb:39:7:39:22 | self | true | -| raise.rb:39:7:39:22 | call to raise | raise.rb:41:13:41:13 | e | exception | +| raise.rb:36:8:36:8 | b | raise.rb:37:3:44:15 | ... | | +| raise.rb:37:3:43:5 | After begin ... | raise.rb:44:3:44:15 | Before call to puts | | +| raise.rb:37:3:43:5 | begin ... | raise.rb:38:5:40:7 | if ... | | +| raise.rb:37:3:44:15 | ... | raise.rb:37:3:43:5 | begin ... | | +| raise.rb:37:3:44:15 | After ... | raise.rb:36:1:45:3 | Normal Exit | | +| raise.rb:38:5:40:7 | After if ... | raise.rb:37:3:43:5 | After begin ... | | +| raise.rb:38:5:40:7 | if ... | raise.rb:38:8:38:8 | b | | +| raise.rb:38:8:38:8 | After b [false] | raise.rb:38:5:40:7 | After if ... | | +| raise.rb:38:8:38:8 | After b [true] | raise.rb:38:9:39:22 | then ... | | +| raise.rb:38:8:38:8 | b | raise.rb:38:8:38:8 | After b [false] | false | +| raise.rb:38:8:38:8 | b | raise.rb:38:8:38:8 | After b [true] | true | +| raise.rb:38:9:39:22 | then ... | raise.rb:39:7:39:22 | Before call to raise | | +| raise.rb:39:7:39:22 | Before call to raise | raise.rb:39:7:39:22 | self | | +| raise.rb:39:7:39:22 | call to raise | raise.rb:41:3:42:22 | rescue ... | exception | | raise.rb:39:7:39:22 | self | raise.rb:39:13:39:22 | ExceptionA | | | raise.rb:39:13:39:22 | ExceptionA | raise.rb:39:7:39:22 | call to raise | | -| raise.rb:41:3:42:22 | rescue ... | raise.rb:44:3:44:15 | self | | -| raise.rb:41:13:41:13 | e | raise.rb:42:5:42:22 | self | | -| raise.rb:41:14:42:22 | then ... | raise.rb:41:3:42:22 | rescue ... | | -| raise.rb:42:5:42:22 | call to puts | raise.rb:41:14:42:22 | then ... | | -| raise.rb:42:5:42:22 | self | raise.rb:42:11:42:21 | Rescued {e} | | -| raise.rb:42:10:42:22 | "Rescued {e}" | raise.rb:42:5:42:22 | call to puts | | +| raise.rb:41:3:42:22 | rescue ... | raise.rb:41:13:41:13 | e | | +| raise.rb:41:13:41:13 | e | raise.rb:41:14:42:22 | then ... | | +| raise.rb:41:14:42:22 | After then ... | raise.rb:37:3:43:5 | After begin ... | | +| raise.rb:41:14:42:22 | then ... | raise.rb:42:5:42:22 | Before call to puts | | +| raise.rb:42:5:42:22 | After call to puts | raise.rb:41:14:42:22 | After then ... | | +| raise.rb:42:5:42:22 | Before call to puts | raise.rb:42:5:42:22 | self | | +| raise.rb:42:5:42:22 | call to puts | raise.rb:42:5:42:22 | After call to puts | | +| raise.rb:42:5:42:22 | self | raise.rb:42:10:42:22 | Before "Rescued {e}" | | +| raise.rb:42:10:42:22 | "Rescued {e}" | raise.rb:42:10:42:22 | After "Rescued {e}" | | +| raise.rb:42:10:42:22 | After "Rescued {e}" | raise.rb:42:5:42:22 | call to puts | | +| raise.rb:42:10:42:22 | Before "Rescued {e}" | raise.rb:42:11:42:21 | Rescued {e} | | | raise.rb:42:11:42:21 | Rescued {e} | raise.rb:42:10:42:22 | "Rescued {e}" | | -| raise.rb:44:3:44:15 | call to puts | raise.rb:36:1:45:3 | exit m4 (normal) | | -| raise.rb:44:3:44:15 | self | raise.rb:44:9:44:14 | End m4 | | -| raise.rb:44:8:44:15 | "End m4" | raise.rb:44:3:44:15 | call to puts | | +| raise.rb:44:3:44:15 | After call to puts | raise.rb:37:3:44:15 | After ... | | +| raise.rb:44:3:44:15 | Before call to puts | raise.rb:44:3:44:15 | self | | +| raise.rb:44:3:44:15 | call to puts | raise.rb:44:3:44:15 | After call to puts | | +| raise.rb:44:3:44:15 | self | raise.rb:44:8:44:15 | Before "End m4" | | +| raise.rb:44:8:44:15 | "End m4" | raise.rb:44:8:44:15 | After "End m4" | | +| raise.rb:44:8:44:15 | After "End m4" | raise.rb:44:3:44:15 | call to puts | | +| raise.rb:44:8:44:15 | Before "End m4" | raise.rb:44:9:44:14 | End m4 | | | raise.rb:44:9:44:14 | End m4 | raise.rb:44:8:44:15 | "End m4" | | -| raise.rb:47:1:55:3 | enter m5 | raise.rb:47:8:47:8 | b | | -| raise.rb:47:1:55:3 | exit m5 (normal) | raise.rb:47:1:55:3 | exit m5 | | +| raise.rb:47:1:55:3 | Entry | raise.rb:47:8:47:8 | b | | +| raise.rb:47:1:55:3 | Normal Exit | raise.rb:47:1:55:3 | Exit | | | raise.rb:47:1:55:3 | m5 | raise.rb:57:1:66:3 | m6 | | -| raise.rb:47:8:47:8 | b | raise.rb:49:8:49:8 | b | | -| raise.rb:49:5:51:7 | if ... | raise.rb:54:3:54:15 | self | | -| raise.rb:49:8:49:8 | b | raise.rb:49:5:51:7 | if ... | false | -| raise.rb:49:8:49:8 | b | raise.rb:50:7:50:22 | self | true | -| raise.rb:50:7:50:22 | call to raise | raise.rb:52:13:52:13 | e | exception | +| raise.rb:47:8:47:8 | b | raise.rb:48:3:54:15 | ... | | +| raise.rb:48:3:53:5 | After begin ... | raise.rb:54:3:54:15 | Before call to puts | | +| raise.rb:48:3:53:5 | begin ... | raise.rb:49:5:51:7 | if ... | | +| raise.rb:48:3:54:15 | ... | raise.rb:48:3:53:5 | begin ... | | +| raise.rb:48:3:54:15 | After ... | raise.rb:47:1:55:3 | Normal Exit | | +| raise.rb:49:5:51:7 | After if ... | raise.rb:48:3:53:5 | After begin ... | | +| raise.rb:49:5:51:7 | if ... | raise.rb:49:8:49:8 | b | | +| raise.rb:49:8:49:8 | After b [false] | raise.rb:49:5:51:7 | After if ... | | +| raise.rb:49:8:49:8 | After b [true] | raise.rb:49:9:50:22 | then ... | | +| raise.rb:49:8:49:8 | b | raise.rb:49:8:49:8 | After b [false] | false | +| raise.rb:49:8:49:8 | b | raise.rb:49:8:49:8 | After b [true] | true | +| raise.rb:49:9:50:22 | then ... | raise.rb:50:7:50:22 | Before call to raise | | +| raise.rb:50:7:50:22 | Before call to raise | raise.rb:50:7:50:22 | self | | +| raise.rb:50:7:50:22 | call to raise | raise.rb:52:3:52:13 | rescue ... | exception | | raise.rb:50:7:50:22 | self | raise.rb:50:13:50:22 | ExceptionA | | | raise.rb:50:13:50:22 | ExceptionA | raise.rb:50:7:50:22 | call to raise | | -| raise.rb:52:3:52:13 | rescue ... | raise.rb:54:3:54:15 | self | | -| raise.rb:52:13:52:13 | e | raise.rb:52:3:52:13 | rescue ... | | -| raise.rb:54:3:54:15 | call to puts | raise.rb:47:1:55:3 | exit m5 (normal) | | -| raise.rb:54:3:54:15 | self | raise.rb:54:9:54:14 | End m5 | | -| raise.rb:54:8:54:15 | "End m5" | raise.rb:54:3:54:15 | call to puts | | +| raise.rb:52:3:52:13 | [CatchClauseEmptyBody] rescue ... | raise.rb:48:3:53:5 | After begin ... | | +| raise.rb:52:3:52:13 | rescue ... | raise.rb:52:13:52:13 | e | | +| raise.rb:52:13:52:13 | e | raise.rb:52:3:52:13 | [CatchClauseEmptyBody] rescue ... | | +| raise.rb:54:3:54:15 | After call to puts | raise.rb:48:3:54:15 | After ... | | +| raise.rb:54:3:54:15 | Before call to puts | raise.rb:54:3:54:15 | self | | +| raise.rb:54:3:54:15 | call to puts | raise.rb:54:3:54:15 | After call to puts | | +| raise.rb:54:3:54:15 | self | raise.rb:54:8:54:15 | Before "End m5" | | +| raise.rb:54:8:54:15 | "End m5" | raise.rb:54:8:54:15 | After "End m5" | | +| raise.rb:54:8:54:15 | After "End m5" | raise.rb:54:3:54:15 | call to puts | | +| raise.rb:54:8:54:15 | Before "End m5" | raise.rb:54:9:54:14 | End m5 | | | raise.rb:54:9:54:14 | End m5 | raise.rb:54:8:54:15 | "End m5" | | -| raise.rb:57:1:66:3 | enter m6 | raise.rb:57:8:57:8 | b | | -| raise.rb:57:1:66:3 | exit m6 (abnormal) | raise.rb:57:1:66:3 | exit m6 | | -| raise.rb:57:1:66:3 | exit m6 (normal) | raise.rb:57:1:66:3 | exit m6 | | +| raise.rb:57:1:66:3 | Entry | raise.rb:57:8:57:8 | b | | +| raise.rb:57:1:66:3 | Exceptional Exit | raise.rb:57:1:66:3 | Exit | | +| raise.rb:57:1:66:3 | Normal Exit | raise.rb:57:1:66:3 | Exit | | | raise.rb:57:1:66:3 | m6 | raise.rb:68:1:77:3 | m7 | | -| raise.rb:57:8:57:8 | b | raise.rb:59:8:59:8 | b | | -| raise.rb:59:5:61:7 | if ... | raise.rb:65:3:65:15 | self | | -| raise.rb:59:8:59:8 | b | raise.rb:59:5:61:7 | if ... | false | -| raise.rb:59:8:59:8 | b | raise.rb:60:7:60:22 | self | true | -| raise.rb:60:7:60:22 | call to raise | raise.rb:62:10:62:19 | ExceptionA | exception | +| raise.rb:57:8:57:8 | b | raise.rb:58:3:65:15 | ... | | +| raise.rb:58:3:64:5 | After begin ... | raise.rb:65:3:65:15 | Before call to puts | | +| raise.rb:58:3:64:5 | begin ... | raise.rb:59:5:61:7 | if ... | | +| raise.rb:58:3:65:15 | ... | raise.rb:58:3:64:5 | begin ... | | +| raise.rb:58:3:65:15 | After ... | raise.rb:57:1:66:3 | Normal Exit | | +| raise.rb:59:5:61:7 | After if ... | raise.rb:58:3:64:5 | After begin ... | | +| raise.rb:59:5:61:7 | if ... | raise.rb:59:8:59:8 | b | | +| raise.rb:59:8:59:8 | After b [false] | raise.rb:59:5:61:7 | After if ... | | +| raise.rb:59:8:59:8 | After b [true] | raise.rb:59:9:60:22 | then ... | | +| raise.rb:59:8:59:8 | b | raise.rb:59:8:59:8 | After b [false] | false | +| raise.rb:59:8:59:8 | b | raise.rb:59:8:59:8 | After b [true] | true | +| raise.rb:59:9:60:22 | then ... | raise.rb:60:7:60:22 | Before call to raise | | +| raise.rb:60:7:60:22 | Before call to raise | raise.rb:60:7:60:22 | self | | +| raise.rb:60:7:60:22 | call to raise | raise.rb:62:3:63:22 | rescue ... | exception | | raise.rb:60:7:60:22 | self | raise.rb:60:13:60:22 | ExceptionA | | | raise.rb:60:13:60:22 | ExceptionA | raise.rb:60:7:60:22 | call to raise | | -| raise.rb:62:3:63:22 | rescue ... | raise.rb:65:3:65:15 | self | | -| raise.rb:62:10:62:19 | ExceptionA | raise.rb:62:22:62:31 | ExceptionB | no-match | -| raise.rb:62:10:62:19 | ExceptionA | raise.rb:62:36:62:36 | e | match | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:57:1:66:3 | exit m6 (abnormal) | exception | -| raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:36:62:36 | e | match | -| raise.rb:62:36:62:36 | e | raise.rb:63:5:63:22 | self | | -| raise.rb:62:37:63:22 | then ... | raise.rb:62:3:63:22 | rescue ... | | -| raise.rb:63:5:63:22 | call to puts | raise.rb:62:37:63:22 | then ... | | -| raise.rb:63:5:63:22 | self | raise.rb:63:11:63:21 | Rescued {e} | | -| raise.rb:63:10:63:22 | "Rescued {e}" | raise.rb:63:5:63:22 | call to puts | | +| raise.rb:62:3:63:22 | After rescue ... [no-match] | raise.rb:57:1:66:3 | Exceptional Exit | exception | +| raise.rb:62:3:63:22 | rescue ... | raise.rb:62:10:62:31 | Before ..., ... | | +| raise.rb:62:10:62:19 | ExceptionA | raise.rb:62:22:62:31 | ExceptionB | | +| raise.rb:62:10:62:31 | ..., ... | raise.rb:62:10:62:31 | After ..., ... [match] | match | +| raise.rb:62:10:62:31 | ..., ... | raise.rb:62:10:62:31 | After ..., ... [no-match] | no-match | +| raise.rb:62:10:62:31 | After ..., ... [match] | raise.rb:62:36:62:36 | e | | +| raise.rb:62:10:62:31 | After ..., ... [no-match] | raise.rb:62:3:63:22 | After rescue ... [no-match] | no-match | +| raise.rb:62:10:62:31 | Before ..., ... | raise.rb:62:10:62:19 | ExceptionA | | +| raise.rb:62:22:62:31 | ExceptionB | raise.rb:62:10:62:31 | ..., ... | | +| raise.rb:62:36:62:36 | e | raise.rb:62:37:63:22 | then ... | | +| raise.rb:62:37:63:22 | After then ... | raise.rb:58:3:64:5 | After begin ... | | +| raise.rb:62:37:63:22 | then ... | raise.rb:63:5:63:22 | Before call to puts | | +| raise.rb:63:5:63:22 | After call to puts | raise.rb:62:37:63:22 | After then ... | | +| raise.rb:63:5:63:22 | Before call to puts | raise.rb:63:5:63:22 | self | | +| raise.rb:63:5:63:22 | call to puts | raise.rb:63:5:63:22 | After call to puts | | +| raise.rb:63:5:63:22 | self | raise.rb:63:10:63:22 | Before "Rescued {e}" | | +| raise.rb:63:10:63:22 | "Rescued {e}" | raise.rb:63:10:63:22 | After "Rescued {e}" | | +| raise.rb:63:10:63:22 | After "Rescued {e}" | raise.rb:63:5:63:22 | call to puts | | +| raise.rb:63:10:63:22 | Before "Rescued {e}" | raise.rb:63:11:63:21 | Rescued {e} | | | raise.rb:63:11:63:21 | Rescued {e} | raise.rb:63:10:63:22 | "Rescued {e}" | | -| raise.rb:65:3:65:15 | call to puts | raise.rb:57:1:66:3 | exit m6 (normal) | | -| raise.rb:65:3:65:15 | self | raise.rb:65:9:65:14 | End m6 | | -| raise.rb:65:8:65:15 | "End m6" | raise.rb:65:3:65:15 | call to puts | | +| raise.rb:65:3:65:15 | After call to puts | raise.rb:58:3:65:15 | After ... | | +| raise.rb:65:3:65:15 | Before call to puts | raise.rb:65:3:65:15 | self | | +| raise.rb:65:3:65:15 | call to puts | raise.rb:65:3:65:15 | After call to puts | | +| raise.rb:65:3:65:15 | self | raise.rb:65:8:65:15 | Before "End m6" | | +| raise.rb:65:8:65:15 | "End m6" | raise.rb:65:8:65:15 | After "End m6" | | +| raise.rb:65:8:65:15 | After "End m6" | raise.rb:65:3:65:15 | call to puts | | +| raise.rb:65:8:65:15 | Before "End m6" | raise.rb:65:9:65:14 | End m6 | | | raise.rb:65:9:65:14 | End m6 | raise.rb:65:8:65:15 | "End m6" | | -| raise.rb:68:1:77:3 | enter m7 | raise.rb:68:8:68:8 | x | | -| raise.rb:68:1:77:3 | exit m7 (abnormal) | raise.rb:68:1:77:3 | exit m7 | | -| raise.rb:68:1:77:3 | exit m7 (normal) | raise.rb:68:1:77:3 | exit m7 | | +| raise.rb:68:1:77:3 | Entry | raise.rb:68:8:68:8 | x | | +| raise.rb:68:1:77:3 | Exceptional Exit | raise.rb:68:1:77:3 | Exit | | +| raise.rb:68:1:77:3 | Normal Exit | raise.rb:68:1:77:3 | Exit | | | raise.rb:68:1:77:3 | m7 | raise.rb:79:1:92:3 | m8 | | -| raise.rb:68:8:68:8 | x | raise.rb:69:6:69:6 | x | | -| raise.rb:69:3:73:5 | if ... | raise.rb:74:3:74:20 | self | | +| raise.rb:68:8:68:8 | x | raise.rb:69:3:76:15 | ... | | +| raise.rb:69:3:73:5 | After if ... | raise.rb:74:3:74:20 | Before call to puts | | +| raise.rb:69:3:73:5 | if ... | raise.rb:69:6:69:10 | Before ... > ... | | +| raise.rb:69:3:76:15 | ... | raise.rb:69:3:73:5 | if ... | | +| raise.rb:69:3:76:15 | After ... | raise.rb:68:1:77:3 | Normal Exit | | | raise.rb:69:6:69:6 | x | raise.rb:69:10:69:10 | 2 | | -| raise.rb:69:6:69:10 | ... > ... | raise.rb:70:5:70:17 | self | true | -| raise.rb:69:6:69:10 | ... > ... | raise.rb:71:9:71:9 | x | false | -| raise.rb:69:6:69:10 | ... > ... | raise.rb:76:3:76:15 | [ensure: exception] self | exception | +| raise.rb:69:6:69:10 | ... > ... | raise.rb:69:6:69:10 | After ... > ... [false] | false | +| raise.rb:69:6:69:10 | ... > ... | raise.rb:69:6:69:10 | After ... > ... [true] | true | +| raise.rb:69:6:69:10 | ... > ... | raise.rb:75:1:76:15 | ensure ... | exception | +| raise.rb:69:6:69:10 | After ... > ... [false] | raise.rb:71:3:72:18 | elsif ... | | +| raise.rb:69:6:69:10 | After ... > ... [true] | raise.rb:69:11:70:17 | then ... | | +| raise.rb:69:6:69:10 | Before ... > ... | raise.rb:69:6:69:6 | x | | | raise.rb:69:10:69:10 | 2 | raise.rb:69:6:69:10 | ... > ... | | -| raise.rb:70:5:70:17 | call to raise | raise.rb:76:3:76:15 | [ensure: exception] self | exception | -| raise.rb:70:5:70:17 | self | raise.rb:70:12:70:16 | x > 2 | | -| raise.rb:70:11:70:17 | "x > 2" | raise.rb:70:5:70:17 | call to raise | | +| raise.rb:69:11:70:17 | then ... | raise.rb:70:5:70:17 | Before call to raise | | +| raise.rb:70:5:70:17 | Before call to raise | raise.rb:70:5:70:17 | self | | +| raise.rb:70:5:70:17 | call to raise | raise.rb:75:1:76:15 | ensure ... | exception | +| raise.rb:70:5:70:17 | self | raise.rb:70:11:70:17 | Before "x > 2" | | +| raise.rb:70:11:70:17 | "x > 2" | raise.rb:70:11:70:17 | After "x > 2" | | +| raise.rb:70:11:70:17 | After "x > 2" | raise.rb:70:5:70:17 | call to raise | | +| raise.rb:70:11:70:17 | Before "x > 2" | raise.rb:70:12:70:16 | x > 2 | | | raise.rb:70:12:70:16 | x > 2 | raise.rb:70:11:70:17 | "x > 2" | | -| raise.rb:71:3:72:18 | elsif ... | raise.rb:69:3:73:5 | if ... | | +| raise.rb:71:3:72:18 | After elsif ... | raise.rb:69:3:73:5 | After if ... | | +| raise.rb:71:3:72:18 | elsif ... | raise.rb:71:9:71:13 | Before ... < ... | | | raise.rb:71:9:71:9 | x | raise.rb:71:13:71:13 | 0 | | -| raise.rb:71:9:71:13 | ... < ... | raise.rb:71:3:72:18 | elsif ... | false | -| raise.rb:71:9:71:13 | ... < ... | raise.rb:72:13:72:17 | x < 0 | true | -| raise.rb:71:9:71:13 | ... < ... | raise.rb:76:3:76:15 | [ensure: exception] self | exception | +| raise.rb:71:9:71:13 | ... < ... | raise.rb:71:9:71:13 | After ... < ... [false] | false | +| raise.rb:71:9:71:13 | ... < ... | raise.rb:71:9:71:13 | After ... < ... [true] | true | +| raise.rb:71:9:71:13 | ... < ... | raise.rb:75:1:76:15 | ensure ... | exception | +| raise.rb:71:9:71:13 | After ... < ... [false] | raise.rb:71:3:72:18 | After elsif ... | | +| raise.rb:71:9:71:13 | After ... < ... [true] | raise.rb:71:14:72:18 | then ... | | +| raise.rb:71:9:71:13 | Before ... < ... | raise.rb:71:9:71:9 | x | | | raise.rb:71:13:71:13 | 0 | raise.rb:71:9:71:13 | ... < ... | | -| raise.rb:72:5:72:18 | return | raise.rb:76:3:76:15 | [ensure: return] self | return | -| raise.rb:72:12:72:18 | "x < 0" | raise.rb:72:5:72:18 | return | | +| raise.rb:71:14:72:18 | then ... | raise.rb:72:5:72:18 | Before return | | +| raise.rb:72:5:72:18 | Before return | raise.rb:72:12:72:18 | Before "x < 0" | | +| raise.rb:72:5:72:18 | return | raise.rb:75:1:76:15 | ensure ... | return | +| raise.rb:72:12:72:18 | "x < 0" | raise.rb:72:12:72:18 | After "x < 0" | | +| raise.rb:72:12:72:18 | After "x < 0" | raise.rb:72:5:72:18 | return | | +| raise.rb:72:12:72:18 | Before "x < 0" | raise.rb:72:13:72:17 | x < 0 | | | raise.rb:72:13:72:17 | x < 0 | raise.rb:72:12:72:18 | "x < 0" | | -| raise.rb:74:3:74:20 | call to puts | raise.rb:76:3:76:15 | [ensure: exception] self | exception | -| raise.rb:74:3:74:20 | call to puts | raise.rb:76:3:76:15 | self | | -| raise.rb:74:3:74:20 | self | raise.rb:74:9:74:19 | 0 <= x <= 2 | | -| raise.rb:74:8:74:20 | "0 <= x <= 2" | raise.rb:74:3:74:20 | call to puts | | +| raise.rb:74:3:74:20 | After call to puts | raise.rb:75:1:76:15 | ensure ... | | +| raise.rb:74:3:74:20 | Before call to puts | raise.rb:74:3:74:20 | self | | +| raise.rb:74:3:74:20 | call to puts | raise.rb:74:3:74:20 | After call to puts | | +| raise.rb:74:3:74:20 | call to puts | raise.rb:75:1:76:15 | ensure ... | exception | +| raise.rb:74:3:74:20 | self | raise.rb:74:8:74:20 | Before "0 <= x <= 2" | | +| raise.rb:74:8:74:20 | "0 <= x <= 2" | raise.rb:74:8:74:20 | After "0 <= x <= 2" | | +| raise.rb:74:8:74:20 | After "0 <= x <= 2" | raise.rb:74:3:74:20 | call to puts | | +| raise.rb:74:8:74:20 | Before "0 <= x <= 2" | raise.rb:74:9:74:19 | 0 <= x <= 2 | | | raise.rb:74:9:74:19 | 0 <= x <= 2 | raise.rb:74:8:74:20 | "0 <= x <= 2" | | -| raise.rb:75:1:76:15 | [ensure: exception] ensure ... | raise.rb:68:1:77:3 | exit m7 (abnormal) | exception | -| raise.rb:75:1:76:15 | [ensure: return] ensure ... | raise.rb:68:1:77:3 | exit m7 (normal) | return | -| raise.rb:75:1:76:15 | ensure ... | raise.rb:68:1:77:3 | exit m7 (normal) | | -| raise.rb:76:3:76:15 | [ensure: exception] call to puts | raise.rb:75:1:76:15 | [ensure: exception] ensure ... | | -| raise.rb:76:3:76:15 | [ensure: exception] self | raise.rb:76:9:76:14 | [ensure: exception] ensure | | -| raise.rb:76:3:76:15 | [ensure: return] call to puts | raise.rb:75:1:76:15 | [ensure: return] ensure ... | | -| raise.rb:76:3:76:15 | [ensure: return] self | raise.rb:76:9:76:14 | [ensure: return] ensure | | -| raise.rb:76:3:76:15 | call to puts | raise.rb:75:1:76:15 | ensure ... | | -| raise.rb:76:3:76:15 | self | raise.rb:76:9:76:14 | ensure | | -| raise.rb:76:8:76:15 | "ensure" | raise.rb:76:3:76:15 | call to puts | | -| raise.rb:76:8:76:15 | [ensure: exception] "ensure" | raise.rb:76:3:76:15 | [ensure: exception] call to puts | | -| raise.rb:76:8:76:15 | [ensure: return] "ensure" | raise.rb:76:3:76:15 | [ensure: return] call to puts | | -| raise.rb:76:9:76:14 | [ensure: exception] ensure | raise.rb:76:8:76:15 | [ensure: exception] "ensure" | | -| raise.rb:76:9:76:14 | [ensure: return] ensure | raise.rb:76:8:76:15 | [ensure: return] "ensure" | | +| raise.rb:75:1:76:15 | After ensure ... | raise.rb:68:1:77:3 | Exceptional Exit | exception | +| raise.rb:75:1:76:15 | After ensure ... | raise.rb:68:1:77:3 | Normal Exit | return | +| raise.rb:75:1:76:15 | After ensure ... | raise.rb:69:3:76:15 | After ... | | +| raise.rb:75:1:76:15 | ensure ... | raise.rb:76:3:76:15 | Before call to puts | | +| raise.rb:76:3:76:15 | After call to puts | raise.rb:75:1:76:15 | After ensure ... | | +| raise.rb:76:3:76:15 | Before call to puts | raise.rb:76:3:76:15 | self | | +| raise.rb:76:3:76:15 | call to puts | raise.rb:76:3:76:15 | After call to puts | | +| raise.rb:76:3:76:15 | self | raise.rb:76:8:76:15 | Before "ensure" | | +| raise.rb:76:8:76:15 | "ensure" | raise.rb:76:8:76:15 | After "ensure" | | +| raise.rb:76:8:76:15 | After "ensure" | raise.rb:76:3:76:15 | call to puts | | +| raise.rb:76:8:76:15 | Before "ensure" | raise.rb:76:9:76:14 | ensure | | | raise.rb:76:9:76:14 | ensure | raise.rb:76:8:76:15 | "ensure" | | -| raise.rb:79:1:92:3 | enter m8 | raise.rb:79:8:79:8 | x | | -| raise.rb:79:1:92:3 | exit m8 (abnormal) | raise.rb:79:1:92:3 | exit m8 | | -| raise.rb:79:1:92:3 | exit m8 (normal) | raise.rb:79:1:92:3 | exit m8 | | +| raise.rb:79:1:92:3 | Entry | raise.rb:79:8:79:8 | x | | +| raise.rb:79:1:92:3 | Exceptional Exit | raise.rb:79:1:92:3 | Exit | | +| raise.rb:79:1:92:3 | Normal Exit | raise.rb:79:1:92:3 | Exit | | | raise.rb:79:1:92:3 | m8 | raise.rb:94:1:119:3 | m9 | | -| raise.rb:79:8:79:8 | x | raise.rb:80:3:80:17 | self | | -| raise.rb:80:3:80:17 | call to puts | raise.rb:82:8:82:8 | x | | -| raise.rb:80:3:80:17 | self | raise.rb:80:9:80:16 | Begin m8 | | -| raise.rb:80:8:80:17 | "Begin m8" | raise.rb:80:3:80:17 | call to puts | | +| raise.rb:79:8:79:8 | x | raise.rb:80:3:91:15 | ... | | +| raise.rb:80:3:80:17 | After call to puts | raise.rb:81:3:90:5 | begin ... | | +| raise.rb:80:3:80:17 | Before call to puts | raise.rb:80:3:80:17 | self | | +| raise.rb:80:3:80:17 | call to puts | raise.rb:80:3:80:17 | After call to puts | | +| raise.rb:80:3:80:17 | self | raise.rb:80:8:80:17 | Before "Begin m8" | | +| raise.rb:80:3:91:15 | ... | raise.rb:80:3:80:17 | Before call to puts | | +| raise.rb:80:3:91:15 | After ... | raise.rb:79:1:92:3 | Normal Exit | | +| raise.rb:80:8:80:17 | "Begin m8" | raise.rb:80:8:80:17 | After "Begin m8" | | +| raise.rb:80:8:80:17 | After "Begin m8" | raise.rb:80:3:80:17 | call to puts | | +| raise.rb:80:8:80:17 | Before "Begin m8" | raise.rb:80:9:80:16 | Begin m8 | | | raise.rb:80:9:80:16 | Begin m8 | raise.rb:80:8:80:17 | "Begin m8" | | -| raise.rb:82:5:86:7 | if ... | raise.rb:87:5:87:22 | self | | +| raise.rb:81:3:90:5 | After begin ... | raise.rb:91:3:91:15 | Before call to puts | | +| raise.rb:81:3:90:5 | begin ... | raise.rb:82:5:86:7 | if ... | | +| raise.rb:82:5:86:7 | After if ... | raise.rb:87:5:87:22 | Before call to puts | | +| raise.rb:82:5:86:7 | if ... | raise.rb:82:8:82:12 | Before ... > ... | | | raise.rb:82:8:82:8 | x | raise.rb:82:12:82:12 | 2 | | -| raise.rb:82:8:82:12 | ... > ... | raise.rb:83:7:83:19 | self | true | -| raise.rb:82:8:82:12 | ... > ... | raise.rb:84:11:84:11 | x | false | -| raise.rb:82:8:82:12 | ... > ... | raise.rb:89:5:89:17 | [ensure: exception] self | exception | +| raise.rb:82:8:82:12 | ... > ... | raise.rb:82:8:82:12 | After ... > ... [false] | false | +| raise.rb:82:8:82:12 | ... > ... | raise.rb:82:8:82:12 | After ... > ... [true] | true | +| raise.rb:82:8:82:12 | ... > ... | raise.rb:88:3:89:17 | ensure ... | exception | +| raise.rb:82:8:82:12 | After ... > ... [false] | raise.rb:84:5:85:20 | elsif ... | | +| raise.rb:82:8:82:12 | After ... > ... [true] | raise.rb:82:13:83:19 | then ... | | +| raise.rb:82:8:82:12 | Before ... > ... | raise.rb:82:8:82:8 | x | | | raise.rb:82:12:82:12 | 2 | raise.rb:82:8:82:12 | ... > ... | | -| raise.rb:83:7:83:19 | call to raise | raise.rb:89:5:89:17 | [ensure: exception] self | exception | -| raise.rb:83:7:83:19 | self | raise.rb:83:14:83:18 | x > 2 | | -| raise.rb:83:13:83:19 | "x > 2" | raise.rb:83:7:83:19 | call to raise | | +| raise.rb:82:13:83:19 | then ... | raise.rb:83:7:83:19 | Before call to raise | | +| raise.rb:83:7:83:19 | Before call to raise | raise.rb:83:7:83:19 | self | | +| raise.rb:83:7:83:19 | call to raise | raise.rb:88:3:89:17 | ensure ... | exception | +| raise.rb:83:7:83:19 | self | raise.rb:83:13:83:19 | Before "x > 2" | | +| raise.rb:83:13:83:19 | "x > 2" | raise.rb:83:13:83:19 | After "x > 2" | | +| raise.rb:83:13:83:19 | After "x > 2" | raise.rb:83:7:83:19 | call to raise | | +| raise.rb:83:13:83:19 | Before "x > 2" | raise.rb:83:14:83:18 | x > 2 | | | raise.rb:83:14:83:18 | x > 2 | raise.rb:83:13:83:19 | "x > 2" | | -| raise.rb:84:5:85:20 | elsif ... | raise.rb:82:5:86:7 | if ... | | +| raise.rb:84:5:85:20 | After elsif ... | raise.rb:82:5:86:7 | After if ... | | +| raise.rb:84:5:85:20 | elsif ... | raise.rb:84:11:84:15 | Before ... < ... | | | raise.rb:84:11:84:11 | x | raise.rb:84:15:84:15 | 0 | | -| raise.rb:84:11:84:15 | ... < ... | raise.rb:84:5:85:20 | elsif ... | false | -| raise.rb:84:11:84:15 | ... < ... | raise.rb:85:15:85:19 | x < 0 | true | -| raise.rb:84:11:84:15 | ... < ... | raise.rb:89:5:89:17 | [ensure: exception] self | exception | +| raise.rb:84:11:84:15 | ... < ... | raise.rb:84:11:84:15 | After ... < ... [false] | false | +| raise.rb:84:11:84:15 | ... < ... | raise.rb:84:11:84:15 | After ... < ... [true] | true | +| raise.rb:84:11:84:15 | ... < ... | raise.rb:88:3:89:17 | ensure ... | exception | +| raise.rb:84:11:84:15 | After ... < ... [false] | raise.rb:84:5:85:20 | After elsif ... | | +| raise.rb:84:11:84:15 | After ... < ... [true] | raise.rb:84:16:85:20 | then ... | | +| raise.rb:84:11:84:15 | Before ... < ... | raise.rb:84:11:84:11 | x | | | raise.rb:84:15:84:15 | 0 | raise.rb:84:11:84:15 | ... < ... | | -| raise.rb:85:7:85:20 | return | raise.rb:89:5:89:17 | [ensure: return] self | return | -| raise.rb:85:14:85:20 | "x < 0" | raise.rb:85:7:85:20 | return | | +| raise.rb:84:16:85:20 | then ... | raise.rb:85:7:85:20 | Before return | | +| raise.rb:85:7:85:20 | Before return | raise.rb:85:14:85:20 | Before "x < 0" | | +| raise.rb:85:7:85:20 | return | raise.rb:88:3:89:17 | ensure ... | return | +| raise.rb:85:14:85:20 | "x < 0" | raise.rb:85:14:85:20 | After "x < 0" | | +| raise.rb:85:14:85:20 | After "x < 0" | raise.rb:85:7:85:20 | return | | +| raise.rb:85:14:85:20 | Before "x < 0" | raise.rb:85:15:85:19 | x < 0 | | | raise.rb:85:15:85:19 | x < 0 | raise.rb:85:14:85:20 | "x < 0" | | -| raise.rb:87:5:87:22 | call to puts | raise.rb:89:5:89:17 | [ensure: exception] self | exception | -| raise.rb:87:5:87:22 | call to puts | raise.rb:89:5:89:17 | self | | -| raise.rb:87:5:87:22 | self | raise.rb:87:11:87:21 | 0 <= x <= 2 | | -| raise.rb:87:10:87:22 | "0 <= x <= 2" | raise.rb:87:5:87:22 | call to puts | | +| raise.rb:87:5:87:22 | After call to puts | raise.rb:88:3:89:17 | ensure ... | | +| raise.rb:87:5:87:22 | Before call to puts | raise.rb:87:5:87:22 | self | | +| raise.rb:87:5:87:22 | call to puts | raise.rb:87:5:87:22 | After call to puts | | +| raise.rb:87:5:87:22 | call to puts | raise.rb:88:3:89:17 | ensure ... | exception | +| raise.rb:87:5:87:22 | self | raise.rb:87:10:87:22 | Before "0 <= x <= 2" | | +| raise.rb:87:10:87:22 | "0 <= x <= 2" | raise.rb:87:10:87:22 | After "0 <= x <= 2" | | +| raise.rb:87:10:87:22 | After "0 <= x <= 2" | raise.rb:87:5:87:22 | call to puts | | +| raise.rb:87:10:87:22 | Before "0 <= x <= 2" | raise.rb:87:11:87:21 | 0 <= x <= 2 | | | raise.rb:87:11:87:21 | 0 <= x <= 2 | raise.rb:87:10:87:22 | "0 <= x <= 2" | | -| raise.rb:88:3:89:17 | [ensure: exception] ensure ... | raise.rb:79:1:92:3 | exit m8 (abnormal) | exception | -| raise.rb:88:3:89:17 | [ensure: return] ensure ... | raise.rb:79:1:92:3 | exit m8 (normal) | return | -| raise.rb:88:3:89:17 | ensure ... | raise.rb:91:3:91:15 | self | | -| raise.rb:89:5:89:17 | [ensure: exception] call to puts | raise.rb:88:3:89:17 | [ensure: exception] ensure ... | | -| raise.rb:89:5:89:17 | [ensure: exception] self | raise.rb:89:11:89:16 | [ensure: exception] ensure | | -| raise.rb:89:5:89:17 | [ensure: return] call to puts | raise.rb:88:3:89:17 | [ensure: return] ensure ... | | -| raise.rb:89:5:89:17 | [ensure: return] self | raise.rb:89:11:89:16 | [ensure: return] ensure | | -| raise.rb:89:5:89:17 | call to puts | raise.rb:88:3:89:17 | ensure ... | | -| raise.rb:89:5:89:17 | self | raise.rb:89:11:89:16 | ensure | | -| raise.rb:89:10:89:17 | "ensure" | raise.rb:89:5:89:17 | call to puts | | -| raise.rb:89:10:89:17 | [ensure: exception] "ensure" | raise.rb:89:5:89:17 | [ensure: exception] call to puts | | -| raise.rb:89:10:89:17 | [ensure: return] "ensure" | raise.rb:89:5:89:17 | [ensure: return] call to puts | | -| raise.rb:89:11:89:16 | [ensure: exception] ensure | raise.rb:89:10:89:17 | [ensure: exception] "ensure" | | -| raise.rb:89:11:89:16 | [ensure: return] ensure | raise.rb:89:10:89:17 | [ensure: return] "ensure" | | +| raise.rb:88:3:89:17 | After ensure ... | raise.rb:79:1:92:3 | Exceptional Exit | exception | +| raise.rb:88:3:89:17 | After ensure ... | raise.rb:79:1:92:3 | Normal Exit | return | +| raise.rb:88:3:89:17 | After ensure ... | raise.rb:81:3:90:5 | After begin ... | | +| raise.rb:88:3:89:17 | ensure ... | raise.rb:89:5:89:17 | Before call to puts | | +| raise.rb:89:5:89:17 | After call to puts | raise.rb:88:3:89:17 | After ensure ... | | +| raise.rb:89:5:89:17 | Before call to puts | raise.rb:89:5:89:17 | self | | +| raise.rb:89:5:89:17 | call to puts | raise.rb:89:5:89:17 | After call to puts | | +| raise.rb:89:5:89:17 | self | raise.rb:89:10:89:17 | Before "ensure" | | +| raise.rb:89:10:89:17 | "ensure" | raise.rb:89:10:89:17 | After "ensure" | | +| raise.rb:89:10:89:17 | After "ensure" | raise.rb:89:5:89:17 | call to puts | | +| raise.rb:89:10:89:17 | Before "ensure" | raise.rb:89:11:89:16 | ensure | | | raise.rb:89:11:89:16 | ensure | raise.rb:89:10:89:17 | "ensure" | | -| raise.rb:91:3:91:15 | call to puts | raise.rb:79:1:92:3 | exit m8 (normal) | | -| raise.rb:91:3:91:15 | self | raise.rb:91:9:91:14 | End m8 | | -| raise.rb:91:8:91:15 | "End m8" | raise.rb:91:3:91:15 | call to puts | | +| raise.rb:91:3:91:15 | After call to puts | raise.rb:80:3:91:15 | After ... | | +| raise.rb:91:3:91:15 | Before call to puts | raise.rb:91:3:91:15 | self | | +| raise.rb:91:3:91:15 | call to puts | raise.rb:91:3:91:15 | After call to puts | | +| raise.rb:91:3:91:15 | self | raise.rb:91:8:91:15 | Before "End m8" | | +| raise.rb:91:8:91:15 | "End m8" | raise.rb:91:8:91:15 | After "End m8" | | +| raise.rb:91:8:91:15 | After "End m8" | raise.rb:91:3:91:15 | call to puts | | +| raise.rb:91:8:91:15 | Before "End m8" | raise.rb:91:9:91:14 | End m8 | | | raise.rb:91:9:91:14 | End m8 | raise.rb:91:8:91:15 | "End m8" | | -| raise.rb:94:1:119:3 | enter m9 | raise.rb:94:8:94:8 | x | | -| raise.rb:94:1:119:3 | exit m9 (abnormal) | raise.rb:94:1:119:3 | exit m9 | | -| raise.rb:94:1:119:3 | exit m9 (normal) | raise.rb:94:1:119:3 | exit m9 | | +| raise.rb:94:1:119:3 | Entry | raise.rb:94:8:94:8 | x | | +| raise.rb:94:1:119:3 | Exceptional Exit | raise.rb:94:1:119:3 | Exit | | +| raise.rb:94:1:119:3 | Normal Exit | raise.rb:94:1:119:3 | Exit | | | raise.rb:94:1:119:3 | m9 | raise.rb:121:1:126:3 | m10 | | | raise.rb:94:8:94:8 | x | raise.rb:94:11:94:12 | b1 | | | raise.rb:94:11:94:12 | b1 | raise.rb:94:15:94:16 | b2 | | -| raise.rb:94:15:94:16 | b2 | raise.rb:95:3:95:17 | self | | -| raise.rb:95:3:95:17 | call to puts | raise.rb:97:8:97:8 | x | | -| raise.rb:95:3:95:17 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:95:3:95:17 | self | raise.rb:95:9:95:16 | Begin m9 | | -| raise.rb:95:8:95:17 | "Begin m9" | raise.rb:95:3:95:17 | call to puts | | +| raise.rb:94:15:94:16 | b2 | raise.rb:95:3:118:5 | ... | | +| raise.rb:95:3:95:17 | After call to puts | raise.rb:96:3:112:5 | begin ... | | +| raise.rb:95:3:95:17 | Before call to puts | raise.rb:95:3:95:17 | self | | +| raise.rb:95:3:95:17 | call to puts | raise.rb:95:3:95:17 | After call to puts | | +| raise.rb:95:3:95:17 | call to puts | raise.rb:114:1:118:5 | ensure ... | exception | +| raise.rb:95:3:95:17 | self | raise.rb:95:8:95:17 | Before "Begin m9" | | +| raise.rb:95:3:118:5 | ... | raise.rb:95:3:95:17 | Before call to puts | | +| raise.rb:95:3:118:5 | After ... | raise.rb:94:1:119:3 | Normal Exit | | +| raise.rb:95:8:95:17 | "Begin m9" | raise.rb:95:8:95:17 | After "Begin m9" | | +| raise.rb:95:8:95:17 | After "Begin m9" | raise.rb:95:3:95:17 | call to puts | | +| raise.rb:95:8:95:17 | Before "Begin m9" | raise.rb:95:9:95:16 | Begin m9 | | | raise.rb:95:9:95:16 | Begin m9 | raise.rb:95:8:95:17 | "Begin m9" | | -| raise.rb:97:5:101:7 | if ... | raise.rb:102:5:102:22 | self | | +| raise.rb:96:3:112:5 | After begin ... | raise.rb:113:3:113:15 | Before call to puts | | +| raise.rb:96:3:112:5 | begin ... | raise.rb:97:5:101:7 | if ... | | +| raise.rb:97:5:101:7 | After if ... | raise.rb:102:5:102:22 | Before call to puts | | +| raise.rb:97:5:101:7 | if ... | raise.rb:97:8:97:12 | Before ... > ... | | | raise.rb:97:8:97:8 | x | raise.rb:97:12:97:12 | 2 | | -| raise.rb:97:8:97:12 | ... > ... | raise.rb:98:7:98:19 | self | true | -| raise.rb:97:8:97:12 | ... > ... | raise.rb:99:11:99:11 | x | false | -| raise.rb:97:8:97:12 | ... > ... | raise.rb:104:5:104:23 | [ensure: exception] self | exception | +| raise.rb:97:8:97:12 | ... > ... | raise.rb:97:8:97:12 | After ... > ... [false] | false | +| raise.rb:97:8:97:12 | ... > ... | raise.rb:97:8:97:12 | After ... > ... [true] | true | +| raise.rb:97:8:97:12 | ... > ... | raise.rb:103:3:111:7 | ensure ... | exception | +| raise.rb:97:8:97:12 | After ... > ... [false] | raise.rb:99:5:100:20 | elsif ... | | +| raise.rb:97:8:97:12 | After ... > ... [true] | raise.rb:97:13:98:19 | then ... | | +| raise.rb:97:8:97:12 | Before ... > ... | raise.rb:97:8:97:8 | x | | | raise.rb:97:12:97:12 | 2 | raise.rb:97:8:97:12 | ... > ... | | -| raise.rb:98:7:98:19 | call to raise | raise.rb:104:5:104:23 | [ensure: exception] self | exception | -| raise.rb:98:7:98:19 | self | raise.rb:98:14:98:18 | x > 2 | | -| raise.rb:98:13:98:19 | "x > 2" | raise.rb:98:7:98:19 | call to raise | | +| raise.rb:97:13:98:19 | then ... | raise.rb:98:7:98:19 | Before call to raise | | +| raise.rb:98:7:98:19 | Before call to raise | raise.rb:98:7:98:19 | self | | +| raise.rb:98:7:98:19 | call to raise | raise.rb:103:3:111:7 | ensure ... | exception | +| raise.rb:98:7:98:19 | self | raise.rb:98:13:98:19 | Before "x > 2" | | +| raise.rb:98:13:98:19 | "x > 2" | raise.rb:98:13:98:19 | After "x > 2" | | +| raise.rb:98:13:98:19 | After "x > 2" | raise.rb:98:7:98:19 | call to raise | | +| raise.rb:98:13:98:19 | Before "x > 2" | raise.rb:98:14:98:18 | x > 2 | | | raise.rb:98:14:98:18 | x > 2 | raise.rb:98:13:98:19 | "x > 2" | | -| raise.rb:99:5:100:20 | elsif ... | raise.rb:97:5:101:7 | if ... | | +| raise.rb:99:5:100:20 | After elsif ... | raise.rb:97:5:101:7 | After if ... | | +| raise.rb:99:5:100:20 | elsif ... | raise.rb:99:11:99:15 | Before ... < ... | | | raise.rb:99:11:99:11 | x | raise.rb:99:15:99:15 | 0 | | -| raise.rb:99:11:99:15 | ... < ... | raise.rb:99:5:100:20 | elsif ... | false | -| raise.rb:99:11:99:15 | ... < ... | raise.rb:100:15:100:19 | x < 0 | true | -| raise.rb:99:11:99:15 | ... < ... | raise.rb:104:5:104:23 | [ensure: exception] self | exception | +| raise.rb:99:11:99:15 | ... < ... | raise.rb:99:11:99:15 | After ... < ... [false] | false | +| raise.rb:99:11:99:15 | ... < ... | raise.rb:99:11:99:15 | After ... < ... [true] | true | +| raise.rb:99:11:99:15 | ... < ... | raise.rb:103:3:111:7 | ensure ... | exception | +| raise.rb:99:11:99:15 | After ... < ... [false] | raise.rb:99:5:100:20 | After elsif ... | | +| raise.rb:99:11:99:15 | After ... < ... [true] | raise.rb:99:16:100:20 | then ... | | +| raise.rb:99:11:99:15 | Before ... < ... | raise.rb:99:11:99:11 | x | | | raise.rb:99:15:99:15 | 0 | raise.rb:99:11:99:15 | ... < ... | | -| raise.rb:100:7:100:20 | return | raise.rb:104:5:104:23 | [ensure: return] self | return | -| raise.rb:100:14:100:20 | "x < 0" | raise.rb:100:7:100:20 | return | | +| raise.rb:99:16:100:20 | then ... | raise.rb:100:7:100:20 | Before return | | +| raise.rb:100:7:100:20 | Before return | raise.rb:100:14:100:20 | Before "x < 0" | | +| raise.rb:100:7:100:20 | return | raise.rb:103:3:111:7 | ensure ... | return | +| raise.rb:100:14:100:20 | "x < 0" | raise.rb:100:14:100:20 | After "x < 0" | | +| raise.rb:100:14:100:20 | After "x < 0" | raise.rb:100:7:100:20 | return | | +| raise.rb:100:14:100:20 | Before "x < 0" | raise.rb:100:15:100:19 | x < 0 | | | raise.rb:100:15:100:19 | x < 0 | raise.rb:100:14:100:20 | "x < 0" | | -| raise.rb:102:5:102:22 | call to puts | raise.rb:104:5:104:23 | [ensure: exception] self | exception | -| raise.rb:102:5:102:22 | call to puts | raise.rb:104:5:104:23 | self | | -| raise.rb:102:5:102:22 | self | raise.rb:102:11:102:21 | 0 <= x <= 2 | | -| raise.rb:102:10:102:22 | "0 <= x <= 2" | raise.rb:102:5:102:22 | call to puts | | +| raise.rb:102:5:102:22 | After call to puts | raise.rb:103:3:111:7 | ensure ... | | +| raise.rb:102:5:102:22 | Before call to puts | raise.rb:102:5:102:22 | self | | +| raise.rb:102:5:102:22 | call to puts | raise.rb:102:5:102:22 | After call to puts | | +| raise.rb:102:5:102:22 | call to puts | raise.rb:103:3:111:7 | ensure ... | exception | +| raise.rb:102:5:102:22 | self | raise.rb:102:10:102:22 | Before "0 <= x <= 2" | | +| raise.rb:102:10:102:22 | "0 <= x <= 2" | raise.rb:102:10:102:22 | After "0 <= x <= 2" | | +| raise.rb:102:10:102:22 | After "0 <= x <= 2" | raise.rb:102:5:102:22 | call to puts | | +| raise.rb:102:10:102:22 | Before "0 <= x <= 2" | raise.rb:102:11:102:21 | 0 <= x <= 2 | | | raise.rb:102:11:102:21 | 0 <= x <= 2 | raise.rb:102:10:102:22 | "0 <= x <= 2" | | -| raise.rb:103:3:111:7 | [ensure: exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:103:3:111:7 | [ensure: return] ensure ... | raise.rb:115:3:115:22 | [ensure: return] self | return | -| raise.rb:103:3:111:7 | ensure ... | raise.rb:113:3:113:15 | self | | -| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:106:10:106:11 | [ensure: exception] b1 | | -| raise.rb:104:5:104:23 | [ensure: exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:104:5:104:23 | [ensure: exception] self | raise.rb:104:11:104:22 | [ensure: exception] outer ensure | | -| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:106:10:106:11 | [ensure: return] b1 | | -| raise.rb:104:5:104:23 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:104:5:104:23 | [ensure: return] self | raise.rb:104:11:104:22 | [ensure: return] outer ensure | | -| raise.rb:104:5:104:23 | call to puts | raise.rb:106:10:106:11 | b1 | | -| raise.rb:104:5:104:23 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:104:5:104:23 | self | raise.rb:104:11:104:22 | outer ensure | | -| raise.rb:104:10:104:23 | "outer ensure" | raise.rb:104:5:104:23 | call to puts | | -| raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | raise.rb:104:5:104:23 | [ensure: exception] call to puts | | -| raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | raise.rb:104:5:104:23 | [ensure: return] call to puts | | -| raise.rb:104:11:104:22 | [ensure: exception] outer ensure | raise.rb:104:10:104:23 | [ensure: exception] "outer ensure" | | -| raise.rb:104:11:104:22 | [ensure: return] outer ensure | raise.rb:104:10:104:23 | [ensure: return] "outer ensure" | | +| raise.rb:103:3:111:7 | After ensure ... | raise.rb:96:3:112:5 | After begin ... | | +| raise.rb:103:3:111:7 | After ensure ... | raise.rb:114:1:118:5 | ensure ... | exception, return | +| raise.rb:103:3:111:7 | ensure ... | raise.rb:104:5:104:23 | Before call to puts | | +| raise.rb:104:5:104:23 | After call to puts | raise.rb:105:5:111:7 | begin ... | | +| raise.rb:104:5:104:23 | Before call to puts | raise.rb:104:5:104:23 | self | | +| raise.rb:104:5:104:23 | call to puts | raise.rb:104:5:104:23 | After call to puts | | +| raise.rb:104:5:104:23 | call to puts | raise.rb:114:1:118:5 | ensure ... | exception | +| raise.rb:104:5:104:23 | self | raise.rb:104:10:104:23 | Before "outer ensure" | | +| raise.rb:104:10:104:23 | "outer ensure" | raise.rb:104:10:104:23 | After "outer ensure" | | +| raise.rb:104:10:104:23 | After "outer ensure" | raise.rb:104:5:104:23 | call to puts | | +| raise.rb:104:10:104:23 | Before "outer ensure" | raise.rb:104:11:104:22 | outer ensure | | | raise.rb:104:11:104:22 | outer ensure | raise.rb:104:10:104:23 | "outer ensure" | | -| raise.rb:106:7:108:9 | [ensure: exception] if ... | raise.rb:110:7:110:25 | [ensure: exception] self | | -| raise.rb:106:7:108:9 | [ensure: return] if ... | raise.rb:110:7:110:25 | [ensure: return] self | | -| raise.rb:106:7:108:9 | if ... | raise.rb:110:7:110:25 | self | | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:106:7:108:9 | [ensure: exception] if ... | false | -| raise.rb:106:10:106:11 | [ensure: exception] b1 | raise.rb:107:9:107:26 | [ensure: exception] self | true | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:106:7:108:9 | [ensure: return] if ... | false | -| raise.rb:106:10:106:11 | [ensure: return] b1 | raise.rb:107:9:107:26 | [ensure: return] self | true | -| raise.rb:106:10:106:11 | b1 | raise.rb:106:7:108:9 | if ... | false | -| raise.rb:106:10:106:11 | b1 | raise.rb:107:9:107:26 | self | true | -| raise.rb:107:9:107:26 | [ensure: exception] call to raise | raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] self | exception | -| raise.rb:107:9:107:26 | [ensure: exception] self | raise.rb:107:16:107:25 | [ensure: exception] b1 is true | | -| raise.rb:107:9:107:26 | [ensure: return] call to raise | raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] self | exception | -| raise.rb:107:9:107:26 | [ensure: return] self | raise.rb:107:16:107:25 | [ensure: return] b1 is true | | -| raise.rb:107:9:107:26 | call to raise | raise.rb:110:7:110:25 | [ensure(1): exception] self | exception | -| raise.rb:107:9:107:26 | self | raise.rb:107:16:107:25 | b1 is true | | -| raise.rb:107:15:107:26 | "b1 is true" | raise.rb:107:9:107:26 | call to raise | | -| raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | raise.rb:107:9:107:26 | [ensure: exception] call to raise | | -| raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | raise.rb:107:9:107:26 | [ensure: return] call to raise | | -| raise.rb:107:16:107:25 | [ensure: exception] b1 is true | raise.rb:107:15:107:26 | [ensure: exception] "b1 is true" | | -| raise.rb:107:16:107:25 | [ensure: return] b1 is true | raise.rb:107:15:107:26 | [ensure: return] "b1 is true" | | +| raise.rb:105:5:111:7 | After begin ... | raise.rb:103:3:111:7 | After ensure ... | | +| raise.rb:105:5:111:7 | begin ... | raise.rb:106:7:108:9 | if ... | | +| raise.rb:106:7:108:9 | After if ... | raise.rb:109:5:110:25 | ensure ... | | +| raise.rb:106:7:108:9 | if ... | raise.rb:106:10:106:11 | b1 | | +| raise.rb:106:10:106:11 | After b1 [false] | raise.rb:106:7:108:9 | After if ... | | +| raise.rb:106:10:106:11 | After b1 [true] | raise.rb:106:12:107:26 | then ... | | +| raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | After b1 [false] | false | +| raise.rb:106:10:106:11 | b1 | raise.rb:106:10:106:11 | After b1 [true] | true | +| raise.rb:106:12:107:26 | then ... | raise.rb:107:9:107:26 | Before call to raise | | +| raise.rb:107:9:107:26 | Before call to raise | raise.rb:107:9:107:26 | self | | +| raise.rb:107:9:107:26 | call to raise | raise.rb:109:5:110:25 | ensure ... | exception | +| raise.rb:107:9:107:26 | self | raise.rb:107:15:107:26 | Before "b1 is true" | | +| raise.rb:107:15:107:26 | "b1 is true" | raise.rb:107:15:107:26 | After "b1 is true" | | +| raise.rb:107:15:107:26 | After "b1 is true" | raise.rb:107:9:107:26 | call to raise | | +| raise.rb:107:15:107:26 | Before "b1 is true" | raise.rb:107:16:107:25 | b1 is true | | | raise.rb:107:16:107:25 | b1 is true | raise.rb:107:15:107:26 | "b1 is true" | | -| raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:109:5:110:25 | [ensure: exception] ensure ... | raise.rb:103:3:111:7 | [ensure: exception] ensure ... | | -| raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:109:5:110:25 | [ensure: return] ensure ... | raise.rb:103:3:111:7 | [ensure: return] ensure ... | | -| raise.rb:109:5:110:25 | ensure ... | raise.rb:103:3:111:7 | ensure ... | | -| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure(1): exception] ensure ... | | -| raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | [ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure(1): exception] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure: exception, ensure(1): exception] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure: exception, ensure(1): exception] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:109:5:110:25 | [ensure: exception] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | [ensure: exception] self | raise.rb:110:13:110:24 | [ensure: exception] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:109:5:110:25 | [ensure: return, ensure(1): exception] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] self | raise.rb:110:13:110:24 | [ensure: return, ensure(1): exception] inner ensure | | -| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:109:5:110:25 | [ensure: return] ensure ... | | -| raise.rb:110:7:110:25 | [ensure: return] call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | [ensure: return] self | raise.rb:110:13:110:24 | [ensure: return] inner ensure | | -| raise.rb:110:7:110:25 | call to puts | raise.rb:109:5:110:25 | ensure ... | | -| raise.rb:110:7:110:25 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:110:7:110:25 | self | raise.rb:110:13:110:24 | inner ensure | | -| raise.rb:110:12:110:25 | "inner ensure" | raise.rb:110:7:110:25 | call to puts | | -| raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure(1): exception] call to puts | | -| raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: exception, ensure(1): exception] call to puts | | -| raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: exception] call to puts | | -| raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | raise.rb:110:7:110:25 | [ensure: return, ensure(1): exception] call to puts | | -| raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | raise.rb:110:7:110:25 | [ensure: return] call to puts | | -| raise.rb:110:13:110:24 | [ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure(1): exception] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: exception, ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure: exception, ensure(1): exception] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: exception] inner ensure | raise.rb:110:12:110:25 | [ensure: exception] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: return, ensure(1): exception] inner ensure | raise.rb:110:12:110:25 | [ensure: return, ensure(1): exception] "inner ensure" | | -| raise.rb:110:13:110:24 | [ensure: return] inner ensure | raise.rb:110:12:110:25 | [ensure: return] "inner ensure" | | +| raise.rb:109:5:110:25 | After ensure ... | raise.rb:105:5:111:7 | After begin ... | | +| raise.rb:109:5:110:25 | After ensure ... | raise.rb:114:1:118:5 | ensure ... | exception | +| raise.rb:109:5:110:25 | ensure ... | raise.rb:110:7:110:25 | Before call to puts | | +| raise.rb:110:7:110:25 | After call to puts | raise.rb:109:5:110:25 | After ensure ... | | +| raise.rb:110:7:110:25 | Before call to puts | raise.rb:110:7:110:25 | self | | +| raise.rb:110:7:110:25 | call to puts | raise.rb:110:7:110:25 | After call to puts | | +| raise.rb:110:7:110:25 | call to puts | raise.rb:114:1:118:5 | ensure ... | exception | +| raise.rb:110:7:110:25 | self | raise.rb:110:12:110:25 | Before "inner ensure" | | +| raise.rb:110:12:110:25 | "inner ensure" | raise.rb:110:12:110:25 | After "inner ensure" | | +| raise.rb:110:12:110:25 | After "inner ensure" | raise.rb:110:7:110:25 | call to puts | | +| raise.rb:110:12:110:25 | Before "inner ensure" | raise.rb:110:13:110:24 | inner ensure | | | raise.rb:110:13:110:24 | inner ensure | raise.rb:110:12:110:25 | "inner ensure" | | -| raise.rb:113:3:113:15 | call to puts | raise.rb:115:3:115:22 | [ensure: exception] self | exception | -| raise.rb:113:3:113:15 | call to puts | raise.rb:115:3:115:22 | self | | -| raise.rb:113:3:113:15 | self | raise.rb:113:9:113:14 | End m9 | | -| raise.rb:113:8:113:15 | "End m9" | raise.rb:113:3:113:15 | call to puts | | +| raise.rb:113:3:113:15 | After call to puts | raise.rb:114:1:118:5 | ensure ... | | +| raise.rb:113:3:113:15 | Before call to puts | raise.rb:113:3:113:15 | self | | +| raise.rb:113:3:113:15 | call to puts | raise.rb:113:3:113:15 | After call to puts | | +| raise.rb:113:3:113:15 | call to puts | raise.rb:114:1:118:5 | ensure ... | exception | +| raise.rb:113:3:113:15 | self | raise.rb:113:8:113:15 | Before "End m9" | | +| raise.rb:113:8:113:15 | "End m9" | raise.rb:113:8:113:15 | After "End m9" | | +| raise.rb:113:8:113:15 | After "End m9" | raise.rb:113:3:113:15 | call to puts | | +| raise.rb:113:8:113:15 | Before "End m9" | raise.rb:113:9:113:14 | End m9 | | | raise.rb:113:9:113:14 | End m9 | raise.rb:113:8:113:15 | "End m9" | | -| raise.rb:114:1:118:5 | [ensure: exception] ensure ... | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | -| raise.rb:114:1:118:5 | [ensure: return] ensure ... | raise.rb:94:1:119:3 | exit m9 (normal) | return | -| raise.rb:114:1:118:5 | ensure ... | raise.rb:94:1:119:3 | exit m9 (normal) | | -| raise.rb:115:3:115:22 | [ensure: exception] call to puts | raise.rb:116:6:116:7 | [ensure: exception] b2 | | -| raise.rb:115:3:115:22 | [ensure: exception] self | raise.rb:115:9:115:21 | [ensure: exception] method ensure | | -| raise.rb:115:3:115:22 | [ensure: return] call to puts | raise.rb:116:6:116:7 | [ensure: return] b2 | | -| raise.rb:115:3:115:22 | [ensure: return] self | raise.rb:115:9:115:21 | [ensure: return] method ensure | | -| raise.rb:115:3:115:22 | call to puts | raise.rb:116:6:116:7 | b2 | | -| raise.rb:115:3:115:22 | self | raise.rb:115:9:115:21 | method ensure | | -| raise.rb:115:8:115:22 | "method ensure" | raise.rb:115:3:115:22 | call to puts | | -| raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | raise.rb:115:3:115:22 | [ensure: exception] call to puts | | -| raise.rb:115:8:115:22 | [ensure: return] "method ensure" | raise.rb:115:3:115:22 | [ensure: return] call to puts | | -| raise.rb:115:9:115:21 | [ensure: exception] method ensure | raise.rb:115:8:115:22 | [ensure: exception] "method ensure" | | -| raise.rb:115:9:115:21 | [ensure: return] method ensure | raise.rb:115:8:115:22 | [ensure: return] "method ensure" | | +| raise.rb:114:1:118:5 | After ensure ... | raise.rb:94:1:119:3 | Exceptional Exit | exception | +| raise.rb:114:1:118:5 | After ensure ... | raise.rb:94:1:119:3 | Normal Exit | return | +| raise.rb:114:1:118:5 | After ensure ... | raise.rb:95:3:118:5 | After ... | | +| raise.rb:114:1:118:5 | ensure ... | raise.rb:115:3:115:22 | Before call to puts | | +| raise.rb:115:3:115:22 | After call to puts | raise.rb:116:3:118:5 | if ... | | +| raise.rb:115:3:115:22 | Before call to puts | raise.rb:115:3:115:22 | self | | +| raise.rb:115:3:115:22 | call to puts | raise.rb:115:3:115:22 | After call to puts | | +| raise.rb:115:3:115:22 | self | raise.rb:115:8:115:22 | Before "method ensure" | | +| raise.rb:115:8:115:22 | "method ensure" | raise.rb:115:8:115:22 | After "method ensure" | | +| raise.rb:115:8:115:22 | After "method ensure" | raise.rb:115:3:115:22 | call to puts | | +| raise.rb:115:8:115:22 | Before "method ensure" | raise.rb:115:9:115:21 | method ensure | | | raise.rb:115:9:115:21 | method ensure | raise.rb:115:8:115:22 | "method ensure" | | -| raise.rb:116:3:118:5 | [ensure: exception] if ... | raise.rb:114:1:118:5 | [ensure: exception] ensure ... | | -| raise.rb:116:3:118:5 | [ensure: return] if ... | raise.rb:114:1:118:5 | [ensure: return] ensure ... | | -| raise.rb:116:3:118:5 | if ... | raise.rb:114:1:118:5 | ensure ... | | -| raise.rb:116:6:116:7 | [ensure: exception] b2 | raise.rb:116:3:118:5 | [ensure: exception] if ... | false | -| raise.rb:116:6:116:7 | [ensure: exception] b2 | raise.rb:117:5:117:22 | [ensure: exception] self | true | -| raise.rb:116:6:116:7 | [ensure: return] b2 | raise.rb:116:3:118:5 | [ensure: return] if ... | false | -| raise.rb:116:6:116:7 | [ensure: return] b2 | raise.rb:117:5:117:22 | [ensure: return] self | true | -| raise.rb:116:6:116:7 | b2 | raise.rb:116:3:118:5 | if ... | false | -| raise.rb:116:6:116:7 | b2 | raise.rb:117:5:117:22 | self | true | -| raise.rb:117:5:117:22 | [ensure: exception] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | -| raise.rb:117:5:117:22 | [ensure: exception] self | raise.rb:117:12:117:21 | [ensure: exception] b2 is true | | -| raise.rb:117:5:117:22 | [ensure: return] call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | -| raise.rb:117:5:117:22 | [ensure: return] self | raise.rb:117:12:117:21 | [ensure: return] b2 is true | | -| raise.rb:117:5:117:22 | call to raise | raise.rb:94:1:119:3 | exit m9 (abnormal) | exception | -| raise.rb:117:5:117:22 | self | raise.rb:117:12:117:21 | b2 is true | | -| raise.rb:117:11:117:22 | "b2 is true" | raise.rb:117:5:117:22 | call to raise | | -| raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | raise.rb:117:5:117:22 | [ensure: exception] call to raise | | -| raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | raise.rb:117:5:117:22 | [ensure: return] call to raise | | -| raise.rb:117:12:117:21 | [ensure: exception] b2 is true | raise.rb:117:11:117:22 | [ensure: exception] "b2 is true" | | -| raise.rb:117:12:117:21 | [ensure: return] b2 is true | raise.rb:117:11:117:22 | [ensure: return] "b2 is true" | | +| raise.rb:116:3:118:5 | After if ... | raise.rb:114:1:118:5 | After ensure ... | | +| raise.rb:116:3:118:5 | if ... | raise.rb:116:6:116:7 | b2 | | +| raise.rb:116:6:116:7 | After b2 [false] | raise.rb:116:3:118:5 | After if ... | | +| raise.rb:116:6:116:7 | After b2 [true] | raise.rb:116:8:117:22 | then ... | | +| raise.rb:116:6:116:7 | b2 | raise.rb:116:6:116:7 | After b2 [false] | false | +| raise.rb:116:6:116:7 | b2 | raise.rb:116:6:116:7 | After b2 [true] | true | +| raise.rb:116:8:117:22 | then ... | raise.rb:117:5:117:22 | Before call to raise | | +| raise.rb:117:5:117:22 | Before call to raise | raise.rb:117:5:117:22 | self | | +| raise.rb:117:5:117:22 | call to raise | raise.rb:94:1:119:3 | Exceptional Exit | exception | +| raise.rb:117:5:117:22 | self | raise.rb:117:11:117:22 | Before "b2 is true" | | +| raise.rb:117:11:117:22 | "b2 is true" | raise.rb:117:11:117:22 | After "b2 is true" | | +| raise.rb:117:11:117:22 | After "b2 is true" | raise.rb:117:5:117:22 | call to raise | | +| raise.rb:117:11:117:22 | Before "b2 is true" | raise.rb:117:12:117:21 | b2 is true | | | raise.rb:117:12:117:21 | b2 is true | raise.rb:117:11:117:22 | "b2 is true" | | -| raise.rb:121:1:126:3 | enter m10 | raise.rb:121:9:121:9 | p | | -| raise.rb:121:1:126:3 | exit m10 (abnormal) | raise.rb:121:1:126:3 | exit m10 | | -| raise.rb:121:1:126:3 | exit m10 (normal) | raise.rb:121:1:126:3 | exit m10 | | +| raise.rb:121:1:126:3 | Entry | raise.rb:121:9:121:9 | p | | +| raise.rb:121:1:126:3 | Exceptional Exit | raise.rb:121:1:126:3 | Exit | | +| raise.rb:121:1:126:3 | Normal Exit | raise.rb:121:1:126:3 | Exit | | | raise.rb:121:1:126:3 | m10 | raise.rb:128:1:140:3 | m11 | | -| raise.rb:121:9:121:9 | p | raise.rb:121:14:121:30 | self | false, no-match, true | -| raise.rb:121:9:121:9 | p | raise.rb:125:3:125:51 | self | match | -| raise.rb:121:14:121:30 | call to raise | raise.rb:121:1:126:3 | exit m10 (abnormal) | exception | -| raise.rb:121:14:121:30 | self | raise.rb:121:21:121:29 | Exception | | -| raise.rb:121:20:121:30 | "Exception" | raise.rb:121:14:121:30 | call to raise | | +| raise.rb:121:9:121:9 | After p [match] | raise.rb:122:1:125:51 | ... | | +| raise.rb:121:9:121:9 | After p [no-match] | raise.rb:121:13:121:31 | ( ... ) | | +| raise.rb:121:9:121:9 | p | raise.rb:121:9:121:9 | After p [match] | match | +| raise.rb:121:9:121:9 | p | raise.rb:121:9:121:9 | After p [no-match] | no-match | +| raise.rb:121:13:121:31 | ( ... ) | raise.rb:121:14:121:30 | Before call to raise | | +| raise.rb:121:14:121:30 | Before call to raise | raise.rb:121:14:121:30 | self | | +| raise.rb:121:14:121:30 | call to raise | raise.rb:121:1:126:3 | Exceptional Exit | exception | +| raise.rb:121:14:121:30 | self | raise.rb:121:20:121:30 | Before "Exception" | | +| raise.rb:121:20:121:30 | "Exception" | raise.rb:121:20:121:30 | After "Exception" | | +| raise.rb:121:20:121:30 | After "Exception" | raise.rb:121:14:121:30 | call to raise | | +| raise.rb:121:20:121:30 | Before "Exception" | raise.rb:121:21:121:29 | Exception | | | raise.rb:121:21:121:29 | Exception | raise.rb:121:20:121:30 | "Exception" | | -| raise.rb:124:1:125:51 | ensure ... | raise.rb:121:1:126:3 | exit m10 (normal) | | -| raise.rb:125:3:125:51 | call to puts | raise.rb:124:1:125:51 | ensure ... | | -| raise.rb:125:3:125:51 | self | raise.rb:125:9:125:50 | Will not get executed if p is not supplied | | -| raise.rb:125:8:125:51 | "Will not get executed if p is..." | raise.rb:125:3:125:51 | call to puts | | +| raise.rb:122:1:125:51 | ... | raise.rb:124:1:125:51 | ensure ... | | +| raise.rb:122:1:125:51 | After ... | raise.rb:121:1:126:3 | Normal Exit | | +| raise.rb:124:1:125:51 | After ensure ... | raise.rb:122:1:125:51 | After ... | | +| raise.rb:124:1:125:51 | ensure ... | raise.rb:125:3:125:51 | Before call to puts | | +| raise.rb:125:3:125:51 | After call to puts | raise.rb:124:1:125:51 | After ensure ... | | +| raise.rb:125:3:125:51 | Before call to puts | raise.rb:125:3:125:51 | self | | +| raise.rb:125:3:125:51 | call to puts | raise.rb:125:3:125:51 | After call to puts | | +| raise.rb:125:3:125:51 | self | raise.rb:125:8:125:51 | Before "Will not get executed if p is..." | | +| raise.rb:125:8:125:51 | "Will not get executed if p is..." | raise.rb:125:8:125:51 | After "Will not get executed if p is..." | | +| raise.rb:125:8:125:51 | After "Will not get executed if p is..." | raise.rb:125:3:125:51 | call to puts | | +| raise.rb:125:8:125:51 | Before "Will not get executed if p is..." | raise.rb:125:9:125:50 | Will not get executed if p is not supplied | | | raise.rb:125:9:125:50 | Will not get executed if p is not supplied | raise.rb:125:8:125:51 | "Will not get executed if p is..." | | -| raise.rb:128:1:140:3 | enter m11 | raise.rb:128:9:128:9 | b | | -| raise.rb:128:1:140:3 | exit m11 (abnormal) | raise.rb:128:1:140:3 | exit m11 | | -| raise.rb:128:1:140:3 | exit m11 (normal) | raise.rb:128:1:140:3 | exit m11 | | +| raise.rb:128:1:140:3 | Entry | raise.rb:128:9:128:9 | b | | +| raise.rb:128:1:140:3 | Exceptional Exit | raise.rb:128:1:140:3 | Exit | | +| raise.rb:128:1:140:3 | Normal Exit | raise.rb:128:1:140:3 | Exit | | | raise.rb:128:1:140:3 | m11 | raise.rb:142:1:148:3 | m12 | | -| raise.rb:128:9:128:9 | b | raise.rb:130:8:130:8 | b | | -| raise.rb:130:5:132:7 | if ... | raise.rb:137:5:137:17 | self | | -| raise.rb:130:8:130:8 | b | raise.rb:130:5:132:7 | if ... | false | -| raise.rb:130:8:130:8 | b | raise.rb:131:7:131:22 | self | true | -| raise.rb:131:7:131:22 | call to raise | raise.rb:133:10:133:19 | ExceptionA | exception | +| raise.rb:128:9:128:9 | b | raise.rb:129:3:139:16 | ... | | +| raise.rb:129:3:138:5 | After begin ... | raise.rb:139:3:139:16 | Before call to puts | | +| raise.rb:129:3:138:5 | begin ... | raise.rb:130:5:132:7 | if ... | | +| raise.rb:129:3:139:16 | ... | raise.rb:129:3:138:5 | begin ... | | +| raise.rb:129:3:139:16 | After ... | raise.rb:128:1:140:3 | Normal Exit | | +| raise.rb:130:5:132:7 | After if ... | raise.rb:136:3:137:17 | ensure ... | | +| raise.rb:130:5:132:7 | if ... | raise.rb:130:8:130:8 | b | | +| raise.rb:130:8:130:8 | After b [false] | raise.rb:130:5:132:7 | After if ... | | +| raise.rb:130:8:130:8 | After b [true] | raise.rb:130:9:131:22 | then ... | | +| raise.rb:130:8:130:8 | b | raise.rb:130:8:130:8 | After b [false] | false | +| raise.rb:130:8:130:8 | b | raise.rb:130:8:130:8 | After b [true] | true | +| raise.rb:130:9:131:22 | then ... | raise.rb:131:7:131:22 | Before call to raise | | +| raise.rb:131:7:131:22 | Before call to raise | raise.rb:131:7:131:22 | self | | +| raise.rb:131:7:131:22 | call to raise | raise.rb:133:3:133:19 | rescue ... | exception | | raise.rb:131:7:131:22 | self | raise.rb:131:13:131:22 | ExceptionA | | | raise.rb:131:13:131:22 | ExceptionA | raise.rb:131:7:131:22 | call to raise | | -| raise.rb:133:3:133:19 | rescue ... | raise.rb:137:5:137:17 | self | | -| raise.rb:133:10:133:19 | ExceptionA | raise.rb:133:3:133:19 | rescue ... | match | -| raise.rb:133:10:133:19 | ExceptionA | raise.rb:134:10:134:19 | ExceptionB | no-match | -| raise.rb:134:3:135:21 | rescue ... | raise.rb:137:5:137:17 | self | | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:135:5:135:21 | self | match | -| raise.rb:134:10:134:19 | ExceptionB | raise.rb:137:5:137:17 | [ensure: exception] self | exception | -| raise.rb:134:20:135:21 | then ... | raise.rb:134:3:135:21 | rescue ... | | -| raise.rb:135:5:135:21 | call to puts | raise.rb:134:20:135:21 | then ... | | -| raise.rb:135:5:135:21 | self | raise.rb:135:11:135:20 | ExceptionB | | -| raise.rb:135:10:135:21 | "ExceptionB" | raise.rb:135:5:135:21 | call to puts | | +| raise.rb:133:3:133:19 | After rescue ... [no-match] | raise.rb:134:3:135:21 | rescue ... | | +| raise.rb:133:3:133:19 | [CatchClauseEmptyBody] rescue ... | raise.rb:136:3:137:17 | ensure ... | | +| raise.rb:133:3:133:19 | rescue ... | raise.rb:133:10:133:19 | ExceptionA | | +| raise.rb:133:10:133:19 | After ExceptionA [match] | raise.rb:133:3:133:19 | [CatchClauseEmptyBody] rescue ... | | +| raise.rb:133:10:133:19 | After ExceptionA [no-match] | raise.rb:133:3:133:19 | After rescue ... [no-match] | no-match | +| raise.rb:133:10:133:19 | ExceptionA | raise.rb:133:10:133:19 | After ExceptionA [match] | match | +| raise.rb:133:10:133:19 | ExceptionA | raise.rb:133:10:133:19 | After ExceptionA [no-match] | no-match | +| raise.rb:134:3:135:21 | After rescue ... [no-match] | raise.rb:136:3:137:17 | ensure ... | exception | +| raise.rb:134:3:135:21 | rescue ... | raise.rb:134:10:134:19 | ExceptionB | | +| raise.rb:134:10:134:19 | After ExceptionB [match] | raise.rb:134:20:135:21 | then ... | | +| raise.rb:134:10:134:19 | After ExceptionB [no-match] | raise.rb:134:3:135:21 | After rescue ... [no-match] | no-match | +| raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | After ExceptionB [match] | match | +| raise.rb:134:10:134:19 | ExceptionB | raise.rb:134:10:134:19 | After ExceptionB [no-match] | no-match | +| raise.rb:134:20:135:21 | After then ... | raise.rb:136:3:137:17 | ensure ... | | +| raise.rb:134:20:135:21 | then ... | raise.rb:135:5:135:21 | Before call to puts | | +| raise.rb:135:5:135:21 | After call to puts | raise.rb:134:20:135:21 | After then ... | | +| raise.rb:135:5:135:21 | Before call to puts | raise.rb:135:5:135:21 | self | | +| raise.rb:135:5:135:21 | call to puts | raise.rb:135:5:135:21 | After call to puts | | +| raise.rb:135:5:135:21 | self | raise.rb:135:10:135:21 | Before "ExceptionB" | | +| raise.rb:135:10:135:21 | "ExceptionB" | raise.rb:135:10:135:21 | After "ExceptionB" | | +| raise.rb:135:10:135:21 | After "ExceptionB" | raise.rb:135:5:135:21 | call to puts | | +| raise.rb:135:10:135:21 | Before "ExceptionB" | raise.rb:135:11:135:20 | ExceptionB | | | raise.rb:135:11:135:20 | ExceptionB | raise.rb:135:10:135:21 | "ExceptionB" | | -| raise.rb:136:3:137:17 | [ensure: exception] ensure ... | raise.rb:128:1:140:3 | exit m11 (abnormal) | exception | -| raise.rb:136:3:137:17 | ensure ... | raise.rb:139:3:139:16 | self | | -| raise.rb:137:5:137:17 | [ensure: exception] call to puts | raise.rb:136:3:137:17 | [ensure: exception] ensure ... | | -| raise.rb:137:5:137:17 | [ensure: exception] self | raise.rb:137:11:137:16 | [ensure: exception] Ensure | | -| raise.rb:137:5:137:17 | call to puts | raise.rb:136:3:137:17 | ensure ... | | -| raise.rb:137:5:137:17 | self | raise.rb:137:11:137:16 | Ensure | | -| raise.rb:137:10:137:17 | "Ensure" | raise.rb:137:5:137:17 | call to puts | | -| raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | raise.rb:137:5:137:17 | [ensure: exception] call to puts | | +| raise.rb:136:3:137:17 | After ensure ... | raise.rb:128:1:140:3 | Exceptional Exit | exception | +| raise.rb:136:3:137:17 | After ensure ... | raise.rb:129:3:138:5 | After begin ... | | +| raise.rb:136:3:137:17 | ensure ... | raise.rb:137:5:137:17 | Before call to puts | | +| raise.rb:137:5:137:17 | After call to puts | raise.rb:136:3:137:17 | After ensure ... | | +| raise.rb:137:5:137:17 | Before call to puts | raise.rb:137:5:137:17 | self | | +| raise.rb:137:5:137:17 | call to puts | raise.rb:137:5:137:17 | After call to puts | | +| raise.rb:137:5:137:17 | self | raise.rb:137:10:137:17 | Before "Ensure" | | +| raise.rb:137:10:137:17 | "Ensure" | raise.rb:137:10:137:17 | After "Ensure" | | +| raise.rb:137:10:137:17 | After "Ensure" | raise.rb:137:5:137:17 | call to puts | | +| raise.rb:137:10:137:17 | Before "Ensure" | raise.rb:137:11:137:16 | Ensure | | | raise.rb:137:11:137:16 | Ensure | raise.rb:137:10:137:17 | "Ensure" | | -| raise.rb:137:11:137:16 | [ensure: exception] Ensure | raise.rb:137:10:137:17 | [ensure: exception] "Ensure" | | -| raise.rb:139:3:139:16 | call to puts | raise.rb:128:1:140:3 | exit m11 (normal) | | -| raise.rb:139:3:139:16 | self | raise.rb:139:9:139:15 | End m11 | | -| raise.rb:139:8:139:16 | "End m11" | raise.rb:139:3:139:16 | call to puts | | +| raise.rb:139:3:139:16 | After call to puts | raise.rb:129:3:139:16 | After ... | | +| raise.rb:139:3:139:16 | Before call to puts | raise.rb:139:3:139:16 | self | | +| raise.rb:139:3:139:16 | call to puts | raise.rb:139:3:139:16 | After call to puts | | +| raise.rb:139:3:139:16 | self | raise.rb:139:8:139:16 | Before "End m11" | | +| raise.rb:139:8:139:16 | "End m11" | raise.rb:139:8:139:16 | After "End m11" | | +| raise.rb:139:8:139:16 | After "End m11" | raise.rb:139:3:139:16 | call to puts | | +| raise.rb:139:8:139:16 | Before "End m11" | raise.rb:139:9:139:15 | End m11 | | | raise.rb:139:9:139:15 | End m11 | raise.rb:139:8:139:16 | "End m11" | | -| raise.rb:142:1:148:3 | enter m12 | raise.rb:142:9:142:9 | b | | -| raise.rb:142:1:148:3 | exit m12 (normal) | raise.rb:142:1:148:3 | exit m12 | | +| raise.rb:142:1:148:3 | Entry | raise.rb:142:9:142:9 | b | | +| raise.rb:142:1:148:3 | Normal Exit | raise.rb:142:1:148:3 | Exit | | | raise.rb:142:1:148:3 | m12 | raise.rb:150:1:152:3 | m13 | | -| raise.rb:142:9:142:9 | b | raise.rb:143:6:143:6 | b | | -| raise.rb:143:3:145:5 | if ... | raise.rb:147:10:147:10 | 3 | | -| raise.rb:143:6:143:6 | b | raise.rb:143:3:145:5 | if ... | false | -| raise.rb:143:6:143:6 | b | raise.rb:144:5:144:12 | self | true | -| raise.rb:144:5:144:12 | call to raise | raise.rb:147:10:147:10 | [ensure: exception] 3 | exception | +| raise.rb:142:9:142:9 | b | raise.rb:143:3:147:10 | ... | | +| raise.rb:143:3:145:5 | After if ... | raise.rb:146:1:147:10 | ensure ... | | +| raise.rb:143:3:145:5 | if ... | raise.rb:143:6:143:6 | b | | +| raise.rb:143:3:147:10 | ... | raise.rb:143:3:145:5 | if ... | | +| raise.rb:143:6:143:6 | After b [false] | raise.rb:143:3:145:5 | After if ... | | +| raise.rb:143:6:143:6 | After b [true] | raise.rb:143:7:144:12 | then ... | | +| raise.rb:143:6:143:6 | b | raise.rb:143:6:143:6 | After b [false] | false | +| raise.rb:143:6:143:6 | b | raise.rb:143:6:143:6 | After b [true] | true | +| raise.rb:143:7:144:12 | then ... | raise.rb:144:5:144:12 | Before call to raise | | +| raise.rb:144:5:144:12 | Before call to raise | raise.rb:144:5:144:12 | self | | +| raise.rb:144:5:144:12 | call to raise | raise.rb:146:1:147:10 | ensure ... | exception | | raise.rb:144:5:144:12 | self | raise.rb:144:11:144:12 | "" | | | raise.rb:144:11:144:12 | "" | raise.rb:144:5:144:12 | call to raise | | -| raise.rb:147:3:147:10 | [ensure: exception] return | raise.rb:142:1:148:3 | exit m12 (normal) | return | -| raise.rb:147:3:147:10 | return | raise.rb:142:1:148:3 | exit m12 (normal) | return | +| raise.rb:146:1:147:10 | ensure ... | raise.rb:147:3:147:10 | Before return | | +| raise.rb:147:3:147:10 | Before return | raise.rb:147:10:147:10 | 3 | | +| raise.rb:147:3:147:10 | return | raise.rb:142:1:148:3 | Normal Exit | return | | raise.rb:147:10:147:10 | 3 | raise.rb:147:3:147:10 | return | | -| raise.rb:147:10:147:10 | [ensure: exception] 3 | raise.rb:147:3:147:10 | [ensure: exception] return | | -| raise.rb:150:1:152:3 | enter m13 | raise.rb:151:1:151:6 | ensure ... | | -| raise.rb:150:1:152:3 | exit m13 (normal) | raise.rb:150:1:152:3 | exit m13 | | +| raise.rb:150:1:152:3 | Entry | raise.rb:151:1:151:6 | ... | | +| raise.rb:150:1:152:3 | Normal Exit | raise.rb:150:1:152:3 | Exit | | | raise.rb:150:1:152:3 | m13 | raise.rb:154:1:156:3 | m14 | | -| raise.rb:151:1:151:6 | ensure ... | raise.rb:150:1:152:3 | exit m13 (normal) | | -| raise.rb:154:1:156:3 | enter m14 | raise.rb:154:9:154:15 | element | | -| raise.rb:154:1:156:3 | exit m14 (normal) | raise.rb:154:1:156:3 | exit m14 | | +| raise.rb:151:1:151:6 | ... | raise.rb:151:1:151:6 | ensure ... | | +| raise.rb:151:1:151:6 | After ... | raise.rb:150:1:152:3 | Normal Exit | | +| raise.rb:151:1:151:6 | ensure ... | raise.rb:151:1:151:6 | After ... | | +| raise.rb:154:1:156:3 | Entry | raise.rb:154:9:154:15 | element | | +| raise.rb:154:1:156:3 | Normal Exit | raise.rb:154:1:156:3 | Exit | | | raise.rb:154:1:156:3 | m14 | raise.rb:158:1:164:3 | m15 | | -| raise.rb:154:9:154:15 | element | raise.rb:155:3:155:9 | element | | +| raise.rb:154:9:154:15 | element | raise.rb:155:3:155:50 | ... | | | raise.rb:155:3:155:9 | element | raise.rb:155:16:155:50 | { ... } | | -| raise.rb:155:3:155:50 | call to each | raise.rb:154:1:156:3 | exit m14 (normal) | | -| raise.rb:155:16:155:50 | enter { ... } | raise.rb:155:19:155:22 | elem | | -| raise.rb:155:16:155:50 | exit { ... } (abnormal) | raise.rb:155:16:155:50 | exit { ... } | | -| raise.rb:155:16:155:50 | exit { ... } (normal) | raise.rb:155:16:155:50 | exit { ... } | | +| raise.rb:155:3:155:50 | ... | raise.rb:155:3:155:50 | Before call to each | | +| raise.rb:155:3:155:50 | After ... | raise.rb:154:1:156:3 | Normal Exit | | +| raise.rb:155:3:155:50 | After call to each | raise.rb:155:3:155:50 | After ... | | +| raise.rb:155:3:155:50 | Before call to each | raise.rb:155:3:155:9 | element | | +| raise.rb:155:3:155:50 | call to each | raise.rb:155:3:155:50 | After call to each | | +| raise.rb:155:16:155:50 | Entry | raise.rb:155:19:155:22 | elem | | +| raise.rb:155:16:155:50 | Exceptional Exit | raise.rb:155:16:155:50 | Exit | | +| raise.rb:155:16:155:50 | Normal Exit | raise.rb:155:16:155:50 | Exit | | | raise.rb:155:16:155:50 | { ... } | raise.rb:155:3:155:50 | call to each | | -| raise.rb:155:19:155:22 | elem | raise.rb:155:37:155:43 | element | | -| raise.rb:155:25:155:32 | call to raise | raise.rb:155:16:155:50 | exit { ... } (abnormal) | exception | +| raise.rb:155:19:155:22 | elem | raise.rb:155:25:155:48 | ... | | +| raise.rb:155:25:155:32 | Before call to raise | raise.rb:155:25:155:32 | self | | +| raise.rb:155:25:155:32 | call to raise | raise.rb:155:16:155:50 | Exceptional Exit | exception | | raise.rb:155:25:155:32 | self | raise.rb:155:31:155:32 | "" | | -| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:16:155:50 | exit { ... } (normal) | | +| raise.rb:155:25:155:48 | ... | raise.rb:155:25:155:48 | ... if ... | | +| raise.rb:155:25:155:48 | ... if ... | raise.rb:155:37:155:48 | Before call to nil? | | +| raise.rb:155:25:155:48 | After ... | raise.rb:155:16:155:50 | Normal Exit | | +| raise.rb:155:25:155:48 | After ... if ... | raise.rb:155:25:155:48 | After ... | | | raise.rb:155:31:155:32 | "" | raise.rb:155:25:155:32 | call to raise | | | raise.rb:155:37:155:43 | element | raise.rb:155:37:155:48 | call to nil? | | -| raise.rb:155:37:155:48 | call to nil? | raise.rb:155:25:155:32 | self | true | -| raise.rb:155:37:155:48 | call to nil? | raise.rb:155:25:155:48 | ... if ... | false | -| raise.rb:158:1:164:3 | enter m15 | raise.rb:159:3:163:5 | self | | -| raise.rb:158:1:164:3 | exit m15 (normal) | raise.rb:158:1:164:3 | exit m15 | | +| raise.rb:155:37:155:48 | After call to nil? [false] | raise.rb:155:25:155:48 | After ... if ... | | +| raise.rb:155:37:155:48 | After call to nil? [true] | raise.rb:155:25:155:32 | Before call to raise | | +| raise.rb:155:37:155:48 | Before call to nil? | raise.rb:155:37:155:43 | element | | +| raise.rb:155:37:155:48 | call to nil? | raise.rb:155:37:155:48 | After call to nil? [false] | false | +| raise.rb:155:37:155:48 | call to nil? | raise.rb:155:37:155:48 | After call to nil? [true] | true | +| raise.rb:158:1:164:3 | Entry | raise.rb:159:3:163:5 | ... | | +| raise.rb:158:1:164:3 | Normal Exit | raise.rb:158:1:164:3 | Exit | | | raise.rb:158:1:164:3 | m15 | raise.rb:166:1:170:3 | C | | -| raise.rb:159:3:163:5 | call to foo | raise.rb:158:1:164:3 | exit m15 (normal) | | +| raise.rb:159:3:163:5 | ... | raise.rb:159:3:163:5 | Before call to foo | | +| raise.rb:159:3:163:5 | After ... | raise.rb:158:1:164:3 | Normal Exit | | +| raise.rb:159:3:163:5 | After call to foo | raise.rb:159:3:163:5 | After ... | | +| raise.rb:159:3:163:5 | Before call to foo | raise.rb:159:3:163:5 | self | | +| raise.rb:159:3:163:5 | call to foo | raise.rb:159:3:163:5 | After call to foo | | | raise.rb:159:3:163:5 | self | raise.rb:159:7:163:5 | do ... end | | +| raise.rb:159:7:163:5 | Entry | raise.rb:160:5:162:7 | ... | | +| raise.rb:159:7:163:5 | Normal Exit | raise.rb:159:7:163:5 | Exit | | | raise.rb:159:7:163:5 | do ... end | raise.rb:159:3:163:5 | call to foo | | -| raise.rb:159:7:163:5 | enter do ... end | raise.rb:160:5:162:7 | self | | -| raise.rb:159:7:163:5 | exit do ... end (normal) | raise.rb:159:7:163:5 | exit do ... end | | -| raise.rb:160:5:162:7 | call to bar | raise.rb:159:7:163:5 | exit do ... end (normal) | | +| raise.rb:160:5:162:7 | ... | raise.rb:160:5:162:7 | Before call to bar | | +| raise.rb:160:5:162:7 | After ... | raise.rb:159:7:163:5 | Normal Exit | | +| raise.rb:160:5:162:7 | After call to bar | raise.rb:160:5:162:7 | After ... | | +| raise.rb:160:5:162:7 | Before call to bar | raise.rb:160:5:162:7 | self | | +| raise.rb:160:5:162:7 | call to bar | raise.rb:160:5:162:7 | After call to bar | | | raise.rb:160:5:162:7 | self | raise.rb:160:9:162:7 | -> { ... } | | | raise.rb:160:9:162:7 | -> { ... } | raise.rb:160:5:162:7 | call to bar | | -| raise.rb:160:9:162:7 | enter -> { ... } | raise.rb:160:12:160:12 | x | | -| raise.rb:160:9:162:7 | exit -> { ... } (abnormal) | raise.rb:160:9:162:7 | exit -> { ... } | | -| raise.rb:160:9:162:7 | exit -> { ... } (normal) | raise.rb:160:9:162:7 | exit -> { ... } | | -| raise.rb:160:12:160:12 | x | raise.rb:161:23:161:23 | x | | -| raise.rb:161:7:161:14 | call to raise | raise.rb:160:9:162:7 | exit -> { ... } (abnormal) | exception | +| raise.rb:160:9:162:7 | Entry | raise.rb:160:12:160:12 | x | | +| raise.rb:160:9:162:7 | Exceptional Exit | raise.rb:160:9:162:7 | Exit | | +| raise.rb:160:9:162:7 | Normal Exit | raise.rb:160:9:162:7 | Exit | | +| raise.rb:160:12:160:12 | x | raise.rb:161:7:161:23 | ... | | +| raise.rb:161:7:161:14 | Before call to raise | raise.rb:161:7:161:14 | self | | +| raise.rb:161:7:161:14 | call to raise | raise.rb:160:9:162:7 | Exceptional Exit | exception | | raise.rb:161:7:161:14 | self | raise.rb:161:13:161:14 | "" | | -| raise.rb:161:7:161:23 | ... unless ... | raise.rb:160:9:162:7 | exit -> { ... } (normal) | | +| raise.rb:161:7:161:23 | ... | raise.rb:161:7:161:23 | ... unless ... | | +| raise.rb:161:7:161:23 | ... unless ... | raise.rb:161:23:161:23 | x | | +| raise.rb:161:7:161:23 | After ... | raise.rb:160:9:162:7 | Normal Exit | | +| raise.rb:161:7:161:23 | After ... unless ... | raise.rb:161:7:161:23 | After ... | | | raise.rb:161:13:161:14 | "" | raise.rb:161:7:161:14 | call to raise | | -| raise.rb:161:23:161:23 | x | raise.rb:161:7:161:14 | self | false | -| raise.rb:161:23:161:23 | x | raise.rb:161:7:161:23 | ... unless ... | true | -| raise.rb:166:1:170:3 | C | raise.rb:167:7:167:10 | self | | -| raise.rb:167:3:169:5 | enter m | raise.rb:168:5:168:12 | self | | -| raise.rb:167:3:169:5 | exit m (abnormal) | raise.rb:167:3:169:5 | exit m | | -| raise.rb:167:3:169:5 | m | raise.rb:172:1:182:3 | m16 | | +| raise.rb:161:23:161:23 | After x [false] | raise.rb:161:7:161:14 | Before call to raise | | +| raise.rb:161:23:161:23 | After x [true] | raise.rb:161:7:161:23 | After ... unless ... | | +| raise.rb:161:23:161:23 | x | raise.rb:161:23:161:23 | After x [false] | false | +| raise.rb:161:23:161:23 | x | raise.rb:161:23:161:23 | After x [true] | true | +| raise.rb:166:1:170:3 | After C | raise.rb:172:1:182:3 | m16 | | +| raise.rb:166:1:170:3 | C | raise.rb:167:3:169:5 | Before m | | +| raise.rb:167:3:169:5 | After m | raise.rb:166:1:170:3 | After C | | +| raise.rb:167:3:169:5 | Before m | raise.rb:167:7:167:10 | self | | +| raise.rb:167:3:169:5 | Entry | raise.rb:168:5:168:12 | ... | | +| raise.rb:167:3:169:5 | Exceptional Exit | raise.rb:167:3:169:5 | Exit | | +| raise.rb:167:3:169:5 | m | raise.rb:167:3:169:5 | After m | | | raise.rb:167:7:167:10 | self | raise.rb:167:3:169:5 | m | | -| raise.rb:168:5:168:12 | call to raise | raise.rb:167:3:169:5 | exit m (abnormal) | exception | +| raise.rb:168:5:168:12 | ... | raise.rb:168:5:168:12 | Before call to raise | | +| raise.rb:168:5:168:12 | Before call to raise | raise.rb:168:5:168:12 | self | | +| raise.rb:168:5:168:12 | call to raise | raise.rb:167:3:169:5 | Exceptional Exit | exception | | raise.rb:168:5:168:12 | self | raise.rb:168:11:168:12 | "" | | | raise.rb:168:11:168:12 | "" | raise.rb:168:5:168:12 | call to raise | | -| raise.rb:172:1:182:3 | enter m16 | raise.rb:172:9:172:10 | b1 | | -| raise.rb:172:1:182:3 | exit m16 (abnormal) | raise.rb:172:1:182:3 | exit m16 | | -| raise.rb:172:1:182:3 | exit m16 (normal) | raise.rb:172:1:182:3 | exit m16 | | -| raise.rb:172:1:182:3 | m16 | raise.rb:1:1:182:4 | exit raise.rb (normal) | | +| raise.rb:172:1:182:3 | Entry | raise.rb:172:9:172:10 | b1 | | +| raise.rb:172:1:182:3 | Exceptional Exit | raise.rb:172:1:182:3 | Exit | | +| raise.rb:172:1:182:3 | Normal Exit | raise.rb:172:1:182:3 | Exit | | +| raise.rb:172:1:182:3 | m16 | raise.rb:1:1:182:4 | Normal Exit | | | raise.rb:172:9:172:10 | b1 | raise.rb:172:13:172:14 | b2 | | -| raise.rb:172:13:172:14 | b2 | raise.rb:174:8:174:9 | b1 | | -| raise.rb:174:8:174:9 | b1 | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:174:8:174:9 | b1 | raise.rb:174:14:174:15 | b2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:177:14:177:14 | 2 | false | -| raise.rb:174:8:174:23 | [false] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:175:14:175:14 | 1 | true | -| raise.rb:174:8:174:23 | [true] ... \|\| ... | raise.rb:179:10:179:19 | ExceptionA | exception | +| raise.rb:172:13:172:14 | b2 | raise.rb:173:3:181:5 | ... | | +| raise.rb:173:3:181:5 | ... | raise.rb:173:3:181:5 | begin ... | | +| raise.rb:173:3:181:5 | begin ... | raise.rb:174:5:178:7 | if ... | | +| raise.rb:174:5:178:7 | if ... | raise.rb:174:8:174:23 | ... \|\| ... | | +| raise.rb:174:8:174:9 | After b1 [false] | raise.rb:174:14:174:23 | Before ... == ... | | +| raise.rb:174:8:174:9 | After b1 [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | true | +| raise.rb:174:8:174:9 | b1 | raise.rb:174:8:174:9 | After b1 [false] | false | +| raise.rb:174:8:174:9 | b1 | raise.rb:174:8:174:9 | After b1 [true] | true | +| raise.rb:174:8:174:23 | ... \|\| ... | raise.rb:174:8:174:9 | b1 | | +| raise.rb:174:8:174:23 | After ... \|\| ... [false] | raise.rb:176:5:177:14 | else ... | | +| raise.rb:174:8:174:23 | After ... \|\| ... [true] | raise.rb:174:24:175:14 | then ... | | | raise.rb:174:14:174:15 | b2 | raise.rb:174:20:174:23 | true | | -| raise.rb:174:14:174:23 | ... == ... | raise.rb:174:8:174:23 | [false] ... \|\| ... | false | -| raise.rb:174:14:174:23 | ... == ... | raise.rb:174:8:174:23 | [true] ... \|\| ... | true | -| raise.rb:174:14:174:23 | ... == ... | raise.rb:179:10:179:19 | ExceptionA | exception | +| raise.rb:174:14:174:23 | ... == ... | raise.rb:174:14:174:23 | After ... == ... [false] | false | +| raise.rb:174:14:174:23 | ... == ... | raise.rb:174:14:174:23 | After ... == ... [true] | true | +| raise.rb:174:14:174:23 | ... == ... | raise.rb:179:3:180:12 | rescue ... | exception | +| raise.rb:174:14:174:23 | After ... == ... [false] | raise.rb:174:8:174:23 | After ... \|\| ... [false] | false | +| raise.rb:174:14:174:23 | After ... == ... [true] | raise.rb:174:8:174:23 | After ... \|\| ... [true] | true | +| raise.rb:174:14:174:23 | Before ... == ... | raise.rb:174:14:174:15 | b2 | | | raise.rb:174:20:174:23 | true | raise.rb:174:14:174:23 | ... == ... | | -| raise.rb:175:7:175:14 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | +| raise.rb:174:24:175:14 | then ... | raise.rb:175:7:175:14 | Before return | | +| raise.rb:175:7:175:14 | Before return | raise.rb:175:14:175:14 | 1 | | +| raise.rb:175:7:175:14 | return | raise.rb:172:1:182:3 | Normal Exit | return | | raise.rb:175:14:175:14 | 1 | raise.rb:175:7:175:14 | return | | -| raise.rb:177:7:177:14 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | +| raise.rb:176:5:177:14 | else ... | raise.rb:177:7:177:14 | Before return | | +| raise.rb:177:7:177:14 | Before return | raise.rb:177:14:177:14 | 2 | | +| raise.rb:177:7:177:14 | return | raise.rb:172:1:182:3 | Normal Exit | return | | raise.rb:177:14:177:14 | 2 | raise.rb:177:7:177:14 | return | | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:172:1:182:3 | exit m16 (abnormal) | exception | -| raise.rb:179:10:179:19 | ExceptionA | raise.rb:180:12:180:12 | 3 | match | -| raise.rb:180:5:180:12 | return | raise.rb:172:1:182:3 | exit m16 (normal) | return | +| raise.rb:179:3:180:12 | After rescue ... [no-match] | raise.rb:172:1:182:3 | Exceptional Exit | exception | +| raise.rb:179:3:180:12 | rescue ... | raise.rb:179:10:179:19 | ExceptionA | | +| raise.rb:179:10:179:19 | After ExceptionA [match] | raise.rb:179:20:180:12 | then ... | | +| raise.rb:179:10:179:19 | After ExceptionA [no-match] | raise.rb:179:3:180:12 | After rescue ... [no-match] | no-match | +| raise.rb:179:10:179:19 | ExceptionA | raise.rb:179:10:179:19 | After ExceptionA [match] | match | +| raise.rb:179:10:179:19 | ExceptionA | raise.rb:179:10:179:19 | After ExceptionA [no-match] | no-match | +| raise.rb:179:20:180:12 | then ... | raise.rb:180:5:180:12 | Before return | | +| raise.rb:180:5:180:12 | Before return | raise.rb:180:12:180:12 | 3 | | +| raise.rb:180:5:180:12 | return | raise.rb:172:1:182:3 | Normal Exit | return | | raise.rb:180:12:180:12 | 3 | raise.rb:180:5:180:12 | return | | diff --git a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.expected b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.expected index 1a70b535dc81..ff46e1293822 100644 --- a/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.expected +++ b/ruby/ql/test/library-tests/dataflow/barrier-guards/barrier-guards.expected @@ -23,12 +23,10 @@ newStyleBarrierGuards | barrier-guards.rb:191:20:191:31 | [input] SSA phi read(foo) | | barrier-guards.rb:192:5:192:7 | foo | | barrier-guards.rb:195:4:195:15 | [input] SSA phi read(foo) | -| barrier-guards.rb:195:4:195:31 | [input] SSA phi read(foo) | | barrier-guards.rb:195:20:195:31 | [input] SSA phi read(foo) | | barrier-guards.rb:195:36:195:47 | [input] SSA phi read(foo) | | barrier-guards.rb:196:5:196:7 | foo | | barrier-guards.rb:199:4:199:15 | [input] SSA phi read(foo) | -| barrier-guards.rb:199:4:199:31 | [input] SSA phi read(foo) | | barrier-guards.rb:199:20:199:31 | [input] SSA phi read(foo) | | barrier-guards.rb:203:36:203:47 | [input] SSA phi read(foo) | | barrier-guards.rb:208:5:208:7 | foo | @@ -55,323 +53,255 @@ newStyleBarrierGuards | barrier_flow.rb:68:10:71:11 | [input] SSA phi read(x) | | barrier_flow.rb:72:5:75:11 | [input] SSA phi read(x) | controls -| barrier-guards.rb:3:4:3:15 | ... == ... | barrier-guards.rb:4:5:4:7 | foo | true | -| barrier-guards.rb:3:4:3:15 | ... == ... | barrier-guards.rb:6:5:6:7 | foo | false | -| barrier-guards.rb:9:4:9:24 | call to include? | barrier-guards.rb:10:5:10:7 | foo | true | -| barrier-guards.rb:9:4:9:24 | call to include? | barrier-guards.rb:12:5:12:7 | foo | false | -| barrier-guards.rb:15:4:15:15 | ... != ... | barrier-guards.rb:16:5:16:7 | foo | true | -| barrier-guards.rb:15:4:15:15 | ... != ... | barrier-guards.rb:18:5:18:7 | foo | false | -| barrier-guards.rb:21:8:21:19 | ... == ... | barrier-guards.rb:22:5:22:7 | foo | false | -| barrier-guards.rb:21:8:21:19 | ... == ... | barrier-guards.rb:24:5:24:7 | foo | true | -| barrier-guards.rb:27:8:27:19 | ... != ... | barrier-guards.rb:28:5:28:7 | foo | false | -| barrier-guards.rb:27:8:27:19 | ... != ... | barrier-guards.rb:30:5:30:7 | foo | true | -| barrier-guards.rb:37:4:37:20 | call to include? | barrier-guards.rb:38:5:38:7 | foo | true | -| barrier-guards.rb:37:4:37:20 | call to include? | barrier-guards.rb:40:5:40:7 | foo | false | -| barrier-guards.rb:43:4:43:15 | ... == ... | barrier-guards.rb:44:5:46:5 | self | true | -| barrier-guards.rb:49:4:49:15 | ... == ... | barrier-guards.rb:50:5:53:5 | self | true | -| barrier-guards.rb:56:4:56:15 | ... == ... | barrier-guards.rb:57:5:57:13 | my_lambda | true | -| barrier-guards.rb:70:4:70:21 | call to include? | barrier-guards.rb:71:5:71:7 | foo | true | -| barrier-guards.rb:70:4:70:21 | call to include? | barrier-guards.rb:73:5:73:7 | foo | false | -| barrier-guards.rb:76:4:76:21 | call to include? | barrier-guards.rb:77:5:77:7 | foo | true | -| barrier-guards.rb:76:4:76:21 | call to include? | barrier-guards.rb:79:5:79:7 | foo | false | -| barrier-guards.rb:82:4:82:25 | ... != ... | barrier-guards.rb:83:5:83:7 | foo | true | -| barrier-guards.rb:82:4:82:25 | ... != ... | barrier-guards.rb:85:5:85:7 | foo | false | -| barrier-guards.rb:88:4:88:25 | ... == ... | barrier-guards.rb:89:5:89:7 | foo | true | -| barrier-guards.rb:88:4:88:25 | ... == ... | barrier-guards.rb:91:5:91:7 | foo | false | -| barrier-guards.rb:96:4:96:12 | call to condition | barrier-guards.rb:97:5:97:8 | bars | true | -| barrier-guards.rb:100:4:100:21 | call to include? | barrier-guards.rb:101:5:101:7 | foo | true | -| barrier-guards.rb:100:4:100:21 | call to include? | barrier-guards.rb:103:5:103:7 | foo | false | -| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:4:106:9 | [false] ... or ... | false | -| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:9:106:9 | self | false | -| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:109:5:109:8 | bars | false | -| barrier-guards.rb:106:4:106:9 | [false] ... or ... | barrier-guards.rb:109:5:109:8 | bars | false | -| barrier-guards.rb:106:4:106:9 | [true] ... or ... | barrier-guards.rb:107:5:107:7 | foo | true | -| barrier-guards.rb:106:9:106:9 | call to y | barrier-guards.rb:106:4:106:9 | [false] ... or ... | false | -| barrier-guards.rb:106:9:106:9 | call to y | barrier-guards.rb:109:5:109:8 | bars | false | -| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:4:112:10 | [true] ... and ... | true | -| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:10:112:10 | self | true | -| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:113:5:113:7 | foo | true | -| barrier-guards.rb:112:4:112:10 | [false] ... and ... | barrier-guards.rb:115:5:115:8 | bars | false | -| barrier-guards.rb:112:4:112:10 | [true] ... and ... | barrier-guards.rb:113:5:113:7 | foo | true | -| barrier-guards.rb:112:10:112:10 | call to y | barrier-guards.rb:112:4:112:10 | [true] ... and ... | true | -| barrier-guards.rb:112:10:112:10 | call to y | barrier-guards.rb:113:5:113:7 | foo | true | -| barrier-guards.rb:118:4:118:8 | [false] not ... | barrier-guards.rb:121:5:121:8 | bars | false | -| barrier-guards.rb:118:4:118:8 | [true] not ... | barrier-guards.rb:119:5:119:7 | foo | true | -| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:118:4:118:8 | [false] not ... | true | -| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:118:4:118:8 | [true] not ... | false | -| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:119:5:119:7 | foo | false | -| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:121:5:121:8 | bars | true | -| barrier-guards.rb:125:1:126:19 | [match] when ... | barrier-guards.rb:126:5:126:7 | foo | match | -| barrier-guards.rb:125:1:126:19 | [no-match] when ... | barrier-guards.rb:128:5:128:7 | foo | no-match | -| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:125:1:126:19 | [match] when ... | match | -| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:125:1:126:19 | [no-match] when ... | no-match | -| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:126:5:126:7 | foo | match | -| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:128:5:128:7 | foo | no-match | -| barrier-guards.rb:132:1:133:19 | [match] when ... | barrier-guards.rb:133:5:133:7 | foo | match | -| barrier-guards.rb:132:1:133:19 | [no-match] when ... | barrier-guards.rb:134:1:135:19 | [match] when ... | no-match | -| barrier-guards.rb:132:1:133:19 | [no-match] when ... | barrier-guards.rb:134:1:135:19 | [no-match] when ... | no-match | -| barrier-guards.rb:132:1:133:19 | [no-match] when ... | barrier-guards.rb:134:7:134:9 | bar | no-match | -| barrier-guards.rb:132:1:133:19 | [no-match] when ... | barrier-guards.rb:135:5:135:7 | foo | no-match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:132:1:133:19 | [match] when ... | match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:132:1:133:19 | [no-match] when ... | no-match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:133:5:133:7 | foo | match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:134:1:135:19 | [match] when ... | no-match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:134:1:135:19 | [no-match] when ... | no-match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:134:7:134:9 | bar | no-match | -| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:135:5:135:7 | foo | no-match | -| barrier-guards.rb:134:1:135:19 | [match] when ... | barrier-guards.rb:135:5:135:7 | foo | match | -| barrier-guards.rb:134:6:134:10 | "bar" | barrier-guards.rb:134:1:135:19 | [match] when ... | match | -| barrier-guards.rb:134:6:134:10 | "bar" | barrier-guards.rb:134:1:135:19 | [no-match] when ... | no-match | -| barrier-guards.rb:134:6:134:10 | "bar" | barrier-guards.rb:135:5:135:7 | foo | match | -| barrier-guards.rb:139:1:140:19 | [match] when ... | barrier-guards.rb:140:5:140:7 | foo | match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:141:1:142:19 | [match] when ... | no-match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:141:1:142:19 | [no-match] when ... | no-match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:141:7:141:9 | baz | no-match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:141:14:141:17 | quux | no-match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:142:5:142:7 | foo | no-match | -| barrier-guards.rb:139:1:140:19 | [no-match] when ... | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:1:140:19 | [no-match] when ... | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:14:139:16 | bar | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:1:142:19 | [match] when ... | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:1:142:19 | [no-match] when ... | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:7:141:9 | baz | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:14:141:17 | quux | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:142:5:142:7 | foo | no-match | -| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:139:1:140:19 | [no-match] when ... | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:1:142:19 | [match] when ... | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:1:142:19 | [no-match] when ... | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:7:141:9 | baz | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:14:141:17 | quux | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:142:5:142:7 | foo | no-match | -| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:141:1:142:19 | [match] when ... | barrier-guards.rb:142:5:142:7 | foo | match | -| barrier-guards.rb:141:1:142:19 | [no-match] when ... | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:1:142:19 | [no-match] when ... | no-match | -| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:14:141:17 | quux | no-match | -| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:141:13:141:18 | "quux" | barrier-guards.rb:141:1:142:19 | [no-match] when ... | no-match | -| barrier-guards.rb:141:13:141:18 | "quux" | barrier-guards.rb:144:5:144:7 | foo | no-match | -| barrier-guards.rb:148:1:149:19 | [match] when ... | barrier-guards.rb:149:5:149:7 | foo | match | -| barrier-guards.rb:148:6:148:20 | * ... | barrier-guards.rb:148:1:149:19 | [match] when ... | match | -| barrier-guards.rb:148:6:148:20 | * ... | barrier-guards.rb:148:1:149:19 | [no-match] when ... | no-match | -| barrier-guards.rb:148:6:148:20 | * ... | barrier-guards.rb:149:5:149:7 | foo | match | -| barrier-guards.rb:153:1:154:19 | [match] when ... | barrier-guards.rb:154:5:154:7 | foo | match | -| barrier-guards.rb:153:6:153:17 | * ... | barrier-guards.rb:153:1:154:19 | [match] when ... | match | -| barrier-guards.rb:153:6:153:17 | * ... | barrier-guards.rb:153:1:154:19 | [no-match] when ... | no-match | -| barrier-guards.rb:153:6:153:17 | * ... | barrier-guards.rb:154:5:154:7 | foo | match | -| barrier-guards.rb:158:1:159:19 | [match] when ... | barrier-guards.rb:159:5:159:7 | foo | match | -| barrier-guards.rb:158:6:158:9 | * ... | barrier-guards.rb:158:1:159:19 | [match] when ... | match | -| barrier-guards.rb:158:6:158:9 | * ... | barrier-guards.rb:158:1:159:19 | [no-match] when ... | no-match | -| barrier-guards.rb:158:6:158:9 | * ... | barrier-guards.rb:159:5:159:7 | foo | match | -| barrier-guards.rb:163:1:164:19 | [match] when ... | barrier-guards.rb:164:5:164:7 | foo | match | -| barrier-guards.rb:163:6:163:10 | * ... | barrier-guards.rb:163:1:164:19 | [match] when ... | match | -| barrier-guards.rb:163:6:163:10 | * ... | barrier-guards.rb:163:1:164:19 | [no-match] when ... | no-match | -| barrier-guards.rb:163:6:163:10 | * ... | barrier-guards.rb:164:5:164:7 | foo | match | -| barrier-guards.rb:168:1:169:7 | [match] when ... | barrier-guards.rb:169:5:169:7 | foo | match | -| barrier-guards.rb:168:6:168:16 | * ... | barrier-guards.rb:168:1:169:7 | [match] when ... | match | -| barrier-guards.rb:168:6:168:16 | * ... | barrier-guards.rb:168:1:169:7 | [no-match] when ... | no-match | -| barrier-guards.rb:168:6:168:16 | * ... | barrier-guards.rb:169:5:169:7 | foo | match | -| barrier-guards.rb:173:1:174:7 | [match] when ... | barrier-guards.rb:174:5:174:7 | foo | match | -| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:1:174:7 | [no-match] when ... | no-match | -| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:13:173:13 | self | no-match | -| barrier-guards.rb:173:13:173:13 | call to x | barrier-guards.rb:173:1:174:7 | [no-match] when ... | no-match | -| barrier-guards.rb:180:1:181:7 | [match] when ... | barrier-guards.rb:181:5:181:7 | foo | match | -| barrier-guards.rb:180:6:180:15 | * ... | barrier-guards.rb:180:1:181:7 | [match] when ... | match | -| barrier-guards.rb:180:6:180:15 | * ... | barrier-guards.rb:180:1:181:7 | [no-match] when ... | no-match | -| barrier-guards.rb:180:6:180:15 | * ... | barrier-guards.rb:181:5:181:7 | foo | match | -| barrier-guards.rb:187:1:188:7 | [match] when ... | barrier-guards.rb:188:5:188:7 | foo | match | -| barrier-guards.rb:187:6:187:15 | * ... | barrier-guards.rb:187:1:188:7 | [match] when ... | match | -| barrier-guards.rb:187:6:187:15 | * ... | barrier-guards.rb:187:1:188:7 | [no-match] when ... | no-match | -| barrier-guards.rb:187:6:187:15 | * ... | barrier-guards.rb:188:5:188:7 | foo | match | -| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:4:191:31 | [false] ... or ... | false | -| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:20:191:22 | foo | false | -| barrier-guards.rb:191:4:191:31 | [true] ... or ... | barrier-guards.rb:192:5:192:7 | foo | true | -| barrier-guards.rb:191:20:191:31 | ... == ... | barrier-guards.rb:191:4:191:31 | [false] ... or ... | false | -| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:4:195:31 | [false] ... or ... | false | -| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:4:195:47 | [false] ... or ... | false | -| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:20:195:22 | foo | false | -| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:36:195:38 | foo | false | -| barrier-guards.rb:195:4:195:31 | [false] ... or ... | barrier-guards.rb:195:4:195:47 | [false] ... or ... | false | -| barrier-guards.rb:195:4:195:31 | [false] ... or ... | barrier-guards.rb:195:36:195:38 | foo | false | -| barrier-guards.rb:195:4:195:47 | [true] ... or ... | barrier-guards.rb:196:5:196:7 | foo | true | -| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:4:195:31 | [false] ... or ... | false | -| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:4:195:47 | [false] ... or ... | false | -| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:36:195:38 | foo | false | -| barrier-guards.rb:195:36:195:47 | ... == ... | barrier-guards.rb:195:4:195:47 | [false] ... or ... | false | -| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:4:199:31 | [false] ... or ... | false | -| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:4:199:43 | [false] ... or ... | false | -| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:20:199:22 | foo | false | -| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:36:199:38 | foo | false | -| barrier-guards.rb:199:4:199:31 | [false] ... or ... | barrier-guards.rb:199:4:199:43 | [false] ... or ... | false | -| barrier-guards.rb:199:4:199:31 | [false] ... or ... | barrier-guards.rb:199:36:199:38 | foo | false | -| barrier-guards.rb:199:4:199:43 | [true] ... or ... | barrier-guards.rb:200:5:200:7 | foo | true | -| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:4:199:31 | [false] ... or ... | false | -| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:4:199:43 | [false] ... or ... | false | -| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:36:199:38 | foo | false | -| barrier-guards.rb:199:36:199:43 | ... == ... | barrier-guards.rb:199:4:199:43 | [false] ... or ... | false | -| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:4:203:31 | [false] ... or ... | false | -| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:4:203:47 | [false] ... or ... | false | -| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:20:203:22 | self | false | -| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:36:203:38 | foo | false | -| barrier-guards.rb:203:4:203:31 | [false] ... or ... | barrier-guards.rb:203:4:203:47 | [false] ... or ... | false | -| barrier-guards.rb:203:4:203:31 | [false] ... or ... | barrier-guards.rb:203:36:203:38 | foo | false | -| barrier-guards.rb:203:4:203:47 | [true] ... or ... | barrier-guards.rb:204:5:204:7 | foo | true | -| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:4:203:31 | [false] ... or ... | false | -| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:4:203:47 | [false] ... or ... | false | -| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:36:203:38 | foo | false | -| barrier-guards.rb:203:36:203:47 | ... == ... | barrier-guards.rb:203:4:203:47 | [false] ... or ... | false | -| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:4:207:21 | [true] ... and ... | true | -| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:21:207:21 | self | true | -| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:208:5:208:7 | foo | true | -| barrier-guards.rb:207:4:207:21 | [true] ... and ... | barrier-guards.rb:208:5:208:7 | foo | true | -| barrier-guards.rb:207:21:207:21 | call to x | barrier-guards.rb:207:4:207:21 | [true] ... and ... | true | -| barrier-guards.rb:207:21:207:21 | call to x | barrier-guards.rb:208:5:208:7 | foo | true | -| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:4:211:21 | [true] ... and ... | true | -| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:10:211:12 | foo | true | -| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:212:5:212:7 | foo | true | -| barrier-guards.rb:211:4:211:21 | [true] ... and ... | barrier-guards.rb:212:5:212:7 | foo | true | -| barrier-guards.rb:211:10:211:21 | ... == ... | barrier-guards.rb:211:4:211:21 | [true] ... and ... | true | -| barrier-guards.rb:211:10:211:21 | ... == ... | barrier-guards.rb:212:5:212:7 | foo | true | -| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:4:215:10 | [true] ... and ... | true | -| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:4:215:27 | [true] ... and ... | true | -| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:10:215:10 | self | true | -| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:16:215:18 | foo | true | -| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:216:5:216:7 | foo | true | -| barrier-guards.rb:215:4:215:10 | [true] ... and ... | barrier-guards.rb:215:4:215:27 | [true] ... and ... | true | -| barrier-guards.rb:215:4:215:10 | [true] ... and ... | barrier-guards.rb:215:16:215:18 | foo | true | -| barrier-guards.rb:215:4:215:10 | [true] ... and ... | barrier-guards.rb:216:5:216:7 | foo | true | -| barrier-guards.rb:215:4:215:27 | [true] ... and ... | barrier-guards.rb:216:5:216:7 | foo | true | -| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:4:215:10 | [true] ... and ... | true | -| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:4:215:27 | [true] ... and ... | true | -| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:16:215:18 | foo | true | -| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:216:5:216:7 | foo | true | -| barrier-guards.rb:215:16:215:27 | ... == ... | barrier-guards.rb:215:4:215:27 | [true] ... and ... | true | -| barrier-guards.rb:215:16:215:27 | ... == ... | barrier-guards.rb:216:5:216:7 | foo | true | -| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:4:219:32 | [true] ... and ... | true | -| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:21:219:23 | foo | true | -| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:220:5:220:7 | foo | true | -| barrier-guards.rb:219:4:219:32 | [true] ... and ... | barrier-guards.rb:220:5:220:7 | foo | true | -| barrier-guards.rb:219:21:219:32 | ... == ... | barrier-guards.rb:219:4:219:32 | [true] ... and ... | true | -| barrier-guards.rb:219:21:219:32 | ... == ... | barrier-guards.rb:220:5:220:7 | foo | true | -| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:4:223:10 | [true] ... and ... | true | -| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:10:223:10 | self | true | -| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:224:5:224:7 | foo | true | -| barrier-guards.rb:223:4:223:10 | [true] ... and ... | barrier-guards.rb:224:5:224:7 | foo | true | -| barrier-guards.rb:223:10:223:10 | call to y | barrier-guards.rb:223:4:223:10 | [true] ... and ... | true | -| barrier-guards.rb:223:10:223:10 | call to y | barrier-guards.rb:224:5:224:7 | foo | true | -| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:4:227:21 | [true] ... and ... | true | -| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:21:227:21 | self | true | -| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:228:5:228:7 | self | true | -| barrier-guards.rb:227:4:227:21 | [true] ... and ... | barrier-guards.rb:228:5:228:7 | self | true | -| barrier-guards.rb:227:21:227:21 | call to y | barrier-guards.rb:227:4:227:21 | [true] ... and ... | true | -| barrier-guards.rb:227:21:227:21 | call to y | barrier-guards.rb:228:5:228:7 | self | true | -| barrier-guards.rb:232:1:233:19 | [match] when ... | barrier-guards.rb:233:5:233:7 | foo | match | -| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:1:233:19 | [match] when ... | match | -| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:1:233:19 | [no-match] when ... | no-match | -| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:233:5:233:7 | foo | match | -| barrier-guards.rb:237:1:237:38 | [match] when ... | barrier-guards.rb:237:24:237:26 | foo | match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:1:238:26 | [match] when ... | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:1:238:26 | [no-match] when ... | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:6:238:8 | self | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:24:238:26 | foo | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:6:239:8 | foo | no-match | -| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:20:239:22 | foo | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:1:237:38 | [match] when ... | match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:1:237:38 | [no-match] when ... | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:24:237:26 | foo | match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [match] when ... | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [no-match] when ... | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:6:238:8 | self | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:24:238:26 | foo | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:6:239:8 | foo | no-match | -| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | no-match | -| barrier-guards.rb:238:1:238:26 | [match] when ... | barrier-guards.rb:238:24:238:26 | foo | match | -| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match | -| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match | -| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:6:239:8 | foo | no-match | -| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:20:239:22 | foo | no-match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [match] when ... | match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [no-match] when ... | no-match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:24:238:26 | foo | match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:6:239:8 | foo | no-match | -| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | no-match | -| barrier-guards.rb:239:1:239:22 | [match] when ... | barrier-guards.rb:239:20:239:22 | foo | match | -| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:1:239:22 | [match] when ... | match | -| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match | -| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | match | -| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:244:5:244:7 | foo | match | -| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:245:1:246:7 | in ... then ... | no-match | -| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:246:5:246:7 | foo | no-match | -| barrier-guards.rb:245:4:245:4 | x | barrier-guards.rb:246:5:246:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:251:5:251:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:254:1:256:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:255:5:255:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:259:1:261:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:260:5:260:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:264:1:266:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:265:5:265:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:268:1:270:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:269:5:269:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:272:1:272:19 | ... && ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:272:17:272:19 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:273:1:273:19 | ... && ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:273:8:273:10 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:275:1:277:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:276:5:276:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:281:1:283:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:282:5:282:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:286:1:288:3 | if ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:287:5:287:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:290:1:295:3 | case ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:291:1:292:19 | [match] when ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:291:1:292:19 | [no-match] when ... | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:292:5:292:7 | foo | match | -| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:294:5:294:7 | foo | match | -| barrier-guards.rb:254:4:254:28 | ... == ... | barrier-guards.rb:255:5:255:7 | foo | true | -| barrier-guards.rb:259:4:259:16 | ... == ... | barrier-guards.rb:260:5:260:7 | foo | true | -| barrier-guards.rb:264:4:264:16 | ... == ... | barrier-guards.rb:265:5:265:7 | foo | true | -| barrier-guards.rb:268:4:268:30 | ... == ... | barrier-guards.rb:269:5:269:7 | foo | true | -| barrier-guards.rb:272:1:272:12 | ... == ... | barrier-guards.rb:272:17:272:19 | foo | true | -| barrier-guards.rb:273:1:273:3 | foo | barrier-guards.rb:273:8:273:10 | foo | true | -| barrier-guards.rb:275:4:275:19 | call to include? | barrier-guards.rb:276:5:276:7 | foo | true | -| barrier-guards.rb:281:4:281:20 | call to include? | barrier-guards.rb:282:5:282:7 | foo | true | -| barrier-guards.rb:286:4:286:20 | call to include? | barrier-guards.rb:287:5:287:7 | foo | true | -| barrier-guards.rb:291:1:292:19 | [match] when ... | barrier-guards.rb:292:5:292:7 | foo | match | -| barrier-guards.rb:291:1:292:19 | [no-match] when ... | barrier-guards.rb:294:5:294:7 | foo | no-match | -| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:291:1:292:19 | [match] when ... | match | -| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:291:1:292:19 | [no-match] when ... | no-match | -| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:292:5:292:7 | foo | match | -| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:294:5:294:7 | foo | no-match | -| barrier_flow.rb:10:8:10:18 | ... != ... | barrier_flow.rb:11:9:11:14 | self | true | -| barrier_flow.rb:18:8:18:18 | ... == ... | barrier_flow.rb:19:9:19:14 | self | true | -| barrier_flow.rb:26:19:26:29 | ... == ... | barrier_flow.rb:26:5:26:10 | self | false | -| barrier_flow.rb:32:19:32:29 | ... != ... | barrier_flow.rb:32:5:32:10 | self | false | -| barrier_flow.rb:38:8:38:18 | ... != ... | barrier_flow.rb:39:9:39:9 | x | true | -| barrier_flow.rb:48:23:48:33 | ... == ... | barrier_flow.rb:48:5:48:5 | x | false | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:57:9:57:14 | return | true | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:57:9:57:34 | ... unless ... | true | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:57:23:57:23 | x | true | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:59:9:59:14 | return | false | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:59:9:59:34 | ... unless ... | false | -| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:59:23:59:23 | x | false | -| barrier_flow.rb:57:23:57:34 | ... == ... | barrier_flow.rb:57:9:57:14 | return | false | -| barrier_flow.rb:57:23:57:34 | ... == ... | barrier_flow.rb:57:9:57:34 | ... unless ... | true | -| barrier_flow.rb:59:23:59:34 | ... == ... | barrier_flow.rb:59:9:59:14 | return | false | -| barrier_flow.rb:59:23:59:34 | ... == ... | barrier_flow.rb:59:9:59:34 | ... unless ... | true | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:69:9:71:11 | if ... | true | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:69:12:69:12 | x | true | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:70:13:70:18 | return | true | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:73:9:75:11 | if ... | false | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:73:12:73:12 | x | false | -| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:74:13:74:18 | return | false | -| barrier_flow.rb:69:12:69:23 | ... != ... | barrier_flow.rb:69:9:71:11 | if ... | false | -| barrier_flow.rb:69:12:69:23 | ... != ... | barrier_flow.rb:70:13:70:18 | return | true | -| barrier_flow.rb:73:12:73:23 | ... != ... | barrier_flow.rb:73:9:75:11 | if ... | false | -| barrier_flow.rb:73:12:73:23 | ... != ... | barrier_flow.rb:74:13:74:18 | return | true | +| barrier-guards.rb:3:4:3:15 | ... == ... | barrier-guards.rb:3:4:3:15 | After ... == ... [false] | false | +| barrier-guards.rb:3:4:3:15 | ... == ... | barrier-guards.rb:3:4:3:15 | After ... == ... [true] | true | +| barrier-guards.rb:9:4:9:24 | call to include? | barrier-guards.rb:9:4:9:24 | After call to include? [false] | false | +| barrier-guards.rb:9:4:9:24 | call to include? | barrier-guards.rb:9:4:9:24 | After call to include? [true] | true | +| barrier-guards.rb:15:4:15:15 | ... != ... | barrier-guards.rb:15:4:15:15 | After ... != ... [false] | false | +| barrier-guards.rb:15:4:15:15 | ... != ... | barrier-guards.rb:15:4:15:15 | After ... != ... [true] | true | +| barrier-guards.rb:21:8:21:19 | ... == ... | barrier-guards.rb:21:8:21:19 | After ... == ... [false] | false | +| barrier-guards.rb:21:8:21:19 | ... == ... | barrier-guards.rb:21:8:21:19 | After ... == ... [true] | true | +| barrier-guards.rb:27:8:27:19 | ... != ... | barrier-guards.rb:27:8:27:19 | After ... != ... [false] | false | +| barrier-guards.rb:27:8:27:19 | ... != ... | barrier-guards.rb:27:8:27:19 | After ... != ... [true] | true | +| barrier-guards.rb:37:4:37:20 | call to include? | barrier-guards.rb:37:4:37:20 | After call to include? [false] | false | +| barrier-guards.rb:37:4:37:20 | call to include? | barrier-guards.rb:37:4:37:20 | After call to include? [true] | true | +| barrier-guards.rb:43:4:43:15 | ... == ... | barrier-guards.rb:43:4:43:15 | After ... == ... [false] | false | +| barrier-guards.rb:43:4:43:15 | ... == ... | barrier-guards.rb:43:4:43:15 | After ... == ... [true] | true | +| barrier-guards.rb:49:4:49:15 | ... == ... | barrier-guards.rb:49:4:49:15 | After ... == ... [false] | false | +| barrier-guards.rb:49:4:49:15 | ... == ... | barrier-guards.rb:49:4:49:15 | After ... == ... [true] | true | +| barrier-guards.rb:56:4:56:15 | ... == ... | barrier-guards.rb:56:4:56:15 | After ... == ... [false] | false | +| barrier-guards.rb:56:4:56:15 | ... == ... | barrier-guards.rb:56:4:56:15 | After ... == ... [true] | true | +| barrier-guards.rb:70:4:70:21 | call to include? | barrier-guards.rb:70:4:70:21 | After call to include? [false] | false | +| barrier-guards.rb:70:4:70:21 | call to include? | barrier-guards.rb:70:4:70:21 | After call to include? [true] | true | +| barrier-guards.rb:76:4:76:21 | call to include? | barrier-guards.rb:76:4:76:21 | After call to include? [false] | false | +| barrier-guards.rb:76:4:76:21 | call to include? | barrier-guards.rb:76:4:76:21 | After call to include? [true] | true | +| barrier-guards.rb:82:4:82:25 | ... != ... | barrier-guards.rb:82:4:82:25 | After ... != ... [false] | false | +| barrier-guards.rb:82:4:82:25 | ... != ... | barrier-guards.rb:82:4:82:25 | After ... != ... [true] | true | +| barrier-guards.rb:88:4:88:25 | ... == ... | barrier-guards.rb:88:4:88:25 | After ... == ... [false] | false | +| barrier-guards.rb:88:4:88:25 | ... == ... | barrier-guards.rb:88:4:88:25 | After ... == ... [true] | true | +| barrier-guards.rb:96:4:96:12 | call to condition | barrier-guards.rb:96:4:96:12 | After call to condition [false] | false | +| barrier-guards.rb:96:4:96:12 | call to condition | barrier-guards.rb:96:4:96:12 | After call to condition [true] | true | +| barrier-guards.rb:100:4:100:21 | call to include? | barrier-guards.rb:100:4:100:21 | After call to include? [false] | false | +| barrier-guards.rb:100:4:100:21 | call to include? | barrier-guards.rb:100:4:100:21 | After call to include? [true] | true | +| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:4:106:4 | After call to x [false] | false | +| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:4:106:4 | After call to x [true] | true | +| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:9:106:9 | After call to y [false] | false | +| barrier-guards.rb:106:4:106:4 | call to x | barrier-guards.rb:106:9:106:9 | After call to y [true] | false | +| barrier-guards.rb:106:9:106:9 | call to y | barrier-guards.rb:106:9:106:9 | After call to y [false] | false | +| barrier-guards.rb:106:9:106:9 | call to y | barrier-guards.rb:106:9:106:9 | After call to y [true] | true | +| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:4:112:4 | After call to x [false] | false | +| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:4:112:4 | After call to x [true] | true | +| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:10:112:10 | After call to y [false] | true | +| barrier-guards.rb:112:4:112:4 | call to x | barrier-guards.rb:112:10:112:10 | After call to y [true] | true | +| barrier-guards.rb:112:10:112:10 | call to y | barrier-guards.rb:112:10:112:10 | After call to y [false] | false | +| barrier-guards.rb:112:10:112:10 | call to y | barrier-guards.rb:112:10:112:10 | After call to y [true] | true | +| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:118:8:118:8 | After call to x [false] | false | +| barrier-guards.rb:118:8:118:8 | call to x | barrier-guards.rb:118:8:118:8 | After call to x [true] | true | +| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:125:6:125:10 | After "foo" [match] | match | +| barrier-guards.rb:125:6:125:10 | "foo" | barrier-guards.rb:125:6:125:10 | After "foo" [no-match] | no-match | +| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:132:6:132:10 | After "foo" [match] | match | +| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:132:6:132:10 | After "foo" [no-match] | no-match | +| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:134:6:134:10 | After "bar" [match] | no-match | +| barrier-guards.rb:132:6:132:10 | "foo" | barrier-guards.rb:134:6:134:10 | After "bar" [no-match] | no-match | +| barrier-guards.rb:134:6:134:10 | "bar" | barrier-guards.rb:134:6:134:10 | After "bar" [match] | match | +| barrier-guards.rb:134:6:134:10 | "bar" | barrier-guards.rb:134:6:134:10 | After "bar" [no-match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:6:139:10 | After "foo" [match] | match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:6:139:10 | After "foo" [no-match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:13:139:17 | After "bar" [match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:139:13:139:17 | After "bar" [no-match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:1:142:19 | After when ... [match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:6:141:10 | After "baz" [match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:6:141:10 | After "baz" [no-match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:13:141:18 | After "quux" [match] | no-match | +| barrier-guards.rb:139:6:139:10 | "foo" | barrier-guards.rb:141:13:141:18 | After "quux" [no-match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:139:13:139:17 | After "bar" [match] | match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:139:13:139:17 | After "bar" [no-match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:1:142:19 | After when ... [match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:6:141:10 | After "baz" [match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:6:141:10 | After "baz" [no-match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:13:141:18 | After "quux" [match] | no-match | +| barrier-guards.rb:139:13:139:17 | "bar" | barrier-guards.rb:141:13:141:18 | After "quux" [no-match] | no-match | +| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:6:141:10 | After "baz" [match] | match | +| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:6:141:10 | After "baz" [no-match] | no-match | +| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:13:141:18 | After "quux" [match] | no-match | +| barrier-guards.rb:141:6:141:10 | "baz" | barrier-guards.rb:141:13:141:18 | After "quux" [no-match] | no-match | +| barrier-guards.rb:141:13:141:18 | "quux" | barrier-guards.rb:141:13:141:18 | After "quux" [match] | match | +| barrier-guards.rb:141:13:141:18 | "quux" | barrier-guards.rb:141:13:141:18 | After "quux" [no-match] | no-match | +| barrier-guards.rb:148:6:148:20 | * ... | barrier-guards.rb:148:6:148:20 | After * ... [match] | match | +| barrier-guards.rb:148:6:148:20 | * ... | barrier-guards.rb:148:6:148:20 | After * ... [no-match] | no-match | +| barrier-guards.rb:153:6:153:17 | * ... | barrier-guards.rb:153:6:153:17 | After * ... [match] | match | +| barrier-guards.rb:153:6:153:17 | * ... | barrier-guards.rb:153:6:153:17 | After * ... [no-match] | no-match | +| barrier-guards.rb:158:6:158:9 | * ... | barrier-guards.rb:158:6:158:9 | After * ... [match] | match | +| barrier-guards.rb:158:6:158:9 | * ... | barrier-guards.rb:158:6:158:9 | After * ... [no-match] | no-match | +| barrier-guards.rb:163:6:163:10 | * ... | barrier-guards.rb:163:6:163:10 | After * ... [match] | match | +| barrier-guards.rb:163:6:163:10 | * ... | barrier-guards.rb:163:6:163:10 | After * ... [no-match] | no-match | +| barrier-guards.rb:168:6:168:16 | * ... | barrier-guards.rb:168:6:168:16 | After * ... [match] | match | +| barrier-guards.rb:168:6:168:16 | * ... | barrier-guards.rb:168:6:168:16 | After * ... [no-match] | no-match | +| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:6:173:10 | After "foo" [match] | match | +| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:6:173:10 | After "foo" [no-match] | no-match | +| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:13:173:13 | After call to x [match] | no-match | +| barrier-guards.rb:173:6:173:10 | "foo" | barrier-guards.rb:173:13:173:13 | After call to x [no-match] | no-match | +| barrier-guards.rb:173:13:173:13 | call to x | barrier-guards.rb:173:13:173:13 | After call to x [match] | match | +| barrier-guards.rb:173:13:173:13 | call to x | barrier-guards.rb:173:13:173:13 | After call to x [no-match] | no-match | +| barrier-guards.rb:180:6:180:15 | * ... | barrier-guards.rb:180:6:180:15 | After * ... [match] | match | +| barrier-guards.rb:180:6:180:15 | * ... | barrier-guards.rb:180:6:180:15 | After * ... [no-match] | no-match | +| barrier-guards.rb:187:6:187:15 | * ... | barrier-guards.rb:187:6:187:15 | After * ... [match] | match | +| barrier-guards.rb:187:6:187:15 | * ... | barrier-guards.rb:187:6:187:15 | After * ... [no-match] | no-match | +| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:4:191:15 | After ... == ... [false] | false | +| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:4:191:15 | After ... == ... [true] | true | +| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:20:191:31 | After ... == ... [false] | false | +| barrier-guards.rb:191:4:191:15 | ... == ... | barrier-guards.rb:191:20:191:31 | After ... == ... [true] | false | +| barrier-guards.rb:191:20:191:31 | ... == ... | barrier-guards.rb:191:20:191:31 | After ... == ... [false] | false | +| barrier-guards.rb:191:20:191:31 | ... == ... | barrier-guards.rb:191:20:191:31 | After ... == ... [true] | true | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:4:195:15 | After ... == ... [false] | false | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:4:195:15 | After ... == ... [true] | true | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:20:195:31 | After ... == ... [false] | false | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:20:195:31 | After ... == ... [true] | false | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [false] | false | +| barrier-guards.rb:195:4:195:15 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [true] | false | +| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:20:195:31 | After ... == ... [false] | false | +| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:20:195:31 | After ... == ... [true] | true | +| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [false] | false | +| barrier-guards.rb:195:20:195:31 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [true] | false | +| barrier-guards.rb:195:36:195:47 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [false] | false | +| barrier-guards.rb:195:36:195:47 | ... == ... | barrier-guards.rb:195:36:195:47 | After ... == ... [true] | true | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:4:199:15 | After ... == ... [false] | false | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:4:199:15 | After ... == ... [true] | true | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:20:199:31 | After ... == ... [false] | false | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:20:199:31 | After ... == ... [true] | false | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [false] | false | +| barrier-guards.rb:199:4:199:15 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [true] | false | +| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:20:199:31 | After ... == ... [false] | false | +| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:20:199:31 | After ... == ... [true] | true | +| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [false] | false | +| barrier-guards.rb:199:20:199:31 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [true] | false | +| barrier-guards.rb:199:36:199:43 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [false] | false | +| barrier-guards.rb:199:36:199:43 | ... == ... | barrier-guards.rb:199:36:199:43 | After ... == ... [true] | true | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:4:203:15 | After ... == ... [false] | false | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:4:203:15 | After ... == ... [true] | true | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:20:203:31 | After ... == ... [false] | false | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:20:203:31 | After ... == ... [true] | false | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [false] | false | +| barrier-guards.rb:203:4:203:15 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [true] | false | +| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:20:203:31 | After ... == ... [false] | false | +| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:20:203:31 | After ... == ... [true] | true | +| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [false] | false | +| barrier-guards.rb:203:20:203:31 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [true] | false | +| barrier-guards.rb:203:36:203:47 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [false] | false | +| barrier-guards.rb:203:36:203:47 | ... == ... | barrier-guards.rb:203:36:203:47 | After ... == ... [true] | true | +| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:4:207:15 | After ... == ... [false] | false | +| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:4:207:15 | After ... == ... [true] | true | +| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:21:207:21 | After call to x [false] | true | +| barrier-guards.rb:207:4:207:15 | ... == ... | barrier-guards.rb:207:21:207:21 | After call to x [true] | true | +| barrier-guards.rb:207:21:207:21 | call to x | barrier-guards.rb:207:21:207:21 | After call to x [false] | false | +| barrier-guards.rb:207:21:207:21 | call to x | barrier-guards.rb:207:21:207:21 | After call to x [true] | true | +| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:4:211:4 | After call to x [false] | false | +| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:4:211:4 | After call to x [true] | true | +| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:10:211:21 | After ... == ... [false] | true | +| barrier-guards.rb:211:4:211:4 | call to x | barrier-guards.rb:211:10:211:21 | After ... == ... [true] | true | +| barrier-guards.rb:211:10:211:21 | ... == ... | barrier-guards.rb:211:10:211:21 | After ... == ... [false] | false | +| barrier-guards.rb:211:10:211:21 | ... == ... | barrier-guards.rb:211:10:211:21 | After ... == ... [true] | true | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:4:215:4 | After call to x [false] | false | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:4:215:4 | After call to x [true] | true | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:10:215:10 | After call to y [false] | true | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:10:215:10 | After call to y [true] | true | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:16:215:27 | After ... == ... [false] | true | +| barrier-guards.rb:215:4:215:4 | call to x | barrier-guards.rb:215:16:215:27 | After ... == ... [true] | true | +| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:10:215:10 | After call to y [false] | false | +| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:10:215:10 | After call to y [true] | true | +| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:16:215:27 | After ... == ... [false] | true | +| barrier-guards.rb:215:10:215:10 | call to y | barrier-guards.rb:215:16:215:27 | After ... == ... [true] | true | +| barrier-guards.rb:215:16:215:27 | ... == ... | barrier-guards.rb:215:16:215:27 | After ... == ... [false] | false | +| barrier-guards.rb:215:16:215:27 | ... == ... | barrier-guards.rb:215:16:215:27 | After ... == ... [true] | true | +| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:4:219:15 | After ... == ... [false] | false | +| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:4:219:15 | After ... == ... [true] | true | +| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:21:219:32 | After ... == ... [false] | true | +| barrier-guards.rb:219:4:219:15 | ... == ... | barrier-guards.rb:219:21:219:32 | After ... == ... [true] | true | +| barrier-guards.rb:219:21:219:32 | ... == ... | barrier-guards.rb:219:21:219:32 | After ... == ... [false] | false | +| barrier-guards.rb:219:21:219:32 | ... == ... | barrier-guards.rb:219:21:219:32 | After ... == ... [true] | true | +| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:4:223:4 | After call to x [false] | false | +| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:4:223:4 | After call to x [true] | true | +| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:10:223:10 | After call to y [false] | true | +| barrier-guards.rb:223:4:223:4 | call to x | barrier-guards.rb:223:10:223:10 | After call to y [true] | true | +| barrier-guards.rb:223:10:223:10 | call to y | barrier-guards.rb:223:10:223:10 | After call to y [false] | false | +| barrier-guards.rb:223:10:223:10 | call to y | barrier-guards.rb:223:10:223:10 | After call to y [true] | true | +| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:4:227:15 | After ... == ... [false] | false | +| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:4:227:15 | After ... == ... [true] | true | +| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:21:227:21 | After call to y [false] | true | +| barrier-guards.rb:227:4:227:15 | ... == ... | barrier-guards.rb:227:21:227:21 | After call to y [true] | true | +| barrier-guards.rb:227:21:227:21 | call to y | barrier-guards.rb:227:21:227:21 | After call to y [false] | false | +| barrier-guards.rb:227:21:227:21 | call to y | barrier-guards.rb:227:21:227:21 | After call to y [true] | true | +| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:6:232:17 | After ... == ... [match] | match | +| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:6:232:17 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:6:237:17 | After ... == ... [match] | match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:6:237:17 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:6:238:17 | After ... == ... [match] | no-match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:6:238:17 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [match] | no-match | +| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:6:238:17 | After ... == ... [match] | match | +| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:6:238:17 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [match] | no-match | +| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [match] | match | +| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:6:239:13 | After ... == ... [no-match] | no-match | +| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:243:4:243:8 | After "foo" [match] | match | +| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:243:4:243:8 | After "foo" [no-match] | no-match | +| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:245:4:245:4 | After x [match] | no-match | +| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:245:4:245:4 | After x [no-match] | no-match | +| barrier-guards.rb:245:4:245:4 | x | barrier-guards.rb:245:4:245:4 | After x [match] | match | +| barrier-guards.rb:245:4:245:4 | x | barrier-guards.rb:245:4:245:4 | After x [no-match] | no-match | +| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:250:4:250:8 | After "foo" [match] | match | +| barrier-guards.rb:250:4:250:8 | "foo" | barrier-guards.rb:250:4:250:8 | After "foo" [no-match] | no-match | +| barrier-guards.rb:254:4:254:28 | ... == ... | barrier-guards.rb:254:4:254:28 | After ... == ... [false] | false | +| barrier-guards.rb:254:4:254:28 | ... == ... | barrier-guards.rb:254:4:254:28 | After ... == ... [true] | true | +| barrier-guards.rb:259:4:259:16 | ... == ... | barrier-guards.rb:259:4:259:16 | After ... == ... [false] | false | +| barrier-guards.rb:259:4:259:16 | ... == ... | barrier-guards.rb:259:4:259:16 | After ... == ... [true] | true | +| barrier-guards.rb:264:4:264:16 | ... == ... | barrier-guards.rb:264:4:264:16 | After ... == ... [false] | false | +| barrier-guards.rb:264:4:264:16 | ... == ... | barrier-guards.rb:264:4:264:16 | After ... == ... [true] | true | +| barrier-guards.rb:268:4:268:30 | ... == ... | barrier-guards.rb:268:4:268:30 | After ... == ... [false] | false | +| barrier-guards.rb:268:4:268:30 | ... == ... | barrier-guards.rb:268:4:268:30 | After ... == ... [true] | true | +| barrier-guards.rb:272:1:272:12 | ... == ... | barrier-guards.rb:272:1:272:12 | After ... == ... [false] | false | +| barrier-guards.rb:272:1:272:12 | ... == ... | barrier-guards.rb:272:1:272:12 | After ... == ... [true] | true | +| barrier-guards.rb:273:1:273:3 | foo | barrier-guards.rb:273:1:273:3 | After foo [false] | false | +| barrier-guards.rb:273:1:273:3 | foo | barrier-guards.rb:273:1:273:3 | After foo [true] | true | +| barrier-guards.rb:275:4:275:19 | call to include? | barrier-guards.rb:275:4:275:19 | After call to include? [false] | false | +| barrier-guards.rb:275:4:275:19 | call to include? | barrier-guards.rb:275:4:275:19 | After call to include? [true] | true | +| barrier-guards.rb:281:4:281:20 | call to include? | barrier-guards.rb:281:4:281:20 | After call to include? [false] | false | +| barrier-guards.rb:281:4:281:20 | call to include? | barrier-guards.rb:281:4:281:20 | After call to include? [true] | true | +| barrier-guards.rb:286:4:286:20 | call to include? | barrier-guards.rb:286:4:286:20 | After call to include? [false] | false | +| barrier-guards.rb:286:4:286:20 | call to include? | barrier-guards.rb:286:4:286:20 | After call to include? [true] | true | +| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:291:6:291:6 | After g [match] | match | +| barrier-guards.rb:291:6:291:6 | g | barrier-guards.rb:291:6:291:6 | After g [no-match] | no-match | +| barrier_flow.rb:10:8:10:18 | ... != ... | barrier_flow.rb:10:8:10:18 | After ... != ... [false] | false | +| barrier_flow.rb:10:8:10:18 | ... != ... | barrier_flow.rb:10:8:10:18 | After ... != ... [true] | true | +| barrier_flow.rb:18:8:18:18 | ... == ... | barrier_flow.rb:18:8:18:18 | After ... == ... [false] | false | +| barrier_flow.rb:18:8:18:18 | ... == ... | barrier_flow.rb:18:8:18:18 | After ... == ... [true] | true | +| barrier_flow.rb:26:19:26:29 | ... == ... | barrier_flow.rb:26:19:26:29 | After ... == ... [false] | false | +| barrier_flow.rb:26:19:26:29 | ... == ... | barrier_flow.rb:26:19:26:29 | After ... == ... [true] | true | +| barrier_flow.rb:32:19:32:29 | ... != ... | barrier_flow.rb:32:19:32:29 | After ... != ... [false] | false | +| barrier_flow.rb:32:19:32:29 | ... != ... | barrier_flow.rb:32:19:32:29 | After ... != ... [true] | true | +| barrier_flow.rb:38:8:38:18 | ... != ... | barrier_flow.rb:38:8:38:18 | After ... != ... [false] | false | +| barrier_flow.rb:38:8:38:18 | ... != ... | barrier_flow.rb:38:8:38:18 | After ... != ... [true] | true | +| barrier_flow.rb:48:23:48:33 | ... == ... | barrier_flow.rb:48:23:48:33 | After ... == ... [false] | false | +| barrier_flow.rb:48:23:48:33 | ... == ... | barrier_flow.rb:48:23:48:33 | After ... == ... [true] | true | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:56:8:56:8 | After b [false] | false | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:56:8:56:8 | After b [true] | true | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:57:23:57:34 | After ... == ... [false] | true | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:57:23:57:34 | After ... == ... [true] | true | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:59:23:59:34 | After ... == ... [false] | false | +| barrier_flow.rb:56:8:56:8 | b | barrier_flow.rb:59:23:59:34 | After ... == ... [true] | false | +| barrier_flow.rb:57:23:57:34 | ... == ... | barrier_flow.rb:57:23:57:34 | After ... == ... [false] | false | +| barrier_flow.rb:57:23:57:34 | ... == ... | barrier_flow.rb:57:23:57:34 | After ... == ... [true] | true | +| barrier_flow.rb:59:23:59:34 | ... == ... | barrier_flow.rb:59:23:59:34 | After ... == ... [false] | false | +| barrier_flow.rb:59:23:59:34 | ... == ... | barrier_flow.rb:59:23:59:34 | After ... == ... [true] | true | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:68:8:68:8 | After b [false] | false | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:68:8:68:8 | After b [true] | true | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:69:12:69:23 | After ... != ... [false] | true | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:69:12:69:23 | After ... != ... [true] | true | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:73:12:73:23 | After ... != ... [false] | false | +| barrier_flow.rb:68:8:68:8 | b | barrier_flow.rb:73:12:73:23 | After ... != ... [true] | false | +| barrier_flow.rb:69:12:69:23 | ... != ... | barrier_flow.rb:69:12:69:23 | After ... != ... [false] | false | +| barrier_flow.rb:69:12:69:23 | ... != ... | barrier_flow.rb:69:12:69:23 | After ... != ... [true] | true | +| barrier_flow.rb:73:12:73:23 | ... != ... | barrier_flow.rb:73:12:73:23 | After ... != ... [false] | false | +| barrier_flow.rb:73:12:73:23 | ... != ... | barrier_flow.rb:73:12:73:23 | After ... != ... [true] | true | diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index da64eaf3949c..f3b2972cc2ce 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -2384,6 +2384,8 @@ | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | [input] phi | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:19:5:19:5 | phi | | local_dataflow.rb:19:5:19:5 | x | local_dataflow.rb:20:6:20:6 | x | +| local_dataflow.rb:20:3:20:25 | if ... | local_dataflow.rb:19:1:21:3 | ... | +| local_dataflow.rb:20:12:20:21 | then ... | local_dataflow.rb:20:3:20:25 | if ... | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | | local_dataflow.rb:24:8:24:8 | 5 | local_dataflow.rb:24:2:24:8 | break | | local_dataflow.rb:28:5:28:26 | M | local_dataflow.rb:28:1:28:26 | ... = ... | @@ -2395,10 +2397,12 @@ | local_dataflow.rb:32:14:32:21 | "method" | local_dataflow.rb:32:14:32:21 | ... | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:34:7:34:7 | x | | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | +| local_dataflow.rb:35:12:36:13 | then ... | local_dataflow.rb:35:3:37:5 | if ... | | local_dataflow.rb:36:13:36:13 | 7 | local_dataflow.rb:36:6:36:13 | return | | local_dataflow.rb:38:3:38:13 | "reachable" | local_dataflow.rb:35:3:38:13 | ... | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:41:7:41:7 | x | | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:42:6:42:6 | x | +| local_dataflow.rb:42:12:43:13 | then ... | local_dataflow.rb:42:3:44:5 | if ... | | local_dataflow.rb:43:13:43:13 | 7 | local_dataflow.rb:43:6:43:13 | return | | local_dataflow.rb:45:10:45:10 | 6 | local_dataflow.rb:45:3:45:10 | return | | local_dataflow.rb:49:1:53:3 | [post] self | local_dataflow.rb:55:1:55:14 | self | @@ -2451,6 +2455,7 @@ | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:82:7:82:13 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:85:22:85:28 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:86:28:86:34 | self | +| local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:87:20:87:26 | self | | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:79:13:79:13 | b | | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:80:8:80:8 | a | @@ -2459,6 +2464,7 @@ | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:82:7:82:13 | self | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:85:22:85:28 | self | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:86:28:86:34 | self | +| local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:87:20:87:26 | self | | local_dataflow.rb:79:13:79:13 | b | local_dataflow.rb:79:25:79:25 | b | | local_dataflow.rb:79:15:79:45 | then ... | local_dataflow.rb:78:7:88:5 | case ... | @@ -2494,6 +2500,7 @@ | local_dataflow.rb:86:28:86:34 | [post] self | local_dataflow.rb:89:3:89:9 | self | | local_dataflow.rb:86:28:86:34 | call to sink | local_dataflow.rb:86:23:86:53 | then ... | | local_dataflow.rb:86:28:86:34 | self | local_dataflow.rb:89:3:89:9 | self | +| local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | local_dataflow.rb:89:3:89:9 | self | | local_dataflow.rb:87:10:87:10 | x | local_dataflow.rb:87:25:87:25 | x | | local_dataflow.rb:87:15:87:48 | then ... | local_dataflow.rb:78:7:88:5 | case ... | | local_dataflow.rb:87:20:87:26 | [post] self | local_dataflow.rb:89:3:89:9 | self | @@ -2681,23 +2688,21 @@ | local_dataflow.rb:136:11:136:11 | [post] x | local_dataflow.rb:137:14:137:14 | x | | local_dataflow.rb:136:11:136:11 | x | local_dataflow.rb:137:14:137:14 | x | | local_dataflow.rb:137:7:138:9 | if ... | local_dataflow.rb:135:5:138:9 | else ... | -| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | +| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | +| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:10:137:15 | [post] self | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | | local_dataflow.rb:137:10:137:15 | [post] self | local_dataflow.rb:137:21:137:26 | self | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:21:137:26 | self | | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | -| local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | -| local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | -| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | +| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | +| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | @@ -2707,8 +2712,8 @@ | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | -| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | +| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | +| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:9:141:14 | self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | @@ -2718,8 +2723,8 @@ | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:24:141:24 | x | | local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | -| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | -| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | +| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | +| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:19:141:37 | [post] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] ... && ... | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | @@ -2743,8 +2748,6 @@ | local_dataflow.rb:141:35:141:35 | [post] x | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | -| local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | -| local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:38:142:9 | then ... | local_dataflow.rb:141:5:145:7 | if ... | | local_dataflow.rb:142:7:142:9 | nil | local_dataflow.rb:141:38:142:9 | then ... | | local_dataflow.rb:143:5:144:16 | elsif ... | local_dataflow.rb:141:5:145:7 | if ... | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 4eaaa96538b2..8825ac720029 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -2846,6 +2846,7 @@ | local_dataflow.rb:20:3:20:25 | if ... | local_dataflow.rb:19:1:21:3 | ... | | local_dataflow.rb:20:6:20:6 | x | local_dataflow.rb:20:6:20:10 | ... > ... | | local_dataflow.rb:20:10:20:10 | 1 | local_dataflow.rb:20:6:20:10 | ... > ... | +| local_dataflow.rb:20:12:20:21 | then ... | local_dataflow.rb:20:3:20:25 | if ... | | local_dataflow.rb:24:2:24:8 | break | local_dataflow.rb:23:1:25:3 | while ... | | local_dataflow.rb:24:8:24:8 | 5 | local_dataflow.rb:24:2:24:8 | break | | local_dataflow.rb:28:5:28:26 | M | local_dataflow.rb:28:1:28:26 | ... = ... | @@ -2860,6 +2861,7 @@ | local_dataflow.rb:34:7:34:7 | x | local_dataflow.rb:35:6:35:6 | x | | local_dataflow.rb:35:6:35:6 | x | local_dataflow.rb:35:6:35:11 | ... == ... | | local_dataflow.rb:35:11:35:11 | 4 | local_dataflow.rb:35:6:35:11 | ... == ... | +| local_dataflow.rb:35:12:36:13 | then ... | local_dataflow.rb:35:3:37:5 | if ... | | local_dataflow.rb:36:13:36:13 | 7 | local_dataflow.rb:36:6:36:13 | return | | local_dataflow.rb:38:3:38:13 | "reachable" | local_dataflow.rb:35:3:38:13 | ... | | local_dataflow.rb:41:1:47:3 | synthetic splat parameter | local_dataflow.rb:41:7:41:7 | x | @@ -2867,6 +2869,7 @@ | local_dataflow.rb:41:7:41:7 | x | local_dataflow.rb:42:6:42:6 | x | | local_dataflow.rb:42:6:42:6 | x | local_dataflow.rb:42:6:42:11 | ... == ... | | local_dataflow.rb:42:11:42:11 | 4 | local_dataflow.rb:42:6:42:11 | ... == ... | +| local_dataflow.rb:42:12:43:13 | then ... | local_dataflow.rb:42:3:44:5 | if ... | | local_dataflow.rb:43:13:43:13 | 7 | local_dataflow.rb:43:6:43:13 | return | | local_dataflow.rb:45:10:45:10 | 6 | local_dataflow.rb:45:3:45:10 | return | | local_dataflow.rb:49:1:53:3 | [post] self | local_dataflow.rb:55:1:55:14 | self | @@ -2926,6 +2929,7 @@ | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:82:7:82:13 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:85:22:85:28 | self | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:86:28:86:34 | self | +| local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | | local_dataflow.rb:78:12:78:20 | [post] self | local_dataflow.rb:87:20:87:26 | self | | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:79:13:79:13 | b | | local_dataflow.rb:78:12:78:20 | call to source | local_dataflow.rb:80:8:80:8 | a | @@ -2940,6 +2944,7 @@ | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:82:7:82:13 | self | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:85:22:85:28 | self | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:86:28:86:34 | self | +| local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | | local_dataflow.rb:78:12:78:20 | self | local_dataflow.rb:87:20:87:26 | self | | local_dataflow.rb:79:13:79:13 | b | local_dataflow.rb:79:25:79:25 | b | | local_dataflow.rb:79:15:79:45 | then ... | local_dataflow.rb:78:7:88:5 | case ... | @@ -2978,6 +2983,7 @@ | local_dataflow.rb:86:28:86:34 | [post] self | local_dataflow.rb:89:3:89:9 | self | | local_dataflow.rb:86:28:86:34 | call to sink | local_dataflow.rb:86:23:86:53 | then ... | | local_dataflow.rb:86:28:86:34 | self | local_dataflow.rb:89:3:89:9 | self | +| local_dataflow.rb:87:5:87:48 | [input] SSA phi read(self) | local_dataflow.rb:89:3:89:9 | self | | local_dataflow.rb:87:10:87:10 | x | local_dataflow.rb:87:25:87:25 | x | | local_dataflow.rb:87:15:87:48 | then ... | local_dataflow.rb:78:7:88:5 | case ... | | local_dataflow.rb:87:20:87:26 | [post] self | local_dataflow.rb:89:3:89:9 | self | @@ -3168,23 +3174,21 @@ | local_dataflow.rb:136:11:136:11 | [post] x | local_dataflow.rb:137:14:137:14 | x | | local_dataflow.rb:136:11:136:11 | x | local_dataflow.rb:137:14:137:14 | x | | local_dataflow.rb:137:7:138:9 | if ... | local_dataflow.rb:135:5:138:9 | else ... | -| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | +| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | +| local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:10:137:15 | [post] self | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | | local_dataflow.rb:137:10:137:15 | [post] self | local_dataflow.rb:137:21:137:26 | self | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(self) | | local_dataflow.rb:137:10:137:15 | self | local_dataflow.rb:137:21:137:26 | self | | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | -| local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | -| local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | [post] x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:10:137:15 | [input] SSA phi read(x) | | local_dataflow.rb:137:14:137:14 | x | local_dataflow.rb:137:25:137:25 | x | | local_dataflow.rb:137:20:137:26 | ! ... | local_dataflow.rb:137:10:137:26 | ... && ... | -| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | -| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | +| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | local_dataflow.rb:141:9:141:14 | self | +| local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | local_dataflow.rb:141:13:141:13 | x | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | [post] self | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(self) | | local_dataflow.rb:137:21:137:26 | call to use | local_dataflow.rb:137:20:137:26 | ! ... | @@ -3195,8 +3199,8 @@ | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:10:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:137:25:137:25 | x | local_dataflow.rb:137:20:137:26 | [input] SSA phi read(x) | | local_dataflow.rb:141:8:141:14 | ! ... | local_dataflow.rb:141:8:141:37 | ... \|\| ... | -| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | -| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | +| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | +| local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(self) | | local_dataflow.rb:141:9:141:14 | [post] self | local_dataflow.rb:141:20:141:25 | self | | local_dataflow.rb:141:9:141:14 | call to use | local_dataflow.rb:141:8:141:14 | ! ... | @@ -3207,8 +3211,8 @@ | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:8:141:14 | [input] SSA phi read(x) | | local_dataflow.rb:141:13:141:13 | x | local_dataflow.rb:141:24:141:24 | x | | local_dataflow.rb:141:19:141:37 | ( ... ) | local_dataflow.rb:141:8:141:37 | ... \|\| ... | -| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | -| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | +| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | +| local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:19:141:37 | [post] ( ... ) | local_dataflow.rb:141:20:141:36 | [post] ... && ... | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(self) | local_dataflow.rb:143:11:143:16 | self | | local_dataflow.rb:141:20:141:25 | [input] SSA phi read(x) | local_dataflow.rb:143:15:143:15 | x | @@ -3233,8 +3237,6 @@ | local_dataflow.rb:141:35:141:35 | [post] x | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:19:141:37 | [input] SSA phi read(x) | | local_dataflow.rb:141:35:141:35 | x | local_dataflow.rb:141:30:141:36 | [input] SSA phi read(x) | -| local_dataflow.rb:141:38:142:9 | [input] SSA phi read(self) | local_dataflow.rb:147:5:147:10 | self | -| local_dataflow.rb:141:38:142:9 | [input] SSA phi read(x) | local_dataflow.rb:147:9:147:9 | x | | local_dataflow.rb:141:38:142:9 | then ... | local_dataflow.rb:141:5:145:7 | if ... | | local_dataflow.rb:142:7:142:9 | nil | local_dataflow.rb:141:38:142:9 | then ... | | local_dataflow.rb:143:5:144:16 | elsif ... | local_dataflow.rb:141:5:145:7 | if ... | diff --git a/ruby/ql/test/library-tests/variables/ssa.expected b/ruby/ql/test/library-tests/variables/ssa.expected index dfea893b9490..7fb3c27be81c 100644 --- a/ruby/ql/test/library-tests/variables/ssa.expected +++ b/ruby/ql/test/library-tests/variables/ssa.expected @@ -99,11 +99,15 @@ definition | scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | | scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | | scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | +| scopes.rb:26:1:26:12 | self (A) | scopes.rb:26:1:26:12 | self | | scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | +| scopes.rb:28:1:30:3 | self (B) | scopes.rb:28:1:30:3 | self | +| scopes.rb:34:1:36:3 | self (C) | scopes.rb:34:1:36:3 | self | | scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | | scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | | scopes.rb:46:5:46:8 | var2 | scopes.rb:46:5:46:8 | var2 | | scopes.rb:51:1:64:3 | self (ExceptionVariable) | scopes.rb:51:1:64:3 | self | +| scopes.rb:52:3:53:5 | self (MyException) | scopes.rb:52:3:53:5 | self | | scopes.rb:55:3:55:3 | x | scopes.rb:55:3:55:3 | x | | scopes.rb:60:25:60:25 | x | scopes.rb:55:3:55:3 | x | | scopes.rb:66:1:73:3 | self (ParameterShadowing) | scopes.rb:66:1:73:3 | self | From 0ffc606e605784c7d543f82da9bdf7033f0e17cb Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Wed, 12 Aug 2026 14:14:29 +0200 Subject: [PATCH 064/181] Ruby: Fix joinorder. --- .../lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll index 3d3e8a4d0d04..184efdc31b3e 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowDispatch.qll @@ -692,6 +692,9 @@ private CfgScope getTargetInstance(DataFlowCall call, string method) { ) } +pragma[nomagic] +private File callGetFile(DataFlowCall call) { result = call.asCall().getLocation().getFile() } + bindingset[call, result] pragma[inline_late] private CfgScope privateFilter(DataFlowCall call) { @@ -700,7 +703,7 @@ private CfgScope privateFilter(DataFlowCall call) { // This may remove some plausible targets, but also removes a lot of // implausible targets ( - isToplevelMethodInFile(result, call.asCall().getLocation().getFile()) or + isToplevelMethodInFile(result, callGetFile(call)) or not isToplevelMethodInFile(result, _) ) } From 496f9e66421a1864022cf75b09bc07aa807a67f9 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 20 Aug 2026 13:24:24 +0200 Subject: [PATCH 065/181] Ruby: Reintroduce lack of BeginExpr nodes. --- ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll index 72806211f3f7..8439c1a22621 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll @@ -424,6 +424,13 @@ module ExprNodes { /** A control-flow node that wraps a `StmtSequence` AST expression. */ class StmtSequenceCfgNode extends ExprCfgNode { + // TODO: This charpred represents a bug and should be removed when the + // resulting additional data flow does not break performance. + // The old CFG did not include `BeginExpr` nodes in the CFG, but the + // current CFG does. This charpred thus keeps a small subset of the old + // behavior in order to avoid regressions. + StmtSequenceCfgNode() { not super.getExpr() instanceof BeginExpr } + override string getAPrimaryQlClass() { result = "StmtSequenceCfgNode" } override StmtSequence e; From 879280ae466b803b4c0ee2fc85ac97ef848bb956 Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Thu, 20 Aug 2026 15:08:01 +0200 Subject: [PATCH 066/181] Ruby: Accept qltest changes from BeginExpr test. --- .../library-tests/dataflow/local/DataflowStep.expected | 7 +++++++ .../test/library-tests/dataflow/local/TaintStep.expected | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected index f3b2972cc2ce..edc95fe8a7df 100644 --- a/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected @@ -2792,7 +2792,10 @@ | local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:152:16:152:16 | r | | local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:154:26:154:26 | r | | local_dataflow.rb:153:3:153:3 | x | local_dataflow.rb:161:8:161:8 | x | +| local_dataflow.rb:153:7:160:9 | begin ... | local_dataflow.rb:153:3:153:3 | x | +| local_dataflow.rb:153:7:160:9 | begin ... | local_dataflow.rb:153:3:160:9 | ... = ... | | local_dataflow.rb:154:9:154:21 | [post] self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:154:9:154:21 | call to raise | local_dataflow.rb:154:9:154:26 | ... if ... | | local_dataflow.rb:154:9:154:21 | self | local_dataflow.rb:157:9:157:17 | self | | local_dataflow.rb:154:26:154:26 | r | local_dataflow.rb:164:26:164:26 | r | | local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:157:9:157:17 | self | @@ -2810,7 +2813,10 @@ | local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:164:9:164:21 | self | | local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:165:9:165:17 | self | | local_dataflow.rb:163:3:163:3 | y | local_dataflow.rb:173:8:173:8 | y | +| local_dataflow.rb:163:7:172:9 | begin ... | local_dataflow.rb:163:3:163:3 | y | +| local_dataflow.rb:163:7:172:9 | begin ... | local_dataflow.rb:163:3:172:9 | ... = ... | | local_dataflow.rb:164:9:164:21 | [post] self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:164:9:164:21 | call to raise | local_dataflow.rb:164:9:164:26 | ... if ... | | local_dataflow.rb:164:9:164:21 | self | local_dataflow.rb:167:9:167:17 | self | | local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:167:9:167:17 | self | | local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:169:9:169:17 | self | @@ -2825,3 +2831,4 @@ | local_dataflow.rb:171:9:171:17 | [post] self | local_dataflow.rb:173:3:173:9 | self | | local_dataflow.rb:171:9:171:17 | call to source | local_dataflow.rb:170:7:171:17 | ensure ... | | local_dataflow.rb:171:9:171:17 | self | local_dataflow.rb:173:3:173:9 | self | +| local_dataflow.rb:173:3:173:9 | call to sink | local_dataflow.rb:153:3:173:52 | ... | diff --git a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected index 8825ac720029..22c75e5eb970 100644 --- a/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected +++ b/ruby/ql/test/library-tests/dataflow/local/TaintStep.expected @@ -3282,7 +3282,10 @@ | local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:152:16:152:16 | r | | local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:154:26:154:26 | r | | local_dataflow.rb:153:3:153:3 | x | local_dataflow.rb:161:8:161:8 | x | +| local_dataflow.rb:153:7:160:9 | begin ... | local_dataflow.rb:153:3:153:3 | x | +| local_dataflow.rb:153:7:160:9 | begin ... | local_dataflow.rb:153:3:160:9 | ... = ... | | local_dataflow.rb:154:9:154:21 | [post] self | local_dataflow.rb:157:9:157:17 | self | +| local_dataflow.rb:154:9:154:21 | call to raise | local_dataflow.rb:154:9:154:26 | ... if ... | | local_dataflow.rb:154:9:154:21 | self | local_dataflow.rb:157:9:157:17 | self | | local_dataflow.rb:154:26:154:26 | r | local_dataflow.rb:164:26:164:26 | r | | local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:157:9:157:17 | self | @@ -3300,7 +3303,10 @@ | local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:164:9:164:21 | self | | local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:165:9:165:17 | self | | local_dataflow.rb:163:3:163:3 | y | local_dataflow.rb:173:8:173:8 | y | +| local_dataflow.rb:163:7:172:9 | begin ... | local_dataflow.rb:163:3:163:3 | y | +| local_dataflow.rb:163:7:172:9 | begin ... | local_dataflow.rb:163:3:172:9 | ... = ... | | local_dataflow.rb:164:9:164:21 | [post] self | local_dataflow.rb:167:9:167:17 | self | +| local_dataflow.rb:164:9:164:21 | call to raise | local_dataflow.rb:164:9:164:26 | ... if ... | | local_dataflow.rb:164:9:164:21 | self | local_dataflow.rb:167:9:167:17 | self | | local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:167:9:167:17 | self | | local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:169:9:169:17 | self | @@ -3315,3 +3321,4 @@ | local_dataflow.rb:171:9:171:17 | [post] self | local_dataflow.rb:173:3:173:9 | self | | local_dataflow.rb:171:9:171:17 | call to source | local_dataflow.rb:170:7:171:17 | ensure ... | | local_dataflow.rb:171:9:171:17 | self | local_dataflow.rb:173:3:173:9 | self | +| local_dataflow.rb:173:3:173:9 | call to sink | local_dataflow.rb:153:3:173:52 | ... | From ea70e5cce7cedf3f73209c270764b649ffee0fc7 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 20 Aug 2026 16:03:11 +0100 Subject: [PATCH 067/181] C++: Add tests with missing flow sources and sinks. --- .../dataflow/external-models/flow.expected | 212 +++++++++--------- .../dataflow/external-models/flow.ext.yml | 7 + .../dataflow/external-models/sinks.expected | 6 + .../dataflow/external-models/sources.expected | 2 + .../dataflow/external-models/test.cpp | 45 +++- 5 files changed, 167 insertions(+), 105 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 2532476fd1a0..b61607089097 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -37,98 +37,99 @@ models | 36 | Source: ; ; false; source_from_callback_template; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | | 37 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | | 38 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | -| 39 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | -| 40 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | -| 41 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | -| 42 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | -| 43 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | -| 44 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | -| 45 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | -| 46 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 47 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 48 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | -| 49 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 50 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 51 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 52 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 53 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 54 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 55 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | -| 56 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 57 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 58 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 59 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | -| 60 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 61 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | -| 62 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 63 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 64 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 65 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 66 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 67 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | -| 68 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | -| 69 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | -| 70 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 71 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | -| 72 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | -| 73 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | -| 74 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | -| 75 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 76 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 77 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | -| 78 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | -| 79 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | -| 80 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | -| 81 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | -| 82 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 83 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 84 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | -| 85 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 86 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 39 | Source: ; ; false; ymlSourcePtr; ; ; ReturnValue[*]; local; manual | +| 40 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | +| 41 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | +| 42 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | +| 43 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | +| 44 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | +| 45 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | +| 46 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | +| 47 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 48 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 49 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | +| 50 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 51 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 52 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 53 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 54 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 55 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 56 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | +| 57 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 58 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 59 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 60 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | +| 61 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 62 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | +| 63 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 64 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 65 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 66 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 67 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 68 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | +| 69 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | +| 70 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | +| 71 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 72 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | +| 73 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | +| 74 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | +| 75 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | +| 76 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | +| 77 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 78 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | +| 79 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | +| 80 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | +| 81 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | +| 82 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | +| 83 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 84 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 85 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | +| 86 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 87 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:45 | -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:45 Sink:MaD:2 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:46 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:46 Sink:MaD:2 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:100:64:100:71 | *send_str | provenance | TaintFunction | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:2 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:86 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:87 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | -| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:42 | -| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:82 | +| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:43 | +| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:83 | | azure.cpp:257:16:257:21 | Read output argument | azure.cpp:258:10:258:16 | * ... | provenance | | -| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:83 | +| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:84 | | azure.cpp:262:23:262:28 | ReadToCount output argument | azure.cpp:263:10:263:16 | * ... | provenance | | -| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:84 | +| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:85 | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:267:10:267:12 | vec [element] | provenance | | | azure.cpp:267:10:267:12 | vec [element] | azure.cpp:267:10:267:12 | vec | provenance | | -| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:41 | +| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:42 | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:10:274:29 | call to operator[] | provenance | | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:14:274:29 | call to operator[] | provenance | | -| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:40 | +| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:41 | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:278:10:278:13 | body | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:282:21:282:23 | *call to get | provenance | | -| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:39 | -| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:84 | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:40 | +| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:85 | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | -| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:85 | +| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:86 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | -| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:43 | +| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:44 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:290:10:290:20 | headerValue | azure.cpp:290:10:290:20 | headerValue | provenance | | -| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:44 | +| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:45 | | azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:294:38:294:53 | call to operator[] | provenance | TaintFunction | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | @@ -143,13 +144,13 @@ edges | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:32:41:32:41 | x | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:1 | -| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:74 | +| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:75 | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:1 | -| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:73 | +| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:74 | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:75 | +| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:76 | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:1 | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | provenance | | @@ -161,7 +162,7 @@ edges | test.cpp:56:2:56:2 | *s [post update] [x] | test.cpp:59:55:59:64 | *& ... [x] | provenance | | | test.cpp:56:2:56:18 | ... = ... | test.cpp:56:2:56:2 | *s [post update] [x] | provenance | | | test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:38 | -| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:70 | +| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:71 | | test.cpp:68:22:68:22 | y | test.cpp:69:11:69:11 | y | provenance | Sink:MaD:1 | | test.cpp:74:22:74:22 | y | test.cpp:75:11:75:11 | y | provenance | Sink:MaD:1 | | test.cpp:82:22:82:22 | y | test.cpp:83:11:83:11 | y | provenance | Sink:MaD:1 | @@ -171,62 +172,62 @@ edges | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:101:26:101:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:103:63:103:63 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:104:62:104:62 | x | provenance | | -| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:68 | -| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:68 | -| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:68 | -| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:68 | +| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:69 | +| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:69 | +| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:69 | +| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:69 | | test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:114:10:114:18 | call to ymlSource | test.cpp:118:44:118:44 | *x | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:69 | +| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:70 | | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:134:45:134:45 | x | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:134:13:134:43 | call to templateFunction | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:1 | -| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:80 | +| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:81 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:148:26:148:26 | x | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:148:10:148:27 | call to function | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:1 | -| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:81 | +| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:82 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:157:26:157:26 | x | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:157:13:157:20 | call to function | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:1 | -| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:81 | +| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:82 | | test.cpp:164:34:164:34 | x | test.cpp:165:69:165:69 | x | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:164:7:164:7 | *templateFunction3 | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | | -| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:79 | +| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:80 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:38 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:172:51:172:51 | x | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:1 | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | provenance | | -| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:79 | +| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:80 | | test.cpp:186:2:186:2 | *s [post update] [myField] | test.cpp:187:33:187:34 | *& ... [myField] | provenance | | | test.cpp:186:2:186:24 | ... = ... | test.cpp:186:2:186:2 | *s [post update] [myField] | provenance | | | test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:38 | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:188:10:188:10 | x | provenance | Sink:MaD:1 | -| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:71 | +| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:72 | | test.cpp:199:2:199:2 | *s [post update] [myField] | test.cpp:200:35:200:36 | *& ... [myField] | provenance | | | test.cpp:199:2:199:24 | ... = ... | test.cpp:199:2:199:2 | *s [post update] [myField] | provenance | | | test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:38 | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:1 | -| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:72 | +| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:73 | | test.cpp:216:3:216:4 | get_ptr output argument [value] | test.cpp:217:11:217:12 | *rf [value] | provenance | | -| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:78 | +| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:79 | | test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:38 | | test.cpp:217:11:217:12 | *rf [value] | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:1 | | test.cpp:222:3:222:3 | operator[] output argument | test.cpp:223:12:223:12 | *s | provenance | | -| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:77 | +| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:78 | | test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:38 | -| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:76 | +| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:77 | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:223:13:223:15 | call to operator[] | provenance | | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:1 | | test.cpp:243:10:243:10 | *s [value] | test.cpp:243:13:243:17 | value | provenance | | @@ -251,12 +252,13 @@ edges | test.cpp:263:15:263:19 | value | test.cpp:263:15:263:19 | value | provenance | Sink:MaD:1 | | test.cpp:267:32:267:34 | source_from_callback_template output argument | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | test.cpp:263:12:263:12 | *s [value] | provenance | | +| test.cpp:293:11:293:22 | call to ymlSourcePtr | test.cpp:293:10:293:24 | * ... | provenance | Src:MaD:39 Sink:MaD:1 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:3 | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:30:8:30:15 | * ... | provenance | | -| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:48 | +| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:49 | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | windows.cpp:36:10:36:13 | * ... | provenance | | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:4 | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | windows.cpp:41:10:41:13 | * ... | provenance | Src:MaD:5 | @@ -276,11 +278,11 @@ edges | windows.cpp:189:21:189:26 | ReadFile output argument | windows.cpp:190:5:190:56 | *... = ... | provenance | Src:MaD:17 | | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | windows.cpp:192:53:192:63 | *& ... [*hEvent] | provenance | | | windows.cpp:190:5:190:56 | *... = ... | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | provenance | | -| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:55 | +| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:56 | | windows.cpp:198:21:198:26 | ReadFile output argument | windows.cpp:199:5:199:57 | ... = ... | provenance | Src:MaD:17 | | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | windows.cpp:201:53:201:63 | *& ... [hEvent] | provenance | | | windows.cpp:199:5:199:57 | ... = ... | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | provenance | | -| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:55 | +| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:56 | | windows.cpp:209:84:209:89 | NtReadFile output argument | windows.cpp:211:10:211:16 | * ... | provenance | Src:MaD:16 | | windows.cpp:286:23:286:35 | *call to MapViewOfFile | windows.cpp:287:20:287:52 | *pMapView | provenance | | | windows.cpp:286:23:286:35 | call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:12 | @@ -317,9 +319,9 @@ edges | windows.cpp:431:3:431:3 | *s [post update] [x] | windows.cpp:464:7:464:8 | *& ... [x] | provenance | | | windows.cpp:431:3:431:16 | ... = ... | windows.cpp:431:3:431:3 | *s [post update] [x] | provenance | | | windows.cpp:431:9:431:14 | call to source | windows.cpp:431:3:431:16 | ... = ... | provenance | | -| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:51 | -| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:49 | -| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:50 | +| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:52 | +| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:50 | +| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:51 | | windows.cpp:533:11:533:16 | call to source | windows.cpp:533:11:533:16 | call to source | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:537:40:537:41 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:542:38:542:39 | *& ... | provenance | | @@ -328,30 +330,30 @@ edges | windows.cpp:533:11:533:16 | call to source | windows.cpp:568:32:568:33 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:573:40:573:41 | *& ... | provenance | | | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | windows.cpp:538:10:538:23 | access to array | provenance | | -| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:60 | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:61 | | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | windows.cpp:543:10:543:23 | access to array | provenance | | -| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:56 | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:57 | | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | windows.cpp:548:10:548:23 | access to array | provenance | | -| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:57 | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:58 | | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | windows.cpp:553:10:553:23 | access to array | provenance | | -| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:58 | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:59 | | windows.cpp:559:5:559:24 | ... = ... | windows.cpp:561:39:561:44 | *buffer | provenance | | | windows.cpp:559:17:559:24 | call to source | windows.cpp:559:5:559:24 | ... = ... | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:562:10:562:19 | *src_string [*Buffer] | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:563:40:563:50 | *& ... [*Buffer] | provenance | | -| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:61 | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:62 | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:21:562:26 | *Buffer | provenance | | | windows.cpp:562:21:562:26 | *Buffer | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | provenance | | -| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:59 | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:60 | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:22:564:27 | *Buffer | provenance | | | windows.cpp:564:22:564:27 | *Buffer | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | windows.cpp:569:10:569:23 | access to array | provenance | | -| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:62 | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:63 | | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | windows.cpp:574:10:574:23 | access to array | provenance | | -| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:63 | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:64 | | windows.cpp:645:45:645:50 | WinHttpReadData output argument | windows.cpp:647:10:647:16 | * ... | provenance | Src:MaD:33 | | windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | windows.cpp:654:10:654:16 | * ... | provenance | Src:MaD:34 | | windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | windows.cpp:661:10:661:16 | * ... | provenance | Src:MaD:29 | @@ -360,7 +362,7 @@ edges | windows.cpp:669:105:669:112 | WinHttpQueryHeadersEx output argument | windows.cpp:675:10:675:27 | * ... | provenance | Src:MaD:30 | | windows.cpp:728:5:728:28 | ... = ... | windows.cpp:729:35:729:35 | *x | provenance | | | windows.cpp:728:12:728:28 | call to source | windows.cpp:728:5:728:28 | ... = ... | provenance | | -| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:67 | +| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:68 | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:731:10:731:36 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:733:10:733:35 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:735:10:735:37 | * ... | provenance | | @@ -395,35 +397,35 @@ edges | windows.cpp:1087:71:1087:74 | RegEnumValueW output argument | windows.cpp:1089:10:1089:14 | * ... | provenance | Src:MaD:20 | | windows.cpp:1122:5:1122:27 | ... = ... | windows.cpp:1124:19:1124:21 | *str | provenance | | | windows.cpp:1122:14:1122:27 | call to source | windows.cpp:1122:5:1122:27 | ... = ... | provenance | | -| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:53 | +| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:54 | | windows.cpp:1124:24:1124:27 | IIDFromString output argument | windows.cpp:1125:10:1125:12 | iid | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1128:15:1128:20 | call to source | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1130:19:1130:21 | *iid | provenance | | -| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:66 | +| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:67 | | windows.cpp:1130:24:1130:27 | StringFromIID output argument | windows.cpp:1132:10:1132:13 | * ... | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1135:19:1135:24 | call to source | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1137:21:1137:25 | *clsid | provenance | | -| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:54 | +| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:55 | | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | windows.cpp:1139:10:1139:13 | * ... | provenance | | | windows.cpp:1143:5:1143:30 | ... = ... | windows.cpp:1145:21:1145:26 | *progID | provenance | | | windows.cpp:1143:17:1143:30 | call to source | windows.cpp:1143:5:1143:30 | ... = ... | provenance | | -| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:46 | +| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:47 | | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | windows.cpp:1146:10:1146:14 | clsid | provenance | | | windows.cpp:1150:5:1150:27 | ... = ... | windows.cpp:1152:21:1152:23 | *str | provenance | | | windows.cpp:1150:14:1150:27 | call to source | windows.cpp:1150:5:1150:27 | ... = ... | provenance | | -| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:47 | +| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:48 | | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | windows.cpp:1153:10:1153:14 | clsid | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1156:19:1156:24 | call to source | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1158:21:1158:25 | *clsid | provenance | | -| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:64 | +| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:65 | | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | windows.cpp:1160:10:1160:13 | * ... | provenance | | | windows.cpp:1164:5:1164:27 | ... = ... | windows.cpp:1166:20:1166:22 | *str | provenance | | | windows.cpp:1164:14:1164:27 | call to source | windows.cpp:1164:5:1164:27 | ... = ... | provenance | | -| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:52 | +| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:53 | | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | windows.cpp:1167:10:1167:13 | guid | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1170:17:1170:22 | call to source | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1172:21:1172:24 | *guid | provenance | | -| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:65 | +| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:66 | | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | windows.cpp:1174:10:1174:13 | * ... | provenance | | nodes | asio_streams.cpp:87:34:87:44 | read_until output argument | semmle.label | read_until output argument | @@ -615,6 +617,8 @@ nodes | test.cpp:263:15:263:19 | value | semmle.label | value | | test.cpp:267:32:267:34 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:293:10:293:24 | * ... | semmle.label | * ... | +| test.cpp:293:11:293:22 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 87756c451f3a..134aeb018822 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -4,14 +4,21 @@ extensions: extensible: sourceModel data: # namespace, type, subtypes, name, signature, ext, output, kind, provenance - ["", "", False, "ymlSource", "", "", "ReturnValue", "local", "manual"] + - ["", "", False, "ymlSourcePtr", "", "", "ReturnValue[*]", "local", "manual"] - ["", "", False, "ymlFieldSource", "", "", "ReturnValue.Field[SourceWrapper::value]", "local", "manual"] - ["", "", False, "source_from_callback_template", "", "", "Argument[0].Parameter[*0].Field[SourceWrapper::value]", "local", "manual"] - ["", "", False, "source_from_callback_ptr", "", "", "Argument[0].Parameter[*0].Field[SourceWrapper::value]", "local", "manual"] + - ["", "", False, "source_from_callback_return_template", "", "", "Argument[0].ReturnValue", "local", "manual"] + - ["", "", False, "source_from_callback_return_ptr", "", "", "Argument[0].ReturnValue", "local", "manual"] + - ["", "", False, "source_ptr_from_callback_return_ptr", "", "", "Argument[0].ReturnValue[*]", "local", "manual"] - addsTo: pack: codeql/cpp-all extensible: sinkModel data: # namespace, type, subtypes, name, signature, ext, input, kind, provenance - ["", "", False, "ymlSink", "", "", "Argument[0]", "test-sink", "manual"] + - ["", "", False, "sink_from_callback_return_template", "", "", "Argument[0].ReturnValue", "test-sink", "manual"] + - ["", "", False, "sink_from_callback_return_ptr", "", "", "Argument[0].ReturnValue", "test-sink", "manual"] + - ["", "", False, "sink_ptr_from_callback_return_ptr", "", "", "Argument[0].ReturnValue[*]", "test-sink", "manual"] - addsTo: pack: codeql/cpp-all extensible: summaryModel diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 32f130cd165d..158f3a2a71f8 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -28,3 +28,9 @@ | test.cpp:254:14:254:18 | value | test-sink | | test.cpp:258:14:258:18 | value | test-sink | | test.cpp:263:15:263:19 | value | test-sink | +| test.cpp:292:15:292:26 | call to ymlSourcePtr | test-sink | +| test.cpp:293:10:293:24 | * ... | test-sink | +| test.cpp:296:10:296:31 | call to callback_returning_int | test-sink | +| test.cpp:299:10:299:33 | call to callback_returning_int_2 | test-sink | +| test.cpp:303:15:303:17 | ptr | test-sink | +| test.cpp:304:10:304:13 | * ... | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 9c04945642e9..5ca05449bc4f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -17,6 +17,8 @@ | test.cpp:199:14:199:22 | call to ymlSource | local | | test.cpp:216:18:216:26 | call to ymlSource | local | | test.cpp:222:10:222:18 | call to ymlSource | local | +| test.cpp:286:33:286:41 | call to ymlSource | local | +| test.cpp:306:51:306:59 | call to ymlSource | local | | windows.cpp:22:15:22:29 | call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index bfdf213fc3c1..52c57f3a881e 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -1,5 +1,5 @@ -int ymlSource(); +int ymlSource(); int* ymlSourcePtr(); void ymlSink(int value); int ymlStepManual(int value); int ymlStepGenerated(int value); @@ -265,4 +265,47 @@ void test_source_access_path() { }; source_from_callback_template(S()); +} + +template void source_from_callback_return_template(F); +template void sink_from_callback_return_template(F); + +using IntCallback = int(*)(void); +using IntPtrCallback = int*(*)(void); + +void source_from_callback_return_ptr(IntCallback); +void sink_from_callback_return_ptr(IntCallback); + +void source_ptr_from_callback_return_ptr(IntPtrCallback); +void sink_ptr_from_callback_return_ptr(IntPtrCallback); + +int callback_returning_int() { return 0; } +int callback_returning_int_2() { return 0; } +int* callback_returning_ptr_int() { return nullptr; } + +int return_ymlSource() { return ymlSource(); } + +int* return_ptr_to_ymlSource() { return ymlSourcePtr(); } + +void test_callback_return_access_paths() { + + ymlSink((int)ymlSourcePtr()); // clean + ymlSink(*ymlSourcePtr()); // $ ir + + source_from_callback_return_template(callback_returning_int); + ymlSink(callback_returning_int()); // $ MISSING: ir + + source_from_callback_return_ptr(callback_returning_int_2); + ymlSink(callback_returning_int_2()); // $ MISSING: ir + + source_ptr_from_callback_return_ptr(callback_returning_ptr_int); + int *ptr = callback_returning_ptr_int(); + ymlSink((int)ptr); // clean + ymlSink(*ptr); // $ MISSING: ir + + sink_from_callback_return_template([]() { return ymlSource(); }); // $ MISSING: ir + sink_from_callback_return_template(return_ymlSource); // $ MISSING: ir + + sink_ptr_from_callback_return_ptr([]() { return ymlSourcePtr(); }); // $ MISSING: ir + sink_ptr_from_callback_return_ptr(return_ptr_to_ymlSource); // $ MISSING: ir } \ No newline at end of file From bbff992ee161a21c59c26d6b2747a741763b715f Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Thu, 20 Aug 2026 17:18:42 +0200 Subject: [PATCH 068/181] Add change note --- .../2026-08-20-unused-variables-in-incomplete-functions.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md diff --git a/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md b/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md new file mode 100644 index 000000000000..882c91178175 --- /dev/null +++ b/rust/ql/src/change-notes/2026-08-20-unused-variables-in-incomplete-functions.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `rust/unused-variable` query no longer reports variables in functions containing the standard `todo!()` or `unimplemented!()` macros. \ No newline at end of file From 1dd500d4551acf2c7b417dffce95d7543083fa6f Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 20 Aug 2026 16:05:47 +0100 Subject: [PATCH 069/181] C++: Support 'ReturnValue' in both sources and sinks. --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 65 +++++++++++++++++-- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index 7a43fe19492e..d45db30dc1c0 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -139,6 +139,28 @@ private class ConversionCall extends Call { private module Input2 implements Impl::Private::InputSig2 { private import codeql.util.Void + pragma[nomagic] + private predicate hasFunctionAndIndirectionIndex( + Function f, int indirectionIndex, Ssa::ExplicitDefinition def + ) { + def.getFunction() = f and + def.getSourceVariable().getIRVariable() instanceof IRReturnVariable and + def.getIndirectionIndex() = indirectionIndex + } + + /** Holds if `def` defines `e` as a returned value with return kind `rk`. */ + bindingset[rk, e] + private predicate isReturnExpr(Function f, ReturnKind rk, Expr e) { + exists(Ssa::ExplicitDefinition def | + hasFunctionAndIndirectionIndex(f, rk.getIndirectionIndex(), def) and + e = + def.getAssignedInstruction() + .(StoreInstruction) + .getSourceValue() + .getUnconvertedResultExpression() + ) + } + class SourceSinkReportingElement extends Element { SourceSinkReportingElement() { this instanceof Expr or this instanceof Parameter } @@ -159,13 +181,25 @@ private module Input2 implements Impl::Private::InputSig2 { result = this.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() } + /** Gets the function invoked when this element is used as a callback. */ + private Function getCallbackFunction() { + // Taking the address of a function + result = this.(FunctionAccess).getTarget() + or + // Passing an object with an overloaded `operator()` + result = this.getOperatorCallFunction() + } + SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { - exists(ParameterPosition pos | sc = Impl::Private::SummaryComponent::parameter(pos) | - // Taking the address of a function - result = pos.getParameter(this.(FunctionAccess).getTarget()) + exists(Function f | f = this.getCallbackFunction() | + exists(ParameterPosition pos | sc = Impl::Private::SummaryComponent::parameter(pos) | + result = pos.getParameter(f) + ) or - // Passing an object with an overloaded `operator()` - result = pos.getParameter(this.getOperatorCallFunction()) + exists(ReturnKind rk | + sc = Impl::Private::SummaryComponent::return(rk) and + isReturnExpr(f, rk, result) + ) ) } } @@ -197,6 +231,12 @@ private module Input2 implements Impl::Private::InputSig2 { pragma[only_bind_out](rk.getIndirectionIndex()) } + pragma[nomagic] + private predicate hasKindAndEnclosingFunction(Function f, ReturnKind rk, ReturnNode r) { + r.getEnclosingCallable().asSourceCallable() = f and + r.getKind() = rk + } + bindingset[e, sc] Node getSourceDataFlowNode(SourceSinkReportingElement e, Impl::Private::SummaryComponent sc) { exists(DataFlowCall call | @@ -212,6 +252,7 @@ private module Input2 implements Impl::Private::InputSig2 { or exists(ReturnKind rk | sc = Impl::Private::SummaryComponent::return(rk) and + // When `e` is a call the node becomes an `OutNode`. e = call.asCallInstruction().getUnconvertedResultExpression() | rk.getIndirectionIndex() = 0 and @@ -226,6 +267,14 @@ private module Input2 implements Impl::Private::InputSig2 { p.isParameterOf(e.getEnclosingCallable(), pos) and result = p ) + or + exists(Function f, ReturnKind rk | + sc = Impl::Private::SummaryComponent::return(rk) and + // When `e` is the returned expression from a function the node is + // the `ReturnNode`. + isReturnExpr(f, rk, e) and + hasKindAndEnclosingFunction(f, rk, result) + ) } bindingset[sink, sc] @@ -246,6 +295,12 @@ private module Input2 implements Impl::Private::InputSig2 { pos.getArgument(call.getUnconvertedResultExpression()) = e and result.(ArgumentNode).sourceArgumentOf(call, pos) ) + or + exists(Function f, ReturnKind rk | + sc = Impl::Private::SummaryComponent::return(rk) and + isReturnExpr(f, rk, e) and + hasKindAndEnclosingFunction(f, rk, result) + ) } } From f0a4145c9cf0395365cd56006c71623ce13a6336 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 20 Aug 2026 16:06:54 +0100 Subject: [PATCH 070/181] C++: Accept test changes. --- .../dataflow/external-models/flow.expected | 522 ++++++++++-------- .../dataflow/external-models/test.cpp | 14 +- 2 files changed, 294 insertions(+), 242 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index b61607089097..0ee182649a08 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -1,267 +1,294 @@ models -| 1 | Sink: ; ; false; ymlSink; ; ; Argument[0]; test-sink; manual | -| 2 | Sink: boost::asio; ; false; write; ; ; Argument[*1]; remote-sink; manual | -| 3 | Source: ; ; false; GetCommandLineA; ; ; ReturnValue[*]; local; manual | -| 4 | Source: ; ; false; GetEnvironmentStringsA; ; ; ReturnValue[*]; local; manual | -| 5 | Source: ; ; false; GetEnvironmentVariableA; ; ; Argument[*1]; local; manual | -| 6 | Source: ; ; false; HttpReceiveClientCertificate; ; ; Argument[*3]; remote; manual | -| 7 | Source: ; ; false; HttpReceiveHttpRequest; ; ; Argument[*3]; remote; manual | -| 8 | Source: ; ; false; HttpReceiveRequestEntityBody; ; ; Argument[*3]; remote; manual | -| 9 | Source: ; ; false; MapViewOfFile2; ; ; ReturnValue[*]; local; manual | -| 10 | Source: ; ; false; MapViewOfFile3; ; ; ReturnValue[*]; local; manual | -| 11 | Source: ; ; false; MapViewOfFile3FromApp; ; ; ReturnValue[*]; local; manual | -| 12 | Source: ; ; false; MapViewOfFile; ; ; ReturnValue[*]; local; manual | -| 13 | Source: ; ; false; MapViewOfFileEx; ; ; ReturnValue[*]; local; manual | -| 14 | Source: ; ; false; MapViewOfFileFromApp; ; ; ReturnValue[*]; local; manual | -| 15 | Source: ; ; false; MapViewOfFileNuma2; ; ; ReturnValue[*]; local; manual | -| 16 | Source: ; ; false; NtReadFile; ; ; Argument[*5]; local; manual | -| 17 | Source: ; ; false; ReadFile; ; ; Argument[*1]; local; manual | -| 18 | Source: ; ; false; ReadFileEx; ; ; Argument[*1]; local; manual | -| 19 | Source: ; ; false; RegEnumValueA; ; ; Argument[*2,*6]; windows-registry; manual | -| 20 | Source: ; ; false; RegEnumValueW; ; ; Argument[*2,*6]; windows-registry; manual | -| 21 | Source: ; ; false; RegGetValueA; ; ; Argument[*5]; windows-registry; manual | -| 22 | Source: ; ; false; RegGetValueW; ; ; Argument[*5]; windows-registry; manual | -| 23 | Source: ; ; false; RegQueryMultipleValuesA; ; ; Argument[*3]; windows-registry; manual | -| 24 | Source: ; ; false; RegQueryMultipleValuesW; ; ; Argument[*3]; windows-registry; manual | -| 25 | Source: ; ; false; RegQueryValueA; ; ; Argument[*2]; windows-registry; manual | -| 26 | Source: ; ; false; RegQueryValueExA; ; ; Argument[*4]; windows-registry; manual | -| 27 | Source: ; ; false; RegQueryValueExW; ; ; Argument[*4]; windows-registry; manual | -| 28 | Source: ; ; false; RegQueryValueW; ; ; Argument[*2]; windows-registry; manual | -| 29 | Source: ; ; false; WinHttpQueryHeaders; ; ; Argument[*3]; remote; manual | -| 30 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[**8]; remote; manual | -| 31 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[*5]; remote; manual | -| 32 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[*6]; remote; manual | -| 33 | Source: ; ; false; WinHttpReadData; ; ; Argument[*1]; remote; manual | -| 34 | Source: ; ; false; WinHttpReadDataEx; ; ; Argument[*1]; remote; manual | -| 35 | Source: ; ; false; source_from_callback_ptr; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | -| 36 | Source: ; ; false; source_from_callback_template; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | -| 37 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | -| 38 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | -| 39 | Source: ; ; false; ymlSourcePtr; ; ; ReturnValue[*]; local; manual | -| 40 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | -| 41 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | -| 42 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | -| 43 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | -| 44 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | -| 45 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | -| 46 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | -| 47 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 48 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 49 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | -| 50 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 51 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 52 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 53 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 54 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 55 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 56 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | -| 57 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 58 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 59 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 60 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | -| 61 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 62 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | -| 63 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 64 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 65 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 66 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 67 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 68 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | -| 69 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | -| 70 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | -| 71 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 72 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | -| 73 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | -| 74 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | -| 75 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | -| 76 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 77 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 78 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | -| 79 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | -| 80 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | -| 81 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | -| 82 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | -| 83 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 84 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 85 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | -| 86 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 87 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 1 | Sink: ; ; false; sink_from_callback_return_template; ; ; Argument[0].ReturnValue; test-sink; manual | +| 2 | Sink: ; ; false; sink_ptr_from_callback_return_ptr; ; ; Argument[0].ReturnValue[*]; test-sink; manual | +| 3 | Sink: ; ; false; ymlSink; ; ; Argument[0]; test-sink; manual | +| 4 | Sink: boost::asio; ; false; write; ; ; Argument[*1]; remote-sink; manual | +| 5 | Source: ; ; false; GetCommandLineA; ; ; ReturnValue[*]; local; manual | +| 6 | Source: ; ; false; GetEnvironmentStringsA; ; ; ReturnValue[*]; local; manual | +| 7 | Source: ; ; false; GetEnvironmentVariableA; ; ; Argument[*1]; local; manual | +| 8 | Source: ; ; false; HttpReceiveClientCertificate; ; ; Argument[*3]; remote; manual | +| 9 | Source: ; ; false; HttpReceiveHttpRequest; ; ; Argument[*3]; remote; manual | +| 10 | Source: ; ; false; HttpReceiveRequestEntityBody; ; ; Argument[*3]; remote; manual | +| 11 | Source: ; ; false; MapViewOfFile2; ; ; ReturnValue[*]; local; manual | +| 12 | Source: ; ; false; MapViewOfFile3; ; ; ReturnValue[*]; local; manual | +| 13 | Source: ; ; false; MapViewOfFile3FromApp; ; ; ReturnValue[*]; local; manual | +| 14 | Source: ; ; false; MapViewOfFile; ; ; ReturnValue[*]; local; manual | +| 15 | Source: ; ; false; MapViewOfFileEx; ; ; ReturnValue[*]; local; manual | +| 16 | Source: ; ; false; MapViewOfFileFromApp; ; ; ReturnValue[*]; local; manual | +| 17 | Source: ; ; false; MapViewOfFileNuma2; ; ; ReturnValue[*]; local; manual | +| 18 | Source: ; ; false; NtReadFile; ; ; Argument[*5]; local; manual | +| 19 | Source: ; ; false; ReadFile; ; ; Argument[*1]; local; manual | +| 20 | Source: ; ; false; ReadFileEx; ; ; Argument[*1]; local; manual | +| 21 | Source: ; ; false; RegEnumValueA; ; ; Argument[*2,*6]; windows-registry; manual | +| 22 | Source: ; ; false; RegEnumValueW; ; ; Argument[*2,*6]; windows-registry; manual | +| 23 | Source: ; ; false; RegGetValueA; ; ; Argument[*5]; windows-registry; manual | +| 24 | Source: ; ; false; RegGetValueW; ; ; Argument[*5]; windows-registry; manual | +| 25 | Source: ; ; false; RegQueryMultipleValuesA; ; ; Argument[*3]; windows-registry; manual | +| 26 | Source: ; ; false; RegQueryMultipleValuesW; ; ; Argument[*3]; windows-registry; manual | +| 27 | Source: ; ; false; RegQueryValueA; ; ; Argument[*2]; windows-registry; manual | +| 28 | Source: ; ; false; RegQueryValueExA; ; ; Argument[*4]; windows-registry; manual | +| 29 | Source: ; ; false; RegQueryValueExW; ; ; Argument[*4]; windows-registry; manual | +| 30 | Source: ; ; false; RegQueryValueW; ; ; Argument[*2]; windows-registry; manual | +| 31 | Source: ; ; false; WinHttpQueryHeaders; ; ; Argument[*3]; remote; manual | +| 32 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[**8]; remote; manual | +| 33 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[*5]; remote; manual | +| 34 | Source: ; ; false; WinHttpQueryHeadersEx; ; ; Argument[*6]; remote; manual | +| 35 | Source: ; ; false; WinHttpReadData; ; ; Argument[*1]; remote; manual | +| 36 | Source: ; ; false; WinHttpReadDataEx; ; ; Argument[*1]; remote; manual | +| 37 | Source: ; ; false; source_from_callback_ptr; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | +| 38 | Source: ; ; false; source_from_callback_return_ptr; ; ; Argument[0].ReturnValue; local; manual | +| 39 | Source: ; ; false; source_from_callback_return_template; ; ; Argument[0].ReturnValue; local; manual | +| 40 | Source: ; ; false; source_from_callback_template; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | +| 41 | Source: ; ; false; source_ptr_from_callback_return_ptr; ; ; Argument[0].ReturnValue[*]; local; manual | +| 42 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | +| 43 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | +| 44 | Source: ; ; false; ymlSourcePtr; ; ; ReturnValue[*]; local; manual | +| 45 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | +| 46 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | +| 47 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | +| 48 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | +| 49 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | +| 50 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | +| 51 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | +| 52 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 53 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 54 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | +| 55 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 56 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 57 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 58 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 59 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 60 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 61 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | +| 62 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 63 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 64 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 65 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | +| 66 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 67 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | +| 68 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 69 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 70 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 71 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 72 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 73 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | +| 74 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | +| 75 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | +| 76 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 77 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | +| 78 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | +| 79 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | +| 80 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | +| 81 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | +| 82 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 83 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | +| 84 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | +| 85 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | +| 86 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | +| 87 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | +| 88 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 89 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 90 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | +| 91 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 92 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:46 | -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:46 Sink:MaD:2 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:51 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:51 Sink:MaD:4 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:100:64:100:71 | *send_str | provenance | TaintFunction | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | -| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:2 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:87 | +| asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:4 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:92 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | -| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:43 | -| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:83 | +| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:48 | +| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:88 | | azure.cpp:257:16:257:21 | Read output argument | azure.cpp:258:10:258:16 | * ... | provenance | | -| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:84 | +| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:89 | | azure.cpp:262:23:262:28 | ReadToCount output argument | azure.cpp:263:10:263:16 | * ... | provenance | | -| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:85 | +| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:90 | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:267:10:267:12 | vec [element] | provenance | | | azure.cpp:267:10:267:12 | vec [element] | azure.cpp:267:10:267:12 | vec | provenance | | -| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:42 | +| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:47 | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:10:274:29 | call to operator[] | provenance | | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:14:274:29 | call to operator[] | provenance | | -| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:41 | +| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:46 | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:278:10:278:13 | body | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:282:21:282:23 | *call to get | provenance | | -| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:40 | -| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:85 | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:45 | +| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:90 | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | -| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:86 | +| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:91 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | -| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:44 | +| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:49 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:290:10:290:20 | headerValue | azure.cpp:290:10:290:20 | headerValue | provenance | | -| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:45 | +| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:50 | | azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:294:38:294:53 | call to operator[] | provenance | TaintFunction | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | -| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:38 | -| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:14:10:14:10 | x | provenance | Sink:MaD:1 | +| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:14:10:14:10 | x | provenance | Sink:MaD:3 | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:17:24:17:24 | x | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:21:27:21:27 | x | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:25:35:25:35 | x | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:32:41:32:41 | x | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | | -| test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:1 | -| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:75 | +| test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:3 | +| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:80 | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | | -| test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:1 | -| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:74 | +| test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:3 | +| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:79 | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | | -| test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:76 | +| test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:3 | +| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:81 | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | -| test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:1 | +| test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:3 | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | provenance | | | test.cpp:32:41:32:41 | x | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:46:30:46:32 | *arg [x] | test.cpp:47:12:47:19 | *arg [x] | provenance | | | test.cpp:47:12:47:19 | *arg [x] | test.cpp:48:13:48:13 | *s [x] | provenance | | | test.cpp:48:13:48:13 | *s [x] | test.cpp:48:16:48:16 | x | provenance | | -| test.cpp:48:16:48:16 | x | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:1 | +| test.cpp:48:16:48:16 | x | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:3 | | test.cpp:56:2:56:2 | *s [post update] [x] | test.cpp:59:55:59:64 | *& ... [x] | provenance | | | test.cpp:56:2:56:18 | ... = ... | test.cpp:56:2:56:2 | *s [post update] [x] | provenance | | -| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:38 | -| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:71 | -| test.cpp:68:22:68:22 | y | test.cpp:69:11:69:11 | y | provenance | Sink:MaD:1 | -| test.cpp:74:22:74:22 | y | test.cpp:75:11:75:11 | y | provenance | Sink:MaD:1 | -| test.cpp:82:22:82:22 | y | test.cpp:83:11:83:11 | y | provenance | Sink:MaD:1 | -| test.cpp:88:22:88:22 | y | test.cpp:89:11:89:11 | y | provenance | Sink:MaD:1 | -| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:43 | +| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:76 | +| test.cpp:68:22:68:22 | y | test.cpp:69:11:69:11 | y | provenance | Sink:MaD:3 | +| test.cpp:74:22:74:22 | y | test.cpp:75:11:75:11 | y | provenance | Sink:MaD:3 | +| test.cpp:82:22:82:22 | y | test.cpp:83:11:83:11 | y | provenance | Sink:MaD:3 | +| test.cpp:88:22:88:22 | y | test.cpp:89:11:89:11 | y | provenance | Sink:MaD:3 | +| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:97:26:97:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:101:26:101:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:103:63:103:63 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:104:62:104:62 | x | provenance | | -| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:69 | -| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:69 | -| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:69 | -| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:69 | -| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:74 | +| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:74 | +| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:74 | +| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:74 | +| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:114:10:114:18 | call to ymlSource | test.cpp:118:44:118:44 | *x | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | | -| test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:1 | -| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:70 | -| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:3 | +| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:75 | +| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:134:45:134:45 | x | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:134:13:134:43 | call to templateFunction | provenance | | -| test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:1 | -| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:81 | -| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:3 | +| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:86 | +| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:148:26:148:26 | x | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:148:10:148:27 | call to function | provenance | | -| test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:1 | -| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:82 | -| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:3 | +| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:87 | +| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:157:26:157:26 | x | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:157:13:157:20 | call to function | provenance | | -| test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:1 | -| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:82 | +| test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:3 | +| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:87 | | test.cpp:164:34:164:34 | x | test.cpp:165:69:165:69 | x | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:164:7:164:7 | *templateFunction3 | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | | -| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:80 | -| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:38 | +| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:85 | +| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:43 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:172:51:172:51 | x | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | | -| test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:1 | +| test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:3 | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | provenance | | -| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:80 | +| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:85 | | test.cpp:186:2:186:2 | *s [post update] [myField] | test.cpp:187:33:187:34 | *& ... [myField] | provenance | | | test.cpp:186:2:186:24 | ... = ... | test.cpp:186:2:186:2 | *s [post update] [myField] | provenance | | -| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:38 | +| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:43 | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | | -| test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:188:10:188:10 | x | provenance | Sink:MaD:1 | -| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:72 | +| test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:188:10:188:10 | x | provenance | Sink:MaD:3 | +| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:77 | | test.cpp:199:2:199:2 | *s [post update] [myField] | test.cpp:200:35:200:36 | *& ... [myField] | provenance | | | test.cpp:199:2:199:24 | ... = ... | test.cpp:199:2:199:2 | *s [post update] [myField] | provenance | | -| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:38 | +| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:43 | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | | -| test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:1 | -| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:73 | +| test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:3 | +| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:78 | | test.cpp:216:3:216:4 | get_ptr output argument [value] | test.cpp:217:11:217:12 | *rf [value] | provenance | | -| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:79 | -| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:38 | +| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:84 | +| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:43 | | test.cpp:217:11:217:12 | *rf [value] | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:217:14:217:18 | value | provenance | | -| test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:1 | +| test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:3 | | test.cpp:222:3:222:3 | operator[] output argument | test.cpp:223:12:223:12 | *s | provenance | | -| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:78 | -| test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:38 | -| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:77 | +| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:83 | +| test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:43 | +| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:82 | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:223:13:223:15 | call to operator[] | provenance | | -| test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:1 | +| test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:3 | | test.cpp:243:10:243:10 | *s [value] | test.cpp:243:13:243:17 | value | provenance | | -| test.cpp:243:13:243:17 | value | test.cpp:243:13:243:17 | value | provenance | Sink:MaD:1 | -| test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:37 | +| test.cpp:243:13:243:17 | value | test.cpp:243:13:243:17 | value | provenance | Sink:MaD:3 | +| test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:42 | | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | test.cpp:248:10:248:16 | *wrapper [value] | provenance | | | test.cpp:248:10:248:16 | *wrapper [value] | test.cpp:248:18:248:22 | value | provenance | | -| test.cpp:248:18:248:22 | value | test.cpp:248:18:248:22 | value | provenance | Sink:MaD:1 | -| test.cpp:250:32:250:32 | source_from_callback_template output argument | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:248:18:248:22 | value | test.cpp:248:18:248:22 | value | provenance | Sink:MaD:3 | +| test.cpp:250:32:250:32 | source_from_callback_template output argument | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | -| test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:35 | +| test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | -| test.cpp:253:32:255:2 | source_from_callback_template output argument | test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:253:32:255:2 | source_from_callback_template output argument | test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | | test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | test.cpp:254:11:254:11 | *s [value] | provenance | | | test.cpp:254:11:254:11 | *s [value] | test.cpp:254:14:254:18 | value | provenance | | -| test.cpp:254:14:254:18 | value | test.cpp:254:14:254:18 | value | provenance | Sink:MaD:1 | -| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:35 | +| test.cpp:254:14:254:18 | value | test.cpp:254:14:254:18 | value | provenance | Sink:MaD:3 | +| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | | test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | test.cpp:258:11:258:11 | *s [value] | provenance | | | test.cpp:258:11:258:11 | *s [value] | test.cpp:258:14:258:18 | value | provenance | | -| test.cpp:258:14:258:18 | value | test.cpp:258:14:258:18 | value | provenance | Sink:MaD:1 | +| test.cpp:258:14:258:18 | value | test.cpp:258:14:258:18 | value | provenance | Sink:MaD:3 | | test.cpp:263:12:263:12 | *s [value] | test.cpp:263:15:263:19 | value | provenance | | -| test.cpp:263:15:263:19 | value | test.cpp:263:15:263:19 | value | provenance | Sink:MaD:1 | -| test.cpp:267:32:267:34 | source_from_callback_template output argument | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:36 | +| test.cpp:263:15:263:19 | value | test.cpp:263:15:263:19 | value | provenance | Sink:MaD:3 | +| test.cpp:267:32:267:34 | source_from_callback_template output argument | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | test.cpp:263:12:263:12 | *s [value] | provenance | | -| test.cpp:293:11:293:22 | call to ymlSourcePtr | test.cpp:293:10:293:24 | * ... | provenance | Src:MaD:39 Sink:MaD:1 | +| test.cpp:282:5:282:26 | *callback_returning_int | test.cpp:296:10:296:31 | call to callback_returning_int | provenance | | +| test.cpp:283:5:283:28 | *callback_returning_int_2 | test.cpp:299:10:299:33 | call to callback_returning_int_2 | provenance | | +| test.cpp:284:6:284:31 | **callback_returning_ptr_int | test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | provenance | | +| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:286:33:286:41 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:307:37:307:52 | return_ymlSource | provenance | Sink:MaD:1 | +| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:307:37:307:52 | return_ymlSource | provenance | Src:MaD:43 Sink:MaD:1 | +| test.cpp:288:41:288:52 | *call to ymlSourcePtr | test.cpp:310:36:310:58 | return_ptr_to_ymlSource | provenance | Sink:MaD:2 | +| test.cpp:288:41:288:52 | call to ymlSourcePtr | test.cpp:288:41:288:52 | *call to ymlSourcePtr | provenance | Src:MaD:44 | +| test.cpp:288:41:288:52 | call to ymlSourcePtr | test.cpp:310:36:310:58 | return_ptr_to_ymlSource | provenance | Src:MaD:44 Sink:MaD:2 | +| test.cpp:293:11:293:22 | call to ymlSourcePtr | test.cpp:293:10:293:24 | * ... | provenance | Src:MaD:44 Sink:MaD:3 | +| test.cpp:295:39:295:60 | source_from_callback_return_template output argument | test.cpp:282:5:282:26 | *callback_returning_int | provenance | Src:MaD:39 | +| test.cpp:296:10:296:31 | call to callback_returning_int | test.cpp:296:10:296:31 | call to callback_returning_int | provenance | Sink:MaD:3 | +| test.cpp:298:34:298:57 | source_from_callback_return_ptr output argument | test.cpp:283:5:283:28 | *callback_returning_int_2 | provenance | Src:MaD:38 | +| test.cpp:299:10:299:33 | call to callback_returning_int_2 | test.cpp:299:10:299:33 | call to callback_returning_int_2 | provenance | Sink:MaD:3 | +| test.cpp:301:38:301:63 | source_ptr_from_callback_return_ptr output argument | test.cpp:284:6:284:31 | **callback_returning_ptr_int | provenance | Src:MaD:41 | +| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | provenance | | +| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | test.cpp:304:10:304:13 | * ... | provenance | Sink:MaD:3 | +| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:37:306:64 | [...](...){...} | provenance | Sink:MaD:1 | +| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:37:306:64 | [...](...){...} | provenance | Src:MaD:43 Sink:MaD:1 | +| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:51:306:59 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:309:50:309:61 | *call to ymlSourcePtr | test.cpp:309:36:309:36 | call to operator int *(*)() | provenance | Sink:MaD:2 | +| test.cpp:309:50:309:61 | call to ymlSourcePtr | test.cpp:309:36:309:36 | call to operator int *(*)() | provenance | Src:MaD:44 Sink:MaD:2 | +| test.cpp:309:50:309:61 | call to ymlSourcePtr | test.cpp:309:50:309:61 | *call to ymlSourcePtr | provenance | Src:MaD:44 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | -| windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:3 | +| windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:30:8:30:15 | * ... | provenance | | -| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:49 | +| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:54 | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | windows.cpp:36:10:36:13 | * ... | provenance | | -| windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:4 | -| windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | windows.cpp:41:10:41:13 | * ... | provenance | Src:MaD:5 | +| windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:6 | +| windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | windows.cpp:41:10:41:13 | * ... | provenance | Src:MaD:7 | | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | windows.cpp:149:42:149:53 | *lpOverlapped [*hEvent] | provenance | | | windows.cpp:149:18:149:62 | *hEvent | windows.cpp:149:18:149:62 | *hEvent | provenance | | | windows.cpp:149:18:149:62 | *hEvent | windows.cpp:151:8:151:14 | * ... | provenance | | @@ -273,37 +300,37 @@ edges | windows.cpp:159:12:159:55 | hEvent | windows.cpp:160:8:160:8 | c | provenance | | | windows.cpp:159:35:159:46 | *lpOverlapped [hEvent] | windows.cpp:159:12:159:55 | hEvent | provenance | | | windows.cpp:159:35:159:46 | *lpOverlapped [hEvent] | windows.cpp:159:12:159:55 | hEvent | provenance | | -| windows.cpp:168:35:168:40 | ReadFile output argument | windows.cpp:170:10:170:16 | * ... | provenance | Src:MaD:17 | -| windows.cpp:177:23:177:28 | ReadFileEx output argument | windows.cpp:179:10:179:16 | * ... | provenance | Src:MaD:18 | -| windows.cpp:189:21:189:26 | ReadFile output argument | windows.cpp:190:5:190:56 | *... = ... | provenance | Src:MaD:17 | +| windows.cpp:168:35:168:40 | ReadFile output argument | windows.cpp:170:10:170:16 | * ... | provenance | Src:MaD:19 | +| windows.cpp:177:23:177:28 | ReadFileEx output argument | windows.cpp:179:10:179:16 | * ... | provenance | Src:MaD:20 | +| windows.cpp:189:21:189:26 | ReadFile output argument | windows.cpp:190:5:190:56 | *... = ... | provenance | Src:MaD:19 | | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | windows.cpp:192:53:192:63 | *& ... [*hEvent] | provenance | | | windows.cpp:190:5:190:56 | *... = ... | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | provenance | | -| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:56 | -| windows.cpp:198:21:198:26 | ReadFile output argument | windows.cpp:199:5:199:57 | ... = ... | provenance | Src:MaD:17 | +| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:61 | +| windows.cpp:198:21:198:26 | ReadFile output argument | windows.cpp:199:5:199:57 | ... = ... | provenance | Src:MaD:19 | | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | windows.cpp:201:53:201:63 | *& ... [hEvent] | provenance | | | windows.cpp:199:5:199:57 | ... = ... | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | provenance | | -| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:56 | -| windows.cpp:209:84:209:89 | NtReadFile output argument | windows.cpp:211:10:211:16 | * ... | provenance | Src:MaD:16 | +| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:61 | +| windows.cpp:209:84:209:89 | NtReadFile output argument | windows.cpp:211:10:211:16 | * ... | provenance | Src:MaD:18 | | windows.cpp:286:23:286:35 | *call to MapViewOfFile | windows.cpp:287:20:287:52 | *pMapView | provenance | | -| windows.cpp:286:23:286:35 | call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:12 | +| windows.cpp:286:23:286:35 | call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:14 | | windows.cpp:287:20:287:52 | *pMapView | windows.cpp:289:10:289:16 | * ... | provenance | | | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | windows.cpp:294:20:294:52 | *pMapView | provenance | | -| windows.cpp:293:23:293:36 | call to MapViewOfFile2 | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | provenance | Src:MaD:9 | +| windows.cpp:293:23:293:36 | call to MapViewOfFile2 | windows.cpp:293:23:293:36 | *call to MapViewOfFile2 | provenance | Src:MaD:11 | | windows.cpp:294:20:294:52 | *pMapView | windows.cpp:296:10:296:16 | * ... | provenance | | | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | windows.cpp:303:20:303:52 | *pMapView | provenance | | -| windows.cpp:302:23:302:36 | call to MapViewOfFile3 | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | provenance | Src:MaD:10 | +| windows.cpp:302:23:302:36 | call to MapViewOfFile3 | windows.cpp:302:23:302:36 | *call to MapViewOfFile3 | provenance | Src:MaD:12 | | windows.cpp:303:20:303:52 | *pMapView | windows.cpp:305:10:305:16 | * ... | provenance | | | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | windows.cpp:312:20:312:52 | *pMapView | provenance | | -| windows.cpp:311:23:311:43 | call to MapViewOfFile3FromApp | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | provenance | Src:MaD:11 | +| windows.cpp:311:23:311:43 | call to MapViewOfFile3FromApp | windows.cpp:311:23:311:43 | *call to MapViewOfFile3FromApp | provenance | Src:MaD:13 | | windows.cpp:312:20:312:52 | *pMapView | windows.cpp:314:10:314:16 | * ... | provenance | | | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | windows.cpp:319:20:319:52 | *pMapView | provenance | | -| windows.cpp:318:23:318:37 | call to MapViewOfFileEx | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | provenance | Src:MaD:13 | +| windows.cpp:318:23:318:37 | call to MapViewOfFileEx | windows.cpp:318:23:318:37 | *call to MapViewOfFileEx | provenance | Src:MaD:15 | | windows.cpp:319:20:319:52 | *pMapView | windows.cpp:321:10:321:16 | * ... | provenance | | | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | windows.cpp:326:20:326:52 | *pMapView | provenance | | -| windows.cpp:325:23:325:42 | call to MapViewOfFileFromApp | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | provenance | Src:MaD:14 | +| windows.cpp:325:23:325:42 | call to MapViewOfFileFromApp | windows.cpp:325:23:325:42 | *call to MapViewOfFileFromApp | provenance | Src:MaD:16 | | windows.cpp:326:20:326:52 | *pMapView | windows.cpp:328:10:328:16 | * ... | provenance | | | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | windows.cpp:333:20:333:52 | *pMapView | provenance | | -| windows.cpp:332:23:332:40 | call to MapViewOfFileNuma2 | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | provenance | Src:MaD:15 | +| windows.cpp:332:23:332:40 | call to MapViewOfFileNuma2 | windows.cpp:332:23:332:40 | *call to MapViewOfFileNuma2 | provenance | Src:MaD:17 | | windows.cpp:333:20:333:52 | *pMapView | windows.cpp:335:10:335:16 | * ... | provenance | | | windows.cpp:403:26:403:36 | *lpParameter [x] | windows.cpp:405:10:405:25 | *lpParameter [x] | provenance | | | windows.cpp:405:10:405:25 | *lpParameter [x] | windows.cpp:406:8:406:8 | *s [x] | provenance | | @@ -319,9 +346,9 @@ edges | windows.cpp:431:3:431:3 | *s [post update] [x] | windows.cpp:464:7:464:8 | *& ... [x] | provenance | | | windows.cpp:431:3:431:16 | ... = ... | windows.cpp:431:3:431:3 | *s [post update] [x] | provenance | | | windows.cpp:431:9:431:14 | call to source | windows.cpp:431:3:431:16 | ... = ... | provenance | | -| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:52 | -| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:50 | -| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:51 | +| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:57 | +| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:55 | +| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:56 | | windows.cpp:533:11:533:16 | call to source | windows.cpp:533:11:533:16 | call to source | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:537:40:537:41 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:542:38:542:39 | *& ... | provenance | | @@ -330,102 +357,102 @@ edges | windows.cpp:533:11:533:16 | call to source | windows.cpp:568:32:568:33 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:573:40:573:41 | *& ... | provenance | | | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | windows.cpp:538:10:538:23 | access to array | provenance | | -| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:61 | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:66 | | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | windows.cpp:543:10:543:23 | access to array | provenance | | -| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:57 | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:62 | | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | windows.cpp:548:10:548:23 | access to array | provenance | | -| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:58 | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:63 | | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | windows.cpp:553:10:553:23 | access to array | provenance | | -| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:59 | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:64 | | windows.cpp:559:5:559:24 | ... = ... | windows.cpp:561:39:561:44 | *buffer | provenance | | | windows.cpp:559:17:559:24 | call to source | windows.cpp:559:5:559:24 | ... = ... | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:562:10:562:19 | *src_string [*Buffer] | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:563:40:563:50 | *& ... [*Buffer] | provenance | | -| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:62 | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:67 | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:21:562:26 | *Buffer | provenance | | | windows.cpp:562:21:562:26 | *Buffer | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | provenance | | -| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:60 | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:65 | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:22:564:27 | *Buffer | provenance | | | windows.cpp:564:22:564:27 | *Buffer | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | windows.cpp:569:10:569:23 | access to array | provenance | | -| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:63 | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:68 | | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | windows.cpp:574:10:574:23 | access to array | provenance | | -| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:64 | -| windows.cpp:645:45:645:50 | WinHttpReadData output argument | windows.cpp:647:10:647:16 | * ... | provenance | Src:MaD:33 | -| windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | windows.cpp:654:10:654:16 | * ... | provenance | Src:MaD:34 | -| windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | windows.cpp:661:10:661:16 | * ... | provenance | Src:MaD:29 | -| windows.cpp:669:70:669:79 | WinHttpQueryHeadersEx output argument | windows.cpp:673:10:673:29 | * ... | provenance | Src:MaD:31 | -| windows.cpp:669:82:669:87 | WinHttpQueryHeadersEx output argument | windows.cpp:671:10:671:16 | * ... | provenance | Src:MaD:32 | -| windows.cpp:669:105:669:112 | WinHttpQueryHeadersEx output argument | windows.cpp:675:10:675:27 | * ... | provenance | Src:MaD:30 | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:69 | +| windows.cpp:645:45:645:50 | WinHttpReadData output argument | windows.cpp:647:10:647:16 | * ... | provenance | Src:MaD:35 | +| windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | windows.cpp:654:10:654:16 | * ... | provenance | Src:MaD:36 | +| windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | windows.cpp:661:10:661:16 | * ... | provenance | Src:MaD:31 | +| windows.cpp:669:70:669:79 | WinHttpQueryHeadersEx output argument | windows.cpp:673:10:673:29 | * ... | provenance | Src:MaD:33 | +| windows.cpp:669:82:669:87 | WinHttpQueryHeadersEx output argument | windows.cpp:671:10:671:16 | * ... | provenance | Src:MaD:34 | +| windows.cpp:669:105:669:112 | WinHttpQueryHeadersEx output argument | windows.cpp:675:10:675:27 | * ... | provenance | Src:MaD:32 | | windows.cpp:728:5:728:28 | ... = ... | windows.cpp:729:35:729:35 | *x | provenance | | | windows.cpp:728:12:728:28 | call to source | windows.cpp:728:5:728:28 | ... = ... | provenance | | -| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:68 | +| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:73 | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:731:10:731:36 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:733:10:733:35 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:735:10:735:37 | * ... | provenance | | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:901:15:901:53 | *& ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:905:10:905:31 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:907:10:907:42 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:909:10:909:57 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:911:10:911:60 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:912:54:912:63 | FileHandle | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:914:10:914:70 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:916:10:916:72 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:918:10:918:64 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:920:10:920:51 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:922:10:922:52 | * ... | provenance | Src:MaD:7 | -| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:924:10:924:63 | * ... | provenance | Src:MaD:7 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:901:15:901:53 | *& ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:905:10:905:31 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:907:10:907:42 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:909:10:909:57 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:911:10:911:60 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:912:54:912:63 | FileHandle | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:914:10:914:70 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:916:10:916:72 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:918:10:918:64 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:920:10:920:51 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:922:10:922:52 | * ... | provenance | Src:MaD:9 | +| windows.cpp:900:64:900:77 | HttpReceiveHttpRequest output argument | windows.cpp:924:10:924:63 | * ... | provenance | Src:MaD:9 | | windows.cpp:901:15:901:53 | *& ... | windows.cpp:903:10:903:11 | * ... | provenance | | -| windows.cpp:929:70:929:75 | HttpReceiveRequestEntityBody output argument | windows.cpp:931:10:931:16 | * ... | provenance | Src:MaD:8 | -| windows.cpp:936:70:936:78 | HttpReceiveClientCertificate output argument | windows.cpp:937:15:937:48 | *& ... | provenance | Src:MaD:6 | -| windows.cpp:936:70:936:78 | HttpReceiveClientCertificate output argument | windows.cpp:941:10:941:31 | * ... | provenance | Src:MaD:6 | +| windows.cpp:929:70:929:75 | HttpReceiveRequestEntityBody output argument | windows.cpp:931:10:931:16 | * ... | provenance | Src:MaD:10 | +| windows.cpp:936:70:936:78 | HttpReceiveClientCertificate output argument | windows.cpp:937:15:937:48 | *& ... | provenance | Src:MaD:8 | +| windows.cpp:936:70:936:78 | HttpReceiveClientCertificate output argument | windows.cpp:941:10:941:31 | * ... | provenance | Src:MaD:8 | | windows.cpp:937:15:937:48 | *& ... | windows.cpp:939:10:939:11 | * ... | provenance | | -| windows.cpp:1009:35:1009:38 | RegQueryValueA output argument | windows.cpp:1011:10:1011:14 | * ... | provenance | Src:MaD:25 | -| windows.cpp:1016:36:1016:39 | RegQueryValueW output argument | windows.cpp:1018:10:1018:14 | * ... | provenance | Src:MaD:28 | -| windows.cpp:1024:53:1024:56 | RegQueryValueExA output argument | windows.cpp:1026:10:1026:14 | * ... | provenance | Src:MaD:26 | -| windows.cpp:1032:54:1032:57 | RegQueryValueExW output argument | windows.cpp:1034:10:1034:14 | * ... | provenance | Src:MaD:27 | -| windows.cpp:1040:46:1040:49 | RegQueryMultipleValuesA output argument | windows.cpp:1042:10:1042:14 | * ... | provenance | Src:MaD:23 | -| windows.cpp:1048:46:1048:49 | RegQueryMultipleValuesW output argument | windows.cpp:1050:10:1050:14 | * ... | provenance | Src:MaD:24 | -| windows.cpp:1056:53:1056:56 | RegGetValueA output argument | windows.cpp:1058:10:1058:14 | * ... | provenance | Src:MaD:21 | -| windows.cpp:1065:55:1065:58 | RegGetValueW output argument | windows.cpp:1067:10:1067:14 | * ... | provenance | Src:MaD:22 | -| windows.cpp:1075:28:1075:36 | RegEnumValueA output argument | windows.cpp:1079:10:1079:19 | * ... | provenance | Src:MaD:19 | -| windows.cpp:1075:71:1075:74 | RegEnumValueA output argument | windows.cpp:1077:10:1077:14 | * ... | provenance | Src:MaD:19 | -| windows.cpp:1087:28:1087:36 | RegEnumValueW output argument | windows.cpp:1091:10:1091:19 | * ... | provenance | Src:MaD:20 | -| windows.cpp:1087:71:1087:74 | RegEnumValueW output argument | windows.cpp:1089:10:1089:14 | * ... | provenance | Src:MaD:20 | +| windows.cpp:1009:35:1009:38 | RegQueryValueA output argument | windows.cpp:1011:10:1011:14 | * ... | provenance | Src:MaD:27 | +| windows.cpp:1016:36:1016:39 | RegQueryValueW output argument | windows.cpp:1018:10:1018:14 | * ... | provenance | Src:MaD:30 | +| windows.cpp:1024:53:1024:56 | RegQueryValueExA output argument | windows.cpp:1026:10:1026:14 | * ... | provenance | Src:MaD:28 | +| windows.cpp:1032:54:1032:57 | RegQueryValueExW output argument | windows.cpp:1034:10:1034:14 | * ... | provenance | Src:MaD:29 | +| windows.cpp:1040:46:1040:49 | RegQueryMultipleValuesA output argument | windows.cpp:1042:10:1042:14 | * ... | provenance | Src:MaD:25 | +| windows.cpp:1048:46:1048:49 | RegQueryMultipleValuesW output argument | windows.cpp:1050:10:1050:14 | * ... | provenance | Src:MaD:26 | +| windows.cpp:1056:53:1056:56 | RegGetValueA output argument | windows.cpp:1058:10:1058:14 | * ... | provenance | Src:MaD:23 | +| windows.cpp:1065:55:1065:58 | RegGetValueW output argument | windows.cpp:1067:10:1067:14 | * ... | provenance | Src:MaD:24 | +| windows.cpp:1075:28:1075:36 | RegEnumValueA output argument | windows.cpp:1079:10:1079:19 | * ... | provenance | Src:MaD:21 | +| windows.cpp:1075:71:1075:74 | RegEnumValueA output argument | windows.cpp:1077:10:1077:14 | * ... | provenance | Src:MaD:21 | +| windows.cpp:1087:28:1087:36 | RegEnumValueW output argument | windows.cpp:1091:10:1091:19 | * ... | provenance | Src:MaD:22 | +| windows.cpp:1087:71:1087:74 | RegEnumValueW output argument | windows.cpp:1089:10:1089:14 | * ... | provenance | Src:MaD:22 | | windows.cpp:1122:5:1122:27 | ... = ... | windows.cpp:1124:19:1124:21 | *str | provenance | | | windows.cpp:1122:14:1122:27 | call to source | windows.cpp:1122:5:1122:27 | ... = ... | provenance | | -| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:54 | +| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:59 | | windows.cpp:1124:24:1124:27 | IIDFromString output argument | windows.cpp:1125:10:1125:12 | iid | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1128:15:1128:20 | call to source | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1130:19:1130:21 | *iid | provenance | | -| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:67 | +| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:72 | | windows.cpp:1130:24:1130:27 | StringFromIID output argument | windows.cpp:1132:10:1132:13 | * ... | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1135:19:1135:24 | call to source | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1137:21:1137:25 | *clsid | provenance | | -| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:55 | +| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:60 | | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | windows.cpp:1139:10:1139:13 | * ... | provenance | | | windows.cpp:1143:5:1143:30 | ... = ... | windows.cpp:1145:21:1145:26 | *progID | provenance | | | windows.cpp:1143:17:1143:30 | call to source | windows.cpp:1143:5:1143:30 | ... = ... | provenance | | -| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:47 | +| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:52 | | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | windows.cpp:1146:10:1146:14 | clsid | provenance | | | windows.cpp:1150:5:1150:27 | ... = ... | windows.cpp:1152:21:1152:23 | *str | provenance | | | windows.cpp:1150:14:1150:27 | call to source | windows.cpp:1150:5:1150:27 | ... = ... | provenance | | -| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:48 | +| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:53 | | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | windows.cpp:1153:10:1153:14 | clsid | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1156:19:1156:24 | call to source | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1158:21:1158:25 | *clsid | provenance | | -| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:65 | +| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:70 | | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | windows.cpp:1160:10:1160:13 | * ... | provenance | | | windows.cpp:1164:5:1164:27 | ... = ... | windows.cpp:1166:20:1166:22 | *str | provenance | | | windows.cpp:1164:14:1164:27 | call to source | windows.cpp:1164:5:1164:27 | ... = ... | provenance | | -| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:53 | +| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:58 | | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | windows.cpp:1167:10:1167:13 | guid | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1170:17:1170:22 | call to source | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1172:21:1172:24 | *guid | provenance | | -| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:66 | +| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:71 | | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | windows.cpp:1174:10:1174:13 | * ... | provenance | | nodes | asio_streams.cpp:87:34:87:44 | read_until output argument | semmle.label | read_until output argument | @@ -617,8 +644,33 @@ nodes | test.cpp:263:15:263:19 | value | semmle.label | value | | test.cpp:267:32:267:34 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:282:5:282:26 | *callback_returning_int | semmle.label | *callback_returning_int | +| test.cpp:283:5:283:28 | *callback_returning_int_2 | semmle.label | *callback_returning_int_2 | +| test.cpp:284:6:284:31 | **callback_returning_ptr_int | semmle.label | **callback_returning_ptr_int | +| test.cpp:286:33:286:41 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:286:33:286:41 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:288:41:288:52 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | +| test.cpp:288:41:288:52 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | | test.cpp:293:10:293:24 | * ... | semmle.label | * ... | | test.cpp:293:11:293:22 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:295:39:295:60 | source_from_callback_return_template output argument | semmle.label | source_from_callback_return_template output argument | +| test.cpp:296:10:296:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | +| test.cpp:296:10:296:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | +| test.cpp:298:34:298:57 | source_from_callback_return_ptr output argument | semmle.label | source_from_callback_return_ptr output argument | +| test.cpp:299:10:299:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | +| test.cpp:299:10:299:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | +| test.cpp:301:38:301:63 | source_ptr_from_callback_return_ptr output argument | semmle.label | source_ptr_from_callback_return_ptr output argument | +| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | +| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | +| test.cpp:304:10:304:13 | * ... | semmle.label | * ... | +| test.cpp:306:37:306:64 | [...](...){...} | semmle.label | [...](...){...} | +| test.cpp:306:51:306:59 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:306:51:306:59 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:307:37:307:52 | return_ymlSource | semmle.label | return_ymlSource | +| test.cpp:309:36:309:36 | call to operator int *(*)() | semmle.label | call to operator int *(*)() | +| test.cpp:309:50:309:61 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | +| test.cpp:309:50:309:61 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:310:36:310:58 | return_ptr_to_ymlSource | semmle.label | return_ptr_to_ymlSource | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index 52c57f3a881e..ad042915def1 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -293,19 +293,19 @@ void test_callback_return_access_paths() { ymlSink(*ymlSourcePtr()); // $ ir source_from_callback_return_template(callback_returning_int); - ymlSink(callback_returning_int()); // $ MISSING: ir + ymlSink(callback_returning_int()); // $ ir source_from_callback_return_ptr(callback_returning_int_2); - ymlSink(callback_returning_int_2()); // $ MISSING: ir + ymlSink(callback_returning_int_2()); // $ ir source_ptr_from_callback_return_ptr(callback_returning_ptr_int); int *ptr = callback_returning_ptr_int(); ymlSink((int)ptr); // clean - ymlSink(*ptr); // $ MISSING: ir + ymlSink(*ptr); // $ ir - sink_from_callback_return_template([]() { return ymlSource(); }); // $ MISSING: ir - sink_from_callback_return_template(return_ymlSource); // $ MISSING: ir + sink_from_callback_return_template([]() { return ymlSource(); }); // $ ir + sink_from_callback_return_template(return_ymlSource); // $ ir - sink_ptr_from_callback_return_ptr([]() { return ymlSourcePtr(); }); // $ MISSING: ir - sink_ptr_from_callback_return_ptr(return_ptr_to_ymlSource); // $ MISSING: ir + sink_ptr_from_callback_return_ptr([]() { return ymlSourcePtr(); }); // $ ir + sink_ptr_from_callback_return_ptr(return_ptr_to_ymlSource); // $ ir } \ No newline at end of file From 6a37610714a8aab8d275de0dfca0045f625be5ca Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 20 Aug 2026 20:29:11 +0100 Subject: [PATCH 071/181] JS: Add 'merge-descriptors' test. --- .../library-tests/Extend/ExtendCalls.expected | 23 ++++++++++--------- .../ql/test/library-tests/Extend/package.json | 1 + .../ql/test/library-tests/Extend/tst.js | 1 + 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/javascript/ql/test/library-tests/Extend/ExtendCalls.expected b/javascript/ql/test/library-tests/Extend/ExtendCalls.expected index a4c66634f7cb..1b4648c9f83c 100644 --- a/javascript/ql/test/library-tests/Extend/ExtendCalls.expected +++ b/javascript/ql/test/library-tests/Extend/ExtendCalls.expected @@ -29,17 +29,18 @@ | tst.js:64:1:64:48 | checkSh ... arg())) | OK | | tst.js:65:1:65:54 | checkSh ... arg())) | OK | | tst.js:66:1:66:45 | checkSh ... arg())) | OK | -| tst.js:67:1:67:52 | checkSh ... arg())) | OK | -| tst.js:68:1:68:53 | checkSh ... arg())) | OK | +| tst.js:67:1:67:57 | checkSh ... arg())) | Not an extend call | +| tst.js:68:1:68:52 | checkSh ... arg())) | OK | | tst.js:69:1:69:53 | checkSh ... arg())) | OK | -| tst.js:70:1:70:55 | checkSh ... arg())) | OK | -| tst.js:71:1:71:52 | checkSh ... arg())) | OK | -| tst.js:72:1:72:51 | checkSh ... arg())) | OK | +| tst.js:70:1:70:53 | checkSh ... arg())) | OK | +| tst.js:71:1:71:55 | checkSh ... arg())) | OK | +| tst.js:72:1:72:52 | checkSh ... arg())) | OK | | tst.js:73:1:73:51 | checkSh ... arg())) | OK | -| tst.js:74:1:74:53 | checkSh ... arg())) | OK | +| tst.js:74:1:74:51 | checkSh ... arg())) | OK | | tst.js:75:1:75:53 | checkSh ... arg())) | OK | -| tst.js:79:1:79:45 | checkSh ... arg())) | OK | -| tst.js:80:1:80:55 | checkSh ... arg())) | OK | -| tst.js:81:1:81:51 | checkSh ... arg())) | OK | -| tst.js:85:1:85:44 | checkDe ... arg())) | OK | -| tst.js:86:1:86:61 | checkDe ... arg())) | OK | +| tst.js:76:1:76:53 | checkSh ... arg())) | OK | +| tst.js:80:1:80:45 | checkSh ... arg())) | OK | +| tst.js:81:1:81:55 | checkSh ... arg())) | OK | +| tst.js:82:1:82:51 | checkSh ... arg())) | OK | +| tst.js:86:1:86:44 | checkDe ... arg())) | OK | +| tst.js:87:1:87:61 | checkDe ... arg())) | OK | diff --git a/javascript/ql/test/library-tests/Extend/package.json b/javascript/ql/test/library-tests/Extend/package.json index dd73e8e0a5ec..c18a62e2c71e 100644 --- a/javascript/ql/test/library-tests/Extend/package.json +++ b/javascript/ql/test/library-tests/Extend/package.json @@ -17,6 +17,7 @@ "lodash.mergewith": "^4.6.1", "merge": "^1.2.0", "merge-deep": "^3.0.2", + "merge-descriptors": "^1.0.3", "merge-options": "^1.0.1", "mixin-deep": "^2.0.0", "mixin-object": "^3.0.0", diff --git a/javascript/ql/test/library-tests/Extend/tst.js b/javascript/ql/test/library-tests/Extend/tst.js index 500178e3e5d3..dc92a2564efc 100644 --- a/javascript/ql/test/library-tests/Extend/tst.js +++ b/javascript/ql/test/library-tests/Extend/tst.js @@ -64,6 +64,7 @@ checkShallow(Object.assign(base(), arg())); checkShallow(require("defaults")(base(), arg())); checkShallow(require("extend-shallow")(base(), arg())); checkShallow(require("merge")(base(), arg())); +checkShallow(require("merge-descriptors")(base(), arg())); checkShallow(require("mixin-object")(base(), arg())); checkShallow(require("object-assign")(base(), arg())); checkShallow(require("object.assign")(base(), arg())); From 77877e047e35cd16e350fea0b6fcd84007c25c3c Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Thu, 20 Aug 2026 20:31:28 +0100 Subject: [PATCH 072/181] JS: Model 'merge-descriptors' as a shallow extender and accept test changes. --- javascript/ql/lib/semmle/javascript/Extend.qll | 13 +++++++++++++ .../test/library-tests/Extend/ExtendCalls.expected | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/javascript/ql/lib/semmle/javascript/Extend.qll b/javascript/ql/lib/semmle/javascript/Extend.qll index b871a74a03b7..436d961aab57 100644 --- a/javascript/ql/lib/semmle/javascript/Extend.qll +++ b/javascript/ql/lib/semmle/javascript/Extend.qll @@ -146,6 +146,19 @@ private class ExtendCallShallow extends ExtendCall { override predicate isDeep() { none() } } +/** A shallow extend call of form `mergeDescriptors(dst, src)`. */ +private class MergeDescriptorsCall extends ExtendCall { + MergeDescriptorsCall() { + this = DataFlow::moduleImport("merge-descriptors").getACall() + } + + override DataFlow::Node getASourceOperand() { result = this.getArgument(1) } + + override DataFlow::Node getDestinationOperand() { result = this.getArgument(0) } + + override predicate isDeep() { none() } +} + /** * A shallow extend call of form `extend(src1, src2, ...)`. */ diff --git a/javascript/ql/test/library-tests/Extend/ExtendCalls.expected b/javascript/ql/test/library-tests/Extend/ExtendCalls.expected index 1b4648c9f83c..f77739770720 100644 --- a/javascript/ql/test/library-tests/Extend/ExtendCalls.expected +++ b/javascript/ql/test/library-tests/Extend/ExtendCalls.expected @@ -29,7 +29,7 @@ | tst.js:64:1:64:48 | checkSh ... arg())) | OK | | tst.js:65:1:65:54 | checkSh ... arg())) | OK | | tst.js:66:1:66:45 | checkSh ... arg())) | OK | -| tst.js:67:1:67:57 | checkSh ... arg())) | Not an extend call | +| tst.js:67:1:67:57 | checkSh ... arg())) | OK | | tst.js:68:1:68:52 | checkSh ... arg())) | OK | | tst.js:69:1:69:53 | checkSh ... arg())) | OK | | tst.js:70:1:70:53 | checkSh ... arg())) | OK | From 0d8e9516c2b702c33cdb5bccbccede3066b4d752 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Wed, 19 Aug 2026 15:25:36 +0200 Subject: [PATCH 073/181] Data flow: Track access path lengths in stages 3 and 4 --- .../codeql/dataflow/internal/DataFlowImpl.qll | 95 +++++++++++-------- .../dataflow/internal/DataFlowImplCommon.qll | 39 +++++--- 2 files changed, 79 insertions(+), 55 deletions(-) diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll index c6bdcc206b45..6cdad2d8cfbb 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll @@ -370,6 +370,9 @@ module MakeImpl Lang> { } class Ap { + /** Gets the tracked length of this access path, if any. */ + int length(); + string toString(); } @@ -563,10 +566,10 @@ module MakeImpl Lang> { pragma[nomagic] private int getAnApLengthLowerBound(Ap ap) { - accessPathLimit() > 1 and // `accessPathLimit() <= 1` is already checked in stages 1 and 2 - ap instanceof ApNil and - result = 0 + accessPathLimit() != 0 and // `accessPathLimit() = 0` is already checked in `useFieldFlow` + result = ap.length() or + not exists(ap.length()) and exists(Ap tail | fwdFlowConsCand(_, ap, _, _, tail) and ap != tail and // no need to report a longer length @@ -609,9 +612,7 @@ module MakeImpl Lang> { fwdFlowStore(_, _, ap0, _, c, t, stored, node, cc, summaryCtx) and ap = apCons(c, ap0) and apa = getApprox(ap) and - if accessPathLimit() > 1 - then getAnApLengthLowerBound(ap0) < accessPathLimit() - else any() + getAnApLengthLowerBound(ap0) < accessPathLimit() ) or // read @@ -1339,10 +1340,10 @@ module MakeImpl Lang> { pragma[nomagic] private int getAnApLengthLowerBoundRev(Ap ap) { - accessPathLimit() > 1 and // `accessPathLimit() <= 1` is already checked in stages 1 and 2 - ap instanceof ApNil and - result = 0 + accessPathLimit() != 0 and // `accessPathLimit() = 0` is already checked in `useFieldFlow` + result = ap.length() or + not exists(ap.length()) and exists(Ap tail | revFlowConsCand(ap, _, tail) and ap != tail and // no need to report a longer length @@ -1388,9 +1389,7 @@ module MakeImpl Lang> { exists(Nd mid, Ap ap0 | revFlow(mid, returnCtx, returnAp, ap0) and readStepFwd(node, ap, _, mid, ap0) and - if accessPathLimit() > 1 - then getAnApLengthLowerBoundRev(ap0) < accessPathLimit() - else any() + getAnApLengthLowerBoundRev(ap0) < accessPathLimit() ) or // flow into a callable @@ -2770,7 +2769,9 @@ module MakeImpl Lang> { class Typ = Unit; - class Ap = Boolean; + class Ap extends Boolean { + int length() { this = false and result = 0 } + } class ApNil extends Ap { ApNil() { this = false } @@ -2859,12 +2860,19 @@ module MakeImpl Lang> { Typ getTyp(Type t) { any() } bindingset[c, tail] - Ap apCons(Content c, Ap tail) { result.getAHead() = c and exists(tail) } + Ap apCons(Content c, Ap tail) { + exists(int length | result.getAHead(length) = c | + length = 1 and + tail instanceof ApNil + or + tail = TApproxFrontHead(_, length - 1) + ) + } class ApHeadContent = ContentApprox; pragma[noinline] - ApHeadContent getHeadContent(Ap ap) { result = ap.getHead() } + ApHeadContent getHeadContent(Ap ap) { result = ap.getHead(_) } predicate projectToHeadContent = getContentApproxCached/1; @@ -2910,7 +2918,7 @@ module MakeImpl Lang> { PrevStage::revFlow(node) and PrevStage::readStepCand(_, c, _) and Stage1::expectsContentEx(node, c) and - c = ap.getAHead() + c = ap.getAHead(_) ) } @@ -2961,12 +2969,19 @@ module MakeImpl Lang> { Typ getTyp(Type t) { any() } bindingset[c, tail] - Ap apCons(Content c, Ap tail) { result.getHead() = c and exists(tail) } + Ap apCons(Content c, Ap tail) { + exists(int length | result.getHead(length) = c | + length = 1 and + tail instanceof ApNil + or + tail = TFrontHead(_, length - 1) + ) + } class ApHeadContent = Content; pragma[noinline] - ApHeadContent getHeadContent(Ap ap) { result = ap.getHead() } + ApHeadContent getHeadContent(Ap ap) { result = ap.getHead(_) } ApHeadContent projectToHeadContent(Content c) { result = c } @@ -3012,11 +3027,11 @@ module MakeImpl Lang> { // When `node` is the target of a store, we interpret `clearsContent` as // only pertaining to _earlier_ store steps. In this case, we need to postpone // checking `clearsContent` to the step creation. - clearContent(node, ap.getHead(), false) + clearContent(node, ap.getHead(_), false) } pragma[nomagic] - private predicate clearExceptStore(Nd node, Ap ap) { clearContent(node, ap.getHead(), true) } + private predicate clearExceptStore(Nd node, Ap ap) { clearContent(node, ap.getHead(_), true) } pragma[nomagic] private predicate expectsContentCand(Nd node, Ap ap) { @@ -3024,7 +3039,7 @@ module MakeImpl Lang> { PrevStage::revFlow(node) and PrevStage::readStepCand(_, c, _) and Stage1::expectsContentEx(node, c) and - c = ap.getHead() + c = ap.getHead(_) ) } @@ -3059,9 +3074,9 @@ module MakeImpl Lang> { tails = strictcount(AccessPathFront apf | Stage4::consCand(c, apf)) and nodes = strictcount(Nd n | - Stage4::revFlow(n, any(AccessPathFrontHead apf | apf.getHead() = c)) + Stage4::revFlow(n, any(AccessPathFrontHead apf | apf.getHead(_) = c)) or - Stage4::nodeMayUseSummary(n, any(AccessPathFrontHead apf | apf.getHead() = c)) + Stage4::nodeMayUseSummary(n, any(AccessPathFrontHead apf | apf.getHead(_) = c)) ) and accessPathApproxCostLimits(apLimit, tupleLimit) and apLimit < tails and @@ -3077,7 +3092,7 @@ module MakeImpl Lang> { not expensiveLen2unfolding(c) } or TConsCons(Content c1, Content c2, int len) { - Stage4::consCand(c1, TFrontHead(c2)) and + Stage4::consCand(c1, TFrontHead(c2, _)) and len in [2 .. Config::accessPathLimit()] and not expensiveLen2unfolding(c1) } or @@ -3098,7 +3113,7 @@ module MakeImpl Lang> { abstract Content getHead(); - abstract int len(); + abstract int length(); abstract AccessPathFront getFront(); @@ -3111,7 +3126,7 @@ module MakeImpl Lang> { override Content getHead() { none() } - override int len() { result = 0 } + override int length() { result = 0 } override AccessPathFront getFront() { result = TFrontNil() } @@ -3129,9 +3144,9 @@ module MakeImpl Lang> { override Content getHead() { result = c } - override int len() { result = 1 } + override int length() { result = 1 } - override AccessPathFront getFront() { result = TFrontHead(c) } + override AccessPathFront getFront() { result = TFrontHead(c, 1) } override predicate isCons(Content head, AccessPathApprox tail) { head = c and tail = TNil() } } @@ -3151,9 +3166,9 @@ module MakeImpl Lang> { override Content getHead() { result = c1 } - override int len() { result = len } + override int length() { result = len } - override AccessPathFront getFront() { result = TFrontHead(c1) } + override AccessPathFront getFront() { result = TFrontHead(c1, len) } override predicate isCons(Content head, AccessPathApprox tail) { head = c1 and @@ -3182,14 +3197,14 @@ module MakeImpl Lang> { override Content getHead() { result = c } - override int len() { result = len } + override int length() { result = len } - override AccessPathFront getFront() { result = TFrontHead(c) } + override AccessPathFront getFront() { result = TFrontHead(c, len) } override predicate isCons(Content head, AccessPathApprox tail) { head = c and ( - exists(Content c2 | Stage4::consCand(c, TFrontHead(c2)) | + exists(Content c2 | Stage4::consCand(c, TFrontHead(c2, len - 1)) | tail = TConsCons(c2, _, len - 1) or len = 2 and @@ -3288,7 +3303,7 @@ module MakeImpl Lang> { pragma[nomagic] private predicate stage5ConsCand(Content c, AccessPathFront apf, int len) { - Stage5::consCand(c, any(AccessPathApprox ap | ap.getFront() = apf and ap.len() = len - 1)) + Stage5::consCand(c, any(AccessPathApprox ap | ap.getFront() = apf and ap.length() = len - 1)) } /** @@ -3297,7 +3312,7 @@ module MakeImpl Lang> { private int count1to2unfold(AccessPathApproxCons1 apa) { exists(Content c, int len | c = apa.getHead() and - len = apa.len() and + len = apa.length() and result = strictcount(AccessPathFront apf | stage5ConsCand(c, apf, len)) ) } @@ -3392,7 +3407,7 @@ module MakeImpl Lang> { exists(AccessPathApproxCons apa, AccessPathApprox tail | evalUnfold(apa, false) and not expensiveLen1to2unfolding(apa) and - apa.len() = len and + apa.length() = len and hasTail(apa, tail) and head1 = apa.getHead() and head2 = tail.getHead() @@ -3402,7 +3417,7 @@ module MakeImpl Lang> { exists(AccessPathApproxCons apa | evalUnfold(apa, false) and expensiveLen1to2unfolding(apa) and - apa.len() = len and + apa.length() = len and head = apa.getHead() ) } @@ -3531,7 +3546,7 @@ module MakeImpl Lang> { override predicate isCons(Content head, AccessPath tail) { head = head_ and tail = tail_ } - override AccessPathFrontHead getFront() { result = TFrontHead(head_) } + override AccessPathFrontHead getFront() { result = TFrontHead(head_, this.length()) } override AccessPathApproxCons getApprox() { result = TConsNil(head_) and tail_ = TAccessPathNil() @@ -3586,7 +3601,7 @@ module MakeImpl Lang> { tail.length() = len - 1 } - override AccessPathFrontHead getFront() { result = TFrontHead(head1) } + override AccessPathFrontHead getFront() { result = TFrontHead(head1, len) } override AccessPathApproxCons getApprox() { result = TConsCons(head1, head2, len) or @@ -3618,7 +3633,7 @@ module MakeImpl Lang> { tail.length() = len - 1 } - override AccessPathFrontHead getFront() { result = TFrontHead(head_) } + override AccessPathFrontHead getFront() { result = TFrontHead(head_, len) } override AccessPathApproxCons getApprox() { result = TCons1(head_, len) } diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll index c64f0edb8468..8d77198e5721 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImplCommon.qll @@ -1797,12 +1797,12 @@ module MakeImplCommon Lang> { cached newtype TAccessPathFront = TFrontNil() or - TFrontHead(Content c) + TFrontHead(Content c, int length) { length in [1 .. accessPathLimit()] } cached newtype TApproxAccessPathFront = TApproxFrontNil() or - TApproxFrontHead(ContentApprox c) + TApproxFrontHead(ContentApprox c, int length) { length in [1 .. accessPathLimit()] } cached newtype TAccessPathFrontOption = @@ -2505,31 +2505,33 @@ module MakeImplCommon Lang> { abstract boolean toBoolNonEmpty(); - ContentApprox getHead() { this = TApproxFrontHead(result) } + abstract int length(); + + ContentApprox getHead(int length) { this = TApproxFrontHead(result, length) } pragma[nomagic] - Content getAHead() { - exists(ContentApprox cont | - this = TApproxFrontHead(cont) and - cont = getContentApproxCached(result) - ) - } + Content getAHead(int length) { this.getHead(length) = getContentApproxCached(result) } } class ApproxAccessPathFrontNil extends ApproxAccessPathFront, TApproxFrontNil { override string toString() { result = "nil" } override boolean toBoolNonEmpty() { result = false } + + override int length() { result = 0 } } class ApproxAccessPathFrontHead extends ApproxAccessPathFront, TApproxFrontHead { private ContentApprox c; + private int length; - ApproxAccessPathFrontHead() { this = TApproxFrontHead(c) } + ApproxAccessPathFrontHead() { this = TApproxFrontHead(c, length) } - override string toString() { result = c.toString() } + override string toString() { result = c + " (length: " + length + ")" } override boolean toBoolNonEmpty() { result = true } + + override int length() { result = length } } /** An optional approximated access path front. */ @@ -2549,23 +2551,30 @@ module MakeImplCommon Lang> { abstract ApproxAccessPathFront toApprox(); - Content getHead() { this = TFrontHead(result) } + abstract int length(); + + Content getHead(int length) { this = TFrontHead(result, length) } } class AccessPathFrontNil extends AccessPathFront, TFrontNil { override string toString() { result = "nil" } override ApproxAccessPathFront toApprox() { result = TApproxFrontNil() } + + override int length() { result = 0 } } class AccessPathFrontHead extends AccessPathFront, TFrontHead { private Content c; + private int length; + + AccessPathFrontHead() { this = TFrontHead(c, length) } - AccessPathFrontHead() { this = TFrontHead(c) } + override string toString() { result = c + " (length: " + length + ")" } - override string toString() { result = c.toString() } + override ApproxAccessPathFront toApprox() { result.getAHead(length) = c } - override ApproxAccessPathFront toApprox() { result.getAHead() = c } + override int length() { result = length } } /** An optional access path front. */ From 22ad8c7dc130d7dbde025590985cd17aa315cb1f Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Fri, 21 Aug 2026 09:51:56 +0200 Subject: [PATCH 074/181] C#: model Delta.GetInstance() as a MaD summary instead of QL Per review feedback on #22384, replace the hand-written DeltaGetInstanceMethod/DeltaGetInstanceTaintStep taint step with a Models-as-Data summaryModel row for both the Microsoft.AspNet.OData and Microsoft.AspNetCore.OData.Deltas variants of Delta.GetInstance(). --- .../lib/ext/Microsoft.AspNet.OData.model.yml | 7 +++++++ .../semmle/code/csharp/frameworks/OData.qll | 19 ------------------- 2 files changed, 7 insertions(+), 19 deletions(-) create mode 100644 csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml diff --git a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml new file mode 100644 index 000000000000..ede706dd194a --- /dev/null +++ b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml @@ -0,0 +1,7 @@ +extensions: + - addsTo: + pack: codeql/csharp-all + extensible: summaryModel + data: + - ["Microsoft.AspNet.OData", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 80917322f441..4a366c12ce64 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -86,14 +86,6 @@ class DeltaMutatingMethod extends Method { } } -/** The `GetInstance` method on `Delta`. */ -class DeltaGetInstanceMethod extends Method { - DeltaGetInstanceMethod() { - this.getDeclaringType() instanceof DeltaClass and - this.hasName("GetInstance") - } -} - private class CandidateODataMember extends Member { CandidateODataMember() { this.isPublic() and @@ -147,14 +139,3 @@ private class DeltaMutatingCallTaintStep extends AdditionalTaintStep { ) } } - -/** `Delta.GetInstance()` returns the tracked entity, carrying the same taint as the `Delta` itself. */ -private class DeltaGetInstanceTaintStep extends AdditionalTaintStep { - override predicate step(DataFlow::Node node1, DataFlow::Node node2) { - exists(MethodCall mc | - mc.getTarget().getUnboundDeclaration() instanceof DeltaGetInstanceMethod and - node1.asExpr() = mc.getQualifier() and - node2.asExpr() = mc - ) - } -} From a44bfec092d2c71bedea0851567bd89a25f9b822 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Fri, 21 Aug 2026 09:53:09 +0200 Subject: [PATCH 075/181] C#: reuse CandidateMemberToTaint from Remote.qll in OData.qll Per review feedback on #22384, OData.qll's CandidateODataMember was an exact copy of CandidateMemberToTaint from Remote.qll. Make that class public and import it instead of duplicating it. --- .../semmle/code/csharp/frameworks/OData.qll | 20 ++----------------- .../security/dataflow/flowsources/Remote.qll | 3 ++- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 4a366c12ce64..3065b7127cc5 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -21,6 +21,7 @@ import csharp private import semmle.code.csharp.commons.Collections private import semmle.code.csharp.dataflow.FlowSteps private import semmle.code.csharp.dataflow.internal.DataFlowPrivate +private import semmle.code.csharp.security.dataflow.flowsources.Remote /** The `ODataActionParameters` dictionary type, across OData library versions. */ class ODataActionParametersClass extends Class { @@ -86,23 +87,6 @@ class DeltaMutatingMethod extends Method { } } -private class CandidateODataMember extends Member { - CandidateODataMember() { - this.isPublic() and - not this.isStatic() and - ( - this = - any(Property p | - p.isAutoImplemented() and - p.getGetter().isPublic() and - p.getSetter().isPublic() - ) - or - this = any(Field f | f.isPublic()) - ) - } -} - /** * Taint members (transitively) on types used in * 1. Casts, `as`-conversions, or type tests applied to `ODataActionParameters` values. @@ -112,7 +96,7 @@ private class CandidateODataMember extends Member { * trade-off `AspNetRemoteFlowSourceMember` (`Remote.qll`) makes for ASP.NET * action-method parameters. */ -private class ODataBoundMember extends TaintTracking::TaintedMember, CandidateODataMember { +private class ODataBoundMember extends TaintTracking::TaintedMember, CandidateMemberToTaint { ODataBoundMember() { exists(Type t, Type t0 | t = this.getDeclaringType() | (t = t0 or t = t0.(CollectionType).getElementType()) and diff --git a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll index 68c06a1828de..3eac08b1bd93 100644 --- a/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll +++ b/csharp/ql/lib/semmle/code/csharp/security/dataflow/flowsources/Remote.qll @@ -117,7 +117,8 @@ class AspNetServiceRemoteFlowSource extends AspNetRemoteFlowSource, DataFlow::Pa override string getSourceType() { result = "ASP.NET web service input" } } -private class CandidateMemberToTaint extends Member { +/** A public, non-static, auto-implemented property or field, candidate for taint-tracking. */ +class CandidateMemberToTaint extends Member { CandidateMemberToTaint() { this.isPublic() and not this.isStatic() and From 2c17dd2149fe884c18a08f82ebc136431c7016dc Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Fri, 21 Aug 2026 09:53:28 +0200 Subject: [PATCH 076/181] C#: move OData test types into test/resources/stubs Per review feedback on #22384, keep the ODataActionParameters/Delta stub implementations out of the test .cs file and store them in test/resources/stubs instead, following the pattern used by other frameworks (e.g. JsonNET, Aws). The test now loads the stub project via an options file and relies on no .dll files. --- .../library-tests/frameworks/OData/OData.cs | 26 ------------------- .../frameworks/OData/OData.expected | 18 ++++++------- .../library-tests/frameworks/OData/options | 2 ++ .../7.7.5/Microsoft.AspNet.OData.cs | 19 ++++++++++++++ .../7.7.5/Microsoft.AspNet.OData.csproj | 12 +++++++++ 5 files changed, 42 insertions(+), 35 deletions(-) create mode 100644 csharp/ql/test/library-tests/frameworks/OData/options create mode 100644 csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs create mode 100644 csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index 71a5c2218b68..ab06179ab79a 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -1,29 +1,3 @@ -using System.Collections.Generic; - -namespace Microsoft.AspNet.OData -{ - public class ODataActionParameters : Dictionary - { - } - - public class Delta where TStructuralType : class - { - private TStructuralType instance; - - public Delta() { instance = default(TStructuralType); } - - public TStructuralType GetInstance() => instance; - - public void Patch(TStructuralType original) { } - - public void Put(TStructuralType original) { } - - public void CopyChangedValues(TStructuralType original) { } - - public void CopyUnchangedValues(TStructuralType original) { } - } -} - namespace Test { using Microsoft.AspNet.OData; diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index a9a2796c0ca5..fad59d4a9a9b 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -1,9 +1,9 @@ -| OData.cs:72:55:72:64 | parameters | OData.cs:75:18:75:23 | access to local variable entity | -| OData.cs:72:55:72:64 | parameters | OData.cs:76:18:76:28 | access to property Name | -| OData.cs:72:55:72:64 | parameters | OData.cs:77:18:77:31 | access to property Content | -| OData.cs:72:55:72:64 | parameters | OData.cs:78:18:78:38 | access to property Owner | -| OData.cs:72:55:72:64 | parameters | OData.cs:81:22:81:28 | access to property Owner | -| OData.cs:85:55:85:64 | parameters | OData.cs:91:26:91:35 | access to property Label | -| OData.cs:85:55:85:64 | parameters | OData.cs:98:22:98:34 | access to property Category | -| OData.cs:102:39:102:43 | delta | OData.cs:105:18:105:30 | access to property Name | -| OData.cs:108:45:108:49 | delta | OData.cs:111:18:111:23 | access to property Name | +| OData.cs:46:55:46:64 | parameters | OData.cs:49:18:49:23 | access to local variable entity | +| OData.cs:46:55:46:64 | parameters | OData.cs:50:18:50:28 | access to property Name | +| OData.cs:46:55:46:64 | parameters | OData.cs:51:18:51:31 | access to property Content | +| OData.cs:46:55:46:64 | parameters | OData.cs:52:18:52:38 | access to property Owner | +| OData.cs:46:55:46:64 | parameters | OData.cs:55:22:55:28 | access to property Owner | +| OData.cs:59:55:59:64 | parameters | OData.cs:65:26:65:35 | access to property Label | +| OData.cs:59:55:59:64 | parameters | OData.cs:72:22:72:34 | access to property Category | +| OData.cs:76:39:76:43 | delta | OData.cs:79:18:79:30 | access to property Name | +| OData.cs:82:45:82:49 | delta | OData.cs:85:18:85:23 | access to property Name | diff --git a/csharp/ql/test/library-tests/frameworks/OData/options b/csharp/ql/test/library-tests/frameworks/OData/options new file mode 100644 index 000000000000..357763232dbe --- /dev/null +++ b/csharp/ql/test/library-tests/frameworks/OData/options @@ -0,0 +1,2 @@ +semmle-extractor-options: /nostdlib /noconfig +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj diff --git a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs new file mode 100644 index 000000000000..2f6673628748 --- /dev/null +++ b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs @@ -0,0 +1,19 @@ +// This file contains auto-generated code. +// Generated from `Microsoft.AspNet.OData, Version=7.7.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35`. +namespace Microsoft.AspNet.OData +{ + public class ODataActionParameters : System.Collections.Generic.Dictionary + { + public ODataActionParameters() => throw null; + } + + public class Delta where TStructuralType : class + { + public Delta() => throw null; + public TStructuralType GetInstance() => throw null; + public void Patch(TStructuralType original) => throw null; + public void Put(TStructuralType original) => throw null; + public void CopyChangedValues(TStructuralType original) => throw null; + public void CopyUnchangedValues(TStructuralType original) => throw null; + } +} diff --git a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj new file mode 100644 index 000000000000..2be6995cd169 --- /dev/null +++ b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj @@ -0,0 +1,12 @@ + + + net10.0 + true + bin\ + false + + + + + + From 9c3a9b48187dc8e12f517464372ff9ed5d5423d4 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Fri, 21 Aug 2026 09:53:39 +0200 Subject: [PATCH 077/181] C#: fix DeltaClass doc comment to not name a specific type parameter Per review feedback on #22384, the doc comment named the type parameter TStructuralType, but the AspNetCore variant of Delta names it T. Refer to the unbound generic as \`Delta\`1\`\` instead. --- csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 3065b7127cc5..936a50d6cf30 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -42,7 +42,7 @@ private predicate isODataParameterValue(Expr e) { TaintTracking::localExprTaint(any(ODataActionParameterRead r), e) } -/** The generic `Delta` change-tracking class, across OData library versions. */ +/** The generic ``Delta`1`` change-tracking class, across OData library versions. */ class DeltaClass extends UnboundGenericClass { DeltaClass() { this.getNumberOfTypeParameters() = 1 and From fd39a427d87b2726e0a0fe2174b602c63774fc3c Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 21 Aug 2026 11:34:28 +0200 Subject: [PATCH 078/181] unified: Fix grammar --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index a1334ff0cd1f..33c158537077 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -436,7 +436,7 @@ private module FolderHeuristic { } /** - * Holds if `file` has a one of the definitions of the given ambiguous name. + * Holds if `file` has one of the definitions of the given ambiguous name. * * A name is considered "ambiguous" if there is more than one file exporting it. */ From 58c6e802bc8cb120655eec2fd1779fe9e99de069 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 10:35:36 +0100 Subject: [PATCH 079/181] JS: Autoformat. --- javascript/ql/lib/semmle/javascript/Extend.qll | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/javascript/ql/lib/semmle/javascript/Extend.qll b/javascript/ql/lib/semmle/javascript/Extend.qll index 436d961aab57..d592929dc0ec 100644 --- a/javascript/ql/lib/semmle/javascript/Extend.qll +++ b/javascript/ql/lib/semmle/javascript/Extend.qll @@ -148,9 +148,7 @@ private class ExtendCallShallow extends ExtendCall { /** A shallow extend call of form `mergeDescriptors(dst, src)`. */ private class MergeDescriptorsCall extends ExtendCall { - MergeDescriptorsCall() { - this = DataFlow::moduleImport("merge-descriptors").getACall() - } + MergeDescriptorsCall() { this = DataFlow::moduleImport("merge-descriptors").getACall() } override DataFlow::Node getASourceOperand() { result = this.getArgument(1) } From 4e7613a30a2064eadf7570f5886a34f50d447856 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 21 Aug 2026 11:48:42 +0200 Subject: [PATCH 080/181] unified: Remove some unnecessary checks --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 -- 1 file changed, 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 33c158537077..dcb97b4fbae8 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -457,7 +457,6 @@ private module FolderHeuristic { * Holds if `folder` has two or more subfolders containing a definition of `name`. */ private predicate hasConflictingDefs(Folder folder, string name) { - containsDef(folder, name) and // Check for "two or more" using `exists(X) and not exists(unique(X))` containsDef(folder.getAFolder(), name) and not exists(unique(Folder child | child = folder.getAFolder() and containsDef(child, name))) @@ -482,7 +481,6 @@ private module FolderHeuristic { result = folder or result = getOutermostNonConflictingScope(folder.getParentContainer(), name) and - not isOutermostNonConflictingScope(folder, name) and containsDef(folder, name) // Prune to the subfolder actually containing the definition } From dbb692111458cb1f6ddbad9465ba49873cff9871 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 21 Aug 2026 10:38:23 +0000 Subject: [PATCH 081/181] Post-release preparation for codeql-cli-2.26.4 --- actions/ql/lib/qlpack.yml | 2 +- actions/ql/src/qlpack.yml | 2 +- cpp/ql/lib/qlpack.yml | 2 +- cpp/ql/src/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/lib/qlpack.yml | 2 +- csharp/ql/campaigns/Solorigate/src/qlpack.yml | 2 +- csharp/ql/lib/qlpack.yml | 2 +- csharp/ql/src/qlpack.yml | 2 +- go/ql/consistency-queries/qlpack.yml | 2 +- go/ql/lib/qlpack.yml | 2 +- go/ql/src/qlpack.yml | 2 +- java/ql/lib/qlpack.yml | 2 +- java/ql/src/qlpack.yml | 2 +- javascript/ql/lib/qlpack.yml | 2 +- javascript/ql/src/qlpack.yml | 2 +- misc/suite-helpers/qlpack.yml | 2 +- python/ql/lib/qlpack.yml | 2 +- python/ql/src/qlpack.yml | 2 +- ruby/ql/lib/qlpack.yml | 2 +- ruby/ql/src/qlpack.yml | 2 +- rust/ql/lib/qlpack.yml | 2 +- rust/ql/src/qlpack.yml | 2 +- shared/concepts/qlpack.yml | 2 +- shared/controlflow/qlpack.yml | 2 +- shared/dataflow/qlpack.yml | 2 +- shared/mad/qlpack.yml | 2 +- shared/namebinding/qlpack.yml | 2 +- shared/quantum/qlpack.yml | 2 +- shared/rangeanalysis/qlpack.yml | 2 +- shared/regex/qlpack.yml | 2 +- shared/ssa/qlpack.yml | 2 +- shared/threat-models/qlpack.yml | 2 +- shared/tutorial/qlpack.yml | 2 +- shared/typeflow/qlpack.yml | 2 +- shared/typeinference/qlpack.yml | 2 +- shared/typetracking/qlpack.yml | 2 +- shared/typos/qlpack.yml | 2 +- shared/util/qlpack.yml | 2 +- shared/xml/qlpack.yml | 2 +- shared/yaml/qlpack.yml | 2 +- swift/ql/lib/qlpack.yml | 2 +- swift/ql/src/qlpack.yml | 2 +- 42 files changed, 42 insertions(+), 42 deletions(-) diff --git a/actions/ql/lib/qlpack.yml b/actions/ql/lib/qlpack.yml index f4e4fbd9c564..b86df498d3dd 100644 --- a/actions/ql/lib/qlpack.yml +++ b/actions/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-all -version: 0.6.0 +version: 0.6.1-dev library: true warnOnImplicitThis: true dependencies: diff --git a/actions/ql/src/qlpack.yml b/actions/ql/src/qlpack.yml index 4377b8b8bf64..f4323defe6e8 100644 --- a/actions/ql/src/qlpack.yml +++ b/actions/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/actions-queries -version: 0.6.34 +version: 0.6.35-dev library: false warnOnImplicitThis: true groups: [actions, queries] diff --git a/cpp/ql/lib/qlpack.yml b/cpp/ql/lib/qlpack.yml index c8c6e352aa4b..b676012be506 100644 --- a/cpp/ql/lib/qlpack.yml +++ b/cpp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-all -version: 12.0.3 +version: 12.0.4-dev groups: cpp dbscheme: semmlecode.cpp.dbscheme extractor: cpp diff --git a/cpp/ql/src/qlpack.yml b/cpp/ql/src/qlpack.yml index cdd6197c5aa2..b365b8a398c3 100644 --- a/cpp/ql/src/qlpack.yml +++ b/cpp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/cpp-queries -version: 1.8.2 +version: 1.8.3-dev groups: - cpp - queries diff --git a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml index c08e66efd527..d045c1c7224b 100644 --- a/csharp/ql/campaigns/Solorigate/lib/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-all -version: 1.7.73 +version: 1.7.74-dev groups: - csharp - solorigate diff --git a/csharp/ql/campaigns/Solorigate/src/qlpack.yml b/csharp/ql/campaigns/Solorigate/src/qlpack.yml index 76d08def9d2a..3b5e1b3341e3 100644 --- a/csharp/ql/campaigns/Solorigate/src/qlpack.yml +++ b/csharp/ql/campaigns/Solorigate/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-solorigate-queries -version: 1.7.73 +version: 1.7.74-dev groups: - csharp - solorigate diff --git a/csharp/ql/lib/qlpack.yml b/csharp/ql/lib/qlpack.yml index d0517a91e4d3..c011a9a20d0b 100644 --- a/csharp/ql/lib/qlpack.yml +++ b/csharp/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-all -version: 7.2.0 +version: 7.2.1-dev groups: csharp dbscheme: semmlecode.csharp.dbscheme extractor: csharp diff --git a/csharp/ql/src/qlpack.yml b/csharp/ql/src/qlpack.yml index 3f173d3d0ec2..84048f55bc43 100644 --- a/csharp/ql/src/qlpack.yml +++ b/csharp/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/csharp-queries -version: 1.9.2 +version: 1.9.3-dev groups: - csharp - queries diff --git a/go/ql/consistency-queries/qlpack.yml b/go/ql/consistency-queries/qlpack.yml index 595bb1de039b..bebfec169a09 100644 --- a/go/ql/consistency-queries/qlpack.yml +++ b/go/ql/consistency-queries/qlpack.yml @@ -1,5 +1,5 @@ name: codeql-go-consistency-queries -version: 1.0.56 +version: 1.0.57-dev groups: - go - queries diff --git a/go/ql/lib/qlpack.yml b/go/ql/lib/qlpack.yml index 95356585661f..12e9a5f97982 100644 --- a/go/ql/lib/qlpack.yml +++ b/go/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-all -version: 7.3.0 +version: 7.3.1-dev groups: go dbscheme: go.dbscheme extractor: go diff --git a/go/ql/src/qlpack.yml b/go/ql/src/qlpack.yml index d5cb9084dcfd..64813b045694 100644 --- a/go/ql/src/qlpack.yml +++ b/go/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/go-queries -version: 1.6.9 +version: 1.6.10-dev groups: - go - queries diff --git a/java/ql/lib/qlpack.yml b/java/ql/lib/qlpack.yml index 700cccd95b4d..0beb3b3caa70 100644 --- a/java/ql/lib/qlpack.yml +++ b/java/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-all -version: 9.2.4 +version: 9.2.5-dev groups: java dbscheme: config/semmlecode.dbscheme extractor: java diff --git a/java/ql/src/qlpack.yml b/java/ql/src/qlpack.yml index bf1cbbd7119e..6b312fc5dc44 100644 --- a/java/ql/src/qlpack.yml +++ b/java/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/java-queries -version: 1.11.9 +version: 1.11.10-dev groups: - java - queries diff --git a/javascript/ql/lib/qlpack.yml b/javascript/ql/lib/qlpack.yml index 64be77a515d3..0a74e2c419ac 100644 --- a/javascript/ql/lib/qlpack.yml +++ b/javascript/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-all -version: 2.10.0 +version: 2.10.1-dev groups: javascript dbscheme: semmlecode.javascript.dbscheme extractor: javascript diff --git a/javascript/ql/src/qlpack.yml b/javascript/ql/src/qlpack.yml index 3b788bff539b..bdefbdee61f7 100644 --- a/javascript/ql/src/qlpack.yml +++ b/javascript/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/javascript-queries -version: 2.4.4 +version: 2.4.5-dev groups: - javascript - queries diff --git a/misc/suite-helpers/qlpack.yml b/misc/suite-helpers/qlpack.yml index e5f770404f0d..be95f2ac4322 100644 --- a/misc/suite-helpers/qlpack.yml +++ b/misc/suite-helpers/qlpack.yml @@ -1,4 +1,4 @@ name: codeql/suite-helpers -version: 1.0.56 +version: 1.0.57-dev groups: shared warnOnImplicitThis: true diff --git a/python/ql/lib/qlpack.yml b/python/ql/lib/qlpack.yml index c9c33d75b8c4..46c4b9e2e00e 100644 --- a/python/ql/lib/qlpack.yml +++ b/python/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-all -version: 7.2.4 +version: 7.2.5-dev groups: python dbscheme: semmlecode.python.dbscheme extractor: python diff --git a/python/ql/src/qlpack.yml b/python/ql/src/qlpack.yml index 83959eb2f06a..9778815a4631 100644 --- a/python/ql/src/qlpack.yml +++ b/python/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/python-queries -version: 1.8.9 +version: 1.8.10-dev groups: - python - queries diff --git a/ruby/ql/lib/qlpack.yml b/ruby/ql/lib/qlpack.yml index d69ea587cc09..8071a411828b 100644 --- a/ruby/ql/lib/qlpack.yml +++ b/ruby/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-all -version: 6.0.4 +version: 6.0.5-dev groups: ruby extractor: ruby dbscheme: ruby.dbscheme diff --git a/ruby/ql/src/qlpack.yml b/ruby/ql/src/qlpack.yml index 011ae8a48e37..872cf18c8e03 100644 --- a/ruby/ql/src/qlpack.yml +++ b/ruby/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ruby-queries -version: 1.6.9 +version: 1.6.10-dev groups: - ruby - queries diff --git a/rust/ql/lib/qlpack.yml b/rust/ql/lib/qlpack.yml index d6bb6e2c8355..59a2c38c8a2b 100644 --- a/rust/ql/lib/qlpack.yml +++ b/rust/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-all -version: 0.2.20 +version: 0.2.21-dev groups: rust extractor: rust dbscheme: rust.dbscheme diff --git a/rust/ql/src/qlpack.yml b/rust/ql/src/qlpack.yml index 8d861959d1dc..b4048003f9cf 100644 --- a/rust/ql/src/qlpack.yml +++ b/rust/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rust-queries -version: 0.1.41 +version: 0.1.42-dev groups: - rust - queries diff --git a/shared/concepts/qlpack.yml b/shared/concepts/qlpack.yml index 46af3e5a6093..6a1db5dc8858 100644 --- a/shared/concepts/qlpack.yml +++ b/shared/concepts/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/concepts -version: 0.0.30 +version: 0.0.31-dev groups: shared library: true dependencies: diff --git a/shared/controlflow/qlpack.yml b/shared/controlflow/qlpack.yml index e4c5c10696b2..9c7448a0c159 100644 --- a/shared/controlflow/qlpack.yml +++ b/shared/controlflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/controlflow -version: 2.0.40 +version: 2.0.41-dev groups: shared library: true dependencies: diff --git a/shared/dataflow/qlpack.yml b/shared/dataflow/qlpack.yml index f53be1543ad7..133b33e834d8 100644 --- a/shared/dataflow/qlpack.yml +++ b/shared/dataflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/dataflow -version: 2.1.12 +version: 2.1.13-dev groups: shared library: true dependencies: diff --git a/shared/mad/qlpack.yml b/shared/mad/qlpack.yml index 8a938b2288a9..28a84ca5aa86 100644 --- a/shared/mad/qlpack.yml +++ b/shared/mad/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/mad -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true dependencies: diff --git a/shared/namebinding/qlpack.yml b/shared/namebinding/qlpack.yml index c646e249377e..6ab033915b70 100644 --- a/shared/namebinding/qlpack.yml +++ b/shared/namebinding/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/namebinding -version: 0.0.5 +version: 0.0.6-dev groups: shared library: true dependencies: diff --git a/shared/quantum/qlpack.yml b/shared/quantum/qlpack.yml index c346366c887b..73a8ef49ee5c 100644 --- a/shared/quantum/qlpack.yml +++ b/shared/quantum/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/quantum -version: 0.0.34 +version: 0.0.35-dev groups: shared library: true dependencies: diff --git a/shared/rangeanalysis/qlpack.yml b/shared/rangeanalysis/qlpack.yml index f0fc39d7d022..c7a74dae7c26 100644 --- a/shared/rangeanalysis/qlpack.yml +++ b/shared/rangeanalysis/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/rangeanalysis -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true dependencies: diff --git a/shared/regex/qlpack.yml b/shared/regex/qlpack.yml index cb9a5810d8ae..2afdc58e3d11 100644 --- a/shared/regex/qlpack.yml +++ b/shared/regex/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/regex -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true dependencies: diff --git a/shared/ssa/qlpack.yml b/shared/ssa/qlpack.yml index e7a083427e9e..c5c7755b1755 100644 --- a/shared/ssa/qlpack.yml +++ b/shared/ssa/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/ssa -version: 2.0.32 +version: 2.0.33-dev groups: shared library: true dependencies: diff --git a/shared/threat-models/qlpack.yml b/shared/threat-models/qlpack.yml index 3a2e3a691ab9..a29a2c7dc6a0 100644 --- a/shared/threat-models/qlpack.yml +++ b/shared/threat-models/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/threat-models -version: 1.0.56 +version: 1.0.57-dev library: true groups: shared dataExtensions: diff --git a/shared/tutorial/qlpack.yml b/shared/tutorial/qlpack.yml index 7fb4e02cc66f..b94e0b81dadc 100644 --- a/shared/tutorial/qlpack.yml +++ b/shared/tutorial/qlpack.yml @@ -1,7 +1,7 @@ name: codeql/tutorial description: Library for the CodeQL detective tutorials, helping new users learn to write CodeQL queries. -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/typeflow/qlpack.yml b/shared/typeflow/qlpack.yml index 535fdba52cba..0475b6bf7325 100644 --- a/shared/typeflow/qlpack.yml +++ b/shared/typeflow/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeflow -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true dependencies: diff --git a/shared/typeinference/qlpack.yml b/shared/typeinference/qlpack.yml index 1fadc262b89b..3cd87a73bdc2 100644 --- a/shared/typeinference/qlpack.yml +++ b/shared/typeinference/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typeinference -version: 0.0.37 +version: 0.0.38-dev groups: shared library: true dependencies: diff --git a/shared/typetracking/qlpack.yml b/shared/typetracking/qlpack.yml index 4279f61fc3f0..eff084212ba2 100644 --- a/shared/typetracking/qlpack.yml +++ b/shared/typetracking/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typetracking -version: 2.0.40 +version: 2.0.41-dev groups: shared library: true dependencies: diff --git a/shared/typos/qlpack.yml b/shared/typos/qlpack.yml index 84bea4384531..5933bd6862a1 100644 --- a/shared/typos/qlpack.yml +++ b/shared/typos/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/typos -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true warnOnImplicitThis: true diff --git a/shared/util/qlpack.yml b/shared/util/qlpack.yml index 38fabfcb99a0..c8f2c7a57343 100644 --- a/shared/util/qlpack.yml +++ b/shared/util/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/util -version: 2.0.43 +version: 2.0.44-dev groups: shared library: true dependencies: null diff --git a/shared/xml/qlpack.yml b/shared/xml/qlpack.yml index af73bb69888c..71a98a37b522 100644 --- a/shared/xml/qlpack.yml +++ b/shared/xml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/xml -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true dependencies: diff --git a/shared/yaml/qlpack.yml b/shared/yaml/qlpack.yml index 2e0644f8c71a..83ede2e7653b 100644 --- a/shared/yaml/qlpack.yml +++ b/shared/yaml/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/yaml -version: 1.0.56 +version: 1.0.57-dev groups: shared library: true warnOnImplicitThis: true diff --git a/swift/ql/lib/qlpack.yml b/swift/ql/lib/qlpack.yml index fa4ba95e4dda..f539a679b130 100644 --- a/swift/ql/lib/qlpack.yml +++ b/swift/ql/lib/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-all -version: 6.8.2 +version: 6.8.3-dev groups: swift extractor: swift dbscheme: swift.dbscheme diff --git a/swift/ql/src/qlpack.yml b/swift/ql/src/qlpack.yml index e4ab0b8a074a..ca8bf05e942d 100644 --- a/swift/ql/src/qlpack.yml +++ b/swift/ql/src/qlpack.yml @@ -1,5 +1,5 @@ name: codeql/swift-queries -version: 1.3.9 +version: 1.3.10-dev groups: - swift - queries From dfe567a99f9f8b636b402084c72e7d98a700b237 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 21 Aug 2026 13:19:41 +0200 Subject: [PATCH 082/181] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll index 6cdad2d8cfbb..e467e6caa708 100644 --- a/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll +++ b/shared/dataflow/codeql/dataflow/internal/DataFlowImpl.qll @@ -3092,7 +3092,7 @@ module MakeImpl Lang> { not expensiveLen2unfolding(c) } or TConsCons(Content c1, Content c2, int len) { - Stage4::consCand(c1, TFrontHead(c2, _)) and + Stage4::consCand(c1, TFrontHead(c2, len - 1)) and len in [2 .. Config::accessPathLimit()] and not expensiveLen2unfolding(c1) } or From 74807b0a113f92fd207058c8a67a8d40d57be325 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 12:33:30 +0100 Subject: [PATCH 083/181] C++: Fix QLDoc. --- .../semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index d09b10aa632b..6b79671ce638 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -617,7 +617,7 @@ abstract class Position extends TPosition { abstract int getIndirectionIndex(); /** - * Gets the parameter associated with this position, if any. + * Gets the parameter of `f` associated with this position, if any. * * Since a `Position` is defined by both an argument index and an * indirection multiple `Position`s can be associated with the @@ -629,7 +629,7 @@ abstract class Position extends TPosition { } /** - * Gets the argument (or qualifier) associated with this position, if any. + * Gets the argument (or qualifier) of `call` associated with this position, if any. * * Since a `Position` is defined by both an argument index and an * indirection multiple `Position`s can be associated with the From 36497842e1deb731a0df212a4ab22371aac38d8a Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 14:36:56 +0100 Subject: [PATCH 084/181] C++: Add tests with missing flow sources. --- .../dataflow/external-models/flow.expected | 154 +++++++++--------- .../dataflow/external-models/sinks.expected | 19 ++- .../dataflow/external-models/sources.expected | 4 +- .../dataflow/external-models/test.cpp | 15 +- 4 files changed, 102 insertions(+), 90 deletions(-) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 0ee182649a08..1e875ffd9d88 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -245,41 +245,41 @@ edges | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | -| test.cpp:253:32:255:2 | source_from_callback_template output argument | test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | -| test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | test.cpp:254:11:254:11 | *s [value] | provenance | | -| test.cpp:254:11:254:11 | *s [value] | test.cpp:254:14:254:18 | value | provenance | | -| test.cpp:254:14:254:18 | value | test.cpp:254:14:254:18 | value | provenance | Sink:MaD:3 | -| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | -| test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | test.cpp:258:11:258:11 | *s [value] | provenance | | -| test.cpp:258:11:258:11 | *s [value] | test.cpp:258:14:258:18 | value | provenance | | -| test.cpp:258:14:258:18 | value | test.cpp:258:14:258:18 | value | provenance | Sink:MaD:3 | -| test.cpp:263:12:263:12 | *s [value] | test.cpp:263:15:263:19 | value | provenance | | -| test.cpp:263:15:263:19 | value | test.cpp:263:15:263:19 | value | provenance | Sink:MaD:3 | -| test.cpp:267:32:267:34 | source_from_callback_template output argument | test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | -| test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | test.cpp:263:12:263:12 | *s [value] | provenance | | -| test.cpp:282:5:282:26 | *callback_returning_int | test.cpp:296:10:296:31 | call to callback_returning_int | provenance | | -| test.cpp:283:5:283:28 | *callback_returning_int_2 | test.cpp:299:10:299:33 | call to callback_returning_int_2 | provenance | | -| test.cpp:284:6:284:31 | **callback_returning_ptr_int | test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | provenance | | -| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:286:33:286:41 | call to ymlSource | provenance | Src:MaD:43 | -| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:307:37:307:52 | return_ymlSource | provenance | Sink:MaD:1 | -| test.cpp:286:33:286:41 | call to ymlSource | test.cpp:307:37:307:52 | return_ymlSource | provenance | Src:MaD:43 Sink:MaD:1 | -| test.cpp:288:41:288:52 | *call to ymlSourcePtr | test.cpp:310:36:310:58 | return_ptr_to_ymlSource | provenance | Sink:MaD:2 | -| test.cpp:288:41:288:52 | call to ymlSourcePtr | test.cpp:288:41:288:52 | *call to ymlSourcePtr | provenance | Src:MaD:44 | -| test.cpp:288:41:288:52 | call to ymlSourcePtr | test.cpp:310:36:310:58 | return_ptr_to_ymlSource | provenance | Src:MaD:44 Sink:MaD:2 | -| test.cpp:293:11:293:22 | call to ymlSourcePtr | test.cpp:293:10:293:24 | * ... | provenance | Src:MaD:44 Sink:MaD:3 | -| test.cpp:295:39:295:60 | source_from_callback_return_template output argument | test.cpp:282:5:282:26 | *callback_returning_int | provenance | Src:MaD:39 | -| test.cpp:296:10:296:31 | call to callback_returning_int | test.cpp:296:10:296:31 | call to callback_returning_int | provenance | Sink:MaD:3 | -| test.cpp:298:34:298:57 | source_from_callback_return_ptr output argument | test.cpp:283:5:283:28 | *callback_returning_int_2 | provenance | Src:MaD:38 | -| test.cpp:299:10:299:33 | call to callback_returning_int_2 | test.cpp:299:10:299:33 | call to callback_returning_int_2 | provenance | Sink:MaD:3 | -| test.cpp:301:38:301:63 | source_ptr_from_callback_return_ptr output argument | test.cpp:284:6:284:31 | **callback_returning_ptr_int | provenance | Src:MaD:41 | -| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | provenance | | -| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | test.cpp:304:10:304:13 | * ... | provenance | Sink:MaD:3 | -| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:37:306:64 | [...](...){...} | provenance | Sink:MaD:1 | -| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:37:306:64 | [...](...){...} | provenance | Src:MaD:43 Sink:MaD:1 | -| test.cpp:306:51:306:59 | call to ymlSource | test.cpp:306:51:306:59 | call to ymlSource | provenance | Src:MaD:43 | -| test.cpp:309:50:309:61 | *call to ymlSourcePtr | test.cpp:309:36:309:36 | call to operator int *(*)() | provenance | Sink:MaD:2 | -| test.cpp:309:50:309:61 | call to ymlSourcePtr | test.cpp:309:36:309:36 | call to operator int *(*)() | provenance | Src:MaD:44 Sink:MaD:2 | -| test.cpp:309:50:309:61 | call to ymlSourcePtr | test.cpp:309:50:309:61 | *call to ymlSourcePtr | provenance | Src:MaD:44 | +| test.cpp:264:32:266:2 | source_from_callback_template output argument | test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | +| test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | test.cpp:265:11:265:11 | *s [value] | provenance | | +| test.cpp:265:11:265:11 | *s [value] | test.cpp:265:14:265:18 | value | provenance | | +| test.cpp:265:14:265:18 | value | test.cpp:265:14:265:18 | value | provenance | Sink:MaD:3 | +| test.cpp:268:27:268:27 | source_from_callback_ptr output argument | test.cpp:268:27:268:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | +| test.cpp:268:27:268:27 | source_from_callback_ptr output argument [value] | test.cpp:269:11:269:11 | *s [value] | provenance | | +| test.cpp:269:11:269:11 | *s [value] | test.cpp:269:14:269:18 | value | provenance | | +| test.cpp:269:14:269:18 | value | test.cpp:269:14:269:18 | value | provenance | Sink:MaD:3 | +| test.cpp:274:12:274:12 | *s [value] | test.cpp:274:15:274:19 | value | provenance | | +| test.cpp:274:15:274:19 | value | test.cpp:274:15:274:19 | value | provenance | Sink:MaD:3 | +| test.cpp:278:32:278:34 | source_from_callback_template output argument | test.cpp:278:32:278:34 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | +| test.cpp:278:32:278:34 | source_from_callback_template output argument [value] | test.cpp:274:12:274:12 | *s [value] | provenance | | +| test.cpp:293:5:293:26 | *callback_returning_int | test.cpp:307:10:307:31 | call to callback_returning_int | provenance | | +| test.cpp:294:5:294:28 | *callback_returning_int_2 | test.cpp:310:10:310:33 | call to callback_returning_int_2 | provenance | | +| test.cpp:295:6:295:31 | **callback_returning_ptr_int | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | provenance | | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:297:33:297:41 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Sink:MaD:1 | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Src:MaD:43 Sink:MaD:1 | +| test.cpp:299:41:299:52 | *call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Sink:MaD:2 | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:299:41:299:52 | *call to ymlSourcePtr | provenance | Src:MaD:44 | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Src:MaD:44 Sink:MaD:2 | +| test.cpp:304:11:304:22 | call to ymlSourcePtr | test.cpp:304:10:304:24 | * ... | provenance | Src:MaD:44 Sink:MaD:3 | +| test.cpp:306:39:306:60 | source_from_callback_return_template output argument | test.cpp:293:5:293:26 | *callback_returning_int | provenance | Src:MaD:39 | +| test.cpp:307:10:307:31 | call to callback_returning_int | test.cpp:307:10:307:31 | call to callback_returning_int | provenance | Sink:MaD:3 | +| test.cpp:309:34:309:57 | source_from_callback_return_ptr output argument | test.cpp:294:5:294:28 | *callback_returning_int_2 | provenance | Src:MaD:38 | +| test.cpp:310:10:310:33 | call to callback_returning_int_2 | test.cpp:310:10:310:33 | call to callback_returning_int_2 | provenance | Sink:MaD:3 | +| test.cpp:312:38:312:63 | source_ptr_from_callback_return_ptr output argument | test.cpp:295:6:295:31 | **callback_returning_ptr_int | provenance | Src:MaD:41 | +| test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | provenance | | +| test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | test.cpp:315:10:315:13 | * ... | provenance | Sink:MaD:3 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Sink:MaD:1 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Src:MaD:43 Sink:MaD:1 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:51:317:59 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:320:50:320:61 | *call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Sink:MaD:2 | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Src:MaD:44 Sink:MaD:2 | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:50:320:61 | *call to ymlSourcePtr | provenance | Src:MaD:44 | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | @@ -629,48 +629,48 @@ nodes | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | -| test.cpp:253:32:255:2 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | -| test.cpp:253:32:255:2 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | -| test.cpp:254:11:254:11 | *s [value] | semmle.label | *s [value] | -| test.cpp:254:14:254:18 | value | semmle.label | value | -| test.cpp:254:14:254:18 | value | semmle.label | value | -| test.cpp:257:27:257:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | -| test.cpp:257:27:257:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | -| test.cpp:258:11:258:11 | *s [value] | semmle.label | *s [value] | -| test.cpp:258:14:258:18 | value | semmle.label | value | -| test.cpp:258:14:258:18 | value | semmle.label | value | -| test.cpp:263:12:263:12 | *s [value] | semmle.label | *s [value] | -| test.cpp:263:15:263:19 | value | semmle.label | value | -| test.cpp:263:15:263:19 | value | semmle.label | value | -| test.cpp:267:32:267:34 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | -| test.cpp:267:32:267:34 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | -| test.cpp:282:5:282:26 | *callback_returning_int | semmle.label | *callback_returning_int | -| test.cpp:283:5:283:28 | *callback_returning_int_2 | semmle.label | *callback_returning_int_2 | -| test.cpp:284:6:284:31 | **callback_returning_ptr_int | semmle.label | **callback_returning_ptr_int | -| test.cpp:286:33:286:41 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:286:33:286:41 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:288:41:288:52 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | -| test.cpp:288:41:288:52 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | -| test.cpp:293:10:293:24 | * ... | semmle.label | * ... | -| test.cpp:293:11:293:22 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | -| test.cpp:295:39:295:60 | source_from_callback_return_template output argument | semmle.label | source_from_callback_return_template output argument | -| test.cpp:296:10:296:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | -| test.cpp:296:10:296:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | -| test.cpp:298:34:298:57 | source_from_callback_return_ptr output argument | semmle.label | source_from_callback_return_ptr output argument | -| test.cpp:299:10:299:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | -| test.cpp:299:10:299:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | -| test.cpp:301:38:301:63 | source_ptr_from_callback_return_ptr output argument | semmle.label | source_ptr_from_callback_return_ptr output argument | -| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | -| test.cpp:302:13:302:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | -| test.cpp:304:10:304:13 | * ... | semmle.label | * ... | -| test.cpp:306:37:306:64 | [...](...){...} | semmle.label | [...](...){...} | -| test.cpp:306:51:306:59 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:306:51:306:59 | call to ymlSource | semmle.label | call to ymlSource | -| test.cpp:307:37:307:52 | return_ymlSource | semmle.label | return_ymlSource | -| test.cpp:309:36:309:36 | call to operator int *(*)() | semmle.label | call to operator int *(*)() | -| test.cpp:309:50:309:61 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | -| test.cpp:309:50:309:61 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | -| test.cpp:310:36:310:58 | return_ptr_to_ymlSource | semmle.label | return_ptr_to_ymlSource | +| test.cpp:264:32:266:2 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | +| test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:265:11:265:11 | *s [value] | semmle.label | *s [value] | +| test.cpp:265:14:265:18 | value | semmle.label | value | +| test.cpp:265:14:265:18 | value | semmle.label | value | +| test.cpp:268:27:268:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | +| test.cpp:268:27:268:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | +| test.cpp:269:11:269:11 | *s [value] | semmle.label | *s [value] | +| test.cpp:269:14:269:18 | value | semmle.label | value | +| test.cpp:269:14:269:18 | value | semmle.label | value | +| test.cpp:274:12:274:12 | *s [value] | semmle.label | *s [value] | +| test.cpp:274:15:274:19 | value | semmle.label | value | +| test.cpp:274:15:274:19 | value | semmle.label | value | +| test.cpp:278:32:278:34 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | +| test.cpp:278:32:278:34 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | +| test.cpp:293:5:293:26 | *callback_returning_int | semmle.label | *callback_returning_int | +| test.cpp:294:5:294:28 | *callback_returning_int_2 | semmle.label | *callback_returning_int_2 | +| test.cpp:295:6:295:31 | **callback_returning_ptr_int | semmle.label | **callback_returning_ptr_int | +| test.cpp:297:33:297:41 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:297:33:297:41 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:299:41:299:52 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:304:10:304:24 | * ... | semmle.label | * ... | +| test.cpp:304:11:304:22 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:306:39:306:60 | source_from_callback_return_template output argument | semmle.label | source_from_callback_return_template output argument | +| test.cpp:307:10:307:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | +| test.cpp:307:10:307:31 | call to callback_returning_int | semmle.label | call to callback_returning_int | +| test.cpp:309:34:309:57 | source_from_callback_return_ptr output argument | semmle.label | source_from_callback_return_ptr output argument | +| test.cpp:310:10:310:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | +| test.cpp:310:10:310:33 | call to callback_returning_int_2 | semmle.label | call to callback_returning_int_2 | +| test.cpp:312:38:312:63 | source_ptr_from_callback_return_ptr output argument | semmle.label | source_ptr_from_callback_return_ptr output argument | +| test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | +| test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | semmle.label | *call to callback_returning_ptr_int | +| test.cpp:315:10:315:13 | * ... | semmle.label | * ... | +| test.cpp:317:37:317:64 | [...](...){...} | semmle.label | [...](...){...} | +| test.cpp:317:51:317:59 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:317:51:317:59 | call to ymlSource | semmle.label | call to ymlSource | +| test.cpp:318:37:318:52 | return_ymlSource | semmle.label | return_ymlSource | +| test.cpp:320:36:320:36 | call to operator int *(*)() | semmle.label | call to operator int *(*)() | +| test.cpp:320:50:320:61 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | +| test.cpp:321:36:321:58 | return_ptr_to_ymlSource | semmle.label | return_ptr_to_ymlSource | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index 158f3a2a71f8..ed6a05517497 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -25,12 +25,13 @@ | test.cpp:224:11:224:11 | c | test-sink | | test.cpp:243:13:243:17 | value | test-sink | | test.cpp:248:18:248:22 | value | test-sink | -| test.cpp:254:14:254:18 | value | test-sink | -| test.cpp:258:14:258:18 | value | test-sink | -| test.cpp:263:15:263:19 | value | test-sink | -| test.cpp:292:15:292:26 | call to ymlSourcePtr | test-sink | -| test.cpp:293:10:293:24 | * ... | test-sink | -| test.cpp:296:10:296:31 | call to callback_returning_int | test-sink | -| test.cpp:299:10:299:33 | call to callback_returning_int_2 | test-sink | -| test.cpp:303:15:303:17 | ptr | test-sink | -| test.cpp:304:10:304:13 | * ... | test-sink | +| test.cpp:258:15:258:19 | value | test-sink | +| test.cpp:265:14:265:18 | value | test-sink | +| test.cpp:269:14:269:18 | value | test-sink | +| test.cpp:274:15:274:19 | value | test-sink | +| test.cpp:303:15:303:26 | call to ymlSourcePtr | test-sink | +| test.cpp:304:10:304:24 | * ... | test-sink | +| test.cpp:307:10:307:31 | call to callback_returning_int | test-sink | +| test.cpp:310:10:310:33 | call to callback_returning_int_2 | test-sink | +| test.cpp:314:15:314:17 | ptr | test-sink | +| test.cpp:315:10:315:13 | * ... | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected index 5ca05449bc4f..b30f1e88b99a 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sources.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sources.expected @@ -17,8 +17,8 @@ | test.cpp:199:14:199:22 | call to ymlSource | local | | test.cpp:216:18:216:26 | call to ymlSource | local | | test.cpp:222:10:222:18 | call to ymlSource | local | -| test.cpp:286:33:286:41 | call to ymlSource | local | -| test.cpp:306:51:306:59 | call to ymlSource | local | +| test.cpp:297:33:297:41 | call to ymlSource | local | +| test.cpp:317:51:317:59 | call to ymlSource | local | | windows.cpp:22:15:22:29 | call to GetCommandLineA | local | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | local | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | local | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index ad042915def1..e5e974a32b8f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -240,16 +240,27 @@ using Callback = void(*)(const SourceWrapper*); void source_from_callback_ptr(Callback); void f(const SourceWrapper* s) { - ymlSink(s->value); // $ ir=250:32 ir=251:27 + ymlSink(s->value); // $ ir=250:32 ir=251:27 MISSING: ir=262:27 } -void test_source_access_path() { +void test_source_access_path(bool b) { SourceWrapper wrapper = ymlFieldSource(); ymlSink(wrapper.value); // $ ir source_from_callback_template(f); source_from_callback_ptr(f); + Callback f_var; + if(b) { + f_var = f; + } else { + f_var = [](const SourceWrapper* s) { + ymlSink(s->value); // $ MISSING: ir + }; + } + + source_from_callback_ptr(f_var); + source_from_callback_template([](const SourceWrapper* s) { ymlSink(s->value); // $ ir }); From 150d0a78ca7e802f7f5826d500b58d72c2f607bf Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 14:49:15 +0100 Subject: [PATCH 085/181] C++: Track function pointers using local dataflow and accept test changes. --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 46 +++++++++++-------- .../dataflow/external-models/flow.expected | 10 ++++ .../dataflow/external-models/test.cpp | 4 +- 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index d45db30dc1c0..fc3e7172c6fc 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -161,6 +161,16 @@ private module Input2 implements Impl::Private::InputSig2 { ) } + private MemberFunction getFunctionFromType(Expr e) { + result.getClassAndName("operator()").getADerivedClass*() = e.getUnspecifiedType() + } + + private Function getFunctionFromExpr(Expr e) { + result = e.(FunctionAccess).getTarget() + or + result = e.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() + } + class SourceSinkReportingElement extends Element { SourceSinkReportingElement() { this instanceof Expr or this instanceof Parameter } @@ -169,29 +179,29 @@ private module Input2 implements Impl::Private::InputSig2 { [this.(Expr).getEnclosingFunction(), this.(Parameter).getFunction()] } - /** - * Gets the member function corresponding to an overloaded `operator()` when this element is - * invoked. - */ - private MemberFunction getOperatorCallFunction() { - // An `operator()` on a struct - result.getClassAndName("operator()").getADerivedClass*() = this.(Expr).getUnspecifiedType() - or - // A lambda that has undergone "lambda to function-pointer conversion" - result = this.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() - } - /** Gets the function invoked when this element is used as a callback. */ - private Function getCallbackFunction() { - // Taking the address of a function - result = this.(FunctionAccess).getTarget() + private Function getCallable() { + // The expression is a struct which implements `operator()`. + result = getFunctionFromType(this) or - // Passing an object with an overloaded `operator()` - result = this.getOperatorCallFunction() + // The expression is a function pointer + result = getFunctionFromExpr(this) + or + // The expression is an SSA read of an assignment of a callable + exists(Ssa::Definition def | + def.getAUse().getDef().getUnconvertedResultExpression() = this and + result = + getFunctionFromExpr(def.getAnUltimateDefinition() + .(Ssa::DirectExplicitDefinition) + .getAssignedInstruction() + .(StoreInstruction) + .getSourceValue() + .getUnconvertedResultExpression()) + ) } SourceSinkReportingElement getASuccessor(Impl::Private::SummaryComponent sc) { - exists(Function f | f = this.getCallbackFunction() | + exists(Function f | f = this.getCallable() | exists(ParameterPosition pos | sc = Impl::Private::SummaryComponent::parameter(pos) | result = pos.getParameter(f) ) diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 1e875ffd9d88..1494ef1264fb 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -245,6 +245,11 @@ edges | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | +| test.cpp:258:12:258:12 | *s [value] | test.cpp:258:15:258:19 | value | provenance | | +| test.cpp:258:15:258:19 | value | test.cpp:258:15:258:19 | value | provenance | Sink:MaD:3 | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument | test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | provenance | Src:MaD:37 | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | test.cpp:243:10:243:10 | *s [value] | provenance | | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | test.cpp:258:12:258:12 | *s [value] | provenance | | | test.cpp:264:32:266:2 | source_from_callback_template output argument | test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | provenance | Src:MaD:40 | | test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | test.cpp:265:11:265:11 | *s [value] | provenance | | | test.cpp:265:11:265:11 | *s [value] | test.cpp:265:14:265:18 | value | provenance | | @@ -629,6 +634,11 @@ nodes | test.cpp:250:32:250:32 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | | test.cpp:251:27:251:27 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | +| test.cpp:258:12:258:12 | *s [value] | semmle.label | *s [value] | +| test.cpp:258:15:258:19 | value | semmle.label | value | +| test.cpp:258:15:258:19 | value | semmle.label | value | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument | semmle.label | source_from_callback_ptr output argument | +| test.cpp:262:27:262:31 | source_from_callback_ptr output argument [value] | semmle.label | source_from_callback_ptr output argument [value] | | test.cpp:264:32:266:2 | source_from_callback_template output argument | semmle.label | source_from_callback_template output argument | | test.cpp:264:32:266:2 | source_from_callback_template output argument [value] | semmle.label | source_from_callback_template output argument [value] | | test.cpp:265:11:265:11 | *s [value] | semmle.label | *s [value] | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index e5e974a32b8f..ba189200b193 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -240,7 +240,7 @@ using Callback = void(*)(const SourceWrapper*); void source_from_callback_ptr(Callback); void f(const SourceWrapper* s) { - ymlSink(s->value); // $ ir=250:32 ir=251:27 MISSING: ir=262:27 + ymlSink(s->value); // $ ir=250:32 ir=251:27 ir=262:27 } void test_source_access_path(bool b) { @@ -255,7 +255,7 @@ void test_source_access_path(bool b) { f_var = f; } else { f_var = [](const SourceWrapper* s) { - ymlSink(s->value); // $ MISSING: ir + ymlSink(s->value); // $ ir }; } From 3de9880e259e13545055b7b781278e925a7decfc Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Wed, 19 Aug 2026 12:58:58 +0200 Subject: [PATCH 086/181] C++: Update expected test results --- .../library-tests/syntax-zoo/dataflow-consistency.expected | 6 ------ 1 file changed, 6 deletions(-) diff --git a/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected b/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected index 76adedb8f054..2b41bcfe0cb4 100644 --- a/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected +++ b/cpp/ql/test/library-tests/syntax-zoo/dataflow-consistency.expected @@ -1,10 +1,4 @@ uniqueEnclosingCallable -| builtin.c:14:3:14:16 | ... * ... | Node should have one enclosing callable but has 0. | -| builtin.c:14:3:14:16 | sizeof(int) | Node should have one enclosing callable but has 0. | -| builtin.c:14:10:14:10 | 4 | Node should have one enclosing callable but has 0. | -| builtin.c:15:3:15:16 | ... * ... | Node should have one enclosing callable but has 0. | -| builtin.c:15:3:15:16 | sizeof(int) | Node should have one enclosing callable but has 0. | -| builtin.c:15:10:15:10 | 4 | Node should have one enclosing callable but has 0. | | enum.c:2:6:2:6 | 1 | Node should have one enclosing callable but has 0. | | enum.c:2:6:2:10 | ... + ... | Node should have one enclosing callable but has 0. | | enum.c:2:10:2:10 | 1 | Node should have one enclosing callable but has 0. | From c2c53510e61450b3ae273b06988a568b6caf5234 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 14:59:26 +0100 Subject: [PATCH 087/181] C++: Mark initializers (and their expressions) of compiler-generated variables as compiler-generated. --- cpp/ql/lib/semmle/code/cpp/Initializer.qll | 3 +++ cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll | 3 ++- .../compiler_generated/compilerGenerated.expected | 5 +++++ .../library-tests/compiler_generated/compilerGenerated.ql | 2 ++ cpp/ql/test/library-tests/compiler_generated/cpp.cpp | 3 +++ 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/Initializer.qll b/cpp/ql/lib/semmle/code/cpp/Initializer.qll index 5748ab505e7c..6a5ad2c2a61c 100644 --- a/cpp/ql/lib/semmle/code/cpp/Initializer.qll +++ b/cpp/ql/lib/semmle/code/cpp/Initializer.qll @@ -54,4 +54,7 @@ class Initializer extends ControlFlowNode, @initialiser { /** Holds if the initializer used the C++ braced initializer notation. */ predicate isBraced() { braced_initialisers(underlyingElement(this)) } + + /** Holds if this initializer is generated by the compiler. */ + predicate isCompilerGenerated() { this.getDeclaration().(Variable).isCompilerGenerated() } } diff --git a/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll b/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll index 851d987b1fd6..82824445ccf2 100644 --- a/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll +++ b/cpp/ql/lib/semmle/code/cpp/exprs/Expr.qll @@ -108,7 +108,8 @@ class Expr extends StmtParent, @expr { /** Holds if this is an auxiliary expression generated by the compiler. */ predicate isCompilerGenerated() { compgenerated(underlyingElement(this)) or - this.getParent().(ConstructorFieldInit).isCompilerGenerated() + this.getParent().(ConstructorFieldInit).isCompilerGenerated() or + this.getParent().(Initializer).isCompilerGenerated() } /** diff --git a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected index b61085ff7c69..7d5b6957d7be 100644 --- a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected +++ b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected @@ -16,5 +16,10 @@ | cpp.cpp:15:5:15:12 | call to ~MyClass | Expr | | cpp.cpp:15:12:15:12 | reuse of m | Expr | | cpp.cpp:16:1:16:1 | return ... | Stmt | +| cpp.cpp:19:26:19:44 | __PRETTY_FUNCTION__ | Variable | +| cpp.cpp:19:26:19:44 | array to pointer conversion | Expr | +| cpp.cpp:19:26:19:44 | initializer for __PRETTY_FUNCTION__ | Initializer | +| cpp.cpp:19:26:19:44 | void uses_pretty_function() | Expr | +| cpp.cpp:20:1:20:1 | return ... | Stmt | | file://:0:0:0:0 | operator delete | Function | | file://:0:0:0:0 | operator new | Function | diff --git a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.ql b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.ql index 0eb620f0c792..1ed4a9395e19 100644 --- a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.ql +++ b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.ql @@ -9,4 +9,6 @@ where e.(Variable).isCompilerGenerated() and type = "Variable" or e.(Stmt).isCompilerGenerated() and type = "Stmt" + or + e.(Initializer).isCompilerGenerated() and type = "Initializer" select e, type diff --git a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp index 058bba7ba411..c751fd32ab35 100644 --- a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp +++ b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp @@ -15,3 +15,6 @@ void g1(void) { delete m; } +void uses_pretty_function() { + const char* pretty = __PRETTY_FUNCTION__; +} \ No newline at end of file From b711b3249329f2d0e6fda47b48a07b2aa6bd6ccd Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 15:05:32 +0100 Subject: [PATCH 088/181] C++: Add change note. --- cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md diff --git a/cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md b/cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md new file mode 100644 index 000000000000..eed0d6c8c389 --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-08-21-compiler-generated.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Initializers of compiler-generated variables are now recognized as compiler-generated. A new predicate `isCompilerGenerated` on `Initializer` has been added to reflect this. \ No newline at end of file From 3d1a64d7f16ed970b7ce652286efe28ca2d557f5 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 15:09:18 +0100 Subject: [PATCH 089/181] C++: Add a test for the static local compiler-generated variable that's generated by the frontend on empty parameter packs. --- .../compiler_generated/compilerGenerated.expected | 4 ++++ cpp/ql/test/library-tests/compiler_generated/cpp.cpp | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected index 7d5b6957d7be..145ad526a14a 100644 --- a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected +++ b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected @@ -21,5 +21,9 @@ | cpp.cpp:19:26:19:44 | initializer for __PRETTY_FUNCTION__ | Initializer | | cpp.cpp:19:26:19:44 | void uses_pretty_function() | Expr | | cpp.cpp:20:1:20:1 | return ... | Stmt | +| cpp.cpp:23:29:23:32 | args | Variable | +| cpp.cpp:23:37:23:37 | return ... | Stmt | +| cpp.cpp:23:37:23:37 | return ... | Stmt | +| cpp.cpp:27:1:27:1 | return ... | Stmt | | file://:0:0:0:0 | operator delete | Function | | file://:0:0:0:0 | operator new | Function | diff --git a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp index c751fd32ab35..6cbf15751edd 100644 --- a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp +++ b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp @@ -17,4 +17,11 @@ void g1(void) { void uses_pretty_function() { const char* pretty = __PRETTY_FUNCTION__; +} + +template +void parameter_pack(Args... args) { } + +void test_parameter_pack() { + parameter_pack(); } \ No newline at end of file From e0ac3d507f65ff51e208e9964911b5b75510b0e1 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 15:13:36 +0100 Subject: [PATCH 090/181] C++: Add a test with compiler-generated initializers from C++11 ranged for loops. --- .../compilerGenerated.expected | 23 +++++++++++++++++++ .../library-tests/compiler_generated/cpp.cpp | 7 ++++++ 2 files changed, 30 insertions(+) diff --git a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected index 145ad526a14a..ae78a8adb29a 100644 --- a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected +++ b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected @@ -25,5 +25,28 @@ | cpp.cpp:23:37:23:37 | return ... | Stmt | | cpp.cpp:23:37:23:37 | return ... | Stmt | | cpp.cpp:27:1:27:1 | return ... | Stmt | +| cpp.cpp:31:5:31:5 | (__begin) | Variable | +| cpp.cpp:31:5:31:5 | (__end) | Variable | +| cpp.cpp:31:5:31:5 | (__range) | Variable | +| cpp.cpp:31:5:33:5 | declaration | Stmt | +| cpp.cpp:31:5:33:5 | declaration | Stmt | +| cpp.cpp:31:5:33:5 | declaration | Stmt | +| cpp.cpp:31:17:31:18 | (reference to) | Expr | +| cpp.cpp:31:17:31:18 | vs | Expr | +| cpp.cpp:34:1:34:1 | return ... | Stmt | +| file://:0:0:0:0 | (__begin) | Expr | +| file://:0:0:0:0 | (__begin) | Expr | +| file://:0:0:0:0 | (__begin) | Expr | +| file://:0:0:0:0 | (__end) | Expr | +| file://:0:0:0:0 | (__range) | Expr | +| file://:0:0:0:0 | (reference dereference) | Expr | +| file://:0:0:0:0 | (reference dereference) | Expr | +| file://:0:0:0:0 | * ... | Expr | +| file://:0:0:0:0 | ... + ... | Expr | +| file://:0:0:0:0 | array to pointer conversion | Expr | +| file://:0:0:0:0 | array to pointer conversion | Expr | +| file://:0:0:0:0 | initializer for (__begin) | Initializer | +| file://:0:0:0:0 | initializer for (__end) | Initializer | +| file://:0:0:0:0 | initializer for (__range) | Initializer | | file://:0:0:0:0 | operator delete | Function | | file://:0:0:0:0 | operator new | Function | diff --git a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp index 6cbf15751edd..7525be8d40e8 100644 --- a/cpp/ql/test/library-tests/compiler_generated/cpp.cpp +++ b/cpp/ql/test/library-tests/compiler_generated/cpp.cpp @@ -24,4 +24,11 @@ void parameter_pack(Args... args) { } void test_parameter_pack() { parameter_pack(); +} + +void ranged_for() { + int vs[] = {1, 2, 3}; + for(int i : vs) { + + } } \ No newline at end of file From 6b87a58950da1d1b80c03265f7e17f16c31b3425 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 21 Aug 2026 15:20:29 +0100 Subject: [PATCH 091/181] C++: Require orphaned variables when computing compiler-generated initializers. --- cpp/ql/lib/semmle/code/cpp/Initializer.qll | 10 +++++++++- .../compiler_generated/compilerGenerated.expected | 6 ------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/Initializer.qll b/cpp/ql/lib/semmle/code/cpp/Initializer.qll index 6a5ad2c2a61c..6f03ec84116b 100644 --- a/cpp/ql/lib/semmle/code/cpp/Initializer.qll +++ b/cpp/ql/lib/semmle/code/cpp/Initializer.qll @@ -56,5 +56,13 @@ class Initializer extends ControlFlowNode, @initialiser { predicate isBraced() { braced_initialisers(underlyingElement(this)) } /** Holds if this initializer is generated by the compiler. */ - predicate isCompilerGenerated() { this.getDeclaration().(Variable).isCompilerGenerated() } + predicate isCompilerGenerated() { + exists(Variable v | + v = this.getDeclaration() and + // We require the variable to be an orphan to not mark the initializer + // from a desugared ranged for loop as compiler generated. + orphaned_variables(unresolveElement(v), _) and + v.isCompilerGenerated() + ) + } } diff --git a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected index ae78a8adb29a..c78e4af1d6a4 100644 --- a/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected +++ b/cpp/ql/test/library-tests/compiler_generated/compilerGenerated.expected @@ -32,21 +32,15 @@ | cpp.cpp:31:5:33:5 | declaration | Stmt | | cpp.cpp:31:5:33:5 | declaration | Stmt | | cpp.cpp:31:17:31:18 | (reference to) | Expr | -| cpp.cpp:31:17:31:18 | vs | Expr | | cpp.cpp:34:1:34:1 | return ... | Stmt | | file://:0:0:0:0 | (__begin) | Expr | | file://:0:0:0:0 | (__begin) | Expr | | file://:0:0:0:0 | (__begin) | Expr | | file://:0:0:0:0 | (__end) | Expr | -| file://:0:0:0:0 | (__range) | Expr | | file://:0:0:0:0 | (reference dereference) | Expr | | file://:0:0:0:0 | (reference dereference) | Expr | | file://:0:0:0:0 | * ... | Expr | -| file://:0:0:0:0 | ... + ... | Expr | | file://:0:0:0:0 | array to pointer conversion | Expr | | file://:0:0:0:0 | array to pointer conversion | Expr | -| file://:0:0:0:0 | initializer for (__begin) | Initializer | -| file://:0:0:0:0 | initializer for (__end) | Initializer | -| file://:0:0:0:0 | initializer for (__range) | Initializer | | file://:0:0:0:0 | operator delete | Function | | file://:0:0:0:0 | operator new | Function | From ba5654f74c7c95441f392a46ee7a737d053ca27e Mon Sep 17 00:00:00 2001 From: Arun Krishnamurthy Date: Fri, 21 Aug 2026 14:27:09 -0500 Subject: [PATCH 092/181] Swift: avoid module scan for lazy body emission Signed-off-by: Arun Krishnamurthy --- swift/extractor/infra/SwiftBodyEmissionStrategy.h | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/swift/extractor/infra/SwiftBodyEmissionStrategy.h b/swift/extractor/infra/SwiftBodyEmissionStrategy.h index b97600cc63c8..52c8efcf0d19 100644 --- a/swift/extractor/infra/SwiftBodyEmissionStrategy.h +++ b/swift/extractor/infra/SwiftBodyEmissionStrategy.h @@ -13,9 +13,11 @@ class SwiftBodyEmissionStrategy { : currentModule(currentModule), currentPrimarySourceFile(currentPrimarySourceFile), currentLazyDeclaration(currentLazyDeclaration) { - llvm::SmallVector decls; - currentModule.getTopLevelDecls(decls); - currentTopLevelDecls.insert(decls.begin(), decls.end()); + if (!currentLazyDeclaration) { + llvm::SmallVector decls; + currentModule.getTopLevelDecls(decls); + currentTopLevelDecls.insert(decls.begin(), decls.end()); + } } bool shouldEmitDeclBody(const swift::Decl& decl); From 06d874f10f630eb8f41c7f9ca3e0e611471ba5af Mon Sep 17 00:00:00 2001 From: JarLob Date: Sat, 22 Aug 2026 12:17:25 +0300 Subject: [PATCH 093/181] Improve performance --- .../frameworks/microsoft/AspNetCore.qll | 19 +++++++++++++++++-- .../frameworks/microsoft/AspNetCore.cs | 5 +++++ .../frameworks/microsoft/AspNetCore.expected | 1 + .../microsoft/AspNetCoreActions.expected | 1 + 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index d3c4c0bf6aba..50af007a971e 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -388,6 +388,21 @@ private predicate isDefaultMicrosoftAspNetCoreMvcController(Class controller) { MicrosoftAspNetCoreMvcNonControllerAttribute } +private predicate isMicrosoftAspNetCoreMvcIDisposableMethod(Method method) { + exists(Method baseMethod | + baseMethod = method.getOverridee*() and + not exists(baseMethod.getOverridee()) and + ( + baseMethod.getExplicitlyImplementedInterface() instanceof SystemIDisposableInterface + or + baseMethod.getUndecoratedName() = "Dispose" and + baseMethod.getNumberOfParameters() = 0 and + baseMethod.getReturnType() instanceof VoidType and + baseMethod.getDeclaringType().getABaseInterface*() instanceof SystemIDisposableInterface + ) + ) +} + /** A class treated as an owner of ASP.NET Core MVC controller helper methods. */ class MicrosoftAspNetCoreMvcControllerHelperClass extends Class { MicrosoftAspNetCoreMvcControllerHelperClass() { @@ -424,10 +439,10 @@ class MicrosoftAspNetCoreMvcController extends Class { result.isPublic() and not result.isStatic() and not result.isAbstract() and - not result.getUnboundDeclaration() instanceof UnboundGenericMethod and + not result instanceof Generic and not result.getOverridee*().getAnAttribute() instanceof MicrosoftAspNetCoreMvcNonActionAttribute and not result.getOverridee*().getDeclaringType() instanceof ObjectType and - not result instanceof DisposeMethod + not isMicrosoftAspNetCoreMvcIDisposableMethod(result) } /** Gets a `Redirect*`, `Accepted*`, or `Created*` method. */ diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs index 7e0c880a766e..7808bd841f27 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.cs @@ -196,3 +196,8 @@ internal void InternalAction(string input) { } private void PrivateAction(string input) { } } + +public class NewDisposeController : Controller +{ + public new void Dispose() { } +} diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected index 444058a4add4..428c772add9a 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCore.expected @@ -10,3 +10,4 @@ | AspNetCore.cs:155:14:155:36 | ClosedGenericController | | AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | | AspNetCore.cs:178:14:178:34 | ActionCasesController | +| AspNetCore.cs:200:14:200:33 | NewDisposeController | diff --git a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected index c3222a0cbf4d..3ee137abc849 100644 --- a/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected +++ b/csharp/ql/test/library-tests/frameworks/microsoft/AspNetCoreActions.expected @@ -13,3 +13,4 @@ | AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | AspNetCore.cs:165:17:165:31 | InheritedAction | | AspNetCore.cs:171:14:171:35 | ConcreteActionEndpoint | AspNetCore.cs:173:26:173:39 | AbstractAction | | AspNetCore.cs:178:14:178:34 | ActionCasesController | AspNetCore.cs:180:17:180:28 | PublicAction | +| AspNetCore.cs:200:14:200:33 | NewDisposeController | AspNetCore.cs:202:21:202:27 | Dispose | From c52545f3db044d6f42d329734c0579a5b1701839 Mon Sep 17 00:00:00 2001 From: JarLob Date: Sat, 22 Aug 2026 13:11:20 +0300 Subject: [PATCH 094/181] Extracted isMicrosoftAspNetCoreMvcApplication to predicate --- .../frameworks/microsoft/AspNetCore.qll | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index 50af007a971e..ee1af08d420d 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -249,30 +249,32 @@ private predicate isMicrosoftAspNetCoreMvcAddApplicationPart(MethodCall call) { } private predicate isMicrosoftAspNetCoreMvcApplicationPart(Compilation application, Assembly part) { - part = application.getOutputAssembly() - or - exists(AssemblyAttribute attr, StringLiteral assemblyName | - application.getAFileCompiled() = attr.getFile() and - attr.getType() - .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc.ApplicationParts", - "ApplicationPartAttribute") and - assemblyName = attr.getArgument(0) and - assemblyName.getValue() = part.getName() - ) - or - exists(MethodCall addPart, PropertyAccess assemblyAccess, TypeofExpr typeOf, Type partType | - application.getAFileCompiled() = addPart.getFile() and - isMicrosoftAspNetCoreMvcAddApplicationPart(addPart) and - assemblyAccess = addPart.getArgumentForName("assembly") and - assemblyAccess.getTarget().hasName("Assembly") and - assemblyAccess.getQualifier() = typeOf and - partType = typeOf.getTypeAccess().getTarget() and - part = getAnAssemblyFor(partType) + isMicrosoftAspNetCoreMvcApplication(application) and + ( + part = application.getOutputAssembly() + or + exists(AssemblyAttribute attr, StringLiteral assemblyName | + application.getAFileCompiled() = attr.getFile() and + attr.getType() + .hasFullyQualifiedName("Microsoft.AspNetCore.Mvc.ApplicationParts", + "ApplicationPartAttribute") and + assemblyName = attr.getArgument(0) and + assemblyName.getValue() = part.getName() + ) + or + exists(MethodCall addPart, PropertyAccess assemblyAccess, TypeofExpr typeOf, Type partType | + application.getAFileCompiled() = addPart.getFile() and + isMicrosoftAspNetCoreMvcAddApplicationPart(addPart) and + assemblyAccess = addPart.getArgumentForName("assembly") and + assemblyAccess.getTarget().hasName("Assembly") and + assemblyAccess.getQualifier() = typeOf and + partType = typeOf.getTypeAccess().getTarget() and + part = getAnAssemblyFor(partType) + ) ) } private predicate isInMicrosoftAspNetCoreMvcApplication(Class controller, Compilation application) { - isMicrosoftAspNetCoreMvcApplication(application) and isMicrosoftAspNetCoreMvcApplicationPart(application, getAnAssemblyFor(controller)) } From d0c3738603d59b3f3ea8845d4bb3dcbf68acd062 Mon Sep 17 00:00:00 2001 From: JarLob Date: Sat, 22 Aug 2026 13:22:43 +0300 Subject: [PATCH 095/181] Implement code review suggestion --- .../semmle/code/csharp/frameworks/microsoft/AspNetCore.qll | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index ee1af08d420d..a7f7c4f3e1d0 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -262,13 +262,12 @@ private predicate isMicrosoftAspNetCoreMvcApplicationPart(Compilation applicatio assemblyName.getValue() = part.getName() ) or - exists(MethodCall addPart, PropertyAccess assemblyAccess, TypeofExpr typeOf, Type partType | + exists(MethodCall addPart, PropertyAccess assemblyAccess, Type partType | application.getAFileCompiled() = addPart.getFile() and isMicrosoftAspNetCoreMvcAddApplicationPart(addPart) and assemblyAccess = addPart.getArgumentForName("assembly") and assemblyAccess.getTarget().hasName("Assembly") and - assemblyAccess.getQualifier() = typeOf and - partType = typeOf.getTypeAccess().getTarget() and + assemblyAccess.getQualifier().(TypeofExpr).getTypeAccess().getTarget() = partType and part = getAnAssemblyFor(partType) ) ) From 35ccfb1e373b106db28c99029cd3c21d50abe450 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 18 Aug 2026 16:54:36 +0100 Subject: [PATCH 096/181] Rust: Accept changes to test .expected file, result of upgrades on main. --- .../CWE-078/CommandInjection.expected | 76 +++++++++---------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index 71be73855bbd..396f31314dac 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -1,36 +1,36 @@ #select -| main.rs:27:5:27:16 | ...::new | main.rs:4:22:4:35 | ...::args | main.rs:27:5:27:16 | ...::new | This command line depends on a $@. | main.rs:4:22:4:35 | ...::args | user-provided value | -| main.rs:34:10:34:12 | arg | main.rs:5:25:5:46 | ...::get | main.rs:34:10:34:12 | arg | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | -| main.rs:40:10:40:12 | arg | main.rs:4:22:4:35 | ...::args | main.rs:40:10:40:12 | arg | This command line depends on a $@. | main.rs:4:22:4:35 | ...::args | user-provided value | -| main.rs:47:10:47:13 | args | main.rs:5:25:5:46 | ...::get | main.rs:47:10:47:13 | args | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | -| main.rs:53:5:53:16 | ...::new | main.rs:5:25:5:46 | ...::get | main.rs:53:5:53:16 | ...::new | This command line depends on a $@. | main.rs:5:25:5:46 | ...::get | user-provided value | -| main.rs:65:19:65:46 | ...::new | main.rs:59:25:59:46 | ...::get | main.rs:65:19:65:46 | ...::new | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | -| main.rs:73:10:73:12 | arg | main.rs:59:25:59:46 | ...::get | main.rs:73:10:73:12 | arg | This command line depends on a $@. | main.rs:59:25:59:46 | ...::get | user-provided value | -| main.rs:86:14:86:16 | arg | main.rs:108:22:108:35 | ...::args | main.rs:86:14:86:16 | arg | This command line depends on a $@. | main.rs:108:22:108:35 | ...::args | user-provided value | -| main.rs:100:18:100:20 | arg | main.rs:108:22:108:35 | ...::args | main.rs:100:18:100:20 | arg | This command line depends on a $@. | main.rs:108:22:108:35 | ...::args | user-provided value | +| main.rs:27:18:27:36 | arg_string.as_str() | main.rs:4:22:4:37 | ...::args(...) | main.rs:27:18:27:36 | arg_string.as_str() | This command line depends on a $@. | main.rs:4:22:4:37 | ...::args(...) | user-provided value | +| main.rs:34:14:34:35 | remote_string.as_str() | main.rs:5:25:5:69 | ...::get(...) | main.rs:34:14:34:35 | remote_string.as_str() | This command line depends on a $@. | main.rs:5:25:5:69 | ...::get(...) | user-provided value | +| main.rs:40:14:40:32 | arg_string.as_str() | main.rs:4:22:4:37 | ...::args(...) | main.rs:40:14:40:32 | arg_string.as_str() | This command line depends on a $@. | main.rs:4:22:4:37 | ...::args(...) | user-provided value | +| main.rs:47:15:47:45 | &... | main.rs:5:25:5:69 | ...::get(...) | main.rs:47:15:47:45 | &... | This command line depends on a $@. | main.rs:5:25:5:69 | ...::get(...) | user-provided value | +| main.rs:53:18:53:46 | concatenated_command.as_str() | main.rs:5:25:5:69 | ...::get(...) | main.rs:53:18:53:46 | concatenated_command.as_str() | This command line depends on a $@. | main.rs:5:25:5:69 | ...::get(...) | user-provided value | +| main.rs:65:48:65:69 | remote_string.as_str() | main.rs:59:25:59:69 | ...::get(...) | main.rs:65:48:65:69 | remote_string.as_str() | This command line depends on a $@. | main.rs:59:25:59:69 | ...::get(...) | user-provided value | +| main.rs:73:14:73:35 | remote_string.as_str() | main.rs:59:25:59:69 | ...::get(...) | main.rs:73:14:73:35 | remote_string.as_str() | This command line depends on a $@. | main.rs:59:25:59:69 | ...::get(...) | user-provided value | +| main.rs:86:18:86:27 | user_input | main.rs:108:22:108:37 | ...::args(...) | main.rs:86:18:86:27 | user_input | This command line depends on a $@. | main.rs:108:22:108:37 | ...::args(...) | user-provided value | +| main.rs:100:22:100:29 | filename | main.rs:108:22:108:37 | ...::args(...) | main.rs:100:22:100:29 | filename | This command line depends on a $@. | main.rs:108:22:108:37 | ...::args(...) | user-provided value | edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | -| main.rs:4:22:4:35 | ...::args | main.rs:4:22:4:37 | ...::args(...) [element] | provenance | Src:MaD:7 | +| main.rs:4:22:4:37 | ...::args(...) | main.rs:4:22:4:37 | ...::args(...) [element] | provenance | Src:MaD:7 | | main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:8 | | main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:10 | | main.rs:4:22:4:74 | ... .unwrap_or(...) | main.rs:4:9:4:18 | arg_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:34:14:34:26 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:47:23:47:35 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:52:40:52:69 | MacroExpr | provenance | | -| main.rs:5:25:5:46 | ...::get | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | +| main.rs:5:25:5:69 | ...::get(...) | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | | main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:11 | | main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:13 | | main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:12 | | main.rs:5:25:8:38 | ... .unwrap_or(...) | main.rs:5:9:5:21 | remote_string | provenance | | | main.rs:27:18:27:27 | arg_string | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:27:18:27:36 | arg_string.as_str() [&ref] | main.rs:27:5:27:16 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| main.rs:27:18:27:36 | arg_string.as_str() [&ref] | main.rs:27:18:27:36 | arg_string.as_str() | provenance | Sink:MaD:3 | | main.rs:34:14:34:26 | remote_string | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:34:14:34:35 | remote_string.as_str() [&ref] | main.rs:34:10:34:12 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:34:14:34:35 | remote_string.as_str() [&ref] | main.rs:34:14:34:35 | remote_string.as_str() | provenance | Sink:MaD:1 | | main.rs:40:14:40:23 | arg_string | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:40:14:40:32 | arg_string.as_str() [&ref] | main.rs:40:10:40:12 | arg | provenance | MaD:1 Sink:MaD:1 | -| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:10:47:13 | args | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 | -| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:10:47:13 | args | provenance | MaD:2 Sink:MaD:2 Sink:MaD:2 Sink:MaD:2 | +| main.rs:40:14:40:32 | arg_string.as_str() [&ref] | main.rs:40:14:40:32 | arg_string.as_str() | provenance | Sink:MaD:1 | +| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:15:47:45 | &... | provenance | Sink:MaD:2 Sink:MaD:2 | +| main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:15:47:45 | &... | provenance | Sink:MaD:2 Sink:MaD:2 Sink:MaD:2 | | main.rs:47:16:47:45 | [...] [element, &ref] | main.rs:47:15:47:45 | &... [&ref, element, &ref] | provenance | | | main.rs:47:23:47:35 | remote_string | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | provenance | MaD:9 | | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | main.rs:47:16:47:45 | [...] [element, &ref] | provenance | | @@ -40,25 +40,23 @@ edges | main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:14 | | main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:15 | | main.rs:53:18:53:37 | concatenated_command | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | provenance | MaD:9 | -| main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | main.rs:53:5:53:16 | ...::new | provenance | MaD:3 Sink:MaD:3 | +| main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | main.rs:53:18:53:46 | concatenated_command.as_str() | provenance | Sink:MaD:3 | | main.rs:59:9:59:21 | remote_string | main.rs:65:48:65:60 | remote_string | provenance | | | main.rs:59:9:59:21 | remote_string | main.rs:73:14:73:26 | remote_string | provenance | | -| main.rs:59:25:59:46 | ...::get | main.rs:59:25:59:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | +| main.rs:59:25:59:69 | ...::get(...) | main.rs:59:25:59:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | | main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:11 | | main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:13 | | main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:12 | | main.rs:59:25:62:38 | ... .unwrap_or(...) | main.rs:59:9:59:21 | remote_string | provenance | | | main.rs:65:48:65:60 | remote_string | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:19:65:46 | ...::new | provenance | MaD:5 Sink:MaD:5 | +| main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:48:65:69 | remote_string.as_str() | provenance | Sink:MaD:5 | | main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:10:73:12 | arg | provenance | MaD:4 Sink:MaD:4 | -| main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input [&ref] | provenance | | -| main.rs:86:18:86:27 | user_input [&ref] | main.rs:86:14:86:16 | arg | provenance | MaD:1 Sink:MaD:1 | -| main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename [&ref] | provenance | | -| main.rs:100:22:100:29 | filename [&ref] | main.rs:100:18:100:20 | arg | provenance | MaD:1 Sink:MaD:1 | +| main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:14:73:35 | remote_string.as_str() | provenance | Sink:MaD:4 | +| main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input | provenance | Sink:MaD:1 | +| main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename | provenance | Sink:MaD:1 | | main.rs:108:9:108:18 | arg_string | main.rs:112:39:112:48 | arg_string | provenance | | | main.rs:108:9:108:18 | arg_string | main.rs:113:40:113:49 | arg_string | provenance | | -| main.rs:108:22:108:35 | ...::args | main.rs:108:22:108:37 | ...::args(...) [element] | provenance | Src:MaD:7 | +| main.rs:108:22:108:37 | ...::args(...) | main.rs:108:22:108:37 | ...::args(...) [element] | provenance | Src:MaD:7 | | main.rs:108:22:108:37 | ...::args(...) [element] | main.rs:108:22:108:44 | ... .nth(...) [Some] | provenance | MaD:8 | | main.rs:108:22:108:44 | ... .nth(...) [Some] | main.rs:108:22:108:74 | ... .unwrap_or(...) | provenance | MaD:10 | | main.rs:108:22:108:74 | ... .unwrap_or(...) | main.rs:108:9:108:18 | arg_string | provenance | | @@ -84,26 +82,26 @@ models | 15 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:4:9:4:18 | arg_string | semmle.label | arg_string | -| main.rs:4:22:4:35 | ...::args | semmle.label | ...::args | +| main.rs:4:22:4:37 | ...::args(...) | semmle.label | ...::args(...) | | main.rs:4:22:4:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | main.rs:4:22:4:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | main.rs:4:22:4:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | | main.rs:5:9:5:21 | remote_string | semmle.label | remote_string | -| main.rs:5:25:5:46 | ...::get | semmle.label | ...::get | +| main.rs:5:25:5:69 | ...::get(...) | semmle.label | ...::get(...) | | main.rs:5:25:5:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | main.rs:5:25:6:17 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:5:25:7:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | | main.rs:5:25:8:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:27:5:27:16 | ...::new | semmle.label | ...::new | | main.rs:27:18:27:27 | arg_string | semmle.label | arg_string | +| main.rs:27:18:27:36 | arg_string.as_str() | semmle.label | arg_string.as_str() | | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | -| main.rs:34:10:34:12 | arg | semmle.label | arg | | main.rs:34:14:34:26 | remote_string | semmle.label | remote_string | +| main.rs:34:14:34:35 | remote_string.as_str() | semmle.label | remote_string.as_str() | | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | -| main.rs:40:10:40:12 | arg | semmle.label | arg | | main.rs:40:14:40:23 | arg_string | semmle.label | arg_string | +| main.rs:40:14:40:32 | arg_string.as_str() | semmle.label | arg_string.as_str() | | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | -| main.rs:47:10:47:13 | args | semmle.label | args | +| main.rs:47:15:47:45 | &... | semmle.label | &... | | main.rs:47:15:47:45 | &... [&ref, element, &ref] | semmle.label | &... [&ref, element, &ref] | | main.rs:47:16:47:45 | [...] [element, &ref] | semmle.label | [...] [element, &ref] | | main.rs:47:23:47:35 | remote_string | semmle.label | remote_string | @@ -113,29 +111,27 @@ nodes | main.rs:52:40:52:69 | ...::must_use(...) | semmle.label | ...::must_use(...) | | main.rs:52:40:52:69 | MacroExpr | semmle.label | MacroExpr | | main.rs:52:40:52:69 | { ... } | semmle.label | { ... } | -| main.rs:53:5:53:16 | ...::new | semmle.label | ...::new | | main.rs:53:18:53:37 | concatenated_command | semmle.label | concatenated_command | +| main.rs:53:18:53:46 | concatenated_command.as_str() | semmle.label | concatenated_command.as_str() | | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | semmle.label | concatenated_command.as_str() [&ref] | | main.rs:59:9:59:21 | remote_string | semmle.label | remote_string | -| main.rs:59:25:59:46 | ...::get | semmle.label | ...::get | +| main.rs:59:25:59:69 | ...::get(...) | semmle.label | ...::get(...) | | main.rs:59:25:59:69 | ...::get(...) [Ok] | semmle.label | ...::get(...) [Ok] | | main.rs:59:25:60:17 | ... .unwrap() | semmle.label | ... .unwrap() | | main.rs:59:25:61:15 | ... .text() [Ok] | semmle.label | ... .text() [Ok] | | main.rs:59:25:62:38 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:65:19:65:46 | ...::new | semmle.label | ...::new | | main.rs:65:48:65:60 | remote_string | semmle.label | remote_string | +| main.rs:65:48:65:69 | remote_string.as_str() | semmle.label | remote_string.as_str() | | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | -| main.rs:73:10:73:12 | arg | semmle.label | arg | | main.rs:73:14:73:26 | remote_string | semmle.label | remote_string | +| main.rs:73:14:73:35 | remote_string.as_str() | semmle.label | remote_string.as_str() | | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | semmle.label | remote_string.as_str() [&ref] | | main.rs:82:27:82:42 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | -| main.rs:86:14:86:16 | arg | semmle.label | arg | -| main.rs:86:18:86:27 | user_input [&ref] | semmle.label | user_input [&ref] | +| main.rs:86:18:86:27 | user_input | semmle.label | user_input | | main.rs:95:27:95:40 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | -| main.rs:100:18:100:20 | arg | semmle.label | arg | -| main.rs:100:22:100:29 | filename [&ref] | semmle.label | filename [&ref] | +| main.rs:100:22:100:29 | filename | semmle.label | filename | | main.rs:108:9:108:18 | arg_string | semmle.label | arg_string | -| main.rs:108:22:108:35 | ...::args | semmle.label | ...::args | +| main.rs:108:22:108:37 | ...::args(...) | semmle.label | ...::args(...) | | main.rs:108:22:108:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | | main.rs:108:22:108:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | | main.rs:108:22:108:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | From 1b3c87087b10444859c02221bab2441d60d8a76c Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:22:33 +0100 Subject: [PATCH 097/181] Rust: Add more test cases for barrier guards. --- .../CWE-078/CommandInjection.expected | 72 +++++++++++++------ .../test/query-tests/security/CWE-078/main.rs | 31 ++++++++ 2 files changed, 82 insertions(+), 21 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index 396f31314dac..b618fbeeccee 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -6,8 +6,16 @@ | main.rs:53:18:53:46 | concatenated_command.as_str() | main.rs:5:25:5:69 | ...::get(...) | main.rs:53:18:53:46 | concatenated_command.as_str() | This command line depends on a $@. | main.rs:5:25:5:69 | ...::get(...) | user-provided value | | main.rs:65:48:65:69 | remote_string.as_str() | main.rs:59:25:59:69 | ...::get(...) | main.rs:65:48:65:69 | remote_string.as_str() | This command line depends on a $@. | main.rs:59:25:59:69 | ...::get(...) | user-provided value | | main.rs:73:14:73:35 | remote_string.as_str() | main.rs:59:25:59:69 | ...::get(...) | main.rs:73:14:73:35 | remote_string.as_str() | This command line depends on a $@. | main.rs:59:25:59:69 | ...::get(...) | user-provided value | -| main.rs:86:18:86:27 | user_input | main.rs:108:22:108:37 | ...::args(...) | main.rs:86:18:86:27 | user_input | This command line depends on a $@. | main.rs:108:22:108:37 | ...::args(...) | user-provided value | -| main.rs:100:22:100:29 | filename | main.rs:108:22:108:37 | ...::args(...) | main.rs:100:22:100:29 | filename | This command line depends on a $@. | main.rs:108:22:108:37 | ...::args(...) | user-provided value | +| main.rs:86:18:86:27 | user_input | main.rs:138:22:138:37 | ...::args(...) | main.rs:86:18:86:27 | user_input | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:100:22:100:29 | filename | main.rs:138:22:138:37 | ...::args(...) | main.rs:100:22:100:29 | filename | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:111:22:111:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:111:22:111:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:113:22:113:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:113:22:113:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:119:22:119:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:119:22:119:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:121:22:121:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:121:22:121:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:125:22:125:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:125:22:125:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:127:22:127:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:127:22:127:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:131:22:131:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:131:22:131:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | +| main.rs:133:22:133:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:133:22:133:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | @@ -54,16 +62,27 @@ edges | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:14:73:35 | remote_string.as_str() | provenance | Sink:MaD:4 | | main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input | provenance | Sink:MaD:1 | | main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename | provenance | Sink:MaD:1 | -| main.rs:108:9:108:18 | arg_string | main.rs:112:39:112:48 | arg_string | provenance | | -| main.rs:108:9:108:18 | arg_string | main.rs:113:40:113:49 | arg_string | provenance | | -| main.rs:108:22:108:37 | ...::args(...) | main.rs:108:22:108:37 | ...::args(...) [element] | provenance | Src:MaD:7 | -| main.rs:108:22:108:37 | ...::args(...) [element] | main.rs:108:22:108:44 | ... .nth(...) [Some] | provenance | MaD:8 | -| main.rs:108:22:108:44 | ... .nth(...) [Some] | main.rs:108:22:108:74 | ... .unwrap_or(...) | provenance | MaD:10 | -| main.rs:108:22:108:74 | ... .unwrap_or(...) | main.rs:108:9:108:18 | arg_string | provenance | | -| main.rs:112:39:112:48 | arg_string | main.rs:112:39:112:57 | arg_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:112:39:112:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | -| main.rs:113:40:113:49 | arg_string | main.rs:113:40:113:58 | arg_string.as_str() [&ref] | provenance | MaD:9 | -| main.rs:113:40:113:58 | arg_string.as_str() [&ref] | main.rs:95:27:95:40 | ...: ... [&ref] | provenance | | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:111:22:111:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:113:22:113:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:119:22:119:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:121:22:121:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:125:22:125:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:127:22:127:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:131:22:131:28 | command | provenance | Sink:MaD:3 | +| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:133:22:133:28 | command | provenance | Sink:MaD:3 | +| main.rs:138:9:138:18 | arg_string | main.rs:142:39:142:48 | arg_string | provenance | | +| main.rs:138:9:138:18 | arg_string | main.rs:143:40:143:49 | arg_string | provenance | | +| main.rs:138:9:138:18 | arg_string | main.rs:144:31:144:40 | arg_string | provenance | | +| main.rs:138:22:138:37 | ...::args(...) | main.rs:138:22:138:37 | ...::args(...) [element] | provenance | Src:MaD:7 | +| main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:8 | +| main.rs:138:22:138:44 | ... .nth(...) [Some] | main.rs:138:22:138:74 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:138:22:138:74 | ... .unwrap_or(...) | main.rs:138:9:138:18 | arg_string | provenance | | +| main.rs:142:39:142:48 | arg_string | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:142:39:142:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | +| main.rs:143:40:143:49 | arg_string | main.rs:143:40:143:58 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:143:40:143:58 | arg_string.as_str() [&ref] | main.rs:95:27:95:40 | ...: ... [&ref] | provenance | | +| main.rs:144:31:144:40 | arg_string | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:144:31:144:49 | arg_string.as_str() [&ref] | main.rs:107:30:107:42 | ...: ... [&ref] | provenance | | models | 1 | Sink: ::arg; Argument[0]; command-injection | | 2 | Sink: ::args; Argument[0]; command-injection | @@ -130,13 +149,24 @@ nodes | main.rs:86:18:86:27 | user_input | semmle.label | user_input | | main.rs:95:27:95:40 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | | main.rs:100:22:100:29 | filename | semmle.label | filename | -| main.rs:108:9:108:18 | arg_string | semmle.label | arg_string | -| main.rs:108:22:108:37 | ...::args(...) | semmle.label | ...::args(...) | -| main.rs:108:22:108:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | -| main.rs:108:22:108:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | -| main.rs:108:22:108:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | -| main.rs:112:39:112:48 | arg_string | semmle.label | arg_string | -| main.rs:112:39:112:57 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | -| main.rs:113:40:113:49 | arg_string | semmle.label | arg_string | -| main.rs:113:40:113:58 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:107:30:107:42 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | +| main.rs:111:22:111:28 | command | semmle.label | command | +| main.rs:113:22:113:28 | command | semmle.label | command | +| main.rs:119:22:119:28 | command | semmle.label | command | +| main.rs:121:22:121:28 | command | semmle.label | command | +| main.rs:125:22:125:28 | command | semmle.label | command | +| main.rs:127:22:127:28 | command | semmle.label | command | +| main.rs:131:22:131:28 | command | semmle.label | command | +| main.rs:133:22:133:28 | command | semmle.label | command | +| main.rs:138:9:138:18 | arg_string | semmle.label | arg_string | +| main.rs:138:22:138:37 | ...::args(...) | semmle.label | ...::args(...) | +| main.rs:138:22:138:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | +| main.rs:138:22:138:44 | ... .nth(...) [Some] | semmle.label | ... .nth(...) [Some] | +| main.rs:138:22:138:74 | ... .unwrap_or(...) | semmle.label | ... .unwrap_or(...) | +| main.rs:142:39:142:48 | arg_string | semmle.label | arg_string | +| main.rs:142:39:142:57 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:143:40:143:49 | arg_string | semmle.label | arg_string | +| main.rs:143:40:143:58 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | +| main.rs:144:31:144:40 | arg_string | semmle.label | arg_string | +| main.rs:144:31:144:49 | arg_string.as_str() [&ref] | semmle.label | arg_string.as_str() [&ref] | subpaths diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs index 6fc29ceb2104..7a422af26d38 100644 --- a/rust/ql/test/query-tests/security/CWE-078/main.rs +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -104,6 +104,36 @@ mod qhelp_example_good { } } +fn test_allowlist_sanitizers(command: &str) { + let allowed_commands_array = ["cat", "git", "ls"]; + + if allowed_commands_array.contains(&command) { + Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + } else { + Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 + } + + let allowed_commands_vec = vec!["cat", "git", "ls"]; + + if allowed_commands_vec.contains(&command) { + Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + } else { + Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 + } + + if command == "ls" { + Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + } else { + Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 + } + + if command != "ls" { + Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 + } else { + Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + } +} + fn main() { let arg_string = std::env::args().nth(1).unwrap_or(String::from("ls")); // $ Source=args2 @@ -111,4 +141,5 @@ fn main() { test_tokio_command_injection(); qhelp_example_bad::handle_request(arg_string.as_str()); qhelp_example_good::handle_request(arg_string.as_str()); + test_allowlist_sanitizers(arg_string.as_str()); } From 1a8b5b5ea8d7862d7cab4766033addc3a0f630ea Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 18 Aug 2026 11:26:56 +0100 Subject: [PATCH 098/181] Rust: Add barrier guards to the query. --- .../security/CommandInjectionExtensions.qll | 58 +++++++++++++++++++ .../CWE-078/CommandInjection.expected | 9 --- .../test/query-tests/security/CWE-078/main.rs | 6 +- 3 files changed, 61 insertions(+), 12 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll b/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll index 7e0150d53f66..2abcec6eb6f9 100644 --- a/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/CommandInjectionExtensions.qll @@ -61,4 +61,62 @@ module CommandInjection { private class FieldlessEnumTypeBarrier extends Barrier instanceof Barriers::FieldlessEnumTypeBarrier { } + + /** + * A sanitizer guard for command injection vulnerabilities. + */ + class SanitizerGuard extends Barrier { + SanitizerGuard() { this = DataFlow::BarrierGuard::getABarrierNode() } + } +} + +private predicate sanitizerGuard(AstNode g, Expr e, boolean branch) { + g.(SanitizerGuard::Range).checks(e, branch) +} + +/** + * Provides a class for modeling new command injection safety checks. + */ +module SanitizerGuard { + /** + * A data-flow node that checks whether a command is safe. + */ + abstract class Range extends AstNode { + /** + * Holds if this guard validates `e` upon evaluating to `branch`. + */ + abstract predicate checks(Expr e, boolean branch); + } +} + +/** + * A successful membership check against a (presumed) command allowlist. For example: + * ``` + * if allowlist.contains(&commmand) { ... } + * ``` + */ +private class AllowlistContainsCheck extends SanitizerGuard::Range, MethodCall { + AllowlistContainsCheck() { this.getStaticTarget().getName().getText() = "contains" } + + override predicate checks(Expr e, boolean branch) { + e.getParentNode*() = this.getPositionalArgument(0) and + branch = true + } +} + +/** + * An equality check against a (presumed) allowed command value. For example: + * ``` + * if command == "ls" { ... } + * ``` + */ +private class AllowlistEqualityCheck extends SanitizerGuard::Range, EqualityOperation { + override predicate checks(Expr e, boolean branch) { + e = this.getAnOperand() and + ( + this instanceof EqualsOperation and branch = true + or + this instanceof NotEqualsOperation and branch = false + ) + } } diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index b618fbeeccee..be6128cef5d0 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -10,12 +10,9 @@ | main.rs:100:22:100:29 | filename | main.rs:138:22:138:37 | ...::args(...) | main.rs:100:22:100:29 | filename | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:111:22:111:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:111:22:111:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:113:22:113:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:113:22:113:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | -| main.rs:119:22:119:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:119:22:119:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:121:22:121:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:121:22:121:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | -| main.rs:125:22:125:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:125:22:125:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:127:22:127:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:127:22:127:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | | main.rs:131:22:131:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:131:22:131:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | -| main.rs:133:22:133:28 | command | main.rs:138:22:138:37 | ...::args(...) | main.rs:133:22:133:28 | command | This command line depends on a $@. | main.rs:138:22:138:37 | ...::args(...) | user-provided value | edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | @@ -64,12 +61,9 @@ edges | main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename | provenance | Sink:MaD:1 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:111:22:111:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:113:22:113:28 | command | provenance | Sink:MaD:3 | -| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:119:22:119:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:121:22:121:28 | command | provenance | Sink:MaD:3 | -| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:125:22:125:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:127:22:127:28 | command | provenance | Sink:MaD:3 | | main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:131:22:131:28 | command | provenance | Sink:MaD:3 | -| main.rs:107:30:107:42 | ...: ... [&ref] | main.rs:133:22:133:28 | command | provenance | Sink:MaD:3 | | main.rs:138:9:138:18 | arg_string | main.rs:142:39:142:48 | arg_string | provenance | | | main.rs:138:9:138:18 | arg_string | main.rs:143:40:143:49 | arg_string | provenance | | | main.rs:138:9:138:18 | arg_string | main.rs:144:31:144:40 | arg_string | provenance | | @@ -152,12 +146,9 @@ nodes | main.rs:107:30:107:42 | ...: ... [&ref] | semmle.label | ...: ... [&ref] | | main.rs:111:22:111:28 | command | semmle.label | command | | main.rs:113:22:113:28 | command | semmle.label | command | -| main.rs:119:22:119:28 | command | semmle.label | command | | main.rs:121:22:121:28 | command | semmle.label | command | -| main.rs:125:22:125:28 | command | semmle.label | command | | main.rs:127:22:127:28 | command | semmle.label | command | | main.rs:131:22:131:28 | command | semmle.label | command | -| main.rs:133:22:133:28 | command | semmle.label | command | | main.rs:138:9:138:18 | arg_string | semmle.label | arg_string | | main.rs:138:22:138:37 | ...::args(...) | semmle.label | ...::args(...) | | main.rs:138:22:138:37 | ...::args(...) [element] | semmle.label | ...::args(...) [element] | diff --git a/rust/ql/test/query-tests/security/CWE-078/main.rs b/rust/ql/test/query-tests/security/CWE-078/main.rs index 7a422af26d38..f2d8ac4ee994 100644 --- a/rust/ql/test/query-tests/security/CWE-078/main.rs +++ b/rust/ql/test/query-tests/security/CWE-078/main.rs @@ -116,13 +116,13 @@ fn test_allowlist_sanitizers(command: &str) { let allowed_commands_vec = vec!["cat", "git", "ls"]; if allowed_commands_vec.contains(&command) { - Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + Command::new(command).output().expect("failed"); } else { Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 } if command == "ls" { - Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + Command::new(command).output().expect("failed"); } else { Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 } @@ -130,7 +130,7 @@ fn test_allowlist_sanitizers(command: &str) { if command != "ls" { Command::new(command).output().expect("failed"); // $ Alert[rust/command-line-injection]=args2 } else { - Command::new(command).output().expect("failed"); // $ SPURIOUS: Alert[rust/command-line-injection]=args2 + Command::new(command).output().expect("failed"); } } From 9fc84bfc329771ecfbc8e63dc19c78d7c8489dbf Mon Sep 17 00:00:00 2001 From: Chaitanya Mangalagiri Date: Sat, 22 Aug 2026 15:30:19 -0700 Subject: [PATCH 099/181] Rust: Clarify comment in CommandInjectionGood.rs example per review suggestion --- rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs b/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs index bb720d39d03e..9892c47fda21 100644 --- a/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs +++ b/rust/ql/src/queries/security/CWE-078/CommandInjectionGood.rs @@ -1,8 +1,7 @@ use std::process::Command; fn handle_request(filename: &str) { - // GOOD: use a fixed command with the user input as a separate argument, - // avoiding shell interpretation + // GOOD: user input is checked against an allowlist before passing into a shell command let allowed_names = ["report.pdf", "summary.txt", "data.csv"]; if allowed_names.contains(&filename) { Command::new("cat") From 6d26e22190d5f65a250cb205932247700751fd38 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 24 Aug 2026 10:04:59 +0200 Subject: [PATCH 100/181] Rust: Add MaD tests for blanket implementations --- .../dataflow/models/external_file.rs | 12 +- .../library-tests/dataflow/models/main.rs | 45 +- .../dataflow/models/models.expected | 613 +++++++++--------- .../dataflow/models/models.ext.yml | 2 + 4 files changed, 359 insertions(+), 313 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/models/external_file.rs b/rust/ql/test/library-tests/dataflow/models/external_file.rs index 0e351a475d38..044150eb8ee2 100644 --- a/rust/ql/test/library-tests/dataflow/models/external_file.rs +++ b/rust/ql/test/library-tests/dataflow/models/external_file.rs @@ -1,4 +1,3 @@ - pub fn generated_source(i: i64) -> i64 { 0 } @@ -28,3 +27,14 @@ pub fn neutral_generated_summary(i: i64) -> i64 { pub fn neutral_manual_summary(i: i64) -> i64 { 0 } + +pub trait MyTrait2 { + fn flow_through2(i: i64) -> i64; +} + +impl MyTrait2 for T { + // inherits model from the trait function + fn flow_through2(i: i64) -> i64 { + 0 + } +} diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index d06ed3069b53..77db4621e711 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -102,7 +102,7 @@ fn test_set_var_field() { match e1 { MyFieldEnum::C { field_c: i } => sink(i), MyFieldEnum::D { field_d: i } => sink(i), // $ hasValueFlow=5 - MyFieldEnum::E { field_e: o } => () + MyFieldEnum::E { field_e: o } => (), } } @@ -258,18 +258,17 @@ fn test_enum_source() { match s { MyFieldEnum::C { field_c: i } => sink(i), MyFieldEnum::D { field_d: i } => sink(i), // $ hasValueFlow=12 - MyFieldEnum::E { field_e: o } => () + MyFieldEnum::E { field_e: o } => (), } let s = enum_source_nested(13); match s { MyFieldEnum::C { field_c: i } => sink(i), MyFieldEnum::D { field_d: i } => sink(i), - MyFieldEnum::E { field_e: o } => - { + MyFieldEnum::E { field_e: o } => { match o { Some(i) => sink(i), // $ hasValueFlow=13 - None => () + None => (), } } } @@ -281,13 +280,13 @@ fn test_enum_method_source() { match s { MyFieldEnum::C { field_c: i } => sink(i), // $ hasValueFlow=13 MyFieldEnum::D { field_d: i } => sink(i), - MyFieldEnum::E { field_e: o } => () + MyFieldEnum::E { field_e: o } => (), } } mod source_into_function { - use crate::MyFieldEnum; use super::sink; + use crate::MyFieldEnum; // has a source model fn pass_source(_i: i64, f: impl FnOnce(i64) -> A) -> A { @@ -320,11 +319,10 @@ mod source_into_function { match e { MyFieldEnum::C { field_c: i } => sink(i), MyFieldEnum::D { field_d: i } => sink(i), - MyFieldEnum::E { field_e: o } => - { + MyFieldEnum::E { field_e: o } => { match o { Some(i) => sink(i), // $ hasValueFlow=5 - None => () + None => (), } } } @@ -333,14 +331,14 @@ mod source_into_function { } mod sink_out_of_function { - use crate::MyFieldEnum; use super::source; + use crate::MyFieldEnum; // has a sink model - fn pass_sink(f: impl FnOnce(()) -> i64) { } + fn pass_sink(f: impl FnOnce(()) -> i64) {} // has a sink model - fn pass_sink_nested(f: impl FnOnce(()) -> MyFieldEnum) { } + fn pass_sink_nested(f: impl FnOnce(()) -> MyFieldEnum) {} fn test_sink_out_of_function() { let a = |a| source(1); @@ -348,7 +346,9 @@ mod sink_out_of_function { let b = |_a| { let s = source(2); - MyFieldEnum::E { field_e: Option::Some(s) } + MyFieldEnum::E { + field_e: Option::Some(s), + } }; pass_sink_nested(b); // $ hasValueFlow=2 } @@ -460,6 +460,17 @@ impl Ord for MyStruct2 { } } +trait MyTrait3 { + fn flow_through3(i: i64) -> i64; +} + +impl MyTrait3 for T { + // has an explicit model + fn flow_through3(i: i64) -> i64 { + 0 + } +} + fn test_trait_model(x: T) { let x1 = source(20).max(0); sink(x1); // $ hasValueFlow=20 @@ -488,6 +499,12 @@ fn test_trait_model(x: T) { let x7 = (source(28) as i32) < 1; sink(x7); + + let x8 = <()>::flow_through2(source(29)); + sink(x8); // $ hasValueFlow=29 + + let x9 = <()>::flow_through3(source(30)); + sink(x9); // $ MISSING: hasValueFlow=30 } mod external_file; diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 81add2ae3f6b..9fec16cfafa2 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -23,20 +23,21 @@ models | 22 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | | 23 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | | 24 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 25 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 26 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 27 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 28 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 29 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 30 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 31 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 32 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 33 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 34 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 35 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 36 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 37 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 38 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 25 | Summary: main::external_file::MyTrait2::flow_through2; Argument[0]; ReturnValue; value | +| 26 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 27 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 28 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 29 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 30 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 31 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 32 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 33 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 34 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 35 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 36 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 37 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 38 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 39 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -51,8 +52,8 @@ edges | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:38 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:38 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -63,8 +64,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:32 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:32 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -73,8 +74,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:37 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:37 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -91,8 +92,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:31 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:31 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -101,8 +102,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:36 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:36 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -119,8 +120,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:29 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:29 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -129,16 +130,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:34 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:34 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:27 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:27 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -149,8 +150,8 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:33 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:33 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:21 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:21 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | @@ -163,8 +164,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:30 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:30 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -173,8 +174,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:35 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:35 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -225,8 +226,8 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:28 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:28 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | @@ -245,60 +246,60 @@ edges | main.rs:265:11:265:11 | s [E, Some] | main.rs:268:9:268:37 | ...::E {...} [E, Some] | provenance | | | main.rs:268:9:268:37 | ...::E {...} [E, Some] | main.rs:268:35:268:35 | o [Some] | provenance | | | main.rs:268:9:268:37 | ...::E {...} [E, Some] | main.rs:268:35:268:35 | o [Some] | provenance | | -| main.rs:268:35:268:35 | o [Some] | main.rs:270:19:270:19 | o [Some] | provenance | | -| main.rs:268:35:268:35 | o [Some] | main.rs:270:19:270:19 | o [Some] | provenance | | -| main.rs:270:19:270:19 | o [Some] | main.rs:271:17:271:23 | Some(...) [Some] | provenance | | -| main.rs:270:19:270:19 | o [Some] | main.rs:271:17:271:23 | Some(...) [Some] | provenance | | -| main.rs:271:17:271:23 | Some(...) [Some] | main.rs:271:22:271:22 | i | provenance | | -| main.rs:271:17:271:23 | Some(...) [Some] | main.rs:271:22:271:22 | i | provenance | | -| main.rs:271:22:271:22 | i | main.rs:271:33:271:33 | i | provenance | | -| main.rs:271:22:271:22 | i | main.rs:271:33:271:33 | i | provenance | | -| main.rs:280:9:280:9 | s [C] | main.rs:281:11:281:11 | s [C] | provenance | | -| main.rs:280:9:280:9 | s [C] | main.rs:281:11:281:11 | s [C] | provenance | | -| main.rs:280:13:280:24 | e.source(...) | main.rs:280:9:280:9 | s [C] | provenance | Src:MaD:9 | -| main.rs:280:13:280:24 | e.source(...) | main.rs:280:9:280:9 | s [C] | provenance | Src:MaD:9 | -| main.rs:281:11:281:11 | s [C] | main.rs:282:9:282:37 | ...::C {...} [C] | provenance | | -| main.rs:281:11:281:11 | s [C] | main.rs:282:9:282:37 | ...::C {...} [C] | provenance | | -| main.rs:282:9:282:37 | ...::C {...} [C] | main.rs:282:35:282:35 | i | provenance | | -| main.rs:282:9:282:37 | ...::C {...} [C] | main.rs:282:35:282:35 | i | provenance | | -| main.rs:282:35:282:35 | i | main.rs:282:47:282:47 | i | provenance | | -| main.rs:282:35:282:35 | i | main.rs:282:47:282:47 | i | provenance | | -| main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | provenance | Src:MaD:17 | -| main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | provenance | Src:MaD:17 | -| main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | provenance | Src:MaD:17 | -| main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | provenance | Src:MaD:17 | -| main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | provenance | Src:MaD:17 | -| main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | provenance | Src:MaD:17 | -| main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | provenance | Src:MaD:17 | -| main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | provenance | Src:MaD:17 | -| main.rs:319:31:331:9 | \|...\| ... | main.rs:319:31:331:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | -| main.rs:319:31:331:9 | \|...\| ... | main.rs:319:31:331:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | -| main.rs:319:31:331:9 | \|...\| ... [E, Some] | main.rs:320:19:320:19 | e [E, Some] | provenance | | -| main.rs:319:31:331:9 | \|...\| ... [E, Some] | main.rs:320:19:320:19 | e [E, Some] | provenance | | -| main.rs:320:19:320:19 | e [E, Some] | main.rs:323:17:323:45 | ...::E {...} [E, Some] | provenance | | -| main.rs:320:19:320:19 | e [E, Some] | main.rs:323:17:323:45 | ...::E {...} [E, Some] | provenance | | -| main.rs:323:17:323:45 | ...::E {...} [E, Some] | main.rs:323:43:323:43 | o [Some] | provenance | | -| main.rs:323:17:323:45 | ...::E {...} [E, Some] | main.rs:323:43:323:43 | o [Some] | provenance | | -| main.rs:323:43:323:43 | o [Some] | main.rs:325:27:325:27 | o [Some] | provenance | | -| main.rs:323:43:323:43 | o [Some] | main.rs:325:27:325:27 | o [Some] | provenance | | -| main.rs:325:27:325:27 | o [Some] | main.rs:326:25:326:31 | Some(...) [Some] | provenance | | -| main.rs:325:27:325:27 | o [Some] | main.rs:326:25:326:31 | Some(...) [Some] | provenance | | -| main.rs:326:25:326:31 | Some(...) [Some] | main.rs:326:30:326:30 | i | provenance | | -| main.rs:326:25:326:31 | Some(...) [Some] | main.rs:326:30:326:30 | i | provenance | | -| main.rs:326:30:326:30 | i | main.rs:326:41:326:41 | i | provenance | | -| main.rs:326:30:326:30 | i | main.rs:326:41:326:41 | i | provenance | | -| main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | provenance | Sink:MaD:7 | -| main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | provenance | Sink:MaD:7 | -| main.rs:350:17:350:17 | s | main.rs:351:52:351:52 | s | provenance | | -| main.rs:350:17:350:17 | s | main.rs:351:52:351:52 | s | provenance | | -| main.rs:350:21:350:29 | source(...) | main.rs:350:17:350:17 | s | provenance | | -| main.rs:350:21:350:29 | source(...) | main.rs:350:17:350:17 | s | provenance | | -| main.rs:351:13:351:55 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | -| main.rs:351:13:351:55 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | -| main.rs:351:39:351:53 | ...::Some(...) [Some] | main.rs:351:13:351:55 | ...::E {...} [E, Some] | provenance | | -| main.rs:351:39:351:53 | ...::Some(...) [Some] | main.rs:351:13:351:55 | ...::E {...} [E, Some] | provenance | | -| main.rs:351:52:351:52 | s | main.rs:351:39:351:53 | ...::Some(...) [Some] | provenance | | -| main.rs:351:52:351:52 | s | main.rs:351:39:351:53 | ...::Some(...) [Some] | provenance | | +| main.rs:268:35:268:35 | o [Some] | main.rs:269:19:269:19 | o [Some] | provenance | | +| main.rs:268:35:268:35 | o [Some] | main.rs:269:19:269:19 | o [Some] | provenance | | +| main.rs:269:19:269:19 | o [Some] | main.rs:270:17:270:23 | Some(...) [Some] | provenance | | +| main.rs:269:19:269:19 | o [Some] | main.rs:270:17:270:23 | Some(...) [Some] | provenance | | +| main.rs:270:17:270:23 | Some(...) [Some] | main.rs:270:22:270:22 | i | provenance | | +| main.rs:270:17:270:23 | Some(...) [Some] | main.rs:270:22:270:22 | i | provenance | | +| main.rs:270:22:270:22 | i | main.rs:270:33:270:33 | i | provenance | | +| main.rs:270:22:270:22 | i | main.rs:270:33:270:33 | i | provenance | | +| main.rs:279:9:279:9 | s [C] | main.rs:280:11:280:11 | s [C] | provenance | | +| main.rs:279:9:279:9 | s [C] | main.rs:280:11:280:11 | s [C] | provenance | | +| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:9 | +| main.rs:279:13:279:24 | e.source(...) | main.rs:279:9:279:9 | s [C] | provenance | Src:MaD:9 | +| main.rs:280:11:280:11 | s [C] | main.rs:281:9:281:37 | ...::C {...} [C] | provenance | | +| main.rs:280:11:280:11 | s [C] | main.rs:281:9:281:37 | ...::C {...} [C] | provenance | | +| main.rs:281:9:281:37 | ...::C {...} [C] | main.rs:281:35:281:35 | i | provenance | | +| main.rs:281:9:281:37 | ...::C {...} [C] | main.rs:281:35:281:35 | i | provenance | | +| main.rs:281:35:281:35 | i | main.rs:281:47:281:47 | i | provenance | | +| main.rs:281:35:281:35 | i | main.rs:281:47:281:47 | i | provenance | | +| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:17 | +| main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | provenance | Src:MaD:17 | +| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:17 | +| main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | provenance | Src:MaD:17 | +| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:17 | +| main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | provenance | Src:MaD:17 | +| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:17 | +| main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | provenance | Src:MaD:17 | +| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | +| main.rs:318:31:329:9 | \|...\| ... | main.rs:318:31:329:9 | \|...\| ... [E, Some] | provenance | Src:MaD:18 | +| main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | +| main.rs:318:31:329:9 | \|...\| ... [E, Some] | main.rs:319:19:319:19 | e [E, Some] | provenance | | +| main.rs:319:19:319:19 | e [E, Some] | main.rs:322:17:322:45 | ...::E {...} [E, Some] | provenance | | +| main.rs:319:19:319:19 | e [E, Some] | main.rs:322:17:322:45 | ...::E {...} [E, Some] | provenance | | +| main.rs:322:17:322:45 | ...::E {...} [E, Some] | main.rs:322:43:322:43 | o [Some] | provenance | | +| main.rs:322:17:322:45 | ...::E {...} [E, Some] | main.rs:322:43:322:43 | o [Some] | provenance | | +| main.rs:322:43:322:43 | o [Some] | main.rs:323:27:323:27 | o [Some] | provenance | | +| main.rs:322:43:322:43 | o [Some] | main.rs:323:27:323:27 | o [Some] | provenance | | +| main.rs:323:27:323:27 | o [Some] | main.rs:324:25:324:31 | Some(...) [Some] | provenance | | +| main.rs:323:27:323:27 | o [Some] | main.rs:324:25:324:31 | Some(...) [Some] | provenance | | +| main.rs:324:25:324:31 | Some(...) [Some] | main.rs:324:30:324:30 | i | provenance | | +| main.rs:324:25:324:31 | Some(...) [Some] | main.rs:324:30:324:30 | i | provenance | | +| main.rs:324:30:324:30 | i | main.rs:324:41:324:41 | i | provenance | | +| main.rs:324:30:324:30 | i | main.rs:324:41:324:41 | i | provenance | | +| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:7 | +| main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | provenance | Sink:MaD:7 | +| main.rs:348:17:348:17 | s | main.rs:350:39:350:39 | s | provenance | | +| main.rs:348:17:348:17 | s | main.rs:350:39:350:39 | s | provenance | | +| main.rs:348:21:348:29 | source(...) | main.rs:348:17:348:17 | s | provenance | | +| main.rs:348:21:348:29 | source(...) | main.rs:348:17:348:17 | s | provenance | | +| main.rs:349:13:351:13 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | +| main.rs:349:13:351:13 | ...::E {...} [E, Some] | main.rs:353:26:353:26 | b [E, Some] | provenance | | +| main.rs:350:26:350:40 | ...::Some(...) [Some] | main.rs:349:13:351:13 | ...::E {...} [E, Some] | provenance | | +| main.rs:350:26:350:40 | ...::Some(...) [Some] | main.rs:349:13:351:13 | ...::E {...} [E, Some] | provenance | | +| main.rs:350:39:350:39 | s | main.rs:350:26:350:40 | ...::Some(...) [Some] | provenance | | +| main.rs:350:39:350:39 | s | main.rs:350:26:350:40 | ...::Some(...) [Some] | provenance | | | main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | | main.rs:353:26:353:26 | b [E, Some] | main.rs:353:26:353:26 | b | provenance | Sink:MaD:8 | | main.rs:364:9:364:9 | s | main.rs:365:41:365:41 | s | provenance | | @@ -339,46 +340,52 @@ edges | main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | provenance | Src:MaD:11 | | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:10 | | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:10 | -| main.rs:464:9:464:10 | x1 | main.rs:465:10:465:11 | x1 | provenance | | -| main.rs:464:9:464:10 | x1 | main.rs:465:10:465:11 | x1 | provenance | | -| main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:464:14:464:23 | source(...) | main.rs:464:14:464:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:464:14:464:30 | ... .max(...) | main.rs:464:9:464:10 | x1 | provenance | | -| main.rs:464:14:464:30 | ... .max(...) | main.rs:464:9:464:10 | x1 | provenance | | -| main.rs:467:9:467:10 | x2 [MyStruct.field1] | main.rs:475:10:475:11 | x2 [MyStruct.field1] | provenance | | -| main.rs:467:9:467:10 | x2 [MyStruct.field1] | main.rs:475:10:475:11 | x2 [MyStruct.field1] | provenance | | -| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | main.rs:467:9:467:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | main.rs:467:9:467:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | -| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | -| main.rs:468:17:468:26 | source(...) | main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:468:17:468:26 | source(...) | main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:475:10:475:11 | x2 [MyStruct.field1] | main.rs:475:10:475:18 | x2.field1 | provenance | | -| main.rs:475:10:475:11 | x2 [MyStruct.field1] | main.rs:475:10:475:18 | x2.field1 | provenance | | -| main.rs:480:9:480:10 | x4 | main.rs:481:10:481:11 | x4 | provenance | | -| main.rs:480:9:480:10 | x4 | main.rs:481:10:481:11 | x4 | provenance | | -| main.rs:480:14:480:23 | source(...) | main.rs:480:14:480:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:480:14:480:23 | source(...) | main.rs:480:14:480:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:480:14:480:30 | ... .max(...) | main.rs:480:9:480:10 | x4 | provenance | | -| main.rs:480:14:480:30 | ... .max(...) | main.rs:480:9:480:10 | x4 | provenance | | -| main.rs:483:9:483:10 | x5 | main.rs:484:10:484:11 | x5 | provenance | | -| main.rs:483:14:483:23 | source(...) | main.rs:483:14:483:30 | ... .lt(...) | provenance | MaD:20 | -| main.rs:483:14:483:30 | ... .lt(...) | main.rs:483:9:483:10 | x5 | provenance | | -| main.rs:486:9:486:10 | x6 | main.rs:487:10:487:11 | x6 | provenance | | -| main.rs:486:14:486:23 | source(...) | main.rs:486:14:486:27 | ... < ... | provenance | MaD:20 | -| main.rs:486:14:486:27 | ... < ... | main.rs:486:9:486:10 | x6 | provenance | | -| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | provenance | Src:MaD:14 | -| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | provenance | Src:MaD:14 | -| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | -| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | -| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | provenance | Sink:MaD:4 | -| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | provenance | Sink:MaD:4 | -| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | provenance | MaD:25 | -| main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | provenance | MaD:25 | -| main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | provenance | MaD:26 | -| main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | provenance | MaD:26 | +| main.rs:475:9:475:10 | x1 | main.rs:476:10:476:11 | x1 | provenance | | +| main.rs:475:9:475:10 | x1 | main.rs:476:10:476:11 | x1 | provenance | | +| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:475:14:475:30 | ... .max(...) | main.rs:475:9:475:10 | x1 | provenance | | +| main.rs:475:14:475:30 | ... .max(...) | main.rs:475:9:475:10 | x1 | provenance | | +| main.rs:478:9:478:10 | x2 [MyStruct.field1] | main.rs:486:10:486:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:478:9:478:10 | x2 [MyStruct.field1] | main.rs:486:10:486:11 | x2 [MyStruct.field1] | provenance | | +| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | main.rs:478:9:478:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | main.rs:478:9:478:10 | x2 [MyStruct.field1] | provenance | | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | +| main.rs:479:17:479:26 | source(...) | main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:479:17:479:26 | source(...) | main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | provenance | | +| main.rs:486:10:486:11 | x2 [MyStruct.field1] | main.rs:486:10:486:18 | x2.field1 | provenance | | +| main.rs:486:10:486:11 | x2 [MyStruct.field1] | main.rs:486:10:486:18 | x2.field1 | provenance | | +| main.rs:491:9:491:10 | x4 | main.rs:492:10:492:11 | x4 | provenance | | +| main.rs:491:9:491:10 | x4 | main.rs:492:10:492:11 | x4 | provenance | | +| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:491:14:491:30 | ... .max(...) | main.rs:491:9:491:10 | x4 | provenance | | +| main.rs:491:14:491:30 | ... .max(...) | main.rs:491:9:491:10 | x4 | provenance | | +| main.rs:494:9:494:10 | x5 | main.rs:495:10:495:11 | x5 | provenance | | +| main.rs:494:14:494:23 | source(...) | main.rs:494:14:494:30 | ... .lt(...) | provenance | MaD:20 | +| main.rs:494:14:494:30 | ... .lt(...) | main.rs:494:9:494:10 | x5 | provenance | | +| main.rs:497:9:497:10 | x6 | main.rs:498:10:498:11 | x6 | provenance | | +| main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:20 | +| main.rs:497:14:497:27 | ... < ... | main.rs:497:9:497:10 | x6 | provenance | | +| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | +| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | +| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | +| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:25 | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:25 | +| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | provenance | Src:MaD:14 | +| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | provenance | Src:MaD:14 | +| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | +| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | +| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | +| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | +| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | +| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -620,74 +627,74 @@ nodes | main.rs:268:9:268:37 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | | main.rs:268:35:268:35 | o [Some] | semmle.label | o [Some] | | main.rs:268:35:268:35 | o [Some] | semmle.label | o [Some] | -| main.rs:270:19:270:19 | o [Some] | semmle.label | o [Some] | -| main.rs:270:19:270:19 | o [Some] | semmle.label | o [Some] | -| main.rs:271:17:271:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:271:17:271:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:271:22:271:22 | i | semmle.label | i | -| main.rs:271:22:271:22 | i | semmle.label | i | -| main.rs:271:33:271:33 | i | semmle.label | i | -| main.rs:271:33:271:33 | i | semmle.label | i | -| main.rs:280:9:280:9 | s [C] | semmle.label | s [C] | -| main.rs:280:9:280:9 | s [C] | semmle.label | s [C] | -| main.rs:280:13:280:24 | e.source(...) | semmle.label | e.source(...) | -| main.rs:280:13:280:24 | e.source(...) | semmle.label | e.source(...) | -| main.rs:281:11:281:11 | s [C] | semmle.label | s [C] | -| main.rs:281:11:281:11 | s [C] | semmle.label | s [C] | -| main.rs:282:9:282:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:282:9:282:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | -| main.rs:282:35:282:35 | i | semmle.label | i | -| main.rs:282:35:282:35 | i | semmle.label | i | -| main.rs:282:47:282:47 | i | semmle.label | i | -| main.rs:282:47:282:47 | i | semmle.label | i | -| main.rs:303:26:303:26 | a | semmle.label | a | -| main.rs:303:26:303:26 | a | semmle.label | a | -| main.rs:304:24:304:24 | a | semmle.label | a | -| main.rs:304:24:304:24 | a | semmle.label | a | -| main.rs:306:24:308:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:306:24:308:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:307:18:307:18 | a | semmle.label | a | -| main.rs:307:18:307:18 | a | semmle.label | a | -| main.rs:311:18:311:18 | a | semmle.label | a | -| main.rs:311:18:311:18 | a | semmle.label | a | -| main.rs:313:24:313:24 | f | semmle.label | f | -| main.rs:313:24:313:24 | f | semmle.label | f | -| main.rs:315:24:317:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:315:24:317:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:316:18:316:18 | a | semmle.label | a | -| main.rs:316:18:316:18 | a | semmle.label | a | -| main.rs:319:31:331:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:319:31:331:9 | \|...\| ... | semmle.label | \|...\| ... | -| main.rs:319:31:331:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | -| main.rs:319:31:331:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | -| main.rs:320:19:320:19 | e [E, Some] | semmle.label | e [E, Some] | -| main.rs:320:19:320:19 | e [E, Some] | semmle.label | e [E, Some] | -| main.rs:323:17:323:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | -| main.rs:323:17:323:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | -| main.rs:323:43:323:43 | o [Some] | semmle.label | o [Some] | -| main.rs:323:43:323:43 | o [Some] | semmle.label | o [Some] | -| main.rs:325:27:325:27 | o [Some] | semmle.label | o [Some] | -| main.rs:325:27:325:27 | o [Some] | semmle.label | o [Some] | -| main.rs:326:25:326:31 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:326:25:326:31 | Some(...) [Some] | semmle.label | Some(...) [Some] | -| main.rs:326:30:326:30 | i | semmle.label | i | -| main.rs:326:30:326:30 | i | semmle.label | i | -| main.rs:326:41:326:41 | i | semmle.label | i | -| main.rs:326:41:326:41 | i | semmle.label | i | -| main.rs:346:21:346:29 | source(...) | semmle.label | source(...) | -| main.rs:346:21:346:29 | source(...) | semmle.label | source(...) | -| main.rs:347:19:347:19 | a | semmle.label | a | -| main.rs:347:19:347:19 | a | semmle.label | a | -| main.rs:350:17:350:17 | s | semmle.label | s | -| main.rs:350:17:350:17 | s | semmle.label | s | -| main.rs:350:21:350:29 | source(...) | semmle.label | source(...) | -| main.rs:350:21:350:29 | source(...) | semmle.label | source(...) | -| main.rs:351:13:351:55 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | -| main.rs:351:13:351:55 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | -| main.rs:351:39:351:53 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| main.rs:351:39:351:53 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | -| main.rs:351:52:351:52 | s | semmle.label | s | -| main.rs:351:52:351:52 | s | semmle.label | s | +| main.rs:269:19:269:19 | o [Some] | semmle.label | o [Some] | +| main.rs:269:19:269:19 | o [Some] | semmle.label | o [Some] | +| main.rs:270:17:270:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:270:17:270:23 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:270:22:270:22 | i | semmle.label | i | +| main.rs:270:22:270:22 | i | semmle.label | i | +| main.rs:270:33:270:33 | i | semmle.label | i | +| main.rs:270:33:270:33 | i | semmle.label | i | +| main.rs:279:9:279:9 | s [C] | semmle.label | s [C] | +| main.rs:279:9:279:9 | s [C] | semmle.label | s [C] | +| main.rs:279:13:279:24 | e.source(...) | semmle.label | e.source(...) | +| main.rs:279:13:279:24 | e.source(...) | semmle.label | e.source(...) | +| main.rs:280:11:280:11 | s [C] | semmle.label | s [C] | +| main.rs:280:11:280:11 | s [C] | semmle.label | s [C] | +| main.rs:281:9:281:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:281:9:281:37 | ...::C {...} [C] | semmle.label | ...::C {...} [C] | +| main.rs:281:35:281:35 | i | semmle.label | i | +| main.rs:281:35:281:35 | i | semmle.label | i | +| main.rs:281:47:281:47 | i | semmle.label | i | +| main.rs:281:47:281:47 | i | semmle.label | i | +| main.rs:302:26:302:26 | a | semmle.label | a | +| main.rs:302:26:302:26 | a | semmle.label | a | +| main.rs:303:24:303:24 | a | semmle.label | a | +| main.rs:303:24:303:24 | a | semmle.label | a | +| main.rs:305:24:307:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:305:24:307:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:306:18:306:18 | a | semmle.label | a | +| main.rs:306:18:306:18 | a | semmle.label | a | +| main.rs:310:18:310:18 | a | semmle.label | a | +| main.rs:310:18:310:18 | a | semmle.label | a | +| main.rs:312:24:312:24 | f | semmle.label | f | +| main.rs:312:24:312:24 | f | semmle.label | f | +| main.rs:314:24:316:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:314:24:316:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:315:18:315:18 | a | semmle.label | a | +| main.rs:315:18:315:18 | a | semmle.label | a | +| main.rs:318:31:329:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:318:31:329:9 | \|...\| ... | semmle.label | \|...\| ... | +| main.rs:318:31:329:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | +| main.rs:318:31:329:9 | \|...\| ... [E, Some] | semmle.label | \|...\| ... [E, Some] | +| main.rs:319:19:319:19 | e [E, Some] | semmle.label | e [E, Some] | +| main.rs:319:19:319:19 | e [E, Some] | semmle.label | e [E, Some] | +| main.rs:322:17:322:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:322:17:322:45 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:322:43:322:43 | o [Some] | semmle.label | o [Some] | +| main.rs:322:43:322:43 | o [Some] | semmle.label | o [Some] | +| main.rs:323:27:323:27 | o [Some] | semmle.label | o [Some] | +| main.rs:323:27:323:27 | o [Some] | semmle.label | o [Some] | +| main.rs:324:25:324:31 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:324:25:324:31 | Some(...) [Some] | semmle.label | Some(...) [Some] | +| main.rs:324:30:324:30 | i | semmle.label | i | +| main.rs:324:30:324:30 | i | semmle.label | i | +| main.rs:324:41:324:41 | i | semmle.label | i | +| main.rs:324:41:324:41 | i | semmle.label | i | +| main.rs:344:21:344:29 | source(...) | semmle.label | source(...) | +| main.rs:344:21:344:29 | source(...) | semmle.label | source(...) | +| main.rs:345:19:345:19 | a | semmle.label | a | +| main.rs:345:19:345:19 | a | semmle.label | a | +| main.rs:348:17:348:17 | s | semmle.label | s | +| main.rs:348:17:348:17 | s | semmle.label | s | +| main.rs:348:21:348:29 | source(...) | semmle.label | source(...) | +| main.rs:348:21:348:29 | source(...) | semmle.label | source(...) | +| main.rs:349:13:351:13 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:349:13:351:13 | ...::E {...} [E, Some] | semmle.label | ...::E {...} [E, Some] | +| main.rs:350:26:350:40 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| main.rs:350:26:350:40 | ...::Some(...) [Some] | semmle.label | ...::Some(...) [Some] | +| main.rs:350:39:350:39 | s | semmle.label | s | +| main.rs:350:39:350:39 | s | semmle.label | s | | main.rs:353:26:353:26 | b | semmle.label | b | | main.rs:353:26:353:26 | b | semmle.label | b | | main.rs:353:26:353:26 | b [E, Some] | semmle.label | b [E, Some] | @@ -742,66 +749,74 @@ nodes | main.rs:410:26:410:31 | ...: i64 | semmle.label | ...: i64 | | main.rs:411:14:411:14 | i | semmle.label | i | | main.rs:411:14:411:14 | i | semmle.label | i | -| main.rs:464:9:464:10 | x1 | semmle.label | x1 | -| main.rs:464:9:464:10 | x1 | semmle.label | x1 | -| main.rs:464:14:464:23 | source(...) | semmle.label | source(...) | -| main.rs:464:14:464:23 | source(...) | semmle.label | source(...) | -| main.rs:464:14:464:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:464:14:464:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:465:10:465:11 | x1 | semmle.label | x1 | -| main.rs:465:10:465:11 | x1 | semmle.label | x1 | -| main.rs:467:9:467:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:467:9:467:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | -| main.rs:467:14:474:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | -| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:467:15:470:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | -| main.rs:468:17:468:26 | source(...) | semmle.label | source(...) | -| main.rs:468:17:468:26 | source(...) | semmle.label | source(...) | -| main.rs:475:10:475:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:475:10:475:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | -| main.rs:475:10:475:18 | x2.field1 | semmle.label | x2.field1 | -| main.rs:475:10:475:18 | x2.field1 | semmle.label | x2.field1 | -| main.rs:480:9:480:10 | x4 | semmle.label | x4 | -| main.rs:480:9:480:10 | x4 | semmle.label | x4 | -| main.rs:480:14:480:23 | source(...) | semmle.label | source(...) | -| main.rs:480:14:480:23 | source(...) | semmle.label | source(...) | -| main.rs:480:14:480:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:480:14:480:30 | ... .max(...) | semmle.label | ... .max(...) | -| main.rs:481:10:481:11 | x4 | semmle.label | x4 | -| main.rs:481:10:481:11 | x4 | semmle.label | x4 | -| main.rs:483:9:483:10 | x5 | semmle.label | x5 | -| main.rs:483:14:483:23 | source(...) | semmle.label | source(...) | -| main.rs:483:14:483:30 | ... .lt(...) | semmle.label | ... .lt(...) | -| main.rs:484:10:484:11 | x5 | semmle.label | x5 | -| main.rs:486:9:486:10 | x6 | semmle.label | x6 | -| main.rs:486:14:486:23 | source(...) | semmle.label | source(...) | -| main.rs:486:14:486:27 | ... < ... | semmle.label | ... < ... | -| main.rs:487:10:487:11 | x6 | semmle.label | x6 | -| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:502:10:502:28 | generated_source(...) | semmle.label | generated_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | -| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | -| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | -| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | -| main.rs:505:20:505:28 | source(...) | semmle.label | source(...) | -| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | -| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | -| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | -| main.rs:507:25:507:33 | source(...) | semmle.label | source(...) | -| main.rs:508:10:508:37 | generated_summary(...) | semmle.label | generated_summary(...) | -| main.rs:508:10:508:37 | generated_summary(...) | semmle.label | generated_summary(...) | -| main.rs:508:28:508:36 | source(...) | semmle.label | source(...) | -| main.rs:508:28:508:36 | source(...) | semmle.label | source(...) | -| main.rs:510:10:510:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | -| main.rs:510:10:510:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | -| main.rs:510:33:510:41 | source(...) | semmle.label | source(...) | -| main.rs:510:33:510:41 | source(...) | semmle.label | source(...) | +| main.rs:475:9:475:10 | x1 | semmle.label | x1 | +| main.rs:475:9:475:10 | x1 | semmle.label | x1 | +| main.rs:475:14:475:23 | source(...) | semmle.label | source(...) | +| main.rs:475:14:475:23 | source(...) | semmle.label | source(...) | +| main.rs:475:14:475:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:475:14:475:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:476:10:476:11 | x1 | semmle.label | x1 | +| main.rs:476:10:476:11 | x1 | semmle.label | x1 | +| main.rs:478:9:478:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:478:9:478:10 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | semmle.label | ... .max(...) [MyStruct.field1] | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | semmle.label | MyStruct {...} [MyStruct.field1] | +| main.rs:479:17:479:26 | source(...) | semmle.label | source(...) | +| main.rs:479:17:479:26 | source(...) | semmle.label | source(...) | +| main.rs:486:10:486:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:486:10:486:11 | x2 [MyStruct.field1] | semmle.label | x2 [MyStruct.field1] | +| main.rs:486:10:486:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:486:10:486:18 | x2.field1 | semmle.label | x2.field1 | +| main.rs:491:9:491:10 | x4 | semmle.label | x4 | +| main.rs:491:9:491:10 | x4 | semmle.label | x4 | +| main.rs:491:14:491:23 | source(...) | semmle.label | source(...) | +| main.rs:491:14:491:23 | source(...) | semmle.label | source(...) | +| main.rs:491:14:491:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:491:14:491:30 | ... .max(...) | semmle.label | ... .max(...) | +| main.rs:492:10:492:11 | x4 | semmle.label | x4 | +| main.rs:492:10:492:11 | x4 | semmle.label | x4 | +| main.rs:494:9:494:10 | x5 | semmle.label | x5 | +| main.rs:494:14:494:23 | source(...) | semmle.label | source(...) | +| main.rs:494:14:494:30 | ... .lt(...) | semmle.label | ... .lt(...) | +| main.rs:495:10:495:11 | x5 | semmle.label | x5 | +| main.rs:497:9:497:10 | x6 | semmle.label | x6 | +| main.rs:497:14:497:23 | source(...) | semmle.label | source(...) | +| main.rs:497:14:497:27 | ... < ... | semmle.label | ... < ... | +| main.rs:498:10:498:11 | x6 | semmle.label | x6 | +| main.rs:503:9:503:10 | x8 | semmle.label | x8 | +| main.rs:503:9:503:10 | x8 | semmle.label | x8 | +| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | +| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | +| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | +| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | +| main.rs:504:10:504:11 | x8 | semmle.label | x8 | +| main.rs:504:10:504:11 | x8 | semmle.label | x8 | +| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | semmle.label | neutral_manual_source(...) | +| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | +| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | +| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | +| main.rs:522:20:522:28 | source(...) | semmle.label | source(...) | +| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | +| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | +| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | +| main.rs:524:25:524:33 | source(...) | semmle.label | source(...) | +| main.rs:525:10:525:37 | generated_summary(...) | semmle.label | generated_summary(...) | +| main.rs:525:10:525:37 | generated_summary(...) | semmle.label | generated_summary(...) | +| main.rs:525:28:525:36 | source(...) | semmle.label | source(...) | +| main.rs:525:28:525:36 | source(...) | semmle.label | source(...) | +| main.rs:527:10:527:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | +| main.rs:527:10:527:42 | neutral_manual_summary(...) | semmle.label | neutral_manual_summary(...) | +| main.rs:527:33:527:41 | source(...) | semmle.label | source(...) | +| main.rs:527:33:527:41 | source(...) | semmle.label | source(...) | subpaths | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | main.rs:214:13:214:24 | apply(...) | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | main.rs:214:13:214:24 | apply(...) | @@ -845,24 +860,24 @@ invalidSpecComponent | main.rs:233:10:233:10 | t | main.rs:231:13:231:22 | source(...) | main.rs:233:10:233:10 | t | $@ | main.rs:231:13:231:22 | source(...) | source(...) | | main.rs:260:47:260:47 | i | main.rs:257:13:257:27 | enum_source(...) | main.rs:260:47:260:47 | i | $@ | main.rs:257:13:257:27 | enum_source(...) | enum_source(...) | | main.rs:260:47:260:47 | i | main.rs:257:13:257:27 | enum_source(...) | main.rs:260:47:260:47 | i | $@ | main.rs:257:13:257:27 | enum_source(...) | enum_source(...) | -| main.rs:271:33:271:33 | i | main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:271:33:271:33 | i | $@ | main.rs:264:13:264:34 | enum_source_nested(...) | enum_source_nested(...) | -| main.rs:271:33:271:33 | i | main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:271:33:271:33 | i | $@ | main.rs:264:13:264:34 | enum_source_nested(...) | enum_source_nested(...) | -| main.rs:282:47:282:47 | i | main.rs:280:13:280:24 | e.source(...) | main.rs:282:47:282:47 | i | $@ | main.rs:280:13:280:24 | e.source(...) | e.source(...) | -| main.rs:282:47:282:47 | i | main.rs:280:13:280:24 | e.source(...) | main.rs:282:47:282:47 | i | $@ | main.rs:280:13:280:24 | e.source(...) | e.source(...) | -| main.rs:303:26:303:26 | a | main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | $@ | main.rs:304:24:304:24 | a | a | -| main.rs:303:26:303:26 | a | main.rs:304:24:304:24 | a | main.rs:303:26:303:26 | a | $@ | main.rs:304:24:304:24 | a | a | -| main.rs:307:18:307:18 | a | main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | $@ | main.rs:306:24:308:9 | \|...\| ... | \|...\| ... | -| main.rs:307:18:307:18 | a | main.rs:306:24:308:9 | \|...\| ... | main.rs:307:18:307:18 | a | $@ | main.rs:306:24:308:9 | \|...\| ... | \|...\| ... | -| main.rs:311:18:311:18 | a | main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | $@ | main.rs:313:24:313:24 | f | f | -| main.rs:311:18:311:18 | a | main.rs:313:24:313:24 | f | main.rs:311:18:311:18 | a | $@ | main.rs:313:24:313:24 | f | f | -| main.rs:316:18:316:18 | a | main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | $@ | main.rs:315:24:317:9 | \|...\| ... | \|...\| ... | -| main.rs:316:18:316:18 | a | main.rs:315:24:317:9 | \|...\| ... | main.rs:316:18:316:18 | a | $@ | main.rs:315:24:317:9 | \|...\| ... | \|...\| ... | -| main.rs:326:41:326:41 | i | main.rs:319:31:331:9 | \|...\| ... | main.rs:326:41:326:41 | i | $@ | main.rs:319:31:331:9 | \|...\| ... | \|...\| ... | -| main.rs:326:41:326:41 | i | main.rs:319:31:331:9 | \|...\| ... | main.rs:326:41:326:41 | i | $@ | main.rs:319:31:331:9 | \|...\| ... | \|...\| ... | -| main.rs:347:19:347:19 | a | main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | $@ | main.rs:346:21:346:29 | source(...) | source(...) | -| main.rs:347:19:347:19 | a | main.rs:346:21:346:29 | source(...) | main.rs:347:19:347:19 | a | $@ | main.rs:346:21:346:29 | source(...) | source(...) | -| main.rs:353:26:353:26 | b | main.rs:350:21:350:29 | source(...) | main.rs:353:26:353:26 | b | $@ | main.rs:350:21:350:29 | source(...) | source(...) | -| main.rs:353:26:353:26 | b | main.rs:350:21:350:29 | source(...) | main.rs:353:26:353:26 | b | $@ | main.rs:350:21:350:29 | source(...) | source(...) | +| main.rs:270:33:270:33 | i | main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:270:33:270:33 | i | $@ | main.rs:264:13:264:34 | enum_source_nested(...) | enum_source_nested(...) | +| main.rs:270:33:270:33 | i | main.rs:264:13:264:34 | enum_source_nested(...) | main.rs:270:33:270:33 | i | $@ | main.rs:264:13:264:34 | enum_source_nested(...) | enum_source_nested(...) | +| main.rs:281:47:281:47 | i | main.rs:279:13:279:24 | e.source(...) | main.rs:281:47:281:47 | i | $@ | main.rs:279:13:279:24 | e.source(...) | e.source(...) | +| main.rs:281:47:281:47 | i | main.rs:279:13:279:24 | e.source(...) | main.rs:281:47:281:47 | i | $@ | main.rs:279:13:279:24 | e.source(...) | e.source(...) | +| main.rs:302:26:302:26 | a | main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | $@ | main.rs:303:24:303:24 | a | a | +| main.rs:302:26:302:26 | a | main.rs:303:24:303:24 | a | main.rs:302:26:302:26 | a | $@ | main.rs:303:24:303:24 | a | a | +| main.rs:306:18:306:18 | a | main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | $@ | main.rs:305:24:307:9 | \|...\| ... | \|...\| ... | +| main.rs:306:18:306:18 | a | main.rs:305:24:307:9 | \|...\| ... | main.rs:306:18:306:18 | a | $@ | main.rs:305:24:307:9 | \|...\| ... | \|...\| ... | +| main.rs:310:18:310:18 | a | main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | $@ | main.rs:312:24:312:24 | f | f | +| main.rs:310:18:310:18 | a | main.rs:312:24:312:24 | f | main.rs:310:18:310:18 | a | $@ | main.rs:312:24:312:24 | f | f | +| main.rs:315:18:315:18 | a | main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | $@ | main.rs:314:24:316:9 | \|...\| ... | \|...\| ... | +| main.rs:315:18:315:18 | a | main.rs:314:24:316:9 | \|...\| ... | main.rs:315:18:315:18 | a | $@ | main.rs:314:24:316:9 | \|...\| ... | \|...\| ... | +| main.rs:324:41:324:41 | i | main.rs:318:31:329:9 | \|...\| ... | main.rs:324:41:324:41 | i | $@ | main.rs:318:31:329:9 | \|...\| ... | \|...\| ... | +| main.rs:324:41:324:41 | i | main.rs:318:31:329:9 | \|...\| ... | main.rs:324:41:324:41 | i | $@ | main.rs:318:31:329:9 | \|...\| ... | \|...\| ... | +| main.rs:345:19:345:19 | a | main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | $@ | main.rs:344:21:344:29 | source(...) | source(...) | +| main.rs:345:19:345:19 | a | main.rs:344:21:344:29 | source(...) | main.rs:345:19:345:19 | a | $@ | main.rs:344:21:344:29 | source(...) | source(...) | +| main.rs:353:26:353:26 | b | main.rs:348:21:348:29 | source(...) | main.rs:353:26:353:26 | b | $@ | main.rs:348:21:348:29 | source(...) | source(...) | +| main.rs:353:26:353:26 | b | main.rs:348:21:348:29 | source(...) | main.rs:353:26:353:26 | b | $@ | main.rs:348:21:348:29 | source(...) | source(...) | | main.rs:365:15:365:43 | ...::C {...} | main.rs:364:13:364:22 | source(...) | main.rs:365:15:365:43 | ...::C {...} | $@ | main.rs:364:13:364:22 | source(...) | source(...) | | main.rs:365:15:365:43 | ...::C {...} | main.rs:364:13:364:22 | source(...) | main.rs:365:15:365:43 | ...::C {...} | $@ | main.rs:364:13:364:22 | source(...) | source(...) | | main.rs:368:22:368:56 | ...::E {...} | main.rs:364:13:364:22 | source(...) | main.rs:368:22:368:56 | ...::E {...} | $@ | main.rs:364:13:364:22 | source(...) | source(...) | @@ -877,23 +892,25 @@ invalidSpecComponent | main.rs:401:10:401:10 | i | main.rs:400:16:400:16 | i | main.rs:401:10:401:10 | i | $@ | main.rs:400:16:400:16 | i | i | | main.rs:411:14:411:14 | i | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | $@ | main.rs:410:26:410:31 | ...: i64 | ...: i64 | | main.rs:411:14:411:14 | i | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | $@ | main.rs:410:26:410:31 | ...: i64 | ...: i64 | -| main.rs:465:10:465:11 | x1 | main.rs:464:14:464:23 | source(...) | main.rs:465:10:465:11 | x1 | $@ | main.rs:464:14:464:23 | source(...) | source(...) | -| main.rs:465:10:465:11 | x1 | main.rs:464:14:464:23 | source(...) | main.rs:465:10:465:11 | x1 | $@ | main.rs:464:14:464:23 | source(...) | source(...) | -| main.rs:475:10:475:18 | x2.field1 | main.rs:468:17:468:26 | source(...) | main.rs:475:10:475:18 | x2.field1 | $@ | main.rs:468:17:468:26 | source(...) | source(...) | -| main.rs:475:10:475:18 | x2.field1 | main.rs:468:17:468:26 | source(...) | main.rs:475:10:475:18 | x2.field1 | $@ | main.rs:468:17:468:26 | source(...) | source(...) | -| main.rs:481:10:481:11 | x4 | main.rs:480:14:480:23 | source(...) | main.rs:481:10:481:11 | x4 | $@ | main.rs:480:14:480:23 | source(...) | source(...) | -| main.rs:481:10:481:11 | x4 | main.rs:480:14:480:23 | source(...) | main.rs:481:10:481:11 | x4 | $@ | main.rs:480:14:480:23 | source(...) | source(...) | -| main.rs:484:10:484:11 | x5 | main.rs:483:14:483:23 | source(...) | main.rs:484:10:484:11 | x5 | $@ | main.rs:483:14:483:23 | source(...) | source(...) | -| main.rs:487:10:487:11 | x6 | main.rs:486:14:486:23 | source(...) | main.rs:487:10:487:11 | x6 | $@ | main.rs:486:14:486:23 | source(...) | source(...) | -| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | $@ | main.rs:502:10:502:28 | generated_source(...) | generated_source(...) | -| main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | main.rs:502:10:502:28 | generated_source(...) | $@ | main.rs:502:10:502:28 | generated_source(...) | generated_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | $@ | main.rs:504:10:504:33 | neutral_manual_source(...) | neutral_manual_source(...) | -| main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | main.rs:504:10:504:33 | neutral_manual_source(...) | $@ | main.rs:504:10:504:33 | neutral_manual_source(...) | neutral_manual_source(...) | -| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | $@ | main.rs:505:20:505:28 | source(...) | source(...) | -| main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | main.rs:505:20:505:28 | source(...) | $@ | main.rs:505:20:505:28 | source(...) | source(...) | -| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | $@ | main.rs:507:25:507:33 | source(...) | source(...) | -| main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | main.rs:507:25:507:33 | source(...) | $@ | main.rs:507:25:507:33 | source(...) | source(...) | -| main.rs:508:10:508:37 | generated_summary(...) | main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | $@ | main.rs:508:28:508:36 | source(...) | source(...) | -| main.rs:508:10:508:37 | generated_summary(...) | main.rs:508:28:508:36 | source(...) | main.rs:508:10:508:37 | generated_summary(...) | $@ | main.rs:508:28:508:36 | source(...) | source(...) | -| main.rs:510:10:510:42 | neutral_manual_summary(...) | main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | $@ | main.rs:510:33:510:41 | source(...) | source(...) | -| main.rs:510:10:510:42 | neutral_manual_summary(...) | main.rs:510:33:510:41 | source(...) | main.rs:510:10:510:42 | neutral_manual_summary(...) | $@ | main.rs:510:33:510:41 | source(...) | source(...) | +| main.rs:476:10:476:11 | x1 | main.rs:475:14:475:23 | source(...) | main.rs:476:10:476:11 | x1 | $@ | main.rs:475:14:475:23 | source(...) | source(...) | +| main.rs:476:10:476:11 | x1 | main.rs:475:14:475:23 | source(...) | main.rs:476:10:476:11 | x1 | $@ | main.rs:475:14:475:23 | source(...) | source(...) | +| main.rs:486:10:486:18 | x2.field1 | main.rs:479:17:479:26 | source(...) | main.rs:486:10:486:18 | x2.field1 | $@ | main.rs:479:17:479:26 | source(...) | source(...) | +| main.rs:486:10:486:18 | x2.field1 | main.rs:479:17:479:26 | source(...) | main.rs:486:10:486:18 | x2.field1 | $@ | main.rs:479:17:479:26 | source(...) | source(...) | +| main.rs:492:10:492:11 | x4 | main.rs:491:14:491:23 | source(...) | main.rs:492:10:492:11 | x4 | $@ | main.rs:491:14:491:23 | source(...) | source(...) | +| main.rs:492:10:492:11 | x4 | main.rs:491:14:491:23 | source(...) | main.rs:492:10:492:11 | x4 | $@ | main.rs:491:14:491:23 | source(...) | source(...) | +| main.rs:495:10:495:11 | x5 | main.rs:494:14:494:23 | source(...) | main.rs:495:10:495:11 | x5 | $@ | main.rs:494:14:494:23 | source(...) | source(...) | +| main.rs:498:10:498:11 | x6 | main.rs:497:14:497:23 | source(...) | main.rs:498:10:498:11 | x6 | $@ | main.rs:497:14:497:23 | source(...) | source(...) | +| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | +| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | +| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | +| main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | $@ | main.rs:521:10:521:33 | neutral_manual_source(...) | neutral_manual_source(...) | +| main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | $@ | main.rs:521:10:521:33 | neutral_manual_source(...) | neutral_manual_source(...) | +| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | $@ | main.rs:522:20:522:28 | source(...) | source(...) | +| main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | $@ | main.rs:522:20:522:28 | source(...) | source(...) | +| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | $@ | main.rs:524:25:524:33 | source(...) | source(...) | +| main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | $@ | main.rs:524:25:524:33 | source(...) | source(...) | +| main.rs:525:10:525:37 | generated_summary(...) | main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | $@ | main.rs:525:28:525:36 | source(...) | source(...) | +| main.rs:525:10:525:37 | generated_summary(...) | main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | $@ | main.rs:525:28:525:36 | source(...) | source(...) | +| main.rs:527:10:527:42 | neutral_manual_summary(...) | main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | $@ | main.rs:527:33:527:41 | source(...) | source(...) | +| main.rs:527:10:527:42 | neutral_manual_summary(...) | main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | $@ | main.rs:527:33:527:41 | source(...) | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index 38624e1fc198..1d5b0a506b7a 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -54,6 +54,8 @@ extensions: - ["main::external_file::generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] - ["main::external_file::neutral_generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] - ["main::external_file::neutral_manual_summary", "Argument[0]", "ReturnValue", "value", "manual"] + - ["main::external_file::MyTrait2::flow_through2", "Argument[0]", "ReturnValue", "value", "manual"] + - ["<_ as main::MyTrait3>::flow_through3", "Argument[0]", "ReturnValue", "value", "manual"] - addsTo: pack: codeql/rust-all extensible: neutralModel From b12b1d0867a56e7b2b2ad043635311582ba3c426 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 24 Aug 2026 09:54:38 +0200 Subject: [PATCH 101/181] Rust: Canonical paths for blanket implementations --- .../codeql/rust/internal/PathResolution.qll | 14 +- .../canonical_path/canonical_paths.expected | 2 + .../library-tests/dataflow/models/main.rs | 2 +- .../dataflow/models/models.expected | 161 ++++++++++-------- 4 files changed, 104 insertions(+), 75 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index dc061eab4e30..9af7f6abad45 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -874,7 +874,12 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl { */ predicate isBlanketImplementation() { exists(this.getBlanketImplementationTypeParam()) } - override predicate hasCanonicalPath(Crate c) { this.resolveSelfTy().hasCanonicalPathPrefix(c) } + override predicate hasCanonicalPath(Crate c) { + this.resolveSelfTy().hasCanonicalPathPrefix(c) + or + this.isBlanketImplementation() and + c.getASourceFile().getFile() = this.getFile() + } /** * Holds if `(c1, c2)` forms a pair of crates for the type and trait @@ -920,7 +925,12 @@ final class ImplItemNode extends ImplOrTraitItemNode instanceof Impl { result = "<" or i = 1 and - result = this.getSelfCanonicalPath(c) + ( + result = this.getSelfCanonicalPath(c) + or + this.isBlanketImplementation() and + result = "_" + ) or if exists(this.getTraitPath()) then diff --git a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected index 7077a475647b..b93f75b3ad70 100644 --- a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected +++ b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected @@ -15,6 +15,8 @@ | regular.rs:13:5:13:18 | fn g | ::g | | regular.rs:16:1:18:1 | trait TraitWithBlanketImpl | test::regular::TraitWithBlanketImpl | | regular.rs:17:5:17:16 | fn h | test::regular::TraitWithBlanketImpl::h | +| regular.rs:20:1:22:1 | impl TraitWithBlanketImpl for T { ... } | <_ as test::regular::TraitWithBlanketImpl> | +| regular.rs:21:5:21:18 | fn h | <_ as test::regular::TraitWithBlanketImpl>::h | | regular.rs:24:1:24:12 | fn free | test::regular::free | | regular.rs:26:1:32:1 | fn usage | test::regular::usage | | regular.rs:34:1:38:1 | enum MyEnum | test::regular::MyEnum | diff --git a/rust/ql/test/library-tests/dataflow/models/main.rs b/rust/ql/test/library-tests/dataflow/models/main.rs index 77db4621e711..d7ca16d2b1f5 100644 --- a/rust/ql/test/library-tests/dataflow/models/main.rs +++ b/rust/ql/test/library-tests/dataflow/models/main.rs @@ -504,7 +504,7 @@ fn test_trait_model(x: T) { sink(x8); // $ hasValueFlow=29 let x9 = <()>::flow_through3(source(30)); - sink(x9); // $ MISSING: hasValueFlow=30 + sink(x9); // $ hasValueFlow=30 } mod external_file; diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 9fec16cfafa2..e33d40856ce5 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -17,27 +17,28 @@ models | 16 | Source: main::simple_source; ReturnValue; test-source | | 17 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | | 18 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | -| 19 | Summary: core::cmp::Ord::max; Argument[self,0]; ReturnValue; value | -| 20 | Summary: core::cmp::PartialOrd::lt; Argument[self].Reference; ReturnValue; taint | -| 21 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 22 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | -| 23 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | -| 24 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 25 | Summary: main::external_file::MyTrait2::flow_through2; Argument[0]; ReturnValue; value | -| 26 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 27 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 28 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 29 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 30 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 31 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 32 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 33 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 34 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 35 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 36 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 37 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 38 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 39 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 19 | Summary: <_ as main::MyTrait3>::flow_through3; Argument[0]; ReturnValue; value | +| 20 | Summary: core::cmp::Ord::max; Argument[self,0]; ReturnValue; value | +| 21 | Summary: core::cmp::PartialOrd::lt; Argument[self].Reference; ReturnValue; taint | +| 22 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 23 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | +| 24 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | +| 25 | Summary: main::coerce; Argument[0]; ReturnValue; taint | +| 26 | Summary: main::external_file::MyTrait2::flow_through2; Argument[0]; ReturnValue; value | +| 27 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 28 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 29 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 30 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 31 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 32 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 33 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 34 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 35 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 36 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 37 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 38 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 39 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 40 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -47,13 +48,13 @@ edges | main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | QL | | main.rs:25:9:25:9 | s | main.rs:26:17:26:17 | s | provenance | | | main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | s | provenance | | -| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:24 | +| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:25 | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -64,8 +65,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -74,8 +75,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -92,8 +93,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -102,8 +103,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -120,8 +121,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -130,16 +131,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -150,10 +151,10 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | -| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:21 | -| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:21 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | +| main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | | main.rs:175:13:175:22 | source(...) | main.rs:175:9:175:9 | s | provenance | | @@ -164,8 +165,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -174,8 +175,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -184,8 +185,8 @@ edges | main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:22 | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:22 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:23 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:23 | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | | @@ -194,14 +195,14 @@ edges | main.rs:214:9:214:9 | t | main.rs:215:10:215:10 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:22 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:22 | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:23 | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:23 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:22 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:22 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:24 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:24 | | main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:23 | | main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:23 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:24 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:24 | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:13:219:22 | source(...) | main.rs:219:9:219:9 | s | provenance | | @@ -212,10 +213,10 @@ edges | main.rs:221:9:221:9 | t | main.rs:222:10:222:10 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:22 | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:22 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:22 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:22 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:23 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:23 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:23 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:23 | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:13:231:22 | source(...) | main.rs:231:9:231:9 | s | provenance | | @@ -226,8 +227,8 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | @@ -342,38 +343,44 @@ edges | main.rs:410:26:410:31 | ...: i64 | main.rs:411:14:411:14 | i | provenance | Src:MaD:10 | | main.rs:475:9:475:10 | x1 | main.rs:476:10:476:11 | x1 | provenance | | | main.rs:475:9:475:10 | x1 | main.rs:476:10:476:11 | x1 | provenance | | -| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:20 | +| main.rs:475:14:475:23 | source(...) | main.rs:475:14:475:30 | ... .max(...) | provenance | MaD:20 | | main.rs:475:14:475:30 | ... .max(...) | main.rs:475:9:475:10 | x1 | provenance | | | main.rs:475:14:475:30 | ... .max(...) | main.rs:475:9:475:10 | x1 | provenance | | | main.rs:478:9:478:10 | x2 [MyStruct.field1] | main.rs:486:10:486:11 | x2 [MyStruct.field1] | provenance | | | main.rs:478:9:478:10 | x2 [MyStruct.field1] | main.rs:486:10:486:11 | x2 [MyStruct.field1] | provenance | | | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | main.rs:478:9:478:10 | x2 [MyStruct.field1] | provenance | | | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | main.rs:478:9:478:10 | x2 [MyStruct.field1] | provenance | | -| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | -| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:19 | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:20 | +| main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | main.rs:478:14:485:6 | ... .max(...) [MyStruct.field1] | provenance | MaD:20 | | main.rs:479:17:479:26 | source(...) | main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:479:17:479:26 | source(...) | main.rs:478:15:481:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:486:10:486:11 | x2 [MyStruct.field1] | main.rs:486:10:486:18 | x2.field1 | provenance | | | main.rs:486:10:486:11 | x2 [MyStruct.field1] | main.rs:486:10:486:18 | x2.field1 | provenance | | | main.rs:491:9:491:10 | x4 | main.rs:492:10:492:11 | x4 | provenance | | | main.rs:491:9:491:10 | x4 | main.rs:492:10:492:11 | x4 | provenance | | -| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:19 | -| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:19 | +| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:20 | +| main.rs:491:14:491:23 | source(...) | main.rs:491:14:491:30 | ... .max(...) | provenance | MaD:20 | | main.rs:491:14:491:30 | ... .max(...) | main.rs:491:9:491:10 | x4 | provenance | | | main.rs:491:14:491:30 | ... .max(...) | main.rs:491:9:491:10 | x4 | provenance | | | main.rs:494:9:494:10 | x5 | main.rs:495:10:495:11 | x5 | provenance | | -| main.rs:494:14:494:23 | source(...) | main.rs:494:14:494:30 | ... .lt(...) | provenance | MaD:20 | +| main.rs:494:14:494:23 | source(...) | main.rs:494:14:494:30 | ... .lt(...) | provenance | MaD:21 | | main.rs:494:14:494:30 | ... .lt(...) | main.rs:494:9:494:10 | x5 | provenance | | | main.rs:497:9:497:10 | x6 | main.rs:498:10:498:11 | x6 | provenance | | -| main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:20 | +| main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:21 | | main.rs:497:14:497:27 | ... < ... | main.rs:497:9:497:10 | x6 | provenance | | | main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | | main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | | main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | | main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | -| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:25 | -| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:25 | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:26 | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:26 | +| main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | +| main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | +| main.rs:506:14:506:44 | ...::flow_through3(...) | main.rs:506:9:506:10 | x9 | provenance | | +| main.rs:506:14:506:44 | ...::flow_through3(...) | main.rs:506:9:506:10 | x9 | provenance | | +| main.rs:506:34:506:43 | source(...) | main.rs:506:14:506:44 | ...::flow_through3(...) | provenance | MaD:19 | +| main.rs:506:34:506:43 | source(...) | main.rs:506:14:506:44 | ...::flow_through3(...) | provenance | MaD:19 | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | provenance | Src:MaD:14 | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | provenance | Src:MaD:14 | | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | provenance | Src:MaD:15 | @@ -382,10 +389,10 @@ edges | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -793,6 +800,14 @@ nodes | main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | | main.rs:504:10:504:11 | x8 | semmle.label | x8 | | main.rs:504:10:504:11 | x8 | semmle.label | x8 | +| main.rs:506:9:506:10 | x9 | semmle.label | x9 | +| main.rs:506:9:506:10 | x9 | semmle.label | x9 | +| main.rs:506:14:506:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | +| main.rs:506:14:506:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | +| main.rs:506:34:506:43 | source(...) | semmle.label | source(...) | +| main.rs:506:34:506:43 | source(...) | semmle.label | source(...) | +| main.rs:507:10:507:11 | x9 | semmle.label | x9 | +| main.rs:507:10:507:11 | x9 | semmle.label | x9 | | main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | | main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | | main.rs:519:10:519:28 | generated_source(...) | semmle.label | generated_source(...) | @@ -902,6 +917,8 @@ invalidSpecComponent | main.rs:498:10:498:11 | x6 | main.rs:497:14:497:23 | source(...) | main.rs:498:10:498:11 | x6 | $@ | main.rs:497:14:497:23 | source(...) | source(...) | | main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | | main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | +| main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | +| main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | main.rs:521:10:521:33 | neutral_manual_source(...) | $@ | main.rs:521:10:521:33 | neutral_manual_source(...) | neutral_manual_source(...) | From 736b1100608c93f4d11492a14984cf20b390f2ea Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Mon, 24 Aug 2026 10:17:03 +0200 Subject: [PATCH 102/181] Ruby: Add change note. --- ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md diff --git a/ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md b/ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md new file mode 100644 index 000000000000..a428124f0a77 --- /dev/null +++ b/ruby/ql/lib/change-notes/2026-08-24-cfg-swap.md @@ -0,0 +1,14 @@ +--- +category: breaking +--- +* The Ruby control flow graph implementation has been completely replaced. This + affects a number of queries slightly. The CFG now includes additional nodes + to more accurately represent certain constructs. This also means that any + existing code that implicitly relies on very specific details about the CFG + may need to be updated. The CFG no longer uses splitting, which means that + AST nodes now have a unique CFG node representation. In particular, + `ControlFlowNode.getAstNode` has changed its meaning. The AST-to-CFG mapping + remains one-to-many, but now for a different reason. It used to be because of + splitting, but now it's because of additional "helper" CFG nodes. To get the + (now canonical) CFG node for a given AST node, use + `Stmt.getControlFlowNode()` instead. From ea600a97d0e414f901666733dd40009b5d0e21de Mon Sep 17 00:00:00 2001 From: Asger F Date: Mon, 24 Aug 2026 10:46:54 +0200 Subject: [PATCH 103/181] unified: Add test for enums I thought there was a bug here, but it turns out this works as intended. Makes sense to keep the test though. --- .../test/library-tests/static-name-binding/test.swift | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/unified/ql/test/library-tests/static-name-binding/test.swift b/unified/ql/test/library-tests/static-name-binding/test.swift index 27453ec34351..64a385ef29b4 100644 --- a/unified/ql/test/library-tests/static-name-binding/test.swift +++ b/unified/ql/test/library-tests/static-name-binding/test.swift @@ -51,3 +51,14 @@ class H { let x2: G.B = nil; // $ access=G access=A.B let x3: G.B.C = nil; // $ access=G access=A.B access=A.B.C } + +enum I { + case one=1, two=2 + case three=3 +} + +func useI() { + I.one // $ access=I access=I.one + I.two // $ access=I access=I.two + I.three // $ access=I access=I.three +} From 6d91ebe43fbd3c6b7b8d5bbe0ded5dd28eb88896 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 24 Aug 2026 12:26:42 +0100 Subject: [PATCH 104/181] C++: Simplify 'getSourceDataFlowNode' for parameters. --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 13 +- .../dataflow/external-models/flow.expected | 294 ++++++++++-------- .../dataflow/external-models/flow.ext.yml | 5 + .../dataflow/external-models/sinks.expected | 8 + .../dataflow/external-models/test.cpp | 15 +- 5 files changed, 202 insertions(+), 133 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index fc3e7172c6fc..0eba3d5fc181 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -247,6 +247,14 @@ private module Input2 implements Impl::Private::InputSig2 { r.getKind() = rk } + pragma[nomagic] + private predicate hasParameterAndIndirectionIndex( + Parameter p, int indirectionIndex, ParameterNode n + ) { + n.getParameter() = p and + n.getIndirectionIndex() = indirectionIndex + } + bindingset[e, sc] Node getSourceDataFlowNode(SourceSinkReportingElement e, Impl::Private::SummaryComponent sc) { exists(DataFlowCall call | @@ -272,10 +280,9 @@ private module Input2 implements Impl::Private::InputSig2 { ) ) or - exists(ParameterPosition pos, ParameterNode p | + exists(ParameterPosition pos | sc = Impl::Private::SummaryComponent::parameter(pos) and - p.isParameterOf(e.getEnclosingCallable(), pos) and - result = p + hasParameterAndIndirectionIndex(e, pos.getIndirectionIndex(), result) ) or exists(Function f, ReturnKind rk | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected index 1494ef1264fb..b6f5f4a4452f 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.expected @@ -40,108 +40,113 @@ models | 39 | Source: ; ; false; source_from_callback_return_template; ; ; Argument[0].ReturnValue; local; manual | | 40 | Source: ; ; false; source_from_callback_template; ; ; Argument[0].Parameter[*0].Field[SourceWrapper::value]; local; manual | | 41 | Source: ; ; false; source_ptr_from_callback_return_ptr; ; ; Argument[0].ReturnValue[*]; local; manual | -| 42 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | -| 43 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | -| 44 | Source: ; ; false; ymlSourcePtr; ; ; ReturnValue[*]; local; manual | -| 45 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | -| 46 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | -| 47 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | -| 48 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | -| 49 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | -| 50 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | -| 51 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | -| 52 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 53 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 54 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | -| 55 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 56 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | -| 57 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 58 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 59 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 60 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 61 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | -| 62 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 63 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 64 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 65 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | -| 66 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 67 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | -| 68 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 69 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | -| 70 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 71 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | -| 72 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | -| 73 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | -| 74 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | -| 75 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | -| 76 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | -| 77 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | -| 78 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | -| 79 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | -| 80 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | -| 81 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | -| 82 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 83 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | -| 84 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | -| 85 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | -| 86 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | -| 87 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | -| 88 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 89 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | -| 90 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | -| 91 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | -| 92 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | +| 42 | Source: ; ; false; test_parameter; ; ; Parameter[*0].Field[*SourceWrapper::pointer]; local; manual | +| 43 | Source: ; ; false; test_parameter; ; ; Parameter[*0].Field[SourceWrapper::value]; local; manual | +| 44 | Source: ; ; false; test_parameter; ; ; Parameter[*2]; local; manual | +| 45 | Source: ; ; false; test_parameter; ; ; Parameter[1].Field[*SourceWrapper::pointer]; local; manual | +| 46 | Source: ; ; false; test_parameter; ; ; Parameter[1].Field[SourceWrapper::value]; local; manual | +| 47 | Source: ; ; false; ymlFieldSource; ; ; ReturnValue.Field[SourceWrapper::value]; local; manual | +| 48 | Source: ; ; false; ymlSource; ; ; ReturnValue; local; manual | +| 49 | Source: ; ; false; ymlSourcePtr; ; ; ReturnValue[*]; local; manual | +| 50 | Source: Azure::Core::Http; RawResponse; true; ExtractBodyStream; ; ; ReturnValue[*]; remote; manual | +| 51 | Source: Azure::Core::Http; RawResponse; true; GetBody; ; ; ReturnValue[*]; remote; manual | +| 52 | Source: Azure::Core::Http; RawResponse; true; GetHeaders; ; ; ReturnValue[*]; remote; manual | +| 53 | Source: Azure::Core::Http; Request; true; GetBodyStream; ; ; ReturnValue[*]; remote; manual | +| 54 | Source: Azure::Core::Http; Request; true; GetHeader; ; ; ReturnValue; remote; manual | +| 55 | Source: Azure::Core::Http; Request; true; GetHeaders; ; ; ReturnValue; remote; manual | +| 56 | Source: boost::asio; ; false; read_until; ; ; Argument[*1]; remote; manual | +| 57 | Summary: ; ; false; CLSIDFromProgID; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 58 | Summary: ; ; false; CLSIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 59 | Summary: ; ; false; CommandLineToArgvA; ; ; Argument[*0]; ReturnValue[**]; taint; manual | +| 60 | Summary: ; ; false; CreateRemoteThread; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 61 | Summary: ; ; false; CreateRemoteThreadEx; ; ; Argument[@4]; Argument[3].Parameter[@0]; value; manual | +| 62 | Summary: ; ; false; CreateThread; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 63 | Summary: ; ; false; GUIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 64 | Summary: ; ; false; IIDFromString; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 65 | Summary: ; ; false; ProgIDFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 66 | Summary: ; ; false; ReadFileEx; ; ; Argument[*3].Field[@hEvent]; Argument[4].Parameter[*2].Field[@hEvent]; value; manual | +| 67 | Summary: ; ; false; RtlCopyDeviceMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 68 | Summary: ; ; false; RtlCopyMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 69 | Summary: ; ; false; RtlCopyMemoryNonTemporal; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 70 | Summary: ; ; false; RtlCopyUnicodeString; ; ; Argument[*1].Field[*Buffer]; Argument[*0].Field[*Buffer]; value; manual | +| 71 | Summary: ; ; false; RtlCopyVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 72 | Summary: ; ; false; RtlInitUnicodeString; ; ; Argument[*1]; Argument[*0].Field[*Buffer]; value; manual | +| 73 | Summary: ; ; false; RtlMoveMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 74 | Summary: ; ; false; RtlMoveVolatileMemory; ; ; Argument[*@1]; Argument[*@0]; value; manual | +| 75 | Summary: ; ; false; StringFromCLSID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 76 | Summary: ; ; false; StringFromGUID2; ; ; Argument[*0]; Argument[*1]; taint; manual | +| 77 | Summary: ; ; false; StringFromIID; ; ; Argument[*0]; Argument[**1]; taint; manual | +| 78 | Summary: ; ; false; WinHttpCrackUrl; ; ; Argument[*0]; Argument[*3]; taint; manual | +| 79 | Summary: ; ; false; callWithArgument; ; ; Argument[1]; Argument[0].Parameter[0]; value; manual | +| 80 | Summary: ; ; false; callWithNonTypeTemplate; (const T &); ; Argument[*0]; ReturnValue; value; manual | +| 81 | Summary: ; ; false; pthread_create; ; ; Argument[@3]; Argument[2].Parameter[@0]; value; manual | +| 82 | Summary: ; ; false; read_field_from_struct; ; ; Argument[*0].Field[MyNamespace::MyStructInNamespace::myField]; ReturnValue; value; manual | +| 83 | Summary: ; ; false; read_field_from_struct_2; ; ; Argument[*0].Field[MyGlobalStruct::myField]; ReturnValue; value; manual | +| 84 | Summary: ; ; false; ymlStepGenerated; ; ; Argument[0]; ReturnValue; taint; df-generated | +| 85 | Summary: ; ; false; ymlStepManual; ; ; Argument[0]; ReturnValue; taint; manual | +| 86 | Summary: ; ; false; ymlStepManual_with_body; ; ; Argument[0]; ReturnValue; taint; manual | +| 87 | Summary: ; MyString; true; operator[]; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 88 | Summary: ; MyString; true; operator[]; ; ; ReturnValue[*]; Argument[-1]; taint; manual | +| 89 | Summary: ; ReverseFlow; true; get_ptr; ; ; ReturnValue[*]; Argument[-1].Field[ReverseFlow::value]; value; manual | +| 90 | Summary: ; TemplateClass1; true; templateFunction2; (U,V); ; Argument[1]; ReturnValue; value; manual | +| 91 | Summary: ; TemplateClass1; false; templateFunction; (T,U); ; Argument[0]; ReturnValue; value; manual | +| 92 | Summary: ; TemplateClass2; true; function; (U,T); ; Argument[1]; ReturnValue; value; manual | +| 93 | Summary: Azure::Core::IO; BodyStream; true; Read; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 94 | Summary: Azure::Core::IO; BodyStream; true; ReadToCount; ; ; Argument[-1]; Argument[*0]; taint; manual | +| 95 | Summary: Azure::Core::IO; BodyStream; true; ReadToEnd; ; ; Argument[-1]; ReturnValue.Element; taint; manual | +| 96 | Summary: Azure; Nullable; true; Value; ; ; Argument[-1]; ReturnValue[*]; taint; manual | +| 97 | Summary: boost::asio; ; false; buffer; ; ; Argument[*0]; ReturnValue; taint; manual | edges -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:51 | -| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:51 Sink:MaD:4 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:91:7:91:17 | recv_buffer | provenance | Src:MaD:56 | +| asio_streams.cpp:87:34:87:44 | read_until output argument | asio_streams.cpp:93:29:93:39 | recv_buffer | provenance | Src:MaD:56 Sink:MaD:4 | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:98:7:98:14 | send_str | provenance | TaintFunction | | asio_streams.cpp:97:37:97:44 | call to source | asio_streams.cpp:100:64:100:71 | *send_str | provenance | TaintFunction | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:101:7:101:17 | send_buffer | provenance | | | asio_streams.cpp:100:44:100:62 | call to buffer | asio_streams.cpp:103:29:103:39 | send_buffer | provenance | Sink:MaD:4 | -| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:92 | +| asio_streams.cpp:100:64:100:71 | *send_str | asio_streams.cpp:100:44:100:62 | call to buffer | provenance | MaD:97 | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:257:5:257:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:262:5:262:8 | *resp | provenance | | | azure.cpp:253:48:253:60 | *call to GetBodyStream | azure.cpp:266:38:266:41 | *resp | provenance | | -| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:48 | -| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:88 | +| azure.cpp:253:48:253:60 | call to GetBodyStream | azure.cpp:253:48:253:60 | *call to GetBodyStream | provenance | Src:MaD:53 | +| azure.cpp:257:5:257:8 | *resp | azure.cpp:257:16:257:21 | Read output argument | provenance | MaD:93 | | azure.cpp:257:16:257:21 | Read output argument | azure.cpp:258:10:258:16 | * ... | provenance | | -| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:89 | +| azure.cpp:262:5:262:8 | *resp | azure.cpp:262:23:262:28 | ReadToCount output argument | provenance | MaD:94 | | azure.cpp:262:23:262:28 | ReadToCount output argument | azure.cpp:263:10:263:16 | * ... | provenance | | -| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:90 | +| azure.cpp:266:38:266:41 | *resp | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | MaD:95 | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | provenance | | | azure.cpp:266:44:266:52 | call to ReadToEnd [element] | azure.cpp:267:10:267:12 | vec [element] | provenance | | | azure.cpp:267:10:267:12 | vec [element] | azure.cpp:267:10:267:12 | vec | provenance | | -| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:47 | +| azure.cpp:273:52:273:61 | call to GetHeaders | azure.cpp:273:62:273:64 | call to GetHeaders | provenance | Src:MaD:52 | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:273:62:273:64 | call to GetHeaders | azure.cpp:274:14:274:29 | call to operator[] | provenance | TaintFunction | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:10:274:29 | call to operator[] | provenance | | | azure.cpp:274:14:274:29 | call to operator[] | azure.cpp:274:14:274:29 | call to operator[] | provenance | | -| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:46 | +| azure.cpp:277:38:277:44 | call to GetBody | azure.cpp:277:45:277:47 | call to GetBody | provenance | Src:MaD:51 | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:277:45:277:47 | call to GetBody | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:278:10:278:13 | body | azure.cpp:278:10:278:13 | body | provenance | | | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | azure.cpp:282:21:282:23 | *call to get | provenance | | -| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:45 | -| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:90 | +| azure.cpp:281:68:281:84 | call to ExtractBodyStream | azure.cpp:281:68:281:84 | *call to ExtractBodyStream | provenance | Src:MaD:50 | +| azure.cpp:282:21:282:23 | *call to get | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | MaD:95 | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:10:282:38 | call to ReadToEnd | provenance | | | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | azure.cpp:282:28:282:36 | call to ReadToEnd [element] | provenance | | -| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:91 | +| azure.cpp:289:24:289:56 | call to GetHeader | azure.cpp:289:63:289:65 | call to Value | provenance | MaD:96 | | azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:24:289:56 | call to GetHeader | provenance | | -| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:49 | +| azure.cpp:289:32:289:40 | call to GetHeader | azure.cpp:289:32:289:40 | call to GetHeader | provenance | Src:MaD:54 | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:289:63:289:65 | call to Value | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:289:63:289:65 | call to Value | azure.cpp:290:10:290:20 | headerValue | provenance | | | azure.cpp:290:10:290:20 | headerValue | azure.cpp:290:10:290:20 | headerValue | provenance | | -| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:50 | +| azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:293:58:293:67 | call to GetHeaders | provenance | Src:MaD:55 | | azure.cpp:293:58:293:67 | call to GetHeaders | azure.cpp:294:38:294:53 | call to operator[] | provenance | TaintFunction | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:294:38:294:53 | call to operator[] | azure.cpp:295:10:295:20 | contentType | provenance | | | azure.cpp:295:10:295:20 | contentType | azure.cpp:295:10:295:20 | contentType | provenance | | | test.cpp:7:47:7:52 | value2 | test.cpp:7:64:7:69 | value2 | provenance | | | test.cpp:7:64:7:69 | value2 | test.cpp:7:5:7:30 | *ymlStepGenerated_with_body | provenance | | -| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:10:10:10:18 | call to ymlSource | test.cpp:10:10:10:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:14:10:14:10 | x | provenance | Sink:MaD:3 | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:17:24:17:24 | x | provenance | | | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:21:27:21:27 | x | provenance | | @@ -149,13 +154,13 @@ edges | test.cpp:10:10:10:18 | call to ymlSource | test.cpp:32:41:32:41 | x | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | | | test.cpp:17:10:17:22 | call to ymlStepManual | test.cpp:18:10:18:10 | y | provenance | Sink:MaD:3 | -| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:80 | +| test.cpp:17:24:17:24 | x | test.cpp:17:10:17:22 | call to ymlStepManual | provenance | MaD:85 | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | | | test.cpp:21:10:21:25 | call to ymlStepGenerated | test.cpp:22:10:22:10 | z | provenance | Sink:MaD:3 | -| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:79 | +| test.cpp:21:27:21:27 | x | test.cpp:21:10:21:25 | call to ymlStepGenerated | provenance | MaD:84 | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | | | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | test.cpp:26:10:26:11 | y2 | provenance | Sink:MaD:3 | -| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:81 | +| test.cpp:25:35:25:35 | x | test.cpp:25:11:25:33 | call to ymlStepManual_with_body | provenance | MaD:86 | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | provenance | | | test.cpp:32:11:32:36 | call to ymlStepGenerated_with_body | test.cpp:33:10:33:11 | z2 | provenance | Sink:MaD:3 | | test.cpp:32:41:32:41 | x | test.cpp:7:47:7:52 | value2 | provenance | | @@ -166,78 +171,78 @@ edges | test.cpp:48:16:48:16 | x | test.cpp:48:16:48:16 | x | provenance | Sink:MaD:3 | | test.cpp:56:2:56:2 | *s [post update] [x] | test.cpp:59:55:59:64 | *& ... [x] | provenance | | | test.cpp:56:2:56:18 | ... = ... | test.cpp:56:2:56:2 | *s [post update] [x] | provenance | | -| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:43 | -| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:76 | +| test.cpp:56:8:56:16 | call to ymlSource | test.cpp:56:2:56:18 | ... = ... | provenance | Src:MaD:48 | +| test.cpp:59:55:59:64 | *& ... [x] | test.cpp:46:30:46:32 | *arg [x] | provenance | MaD:81 | | test.cpp:68:22:68:22 | y | test.cpp:69:11:69:11 | y | provenance | Sink:MaD:3 | | test.cpp:74:22:74:22 | y | test.cpp:75:11:75:11 | y | provenance | Sink:MaD:3 | | test.cpp:82:22:82:22 | y | test.cpp:83:11:83:11 | y | provenance | Sink:MaD:3 | | test.cpp:88:22:88:22 | y | test.cpp:89:11:89:11 | y | provenance | Sink:MaD:3 | -| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:94:10:94:18 | call to ymlSource | test.cpp:94:10:94:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:97:26:97:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:101:26:101:26 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:103:63:103:63 | x | provenance | | | test.cpp:94:10:94:18 | call to ymlSource | test.cpp:104:62:104:62 | x | provenance | | -| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:74 | -| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:74 | -| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:74 | -| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:74 | -| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:97:26:97:26 | x | test.cpp:68:22:68:22 | y | provenance | MaD:79 | +| test.cpp:101:26:101:26 | x | test.cpp:74:22:74:22 | y | provenance | MaD:79 | +| test.cpp:103:63:103:63 | x | test.cpp:82:22:82:22 | y | provenance | MaD:79 | +| test.cpp:104:62:104:62 | x | test.cpp:88:22:88:22 | y | provenance | MaD:79 | +| test.cpp:114:10:114:18 | call to ymlSource | test.cpp:114:10:114:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:114:10:114:18 | call to ymlSource | test.cpp:118:44:118:44 | *x | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | | | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | test.cpp:119:10:119:11 | y2 | provenance | Sink:MaD:3 | -| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:75 | -| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:118:44:118:44 | *x | test.cpp:118:11:118:42 | call to callWithNonTypeTemplate | provenance | MaD:80 | +| test.cpp:133:10:133:18 | call to ymlSource | test.cpp:133:10:133:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:133:10:133:18 | call to ymlSource | test.cpp:134:45:134:45 | x | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:134:13:134:43 | call to templateFunction | provenance | | | test.cpp:134:13:134:43 | call to templateFunction | test.cpp:135:10:135:10 | y | provenance | Sink:MaD:3 | -| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:86 | -| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:134:45:134:45 | x | test.cpp:134:13:134:43 | call to templateFunction | provenance | MaD:91 | +| test.cpp:146:10:146:18 | call to ymlSource | test.cpp:146:10:146:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:146:10:146:18 | call to ymlSource | test.cpp:148:26:148:26 | x | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:148:10:148:27 | call to function | provenance | | | test.cpp:148:10:148:27 | call to function | test.cpp:149:10:149:10 | z | provenance | Sink:MaD:3 | -| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:87 | -| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:148:26:148:26 | x | test.cpp:148:10:148:27 | call to function | provenance | MaD:92 | +| test.cpp:155:10:155:18 | call to ymlSource | test.cpp:155:10:155:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:155:10:155:18 | call to ymlSource | test.cpp:157:26:157:26 | x | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:157:13:157:20 | call to function | provenance | | | test.cpp:157:13:157:20 | call to function | test.cpp:158:10:158:10 | z | provenance | Sink:MaD:3 | -| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:87 | +| test.cpp:157:26:157:26 | x | test.cpp:157:13:157:20 | call to function | provenance | MaD:92 | | test.cpp:164:34:164:34 | x | test.cpp:165:69:165:69 | x | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:164:7:164:7 | *templateFunction3 | provenance | | | test.cpp:165:12:165:64 | call to templateFunction2 | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | | -| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:85 | -| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:165:69:165:69 | x | test.cpp:165:12:165:64 | call to templateFunction2 | provenance | MaD:90 | +| test.cpp:170:10:170:18 | call to ymlSource | test.cpp:170:10:170:18 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:170:10:170:18 | call to ymlSource | test.cpp:172:51:172:51 | x | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | | | test.cpp:172:13:172:44 | call to templateFunction3 | test.cpp:173:10:173:10 | y | provenance | Sink:MaD:3 | | test.cpp:172:51:172:51 | x | test.cpp:164:34:164:34 | x | provenance | | -| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:85 | +| test.cpp:172:51:172:51 | x | test.cpp:172:13:172:44 | call to templateFunction3 | provenance | MaD:90 | | test.cpp:186:2:186:2 | *s [post update] [myField] | test.cpp:187:33:187:34 | *& ... [myField] | provenance | | | test.cpp:186:2:186:24 | ... = ... | test.cpp:186:2:186:2 | *s [post update] [myField] | provenance | | -| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:43 | +| test.cpp:186:14:186:22 | call to ymlSource | test.cpp:186:2:186:24 | ... = ... | provenance | Src:MaD:48 | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | | | test.cpp:187:10:187:31 | call to read_field_from_struct | test.cpp:188:10:188:10 | x | provenance | Sink:MaD:3 | -| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:77 | +| test.cpp:187:33:187:34 | *& ... [myField] | test.cpp:187:10:187:31 | call to read_field_from_struct | provenance | MaD:82 | | test.cpp:199:2:199:2 | *s [post update] [myField] | test.cpp:200:35:200:36 | *& ... [myField] | provenance | | | test.cpp:199:2:199:24 | ... = ... | test.cpp:199:2:199:2 | *s [post update] [myField] | provenance | | -| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:43 | +| test.cpp:199:14:199:22 | call to ymlSource | test.cpp:199:2:199:24 | ... = ... | provenance | Src:MaD:48 | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | | | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | test.cpp:201:10:201:10 | x | provenance | Sink:MaD:3 | -| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:78 | +| test.cpp:200:35:200:36 | *& ... [myField] | test.cpp:200:10:200:33 | call to read_field_from_struct_2 | provenance | MaD:83 | | test.cpp:216:3:216:4 | get_ptr output argument [value] | test.cpp:217:11:217:12 | *rf [value] | provenance | | -| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:84 | -| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:43 | +| test.cpp:216:3:216:28 | ... = ... | test.cpp:216:3:216:4 | get_ptr output argument [value] | provenance | MaD:89 | +| test.cpp:216:18:216:26 | call to ymlSource | test.cpp:216:3:216:28 | ... = ... | provenance | Src:MaD:48 | | test.cpp:217:11:217:12 | *rf [value] | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:217:14:217:18 | value | provenance | | | test.cpp:217:14:217:18 | value | test.cpp:218:11:218:11 | x | provenance | Sink:MaD:3 | | test.cpp:222:3:222:3 | operator[] output argument | test.cpp:223:12:223:12 | *s | provenance | | -| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:83 | -| test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:43 | -| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:82 | +| test.cpp:222:3:222:20 | ... = ... | test.cpp:222:3:222:3 | operator[] output argument | provenance | MaD:88 | +| test.cpp:222:10:222:18 | call to ymlSource | test.cpp:222:3:222:20 | ... = ... | provenance | Src:MaD:48 | +| test.cpp:223:12:223:12 | *s | test.cpp:223:13:223:15 | call to operator[] | provenance | MaD:87 | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:223:13:223:15 | call to operator[] | provenance | | | test.cpp:223:13:223:15 | call to operator[] | test.cpp:224:11:224:11 | c | provenance | Sink:MaD:3 | | test.cpp:243:10:243:10 | *s [value] | test.cpp:243:13:243:17 | value | provenance | | | test.cpp:243:13:243:17 | value | test.cpp:243:13:243:17 | value | provenance | Sink:MaD:3 | -| test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:42 | +| test.cpp:247:26:247:39 | call to ymlFieldSource | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | provenance | Src:MaD:47 | | test.cpp:247:26:247:39 | call to ymlFieldSource [value] | test.cpp:248:10:248:16 | *wrapper [value] | provenance | | | test.cpp:248:10:248:16 | *wrapper [value] | test.cpp:248:18:248:22 | value | provenance | | | test.cpp:248:18:248:22 | value | test.cpp:248:18:248:22 | value | provenance | Sink:MaD:3 | @@ -265,13 +270,13 @@ edges | test.cpp:293:5:293:26 | *callback_returning_int | test.cpp:307:10:307:31 | call to callback_returning_int | provenance | | | test.cpp:294:5:294:28 | *callback_returning_int_2 | test.cpp:310:10:310:33 | call to callback_returning_int_2 | provenance | | | test.cpp:295:6:295:31 | **callback_returning_ptr_int | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | provenance | | -| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:297:33:297:41 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:297:33:297:41 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Sink:MaD:1 | -| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Src:MaD:43 Sink:MaD:1 | +| test.cpp:297:33:297:41 | call to ymlSource | test.cpp:318:37:318:52 | return_ymlSource | provenance | Src:MaD:48 Sink:MaD:1 | | test.cpp:299:41:299:52 | *call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Sink:MaD:2 | -| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:299:41:299:52 | *call to ymlSourcePtr | provenance | Src:MaD:44 | -| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Src:MaD:44 Sink:MaD:2 | -| test.cpp:304:11:304:22 | call to ymlSourcePtr | test.cpp:304:10:304:24 | * ... | provenance | Src:MaD:44 Sink:MaD:3 | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:299:41:299:52 | *call to ymlSourcePtr | provenance | Src:MaD:49 | +| test.cpp:299:41:299:52 | call to ymlSourcePtr | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | provenance | Src:MaD:49 Sink:MaD:2 | +| test.cpp:304:11:304:22 | call to ymlSourcePtr | test.cpp:304:10:304:24 | * ... | provenance | Src:MaD:49 Sink:MaD:3 | | test.cpp:306:39:306:60 | source_from_callback_return_template output argument | test.cpp:293:5:293:26 | *callback_returning_int | provenance | Src:MaD:39 | | test.cpp:307:10:307:31 | call to callback_returning_int | test.cpp:307:10:307:31 | call to callback_returning_int | provenance | Sink:MaD:3 | | test.cpp:309:34:309:57 | source_from_callback_return_ptr output argument | test.cpp:294:5:294:28 | *callback_returning_int_2 | provenance | Src:MaD:38 | @@ -280,17 +285,30 @@ edges | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | provenance | | | test.cpp:313:13:313:38 | *call to callback_returning_ptr_int | test.cpp:315:10:315:13 | * ... | provenance | Sink:MaD:3 | | test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Sink:MaD:1 | -| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Src:MaD:43 Sink:MaD:1 | -| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:51:317:59 | call to ymlSource | provenance | Src:MaD:43 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:37:317:64 | [...](...){...} | provenance | Src:MaD:48 Sink:MaD:1 | +| test.cpp:317:51:317:59 | call to ymlSource | test.cpp:317:51:317:59 | call to ymlSource | provenance | Src:MaD:48 | | test.cpp:320:50:320:61 | *call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Sink:MaD:2 | -| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Src:MaD:44 Sink:MaD:2 | -| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:50:320:61 | *call to ymlSourcePtr | provenance | Src:MaD:44 | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:36:320:36 | call to operator int *(*)() | provenance | Src:MaD:49 Sink:MaD:2 | +| test.cpp:320:50:320:61 | call to ymlSourcePtr | test.cpp:320:50:320:61 | *call to ymlSourcePtr | provenance | Src:MaD:49 | +| test.cpp:324:36:324:36 | p | test.cpp:325:10:325:10 | *p [value] | provenance | Src:MaD:43 | +| test.cpp:324:36:324:36 | p | test.cpp:327:11:327:11 | *p [*pointer] | provenance | Src:MaD:42 | +| test.cpp:324:53:324:53 | s | test.cpp:329:10:329:10 | *s [value] | provenance | Src:MaD:46 | +| test.cpp:324:53:324:53 | s | test.cpp:331:11:331:11 | *s [*pointer] | provenance | Src:MaD:45 | +| test.cpp:324:61:324:66 | source | test.cpp:334:10:334:16 | * ... | provenance | Src:MaD:44 Sink:MaD:3 | +| test.cpp:325:10:325:10 | *p [value] | test.cpp:325:13:325:17 | value | provenance | | +| test.cpp:325:13:325:17 | value | test.cpp:325:13:325:17 | value | provenance | Sink:MaD:3 | +| test.cpp:327:10:327:20 | * ... | test.cpp:327:10:327:20 | * ... | provenance | Sink:MaD:3 | +| test.cpp:327:11:327:11 | *p [*pointer] | test.cpp:327:10:327:20 | * ... | provenance | | +| test.cpp:329:10:329:10 | *s [value] | test.cpp:329:12:329:16 | value | provenance | | +| test.cpp:329:12:329:16 | value | test.cpp:329:12:329:16 | value | provenance | Sink:MaD:3 | +| test.cpp:331:10:331:19 | * ... | test.cpp:331:10:331:19 | * ... | provenance | Sink:MaD:3 | +| test.cpp:331:11:331:11 | *s [*pointer] | test.cpp:331:10:331:19 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:24:8:24:11 | * ... | provenance | | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | windows.cpp:27:36:27:38 | *cmd | provenance | | | windows.cpp:22:15:22:29 | call to GetCommandLineA | windows.cpp:22:15:22:29 | *call to GetCommandLineA | provenance | Src:MaD:5 | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | | | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | windows.cpp:30:8:30:15 | * ... | provenance | | -| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:54 | +| windows.cpp:27:36:27:38 | *cmd | windows.cpp:27:17:27:34 | **call to CommandLineToArgvA | provenance | MaD:59 | | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | windows.cpp:36:10:36:13 | * ... | provenance | | | windows.cpp:34:17:34:38 | call to GetEnvironmentStringsA | windows.cpp:34:17:34:38 | *call to GetEnvironmentStringsA | provenance | Src:MaD:6 | | windows.cpp:39:36:39:38 | GetEnvironmentVariableA output argument | windows.cpp:41:10:41:13 | * ... | provenance | Src:MaD:7 | @@ -310,11 +328,11 @@ edges | windows.cpp:189:21:189:26 | ReadFile output argument | windows.cpp:190:5:190:56 | *... = ... | provenance | Src:MaD:19 | | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | windows.cpp:192:53:192:63 | *& ... [*hEvent] | provenance | | | windows.cpp:190:5:190:56 | *... = ... | windows.cpp:190:5:190:14 | *overlapped [post update] [*hEvent] | provenance | | -| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:61 | +| windows.cpp:192:53:192:63 | *& ... [*hEvent] | windows.cpp:147:16:147:27 | *lpOverlapped [*hEvent] | provenance | MaD:66 | | windows.cpp:198:21:198:26 | ReadFile output argument | windows.cpp:199:5:199:57 | ... = ... | provenance | Src:MaD:19 | | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | windows.cpp:201:53:201:63 | *& ... [hEvent] | provenance | | | windows.cpp:199:5:199:57 | ... = ... | windows.cpp:199:5:199:14 | *overlapped [post update] [hEvent] | provenance | | -| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:61 | +| windows.cpp:201:53:201:63 | *& ... [hEvent] | windows.cpp:157:16:157:27 | *lpOverlapped [hEvent] | provenance | MaD:66 | | windows.cpp:209:84:209:89 | NtReadFile output argument | windows.cpp:211:10:211:16 | * ... | provenance | Src:MaD:18 | | windows.cpp:286:23:286:35 | *call to MapViewOfFile | windows.cpp:287:20:287:52 | *pMapView | provenance | | | windows.cpp:286:23:286:35 | call to MapViewOfFile | windows.cpp:286:23:286:35 | *call to MapViewOfFile | provenance | Src:MaD:14 | @@ -351,9 +369,9 @@ edges | windows.cpp:431:3:431:3 | *s [post update] [x] | windows.cpp:464:7:464:8 | *& ... [x] | provenance | | | windows.cpp:431:3:431:16 | ... = ... | windows.cpp:431:3:431:3 | *s [post update] [x] | provenance | | | windows.cpp:431:9:431:14 | call to source | windows.cpp:431:3:431:16 | ... = ... | provenance | | -| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:57 | -| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:55 | -| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:56 | +| windows.cpp:439:7:439:8 | *& ... [x] | windows.cpp:403:26:403:36 | *lpParameter [x] | provenance | MaD:62 | +| windows.cpp:451:7:451:8 | *& ... [x] | windows.cpp:410:26:410:36 | *lpParameter [x] | provenance | MaD:60 | +| windows.cpp:464:7:464:8 | *& ... [x] | windows.cpp:417:26:417:36 | *lpParameter [x] | provenance | MaD:61 | | windows.cpp:533:11:533:16 | call to source | windows.cpp:533:11:533:16 | call to source | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:537:40:537:41 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:542:38:542:39 | *& ... | provenance | | @@ -362,30 +380,30 @@ edges | windows.cpp:533:11:533:16 | call to source | windows.cpp:568:32:568:33 | *& ... | provenance | | | windows.cpp:533:11:533:16 | call to source | windows.cpp:573:40:573:41 | *& ... | provenance | | | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | windows.cpp:538:10:538:23 | access to array | provenance | | -| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:66 | +| windows.cpp:537:40:537:41 | *& ... | windows.cpp:537:27:537:37 | RtlCopyVolatileMemory output argument | provenance | MaD:71 | | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | windows.cpp:543:10:543:23 | access to array | provenance | | -| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:62 | +| windows.cpp:542:38:542:39 | *& ... | windows.cpp:542:25:542:35 | RtlCopyDeviceMemory output argument | provenance | MaD:67 | | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | windows.cpp:548:10:548:23 | access to array | provenance | | -| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:63 | +| windows.cpp:547:32:547:33 | *& ... | windows.cpp:547:19:547:29 | RtlCopyMemory output argument | provenance | MaD:68 | | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | windows.cpp:553:10:553:23 | access to array | provenance | | -| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:64 | +| windows.cpp:552:43:552:44 | *& ... | windows.cpp:552:30:552:40 | RtlCopyMemoryNonTemporal output argument | provenance | MaD:69 | | windows.cpp:559:5:559:24 | ... = ... | windows.cpp:561:39:561:44 | *buffer | provenance | | | windows.cpp:559:17:559:24 | call to source | windows.cpp:559:5:559:24 | ... = ... | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:562:10:562:19 | *src_string [*Buffer] | provenance | | | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | windows.cpp:563:40:563:50 | *& ... [*Buffer] | provenance | | -| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:67 | +| windows.cpp:561:39:561:44 | *buffer | windows.cpp:561:26:561:36 | RtlInitUnicodeString output argument [*Buffer] | provenance | MaD:72 | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:562:10:562:19 | *src_string [*Buffer] | windows.cpp:562:21:562:26 | *Buffer | provenance | | | windows.cpp:562:21:562:26 | *Buffer | windows.cpp:562:10:562:29 | access to array | provenance | | | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | provenance | | -| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:65 | +| windows.cpp:563:40:563:50 | *& ... [*Buffer] | windows.cpp:563:26:563:37 | RtlCopyUnicodeString output argument [*Buffer] | provenance | MaD:70 | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:564:10:564:20 | *dest_string [*Buffer] | windows.cpp:564:22:564:27 | *Buffer | provenance | | | windows.cpp:564:22:564:27 | *Buffer | windows.cpp:564:10:564:30 | access to array | provenance | | | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | windows.cpp:569:10:569:23 | access to array | provenance | | -| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:68 | +| windows.cpp:568:32:568:33 | *& ... | windows.cpp:568:19:568:29 | RtlMoveMemory output argument | provenance | MaD:73 | | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | windows.cpp:574:10:574:23 | access to array | provenance | | -| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:69 | +| windows.cpp:573:40:573:41 | *& ... | windows.cpp:573:27:573:37 | RtlMoveVolatileMemory output argument | provenance | MaD:74 | | windows.cpp:645:45:645:50 | WinHttpReadData output argument | windows.cpp:647:10:647:16 | * ... | provenance | Src:MaD:35 | | windows.cpp:652:48:652:53 | WinHttpReadDataEx output argument | windows.cpp:654:10:654:16 | * ... | provenance | Src:MaD:36 | | windows.cpp:659:47:659:52 | WinHttpQueryHeaders output argument | windows.cpp:661:10:661:16 | * ... | provenance | Src:MaD:31 | @@ -394,7 +412,7 @@ edges | windows.cpp:669:105:669:112 | WinHttpQueryHeadersEx output argument | windows.cpp:675:10:675:27 | * ... | provenance | Src:MaD:32 | | windows.cpp:728:5:728:28 | ... = ... | windows.cpp:729:35:729:35 | *x | provenance | | | windows.cpp:728:12:728:28 | call to source | windows.cpp:728:5:728:28 | ... = ... | provenance | | -| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:73 | +| windows.cpp:729:35:729:35 | *x | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | provenance | MaD:78 | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:731:10:731:36 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:733:10:733:35 | * ... | provenance | | | windows.cpp:729:44:729:57 | WinHttpCrackUrl output argument | windows.cpp:735:10:735:37 | * ... | provenance | | @@ -429,35 +447,35 @@ edges | windows.cpp:1087:71:1087:74 | RegEnumValueW output argument | windows.cpp:1089:10:1089:14 | * ... | provenance | Src:MaD:22 | | windows.cpp:1122:5:1122:27 | ... = ... | windows.cpp:1124:19:1124:21 | *str | provenance | | | windows.cpp:1122:14:1122:27 | call to source | windows.cpp:1122:5:1122:27 | ... = ... | provenance | | -| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:59 | +| windows.cpp:1124:19:1124:21 | *str | windows.cpp:1124:24:1124:27 | IIDFromString output argument | provenance | MaD:64 | | windows.cpp:1124:24:1124:27 | IIDFromString output argument | windows.cpp:1125:10:1125:12 | iid | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1128:15:1128:20 | call to source | provenance | | | windows.cpp:1128:15:1128:20 | call to source | windows.cpp:1130:19:1130:21 | *iid | provenance | | -| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:72 | +| windows.cpp:1130:19:1130:21 | *iid | windows.cpp:1130:24:1130:27 | StringFromIID output argument | provenance | MaD:77 | | windows.cpp:1130:24:1130:27 | StringFromIID output argument | windows.cpp:1132:10:1132:13 | * ... | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1135:19:1135:24 | call to source | provenance | | | windows.cpp:1135:19:1135:24 | call to source | windows.cpp:1137:21:1137:25 | *clsid | provenance | | -| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:60 | +| windows.cpp:1137:21:1137:25 | *clsid | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | provenance | MaD:65 | | windows.cpp:1137:28:1137:31 | ProgIDFromCLSID output argument | windows.cpp:1139:10:1139:13 | * ... | provenance | | | windows.cpp:1143:5:1143:30 | ... = ... | windows.cpp:1145:21:1145:26 | *progID | provenance | | | windows.cpp:1143:17:1143:30 | call to source | windows.cpp:1143:5:1143:30 | ... = ... | provenance | | -| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:52 | +| windows.cpp:1145:21:1145:26 | *progID | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | provenance | MaD:57 | | windows.cpp:1145:29:1145:34 | CLSIDFromProgID output argument | windows.cpp:1146:10:1146:14 | clsid | provenance | | | windows.cpp:1150:5:1150:27 | ... = ... | windows.cpp:1152:21:1152:23 | *str | provenance | | | windows.cpp:1150:14:1150:27 | call to source | windows.cpp:1150:5:1150:27 | ... = ... | provenance | | -| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:53 | +| windows.cpp:1152:21:1152:23 | *str | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | provenance | MaD:58 | | windows.cpp:1152:26:1152:31 | CLSIDFromString output argument | windows.cpp:1153:10:1153:14 | clsid | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1156:19:1156:24 | call to source | provenance | | | windows.cpp:1156:19:1156:24 | call to source | windows.cpp:1158:21:1158:25 | *clsid | provenance | | -| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:70 | +| windows.cpp:1158:21:1158:25 | *clsid | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | provenance | MaD:75 | | windows.cpp:1158:28:1158:31 | StringFromCLSID output argument | windows.cpp:1160:10:1160:13 | * ... | provenance | | | windows.cpp:1164:5:1164:27 | ... = ... | windows.cpp:1166:20:1166:22 | *str | provenance | | | windows.cpp:1164:14:1164:27 | call to source | windows.cpp:1164:5:1164:27 | ... = ... | provenance | | -| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:58 | +| windows.cpp:1166:20:1166:22 | *str | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | provenance | MaD:63 | | windows.cpp:1166:25:1166:29 | GUIDFromString output argument | windows.cpp:1167:10:1167:13 | guid | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1170:17:1170:22 | call to source | provenance | | | windows.cpp:1170:17:1170:22 | call to source | windows.cpp:1172:21:1172:24 | *guid | provenance | | -| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:71 | +| windows.cpp:1172:21:1172:24 | *guid | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | provenance | MaD:76 | | windows.cpp:1172:27:1172:29 | StringFromGUID2 output argument | windows.cpp:1174:10:1174:13 | * ... | provenance | | nodes | asio_streams.cpp:87:34:87:44 | read_until output argument | semmle.label | read_until output argument | @@ -681,6 +699,24 @@ nodes | test.cpp:320:50:320:61 | *call to ymlSourcePtr | semmle.label | *call to ymlSourcePtr | | test.cpp:320:50:320:61 | call to ymlSourcePtr | semmle.label | call to ymlSourcePtr | | test.cpp:321:36:321:58 | return_ptr_to_ymlSource | semmle.label | return_ptr_to_ymlSource | +| test.cpp:324:36:324:36 | p | semmle.label | p | +| test.cpp:324:36:324:36 | p | semmle.label | p | +| test.cpp:324:53:324:53 | s | semmle.label | s | +| test.cpp:324:53:324:53 | s | semmle.label | s | +| test.cpp:324:61:324:66 | source | semmle.label | source | +| test.cpp:325:10:325:10 | *p [value] | semmle.label | *p [value] | +| test.cpp:325:13:325:17 | value | semmle.label | value | +| test.cpp:325:13:325:17 | value | semmle.label | value | +| test.cpp:327:10:327:20 | * ... | semmle.label | * ... | +| test.cpp:327:10:327:20 | * ... | semmle.label | * ... | +| test.cpp:327:11:327:11 | *p [*pointer] | semmle.label | *p [*pointer] | +| test.cpp:329:10:329:10 | *s [value] | semmle.label | *s [value] | +| test.cpp:329:12:329:16 | value | semmle.label | value | +| test.cpp:329:12:329:16 | value | semmle.label | value | +| test.cpp:331:10:331:19 | * ... | semmle.label | * ... | +| test.cpp:331:10:331:19 | * ... | semmle.label | * ... | +| test.cpp:331:11:331:11 | *s [*pointer] | semmle.label | *s [*pointer] | +| test.cpp:334:10:334:16 | * ... | semmle.label | * ... | | windows.cpp:22:15:22:29 | *call to GetCommandLineA | semmle.label | *call to GetCommandLineA | | windows.cpp:22:15:22:29 | call to GetCommandLineA | semmle.label | call to GetCommandLineA | | windows.cpp:24:8:24:11 | * ... | semmle.label | * ... | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml index 134aeb018822..0db87b5da615 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml +++ b/cpp/ql/test/library-tests/dataflow/external-models/flow.ext.yml @@ -11,6 +11,11 @@ extensions: - ["", "", False, "source_from_callback_return_template", "", "", "Argument[0].ReturnValue", "local", "manual"] - ["", "", False, "source_from_callback_return_ptr", "", "", "Argument[0].ReturnValue", "local", "manual"] - ["", "", False, "source_ptr_from_callback_return_ptr", "", "", "Argument[0].ReturnValue[*]", "local", "manual"] + - ["", "", False, "test_parameter", "", "", "Parameter[*0].Field[SourceWrapper::value]", "local", "manual"] + - ["", "", False, "test_parameter", "", "", "Parameter[*0].Field[*SourceWrapper::pointer]", "local", "manual"] + - ["", "", False, "test_parameter", "", "", "Parameter[1].Field[*SourceWrapper::pointer]", "local", "manual"] + - ["", "", False, "test_parameter", "", "", "Parameter[1].Field[SourceWrapper::value]", "local", "manual"] + - ["", "", False, "test_parameter", "", "", "Parameter[*2]", "local", "manual"] - addsTo: pack: codeql/cpp-all extensible: sinkModel diff --git a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected index ed6a05517497..5851e825013d 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected +++ b/cpp/ql/test/library-tests/dataflow/external-models/sinks.expected @@ -35,3 +35,11 @@ | test.cpp:310:10:310:33 | call to callback_returning_int_2 | test-sink | | test.cpp:314:15:314:17 | ptr | test-sink | | test.cpp:315:10:315:13 | * ... | test-sink | +| test.cpp:325:13:325:17 | value | test-sink | +| test.cpp:326:18:326:24 | pointer | test-sink | +| test.cpp:327:10:327:20 | * ... | test-sink | +| test.cpp:329:12:329:16 | value | test-sink | +| test.cpp:330:17:330:23 | pointer | test-sink | +| test.cpp:331:10:331:19 | * ... | test-sink | +| test.cpp:333:15:333:20 | source | test-sink | +| test.cpp:334:10:334:16 | * ... | test-sink | diff --git a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp index ba189200b193..739c36bc67d3 100644 --- a/cpp/ql/test/library-tests/dataflow/external-models/test.cpp +++ b/cpp/ql/test/library-tests/dataflow/external-models/test.cpp @@ -227,7 +227,7 @@ void test_reverse_flow(unsigned i, unsigned j) { struct SourceWrapper { - int value; + int value; int* pointer; }; SourceWrapper ymlFieldSource(); @@ -319,4 +319,17 @@ void test_callback_return_access_paths() { sink_ptr_from_callback_return_ptr([]() { return ymlSourcePtr(); }); // $ ir sink_ptr_from_callback_return_ptr(return_ptr_to_ymlSource); // $ ir +} + +void test_parameter(SourceWrapper* p, SourceWrapper s, int* source) { + ymlSink(p->value); // $ ir + ymlSink((int)p->pointer); // clean + ymlSink(*p->pointer); // $ ir + + ymlSink(s.value); // $ ir + ymlSink((int)s.pointer); // clean + ymlSink(*s.pointer); // $ ir + + ymlSink((int)source); // clean + ymlSink(*source); // $ ir } \ No newline at end of file From 0f1fd7f33894812296d3e531ae0f0db953c564ba Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:40:13 +0000 Subject: [PATCH 105/181] Unified: Make Linux build hermetic --- BUILD.bazel | 8 + MODULE.bazel | 3 +- .../patches/external_static_runtime.patch | 242 ++++++++++++++++++ .../4.0.0-rc5-codeql.1/source.json | 3 +- unified/BUILD.bazel | 5 +- unified/extractor/BUILD.bazel | 10 +- unified/swift-syntax-rs/BUILD.bazel | 83 +++--- unified/swift-syntax-rs/swift_runtime.bzl | 19 -- .../swift-syntax-rs/swift_runtime_linking.bzl | 11 - 9 files changed, 308 insertions(+), 76 deletions(-) create mode 100644 misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch delete mode 100644 unified/swift-syntax-rs/swift_runtime.bzl delete mode 100644 unified/swift-syntax-rs/swift_runtime_linking.bzl diff --git a/BUILD.bazel b/BUILD.bazel index b2e4ea806785..07027f4ad9a7 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -3,3 +3,11 @@ exports_files([ "Cargo.lock", "Cargo.toml", ]) + +constraint_setting(name = "swift_runtime_linkage") + +constraint_value( + name = "static_swift_runtime", + constraint_setting = ":swift_runtime_linkage", + visibility = ["//visibility:public"], +) diff --git a/MODULE.bazel b/MODULE.bazel index 91c871445eb4..6184b8c49cac 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -228,7 +228,7 @@ use_repo( # `unified/swift-syntax-rs` package is not loadable in that context. Keep this # in sync with `unified/swift-syntax-rs/.swift-version` (used by the `cargo` # build) and the `swift-syntax` release in `swift/Package.swift`. -swift = use_extension("@rules_swift//swift:extensions.bzl", "swift") +swift = use_extension("@rules_swift//swift:extensions.bzl", "swift", dev_dependency = True) swift.toolchain( name = "swift_toolchain", swift_version = "6.3.3", @@ -243,6 +243,7 @@ use_repo( register_toolchains( "@swift_toolchain//:swift_toolchain_exec_ubuntu22.04", "@swift_toolchain//:swift_toolchain_exec_xcode", + dev_dependency = True, ) node = use_extension("@rules_nodejs//nodejs:extensions.bzl", "node") diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch new file mode 100644 index 000000000000..11f32aacd257 --- /dev/null +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch @@ -0,0 +1,242 @@ +diff --git a/swift/extensions.bzl b/swift/extensions.bzl +index b77f636..1255ba7 100644 +--- a/swift/extensions.bzl ++++ b/swift/extensions.bzl +@@ -191,6 +191,7 @@ def _standalone_toolchain_impl(module_ctx): + name = repository_name, + sha256 = sha256, + platform = platform, ++ static_runtime = toolchain.static_runtime if platform != "xcode" else None, + swift_version = swift_version, + ) + toolchains_build_file_content += toolchains_for_platform( +@@ -266,6 +267,9 @@ their hashes. For instance: + `bazel run @rules_swift//tools/swift-releases -- list 6.2.4` + """, + ), ++ "static_runtime": attr.label( ++ doc = "External static runtime package to attach to the generated execution toolchains.", ++ ), + "swift_version": attr.string(doc = "Version of the swift toolchain to be installed. Cannot be used concurrently with `swift_version_file`"), + "swift_version_file": attr.label(doc = "A label to the .swift_version file to use. Cannot be used concurrently with `swift_version`"), + }) +diff --git a/swift/internal/extensions/standalone_toolchain.bzl b/swift/internal/extensions/standalone_toolchain.bzl +index a1e09ea..1fcf56d 100644 +--- a/swift/internal/extensions/standalone_toolchain.bzl ++++ b/swift/internal/extensions/standalone_toolchain.bzl +@@ -105,6 +105,9 @@ def _standalone_toolchain_impl(repository_ctx): + "BUILD.bazel", + repository_ctx.attr._build_template, + substitutions = { ++ "{external_static_runtime}": ( ++ ' external_static_runtime = "{}",'.format(repository_ctx.attr.static_runtime) if repository_ctx.attr.static_runtime else "" ++ ), + "{macos_sdkroot}": macos_sdkroot, + "{swift_version}": repository_ctx.attr.swift_version, + }, +@@ -121,6 +124,9 @@ _STANDALONE_TOOLCHAIN_ATTRS = { + "sha256": attr.string( + doc = "The expected SHA-256 of the file downloaded. This must match the SHA-256 of the file downloaded.", + ), ++ "static_runtime": attr.label( ++ doc = "External static runtime package used by this execution toolchain.", ++ ), + "swift_version": attr.string( + doc = "Version of the swift toolchain to be installed.", + mandatory = True, +diff --git a/swift/internal/extensions/toolchain.BUILD b/swift/internal/extensions/toolchain.BUILD +index 1304dc2..ee77866 100644 +--- a/swift/internal/extensions/toolchain.BUILD ++++ b/swift/internal/extensions/toolchain.BUILD +@@ -364,6 +364,7 @@ swift_toolchain( + ), + "//conditions:default": [], + }), ++{external_static_runtime} + swift_tools = "tools", + version_file = ".swift-version", + ) +diff --git a/swift/toolchains/BUILD b/swift/toolchains/BUILD +index 1a8db31..fff0879 100644 +--- a/swift/toolchains/BUILD ++++ b/swift/toolchains/BUILD +@@ -155,6 +155,7 @@ bzl_library( + "//swift/internal:features", + "//swift/internal:providers", + "//swift/internal:target_triples", ++ "//swift/internal:toolchain_utils", + "//swift/internal:utils", + "//swift/internal:wmo", + "//swift/toolchains/config:action_config", +diff --git a/swift/toolchains/swift_toolchain.bzl b/swift/toolchains/swift_toolchain.bzl +index 9fc2a49..6f10573 100644 +--- a/swift/toolchains/swift_toolchain.bzl ++++ b/swift/toolchains/swift_toolchain.bzl +@@ -69,6 +69,11 @@ load( + "SwiftModuleAliasesInfo", + ) + load("//swift/internal:target_triples.bzl", "target_triples") ++load( ++ "//swift/internal:toolchain_utils.bzl", ++ "get_swift_toolchain", ++ "use_swift_toolchain", ++) + load( + "//swift/internal:utils.bzl", + "collect_cross_import_overlays", +@@ -101,6 +106,64 @@ load( + ) + load("//swift/toolchains/config:tool_config.bzl", "ToolConfigInfo") +- ++ ++SwiftStaticRuntimeInfo = provider( ++ fields = { ++ "copts": "Compiler options required to use the runtime.", ++ "files": "Runtime and SDK files required by compile and link actions.", ++ "linkopts": "Linker options required to link the runtime.", ++ "root": "Execution-root-relative path to the runtime SDK.", ++ }, ++) ++ ++def _swift_static_runtime_impl(ctx): ++ root = ctx.label.workspace_root ++ files = depset(ctx.files.files) ++ ++ def expand_root(options): ++ return [option.replace("{root}", root) for option in options] ++ ++ return [ ++ DefaultInfo(files = files), ++ SwiftStaticRuntimeInfo( ++ copts = expand_root(ctx.attr.copts), ++ files = files, ++ linkopts = expand_root(ctx.attr.linkopts), ++ root = root, ++ ), ++ ] ++ ++swift_static_runtime = rule( ++ implementation = _swift_static_runtime_impl, ++ attrs = { ++ "copts": attr.string_list(), ++ "files": attr.label_list(allow_files = True, mandatory = True), ++ "linkopts": attr.string_list(), ++ }, ++) ++ ++def _swift_runtime_impl(ctx): ++ runtime_cc_info = get_swift_toolchain(ctx).dynamic_runtime_cc_info ++ files = [] ++ if runtime_cc_info: ++ for linker_input in runtime_cc_info.linking_context.linker_inputs.to_list(): ++ for library in linker_input.libraries: ++ dynamic_library = getattr(library, "dynamic_library", None) ++ if dynamic_library: ++ files.append(dynamic_library) ++ runtime = depset(files) ++ providers = [DefaultInfo( ++ files = runtime, ++ runfiles = ctx.runfiles(transitive_files = runtime), ++ )] ++ if runtime_cc_info: ++ providers.append(runtime_cc_info) ++ return providers ++ ++swift_runtime = rule( ++ implementation = _swift_runtime_impl, ++ toolchains = use_swift_toolchain(), ++) ++ + def _swift_compile_resource_set(_os, inputs_size): + # The `os` argument is unused, but the Starlark API requires both + # positional arguments. +@@ -662,6 +725,7 @@ def _resolve_sdkroot(ctx, cc_toolchain): +- ++ + def _swift_toolchain_impl(ctx): + toolchain_root = ctx.attr.root ++ external_static_runtime = ctx.attr.external_static_runtime[SwiftStaticRuntimeInfo] if ctx.attr.external_static_runtime else None + cc_toolchain = find_cc_toolchain(ctx) + target_system_name = _parse_target_system_name( + arch = ctx.attr.arch, +@@ -684,7 +748,7 @@ def _swift_toolchain_impl(ctx): + "before invoking Bazel, or configure a Bazel LLVM CC toolchain. " + + "The current CC toolchain is configured to use '{}'.".format(cc_toolchain.compiler)) +- ++ +- sdkroot = _resolve_sdkroot(ctx, cc_toolchain) ++ sdkroot = external_static_runtime.root if external_static_runtime else _resolve_sdkroot(ctx, cc_toolchain) +- ++ + if ctx.attr.swift_tools: + if ctx.attr.swift_executable: +@@ -740,6 +804,18 @@ def _swift_toolchain_impl(ctx): + ctx.attr.linkopts, + ctx.files.linker_inputs, + ) ++ elif external_static_runtime: ++ swift_linkopts_cc_info = CcInfo( ++ linking_context = cc_common.create_linking_context( ++ linker_inputs = depset([ ++ cc_common.create_linker_input( ++ owner = ctx.label, ++ user_link_flags = depset(external_static_runtime.linkopts), ++ additional_inputs = external_static_runtime.files, ++ ), ++ ]), ++ ), ++ ) + else: + ( + swift_linkopts_cc_info, +@@ -763,6 +839,8 @@ def _swift_toolchain_impl(ctx): + swiftcopts.extend(ctx.attr._exec_copts[BuildSettingInfo].value) + else: + swiftcopts.extend(ctx.attr._copts[BuildSettingInfo].value) ++ if external_static_runtime: ++ swiftcopts.extend(external_static_runtime.copts) +- ++ + # Combine build mode features, autoconfigured features, and required + # features. +@@ -774,7 +852,7 @@ def _swift_toolchain_impl(ctx): + target_triple = target_triple, + )) +- ++ +- if apple_common.dotted_version(ctx.attr.parsed_version) >= apple_common.dotted_version("6.3"): ++ if not external_static_runtime and apple_common.dotted_version(ctx.attr.parsed_version) >= apple_common.dotted_version("6.3"): + requested_features.append(SWIFT_FEATURE__SUPPORTS_HERMETIC_SWIFTMODULE) +- ++ + requested_features.extend(ctx.features) +@@ -787,6 +865,8 @@ def _swift_toolchain_impl(ctx): + additional_tools = [ctx.file.version_file] + if ctx.attr.swift_tools: + additional_tools += ctx.attr.swift_tools[SwiftToolsInfo].additional_inputs ++ if external_static_runtime: ++ additional_tools += external_static_runtime.files.to_list() +- ++ + all_tool_configs = _all_tool_configs( + env = ctx.attr.env, +@@ -873,7 +953,7 @@ def _swift_toolchain_impl(ctx): + system_modules = collect_implicit_deps_providers([]), + implicit_system_modules = collect_implicit_deps_providers([]), + swift_worker = ctx.attr._worker[DefaultInfo].files_to_run, +- const_protocols_to_gather = ctx.file.const_protocols_to_gather, ++ const_protocols_to_gather = None if external_static_runtime else ctx.file.const_protocols_to_gather, + test_configuration = struct( + binary_name = "{name}", + env = env, +@@ -952,6 +1032,10 @@ context. + """, + allow_files = True, + ), ++ "external_static_runtime": attr.label( ++ doc = "External static Swift runtime and SDK to use instead of the compiler's runtimes.", ++ providers = [[SwiftStaticRuntimeInfo]], ++ ), + "static_runtime": attr.label_list( + doc = """\ + Static Swift runtime archives and supporting linker files that are passed to diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json index 4f98e32f3d62..8467cad623bc 100644 --- a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json @@ -2,7 +2,8 @@ "integrity": "sha256-Ly2lS4AlZJMiyqAxKHyCB+2pGeP5aYkQ6zv8QheeSTI=", "url": "https://github.com/bazelbuild/rules_swift/releases/download/4.0.0-rc5/rules_swift.4.0.0-rc5.tar.gz", "patches": { - "register_downloaded_macos_toolchain.patch": "sha256-249WJ4YEH2HmxlvGftl4eD53792joKJx9Dh0j5eHAgo=" + "register_downloaded_macos_toolchain.patch": "sha256-249WJ4YEH2HmxlvGftl4eD53792joKJx9Dh0j5eHAgo=", + "external_static_runtime.patch": "sha256-VY8UPZjCdlLjDB4taEpRfENRlkw4pGNYD2MAgNFITC4=" }, "patch_strip": 1 } diff --git a/unified/BUILD.bazel b/unified/BUILD.bazel index 738a95b31552..d17a7c505669 100644 --- a/unified/BUILD.bazel +++ b/unified/BUILD.bazel @@ -42,10 +42,7 @@ codeql_pkg_files( codeql_pkg_files( name = "extractor-arch", exes = codeql_platform_select( - linux64 = [ - "//unified/extractor", - "//unified/swift-syntax-rs:swift_runtime_libs", - ], + linux64 = ["//unified/extractor"], linux_arm64 = ["//unified/extractor-unsupported-os:extractor"], osx64 = ["//unified/extractor"], win64 = ["//unified/extractor-unsupported-os:extractor"], diff --git a/unified/extractor/BUILD.bazel b/unified/extractor/BUILD.bazel index 7959ffe384ad..f8814c4572a1 100644 --- a/unified/extractor/BUILD.bazel +++ b/unified/extractor/BUILD.bazel @@ -13,10 +13,7 @@ codeql_rust_binary( "ast_types.yml", "swift_node_types.yml", ], - data = select({ - "@platforms//os:linux": ["//unified/swift-syntax-rs:swift_runtime_libs"], - "//conditions:default": [], - }), + data = ["//unified/swift-syntax-rs:swift_runtime"], proc_macro_deps = all_crate_deps( proc_macro = True, ), @@ -56,10 +53,7 @@ _TESTS = { "swift_node_types.yml", ] + spec["compile_data"], crate_root = "tests/%s.rs" % test_name, - data = spec["data"] + select({ - "@platforms//os:linux": ["//unified/swift-syntax-rs:swift_runtime_libs"], - "//conditions:default": [], - }), + data = spec["data"] + ["//unified/swift-syntax-rs:swift_runtime"], edition = "2024", proc_macro_deps = all_crate_deps( proc_macro = True, diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index 91a28dc40505..374d0d784f3a 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -1,38 +1,52 @@ load("@rules_cc//cc:defs.bzl", "cc_library") load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_library", "rust_test") load("@rules_swift//swift:swift.bzl", "swift_library") +load("@rules_swift//swift/toolchains:swift_toolchain.bzl", "swift_runtime") load("//unified:platforms.bzl", "UNIFIED_SUPPORTED_PLATFORMS") -load(":swift_runtime.bzl", "swift_runtime_libs") -load(":swift_runtime_linking.bzl", "swift_runtime_linking") package(default_visibility = ["//visibility:public"]) -swift_runtime_libs( - name = "swift_runtime_libs", - toolchain = "@swift_toolchain_ubuntu22.04//:files", +config_setting( + name = "static_linux_runtime", + constraint_values = [ + "@platforms//os:linux", + "//:static_swift_runtime", + ], ) -swift_runtime_linking( - name = "_swift_runtime_cc_info", - target_compatible_with = ["@platforms//os:linux"], - visibility = ["//visibility:private"], +swift_runtime( + name = "_swift_runtime", ) -# On Linux, provide the downloaded Swift runtime at link time and look beside -# the executable for the copies bundled with the extractor at runtime. -cc_library( - name = "swift_runtime_linking", - linkopts = select({ - "@platforms//os:linux": ["-Wl,-rpath,$$ORIGIN"], - "//conditions:default": [], - }), - target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, - deps = select({ - "@platforms//os:linux": [":_swift_runtime_cc_info"], +filegroup( + name = "swift_runtime", + srcs = select({ + ":static_linux_runtime": [], + "@platforms//os:linux": [":_swift_runtime"], "//conditions:default": [], }), ) +cc_library( + name = "static_runtime_group_start", + linkopts = ["-Wl,--start-group"], + target_compatible_with = ["@platforms//os:linux"], +) + +cc_library( + name = "static_runtime_group_end", + linkopts = [ + "-lc", + "-ldl", + "-lm", + "-lpthread", + "-lrt", + "-lutil", + "-Wl,--end-group", + ], + target_compatible_with = ["@platforms//os:linux"], +) + # Swift FFI shim: wraps swift-syntax and exposes a small C ABI. swift_library( name = "swift_syntax_ffi", @@ -56,10 +70,21 @@ rust_library( ), edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, - deps = [ - ":swift_runtime_linking", - ":swift_syntax_ffi", - ], + deps = select({ + ":static_linux_runtime": [ + # Keep these in linker order; sorting them produces an invalid group. + ":static_runtime_group_start", + ":swift_syntax_ffi", + ":static_runtime_group_end", + ], + "@platforms//os:linux": [ + ":_swift_runtime", + ":swift_syntax_ffi", + ], + "//conditions:default": [ + ":swift_syntax_ffi", + ], + }), ) # A debugging aid, for looking at the raw swift-syntax JSON for some input: @@ -68,10 +93,7 @@ rust_library( rust_binary( name = "swift-syntax-parse", srcs = ["src/main.rs"], - data = select({ - "@platforms//os:linux": [":swift_runtime_libs"], - "//conditions:default": [], - }), + data = [":swift_runtime"], edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, deps = [":swift_syntax_rs"], @@ -81,10 +103,7 @@ rust_test( name = "swift_syntax_rs_test", size = "small", crate = ":swift_syntax_rs", - data = select({ - "@platforms//os:linux": [":swift_runtime_libs"], - "//conditions:default": [], - }), + data = [":swift_runtime"], edition = "2024", target_compatible_with = UNIFIED_SUPPORTED_PLATFORMS, ) diff --git a/unified/swift-syntax-rs/swift_runtime.bzl b/unified/swift-syntax-rs/swift_runtime.bzl deleted file mode 100644 index 899d97d71162..000000000000 --- a/unified/swift-syntax-rs/swift_runtime.bzl +++ /dev/null @@ -1,19 +0,0 @@ -"""Filter the Swift toolchain down to just its Linux runtime shared objects. - -The standalone toolchain's `:files` bundles the compiler, host libraries, clang -runtime, plugins, etc. For running a Swift-linked binary we only need the -runtime shared objects in `usr/lib/swift/linux/`. -""" - -def _swift_runtime_libs_impl(ctx): - libs = [ - f - for f in ctx.files.toolchain - if "/usr/lib/swift/linux/" in f.path and f.path.endswith(".so") - ] - return [DefaultInfo(files = depset(libs))] - -swift_runtime_libs = rule( - implementation = _swift_runtime_libs_impl, - attrs = {"toolchain": attr.label(allow_files = True)}, -) diff --git a/unified/swift-syntax-rs/swift_runtime_linking.bzl b/unified/swift-syntax-rs/swift_runtime_linking.bzl deleted file mode 100644 index ec2577d2e3df..000000000000 --- a/unified/swift-syntax-rs/swift_runtime_linking.bzl +++ /dev/null @@ -1,11 +0,0 @@ -"""Expose the selected Swift toolchain's dynamic runtime to native dependents.""" - -load("@rules_swift//swift:swift.bzl", "swift_common") - -def _swift_runtime_linking_impl(ctx): - return [swift_common.get_toolchain(ctx).dynamic_runtime_cc_info] - -swift_runtime_linking = rule( - implementation = _swift_runtime_linking_impl, - toolchains = swift_common.use_toolchain(), -) From c4ac327c554e278184e4338e9b98a14c0ec02a63 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Mon, 24 Aug 2026 14:07:12 +0000 Subject: [PATCH 106/181] Publish patched rules_swift as codeql.2 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 7b8af11e-692d-4c94-87be-8cdaaf908e7c --- MODULE.bazel | 2 +- .../{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/MODULE.bazel | 2 +- .../patches/external_static_runtime.patch | 0 .../patches/register_downloaded_macos_toolchain.patch | 0 .../{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/source.json | 0 misc/bazel/registry/modules/rules_swift/metadata.json | 2 +- 6 files changed, 3 insertions(+), 3 deletions(-) rename misc/bazel/registry/modules/rules_swift/{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/MODULE.bazel (98%) rename misc/bazel/registry/modules/rules_swift/{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/patches/external_static_runtime.patch (100%) rename misc/bazel/registry/modules/rules_swift/{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/patches/register_downloaded_macos_toolchain.patch (100%) rename misc/bazel/registry/modules/rules_swift/{4.0.0-rc5-codeql.1 => 4.0.0-rc5-codeql.2}/source.json (100%) diff --git a/MODULE.bazel b/MODULE.bazel index 6184b8c49cac..17a6936f892c 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -31,7 +31,7 @@ bazel_dep(name = "gazelle", version = "0.50.0") bazel_dep(name = "rules_dotnet", version = "0.21.5-codeql.1") bazel_dep(name = "googletest", version = "1.17.0.bcr.2") bazel_dep(name = "rules_rust", version = "0.69.0") -bazel_dep(name = "rules_swift", version = "4.0.0-rc5-codeql.1") +bazel_dep(name = "rules_swift", version = "4.0.0-rc5-codeql.2") bazel_dep(name = "swift-syntax", version = "603.0.2") bazel_dep(name = "zstd", version = "1.5.7.bcr.1") diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/MODULE.bazel b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/MODULE.bazel similarity index 98% rename from misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/MODULE.bazel rename to misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/MODULE.bazel index f83ac395da02..a6b75782dc5c 100644 --- a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/MODULE.bazel +++ b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/MODULE.bazel @@ -2,7 +2,7 @@ module( name = "rules_swift", - version = "4.0.0-rc5-codeql.1", + version = "4.0.0-rc5-codeql.2", bazel_compatibility = [">=8.0.0"], compatibility_level = 3, ) diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/patches/external_static_runtime.patch similarity index 100% rename from misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/external_static_runtime.patch rename to misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/patches/external_static_runtime.patch diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/patches/register_downloaded_macos_toolchain.patch similarity index 100% rename from misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/patches/register_downloaded_macos_toolchain.patch rename to misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/patches/register_downloaded_macos_toolchain.patch diff --git a/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json b/misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/source.json similarity index 100% rename from misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.1/source.json rename to misc/bazel/registry/modules/rules_swift/4.0.0-rc5-codeql.2/source.json diff --git a/misc/bazel/registry/modules/rules_swift/metadata.json b/misc/bazel/registry/modules/rules_swift/metadata.json index 188799c9dbf9..b07a19493505 100644 --- a/misc/bazel/registry/modules/rules_swift/metadata.json +++ b/misc/bazel/registry/modules/rules_swift/metadata.json @@ -5,7 +5,7 @@ "github:bazelbuild/rules_swift" ], "versions": [ - "4.0.0-rc5-codeql.1" + "4.0.0-rc5-codeql.2" ], "yanked_versions": {} } From 5871b87fe676394bccd11db563d5ac319afb1497 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 24 Aug 2026 20:08:48 +0100 Subject: [PATCH 107/181] JS: Add a test for an unusual import syntax which is not support in any modern JS implementations, but may be supported by transpilers. --- .../extractor/tests/es2015/input/import8.js | 1 + .../tests/es2015/output/trap/import8.js.trap | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 javascript/extractor/tests/es2015/input/import8.js create mode 100644 javascript/extractor/tests/es2015/output/trap/import8.js.trap diff --git a/javascript/extractor/tests/es2015/input/import8.js b/javascript/extractor/tests/es2015/input/import8.js new file mode 100644 index 000000000000..90b02b5fc001 --- /dev/null +++ b/javascript/extractor/tests/es2015/input/import8.js @@ -0,0 +1 @@ +module Utils from "./utils"; \ No newline at end of file diff --git a/javascript/extractor/tests/es2015/output/trap/import8.js.trap b/javascript/extractor/tests/es2015/output/trap/import8.js.trap new file mode 100644 index 000000000000..3dc96cd68731 --- /dev/null +++ b/javascript/extractor/tests/es2015/output/trap/import8.js.trap @@ -0,0 +1,28 @@ +#10000=@"/import8.js;sourcefile" +files(#10000,"/import8.js") +#10001=@"/;folder" +folders(#10001,"/") +containerparent(#10001,#10000) +#10002=@"loc,{#10000},0,0,0,0" +locations_default(#10002,#10000,0,0,0,0) +hasLocation(#10000,#10002) +#20000=@"global_scope" +scopes(#20000,0) +#20001=@"script;{#10000},1,1" +toplevels(#20001,0) +#20002=@"loc,{#10000},1,1,1,1" +locations_default(#20002,#10000,1,1,1,1) +hasLocation(#20001,#20002) +#20003=* +js_parse_errors(#20003,#20001,"Error: Unexpected token","module Utils from ""./utils"";") +#20004=@"loc,{#10000},1,8,1,8" +locations_default(#20004,#10000,1,8,1,8) +hasLocation(#20003,#20004) +#20005=* +lines(#20005,#20001,"module Utils from ""./utils"";","") +#20006=@"loc,{#10000},1,1,1,28" +locations_default(#20006,#10000,1,1,1,28) +hasLocation(#20005,#20006) +numlines(#20001,1,0,0) +numlines(#10000,1,0,0) +filetype(#10000,"javascript") From df35070d0892a3466d45d230df4b2061d9e38275 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Mon, 24 Aug 2026 20:10:52 +0100 Subject: [PATCH 108/181] JS: Support an alternative syntax for imports and accept test changes. --- .../src/com/semmle/jcorn/Parser.java | 42 +++++++ .../tests/es2015/output/trap/import8.js.trap | 117 +++++++++++++++--- 2 files changed, 144 insertions(+), 15 deletions(-) diff --git a/javascript/extractor/src/com/semmle/jcorn/Parser.java b/javascript/extractor/src/com/semmle/jcorn/Parser.java index 3ae1491af10e..a248a82dd140 100644 --- a/javascript/extractor/src/com/semmle/jcorn/Parser.java +++ b/javascript/extractor/src/com/semmle/jcorn/Parser.java @@ -118,6 +118,9 @@ * 4.0.3, but does not support plugins, and always tracks full source locations. */ public class Parser { + private static final Pattern LEGACY_MODULE_IMPORT_TAIL = + Pattern.compile("\\s+[A-Za-z_$][A-Za-z0-9_$]*\\s+from\\s*['\"]"); + protected final Options options; protected final Set keywords; private final Set reservedWords, reservedWordsStrict, reservedWordsStrictBind; @@ -2718,6 +2721,18 @@ boolean isUsingDecl() { && Identifiers.isIdentifierChar(this.input.codePointAt(next), false); } + /** + * Checks for the abandoned ES6 draft namespace-import syntax: + * {@code module namespace from "module-name";}. + */ + boolean isLegacyModuleImport() { + if (this.type != TokenType.name || !this.value.equals("module")) return false; + + Matcher matcher = LEGACY_MODULE_IMPORT_TAIL.matcher(this.input); + matcher.region(this.pos, this.input.length()); + return matcher.lookingAt(); + } + /** * Parse a single statement. * @@ -2780,6 +2795,10 @@ protected Statement parseStatement(boolean declaration, boolean topLevel, Set specifiers = new ArrayList(); + specifiers.add(this.finishNode(new ImportNamespaceSpecifier(specifierLoc, local))); + return this.finishNode( + new ImportDeclaration( + loc, specifiers, source, null, ImportPhaseModifier.NONE)); + } + protected Expression parseImportOrExportAttributesAndSemicolon() { Expression result = null; if (!this.eagerlyTrySemicolon()) { diff --git a/javascript/extractor/tests/es2015/output/trap/import8.js.trap b/javascript/extractor/tests/es2015/output/trap/import8.js.trap index 3dc96cd68731..f794ba427c7e 100644 --- a/javascript/extractor/tests/es2015/output/trap/import8.js.trap +++ b/javascript/extractor/tests/es2015/output/trap/import8.js.trap @@ -9,20 +9,107 @@ hasLocation(#10000,#10002) #20000=@"global_scope" scopes(#20000,0) #20001=@"script;{#10000},1,1" +#20002=* +lines(#20002,#20001,"module Utils from ""./utils"";","") +#20003=@"loc,{#10000},1,1,1,28" +locations_default(#20003,#10000,1,1,1,28) +hasLocation(#20002,#20003) +numlines(#20001,1,1,0) +#20004=* +tokeninfo(#20004,6,#20001,0,"module") +#20005=@"loc,{#10000},1,1,1,6" +locations_default(#20005,#10000,1,1,1,6) +hasLocation(#20004,#20005) +#20006=* +tokeninfo(#20006,6,#20001,1,"Utils") +#20007=@"loc,{#10000},1,8,1,12" +locations_default(#20007,#10000,1,8,1,12) +hasLocation(#20006,#20007) +#20008=* +tokeninfo(#20008,6,#20001,2,"from") +#20009=@"loc,{#10000},1,14,1,17" +locations_default(#20009,#10000,1,14,1,17) +hasLocation(#20008,#20009) +#20010=* +tokeninfo(#20010,4,#20001,3,"""./utils""") +#20011=@"loc,{#10000},1,19,1,27" +locations_default(#20011,#10000,1,19,1,27) +hasLocation(#20010,#20011) +#20012=* +tokeninfo(#20012,8,#20001,4,";") +#20013=@"loc,{#10000},1,28,1,28" +locations_default(#20013,#10000,1,28,1,28) +hasLocation(#20012,#20013) +#20014=* +tokeninfo(#20014,0,#20001,5,"") +#20015=@"loc,{#10000},1,29,1,28" +locations_default(#20015,#10000,1,29,1,28) +hasLocation(#20014,#20015) toplevels(#20001,0) -#20002=@"loc,{#10000},1,1,1,1" -locations_default(#20002,#10000,1,1,1,1) -hasLocation(#20001,#20002) -#20003=* -js_parse_errors(#20003,#20001,"Error: Unexpected token","module Utils from ""./utils"";") -#20004=@"loc,{#10000},1,8,1,8" -locations_default(#20004,#10000,1,8,1,8) -hasLocation(#20003,#20004) -#20005=* -lines(#20005,#20001,"module Utils from ""./utils"";","") -#20006=@"loc,{#10000},1,1,1,28" -locations_default(#20006,#10000,1,1,1,28) -hasLocation(#20005,#20006) -numlines(#20001,1,0,0) -numlines(#10000,1,0,0) +hasLocation(#20001,#20003) +#20016=@"var;{Utils};{#20000}" +variables(#20016,"Utils",#20000) +#20017=@"local_type_name;{Utils};{#20000}" +local_type_names(#20017,"Utils",#20000) +#20018=@"local_namespace_name;{Utils};{#20000}" +local_namespace_names(#20018,"Utils",#20000) +variables(#20016,"Utils",#20000) +local_type_names(#20017,"Utils",#20000) +local_namespace_names(#20018,"Utils",#20000) +#20019=@"var;{this};{#20000}" +variables(#20019,"this",#20000) +#20020=* +stmts(#20020,27,#20001,0,"module ... utils"";") +hasLocation(#20020,#20003) +stmt_containers(#20020,#20001) +#20021=* +exprs(#20021,4,#20020,-1,"""./utils""") +hasLocation(#20021,#20011) +enclosing_stmt(#20021,#20020) +expr_containers(#20021,#20001) +literals("./utils","""./utils""",#20021) +#20022=* +regexpterm(#20022,1,#20021,0,"./utils") +#20023=@"loc,{#10000},1,20,1,26" +locations_default(#20023,#10000,1,20,1,26) +hasLocation(#20022,#20023) +#20024=* +regexpterm(#20024,12,#20022,0,".") +#20025=@"loc,{#10000},1,20,1,20" +locations_default(#20025,#10000,1,20,1,20) +hasLocation(#20024,#20025) +#20026=* +regexpterm(#20026,14,#20022,1,"/utils") +#20027=@"loc,{#10000},1,21,1,26" +locations_default(#20027,#10000,1,21,1,26) +hasLocation(#20026,#20027) +regexp_const_value(#20026,"/utils") +#20028=* +exprs(#20028,85,#20020,0,"Utils f ... utils"";") +#20029=@"loc,{#10000},1,8,1,28" +locations_default(#20029,#10000,1,8,1,28) +hasLocation(#20028,#20029) +enclosing_stmt(#20028,#20020) +expr_containers(#20028,#20001) +#20030=* +exprs(#20030,78,#20028,1,"Utils") +hasLocation(#20030,#20007) +enclosing_stmt(#20030,#20020) +expr_containers(#20030,#20001) +literals("Utils","Utils",#20030) +decl(#20030,#20016) +typedecl(#20030,#20017) +namespacedecl(#20030,#20018) +#20031=* +entry_cfg_node(#20031,#20001) +#20032=@"loc,{#10000},1,1,1,0" +locations_default(#20032,#10000,1,1,1,0) +hasLocation(#20031,#20032) +#20033=* +exit_cfg_node(#20033,#20001) +hasLocation(#20033,#20015) +successor(#20020,#20033) +successor(#20028,#20020) +successor(#20031,#20028) +numlines(#10000,1,1,0) filetype(#10000,"javascript") From 61ec80f678dca05da116b3d8db15ebb3081efcd3 Mon Sep 17 00:00:00 2001 From: JarLob Date: Mon, 24 Aug 2026 22:17:34 +0300 Subject: [PATCH 109/181] Improve performance --- .../semmle/code/csharp/frameworks/microsoft/AspNetCore.qll | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll index a7f7c4f3e1d0..abdd81646828 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll @@ -220,6 +220,8 @@ private predicate isPotentialMicrosoftAspNetCoreMvcController(Class controller) ) } +bindingset[element] +pragma[inline_late] private Compilation getACompilationFor(Element element) { result.getAFileCompiled() = element.getFile() } @@ -351,7 +353,7 @@ private predicate isMicrosoftAspNetCoreMvcFallbackEndpointMapping(MethodCall cal private predicate hasMicrosoftAspNetCoreMvcEndpointMapping(Compilation application, Class controller) { isInMicrosoftAspNetCoreMvcApplication(controller, application) and exists(MethodCall mapping | - application.getAFileCompiled() = mapping.getFile() and + application = getACompilationFor(mapping) and ( isMicrosoftAspNetCoreMvcConventionalEndpointMapping(mapping) or From ff5a248b98103243f88c9d764763dbd4b19a8986 Mon Sep 17 00:00:00 2001 From: John Zabroski Date: Mon, 24 Aug 2026 18:34:12 -0400 Subject: [PATCH 110/181] Correct 'enable' to 'enabled' in ASP.NET example --- .../CWE-548/ASPNetDirectoryListing.qhelp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.qhelp b/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.qhelp index f078ff574058..e03cf21a96f0 100644 --- a/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.qhelp +++ b/csharp/ql/src/Security Features/CWE-548/ASPNetDirectoryListing.qhelp @@ -21,13 +21,13 @@ If this configuration may be used in production, remove the directoryBrows

    -The following example shows the directoryBrowse enable attribute set to true in a Web.config file for ASP.NET: +The following example shows the directoryBrowse enabled attribute set to true in a Web.config file for ASP.NET:

    -To fix this problem, the enable attribute should be set to false, or the directoryBrowse element should be removed completely: +To fix this problem, the enabled attribute should be set to false, or the directoryBrowse element should be removed completely:

    @@ -36,8 +36,8 @@ To fix this problem, the enable attribute should be set to fa
  • -MSDN: -directoryBrowse element. +Microsoft Learn: +directoryBrowse element.
  • From c23b3a9e03c5ddbbd90e168225f99facb996fe6f Mon Sep 17 00:00:00 2001 From: John Zabroski Date: Mon, 24 Aug 2026 18:37:25 -0400 Subject: [PATCH 111/181] Fix typo in directoryBrowse attribute --- csharp/ql/src/Security Features/CWE-548/Web.config.bad | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/ql/src/Security Features/CWE-548/Web.config.bad b/csharp/ql/src/Security Features/CWE-548/Web.config.bad index 24f547103f82..172f4c9aa656 100644 --- a/csharp/ql/src/Security Features/CWE-548/Web.config.bad +++ b/csharp/ql/src/Security Features/CWE-548/Web.config.bad @@ -1,7 +1,7 @@ - + ... - \ No newline at end of file + From ada881e5460a777fb15a321efd640f16c1796a7b Mon Sep 17 00:00:00 2001 From: John Zabroski Date: Mon, 24 Aug 2026 18:37:38 -0400 Subject: [PATCH 112/181] Fix directoryBrowse attribute from 'enable' to 'enabled' --- csharp/ql/src/Security Features/CWE-548/Web.config.good | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/csharp/ql/src/Security Features/CWE-548/Web.config.good b/csharp/ql/src/Security Features/CWE-548/Web.config.good index 5c0566153c64..76ba2eb597d7 100644 --- a/csharp/ql/src/Security Features/CWE-548/Web.config.good +++ b/csharp/ql/src/Security Features/CWE-548/Web.config.good @@ -1,7 +1,7 @@ - + ... - \ No newline at end of file + From 7f4324512a4f92281368c4114e4e271009460b4f Mon Sep 17 00:00:00 2001 From: John Zabroski Date: Mon, 24 Aug 2026 19:09:01 -0400 Subject: [PATCH 113/181] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- csharp/ql/src/Security Features/CWE-548/Web.config.good | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/src/Security Features/CWE-548/Web.config.good b/csharp/ql/src/Security Features/CWE-548/Web.config.good index 76ba2eb597d7..b2d3258c5d05 100644 --- a/csharp/ql/src/Security Features/CWE-548/Web.config.good +++ b/csharp/ql/src/Security Features/CWE-548/Web.config.good @@ -3,5 +3,5 @@ ... - + From 748fbc7a11830dab9b9c9ca0700949c59ee5f634 Mon Sep 17 00:00:00 2001 From: John Zabroski Date: Mon, 24 Aug 2026 19:11:19 -0400 Subject: [PATCH 114/181] Fix closing tag --- csharp/ql/src/Security Features/CWE-548/Web.config.bad | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/csharp/ql/src/Security Features/CWE-548/Web.config.bad b/csharp/ql/src/Security Features/CWE-548/Web.config.bad index 172f4c9aa656..0d579a8d9a06 100644 --- a/csharp/ql/src/Security Features/CWE-548/Web.config.bad +++ b/csharp/ql/src/Security Features/CWE-548/Web.config.bad @@ -3,5 +3,5 @@ ... - + From 3cf499f3d439088c6d42c84653a5ca0ddb2bcd23 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:12:31 +0200 Subject: [PATCH 115/181] unified: Rename TExportedNamespace -> TStaticMemberNamespace Originally this node was intended to cover TopLevels as well, but things evolved differently, and this name works better since it's only for classes. --- .../unified/internal/StaticNameBinding.qll | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index dcb97b4fbae8..38430dce1a01 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -10,7 +10,7 @@ private newtype TNameBindingNode = TIdentifier(Identifier n) or TBulkImport(BulkImportingPattern p) or TLocalName(LocalName local) or - TExportedNamespace(ClassLikeDeclaration cls) or + TStaticMemberNamespace(ClassLikeDeclaration cls) or TLocalNamespace(AstNode n) { n = any(TopLevel t).getBody() or // Imported names come in scope here n instanceof ClassLikeDeclaration @@ -31,8 +31,8 @@ class NameBindingNode extends TNameBindingNode { predicate isLocalName(LocalName local) { this = TLocalName(local) } - /** Holds if this represents the set of static members available in the given namespace. */ - predicate isExportedNamespace(ClassLikeDeclaration cls) { this = TExportedNamespace(cls) } + /** Holds if this represents the set of static members available in the given class. */ + predicate isStaticMemberNamespace(ClassLikeDeclaration cls) { this = TStaticMemberNamespace(cls) } /** Holds if this represents the set of members that can be accessed unqualified within the given scope. */ predicate isLocalNamespace(AstNode n) { this = TLocalNamespace(n) } @@ -56,7 +56,7 @@ class NameBindingNode extends TNameBindingNode { or this.isBulkImport(result) or - this.isExportedNamespace(result) + this.isStaticMemberNamespace(result) or this.isLocalNamespace(result) or @@ -71,7 +71,7 @@ class NameBindingNode extends TNameBindingNode { exists(LocalName local | this.isLocalName(local) and result = "LocalName(" + local + ")") or exists(ClassLikeDeclaration cls | - this.isExportedNamespace(cls) and result = "ExportedNamespace(" + cls + ")" + this.isStaticMemberNamespace(cls) and result = "StaticMemberNamespace(" + cls + ")" ) or exists(AstNode n | this.isLocalNamespace(n) and result = "LocalNamespace(" + n + ")") @@ -92,7 +92,9 @@ class NameBindingNode extends TNameBindingNode { or exists(LocalName local | this.isLocalName(local) and result = local.getLocation()) or - exists(ClassLikeDeclaration cls | this.isExportedNamespace(cls) and result = cls.getLocation()) + exists(ClassLikeDeclaration cls | + this.isStaticMemberNamespace(cls) and result = cls.getLocation() + ) or exists(AstNode n | this.isLocalNamespace(n) and result = n.getLocation()) or @@ -162,7 +164,7 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { nameDecl.getDeclaration() = member and node1.isIdentifier(nameDecl) and name = nameDecl.getName() and - node2.isExportedNamespace(cls) + node2.isStaticMemberNamespace(cls) ) or exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | @@ -195,12 +197,12 @@ predicate valueStep(NameBindingNode node1, NameBindingNode node2) { ) or exists(ClassLikeDeclaration cls | - node1.isExportedNamespace(cls) and + node1.isStaticMemberNamespace(cls) and node2.isIdentifier(cls.getName()) ) or exists(ClassLikeDeclaration cls | - node1.isExportedNamespace(cls) and + node1.isStaticMemberNamespace(cls) and node2.isLocalNamespace(cls) ) or @@ -249,7 +251,7 @@ predicate inheritanceStep(NameBindingNode supertype, NameBindingNode subtype) { exists(ClassLikeDeclaration cls, BaseType base | base = cls.getABaseType() and supertype = getNodeFromRef(base.getType()) and - subtype.isExportedNamespace(cls) + subtype.isStaticMemberNamespace(cls) ) } From cd0afb9380d84da5f36658460e7de552474b8764 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:13:33 +0200 Subject: [PATCH 116/181] unified: Add TInstanceMemberNamespace --- .../codeql/unified/internal/StaticNameBinding.qll | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 38430dce1a01..e5664ab53866 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -11,6 +11,7 @@ private newtype TNameBindingNode = TBulkImport(BulkImportingPattern p) or TLocalName(LocalName local) or TStaticMemberNamespace(ClassLikeDeclaration cls) or + TInstanceMemberNamespace(ClassLikeDeclaration cls) or TLocalNamespace(AstNode n) { n = any(TopLevel t).getBody() or // Imported names come in scope here n instanceof ClassLikeDeclaration @@ -34,6 +35,11 @@ class NameBindingNode extends TNameBindingNode { /** Holds if this represents the set of static members available in the given class. */ predicate isStaticMemberNamespace(ClassLikeDeclaration cls) { this = TStaticMemberNamespace(cls) } + /** Holds if this represents the set of instance members available in the given class. */ + predicate isInstanceMemberNamespace(ClassLikeDeclaration cls) { + this = TInstanceMemberNamespace(cls) + } + /** Holds if this represents the set of members that can be accessed unqualified within the given scope. */ predicate isLocalNamespace(AstNode n) { this = TLocalNamespace(n) } @@ -74,6 +80,10 @@ class NameBindingNode extends TNameBindingNode { this.isStaticMemberNamespace(cls) and result = "StaticMemberNamespace(" + cls + ")" ) or + exists(ClassLikeDeclaration cls | + this.isInstanceMemberNamespace(cls) and result = "InstanceMemberNamespace(" + cls + ")" + ) + or exists(AstNode n | this.isLocalNamespace(n) and result = "LocalNamespace(" + n + ")") or exists(ModuleScopeRepr repr | @@ -96,6 +106,10 @@ class NameBindingNode extends TNameBindingNode { this.isStaticMemberNamespace(cls) and result = cls.getLocation() ) or + exists(ClassLikeDeclaration cls | + this.isInstanceMemberNamespace(cls) and result = cls.getLocation() + ) + or exists(AstNode n | this.isLocalNamespace(n) and result = n.getLocation()) or exists(ModuleScopeRepr repr | this.isModuleScopeNode(repr) and result = repr.getLocation()) From 40a029191400cd61203686f98b39e5a1ad43b261 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:13:52 +0200 Subject: [PATCH 117/181] unified: Store instance members in the new node --- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index e5664ab53866..12f463c89b35 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -173,12 +173,15 @@ predicate readStep(NameBindingNode node1, string name, NameBindingNode node2) { predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { exists(ClassLikeDeclaration cls, Member member, NameDeclaration nameDecl | member = cls.getAMember() and - not isInstanceMember(member) and not isPrivateToLocalScope(nameDecl) and nameDecl.getDeclaration() = member and node1.isIdentifier(nameDecl) and name = nameDecl.getName() and - node2.isStaticMemberNamespace(cls) + ( + if isInstanceMember(member) + then node2.isInstanceMemberNamespace(cls) + else node2.isStaticMemberNamespace(cls) + ) ) or exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | From 2bc839d6d5f65df6be396c41f9c107a7c1e8c48a Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:18:09 +0200 Subject: [PATCH 118/181] unified: Add inheritance between instance namespaces --- .../unified/internal/StaticNameBinding.qll | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 12f463c89b35..84451f23e179 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -327,8 +327,27 @@ class NamespaceNode extends NameBindingNode { /** Holds if this namespace has an own-member of the given name */ predicate hasOwnMember(string name) { exists(this.getOwnMember(name)) } + /** If this is the static namespace for a class, gets the corresponding instance namespace. */ + NamespaceNode toInstanceNamespace() { + exists(ClassLikeDeclaration cls | + this.isStaticMemberNamespace(cls) and + result.isInstanceMemberNamespace(cls) + ) + } + + /** If this is the instance namespace for a class, gets the corresponding static namespace. */ + NamespaceNode toStaticNamespace() { result.toInstanceNamespace() = this } + + private NamespaceNode getAnInheritanceParent1() { inheritanceStep(result.ref(), this) } + /** Gets a namespace from which this namespace inherits directly. */ - NamespaceNode getAnInheritanceParent() { inheritanceStep(result.ref(), this) } + NamespaceNode getAnInheritanceParent() { + result = this.getAnInheritanceParent1() + or + // `inheritanceStep` connects the static namespaces of classes. + // Add the corresponding inheritance relation between the instance namespaces. + result = this.toStaticNamespace().getAnInheritanceParent1().toInstanceNamespace() + } /** Gets a namespace that directly inherits from this one. */ NamespaceNode getAnInheritanceChild() { result.getAnInheritanceParent() = this } From 5b31814c8e787ffc8c98e772332ca8be224bf55b Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:20:16 +0200 Subject: [PATCH 119/181] unified: Ensure member-namespaces are always NamespaceNodes Avoids surprising edges cases when a class has no instance/static members --- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 84451f23e179..f1253fbb92a3 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -316,7 +316,12 @@ private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode no /** A name-binding node that has members. */ class NamespaceNode extends NameBindingNode { - NamespaceNode() { storeStep(_, _, this) or inheritanceStep(_, this) } + NamespaceNode() { + storeStep(_, _, this) or + inheritanceStep(_, this) or + this.isInstanceMemberNamespace(_) or + this.isStaticMemberNamespace(_) + } /** Gets a name-binding node that may refer to this namespace. */ NameBindingNode ref() { result = TrackNamespace::track(this) } From 981fc4d9bd4be8886d070b3f868b3b4e80c827e6 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:21:27 +0200 Subject: [PATCH 120/181] unified: Add language hook for inheritance restriction --- .../unified/internal/NameBindingPlugin.qll | 27 +++++++++++++++++++ .../internal/NameBindingPluginSwift.qll | 6 +++++ .../unified/internal/StaticNameBinding.qll | 12 ++++++++- 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll index a0a7028dfe92..a3b4ce6f7ff8 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll @@ -25,6 +25,15 @@ class NameBindingPlugin extends Unit { */ bindingset[member, binding] predicate isPrivateToLocalScope(Stmt member, AstNode binding) { none() } + + /** + * Holds if `member` can be inherited by subclasses of `cls`. + * + * The caller has already restricted `member` to be a member of `cls`, and + * ensured that `member` is a `VariableDeclaration` or `FunctionDeclaration`. + */ + bindingset[cls, member] + predicate isInheritableMember(ClassLikeDeclaration cls, Member member) { none() } } /** Holds if `member` is an instance member. */ @@ -35,6 +44,24 @@ predicate isInstanceMember(Member member) { ) } +/** + * Holds if `member` is a non-instance member declared in the context of a class or top-level. + */ +predicate isStaticMember(Member member) { + exists(ClassLikeDeclaration cls | cls.getAMember() = member | + not any(NameBindingPlugin p).isInstanceMember(cls, member) + ) + or + member = any(TopLevel t).getBody().getAStmt() +} + +/** Holds if `member` is an inheritable member. */ +predicate isInheritableMember(Member member) { + exists(ClassLikeDeclaration cls | cls.getAMember() = member | + any(NameBindingPlugin p).isInheritableMember(cls, member) + ) +} + /** Holds if `binding` is only visible in its local scope. */ pragma[nomagic] predicate isPrivateToLocalScope(AstNode binding) { diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll index eaa8f46c65f4..329246f4474d 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPluginSwift.qll @@ -29,6 +29,12 @@ class NameBindingPluginSwift extends NameBindingPlugin { // Note: Private class members can be seen within type-extensions in the same file, // so we can't declare those private to their local scope. } + + bindingset[cls, member] + override predicate isInheritableMember(ClassLikeDeclaration cls, Member member) { + exists(cls) and + not member.hasModifier("private") + } } private predicate predefinedSourceFolders(string folder, int ordering) { diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index f1253fbb92a3..b4ad8a02f8f4 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -314,6 +314,15 @@ private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode no ) } +/** Holds if the member represented by `node` cannot be inherited. */ +pragma[nomagic] +private predicate isInheritableMemberNode(NameBindingNode node) { + exists(NameDeclaration decl | + node.isIdentifier(decl) and + isInheritableMember(decl.getDeclaration()) + ) +} + /** A name-binding node that has members. */ class NamespaceNode extends NameBindingNode { NamespaceNode() { @@ -363,7 +372,8 @@ class NamespaceNode extends NameBindingNode { result = this.getOwnMember(name) or not this.hasOwnMember(name) and - result = this.getAnInheritanceParent().getMember(name) + result = this.getAnInheritanceParent().getMember(name) and + isInheritableMemberNode(result) } } From 2b28f759d04375e5035477565dfcdc555c43f88c Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:26:01 +0200 Subject: [PATCH 121/181] unified: Expose handling of unqualified member accesses UnqualifiedMemberAccess might go into Public one day --- .../lib/codeql/unified/internal/FacadeAst.qll | 7 ++ .../unified/internal/StaticNameBinding.qll | 81 +++++++++++++++++++ 2 files changed, 88 insertions(+) diff --git a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll index cb00bae7eeca..44adef76e425 100644 --- a/unified/ql/lib/codeql/unified/internal/FacadeAst.qll +++ b/unified/ql/lib/codeql/unified/internal/FacadeAst.qll @@ -30,6 +30,13 @@ module Unified { not this instanceof ClassLikeDeclaration and result = this.getParent().getEnclosingClass() } + + /** Gets the depth of this node in the AST. The root node has a depth of 0. */ + int getDepth() { + not exists(this.getParent()) and result = 0 + or + result = this.getParent().getDepth() + 1 + } } /** An expression */ diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index b4ad8a02f8f4..ea331b1e8a35 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -559,3 +559,84 @@ private module FolderHeuristic { ) } } + +/** + * Holds if `access` may resolve to `target` through the enclosing `accessingClass`. + * + * `instanceAccess` indicates if this this member should be accessed as an instance of `accessingClass` + * or as a static member. + */ +private predicate unqualifiedMemberAccessCand( + PotentialLocalNameAccess access, boolean instanceAccess, NameDeclaration target, + ClassLikeDeclaration accessingClass +) { + not access instanceof NameDeclaration and + ( + // Resolved by local scoping + exists(LocalName local | + target.getLocalName() = local and + access.getLocalName() = local and + target.getDeclaration() = accessingClass.getAMember() + | + instanceAccess = true and + isInstanceMember(target.getDeclaration()) + or + instanceAccess = false and + isStaticMember(target.getDeclaration()) + ) + or + // Resolved in an uncertain scope + exists(NamespaceNode namespace, string name | + name = access.getName() and + accessingClass = LocalNameBindingOutput::getAnUncertainScope(access, name) + | + instanceAccess = true and + namespace.isInstanceMemberNamespace(accessingClass) and + namespace.getMember(name).isIdentifier(target) + or + instanceAccess = false and + namespace.isStaticMemberNamespace(accessingClass) and + namespace.getMember(name).isIdentifier(target) + ) + ) +} + +private int unqualifiedMemberAccessDepth(PotentialLocalNameAccess access) { + result = max(AstNode scope | unqualifiedMemberAccessCand(access, _, _, scope) | scope.getDepth()) +} + +/** + * Holds if `access` is an unqualified access to `target`. + * + * `accessingClass` is the enclosing class in which the member was found, and + * `instanceAccess` indicates if it is an instance member or static member. + */ +predicate unqualifiedMemberAccess( + PotentialLocalNameAccess access, boolean instanceAccess, NameDeclaration target, + ClassLikeDeclaration accessingClass +) { + unqualifiedMemberAccessCand(access, instanceAccess, target, accessingClass) and + accessingClass.getDepth() = unqualifiedMemberAccessDepth(access) +} + +/** + * An identifier appearing in a unqualified position, referring to a member of an enclosing class. + */ +class UnqualifiedMemberAccess extends Identifier { + private boolean instanceAccess; + private NameDeclaration target; + private ClassLikeDeclaration accessingClass; + + UnqualifiedMemberAccess() { + unqualifiedMemberAccess(this, instanceAccess, target, accessingClass) + } + + /** Gets the name declaration of the member being accessed. */ + NameDeclaration getTarget() { result = target } + + /** Gets the enclosing class whose (possibly inherited) member is being accessed. */ + ClassLikeDeclaration getAccessingClass() { result = accessingClass } + + /** Holds if this is an instance access on the accessing class. */ + predicate isInstanceAccess() { instanceAccess = true } +} From b1ca110785038713cc394a750596baa260efd34c Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:26:37 +0200 Subject: [PATCH 122/181] unified: Add getStaticBindingTarget --- unified/ql/lib/codeql/Definitions.qll | 2 +- .../codeql/unified/internal/StaticNameBinding.qll | 10 ++++++++++ .../implicit-instance-field-access.swift | 13 +++++++++++++ .../test/library-tests/static-name-binding/test.ql | 2 +- .../static-name-binding/unqualified-access.swift | 2 +- 5 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 unified/ql/test/library-tests/static-name-binding/implicit-instance-field-access.swift diff --git a/unified/ql/lib/codeql/Definitions.qll b/unified/ql/lib/codeql/Definitions.qll index 927119530401..3eb6ddcef102 100644 --- a/unified/ql/lib/codeql/Definitions.qll +++ b/unified/ql/lib/codeql/Definitions.qll @@ -10,7 +10,7 @@ private import codeql.unified.internal.StaticNameBinding */ cached predicate definitionOf(Identifier reference, NameDeclaration definition, string kind) { - reference = trackNameDeclaration(definition).asIdentifier() and + definition = getStaticBindingTarget(reference) and not reference instanceof NameDeclaration and kind = "name" } diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index ea331b1e8a35..b38d405b165d 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -640,3 +640,13 @@ class UnqualifiedMemberAccess extends Identifier { /** Holds if this is an instance access on the accessing class. */ predicate isInstanceAccess() { instanceAccess = true } } + +/** Gets the declaration being accessed by `access`, as determined by static name binding. */ +NameDeclaration getStaticBindingTarget(Identifier access) { + // For unqualified accesses, use the shadowing-aware lookup + result = access.(UnqualifiedMemberAccess).getTarget() + or + // For others, just follow the name binding graph + not access instanceof UnqualifiedMemberAccess and + trackNameDeclaration(result).asIdentifier() = access +} diff --git a/unified/ql/test/library-tests/static-name-binding/implicit-instance-field-access.swift b/unified/ql/test/library-tests/static-name-binding/implicit-instance-field-access.swift new file mode 100644 index 000000000000..6bdf2c0669aa --- /dev/null +++ b/unified/ql/test/library-tests/static-name-binding/implicit-instance-field-access.swift @@ -0,0 +1,13 @@ +private class A { + let x = 123 // name=A.instance.x + + func getX() { + return x // $ access=A.instance.x + } +} + +private class B : A { // $ access=A + func getX2() { + return x // $ access=A.instance.x + } +} diff --git a/unified/ql/test/library-tests/static-name-binding/test.ql b/unified/ql/test/library-tests/static-name-binding/test.ql index a1e49ce0609c..e6dd7e64f6b3 100644 --- a/unified/ql/test/library-tests/static-name-binding/test.ql +++ b/unified/ql/test/library-tests/static-name-binding/test.ql @@ -8,7 +8,7 @@ module StaticDeclAccess implements TestSig { predicate hasActualResult(Location location, string element, string tag, string value) { exists(NameDeclaration decl, Identifier access | - access = trackNameDeclaration(decl).asIdentifier() and + decl = getStaticBindingTarget(access) and not access instanceof NameDeclaration and location = access.getLocation() and element = access.toString() and diff --git a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift index 86cadc0b7a1f..434dd0dc8ac1 100644 --- a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift +++ b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift @@ -10,7 +10,7 @@ class ASub : A { // $ access=A class BSub : B { // $ access=A.B let x3: B = nil; // $ access=A.B - let x4: C = nil; // $ access=A.B.C SPURIOUS: access=Target3.C // spurious result from folder-based heuristic + let x4: C = nil; // $ access=A.B.C // spurious result from folder-based heuristic } class BSub2 : B { // $ access=A.B From fa36a114ae33aa01114a40f34094912ea2c2c7d1 Mon Sep 17 00:00:00 2001 From: Asger F Date: Tue, 25 Aug 2026 09:43:33 +0200 Subject: [PATCH 123/181] unified: Sharpen set of candidates when measuring static name binding --- .../unified/internal/AnalysisQuality.qll | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index a10257ed8326..f2a7acabf41f 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -6,12 +6,45 @@ private import codeql.unified.internal.NameBindingPlugin /** Stats about identifiers that static name binding could resolve. */ module StaticNameResolutionStats implements EntityStatsSig { + /** + * Holds if `name` has been positively identified as something that refer to a value, and static name binding + * is thus not expected to resolve its members. + */ + private predicate resolvesToValue(Identifier name) { + exists(AstNode decl | + decl = getStaticBindingTarget(name).getDeclaration() and + not decl instanceof ClassLikeDeclaration and + not decl instanceof TypeAliasDeclaration and + not decl instanceof TypeParameter and + not decl instanceof AssociatedTypeDeclaration + ) + } + + /** + * Holds if name-binding for `expr` depends on type inference, and is thus not subject to static name binding. + * + * Usually this holds for qualified instance member accesses (`foo().x`) and leading-dot expressions (`.x`). + */ + private predicate memberAccessDependsOnTypeInference(MemberAccessExpr expr) { + exists(Expr base | base = expr.getBase() | + // Base expression resolves to a value, e.g. a field, variable, or function (for languages where functions are values). + resolvesToValue(getIdentifierFromRef(base)) + or + // Base expression is of a kind that is not subject to static name resolution, e.g. `foo().x` + not exists(getIdentifierFromRef(base)) + or + // Base expression is a confirmed to depend on type inference + memberAccessDependsOnTypeInference(base) + ) + } + class Candidate extends Identifier { Candidate() { - this = getIdentifierFromRef(_) and + exists(AstNode ref | + this = getIdentifierFromRef(ref) and + not memberAccessDependsOnTypeInference(ref) + ) and not this instanceof NameDeclaration - // TODO: exclude names we know are not static references, e.g. unqualified instance-field access, - // currently blocked on getting static name binding to report this information. } NameBindingNode getTarget() { From 4641bdc13e7bee6390bb73c5ac6e0b1a49f9884d Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 25 Aug 2026 13:06:42 +0200 Subject: [PATCH 124/181] Ruby: Deprecate getAControlFlowNode. --- ruby/ql/lib/codeql/ruby/ast/Call.qll | 2 +- ruby/ql/lib/codeql/ruby/ast/Statement.qll | 8 ++++++-- .../lib/codeql/ruby/ast/internal/Constant.qll | 20 +++++++++---------- .../lib/codeql/ruby/dataflow/FlowSummary.qll | 4 ++-- ruby/ql/src/queries/analysis/Definitions.ql | 2 +- .../src/queries/variables/DeadStoreOfLocal.ql | 2 +- .../queries/variables/UninitializedLocal.ql | 2 +- 7 files changed, 22 insertions(+), 18 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/ast/Call.qll b/ruby/ql/lib/codeql/ruby/ast/Call.qll index 10b23b22d55c..1a3b9c757c61 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Call.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Call.qll @@ -63,7 +63,7 @@ class Call extends Expr instanceof CallImpl { TCfgScope(result) = viableCallableLambda(c, _) ) or - result = getTarget(TNormalCall(this.getAControlFlowNode())) + result = getTarget(TNormalCall(this.getControlFlowNode())) } override AstNode getAChild(string pred) { diff --git a/ruby/ql/lib/codeql/ruby/ast/Statement.qll b/ruby/ql/lib/codeql/ruby/ast/Statement.qll index 0081fd5d593e..4174f45d1282 100644 --- a/ruby/ql/lib/codeql/ruby/ast/Statement.qll +++ b/ruby/ql/lib/codeql/ruby/ast/Statement.qll @@ -16,8 +16,12 @@ class Stmt extends AstNode, TStmt { /** Gets the control-flow node for this statement, if any. */ ControlFlowNode getControlFlowNode() { result.injects(this) } - /** Gets a control-flow node for this statement, if any. */ - CfgNodes::AstCfgNode getAControlFlowNode() { result.getAstNode() = this } + /** + * DEPRECATED: Use `getControlFlowNode()` instead. + * + * Gets a control-flow node for this statement, if any. + */ + deprecated CfgNodes::AstCfgNode getAControlFlowNode() { result.getAstNode() = this } /** Gets the control-flow scope of this statement, if any. */ CfgScope getCfgScope() { result = getEnclosingCallable(this) } diff --git a/ruby/ql/lib/codeql/ruby/ast/internal/Constant.qll b/ruby/ql/lib/codeql/ruby/ast/internal/Constant.qll index 6fdcdc894182..7c935391ace2 100644 --- a/ruby/ql/lib/codeql/ruby/ast/internal/Constant.qll +++ b/ruby/ql/lib/codeql/ruby/ast/internal/Constant.qll @@ -95,7 +95,7 @@ private module Propagation { or isIntExpr(e.(ConstantReadAccess).getValue(), i) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isInt(n, i)) + isInt(e.getControlFlowNode(), i) } predicate isFloat(ExprCfgNode e, float f) { @@ -153,7 +153,7 @@ private module Propagation { or isFloatExpr(e.(ConstantReadAccess).getValue(), f) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isFloat(n, f)) + isFloat(e.getControlFlowNode(), f) } predicate isRational(ExprCfgNode e, int numerator, int denominator) { @@ -175,7 +175,7 @@ private module Propagation { or isRationalExpr(e.(ConstantReadAccess).getValue(), numerator, denominator) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isRational(n, numerator, denominator)) + isRational(e.getControlFlowNode(), numerator, denominator) } predicate isComplex(ExprCfgNode e, float real, float imaginary) { @@ -197,7 +197,7 @@ private module Propagation { or isComplexExpr(e.(ConstantReadAccess).getValue(), real, imaginary) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isComplex(n, real, imaginary)) + isComplex(e.getControlFlowNode(), real, imaginary) } overlay[local] @@ -309,7 +309,7 @@ private module Propagation { or isStringExpr(e.(ConstantReadAccess).getValue(), s) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isString(n, s)) + isString(e.getControlFlowNode(), s) } predicate isSymbol(ExprCfgNode e, string s) { @@ -334,7 +334,7 @@ private module Propagation { or isSymbolExpr(e.(ConstantReadAccess).getValue(), s) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isSymbol(n, s)) + isSymbol(e.getControlFlowNode(), s) } predicate isRegExp(ExprCfgNode e, string s, string flags) { @@ -359,7 +359,7 @@ private module Propagation { or isRegExpExpr(e.(ConstantReadAccess).getValue(), s, flags) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isRegExp(n, s, flags)) + isRegExp(e.getControlFlowNode(), s, flags) } predicate isBoolean(ExprCfgNode e, boolean b) { @@ -381,7 +381,7 @@ private module Propagation { or isBooleanExpr(e.(ConstantReadAccess).getValue(), b) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isBoolean(n, b)) + isBoolean(e.getControlFlowNode(), b) } predicate isNil(ExprCfgNode e) { @@ -403,7 +403,7 @@ private module Propagation { or isNilExpr(e.(ConstantReadAccess).getValue()) or - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isNil(n)) + isNil(e.getControlFlowNode()) } } @@ -566,7 +566,7 @@ private predicate isArrayExpr(Expr e, ArrayLiteralCfgNode arr) { // control flow paths. // Note(hmac): I don't think this is necessary, as `getSource` will not return // results if the source is a phi node. - forex(ExprCfgNode n | n = e.getAControlFlowNode() | isArrayConstant(n, arr)) + isArrayConstant(e.getControlFlowNode(), arr) or // if `e` is an array, then `e.freeze` is also an array e.(MethodCall).getMethodName() = "freeze" and diff --git a/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll b/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll index 3ec9a9d87dc5..2a24b9edad0b 100644 --- a/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll +++ b/ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll @@ -106,10 +106,10 @@ private module LibraryCallbackSummaries { LibraryLambdaMethod() { this = "" } final override MethodCall getACall() { - libraryCall(result.getAControlFlowNode()) and + libraryCall(result.getControlFlowNode()) and result.hasBlock() or - libraryCallHasLambdaArg(result.getAControlFlowNode(), _) + libraryCallHasLambdaArg(result.getControlFlowNode(), _) } override predicate propagatesFlow( diff --git a/ruby/ql/src/queries/analysis/Definitions.ql b/ruby/ql/src/queries/analysis/Definitions.ql index a1a0d6b258b3..6adabe79fc58 100644 --- a/ruby/ql/src/queries/analysis/Definitions.ql +++ b/ruby/ql/src/queries/analysis/Definitions.ql @@ -43,7 +43,7 @@ newtype DefLoc = meth = call.getATarget() or // include implicit `initialize` calls - meth = getInitializeTarget(call.getAControlFlowNode()) + meth = getInitializeTarget(call.getControlFlowNode()) } or /** A local variable. */ LocalVariableLoc(VariableReadAccess read, VariableWriteAccess write) { diff --git a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql index 70d3191b8a72..428e83ca9061 100644 --- a/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql +++ b/ruby/ql/src/queries/variables/DeadStoreOfLocal.ql @@ -44,6 +44,6 @@ class RelevantLocalVariableWriteAccess extends LocalVariableWriteAccess { from RelevantLocalVariableWriteAccess write, LocalVariable v where v = write.getVariable() and - exists(write.getAControlFlowNode()) and + exists(write.getControlFlowNode()) and not exists(Ssa::WriteDefinition def | def.getWriteAccess().getAstNode() = write) select write, "This assignment to $@ is useless, since its value is never read.", v, v.getName() diff --git a/ruby/ql/src/queries/variables/UninitializedLocal.ql b/ruby/ql/src/queries/variables/UninitializedLocal.ql index 2f5a4b875aa1..bb602d4a9686 100644 --- a/ruby/ql/src/queries/variables/UninitializedLocal.ql +++ b/ruby/ql/src/queries/variables/UninitializedLocal.ql @@ -49,7 +49,7 @@ private predicate isInBooleanContext(AstNode n) { private predicate isGuarded(LocalVariableReadAccess read) { exists(AstCfgNode guard, boolean branch | - Guards::guardControlsBlock(guard, read.getAControlFlowNode().getBasicBlock(), branch) + Guards::guardControlsBlock(guard, read.getControlFlowNode().getBasicBlock(), branch) | // guard is `var` guard.getAstNode() = read.getVariable().getAnAccess() and From ac0438f48a37c45ac3ffd5ecf1b425a12b3be9ce Mon Sep 17 00:00:00 2001 From: Anders Schack-Mulligen Date: Tue, 25 Aug 2026 13:19:46 +0200 Subject: [PATCH 125/181] Ruby: Address review comments. --- .../ruby/controlflow/ControlFlowGraph.qll | 25 +++++++------------ .../codeql/controlflow/ControlFlowGraph.qll | 8 ++++++ 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll index 06ca1ef1e7e7..4ad4c3d6a41b 100644 --- a/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll +++ b/ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll @@ -150,7 +150,7 @@ private module Ast implements AstSig { or findpattern.getElement(index) = result or - index = 1 + max(int i | exists(findpattern.getElement(i))) and + index = count(findpattern.getElement(_)) and findpattern.getSuffixVariableAccess() = result ) or @@ -198,9 +198,13 @@ private module Ast implements AstSig { Callable() { this instanceof R::Ast::Toplevel or this instanceof R::Ast::Callable } } + additional AstNode toplevelBody(R::Ast::Toplevel t, int index) { + result = t.getBeginBlock(index) or + result = desugar(t.getStmt(index - count(t.getABeginBlock()))) + } + AstNode callableGetBody(Callable c) { - result = c.(R::Ast::Toplevel).getABeginBlock() or - result = c.(R::Ast::Toplevel).getAStmt() or + result = toplevelBody(c, _) or result = c.(R::Ast::Callable).getBody() } @@ -482,13 +486,8 @@ private module Input implements InputSig1, InputSig2 { class CallableContext = Unit; Ast::AstNode callableGetBodyPart(Ast::Callable c, CallableContext ctx, int index) { - exists(R::Ast::Toplevel t | - c = t and - exists(ctx) - | - result = t.getBeginBlock(index) or - result = desugar(t.getStmt(index - count(t.getABeginBlock()))) - ) + result = Ast::toplevelBody(c, index) and + exists(ctx) } predicate catchAll(Ast::CatchClause catch) { @@ -546,12 +545,6 @@ private module Input implements InputSig1, InputSig2 { } predicate step(PreControlFlowNode n1, PreControlFlowNode n2) { - exists(Ast::ConditionalExpr ce | - n1.isAfterTrue(ce.getCondition()) and not exists(ce.getThen()) and n2.isAfter(ce) - or - n1.isAfterFalse(ce.getCondition()) and not exists(ce.getElse()) and n2.isAfter(ce) - ) - or exists(R::Ast::RescueModifierExpr rescueModifier | n1.isBefore(rescueModifier) and n2.isBefore(desugar(rescueModifier.getBody())) diff --git a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll index 042aa29fc421..d230990ce45d 100644 --- a/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll +++ b/shared/controlflow/codeql/controlflow/ControlFlowGraph.qll @@ -1549,8 +1549,16 @@ module Make0 Ast> { n1.isAfterTrue(condexpr.getCondition()) and n2.isBefore(condexpr.getThen()) or + n1.isAfterTrue(condexpr.getCondition()) and + not exists(condexpr.getThen()) and + n2.isAfter(condexpr) + or n1.isAfterFalse(condexpr.getCondition()) and n2.isBefore(condexpr.getElse()) + or + n1.isAfterFalse(condexpr.getCondition()) and + not exists(condexpr.getElse()) and + n2.isAfter(condexpr) ) or exists(PatternMatchExpr pme | From fc90700870ebbbcfe3598457d0e7ce7e24de9d1d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 17 Aug 2026 15:43:35 +0200 Subject: [PATCH 126/181] C#: Add tool status page information and compilation info for unreachable explicit feeds. --- .../NugetPackageRestorer.cs | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 38924e2f876e..109d050f8786 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -127,8 +127,8 @@ public HashSet Restore() compilationInfoContainer.CompilationInfos.Add(("Inherited NuGet feed count", inheritedFeeds.Count.ToString())); } - var allExplicitReachable = explicitFeeds.Count == feedManager.ReachableExplicitFeeds.Count; - EmitUnreachableFeedsDiagnostics(allExplicitReachable); + var unreachableExplicitFeeds = explicitFeeds.Except(feedManager.ReachableExplicitFeeds).ToImmutableHashSet(); + EmitFeedReachabilityDiagnostics(unreachableExplicitFeeds); } try @@ -536,25 +536,31 @@ private void TryChangeProjectFile(DirectoryInfo projectDir, Regex pattern, strin } /// - /// If is `false`, logs this and emits a diagnostic. + /// If is not empty, logs this and emits a diagnostic. /// Adds a `CompilationInfos` entry either way. /// - /// Whether all feeds were reachable or not. - private void EmitUnreachableFeedsDiagnostics(bool allFeedsReachable) + /// The feeds that were not reachable. + private void EmitFeedReachabilityDiagnostics(ImmutableHashSet unreachableFeeds) { - if (!allFeedsReachable) + if (unreachableFeeds.Count > 0) { - logger.LogWarning("Found unreachable NuGet feed in C# analysis with build-mode 'none'. This may cause missing dependencies in the analysis."); + var orderedUnreachableFeeds = unreachableFeeds.OrderBy(feed => feed).ToList(); + var unreachableFeedList = string.Join(", ", orderedUnreachableFeeds); + logger.LogWarning($"Found unreachable NuGet feeds in C# analysis with build-mode 'none': {unreachableFeedList}. This may cause missing dependencies in the analysis."); + compilationInfoContainer.CompilationInfos.Add(("Unreachable NuGet feeds", unreachableFeedList)); diagnosticsWriter.AddEntry(new DiagnosticMessage( Language.CSharp, "buildless/unreachable-feed", - "Found unreachable NuGet feed in C# analysis with build-mode 'none'", + "Found unreachable NuGet feeds in C# analysis with build-mode 'none'", visibility: new DiagnosticMessage.TspVisibility(statusPage: true, cliSummaryTable: true, telemetry: true), - markdownMessage: "Found unreachable NuGet feed in C# analysis with build-mode 'none'. This may cause missing dependencies in the analysis.", + markdownMessage: string.Format( + "Found unreachable NuGet feeds in C# analysis with build-mode 'none':\n\n{0}\n\nThis may cause missing dependencies in the analysis.", + string.Join("\n", orderedUnreachableFeeds.Select(feed => $"- `{feed}`")) + ), severity: DiagnosticMessage.TspSeverity.Note )); } - compilationInfoContainer.CompilationInfos.Add(("All NuGet feeds reachable", allFeedsReachable ? "1" : "0")); + compilationInfoContainer.CompilationInfos.Add(("All NuGet feeds reachable", unreachableFeeds.Count == 0 ? "1" : "0")); } private void EmitNugetConfigDiagnostics() From cd64d686401a99682e3acddade0ea817aca8d2f2 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 17 Aug 2026 16:16:56 +0200 Subject: [PATCH 127/181] C#: Update integration test expected output. --- .../standalone_resx/CompilationInfo.expected | 42 ++++++++-------- .../standalone_resx/CompilationInfo.ql | 11 +---- .../standalone_slnx/CompilationInfo.expected | 42 ++++++++-------- .../standalone_slnx/CompilationInfo.ql | 11 +---- .../CompilationInfo.expected | 42 ++++++++-------- .../standalone_winforms/CompilationInfo.ql | 11 +---- .../CompilationInfo.expected | 44 ++++++++--------- .../CompilationInfo.ql | 11 +---- .../CompilationInfo.expected | 49 ++++++++++--------- .../CompilationInfo.ql | 11 +---- .../CompilationInfo.expected | 49 ++++++++++--------- .../CompilationInfo.ql | 11 +---- .../diagnostics.expected | 4 +- .../CompilationInfo.expected | 49 ++++++++++--------- .../CompilationInfo.ql | 11 +---- .../diagnostics.expected | 4 +- 16 files changed, 178 insertions(+), 224 deletions(-) diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected index 6d91b2700226..d0b09f83622c 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.expected @@ -1,21 +1,21 @@ -| All NuGet feeds reachable | 1.0 | -| Failed project restore with missing package error | 0.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resource extraction enabled | 1.0 | -| Restored .NET framework variants | 1.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 0.0 | -| Source files generated | 2.0 | -| Source files on filesystem | 1.0 | -| Successfully restored project files | 1.0 | -| Successfully restored solution files | 0.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 1 | +| Failed project restore with missing package error | 0 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 1 | +| Resource extraction enabled | 1 | +| Restored .NET framework variants | 1 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 0 | +| Source files generated | 2 | +| Source files on filesystem | 1 | +| Successfully restored project files | 1 | +| Successfully restored solution files | 0 | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.ql b/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.ql index a96c2fd99a69..28898f02fd24 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.ql +++ b/csharp/ql/integration-tests/all-platforms/standalone_resx/CompilationInfo.ql @@ -1,16 +1,9 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and key != "Resolved assembly conflicts" and not key.matches("Compiler diagnostic count for%") and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected index 82cf0509d345..94716c3255ae 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.expected @@ -1,21 +1,21 @@ -| All NuGet feeds reachable | 1.0 | -| Failed project restore with missing package error | 0.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 2.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 1.0 | -| Restored projects through solution files | 2.0 | -| Solution files on filesystem | 1.0 | -| Source files generated | 1.0 | -| Source files on filesystem | 2.0 | -| Successfully restored project files | 0.0 | -| Successfully restored solution files | 1.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 1 | +| Failed project restore with missing package error | 0 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 2 | +| Reachable fallback NuGet feed count | 1 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 1 | +| Restored projects through solution files | 2 | +| Solution files on filesystem | 1 | +| Source files generated | 1 | +| Source files on filesystem | 2 | +| Successfully restored project files | 0 | +| Successfully restored solution files | 1 | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql index 078e352be4d9..e6dc52674f37 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql +++ b/csharp/ql/integration-tests/all-platforms/standalone_slnx/CompilationInfo.ql @@ -1,16 +1,9 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and key != "Resolved assembly conflicts" and not key.matches(["Compiler diagnostic count for%", "Extractor message count for group%"]) and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected index 63ddd4903f3e..ee79179d4fae 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.expected @@ -1,21 +1,21 @@ -| All NuGet feeds reachable | 1.0 | -| Failed project restore with missing package error | 0.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 1.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 0.0 | -| Source files generated | 1.0 | -| Source files on filesystem | 3.0 | -| Successfully restored project files | 1.0 | -| Successfully restored solution files | 0.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 1.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 1 | +| Failed project restore with missing package error | 0 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 1 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 1 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 0 | +| Source files generated | 1 | +| Source files on filesystem | 3 | +| Successfully restored project files | 1 | +| Successfully restored solution files | 0 | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 1 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql index 078e352be4d9..e6dc52674f37 100644 --- a/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql +++ b/csharp/ql/integration-tests/all-platforms/standalone_winforms/CompilationInfo.ql @@ -1,16 +1,9 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and key != "Resolved assembly conflicts" and not key.matches(["Compiler diagnostic count for%", "Extractor message count for group%"]) and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.expected index ff0b29da33fa..e8a0b5897082 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.expected @@ -1,22 +1,22 @@ -| All NuGet feeds reachable | 1.0 | -| Failed project restore with missing package error | 0.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resolved assembly conflicts | 0.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 1.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 0.0 | -| Source files generated | 0.0 | -| Source files on filesystem | 1.0 | -| Successfully restored project files | 1.0 | -| Successfully restored solution files | 0.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 1 | +| Failed project restore with missing package error | 0 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 1 | +| Resolved assembly conflicts | 0 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 1 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 0 | +| Source files generated | 0 | +| Source files on filesystem | 1 | +| Successfully restored project files | 1 | +| Successfully restored solution files | 0 | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.ql b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.ql index 073ffe3b224d..ae7505a8b0be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.ql +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_clear/CompilationInfo.ql @@ -1,15 +1,8 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and not key.matches("Compiler diagnostic count for%") and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.expected index 4acd4f54e8a6..c5cb911d3731 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.expected @@ -1,24 +1,25 @@ -| All NuGet feeds reachable | 0.0 | -| Failed project restore with missing package error | 1.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Fallback nuget restore | 1.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resolved assembly conflicts | 7.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 0.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 1.0 | -| Source files generated | 0.0 | -| Source files on filesystem | 1.0 | -| Successfully ran fallback nuget restore | 1.0 | -| Successfully restored project files | 0.0 | -| Successfully restored solution files | 1.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 0 | +| Failed project restore with missing package error | 1 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Fallback nuget restore | 1 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 1 | +| Resolved assembly conflicts | 7 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 0 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 1 | +| Source files generated | 0 | +| Source files on filesystem | 1 | +| Successfully ran fallback nuget restore | 1 | +| Successfully restored project files | 0 | +| Successfully restored solution files | 1 | +| Unreachable NuGet feeds | https://abc.abc/packages/ | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.ql b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.ql index 073ffe3b224d..ae7505a8b0be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.ql +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error/CompilationInfo.ql @@ -1,15 +1,8 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and not key.matches("Compiler diagnostic count for%") and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected index 4acd4f54e8a6..680a7960a06c 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.expected @@ -1,24 +1,25 @@ -| All NuGet feeds reachable | 0.0 | -| Failed project restore with missing package error | 1.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Fallback nuget restore | 1.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 1.0 | -| Resolved assembly conflicts | 7.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 0.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 1.0 | -| Source files generated | 0.0 | -| Source files on filesystem | 1.0 | -| Successfully ran fallback nuget restore | 1.0 | -| Successfully restored project files | 0.0 | -| Successfully restored solution files | 1.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 0 | +| Failed project restore with missing package error | 1 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Fallback nuget restore | 1 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 1 | +| Resolved assembly conflicts | 7 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 0 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 1 | +| Source files generated | 0 | +| Source files on filesystem | 1 | +| Successfully ran fallback nuget restore | 1 | +| Successfully restored project files | 0 | +| Successfully restored solution files | 1 | +| Unreachable NuGet feeds | https://localhost:53/packages/, https://localhost:80/packages/ | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.ql b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.ql index 073ffe3b224d..ae7505a8b0be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.ql +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/CompilationInfo.ql @@ -1,15 +1,8 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and not key.matches("Compiler diagnostic count for%") and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/diagnostics.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/diagnostics.expected index bbd2081f4554..074e4bd48ae9 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/diagnostics.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_error_timeout/diagnostics.expected @@ -27,12 +27,12 @@ } } { - "markdownMessage": "Found unreachable NuGet feed in C# analysis with build-mode 'none'. This may cause missing dependencies in the analysis.", + "markdownMessage": "Found unreachable NuGet feeds in C# analysis with build-mode 'none':\n\n- `https://localhost:53/packages/`\n- `https://localhost:80/packages/`\n\nThis may cause missing dependencies in the analysis.", "severity": "note", "source": { "extractorName": "csharp", "id": "csharp/autobuilder/buildless/unreachable-feed", - "name": "Found unreachable NuGet feed in C# analysis with build-mode 'none'" + "name": "Found unreachable NuGet feeds in C# analysis with build-mode 'none'" }, "visibility": { "cliSummaryTable": true, diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected index d421cfc42e1a..384d64a59855 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.expected @@ -1,24 +1,25 @@ -| All NuGet feeds reachable | 0.0 | -| Failed project restore with missing package error | 1.0 | -| Failed project restore with package source error | 0.0 | -| Failed solution restore with missing package error | 0.0 | -| Failed solution restore with package source error | 0.0 | -| Fallback nuget restore | 1.0 | -| Inherited NuGet feed count | 1.0 | -| NuGet feed responsiveness checked | 1.0 | -| Project files on filesystem | 1.0 | -| Reachable fallback NuGet feed count | 2.0 | -| Resolved assembly conflicts | 7.0 | -| Resource extraction enabled | 0.0 | -| Restored .NET framework variants | 0.0 | -| Restored projects through solution files | 0.0 | -| Solution files on filesystem | 1.0 | -| Source files generated | 0.0 | -| Source files on filesystem | 1.0 | -| Successfully ran fallback nuget restore | 1.0 | -| Successfully restored project files | 0.0 | -| Successfully restored solution files | 1.0 | -| Unresolved references | 0.0 | -| UseWPF set | 0.0 | -| UseWindowsForms set | 0.0 | -| WebView extraction enabled | 1.0 | +| All NuGet feeds reachable | 0 | +| Failed project restore with missing package error | 1 | +| Failed project restore with package source error | 0 | +| Failed solution restore with missing package error | 0 | +| Failed solution restore with package source error | 0 | +| Fallback nuget restore | 1 | +| Inherited NuGet feed count | 1 | +| NuGet feed responsiveness checked | 1 | +| Project files on filesystem | 1 | +| Reachable fallback NuGet feed count | 2 | +| Resolved assembly conflicts | 7 | +| Resource extraction enabled | 0 | +| Restored .NET framework variants | 0 | +| Restored projects through solution files | 0 | +| Solution files on filesystem | 1 | +| Source files generated | 0 | +| Source files on filesystem | 1 | +| Successfully ran fallback nuget restore | 1 | +| Successfully restored project files | 0 | +| Successfully restored solution files | 1 | +| Unreachable NuGet feeds | https://www.nuget.org/api/v2/ | +| Unresolved references | 0 | +| UseWPF set | 0 | +| UseWindowsForms set | 0 | +| WebView extraction enabled | 1 | diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.ql b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.ql index 073ffe3b224d..ae7505a8b0be 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.ql +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/CompilationInfo.ql @@ -1,15 +1,8 @@ import csharp import semmle.code.csharp.commons.Diagnostics -query predicate compilationInfo(string key, float value) { +query predicate compilationInfo(string key, string value) { key != "Resolved references" and not key.matches("Compiler diagnostic count for%") and - exists(Compilation c, string infoKey, string infoValue | infoValue = c.getInfo(infoKey) | - key = infoKey and - value = infoValue.toFloat() - or - not exists(infoValue.toFloat()) and - key = infoKey + ": " + infoValue and - value = 1 - ) + value = any(Compilation c).getInfo(key) } diff --git a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/diagnostics.expected b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/diagnostics.expected index bbd2081f4554..66867fd38eeb 100644 --- a/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/diagnostics.expected +++ b/csharp/ql/integration-tests/posix/standalone_dependencies_nuget_config_fallback/diagnostics.expected @@ -27,12 +27,12 @@ } } { - "markdownMessage": "Found unreachable NuGet feed in C# analysis with build-mode 'none'. This may cause missing dependencies in the analysis.", + "markdownMessage": "Found unreachable NuGet feeds in C# analysis with build-mode 'none':\n\n- `https://www.nuget.org/api/v2/`\n\nThis may cause missing dependencies in the analysis.", "severity": "note", "source": { "extractorName": "csharp", "id": "csharp/autobuilder/buildless/unreachable-feed", - "name": "Found unreachable NuGet feed in C# analysis with build-mode 'none'" + "name": "Found unreachable NuGet feeds in C# analysis with build-mode 'none'" }, "visibility": { "cliSummaryTable": true, From bb6def05a87bff29042deab7be9accb375d42c14 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Tue, 18 Aug 2026 08:28:47 +0200 Subject: [PATCH 128/181] C#: Add change-note. --- .../change-notes/2026-08-18-tsp-nuget-feed-reachability.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md diff --git a/csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md b/csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md new file mode 100644 index 000000000000..fc391ad6f804 --- /dev/null +++ b/csharp/ql/lib/change-notes/2026-08-18-tsp-nuget-feed-reachability.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* C# analysis with build mode `none` now lists unreachable explicitly configured NuGet feeds in both the extraction warning and the tool status page note. This makes it easier to identify feeds that may cause dependencies to be missing from the analysis. From 94463949850fd3192bd1a36c092c420d2ae5887a Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 24 Aug 2026 16:13:47 +0200 Subject: [PATCH 129/181] C#: Avoid logging sensitive information like username and password (if hardcoded in the nuget.config feed URL). --- .../NugetPackageRestorer.cs | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 109d050f8786..f0772491072a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -535,6 +535,22 @@ private void TryChangeProjectFile(DirectoryInfo projectDir, Regex pattern, strin } } + private string SanitizeFeedForLogging(string feed) + { + + try + { + // If the feed is a URL, log only the scheme, host, port, and absolute path to avoid logging sensitive information such as credentials or tokens. + var uri = new Uri(feed); + var port = uri.IsDefaultPort ? string.Empty : $":{uri.Port}"; + return $"{uri.Scheme}://{uri.Host}{port}{uri.AbsolutePath}"; + } + catch + { + return feed; + } + } + /// /// If is not empty, logs this and emits a diagnostic. /// Adds a `CompilationInfos` entry either way. @@ -544,7 +560,10 @@ private void EmitFeedReachabilityDiagnostics(ImmutableHashSet unreachabl { if (unreachableFeeds.Count > 0) { - var orderedUnreachableFeeds = unreachableFeeds.OrderBy(feed => feed).ToList(); + var orderedUnreachableFeeds = unreachableFeeds + .Select(SanitizeFeedForLogging) + .OrderBy(feed => feed) + .ToList(); var unreachableFeedList = string.Join(", ", orderedUnreachableFeeds); logger.LogWarning($"Found unreachable NuGet feeds in C# analysis with build-mode 'none': {unreachableFeedList}. This may cause missing dependencies in the analysis."); compilationInfoContainer.CompilationInfos.Add(("Unreachable NuGet feeds", unreachableFeedList)); From 746b8067f15f8f9380fa1978acea6acbe79ce331 Mon Sep 17 00:00:00 2001 From: hugo-syn <61210734+hugo-syn@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:04:40 +0200 Subject: [PATCH 130/181] Update csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml Co-authored-by: Michael Nebel --- csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml index ede706dd194a..a2da2bee2dfe 100644 --- a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml +++ b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml @@ -4,4 +4,12 @@ extensions: extensible: summaryModel data: - ["Microsoft.AspNet.OData", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "Patch", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "Put", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "CopyChangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "CopyUnchangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Patch", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Put", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyChangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyUnchangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] From 131b6be091722116ab832e0e72ea54c00911a0ea Mon Sep 17 00:00:00 2001 From: hugo-syn <61210734+hugo-syn@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:04:52 +0200 Subject: [PATCH 131/181] Update csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll Co-authored-by: Michael Nebel --- csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll | 8 -------- 1 file changed, 8 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 936a50d6cf30..9989583fd6ae 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -79,14 +79,6 @@ class ODataBoundType extends ValueOrRefType { } } -/** The `Patch`, `Put`, `CopyChangedValues`, and `CopyUnchangedValues` methods on `Delta`. */ -class DeltaMutatingMethod extends Method { - DeltaMutatingMethod() { - this.getDeclaringType() instanceof DeltaClass and - this.hasName(["Patch", "Put", "CopyChangedValues", "CopyUnchangedValues"]) - } -} - /** * Taint members (transitively) on types used in * 1. Casts, `as`-conversions, or type tests applied to `ODataActionParameters` values. From de9eae2324310170a0218ac49435f91103439261 Mon Sep 17 00:00:00 2001 From: hugo-syn <61210734+hugo-syn@users.noreply.github.com> Date: Tue, 25 Aug 2026 15:05:04 +0200 Subject: [PATCH 132/181] Update csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll Co-authored-by: Michael Nebel --- .../lib/semmle/code/csharp/frameworks/OData.qll | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 9989583fd6ae..e5ca56a60e99 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -100,18 +100,3 @@ private class ODataBoundMember extends TaintTracking::TaintedMember, CandidateMe ) } } - -/** - * A call to `Delta.Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues` - * copies the changes tracked by the `Delta` receiver onto its `original` - * entity argument. - */ -private class DeltaMutatingCallTaintStep extends AdditionalTaintStep { - override predicate step(DataFlow::Node node1, DataFlow::Node node2) { - exists(MethodCall mc | - mc.getTarget().getUnboundDeclaration() instanceof DeltaMutatingMethod and - node1.asExpr() = mc.getQualifier() and - node2.(PostUpdateNode).getPreUpdateNode().asExpr() = mc.getArgument(0) - ) - } -} From 393512f0d02e65148b3a21f10c7e48b1171550b7 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 25 Aug 2026 14:05:35 +0100 Subject: [PATCH 133/181] C++: Implement a pruning version of 'getAnUltimateDefinition'. --- .../cpp/ir/dataflow/internal/DataFlowUtil.qll | 2 + .../code/cpp/ir/dataflow/internal/SsaImpl.qll | 84 +++++++++++++++++-- 2 files changed, 79 insertions(+), 7 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll index 13d16375f236..17c3438f098a 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll @@ -1018,4 +1018,6 @@ module Ssa { class IndirectExplicitDefinition = SsaImpl::IndirectExplicitDefinition; class PhiNode = SsaImpl::PhiNode; + + import SsaImpl::Public } diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll index 432261dfe278..402925117c56 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll @@ -1405,14 +1405,80 @@ private class PhiCycle extends PhiCycleEquivalence::EquivalenceClass { } } -/** An static single assignment (SSA) definition. */ -class Definition extends SsaImpl::Definition { - private Definition getAPhiInputOrPriorDefinition() { - result = this.(PhiNode).getAnInput() - or - uncertainWriteDefinitionInput(this, result) +private Definition getAPhiInputOrPriorDefinition(Definition def) { + result = def.(PhiNode).getAnInput() + or + uncertainWriteDefinitionInput(def, result) +} + +module Public { + /** + * A module signature to define relevant ultimate definitions for an + * optimized version of `Definition.getAnUltimateDefinition`. + */ + signature module GetAnUltimateDefinitionSig { + /** + * Holds if `def` is a relevant definition. This defines the set + * of `Definition`s which may be returned by + * `GetAnUltimateDefinition::getAnUltimateDefinition`. + */ + predicate isRelevantUltimateDefinition(Definition def); + } + + /** + * A module which constructs an optimized version of + * ``` + * Definition.getAnUltimateDefinition + * ``` + * by restricting the set of possible ultimate definitions. + * + * Use this module by defining a module `M` which implements + * `GetAnUltimateDefinitionSig` and then call: + * ``` + * GetAnUltimateDefinition::getAnUltimateDefinition + * ``` + */ + module GetAnUltimateDefinition { + private import Sig + + private predicate relevantUltimateDefinition(Definition def) { + isRelevantUltimateDefinition(def) and + not def instanceof PhiNode + } + + private predicate fwd(Definition def) { + relevantUltimateDefinition(def) + or + exists(Definition def0 | + fwd(def0) and + def0 = getAPhiInputOrPriorDefinition(def) + ) + } + + private predicate step(Definition def1, Definition def2) { + fwd(def1) and + fwd(def2) and + def1 = getAPhiInputOrPriorDefinition(def2) + } + + /** + * Gets a definition that ultimately defines this SSA definition and is + * not itself a phi node. + * + * This predicate is restricted to ultimate definitions which + * satisfy `isRelevantUltimateDefinition`. + */ + Definition getAnUltimateDefinition(Definition def) { + step*(result, def) and + relevantUltimateDefinition(result) + } } +} +import Public + +/** An static single assignment (SSA) definition. */ +class Definition extends SsaImpl::Definition { /** * Holds if this SSA definition is live at the end of basic block `bb`. * That is, this definition reaches the end of basic block `bb`, at which @@ -1424,9 +1490,13 @@ class Definition extends SsaImpl::Definition { /** * Gets a definition that ultimately defines this SSA definition and is * not itself a phi node. + * + * Note: A more efficient implementation of this predicate exists. See the + * `GetAnUltimateDefinition` module for a description of how to access + * the more efficient implementation. */ final Definition getAnUltimateDefinition() { - result = this.getAPhiInputOrPriorDefinition*() and + result = getAPhiInputOrPriorDefinition*(this) and not result instanceof PhiNode } From 59170eeb0a18e3cf609b2cecede76a3faa6ef339 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 25 Aug 2026 14:08:28 +0100 Subject: [PATCH 134/181] C++: Use the optimized version of getAnUltimateDefinition in FlowSummaryImpl.qll. --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index 0eba3d5fc181..ecb60ba720ae 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -171,6 +171,23 @@ private module Input2 implements Impl::Private::InputSig2 { result = e.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() } + private module GetAnUltimateDefinitionInput implements Ssa::GetAnUltimateDefinitionSig { + predicate isRelevantUltimateDefinition(Ssa::Definition def) { + exists( + getFunctionFromExpr(def.(Ssa::DirectExplicitDefinition) + .getAssignedInstruction() + .(StoreInstruction) + .getSourceValue() + .getUnconvertedResultExpression()) + ) + } + } + + private Ssa::Definition getAnUltimateDefinition(Ssa::Definition def) { + result = + Ssa::GetAnUltimateDefinition::getAnUltimateDefinition(def) + } + class SourceSinkReportingElement extends Element { SourceSinkReportingElement() { this instanceof Expr or this instanceof Parameter } @@ -191,7 +208,7 @@ private module Input2 implements Impl::Private::InputSig2 { exists(Ssa::Definition def | def.getAUse().getDef().getUnconvertedResultExpression() = this and result = - getFunctionFromExpr(def.getAnUltimateDefinition() + getFunctionFromExpr(getAnUltimateDefinition(def) .(Ssa::DirectExplicitDefinition) .getAssignedInstruction() .(StoreInstruction) From 6214cd1bd8cbaf3b1cae680d772d696ab3f09e42 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 25 Aug 2026 14:15:58 +0100 Subject: [PATCH 135/181] C++: Cleanup. --- .../cpp/dataflow/internal/FlowSummaryImpl.qll | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll index ecb60ba720ae..efe18e0945ed 100644 --- a/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/dataflow/internal/FlowSummaryImpl.qll @@ -171,21 +171,26 @@ private module Input2 implements Impl::Private::InputSig2 { result = e.(ConversionCall).getQualifier().(LambdaExpression).getLambdaFunction() } + private predicate isRelevantUltimateDefinition(Ssa::DirectExplicitDefinition def, Function f) { + f = + getFunctionFromExpr(def.getAssignedInstruction() + .(StoreInstruction) + .getSourceValue() + .getUnconvertedResultExpression()) + } + private module GetAnUltimateDefinitionInput implements Ssa::GetAnUltimateDefinitionSig { predicate isRelevantUltimateDefinition(Ssa::Definition def) { - exists( - getFunctionFromExpr(def.(Ssa::DirectExplicitDefinition) - .getAssignedInstruction() - .(StoreInstruction) - .getSourceValue() - .getUnconvertedResultExpression()) - ) + isRelevantUltimateDefinition(def, _) } } - private Ssa::Definition getAnUltimateDefinition(Ssa::Definition def) { - result = - Ssa::GetAnUltimateDefinition::getAnUltimateDefinition(def) + private predicate hasAnUltimateFunctionAccessDefinition(Ssa::Definition def, Function f) { + exists(Ssa::Definition ultimate | + ultimate = + Ssa::GetAnUltimateDefinition::getAnUltimateDefinition(def) and + isRelevantUltimateDefinition(ultimate, f) + ) } class SourceSinkReportingElement extends Element { @@ -207,13 +212,7 @@ private module Input2 implements Impl::Private::InputSig2 { // The expression is an SSA read of an assignment of a callable exists(Ssa::Definition def | def.getAUse().getDef().getUnconvertedResultExpression() = this and - result = - getFunctionFromExpr(getAnUltimateDefinition(def) - .(Ssa::DirectExplicitDefinition) - .getAssignedInstruction() - .(StoreInstruction) - .getSourceValue() - .getUnconvertedResultExpression()) + hasAnUltimateFunctionAccessDefinition(def, result) ) } From 891f2e1a4f9d160161548bfdc05e56965f41d4cc Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 25 Aug 2026 14:18:01 +0100 Subject: [PATCH 136/181] C++: Use the optimized version of getAnUltimateDefinition for iterator flow. --- .../ir/dataflow/internal/DataFlowPrivate.qll | 66 ++++++++++++------- 1 file changed, 41 insertions(+), 25 deletions(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll index 6b79671ce638..3a1b42645642 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll @@ -1977,13 +1977,23 @@ module IteratorFlow { } /** - * Gets an ultimate definition of `def`. - * - * Note: Unlike `def.getAnUltimateDefinition()` this predicate also - * traverses back through iterator increment and decrement operations. + * Holds if `write` is an instruction that writes to address `address` */ - private Ssa::Definition getAnUltimateDefinition(Ssa::Definition def) { - result = def.getAnUltimateDefinition() + private predicate isIteratorWrite(Instruction write, Operand address) { + exists(Ssa::DefImpl writeDef, IRBlock bb, int i | + writeDef.hasIndexInBlock(_, bb, i) and + bb.getInstruction(i) = write and + address = writeDef.getAddressOperand() + ) + } + + private module GetAnUltimateDefinitionInput implements Ssa::GetAnUltimateDefinitionSig { + predicate isRelevantUltimateDefinition(Ssa::Definition def) { fwd(_, def) } + } + + private Ssa::Definition getAnUltimateDefinitionStep(Ssa::Definition def) { + result = + Ssa::GetAnUltimateDefinition::getAnUltimateDefinition(def) or exists(IRBlock bb, int i, IteratorCrementCall crementCall, Ssa::SourceVariable sv | crementCall = def.getValue().asInstruction().(StoreInstruction).getSourceValue() and @@ -1993,14 +2003,28 @@ module IteratorFlow { ) } - /** - * Holds if `write` is an instruction that writes to address `address` - */ - private predicate isIteratorWrite(Instruction write, Operand address) { - exists(Ssa::DefImpl writeDef, IRBlock bb, int i | - writeDef.hasIndexInBlock(_, bb, i) and - bb.getInstruction(i) = write and - address = writeDef.getAddressOperand() + private predicate isSource(GetsIteratorCall beginCall, Ssa::Definition def) { + exists(StoreInstruction beginStore | + beginStore = def.getValue().asInstruction() and + operandForFullyConvertedCall(beginStore.getSourceValueOperand(), beginCall) + ) + } + + private predicate isSink(Instruction writeToDeref, Ssa::Definition def) { + exists(IteratorPointerDereferenceCall starCall, Operand address, IRBlock bbStar, int iStar | + isIteratorWrite(writeToDeref, address) and + operandForFullyConvertedCall(address, starCall) and + bbStar.getInstruction(iStar) = starCall and + Ssa::ssaDefReachesRead(_, def, bbStar, iStar) + ) + } + + private predicate fwd(GetsIteratorCall beginCall, Ssa::Definition def) { + isSource(beginCall, def) + or + exists(Ssa::Definition def0 | + fwd(beginCall, def0) and + def0 = getAnUltimateDefinitionStep(def) ) } @@ -2016,17 +2040,9 @@ module IteratorFlow { private predicate isIteratorStoreInstruction( GetsIteratorCall beginCall, Instruction writeToDeref ) { - exists( - StoreInstruction beginStore, IRBlock bbStar, int iStar, Ssa::Definition def, - IteratorPointerDereferenceCall starCall, Ssa::Definition ultimate, Operand address - | - isIteratorWrite(writeToDeref, address) and - operandForFullyConvertedCall(address, starCall) and - bbStar.getInstruction(iStar) = starCall and - Ssa::ssaDefReachesRead(_, def, bbStar, iStar) and - ultimate = getAnUltimateDefinition*(def) and - beginStore = ultimate.getValue().asInstruction() and - operandForFullyConvertedCall(beginStore.getSourceValueOperand(), beginCall) + exists(Ssa::Definition def | + fwd(beginCall, def) and + isSink(writeToDeref, def) ) } From 117fc6b310d87714c5cbc3dace0aa72490cec279 Mon Sep 17 00:00:00 2001 From: Alex Ausch Date: Tue, 25 Aug 2026 15:52:57 +0200 Subject: [PATCH 137/181] Python: keep the Python 2 reading of `except A, e:` The previous commit read a comma-separated fourth child as a tuple of exception types unconditionally. That is right for Python 3, but the default parser is version-agnostic and also runs when extracting Python 2 (`CODEQL_EXTRACTOR_PYTHON_ANALYSIS_VERSION=2`, `--lang=2`), where `except Exception, e:` really is the alias binding and the canonical idiom. In that mode the change flipped `e` from a `Store` to a `Load` of an undefined name and dropped the binding altogether. So the separator token alone is not enough to decide: `as` binds an alias in every version, a comma binds an alias under Python 2 and builds a tuple otherwise. Chains of three or more are unaffected either way -- they are not valid Python 2, and the default grammar rejects them, so `Module.py_ast` falls back to tree-sitter. The file-driven parser tests cannot express this; they run at the default analysis version and there is no per-fixture way to change it. So `tests/test_except_clause.py` drives `parser.parse` directly with the version flipped, and pins all four combinations -- comma and `as`, Python 2 and 3, plus the parenthesized form that must bind no alias in either. Removing the version gate fails the Python 2 case. Co-Authored-By: Claude Opus 5 (1M context) --- python/extractor/semmle/python/parser/ast.py | 15 ++-- python/extractor/tests/test_except_clause.py | 71 +++++++++++++++++++ ...2026-08-19-legacy-parser-relaxed-except.md | 2 +- 3 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 python/extractor/tests/test_except_clause.py diff --git a/python/extractor/semmle/python/parser/ast.py b/python/extractor/semmle/python/parser/ast.py index 0712bf08ae45..9a1cea1ae62e 100644 --- a/python/extractor/semmle/python/parser/ast.py +++ b/python/extractor/semmle/python/parser/ast.py @@ -1,6 +1,7 @@ from blib2to3.pgen2 import token from ast import literal_eval from semmle.python import ast +from semmle.util import get_analysis_major_version from blib2to3.pgen2.parse import ParseError import sys @@ -981,13 +982,17 @@ def visit_except_clause(self, node): if len(node.children) > 1: type = self.visit(node.children[1], LOAD) if len(node.children) > 3: - if is_token(node.children[2], "as"): + # The grammar rule `'except' [test [(',' | 'as') test]]` is shared + # between two incompatible readings of a fourth child, so the + # separator token and the analysis version together decide: + # `except A as e:` binds an alias, in every version; + # `except A, e:` binds an alias when extracting Python 2, where + # that is the canonical idiom; + # `except A, B:` is an unparenthesized tuple of exception types + # otherwise -- PEP 758, Python 3.14+. + if is_token(node.children[2], "as") or get_analysis_major_version() == 2: name = self.visit(node.children[3], STORE) else: - # PEP 758 (Python 3.14+): `except A, B:` is an unparenthesized - # tuple of exception types, not a Python 2 alias binding. The - # grammar rule `'except' [test [(',' | 'as') test]]` is shared - # between both readings, so the separator token decides. elts = [type, self.visit(node.children[3], LOAD)] type = ast.Tuple(elts, LOAD) set_location(type, node.children[1].start, node.children[3].end) diff --git a/python/extractor/tests/test_except_clause.py b/python/extractor/tests/test_except_clause.py new file mode 100644 index 000000000000..d09ae382b9dd --- /dev/null +++ b/python/extractor/tests/test_except_clause.py @@ -0,0 +1,71 @@ +import unittest +from contextlib import contextmanager + +from semmle import util +from semmle.python import ast +from semmle.python import parser +from semmle.python.parser.dump_ast import StdoutLogger +from semmle.python.parser.tokenizer import Tokenizer + + +@contextmanager +def analysis_version(version): + 'Extract as if `CODEQL_EXTRACTOR_PYTHON_ANALYSIS_VERSION` were `version`.' + previous = util.get_analysis_version() + util.update_analysis_version(version) + try: + yield + finally: + util.update_analysis_version(previous) + + +class ExceptClauseTest(unittest.TestCase): + '''`except_clause: 'except' [test [(',' | 'as') test]]` is one grammar rule + covering two incompatible readings of `except A, B:` -- a Python 2 alias + binding and a PEP 758 tuple of exception types. Which one the default parser + picks depends on the version being extracted, so these tests pin both. + ''' + + def handler(self, source): + 'The first `except` handler of the first statement of `source`.' + with StdoutLogger() as logger: + module = parser.parse(Tokenizer(source).tokens(), logger) + return module.body[0].handlers[0] + + def test_comma_is_a_tuple_of_types_in_python_3(self): + with analysis_version("3.11"): + handler = self.handler("try:\n a\nexcept b, c:\n d\n") + self.assertIsNone(handler.name) + self.assertIsInstance(handler.type, ast.Tuple) + self.assertIsInstance(handler.type.ctx, ast.Load) + self.assertEqual(["b", "c"], [elt.id for elt in handler.type.elts]) + for elt in handler.type.elts: + self.assertIsInstance(elt.ctx, ast.Load) + + def test_comma_is_an_alias_binding_in_python_2(self): + with analysis_version("2.7.18"): + handler = self.handler("try:\n a\nexcept b, c:\n d\n") + self.assertIsInstance(handler.type, ast.Name) + self.assertEqual("b", handler.type.id) + self.assertIsInstance(handler.type.ctx, ast.Load) + self.assertIsInstance(handler.name, ast.Name) + self.assertEqual("c", handler.name.id) + self.assertIsInstance(handler.name.ctx, ast.Store) + + def test_as_is_an_alias_binding_in_both_versions(self): + for version in ("3.11", "2.7.18"): + with analysis_version(version): + handler = self.handler("try:\n a\nexcept b as c:\n d\n") + self.assertIsInstance(handler.type, ast.Name, version) + self.assertEqual("b", handler.type.id, version) + self.assertIsInstance(handler.name, ast.Name, version) + self.assertEqual("c", handler.name.id, version) + self.assertIsInstance(handler.name.ctx, ast.Store, version) + + def test_parenthesised_types_bind_no_alias_in_either_version(self): + for version in ("3.11", "2.7.18"): + with analysis_version(version): + handler = self.handler("try:\n a\nexcept (b, c):\n d\n") + self.assertIsNone(handler.name, version) + self.assertIsInstance(handler.type, ast.Tuple, version) + self.assertEqual(["b", "c"], [elt.id for elt in handler.type.elts], version) diff --git a/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md b/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md index bd4bd599f568..5e7681b2436f 100644 --- a/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md +++ b/python/ql/lib/change-notes/2026-08-19-legacy-parser-relaxed-except.md @@ -1,4 +1,4 @@ --- category: fix --- -* Fixed the extraction of PEP 758 `except A, B:` clauses by the default (non-tree-sitter) Python parser. Previously the second exception type was extracted as a Python 2 style alias binding, so it was recorded as a `Store` rather than a use. This caused false positives from queries that reason about whether a name is used, such as `py/unused-import`. +* Fixed the extraction of PEP 758 `except A, B:` clauses by the default (non-tree-sitter) Python parser. Previously the second exception type was extracted as a Python 2 style alias binding, so it was recorded as a `Store` rather than a use. This caused false positives from queries that reason about whether a name is used, such as `py/unused-import`. When extracting Python 2 (`--lang=2`), `except A, e:` continues to bind `e` as an alias, since that is what the syntax means in that version. From 93baa405ecae6ce83d0b90b877828e584f2bb4b4 Mon Sep 17 00:00:00 2001 From: hugo-syn Date: Tue, 25 Aug 2026 16:03:30 +0200 Subject: [PATCH 138/181] fix: add fix from review --- .../lib/ext/Microsoft.AspNet.OData.model.yml | 8 ++++ .../semmle/code/csharp/frameworks/OData.qll | 44 ++++++++++++++++--- .../library-tests/frameworks/OData/OData.cs | 40 +++++++++++++++++ .../frameworks/OData/OData.expected | 10 ++++- .../library-tests/frameworks/OData/OData.ql | 2 + .../library-tests/frameworks/OData/options | 1 + .../7.7.5/Microsoft.AspNet.OData.cs | 6 +-- .../resources/stubs/System.Web.Http.OData.cs | 15 +++++++ 8 files changed, 113 insertions(+), 13 deletions(-) create mode 100644 csharp/ql/test/resources/stubs/System.Web.Http.OData.cs diff --git a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml index a2da2bee2dfe..e27c4ccfe529 100644 --- a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml +++ b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml @@ -5,11 +5,19 @@ extensions: data: - ["Microsoft.AspNet.OData", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "Patch", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "Patch", "(TStructuralType)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "Put", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "CopyChangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNet.OData", "Delta", True, "CopyChangedValues", "(TStructuralType)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "CopyUnchangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Patch", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Patch", "(T)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Put", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyChangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyUnchangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["System.Web.Http.OData", "Delta", True, "GetEntity", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] + - ["System.Web.Http.OData", "Delta", True, "Patch", "(TEntityType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["System.Web.Http.OData", "Delta", True, "Put", "(TEntityType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["System.Web.Http.OData", "Delta", True, "CopyChangedValues", "(TEntityType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] + - ["System.Web.Http.OData", "Delta", True, "CopyUnchangedValues", "(TEntityType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index e5ca56a60e99..9571268c6b30 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -9,8 +9,9 @@ * values are cast, `as`-converted, or type-tested to arbitrary model types * by the action method body. * - `Delta`, a change-tracking wrapper for PATCH/PUT requests, whose - * tracked property values are exposed via `GetInstance()` or copied onto an - * existing entity via `Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues`. + * tracked property values are exposed via `GetInstance()` (`GetEntity()` in + * the older `System.Web.Http.OData`) or copied onto an existing entity via + * `Patch`/`Put`/`CopyChangedValues`/`CopyUnchangedValues`. * * In both cases the type that ends up holding the client-controlled data has * no static relationship to the action method's parameter types, so its @@ -20,7 +21,6 @@ import csharp private import semmle.code.csharp.commons.Collections private import semmle.code.csharp.dataflow.FlowSteps -private import semmle.code.csharp.dataflow.internal.DataFlowPrivate private import semmle.code.csharp.security.dataflow.flowsources.Remote /** The `ODataActionParameters` dictionary type, across OData library versions. */ @@ -32,14 +32,43 @@ class ODataActionParametersClass extends Class { } } -/** An indexer read on an `ODataActionParameters` dictionary, e.g. `parameters["Foo"]`. */ +/** + * Holds if `e` is (or, via local flow -- e.g. an upcast to `IDictionary` + * -- may hold the value of) an `ODataActionParameters` dictionary. + */ +private predicate isODataActionParametersValue(Expr e) { + e.getType() instanceof ODataActionParametersClass + or + DataFlow::localExprFlow(any(Expr e0 | isODataActionParametersValue(e0)), e) +} + +/** + * An indexer read on an `ODataActionParameters` dictionary, e.g. `parameters["Foo"]` + * (including through an upcast to a base dictionary type/interface). + */ class ODataActionParameterRead extends ElementAccess { - ODataActionParameterRead() { this.getQualifier().getType() instanceof ODataActionParametersClass } + ODataActionParameterRead() { isODataActionParametersValue(this.getQualifier()) } +} + +/** + * A call to `TryGetValue` on an `ODataActionParameters` dictionary copies the value + * of the looked-up entry into the `out` argument. + */ +private class ODataActionParametersTryGetValueTaintStep extends AdditionalTaintStep { + override predicate step(DataFlow::Node node1, DataFlow::Node node2) { + exists(MethodCall mc, AssignableDefinitions::OutRefDefinition def | + mc.getTarget().hasName("TryGetValue") and + isODataActionParametersValue(mc.getQualifier()) and + node1.asExpr() = mc.getQualifier() and + def.getTargetAccess() = mc.getArgumentForName("value") and + node2 = DataFlow::assignableDefinitionNode(def) + ) + } } /** Holds if `e` may (locally) hold the value of an `ODataActionParameters` entry. */ private predicate isODataParameterValue(Expr e) { - TaintTracking::localExprTaint(any(ODataActionParameterRead r), e) + DataFlow::localExprFlow(any(ODataActionParameterRead r), e) } /** The generic ``Delta`1`` change-tracking class, across OData library versions. */ @@ -48,7 +77,8 @@ class DeltaClass extends UnboundGenericClass { this.getNumberOfTypeParameters() = 1 and ( this.hasFullyQualifiedName("Microsoft.AspNet.OData", "Delta`1") or - this.hasFullyQualifiedName("Microsoft.AspNetCore.OData.Deltas", "Delta`1") + this.hasFullyQualifiedName("Microsoft.AspNetCore.OData.Deltas", "Delta`1") or + this.hasFullyQualifiedName("System.Web.Http.OData", "Delta`1") ) } } diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index ab06179ab79a..bbce96d56fc9 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -73,6 +73,22 @@ void IsAsFromDictionary(ODataActionParameters parameters) } } + void TryGetValueFromDictionary(ODataActionParameters parameters) + { + if (parameters.TryGetValue("Entity", out var value)) + { + var entity = (BoundEntity)value; + Sink(entity.Name); + } + } + + void UpcastThenIndex(ODataActionParameters parameters) + { + IDictionary dict = parameters; + var entity = (BoundEntity)dict["Entity"]; + Sink(entity.Name); + } + void DeltaPatch(Delta delta, Widget original) { delta.Patch(original); @@ -85,6 +101,30 @@ void DeltaGetInstance(Delta delta) Sink(w.Name); } + void DeltaPatchReturnValue(Delta delta, Widget original) + { + var updated = delta.Patch(original); + Sink(updated.Name); + } + + void DeltaCopyChangedValuesReturnValue(Delta delta, Widget original) + { + var updated = delta.CopyChangedValues(original); + Sink(updated.Name); + } + + void LegacyDeltaPatch(System.Web.Http.OData.Delta delta, Widget original) + { + delta.Patch(original); + Sink(original.Name); + } + + void LegacyDeltaGetEntity(System.Web.Http.OData.Delta delta) + { + var w = delta.GetEntity(); + Sink(w.Name); + } + void Untainted() { var w = new Widget(); diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index fad59d4a9a9b..290236df722e 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -5,5 +5,11 @@ | OData.cs:46:55:46:64 | parameters | OData.cs:55:22:55:28 | access to property Owner | | OData.cs:59:55:59:64 | parameters | OData.cs:65:26:65:35 | access to property Label | | OData.cs:59:55:59:64 | parameters | OData.cs:72:22:72:34 | access to property Category | -| OData.cs:76:39:76:43 | delta | OData.cs:79:18:79:30 | access to property Name | -| OData.cs:82:45:82:49 | delta | OData.cs:85:18:85:23 | access to property Name | +| OData.cs:76:62:76:71 | parameters | OData.cs:81:22:81:32 | access to property Name | +| OData.cs:85:52:85:61 | parameters | OData.cs:89:18:89:28 | access to property Name | +| OData.cs:92:39:92:43 | delta | OData.cs:95:18:95:30 | access to property Name | +| OData.cs:98:45:98:49 | delta | OData.cs:101:18:101:23 | access to property Name | +| OData.cs:104:50:104:54 | delta | OData.cs:107:18:107:29 | access to property Name | +| OData.cs:110:62:110:66 | delta | OData.cs:113:18:113:29 | access to property Name | +| OData.cs:116:67:116:71 | delta | OData.cs:119:18:119:30 | access to property Name | +| OData.cs:122:71:122:75 | delta | OData.cs:125:18:125:23 | access to property Name | diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.ql b/csharp/ql/test/library-tests/frameworks/OData/OData.ql index 80d0f1d04dec..ed70740699e3 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.ql +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.ql @@ -6,6 +6,8 @@ module TaintConfig implements DataFlow::ConfigSig { p.getType().hasFullyQualifiedName("Microsoft.AspNet.OData", "ODataActionParameters") or p.getType().getUnboundDeclaration().hasFullyQualifiedName("Microsoft.AspNet.OData", "Delta`1") + or + p.getType().getUnboundDeclaration().hasFullyQualifiedName("System.Web.Http.OData", "Delta`1") ) } diff --git a/csharp/ql/test/library-tests/frameworks/OData/options b/csharp/ql/test/library-tests/frameworks/OData/options index 357763232dbe..e9ba768d29a7 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/options +++ b/csharp/ql/test/library-tests/frameworks/OData/options @@ -1,2 +1,3 @@ semmle-extractor-options: /nostdlib /noconfig semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj +semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.Http.OData.cs diff --git a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs index 2f6673628748..da46281cf2d1 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs +++ b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs @@ -1,5 +1,3 @@ -// This file contains auto-generated code. -// Generated from `Microsoft.AspNet.OData, Version=7.7.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35`. namespace Microsoft.AspNet.OData { public class ODataActionParameters : System.Collections.Generic.Dictionary @@ -11,9 +9,9 @@ public class Delta where TStructuralType : class { public Delta() => throw null; public TStructuralType GetInstance() => throw null; - public void Patch(TStructuralType original) => throw null; + public TStructuralType Patch(TStructuralType original) => throw null; public void Put(TStructuralType original) => throw null; - public void CopyChangedValues(TStructuralType original) => throw null; + public TStructuralType CopyChangedValues(TStructuralType original) => throw null; public void CopyUnchangedValues(TStructuralType original) => throw null; } } diff --git a/csharp/ql/test/resources/stubs/System.Web.Http.OData.cs b/csharp/ql/test/resources/stubs/System.Web.Http.OData.cs new file mode 100644 index 000000000000..e4b9775379c7 --- /dev/null +++ b/csharp/ql/test/resources/stubs/System.Web.Http.OData.cs @@ -0,0 +1,15 @@ +namespace System.Web.Http.OData +{ + public class ODataActionParameters : System.Collections.Generic.Dictionary + { + } + + public class Delta where TEntityType : class + { + public TEntityType GetEntity() => throw null; + public void Patch(TEntityType original) { } + public void Put(TEntityType original) { } + public void CopyChangedValues(TEntityType original) { } + public void CopyUnchangedValues(TEntityType original) { } + } +} From 7d9ae21aae92a8e47ad78f3db878f4ae5464a279 Mon Sep 17 00:00:00 2001 From: Alex Ausch Date: Tue, 25 Aug 2026 16:32:01 +0200 Subject: [PATCH 139/181] Python: test the Python 2 except reading through extraction, not a unit test Replaces `tests/test_except_clause.py` with an extractor test, as suggested in review. `python/ql/test/2/extractor-tests/relaxed_except` extracts a Python 2 file with `--lang=2` and pins, per handler, the types and whether the bound name is a definition -- so it asserts the consequence a query sees, not the shape of the AST. Removing the version gate from `visit_except_clause` makes it fail. Doing it that way needed one extractor fix first. `populator.main` honours `--lang` by calling `update_analysis_version`, but that only rebinds a global in the process that parses the options; the extraction itself runs in an `ExtractorPool`, and on macOS those workers are spawned rather than forked, so they re-read `CODEQL_EXTRACTOR_PYTHON_ANALYSIS_VERSION` from the environment and saw the default of 3. `--lang=2` therefore meant Python 2 on Linux and Python 3 on macOS. Setting the variable as well as the global makes the flag mean the same thing on both, which is what lets the new test pin the Python 2 reading anywhere. Real Python 2 extraction was never affected: the CodeQL action sets that variable itself, and children inherit it. Bumps the extractor version, which the fix in the first commit should have done. Verified with codeql 2.26.3 and this branch's extractor patched into it: `python/ql/test/2/extractor-tests` 10 passed (`hidden` fails identically on the unpatched extractor, so it is not from this branch), and the py3 side is unchanged -- `python/ql/test/query-tests/Imports` all 17 passed, which also confirms the `relaxed_except*.py` query tests added earlier. Co-Authored-By: Claude Opus 5 (1M context) --- python/extractor/semmle/populator.py | 5 ++ python/extractor/semmle/util.py | 2 +- python/extractor/tests/test_except_clause.py | 71 ------------------- .../2/extractor-tests/relaxed_except/options | 1 + .../relaxed_except/relaxed_except.expected | 3 + .../relaxed_except/relaxed_except.ql | 26 +++++++ .../2/extractor-tests/relaxed_except/test.py | 19 +++++ 7 files changed, 55 insertions(+), 72 deletions(-) delete mode 100644 python/extractor/tests/test_except_clause.py create mode 100644 python/ql/test/2/extractor-tests/relaxed_except/options create mode 100644 python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.expected create mode 100644 python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.ql create mode 100644 python/ql/test/2/extractor-tests/relaxed_except/test.py diff --git a/python/extractor/semmle/populator.py b/python/extractor/semmle/populator.py index a1be196ffaf6..603a7e2ddaca 100644 --- a/python/extractor/semmle/populator.py +++ b/python/extractor/semmle/populator.py @@ -65,6 +65,11 @@ def main(sys_path = sys.path[:]): if options.language_version: last_version = options.language_version[-1] update_analysis_version(last_version) + # Worker processes are spawned rather than forked on macOS, so they do + # not inherit the value set above; they re-read it from the environment + # as this module did on import. Set it there too, or `--lang` would take + # effect in this process only, and on one platform only. + os.environ["CODEQL_EXTRACTOR_PYTHON_ANALYSIS_VERSION"] = last_version found_py2 = False if get_analysis_major_version() == 2 and options.extract_stdlib: diff --git a/python/extractor/semmle/util.py b/python/extractor/semmle/util.py index 00651ace8314..977d47c69dca 100644 --- a/python/extractor/semmle/util.py +++ b/python/extractor/semmle/util.py @@ -10,7 +10,7 @@ #Semantic version of extractor. #Update this if any changes are made -VERSION = "7.1.8" +VERSION = "7.1.9" PY_EXTENSIONS = ".py", ".pyw" diff --git a/python/extractor/tests/test_except_clause.py b/python/extractor/tests/test_except_clause.py deleted file mode 100644 index d09ae382b9dd..000000000000 --- a/python/extractor/tests/test_except_clause.py +++ /dev/null @@ -1,71 +0,0 @@ -import unittest -from contextlib import contextmanager - -from semmle import util -from semmle.python import ast -from semmle.python import parser -from semmle.python.parser.dump_ast import StdoutLogger -from semmle.python.parser.tokenizer import Tokenizer - - -@contextmanager -def analysis_version(version): - 'Extract as if `CODEQL_EXTRACTOR_PYTHON_ANALYSIS_VERSION` were `version`.' - previous = util.get_analysis_version() - util.update_analysis_version(version) - try: - yield - finally: - util.update_analysis_version(previous) - - -class ExceptClauseTest(unittest.TestCase): - '''`except_clause: 'except' [test [(',' | 'as') test]]` is one grammar rule - covering two incompatible readings of `except A, B:` -- a Python 2 alias - binding and a PEP 758 tuple of exception types. Which one the default parser - picks depends on the version being extracted, so these tests pin both. - ''' - - def handler(self, source): - 'The first `except` handler of the first statement of `source`.' - with StdoutLogger() as logger: - module = parser.parse(Tokenizer(source).tokens(), logger) - return module.body[0].handlers[0] - - def test_comma_is_a_tuple_of_types_in_python_3(self): - with analysis_version("3.11"): - handler = self.handler("try:\n a\nexcept b, c:\n d\n") - self.assertIsNone(handler.name) - self.assertIsInstance(handler.type, ast.Tuple) - self.assertIsInstance(handler.type.ctx, ast.Load) - self.assertEqual(["b", "c"], [elt.id for elt in handler.type.elts]) - for elt in handler.type.elts: - self.assertIsInstance(elt.ctx, ast.Load) - - def test_comma_is_an_alias_binding_in_python_2(self): - with analysis_version("2.7.18"): - handler = self.handler("try:\n a\nexcept b, c:\n d\n") - self.assertIsInstance(handler.type, ast.Name) - self.assertEqual("b", handler.type.id) - self.assertIsInstance(handler.type.ctx, ast.Load) - self.assertIsInstance(handler.name, ast.Name) - self.assertEqual("c", handler.name.id) - self.assertIsInstance(handler.name.ctx, ast.Store) - - def test_as_is_an_alias_binding_in_both_versions(self): - for version in ("3.11", "2.7.18"): - with analysis_version(version): - handler = self.handler("try:\n a\nexcept b as c:\n d\n") - self.assertIsInstance(handler.type, ast.Name, version) - self.assertEqual("b", handler.type.id, version) - self.assertIsInstance(handler.name, ast.Name, version) - self.assertEqual("c", handler.name.id, version) - self.assertIsInstance(handler.name.ctx, ast.Store, version) - - def test_parenthesised_types_bind_no_alias_in_either_version(self): - for version in ("3.11", "2.7.18"): - with analysis_version(version): - handler = self.handler("try:\n a\nexcept (b, c):\n d\n") - self.assertIsNone(handler.name, version) - self.assertIsInstance(handler.type, ast.Tuple, version) - self.assertEqual(["b", "c"], [elt.id for elt in handler.type.elts], version) diff --git a/python/ql/test/2/extractor-tests/relaxed_except/options b/python/ql/test/2/extractor-tests/relaxed_except/options new file mode 100644 index 000000000000..b61a8c65a925 --- /dev/null +++ b/python/ql/test/2/extractor-tests/relaxed_except/options @@ -0,0 +1 @@ +semmle-extractor-options: --lang=2 diff --git a/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.expected b/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.expected new file mode 100644 index 000000000000..06aeec986903 --- /dev/null +++ b/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.expected @@ -0,0 +1,3 @@ +| 6 | ValueError | err (definition) | +| 12 | ValueError | other (definition) | +| 18 | ValueError, TypeError | none | diff --git a/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.ql b/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.ql new file mode 100644 index 000000000000..55369e89f836 --- /dev/null +++ b/python/ql/test/2/extractor-tests/relaxed_except/relaxed_except.ql @@ -0,0 +1,26 @@ +/** + * The types of each `except` clause, and the name it binds. In Python 2 the + * comma form binds a name and has a single type; reading it as a PEP 758 tuple + * instead would give two types and no name. + */ + +import python + +from ExceptStmt handler, string types, string name +where + types = + concat(Expr type | + type = handler.getType() + | + type.toString(), ", " order by type.getLocation().getStartColumn() + ) and + ( + exists(Name bound | bound = handler.getName() | + bound.isDefinition() and name = bound.getId() + " (definition)" + or + not bound.isDefinition() and name = bound.getId() + " (use)" + ) + or + not exists(handler.getName()) and name = "none" + ) +select handler.getLocation().getStartLine(), types, name diff --git a/python/ql/test/2/extractor-tests/relaxed_except/test.py b/python/ql/test/2/extractor-tests/relaxed_except/test.py new file mode 100644 index 000000000000..f1fbade32f99 --- /dev/null +++ b/python/ql/test/2/extractor-tests/relaxed_except/test.py @@ -0,0 +1,19 @@ +# When extracting Python 2, `except A, e:` binds `e`. It is not a PEP 758 +# unparenthesized tuple of exception types, which is what the same syntax means +# from Python 3.14 on. +try: + unlikely() +except ValueError, err: + print err + +# `as` means the same thing in every version. +try: + unlikely() +except ValueError as other: + print other + +# A parenthesized tuple is several types, and binds nothing. +try: + unlikely() +except (ValueError, TypeError): + pass From e9ab160bfb49dd22b3812dce265df67fcf8eccbb Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 25 Aug 2026 16:21:41 +0100 Subject: [PATCH 140/181] Rust: Add a test case for rust/hard-coded-cryptographic-value. --- .../HardcodedCryptographicValue.expected | 73 ++++++++++++------- .../security/CWE-798/test_cookie.rs | 10 ++- 2 files changed, 54 insertions(+), 29 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 3290d7bca875..5440e3f565a4 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -8,8 +8,11 @@ | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:74:46:74:51 | const2 | This hard-coded value is used as $@. | test_cipher.rs:74:46:74:51 | const2 | a key | | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:26:18:32 | &array1 | This hard-coded value is used as $@. | test_cookie.rs:18:26:18:32 | &array1 | a key | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:26:22:32 | &array2 | This hard-coded value is used as $@. | test_cookie.rs:22:26:22:32 | &array2 | a key | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:42:34:42:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:42:34:42:39 | array2 | a key | -| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:53:34:53:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:53:34:53:39 | array3 | a key | +| test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | +| test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | +| test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:50:34:50:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:50:34:50:39 | array2 | a key | +| test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:61:34:61:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:61:34:61:39 | array3 | a key | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | This hard-coded value is used as $@. | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | a salt | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | This hard-coded value is used as $@. | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | a salt | | test_heuristic.rs:40:27:40:32 | 0xFFFF | test_heuristic.rs:40:27:40:32 | 0xFFFF | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | This hard-coded value is used as $@. | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | a salt | @@ -28,31 +31,31 @@ edges | test_cipher.rs:18:28:18:36 | &... [&ref] | test_cipher.rs:18:9:18:14 | const1 [&ref] | provenance | | | test_cipher.rs:18:29:18:36 | [0u8; 16] | test_cipher.rs:18:28:18:36 | &... [&ref] | provenance | | | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) | provenance | Sink:MaD:2 | -| test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:19:73:19:78 | const1 [&ref] | test_cipher.rs:19:49:19:79 | ...::from_slice(...) [&ref] | provenance | MaD:14 | | test_cipher.rs:25:9:25:14 | const4 [&ref] | test_cipher.rs:26:66:26:71 | const4 [&ref] | provenance | | | test_cipher.rs:25:28:25:36 | &... [&ref] | test_cipher.rs:25:9:25:14 | const4 [&ref] | provenance | | | test_cipher.rs:25:29:25:36 | [0u8; 16] | test_cipher.rs:25:28:25:36 | &... [&ref] | provenance | | | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) | provenance | Sink:MaD:3 | -| test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:26:66:26:71 | const4 [&ref] | test_cipher.rs:26:42:26:72 | ...::from_slice(...) [&ref] | provenance | MaD:14 | | test_cipher.rs:29:9:29:14 | const5 [&ref] | test_cipher.rs:30:95:30:100 | const5 [&ref] | provenance | | | test_cipher.rs:29:28:29:36 | &... [&ref] | test_cipher.rs:29:9:29:14 | const5 [&ref] | provenance | | | test_cipher.rs:29:29:29:36 | [0u8; 16] | test_cipher.rs:29:28:29:36 | &... [&ref] | provenance | | | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) | provenance | Sink:MaD:4 | -| test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:30:95:30:100 | const5 [&ref] | test_cipher.rs:30:72:30:101 | ...::from_slice(...) [&ref] | provenance | MaD:14 | | test_cipher.rs:37:9:37:14 | const7 | test_cipher.rs:38:74:38:79 | const7 | provenance | | | test_cipher.rs:37:27:37:74 | [...] | test_cipher.rs:37:9:37:14 | const7 | provenance | | | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) | provenance | Sink:MaD:2 | -| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:38:73:38:79 | &const7 [&ref] | test_cipher.rs:38:49:38:80 | ...::from_slice(...) [&ref] | provenance | MaD:14 | | test_cipher.rs:38:74:38:79 | const7 | test_cipher.rs:38:73:38:79 | &const7 [&ref] | provenance | | | test_cipher.rs:41:9:41:14 | const8 [&ref] | test_cipher.rs:42:73:42:78 | const8 [&ref] | provenance | | | test_cipher.rs:41:28:41:76 | &... [&ref] | test_cipher.rs:41:9:41:14 | const8 [&ref] | provenance | | | test_cipher.rs:41:29:41:76 | [...] | test_cipher.rs:41:28:41:76 | &... [&ref] | provenance | | | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) | provenance | Sink:MaD:2 | -| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:13 | +| test_cipher.rs:42:73:42:78 | const8 [&ref] | test_cipher.rs:42:49:42:79 | ...::from_slice(...) [&ref] | provenance | MaD:14 | | test_cipher.rs:50:9:50:15 | const10 [element] | test_cipher.rs:51:75:51:81 | const10 [element] | provenance | | | test_cipher.rs:50:37:50:54 | ...::zeroed(...) | test_cipher.rs:50:9:50:15 | const10 [element] | provenance | Src:MaD:7 | | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) | provenance | Sink:MaD:2 Sink:MaD:2 | -| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:13 | +| test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | test_cipher.rs:51:50:51:82 | ...::from_slice(...) [&ref, element] | provenance | MaD:14 | | test_cipher.rs:51:75:51:81 | const10 [element] | test_cipher.rs:51:74:51:81 | &const10 [&ref, element] | provenance | | | test_cipher.rs:73:9:73:14 | const2 [&ref] | test_cipher.rs:74:46:74:51 | const2 | provenance | Sink:MaD:6 | | test_cipher.rs:73:18:73:26 | &... [&ref] | test_cipher.rs:73:9:73:14 | const2 [&ref] | provenance | | @@ -65,16 +68,22 @@ edges | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:9:21:14 | array2 | provenance | | | test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:26:22:32 | &array2 | provenance | Sink:MaD:5 | | test_cookie.rs:22:27:22:32 | array2 | test_cookie.rs:22:26:22:32 | &array2 [&ref] | provenance | | -| test_cookie.rs:38:9:38:14 | array2 | test_cookie.rs:42:34:42:39 | array2 | provenance | Sink:MaD:1 | -| test_cookie.rs:38:18:38:37 | ...::from(...) | test_cookie.rs:38:9:38:14 | array2 | provenance | | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:8 | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:9 | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:10 | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:11 | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | test_cookie.rs:38:18:38:37 | ...::from(...) | provenance | MaD:12 | -| test_cookie.rs:49:9:49:14 | array3 [element] | test_cookie.rs:53:34:53:39 | array3 | provenance | Sink:MaD:1 | -| test_cookie.rs:49:23:49:25 | 0u8 | test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | provenance | MaD:14 | -| test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | test_cookie.rs:49:9:49:14 | array3 [element] | provenance | | +| test_cookie.rs:25:9:25:12 | str3 | test_cookie.rs:30:26:30:29 | str3 | provenance | | +| test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:25:9:25:12 | str3 | provenance | | +| test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:25:9:25:12 | str3 | provenance | | +| test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:25:9:25:12 | str3 | provenance | | +| test_cookie.rs:30:26:30:29 | str3 | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | provenance | MaD:13 | +| test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | test_cookie.rs:30:26:30:40 | str3.as_bytes() | provenance | Sink:MaD:5 | +| test_cookie.rs:46:9:46:14 | array2 | test_cookie.rs:50:34:50:39 | array2 | provenance | Sink:MaD:1 | +| test_cookie.rs:46:18:46:37 | ...::from(...) | test_cookie.rs:46:9:46:14 | array2 | provenance | | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:8 | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:9 | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:10 | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:11 | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:12 | +| test_cookie.rs:57:9:57:14 | array3 [element] | test_cookie.rs:61:34:61:39 | array3 | provenance | Sink:MaD:1 | +| test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | provenance | MaD:15 | +| test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | test_cookie.rs:57:9:57:14 | array3 [element] | provenance | | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | provenance | | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | provenance | | | test_heuristic.rs:39:62:40:33 | static MY_STATIC_3 | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | provenance | | @@ -99,8 +108,9 @@ models | 10 | Summary: ::from; Argument[0].Field[alloc::collections::binary_heap::BinaryHeap::data]; ReturnValue; value | | 11 | Summary: ::from; Argument[0].Field[alloc::string::String::vec]; ReturnValue; value | | 12 | Summary: ::from; Argument[0]; ReturnValue; taint | -| 13 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | -| 14 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | +| 13 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference; taint | +| 14 | Summary: ::from_slice; Argument[0].Reference; ReturnValue.Reference; value | +| 15 | Summary: alloc::vec::from_elem; Argument[0]; ReturnValue.Element; value | nodes | test_cipher.rs:18:9:18:14 | const1 [&ref] | semmle.label | const1 [&ref] | | test_cipher.rs:18:28:18:36 | &... [&ref] | semmle.label | &... [&ref] | @@ -152,14 +162,21 @@ nodes | test_cookie.rs:22:26:22:32 | &array2 | semmle.label | &array2 | | test_cookie.rs:22:26:22:32 | &array2 [&ref] | semmle.label | &array2 [&ref] | | test_cookie.rs:22:27:22:32 | array2 | semmle.label | array2 | -| test_cookie.rs:38:9:38:14 | array2 | semmle.label | array2 | -| test_cookie.rs:38:18:38:37 | ...::from(...) | semmle.label | ...::from(...) | -| test_cookie.rs:38:28:38:36 | [0u8; 64] | semmle.label | [0u8; 64] | -| test_cookie.rs:42:34:42:39 | array2 | semmle.label | array2 | -| test_cookie.rs:49:9:49:14 | array3 [element] | semmle.label | array3 [element] | -| test_cookie.rs:49:23:49:25 | 0u8 | semmle.label | 0u8 | -| test_cookie.rs:49:23:49:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | -| test_cookie.rs:53:34:53:39 | array3 | semmle.label | array3 | +| test_cookie.rs:25:9:25:12 | str3 | semmle.label | str3 | +| test_cookie.rs:26:14:26:18 | "one" | semmle.label | "one" | +| test_cookie.rs:27:14:27:18 | "two" | semmle.label | "two" | +| test_cookie.rs:28:14:28:19 | "many" | semmle.label | "many" | +| test_cookie.rs:30:26:30:29 | str3 | semmle.label | str3 | +| test_cookie.rs:30:26:30:40 | str3.as_bytes() | semmle.label | str3.as_bytes() | +| test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | semmle.label | str3.as_bytes() [&ref] | +| test_cookie.rs:46:9:46:14 | array2 | semmle.label | array2 | +| test_cookie.rs:46:18:46:37 | ...::from(...) | semmle.label | ...::from(...) | +| test_cookie.rs:46:28:46:36 | [0u8; 64] | semmle.label | [0u8; 64] | +| test_cookie.rs:50:34:50:39 | array2 | semmle.label | array2 | +| test_cookie.rs:57:9:57:14 | array3 [element] | semmle.label | array3 [element] | +| test_cookie.rs:57:23:57:25 | 0u8 | semmle.label | 0u8 | +| test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | +| test_cookie.rs:61:34:61:39 | array3 | semmle.label | array3 | | test_heuristic.rs:38:25:38:30 | 0xFFFF | semmle.label | 0xFFFF | | test_heuristic.rs:39:25:39:59 | ... as u64 | semmle.label | ... as u64 | | test_heuristic.rs:39:62:40:33 | static MY_STATIC_3 | semmle.label | static MY_STATIC_3 | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs index 10852583c678..5eeb8da8b5df 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs @@ -3,7 +3,7 @@ use cookie::{CookieJar, SignedJar, PrivateJar, Key}; // --- tests --- -fn test_cookie_jar(array_var: &[u8]) { +fn test_cookie_jar(array_var: &[u8], val: u64) { let mut jar = CookieJar::new(); let key_generate = Key::generate(); // good @@ -21,6 +21,14 @@ fn test_cookie_jar(array_var: &[u8]) { let array2: [u8; 64] = [0; 64]; // $ Alert[rust/hard-coded-cryptographic-value] let key2 = Key::from(&array2); // $ Sink _ = jar.private_mut(&key2); + + let str3 = match(val) { + 0 => "one", // $ Alert[rust/hard-coded-cryptographic-value] + 1 => "two", // $ Alert[rust/hard-coded-cryptographic-value] + _ => "many" // $ Alert[rust/hard-coded-cryptographic-value] + }; + let key3 = Key::from(str3.as_bytes()); // $ Sink + _ = jar.signed_mut(&key3); } fn test_biscotti_crypto(array_var: &[u8]) { From 73c442755c832e741986081067f5a5775c6dff85 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 25 Aug 2026 16:09:03 +0100 Subject: [PATCH 141/181] Rust: Fix near duplicate results. --- .../HardcodedCryptographicValueExtensions.qll | 5 +++++ .../CWE-798/HardcodedCryptographicValue.expected | 12 +++--------- .../test/query-tests/security/CWE-798/test_cookie.rs | 8 ++++---- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index ea57d9427338..768f684cea5b 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -71,6 +71,11 @@ module HardcodedCryptographicValue { or isConstant(e.(ArrayRepeatExpr).getRepeatOperand()) // e.g. `[0; 10]` or + // a match expression with one or more constant arms; taint would reach here + // anyway, but we make it a source to avoid reporting many similar results + // on each match arm. + isConstant(e.(MatchExpr).getMatchArmList().getAnArm().getExpr()) + or // e.g. `const MY_CONST: u64 = ...` // the constant initializer / body is the preferred source location for flow paths, when available. e = any(Const c).getBody() diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 5440e3f565a4..d77634d1fd9e 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -8,9 +8,7 @@ | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:73:19:73:26 | [0u8; 32] | test_cipher.rs:74:46:74:51 | const2 | This hard-coded value is used as $@. | test_cipher.rs:74:46:74:51 | const2 | a key | | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:26:18:32 | &array1 | This hard-coded value is used as $@. | test_cookie.rs:18:26:18:32 | &array1 | a key | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:26:22:32 | &array2 | This hard-coded value is used as $@. | test_cookie.rs:22:26:22:32 | &array2 | a key | -| test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | -| test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | -| test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | +| test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | | test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:50:34:50:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:50:34:50:39 | array2 | a key | | test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:61:34:61:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:61:34:61:39 | array3 | a key | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | This hard-coded value is used as $@. | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | a salt | @@ -69,9 +67,7 @@ edges | test_cookie.rs:22:26:22:32 | &array2 [&ref] | test_cookie.rs:22:26:22:32 | &array2 | provenance | Sink:MaD:5 | | test_cookie.rs:22:27:22:32 | array2 | test_cookie.rs:22:26:22:32 | &array2 [&ref] | provenance | | | test_cookie.rs:25:9:25:12 | str3 | test_cookie.rs:30:26:30:29 | str3 | provenance | | -| test_cookie.rs:26:14:26:18 | "one" | test_cookie.rs:25:9:25:12 | str3 | provenance | | -| test_cookie.rs:27:14:27:18 | "two" | test_cookie.rs:25:9:25:12 | str3 | provenance | | -| test_cookie.rs:28:14:28:19 | "many" | test_cookie.rs:25:9:25:12 | str3 | provenance | | +| test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:9:25:12 | str3 | provenance | | | test_cookie.rs:30:26:30:29 | str3 | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | provenance | MaD:13 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | test_cookie.rs:30:26:30:40 | str3.as_bytes() | provenance | Sink:MaD:5 | | test_cookie.rs:46:9:46:14 | array2 | test_cookie.rs:50:34:50:39 | array2 | provenance | Sink:MaD:1 | @@ -163,9 +159,7 @@ nodes | test_cookie.rs:22:26:22:32 | &array2 [&ref] | semmle.label | &array2 [&ref] | | test_cookie.rs:22:27:22:32 | array2 | semmle.label | array2 | | test_cookie.rs:25:9:25:12 | str3 | semmle.label | str3 | -| test_cookie.rs:26:14:26:18 | "one" | semmle.label | "one" | -| test_cookie.rs:27:14:27:18 | "two" | semmle.label | "two" | -| test_cookie.rs:28:14:28:19 | "many" | semmle.label | "many" | +| test_cookie.rs:25:16:29:5 | match ... { ... } | semmle.label | match ... { ... } | | test_cookie.rs:30:26:30:29 | str3 | semmle.label | str3 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() | semmle.label | str3.as_bytes() | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | semmle.label | str3.as_bytes() [&ref] | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs index 5eeb8da8b5df..410ddf1b8aaa 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs @@ -23,10 +23,10 @@ fn test_cookie_jar(array_var: &[u8], val: u64) { _ = jar.private_mut(&key2); let str3 = match(val) { - 0 => "one", // $ Alert[rust/hard-coded-cryptographic-value] - 1 => "two", // $ Alert[rust/hard-coded-cryptographic-value] - _ => "many" // $ Alert[rust/hard-coded-cryptographic-value] - }; + 0 => "one", + 1 => "two", + _ => "many" + }; // $ Alert[rust/hard-coded-cryptographic-value] let key3 = Key::from(str3.as_bytes()); // $ Sink _ = jar.signed_mut(&key3); } From d15895c952d18b14f96e06503d881e38593e1d59 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Tue, 25 Aug 2026 17:27:21 +0100 Subject: [PATCH 142/181] Rust: Change note. --- .../2026-08-25-hardcoded-cryptographic-match-expressions.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md diff --git a/rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md b/rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md new file mode 100644 index 000000000000..b2c71664f87a --- /dev/null +++ b/rust/ql/src/change-notes/2026-08-25-hardcoded-cryptographic-match-expressions.md @@ -0,0 +1,5 @@ +--- +category: minorAnalysis +--- +* The `rust/hard-coded-cryptographic-value` query has been adjusted to produce +fewer results in certain situations where many results were being produced with very similar source locations. From ff0f892a3d0b53aa5cc36c6a0d0c1472557f20f4 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Tue, 25 Aug 2026 17:48:58 +0100 Subject: [PATCH 143/181] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll index 402925117c56..e42e09b5d7c6 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll @@ -1477,7 +1477,7 @@ module Public { import Public -/** An static single assignment (SSA) definition. */ +/** A static single assignment (SSA) definition. */ class Definition extends SsaImpl::Definition { /** * Holds if this SSA definition is live at the end of basic block `bb`. From 94165df4f066ec428ec33d3e14a81c2532b26cfe Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 26 Aug 2026 12:29:40 +0200 Subject: [PATCH 144/181] Apply batched suggestions from code review Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll | 4 ++-- .../ql/lib/codeql/unified/internal/NameBindingPlugin.qll | 3 +-- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 6 ++++-- .../static-name-binding/unqualified-access.swift | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index f2a7acabf41f..60168bd98304 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -7,8 +7,8 @@ private import codeql.unified.internal.NameBindingPlugin /** Stats about identifiers that static name binding could resolve. */ module StaticNameResolutionStats implements EntityStatsSig { /** - * Holds if `name` has been positively identified as something that refer to a value, and static name binding - * is thus not expected to resolve its members. + * Holds if `name` has been positively identified as referring to a value, so static name binding + * is not expected to resolve its members. */ private predicate resolvesToValue(Identifier name) { exists(AstNode decl | diff --git a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll index a3b4ce6f7ff8..4c8aa3e49e6c 100644 --- a/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll +++ b/unified/ql/lib/codeql/unified/internal/NameBindingPlugin.qll @@ -29,8 +29,7 @@ class NameBindingPlugin extends Unit { /** * Holds if `member` can be inherited by subclasses of `cls`. * - * The caller has already restricted `member` to be a member of `cls`, and - * ensured that `member` is a `VariableDeclaration` or `FunctionDeclaration`. + * The caller has already restricted `member` to be a member of `cls`. */ bindingset[cls, member] predicate isInheritableMember(ClassLikeDeclaration cls, Member member) { none() } diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index b38d405b165d..e570b2ea4e55 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -64,6 +64,8 @@ class NameBindingNode extends TNameBindingNode { or this.isStaticMemberNamespace(result) or + this.isInstanceMemberNamespace(result) + or this.isLocalNamespace(result) or this.isModuleScopeNode(result) @@ -314,7 +316,7 @@ private predicate derivedStoreReadStep(NameBindingNode node1, NameBindingNode no ) } -/** Holds if the member represented by `node` cannot be inherited. */ +/** Holds if the member represented by `node` can be inherited. */ pragma[nomagic] private predicate isInheritableMemberNode(NameBindingNode node) { exists(NameDeclaration decl | @@ -563,7 +565,7 @@ private module FolderHeuristic { /** * Holds if `access` may resolve to `target` through the enclosing `accessingClass`. * - * `instanceAccess` indicates if this this member should be accessed as an instance of `accessingClass` + * `instanceAccess` indicates whether this member should be accessed as an instance of `accessingClass` * or as a static member. */ private predicate unqualifiedMemberAccessCand( diff --git a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift index 434dd0dc8ac1..732e65563b3b 100644 --- a/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift +++ b/unified/ql/test/library-tests/static-name-binding/unqualified-access.swift @@ -10,7 +10,7 @@ class ASub : A { // $ access=A class BSub : B { // $ access=A.B let x3: B = nil; // $ access=A.B - let x4: C = nil; // $ access=A.B.C // spurious result from folder-based heuristic + let x4: C = nil; // $ access=A.B.C } class BSub2 : B { // $ access=A.B From 7190c8c26fd2c8286094a3e2d5346389f7ab125e Mon Sep 17 00:00:00 2001 From: Asger F Date: Wed, 26 Aug 2026 12:27:47 +0200 Subject: [PATCH 145/181] unified: Use getStaticBindingTarget in Candidate.getTarget --- unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll index 60168bd98304..d894e02e2c7e 100644 --- a/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll +++ b/unified/ql/lib/codeql/unified/internal/AnalysisQuality.qll @@ -49,10 +49,7 @@ module StaticNameResolutionStats implements EntityStatsSig { NameBindingNode getTarget() { ( - exists(NameDeclaration decl | - result.isIdentifier(decl) and - trackNameDeclaration(decl).isIdentifier(this) - ) + result.asIdentifier() = getStaticBindingTarget(this) or result.isModuleScopeNode(_) and result.(NamespaceNode).ref().isIdentifier(this) From 49600c17b752590c2bff7e01c8ee46afe8381c37 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Wed, 26 Aug 2026 12:54:41 +0100 Subject: [PATCH 146/181] C++: Add comments. --- .../code/cpp/ir/dataflow/internal/SsaImpl.qll | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll index e42e09b5d7c6..38fbf87a403b 100644 --- a/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll +++ b/cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/SsaImpl.qll @@ -1446,15 +1446,31 @@ module Public { not def instanceof PhiNode } + /** + * The `getAnUltimateDefinition` predicate uses an optimized step relation + * which is pruned to only those uncertain steps which lead back to a + * definition which satisfies `relevantUltimateDefinition`. This predicate + * computes the subset of `Definition`s which can lead back to definitions + * which satisfy `relevantUltimateDefinition`. + */ private predicate fwd(Definition def) { + // Base case: This definition is a relevant definition relevantUltimateDefinition(def) or exists(Definition def0 | + // Recursive case: `def0` is a relevant definition, and + // `def` is an uncertain step which takes us back to `def0`. fwd(def0) and def0 = getAPhiInputOrPriorDefinition(def) ) } + /** + * Holds if `def1 = getAPhiInputOrPriorDefinition(def2)`, and + * both `def1` and `def2` are part of a sequence of uncertain + * steps which lead back to a `Definition` which + * satisfies `relevantUltimateDefinition`. + */ private predicate step(Definition def1, Definition def2) { fwd(def1) and fwd(def2) and From 08f0b1652c2dfd133ac23f5e9f1fba59f2cfa87d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 24 Aug 2026 14:19:07 +0200 Subject: [PATCH 147/181] C#: Use ProcessStartInfo.ArgumentList instead of Arguments to automatically handled escaping and quoting. --- .../DotNet.cs | 39 ++++++------- .../DotNetCliInvoker.cs | 19 +++--- .../FeedManager.cs | 24 +++----- .../IDotNet.cs | 4 +- .../IDotNetCliInvoker.cs | 8 +-- .../NugetPackageRestorer.cs | 16 ++--- .../PackagesConfigRestorer.cs | 12 ++-- .../DotnetSourceGeneratorWrapper.cs | 2 +- .../Semmle.Extraction.Tests/DotNet.cs | 58 +++++++++---------- .../Semmle.Extraction.Tests/Runtime.cs | 2 +- 10 files changed, 88 insertions(+), 96 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs index e02d157dc620..9fd3749ae340 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNet.cs @@ -49,7 +49,7 @@ private void Info() // Allow up to four attempts (with up to three retries) to run `dotnet --info`, to mitigate transient issues for (int attempt = 0; attempt < 4; attempt++) { - var exitCode = dotnetCliInvoker.RunCommandExitCode("--info", silent: false); + var exitCode = dotnetCliInvoker.RunCommandExitCode(["--info"], silent: false); switch (exitCode) { case 0: @@ -63,9 +63,9 @@ private void Info() } } - private string GetRestoreArgs(RestoreSettings restoreSettings) + private List GetRestoreArgs(RestoreSettings restoreSettings) { - var args = $"restore --no-dependencies \"{restoreSettings.File}\" --packages \"{restoreSettings.PackageDirectory}\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal"; + List args = ["restore", "--no-dependencies", restoreSettings.File, "--packages", restoreSettings.PackageDirectory, "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"]; if (restoreSettings.ForceDotnetRefAssemblyFetching) { @@ -77,23 +77,20 @@ private string GetRestoreArgs(RestoreSettings restoreSettings) Directory.CreateDirectory(path); } - args += $" /p:TargetFrameworkRootPath=\"{path}\" /p:NetCoreTargetingPackRoot=\"{path}\" /p:AllowMissingPrunePackageData=true"; + args.AddRange([$"/p:TargetFrameworkRootPath={path}", $"/p:NetCoreTargetingPackRoot={path}", "/p:AllowMissingPrunePackageData=true"]); } if (restoreSettings.ForceReevaluation) { - args += " --force"; + args.Add("--force"); } if (restoreSettings.TargetWindows) { - args += " /p:EnableWindowsTargeting=true"; + args.Add("/p:EnableWindowsTargeting=true"); } - if (restoreSettings.NugetSources is not null) - { - args += $" {restoreSettings.NugetSources}"; - } + args.AddRange(restoreSettings.NugetSources); return args; } @@ -107,48 +104,48 @@ public RestoreResult Restore(RestoreSettings restoreSettings) public bool New(string folder) { - var args = $"new console --no-restore --output \"{folder}\""; + List args = ["new", "console", "--no-restore", "--output", folder]; return dotnetCliInvoker.RunCommand(args); } public bool AddPackage(string folder, string package) { - var args = $"add \"{folder}\" package \"{package}\" --no-restore"; + List args = ["add", folder, "package", package, "--no-restore"]; return dotnetCliInvoker.RunCommand(args); } - public IList GetListedRuntimes() => GetResultList("--list-runtimes"); + public IList GetListedRuntimes() => GetResultList(["--list-runtimes"]); - public IList GetListedSdks() => GetResultList("--list-sdks"); + public IList GetListedSdks() => GetResultList(["--list-sdks"]); - private IList GetResultList(string args, string? workingDirectory = null, bool silent = true) + private IList GetResultList(List args, string? workingDirectory = null, bool silent = true) { if (dotnetCliInvoker.RunCommand(args, workingDirectory, out var results, silent)) { return results; } - logger.LogWarning($"Running 'dotnet {args}' failed."); + logger.LogWarning($"Running 'dotnet {string.Join(" ", args)}' failed."); return []; } - public bool Exec(string execArgs) + public bool Exec(List execArgs) { - var args = $"exec {execArgs}"; + List args = ["exec", .. execArgs]; return dotnetCliInvoker.RunCommand(args); } - private const string nugetListSourceCommand = "nuget list source --format Short"; + private static readonly IReadOnlyList nugetListSourceCommandArgs = ["nuget", "list", "source", "--format", "Short"]; public IList GetNugetFeeds(string nugetConfig) { logger.LogInfo($"Getting NuGet feeds from '{nugetConfig}'..."); - return GetResultList($"{nugetListSourceCommand} --configfile \"{nugetConfig}\""); + return GetResultList([.. nugetListSourceCommandArgs, "--configfile", nugetConfig]); } public IList GetNugetFeedsFromFolder(string folderPath) { logger.LogInfo($"Getting NuGet feeds in folder '{folderPath}'..."); - return GetResultList(nugetListSourceCommand, folderPath); + return GetResultList(nugetListSourceCommandArgs.ToList(), folderPath); } // The version number should be kept in sync with the version .NET version used for building the application. diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs index 4c4e789973ca..b982cac65477 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/DotNetCliInvoker.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.Diagnostics; using Semmle.Util; using Semmle.Util.Logging; @@ -25,7 +24,7 @@ public DotNetCliInvoker(ILogger logger, string exec, DependabotProxy? dependabot logger.LogInfo($"Using .NET CLI executable: '{Exec}'"); } - private ProcessStartInfo MakeDotnetStartInfo(string args, string? workingDirectory) + private ProcessStartInfo MakeDotnetStartInfo(List args, string? workingDirectory) { var startInfo = new ProcessStartInfo(Exec, args) { @@ -57,39 +56,39 @@ private ProcessStartInfo MakeDotnetStartInfo(string args, string? workingDirecto return startInfo; } - private int RunCommandExitCodeAux(string args, string? workingDirectory, out IList output, out string dirLog, bool silent) + private int RunCommandExitCodeAux(List args, string? workingDirectory, out IList output, out string dirLog, bool silent) { dirLog = string.IsNullOrWhiteSpace(workingDirectory) ? "" : $" in {workingDirectory}"; var pi = MakeDotnetStartInfo(args, workingDirectory); var threadId = Environment.CurrentManagedThreadId; void onOut(string s) => logger.Log(silent ? Severity.Debug : Severity.Info, s, threadId); void onError(string s) => logger.LogError(s, threadId); - logger.LogInfo($"Running '{Exec} {args}'{dirLog}"); + logger.LogInfo($"Running '{Exec} {string.Join(" ", args)}'{dirLog}"); var exitCode = pi.ReadOutput(out output, onOut, onError); return exitCode; } - private bool RunCommandAux(string args, string? workingDirectory, out IList output, bool silent) + private bool RunCommandAux(List args, string? workingDirectory, out IList output, bool silent) { var exitCode = RunCommandExitCodeAux(args, workingDirectory, out output, out var dirLog, silent); if (exitCode != 0) { - logger.LogError($"Command '{Exec} {args}'{dirLog} failed with exit code {exitCode}"); + logger.LogError($"Command '{Exec} {string.Join(" ", args)}'{dirLog} failed with exit code {exitCode}"); return false; } return true; } - public bool RunCommand(string args, bool silent = true) => + public bool RunCommand(List args, bool silent = true) => RunCommandAux(args, null, out _, silent); - public int RunCommandExitCode(string args, bool silent = true) => + public int RunCommandExitCode(List args, bool silent = true) => RunCommandExitCodeAux(args, null, out _, out _, silent); - public bool RunCommand(string args, out IList output, bool silent = true) => + public bool RunCommand(List args, out IList output, bool silent = true) => RunCommandAux(args, null, out output, silent); - public bool RunCommand(string args, string? workingDirectory, out IList output, bool silent = true) => + public bool RunCommand(List args, string? workingDirectory, out IList output, bool silent = true) => RunCommandAux(args, workingDirectory, out output, silent); } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs index 0cbf106df38a..581d4c15e9dd 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/FeedManager.cs @@ -158,24 +158,18 @@ private IEnumerable GetFeedsFromNugetConfig(string nugetConfigPath) => /// /// The list of feeds to use for the restore command. /// The prefix to use for each source argument (e.g., "-s"). - /// The constructed NuGet sources argument for the restore command. - public string FeedsToRestoreArgument(IEnumerable feeds, string sourceArgumentPrefix) + /// The list of NuGet sources arguments for the restore command. + public List FeedsToRestoreArgument(IEnumerable feeds, string sourceArgumentPrefix) { // If there are no feeds, we want to override any default feeds that `restore` would use by passing a dummy source argument. if (!feeds.Any()) { - return $" {sourceArgumentPrefix} \"{emptyPackageDirectory.DirInfo.FullName}\""; + return [sourceArgumentPrefix, emptyPackageDirectory.DirInfo.FullName]; } // Add package sources. If any are present, they override all sources specified in // the configuration file(s). - var feedArgs = new StringBuilder(); - foreach (var feed in feeds) - { - feedArgs.Append($" {sourceArgumentPrefix} \"{feed}\""); - } - - return feedArgs.ToString(); + return feeds.SelectMany(feed => [sourceArgumentPrefix, feed]).ToList(); } private IEnumerable FeedsToUseAux(HashSet feedsToConsider) @@ -212,8 +206,8 @@ public IEnumerable FeedsToUse(string path) /// Constructs the NuGet sources argument for the `dotnet restore` command based on the given feeds. /// /// The list of NuGet feeds to use for the restore command. - /// A string representing the NuGet sources argument for the `dotnet restore` command. - public string FeedsToDotnetRestoreArgument(IEnumerable feeds) + /// A list representing the NuGet sources arguments for the `dotnet restore` command. + public List FeedsToDotnetRestoreArgument(IEnumerable feeds) { return FeedsToRestoreArgument(feeds, "-s"); } @@ -224,13 +218,13 @@ public string FeedsToDotnetRestoreArgument(IEnumerable feeds) /// (2) Use private registries, if they are configured /// /// Path to project/solution - /// A string representing the NuGet sources argument for the `dotnet restore` command. - public string? MakeDotnetRestoreSourcesArgument(string path) + /// A list representing the NuGet sources arguments for the `dotnet restore` command. + public List MakeDotnetRestoreSourcesArguments(string path) { // Do not construct a set of explicit NuGet sources to use for restore. if (!CheckNugetFeedResponsiveness && !HasPrivateRegistryFeeds) { - return null; + return []; } var feedsToUse = FeedsToUse(path); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs index 394a05e9e596..0e93fa92813a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNet.cs @@ -12,12 +12,12 @@ public interface IDotNet bool AddPackage(string folder, string package); IList GetListedRuntimes(); IList GetListedSdks(); - bool Exec(string execArgs); + bool Exec(List execArgs); IList GetNugetFeeds(string nugetConfig); IList GetNugetFeedsFromFolder(string folderPath); } - public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, string? NugetSources = null, bool ForceReevaluation = false, bool TargetWindows = false); + public record class RestoreSettings(string File, string PackageDirectory, bool ForceDotnetRefAssemblyFetching, List NugetSources, bool ForceReevaluation = false, bool TargetWindows = false); public partial record class RestoreResult(bool Success, IList Output) { diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs index ef5bcd4753bb..b5400ec63319 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/IDotNetCliInvoker.cs @@ -30,26 +30,26 @@ internal interface IDotNetCliInvoker /// Execute `dotnet ` and return true if the command succeeded, otherwise false. /// If `silent` is true the output of the command is logged as `debug` otherwise as `info`. /// - bool RunCommand(string args, bool silent = true); + bool RunCommand(List args, bool silent = true); /// /// Execute `dotnet ` and return the exit code. /// If `silent` is true the output of the command is logged as `debug` otherwise as `info`. /// - int RunCommandExitCode(string args, bool silent = true); + int RunCommandExitCode(List args, bool silent = true); /// /// Execute `dotnet ` and return true if the command succeeded, otherwise false. /// The output of the command is returned in `output`. /// If `silent` is true the output of the command is logged as `debug` otherwise as `info`. /// - bool RunCommand(string args, out IList output, bool silent = true); + bool RunCommand(List args, out IList output, bool silent = true); /// /// Execute `dotnet ` in `` and return true if the command succeeded, otherwise false. /// The output of the command is returned in `output`. /// If `silent` is true the output of the command is logged as `debug` otherwise as `info`. /// - bool RunCommand(string args, string? workingDirectory, out IList output, bool silent = true); + bool RunCommand(List args, string? workingDirectory, out IList output, bool silent = true); } } diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs index 38924e2f876e..264524be0620 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/NugetPackageRestorer.cs @@ -216,7 +216,7 @@ private IEnumerable RestoreSolutions(out DependencyContainer dependencie var projects = fileProvider.Solutions.SelectMany(solution => { logger.LogInfo($"Restoring solution {solution}..."); - var nugetSources = feedManager.MakeDotnetRestoreSourcesArgument(solution); + var nugetSources = feedManager.MakeDotnetRestoreSourcesArguments(solution); var res = dotnet.Restore(new(solution, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, NugetSources: nugetSources, TargetWindows: isWindows)); if (res.Success) { @@ -264,7 +264,7 @@ private void RestoreProjects(IEnumerable projects, out ConcurrentBag GetRestoredPackageDirectoryNames(DirectoryInf .Select(d => Path.GetFileName(d).ToLowerInvariant()); } - private bool TryRestorePackageManually(string package, string? nugetSources, PackageReferenceSource packageReferenceSource = PackageReferenceSource.SdkCsProj, bool tryPrereleaseVersion = true) + private bool TryRestorePackageManually(string package, List nugetSources, PackageReferenceSource packageReferenceSource = PackageReferenceSource.SdkCsProj, bool tryPrereleaseVersion = true) { logger.LogInfo($"Restoring package {package}..."); using var tempDir = new TemporaryDirectory( @@ -460,11 +460,11 @@ private bool TryRestorePackageManually(string package, string? nugetSources, Pac return true; } - if (!feedManager.CheckNugetFeedResponsiveness && res.HasNugetPackageSourceError && nugetSources is not null) + if (!feedManager.CheckNugetFeedResponsiveness && res.HasNugetPackageSourceError && nugetSources.Count > 0) { logger.LogDebug($"Trying to restore '{package}' without explicitly providing NuGet sources."); // Restore could not be completed because the listed source is unavailable. Try without an explicit restore source argument. - res = TryRestorePackageManually(package, nugetSources: null, tempDir, tryPrereleaseVersion); + res = TryRestorePackageManually(package, [], tempDir, tryPrereleaseVersion); if (res.Success) { return true; @@ -475,16 +475,16 @@ private bool TryRestorePackageManually(string package, string? nugetSources, Pac return false; } - private RestoreResult TryRestorePackageManually(string package, string? nugetSources, TemporaryDirectory tempDir, bool tryPrereleaseVersion) + private RestoreResult TryRestorePackageManually(string package, List nugetSources, TemporaryDirectory tempDir, bool tryPrereleaseVersion) { - var res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, NugetSources: nugetSources, ForceReevaluation: true)); + var res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, nugetSources, ForceReevaluation: true)); if (!res.Success && tryPrereleaseVersion && res.HasNugetNoStablePackageVersionError) { logger.LogDebug($"Failed to restore nuget package {package} because no stable version was found."); TryChangePackageVersion(tempDir.DirInfo, "*-*"); - res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, NugetSources: nugetSources, ForceReevaluation: true)); + res = dotnet.Restore(new(tempDir.DirInfo.FullName, missingPackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: false, nugetSources, ForceReevaluation: true)); if (!res.Success) { TryChangePackageVersion(tempDir.DirInfo, "*"); diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs index 05c10cfb2bf3..e5a9365a08e3 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/PackagesConfigRestorer.cs @@ -168,7 +168,7 @@ private bool TryRestoreNugetPackage(string packagesConfig) { logger.LogInfo($"Restoring file \"{packagesConfig}\"..."); - var sourcesArgument = ""; + List sourcesArgument = []; var feedsToUse = feedManager.FeedsToUse(packagesConfig).ToList(); var useDefaultFeed = feedsToUse.Count == 0 && IsDefaultFeedReachable; @@ -189,16 +189,18 @@ private bool TryRestoreNugetPackage(string packagesConfig) * really unwieldy and this solution works for now. */ - string exe, args; + string exe; + List args; + if (RunWithMono) { exe = "mono"; - args = $"\"{nugetExe}\" install -OutputDirectory \"{packageDirectory}\" {sourcesArgument} \"{packagesConfig}\""; + args = [nugetExe!, "install", "-OutputDirectory", packageDirectory.ToString(), .. sourcesArgument, packagesConfig]; } else { exe = nugetExe!; - args = $"install -OutputDirectory \"{packageDirectory}\" {sourcesArgument} \"{packagesConfig}\""; + args = ["install", "-OutputDirectory", packageDirectory.ToString(), .. sourcesArgument, packagesConfig]; } var pi = new ProcessStartInfo(exe, args) @@ -214,7 +216,7 @@ private bool TryRestoreNugetPackage(string packagesConfig) var exitCode = pi.ReadOutput(out _, onOut, onError); if (exitCode != 0) { - logger.LogError($"Command {pi.FileName} {pi.Arguments} failed with exit code {exitCode}"); + logger.LogError($"Command {pi.FileName} {string.Join(" ", pi.ArgumentList)} failed with exit code {exitCode}"); return false; } else diff --git a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorWrapper/DotnetSourceGeneratorWrapper.cs b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorWrapper/DotnetSourceGeneratorWrapper.cs index 9518afac4008..8ecf13d53a6a 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorWrapper/DotnetSourceGeneratorWrapper.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp.DependencyFetching/SourceGenerators/DotnetSourceGeneratorWrapper/DotnetSourceGeneratorWrapper.cs @@ -79,7 +79,7 @@ public IEnumerable RunSourceGenerator(IEnumerable additionalFile sw.Write(argsString); } - dotnet.Exec($"\"{cscPath}\" /noconfig @\"{cscArgsPath}\""); + dotnet.Exec([cscPath, "/noconfig", $"@{cscArgsPath}"]); var files = Directory.GetFiles(outputFolder, "*.*", new EnumerationOptions { RecurseSubdirectories = true }); diff --git a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs index 74939b61af5e..260eae10bd1b 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/DotNet.cs @@ -8,45 +8,45 @@ namespace Semmle.Extraction.Tests { internal class DotNetCliInvokerStub : IDotNetCliInvoker { - private readonly IList output; - private string lastArgs = ""; + private readonly IList returnOutput; + private List lastArgs = []; public string WorkingDirectory { get; private set; } = ""; public bool Success { get; set; } = true; public int ExitCode { get; set; } = 0; - public DotNetCliInvokerStub(IList output) + public DotNetCliInvokerStub(IList returnOutput) { - this.output = output; + this.returnOutput = returnOutput; } public string Exec => "dotnet"; - public bool RunCommand(string args, bool silent) + public bool RunCommand(List args, bool silent) { lastArgs = args; return Success; } - public int RunCommandExitCode(string args, bool silent) + public int RunCommandExitCode(List args, bool silent) { lastArgs = args; return ExitCode; } - public bool RunCommand(string args, out IList output, bool silent) + public bool RunCommand(List args, out IList output, bool silent) { lastArgs = args; - output = this.output; + output = this.returnOutput; return Success; } - public bool RunCommand(string args, string? workingDirectory, out IList output, bool silent) + public bool RunCommand(List args, string? workingDirectory, out IList output, bool silent) { WorkingDirectory = workingDirectory ?? ""; return RunCommand(args, out output, silent); } - public string GetLastArgs() => lastArgs; + public List GetLastArgs() => lastArgs; } public class DotNetTests @@ -83,7 +83,7 @@ public void TestDotnetInfo() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("--info", lastArgs); + Assert.Equal(["--info"], lastArgs); } [Fact] @@ -115,11 +115,11 @@ public void TestDotnetRestoreProjectToDirectory1() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - dotnet.Restore(new("myproject.csproj", "mypackages", false)); + dotnet.Restore(new("myproject.csproj", "mypackages", false, [])); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"myproject.csproj\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal", lastArgs); + Assert.Equal(["restore", "--no-dependencies", "myproject.csproj", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"], lastArgs); } [Fact] @@ -130,11 +130,11 @@ public void TestDotnetRestoreProjectToDirectory2() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, null)); + var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, [])); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"myproject.csproj\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal", lastArgs); + Assert.Equal(["restore", "--no-dependencies", "myproject.csproj", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"], lastArgs); Assert.Equal(2, res.AssetsFilePaths.Count()); Assert.Contains("/path/to/project.assets.json", res.AssetsFilePaths); Assert.Contains("/path/to/project2.assets.json", res.AssetsFilePaths); @@ -148,11 +148,11 @@ public void TestDotnetRestoreProjectToDirectory3() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, null, true)); + var res = dotnet.Restore(new("myproject.csproj", "mypackages", false, [], true)); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"myproject.csproj\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal --force", lastArgs); + Assert.Equal(["restore", "--no-dependencies", "myproject.csproj", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal", "--force"], lastArgs); Assert.Equal(2, res.AssetsFilePaths.Count()); Assert.Contains("/path/to/project.assets.json", res.AssetsFilePaths); Assert.Contains("/path/to/project2.assets.json", res.AssetsFilePaths); @@ -166,11 +166,11 @@ public void TestDotnetRestoreSolutionToDirectory1() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - var res = dotnet.Restore(new("mysolution.sln", "mypackages", false)); + var res = dotnet.Restore(new("mysolution.sln", "mypackages", false, [])); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"mysolution.sln\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal", lastArgs); + Assert.Equal(["restore", "--no-dependencies", "mysolution.sln", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"], lastArgs); Assert.Equal(2, res.RestoredProjects.Count()); Assert.Contains("/path/to/project.csproj", res.RestoredProjects); Assert.Contains("/path/to/project2.csproj", res.RestoredProjects); @@ -188,11 +188,11 @@ public void TestDotnetRestoreSolutionToDirectory2() dotnetCliInvoker.Success = false; // Execute - var res = dotnet.Restore(new("mysolution.sln", "mypackages", false)); + var res = dotnet.Restore(new("mysolution.sln", "mypackages", false, [])); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("restore --no-dependencies \"mysolution.sln\" --packages \"mypackages\" /p:DisableImplicitNuGetFallbackFolder=true --verbosity normal", lastArgs); + Assert.Equal(["restore", "--no-dependencies", "mysolution.sln", "--packages", "mypackages", "/p:DisableImplicitNuGetFallbackFolder=true", "--verbosity", "normal"], lastArgs); Assert.Empty(res.RestoredProjects); Assert.Empty(res.AssetsFilePaths); } @@ -209,7 +209,7 @@ public void TestDotnetNew() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("new console --no-restore --output \"myfolder\"", lastArgs); + Assert.Equal(["new", "console", "--no-restore", "--output", "myfolder"], lastArgs); } [Fact] @@ -224,7 +224,7 @@ public void TestDotnetAddPackage() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("add \"myfolder\" package \"mypackage\" --no-restore", lastArgs); + Assert.Equal(["add", "myfolder", "package", "mypackage", "--no-restore"], lastArgs); } [Fact] @@ -239,7 +239,7 @@ public void TestDotnetGetListedRuntimes1() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("--list-runtimes", lastArgs); + Assert.Equal(["--list-runtimes"], lastArgs); Assert.Equal(2, runtimes.Count); Assert.Contains("Microsoft.AspNetCore.App 7.0.2 [/path/dotnet/shared/Microsoft.AspNetCore.App]", runtimes); Assert.Contains("Microsoft.NETCore.App 7.0.2 [/path/dotnet/shared/Microsoft.NETCore.App]", runtimes); @@ -258,7 +258,7 @@ public void TestDotnetGetListedRuntimes2() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("--list-runtimes", lastArgs); + Assert.Equal(["--list-runtimes"], lastArgs); Assert.Empty(runtimes); } @@ -270,11 +270,11 @@ public void TestDotnetExec() var dotnet = MakeDotnet(dotnetCliInvoker); // Execute - dotnet.Exec("myarg1 myarg2"); + dotnet.Exec(["myarg1", "myarg2"]); // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("exec myarg1 myarg2", lastArgs); + Assert.Equal(["exec", "myarg1", "myarg2"], lastArgs); } [Fact] @@ -289,7 +289,7 @@ public void TestNugetFeeds() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("nuget list source --format Short --configfile \"abc\"", lastArgs); + Assert.Equal(["nuget", "list", "source", "--format", "Short", "--configfile", "abc"], lastArgs); } [Fact] @@ -304,7 +304,7 @@ public void TestNugetFeedsFromFolder() // Verify var lastArgs = dotnetCliInvoker.GetLastArgs(); - Assert.Equal("nuget list source --format Short", lastArgs); + Assert.Equal(["nuget", "list", "source", "--format", "Short"], lastArgs); Assert.Equal("abc", dotnetCliInvoker.WorkingDirectory); } } diff --git a/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs b/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs index 38101420fab2..348cadae2fd0 100644 --- a/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs +++ b/csharp/extractor/Semmle.Extraction.Tests/Runtime.cs @@ -25,7 +25,7 @@ public DotNetStub(IList runtimes, IList sdks) public IList GetListedSdks() => sdks; - public bool Exec(string execArgs) => true; + public bool Exec(List execArgs) => true; public IList GetNugetFeeds(string nugetConfig) => []; From b4e561a931e51f3ae7a03389992de90cd727a15e Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 26 Aug 2026 12:21:31 +0000 Subject: [PATCH 148/181] Python: Split up `except Alpha, Beta:` case across language versions This is the case where the difference in semantics actually changes the output of the query, so we have to maintain language-specific tests for this. The remaining tests stay in the shared directory, as they have the same behaviour on both versions of Python. I've also added a comment pointing this out, in case future readers get confused as to why `except Alpha, Beta: ...` is missing. --- .../Imports/unused/UnusedImport.expected | 1 + .../Imports/unused/UnusedImport.qlref | 1 + .../Imports/unused/relaxed_except.py | 9 +++++++ .../Imports/unused/relaxed_except_defs.py | 6 +++++ .../Imports/unused/UnusedImport.expected | 0 .../Imports/unused/UnusedImport.qlref | 1 + .../Imports/unused/relaxed_except.py | 9 +++++++ .../Imports/unused/relaxed_except_defs.py | 6 +++++ .../Imports/unused/UnusedImport.expected | 2 +- .../Imports/unused/relaxed_except.py | 26 ++++++------------- .../Imports/unused/relaxed_except_defs.py | 8 ------ 11 files changed, 42 insertions(+), 27 deletions(-) create mode 100644 python/ql/test/2/query-tests/Imports/unused/UnusedImport.expected create mode 100644 python/ql/test/2/query-tests/Imports/unused/UnusedImport.qlref create mode 100644 python/ql/test/2/query-tests/Imports/unused/relaxed_except.py create mode 100644 python/ql/test/2/query-tests/Imports/unused/relaxed_except_defs.py create mode 100644 python/ql/test/3/query-tests/Imports/unused/UnusedImport.expected create mode 100644 python/ql/test/3/query-tests/Imports/unused/UnusedImport.qlref create mode 100644 python/ql/test/3/query-tests/Imports/unused/relaxed_except.py create mode 100644 python/ql/test/3/query-tests/Imports/unused/relaxed_except_defs.py diff --git a/python/ql/test/2/query-tests/Imports/unused/UnusedImport.expected b/python/ql/test/2/query-tests/Imports/unused/UnusedImport.expected new file mode 100644 index 000000000000..9480aa15d1b0 --- /dev/null +++ b/python/ql/test/2/query-tests/Imports/unused/UnusedImport.expected @@ -0,0 +1 @@ +| relaxed_except.py:2:1:2:43 | Import | Import of 'Beta' is not used. | diff --git a/python/ql/test/2/query-tests/Imports/unused/UnusedImport.qlref b/python/ql/test/2/query-tests/Imports/unused/UnusedImport.qlref new file mode 100644 index 000000000000..e6bb7ab44cb0 --- /dev/null +++ b/python/ql/test/2/query-tests/Imports/unused/UnusedImport.qlref @@ -0,0 +1 @@ +Imports/UnusedImport.ql diff --git a/python/ql/test/2/query-tests/Imports/unused/relaxed_except.py b/python/ql/test/2/query-tests/Imports/unused/relaxed_except.py new file mode 100644 index 000000000000..f5b1cb036261 --- /dev/null +++ b/python/ql/test/2/query-tests/Imports/unused/relaxed_except.py @@ -0,0 +1,9 @@ +# In Python 2, Beta is an alias binding; in Python 3, it is an exception type. +from relaxed_except_defs import Alpha, Beta + + +def unparenthesized(): + try: + pass + except Alpha, Beta: + raise diff --git a/python/ql/test/2/query-tests/Imports/unused/relaxed_except_defs.py b/python/ql/test/2/query-tests/Imports/unused/relaxed_except_defs.py new file mode 100644 index 000000000000..12a167adf2c9 --- /dev/null +++ b/python/ql/test/2/query-tests/Imports/unused/relaxed_except_defs.py @@ -0,0 +1,6 @@ +class Alpha(Exception): + pass + + +class Beta(Exception): + pass diff --git a/python/ql/test/3/query-tests/Imports/unused/UnusedImport.expected b/python/ql/test/3/query-tests/Imports/unused/UnusedImport.expected new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/ql/test/3/query-tests/Imports/unused/UnusedImport.qlref b/python/ql/test/3/query-tests/Imports/unused/UnusedImport.qlref new file mode 100644 index 000000000000..e6bb7ab44cb0 --- /dev/null +++ b/python/ql/test/3/query-tests/Imports/unused/UnusedImport.qlref @@ -0,0 +1 @@ +Imports/UnusedImport.ql diff --git a/python/ql/test/3/query-tests/Imports/unused/relaxed_except.py b/python/ql/test/3/query-tests/Imports/unused/relaxed_except.py new file mode 100644 index 000000000000..f5b1cb036261 --- /dev/null +++ b/python/ql/test/3/query-tests/Imports/unused/relaxed_except.py @@ -0,0 +1,9 @@ +# In Python 2, Beta is an alias binding; in Python 3, it is an exception type. +from relaxed_except_defs import Alpha, Beta + + +def unparenthesized(): + try: + pass + except Alpha, Beta: + raise diff --git a/python/ql/test/3/query-tests/Imports/unused/relaxed_except_defs.py b/python/ql/test/3/query-tests/Imports/unused/relaxed_except_defs.py new file mode 100644 index 000000000000..12a167adf2c9 --- /dev/null +++ b/python/ql/test/3/query-tests/Imports/unused/relaxed_except_defs.py @@ -0,0 +1,6 @@ +class Alpha(Exception): + pass + + +class Beta(Exception): + pass diff --git a/python/ql/test/query-tests/Imports/unused/UnusedImport.expected b/python/ql/test/query-tests/Imports/unused/UnusedImport.expected index 801305defafd..46f9c1a55e56 100644 --- a/python/ql/test/query-tests/Imports/unused/UnusedImport.expected +++ b/python/ql/test/query-tests/Imports/unused/UnusedImport.expected @@ -6,4 +6,4 @@ | imports_test.py:27:1:27:25 | Import | Import of 'func2' is not used. | | imports_test.py:34:1:34:14 | Import | Import of 'module2' is not used. | | imports_test.py:116:1:116:41 | Import | Import of 'not_a_fixture' is not used. | -| relaxed_except.py:12:1:12:68 | Import | Import of 'NeverUsed' is not used. | +| relaxed_except.py:3:1:3:55 | Import | Import of 'NeverUsed' is not used. | diff --git a/python/ql/test/query-tests/Imports/unused/relaxed_except.py b/python/ql/test/query-tests/Imports/unused/relaxed_except.py index 0f1f29d71ceb..a2a9861aefbe 100644 --- a/python/ql/test/query-tests/Imports/unused/relaxed_except.py +++ b/python/ql/test/query-tests/Imports/unused/relaxed_except.py @@ -1,24 +1,14 @@ # PEP 758 allows unparenthesized exception types when there is no `as` clause. -# Every name below is used as an exception type, so no import here is unused. -# `NeverUsed` is imported and never used, and is the one expected result. -# -# Each name appears in exactly one clause on purpose: a name that also appeared -# in a parenthesized clause would be a use regardless, and would mask the -# behaviour under test. -# -# This file deliberately contains no `except A, B, C:` clause. Three or more -# unparenthesized types fail the default parser, which sends the whole file to -# the tree-sitter parser and would likewise mask it. -from relaxed_except_defs import Alpha, Beta, Delta, Gamma, NeverUsed - - -def unparenthesized(): - try: - pass - except Alpha, Beta: - raise +# Every import below except `NeverUsed` is used, leaving one expected result. +from relaxed_except_defs import Delta, Gamma, NeverUsed +# The `except Alpha, Beta:` case is covered separately in the Python 2 and +# Python 3 test directories because its semantics differ between versions. +# +# The version-specific files deliberately contain no `except A, B, C:` clause. +# Three or more unparenthesized types fail the default parser, which sends the +# whole file to the tree-sitter parser and would mask the behavior under test. def parenthesized(): try: pass diff --git a/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py b/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py index 1c6e63828666..3c6313b3abf9 100644 --- a/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py +++ b/python/ql/test/query-tests/Imports/unused/relaxed_except_defs.py @@ -1,11 +1,3 @@ -class Alpha(Exception): - pass - - -class Beta(Exception): - pass - - class Gamma(Exception): pass From 9500a4ec0641ce285c09a4428b87a045d41071ca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 26 Aug 2026 12:57:52 +0000 Subject: [PATCH 149/181] update codeql documentation --- .../codeql-changelog/codeql-cli-2.26.4.rst | 154 ++++++++++++++++++ .../codeql-changelog/index.rst | 1 + 2 files changed, 155 insertions(+) create mode 100644 docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.4.rst diff --git a/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.4.rst b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.4.rst new file mode 100644 index 000000000000..eb01082cee26 --- /dev/null +++ b/docs/codeql/codeql-overview/codeql-changelog/codeql-cli-2.26.4.rst @@ -0,0 +1,154 @@ +.. _codeql-cli-2.26.4: + +========================== +CodeQL 2.26.4 (2026-08-26) +========================== + +.. contents:: Contents + :depth: 2 + :local: + :backlinks: none + +This is an overview of changes in the CodeQL CLI and relevant CodeQL query and library packs. For additional updates on changes to the CodeQL code scanning experience, check out the `code scanning section on the GitHub blog `__, `relevant GitHub Changelog updates `__, `changes in the CodeQL extension for Visual Studio Code `__, and the `CodeQL Action changelog `__. + +Security Coverage +----------------- + +CodeQL 2.26.4 runs a total of 497 security queries when configured with the Default suite (covering 170 CWE). The Extended suite enables an additional 131 queries (covering 32 more CWE). + +CodeQL CLI +---------- + +Bug Fixes +~~~~~~~~~ + +* The Java Autobuilder now expands project properties, such as + :code:`${maven.version}`, when determining Maven version requirements specified by the Maven Enforcer Plugin. The Java Autobuilder now also supports Maven versions through 3.9.16. + +New Features +~~~~~~~~~~~~ + +* :code:`codeql test run` now supports the :code:`--reuse-dataset` option, which reuses an existing test database from a previous run when available, + skipping database extraction. This can speed up repeated test runs when only the query under test has changed. The option implies + :code:`--keep-databases`. + +Query Packs +----------- + +Bug Fixes +~~~~~~~~~ + +C# +"" + +* The query :code:`cs/useless-cast-to-self` no longer reports casts when both the expression type and the cast target type are unknown, which can occur in :code:`build-mode: none` databases. + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* The :code:`cs/simplifiable-boolean-expression` query no longer suggests replacing a negated comparison when the replacement could recursively call an enclosing user-defined operator in :code:`build-mode: none` databases. +* The :code:`cs/web/missing-token-validation` query now recognizes enabled ASP.NET Core :code:`RequireAntiforgeryToken` attributes when antiforgery middleware is used. +* The query :code:`cs/virtual-call-in-constructor` has been improved. Uses of virtual members in :code:`nameof` expressions are no longer reported, since they are not calls. +* Static constructors are now used as the enclosing callable for static member initializer expressions. This improves the precision of a range of queries, including :code:`cs/useless-assignment-to-local` and :code:`cs/dereferenced-value-may-be-null`. + +JavaScript/TypeScript +""""""""""""""""""""" + +* The :code:`js/superfluous-trailing-arguments` query no longer reports valid arguments passed to the :code:`TransformStream` constructor. + +GitHub Actions +"""""""""""""" + +* The :code:`actions/unpinned-tag` query now detects mutable references to reusable workflows. + +Language Libraries +------------------ + +Breaking Changes +~~~~~~~~~~~~~~~~ + +GitHub Actions +"""""""""""""" + +* Checks on actor fields read from the event payload (e.g. :code:`github.event.pull_request.user.login`) were split out of :code:`ActorIfCheck` into a new class :code:`EventActorIfCheck`. The :code:`ActorIfCheck` class now only covers :code:`github.actor` and :code:`github.triggering_actor`. + +Major Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +C# +"" + +* Simplified and streamlined the use of NuGet sources when downloading dependencies. In fallback scenarios and specialized package downloads, NuGet sources are now passed directly to :code:`dotnet restore` via the CLI. Furthermore, no :code:`nuget.config` files are created for fallback scenarios, and private registries are used when attempting to download missing packages that were not restored as part of the normal :code:`dotnet restore` process. + +Golang +"""""" + +* Go 1.27 is now supported. + +Rust +"""" + +* The alert locations for data flow queries have been improved. The new locations are more precise and are based on the actual source and sink nodes. Example: + + .. code-block:: rust + + let _ = conn.query( + // ^^^^ old alert location + unsafe_query.as_str(), + // ^^^^^^^^^^^^^^^^^^^^^ new alert location + )?; + + This means that some alerts will have their locations changed, and hence appear as new alerts (while the old alerts will disappear). + +Minor Analysis Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Java/Kotlin +""""""""""" + +* Removed the summary model for :code:`String.valueOf(CharSequence)`, which does not exist. Instead, taint is now propagated through calls to :code:`String.valueOf(Object)` when the argument is a :code:`CharSequence`, for example a :code:`String` or a :code:`StringBuilder`. +* Added SQL injection sink models for Spring R2DBC :code:`DatabaseClient` and the R2DBC SPI. + +JavaScript/TypeScript +""""""""""""""""""""" + +* Added support for regular expressions using the :code:`d` flag. + +Python +"""""" + +* Added taint flow through :code:`list.extend` and :code:`list.insert`, matching the existing taint flow through :code:`list.append`. + +Ruby +"""" + +* The algorithm for tracking regexes has been replaced. This can cause result changes in related queries, for example, :code:`rb/polynomial-redos`. + +GitHub Actions +"""""""""""""" + +* Checks on actor fields read from the event payload (e.g. :code:`github.event.pull_request.user.login`) now only count as protection for events whose payload actually populates that field. Previously, a condition such as :code:`github.event.pull_request.user.login != 'name'` on a workflow triggered by :code:`issues` events was treated as a protective check even though :code:`github.event.pull_request` is not populated for :code:`issues` events, which makes the condition vacuous. This change may result in more alerts for queries using the :code:`ControlCheck` class. +* Added an option to :code:`EnvironmentCheck` to become specified by a MaD model, otherwise it will continue as the default it previously was. Without adding models to :code:`actions/ql/lib/ext/config/deployment_environment.yml` the behavior of every query will be unchanged. When models are added queries using :code:`ControlCheck` may find more results in cases where an environment is no longer a sufficient sanitizer. + +Rust +"""" + +* Canonical paths for Rust trait items now use the format :code:`crate::Trait::item` instead of + :code:`<_ as crate::Trait>::item`. Custom data extension models that reference trait items must be updated to use the new format. +* The Rust extractor has been upgraded to use :code:`rust-analyzer` version 0.0.328. As a result, the AST exposed by the Rust libraries has changed: the :code:`TraitAlias` class has been removed, :code:`cfg` attributes are now modeled by the new :code:`CfgMeta`, :code:`CfgAtom`, :code:`CfgComposite`, :code:`CfgPredicate`, and :code:`CfgAttrMeta` classes, and the :code:`Meta` class has been refined into the :code:`KeyValueMeta`, :code:`PathMeta`, :code:`TokenTreeMeta`, and :code:`UnsafeMeta` subclasses. New :code:`TryBlockModifier` and :code:`FormatArgsArgName` classes have also been added. + +New Features +~~~~~~~~~~~~ + +C# +"" + +* Added the :code:`AdditionalTaintStep` extension point (:code:`semmle.code.csharp.dataflow.FlowSteps`). Extend this class to add additional taint steps that apply to all taint-tracking configurations. + +JavaScript/TypeScript +""""""""""""""""""""" + +* Added support for recognizing the React Native Worklets :code:`"worklet"` directive as a known directive. diff --git a/docs/codeql/codeql-overview/codeql-changelog/index.rst b/docs/codeql/codeql-overview/codeql-changelog/index.rst index 6562d3482c54..0267c6ef8ef5 100644 --- a/docs/codeql/codeql-overview/codeql-changelog/index.rst +++ b/docs/codeql/codeql-overview/codeql-changelog/index.rst @@ -11,6 +11,7 @@ A list of queries for each suite and language `is available here Date: Wed, 26 Aug 2026 16:35:00 +0200 Subject: [PATCH 150/181] C#: address further OData review comments - Revert Patch/CopyChangedValues to void-only per michaelnebel (defer to maintainer over docs citation despite conflicting reflection evidence). - Move Microsoft.AspNet.OData.cs stub to a flat file, drop its wrapper project. - Drop the TryGetValue AdditionalTaintStep: it only added a taint step and didn't make cast targets recognized as ODataBoundType, so it doesn't fully address the underlying gap; left for a follow-up PR. - Convert OData.ql to a path-problem query for clearer test output. Co-Authored-By: Claude Sonnet 5 --- .../lib/ext/Microsoft.AspNet.OData.model.yml | 3 - .../semmle/code/csharp/frameworks/OData.qll | 17 ---- .../library-tests/frameworks/OData/OData.cs | 21 ---- .../frameworks/OData/OData.expected | 96 ++++++++++++++++--- .../library-tests/frameworks/OData/OData.ql | 11 ++- .../library-tests/frameworks/OData/options | 3 +- .../7.7.5 => }/Microsoft.AspNet.OData.cs | 4 +- .../7.7.5/Microsoft.AspNet.OData.csproj | 12 --- 8 files changed, 93 insertions(+), 74 deletions(-) rename csharp/ql/test/resources/stubs/{Microsoft.AspNet.OData/7.7.5 => }/Microsoft.AspNet.OData.cs (75%) delete mode 100644 csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj diff --git a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml index e27c4ccfe529..86065b1ca2ea 100644 --- a/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml +++ b/csharp/ql/lib/ext/Microsoft.AspNet.OData.model.yml @@ -5,14 +5,11 @@ extensions: data: - ["Microsoft.AspNet.OData", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "Patch", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - - ["Microsoft.AspNet.OData", "Delta", True, "Patch", "(TStructuralType)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "Put", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "CopyChangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - - ["Microsoft.AspNet.OData", "Delta", True, "CopyChangedValues", "(TStructuralType)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNet.OData", "Delta", True, "CopyUnchangedValues", "(TStructuralType)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "GetInstance", "()", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Patch", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Patch", "(T)", "", "Argument[this]", "ReturnValue", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "Put", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyChangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] - ["Microsoft.AspNetCore.OData.Deltas", "Delta", True, "CopyUnchangedValues", "(T)", "", "Argument[this]", "Argument[0]", "taint", "manual"] diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 9571268c6b30..16422fda1d8c 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -20,7 +20,6 @@ import csharp private import semmle.code.csharp.commons.Collections -private import semmle.code.csharp.dataflow.FlowSteps private import semmle.code.csharp.security.dataflow.flowsources.Remote /** The `ODataActionParameters` dictionary type, across OData library versions. */ @@ -50,22 +49,6 @@ class ODataActionParameterRead extends ElementAccess { ODataActionParameterRead() { isODataActionParametersValue(this.getQualifier()) } } -/** - * A call to `TryGetValue` on an `ODataActionParameters` dictionary copies the value - * of the looked-up entry into the `out` argument. - */ -private class ODataActionParametersTryGetValueTaintStep extends AdditionalTaintStep { - override predicate step(DataFlow::Node node1, DataFlow::Node node2) { - exists(MethodCall mc, AssignableDefinitions::OutRefDefinition def | - mc.getTarget().hasName("TryGetValue") and - isODataActionParametersValue(mc.getQualifier()) and - node1.asExpr() = mc.getQualifier() and - def.getTargetAccess() = mc.getArgumentForName("value") and - node2 = DataFlow::assignableDefinitionNode(def) - ) - } -} - /** Holds if `e` may (locally) hold the value of an `ODataActionParameters` entry. */ private predicate isODataParameterValue(Expr e) { DataFlow::localExprFlow(any(ODataActionParameterRead r), e) diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index bbce96d56fc9..a16a821da070 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -73,15 +73,6 @@ void IsAsFromDictionary(ODataActionParameters parameters) } } - void TryGetValueFromDictionary(ODataActionParameters parameters) - { - if (parameters.TryGetValue("Entity", out var value)) - { - var entity = (BoundEntity)value; - Sink(entity.Name); - } - } - void UpcastThenIndex(ODataActionParameters parameters) { IDictionary dict = parameters; @@ -101,18 +92,6 @@ void DeltaGetInstance(Delta delta) Sink(w.Name); } - void DeltaPatchReturnValue(Delta delta, Widget original) - { - var updated = delta.Patch(original); - Sink(updated.Name); - } - - void DeltaCopyChangedValuesReturnValue(Delta delta, Widget original) - { - var updated = delta.CopyChangedValues(original); - Sink(updated.Name); - } - void LegacyDeltaPatch(System.Web.Http.OData.Delta delta, Widget original) { delta.Patch(original); diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index 290236df722e..a2e0614a51ec 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -1,15 +1,81 @@ -| OData.cs:46:55:46:64 | parameters | OData.cs:49:18:49:23 | access to local variable entity | -| OData.cs:46:55:46:64 | parameters | OData.cs:50:18:50:28 | access to property Name | -| OData.cs:46:55:46:64 | parameters | OData.cs:51:18:51:31 | access to property Content | -| OData.cs:46:55:46:64 | parameters | OData.cs:52:18:52:38 | access to property Owner | -| OData.cs:46:55:46:64 | parameters | OData.cs:55:22:55:28 | access to property Owner | -| OData.cs:59:55:59:64 | parameters | OData.cs:65:26:65:35 | access to property Label | -| OData.cs:59:55:59:64 | parameters | OData.cs:72:22:72:34 | access to property Category | -| OData.cs:76:62:76:71 | parameters | OData.cs:81:22:81:32 | access to property Name | -| OData.cs:85:52:85:61 | parameters | OData.cs:89:18:89:28 | access to property Name | -| OData.cs:92:39:92:43 | delta | OData.cs:95:18:95:30 | access to property Name | -| OData.cs:98:45:98:49 | delta | OData.cs:101:18:101:23 | access to property Name | -| OData.cs:104:50:104:54 | delta | OData.cs:107:18:107:29 | access to property Name | -| OData.cs:110:62:110:66 | delta | OData.cs:113:18:113:29 | access to property Name | -| OData.cs:116:67:116:71 | delta | OData.cs:119:18:119:30 | access to property Name | -| OData.cs:122:71:122:75 | delta | OData.cs:125:18:125:23 | access to property Name | +edges +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:48:26:48:58 | (...) ... : BoundEntity | provenance | | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:49:18:49:23 | access to local variable entity | provenance | | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:50:18:50:28 | access to property Name | provenance | | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:51:18:51:31 | access to property Content | provenance | | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:52:18:52:38 | access to property Owner | provenance | | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:55:22:55:28 | access to property Owner | provenance | | +| OData.cs:48:26:48:58 | (...) ... : BoundEntity | OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | provenance | | +| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | provenance | | +| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:69:26:69:72 | ... as ... : IEnumerable | provenance | | +| OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | OData.cs:72:22:72:34 | access to property Category | provenance | | +| OData.cs:69:26:69:72 | ... as ... : IEnumerable | OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | provenance | | +| OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | provenance | | +| OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | OData.cs:79:26:79:52 | (...) ... : BoundEntity | provenance | | +| OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | OData.cs:80:18:80:28 | access to property Name | provenance | | +| OData.cs:79:26:79:52 | (...) ... : BoundEntity | OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | provenance | | +| OData.cs:83:39:83:43 | delta : Delta | OData.cs:85:13:85:17 | access to parameter delta : Delta | provenance | | +| OData.cs:85:13:85:17 | access to parameter delta : Delta | OData.cs:85:25:85:32 | [post] access to parameter original : Widget | provenance | MaD:143 | +| OData.cs:85:25:85:32 | [post] access to parameter original : Widget | OData.cs:86:18:86:30 | access to property Name | provenance | | +| OData.cs:89:45:89:49 | delta : Delta | OData.cs:91:21:91:25 | access to parameter delta : Delta | provenance | | +| OData.cs:91:17:91:17 | access to local variable w : Widget | OData.cs:92:18:92:23 | access to property Name | provenance | | +| OData.cs:91:21:91:25 | access to parameter delta : Delta | OData.cs:91:21:91:39 | call to method GetInstance : Widget | provenance | MaD:142 | +| OData.cs:91:21:91:39 | call to method GetInstance : Widget | OData.cs:91:17:91:17 | access to local variable w : Widget | provenance | | +| OData.cs:95:67:95:71 | delta : Delta | OData.cs:97:13:97:17 | access to parameter delta : Delta | provenance | | +| OData.cs:97:13:97:17 | access to parameter delta : Delta | OData.cs:97:25:97:32 | [post] access to parameter original : Widget | provenance | MaD:153 | +| OData.cs:97:25:97:32 | [post] access to parameter original : Widget | OData.cs:98:18:98:30 | access to property Name | provenance | | +| OData.cs:101:71:101:75 | delta : Delta | OData.cs:103:21:103:25 | access to parameter delta : Delta | provenance | | +| OData.cs:103:17:103:17 | access to local variable w : Widget | OData.cs:104:18:104:23 | access to property Name | provenance | | +| OData.cs:103:21:103:25 | access to parameter delta : Delta | OData.cs:103:21:103:37 | call to method GetEntity : Widget | provenance | MaD:152 | +| OData.cs:103:21:103:37 | call to method GetEntity : Widget | OData.cs:103:17:103:17 | access to local variable w : Widget | provenance | | +nodes +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | semmle.label | access to local variable entity : BoundEntity | +| OData.cs:48:26:48:58 | (...) ... : BoundEntity | semmle.label | (...) ... : BoundEntity | +| OData.cs:49:18:49:23 | access to local variable entity | semmle.label | access to local variable entity | +| OData.cs:50:18:50:28 | access to property Name | semmle.label | access to property Name | +| OData.cs:51:18:51:31 | access to property Content | semmle.label | access to property Content | +| OData.cs:52:18:52:38 | access to property Owner | semmle.label | access to property Owner | +| OData.cs:55:22:55:28 | access to property Owner | semmle.label | access to property Owner | +| OData.cs:59:55:59:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:65:26:65:35 | access to property Label | semmle.label | access to property Label | +| OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | semmle.label | access to local variable items2 : IEnumerable | +| OData.cs:69:26:69:72 | ... as ... : IEnumerable | semmle.label | ... as ... : IEnumerable | +| OData.cs:72:22:72:34 | access to property Category | semmle.label | access to property Category | +| OData.cs:76:52:76:61 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | semmle.label | access to local variable dict : ODataActionParameters | +| OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | semmle.label | access to local variable entity : BoundEntity | +| OData.cs:79:26:79:52 | (...) ... : BoundEntity | semmle.label | (...) ... : BoundEntity | +| OData.cs:80:18:80:28 | access to property Name | semmle.label | access to property Name | +| OData.cs:83:39:83:43 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:85:13:85:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:85:25:85:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | +| OData.cs:86:18:86:30 | access to property Name | semmle.label | access to property Name | +| OData.cs:89:45:89:49 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:91:17:91:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | +| OData.cs:91:21:91:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:91:21:91:39 | call to method GetInstance : Widget | semmle.label | call to method GetInstance : Widget | +| OData.cs:92:18:92:23 | access to property Name | semmle.label | access to property Name | +| OData.cs:95:67:95:71 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:97:13:97:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:97:25:97:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | +| OData.cs:98:18:98:30 | access to property Name | semmle.label | access to property Name | +| OData.cs:101:71:101:75 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:103:17:103:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | +| OData.cs:103:21:103:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:103:21:103:37 | call to method GetEntity : Widget | semmle.label | call to method GetEntity : Widget | +| OData.cs:104:18:104:23 | access to property Name | semmle.label | access to property Name | +subpaths +#select +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:49:18:49:23 | access to local variable entity | $@ | OData.cs:49:18:49:23 | access to local variable entity | access to local variable entity | +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:50:18:50:28 | access to property Name | $@ | OData.cs:50:18:50:28 | access to property Name | access to property Name | +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:51:18:51:31 | access to property Content | $@ | OData.cs:51:18:51:31 | access to property Content | access to property Content | +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:52:18:52:38 | access to property Owner | $@ | OData.cs:52:18:52:38 | access to property Owner | access to property Owner | +| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:55:22:55:28 | access to property Owner | $@ | OData.cs:55:22:55:28 | access to property Owner | access to property Owner | +| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | $@ | OData.cs:65:26:65:35 | access to property Label | access to property Label | +| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:72:22:72:34 | access to property Category | $@ | OData.cs:72:22:72:34 | access to property Category | access to property Category | +| OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:80:18:80:28 | access to property Name | $@ | OData.cs:80:18:80:28 | access to property Name | access to property Name | +| OData.cs:83:39:83:43 | delta : Delta | OData.cs:83:39:83:43 | delta : Delta | OData.cs:86:18:86:30 | access to property Name | $@ | OData.cs:86:18:86:30 | access to property Name | access to property Name | +| OData.cs:89:45:89:49 | delta : Delta | OData.cs:89:45:89:49 | delta : Delta | OData.cs:92:18:92:23 | access to property Name | $@ | OData.cs:92:18:92:23 | access to property Name | access to property Name | +| OData.cs:95:67:95:71 | delta : Delta | OData.cs:95:67:95:71 | delta : Delta | OData.cs:98:18:98:30 | access to property Name | $@ | OData.cs:98:18:98:30 | access to property Name | access to property Name | +| OData.cs:101:71:101:75 | delta : Delta | OData.cs:101:71:101:75 | delta : Delta | OData.cs:104:18:104:23 | access to property Name | $@ | OData.cs:104:18:104:23 | access to property Name | access to property Name | diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.ql b/csharp/ql/test/library-tests/frameworks/OData/OData.ql index ed70740699e3..b25ef30bc470 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.ql +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.ql @@ -1,4 +1,9 @@ +/** + * @kind path-problem + */ + import csharp +import Taint::PathGraph module TaintConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node n) { @@ -18,6 +23,6 @@ module TaintConfig implements DataFlow::ConfigSig { module Taint = TaintTracking::Global; -from DataFlow::Node source, DataFlow::Node sink -where Taint::flow(source, sink) -select source, sink +from Taint::PathNode source, Taint::PathNode sink +where Taint::flowPath(source, sink) +select source, source, sink, "$@", sink, sink.toString() diff --git a/csharp/ql/test/library-tests/frameworks/OData/options b/csharp/ql/test/library-tests/frameworks/OData/options index e9ba768d29a7..64d98a3ae94f 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/options +++ b/csharp/ql/test/library-tests/frameworks/OData/options @@ -1,3 +1,4 @@ semmle-extractor-options: /nostdlib /noconfig -semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj +semmle-extractor-options: --load-sources-from-project:${testdir}/../../../resources/stubs/_frameworks/Microsoft.NETCore.App/Microsoft.NETCore.App.csproj +semmle-extractor-options: ${testdir}/../../../resources/stubs/Microsoft.AspNet.OData.cs semmle-extractor-options: ${testdir}/../../../resources/stubs/System.Web.Http.OData.cs diff --git a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData.cs similarity index 75% rename from csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs rename to csharp/ql/test/resources/stubs/Microsoft.AspNet.OData.cs index da46281cf2d1..2ff03ab13994 100644 --- a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.cs +++ b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData.cs @@ -9,9 +9,9 @@ public class Delta where TStructuralType : class { public Delta() => throw null; public TStructuralType GetInstance() => throw null; - public TStructuralType Patch(TStructuralType original) => throw null; + public void Patch(TStructuralType original) => throw null; public void Put(TStructuralType original) => throw null; - public TStructuralType CopyChangedValues(TStructuralType original) => throw null; + public void CopyChangedValues(TStructuralType original) => throw null; public void CopyUnchangedValues(TStructuralType original) => throw null; } } diff --git a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj b/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj deleted file mode 100644 index 2be6995cd169..000000000000 --- a/csharp/ql/test/resources/stubs/Microsoft.AspNet.OData/7.7.5/Microsoft.AspNet.OData.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - net10.0 - true - bin\ - false - - - - - - From f6efc3468ed326f3a32d4542c486343b56e85416 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema <93738568+jketema@users.noreply.github.com> Date: Wed, 26 Aug 2026 14:41:33 +0000 Subject: [PATCH 151/181] Unified: Hand-roll the mashalling of the JSON This avoids depending on `Foundation` (and indirectly ICU), and reduces the extractor size from 85 MiB to 31 MiB. --- unified/swift-syntax-rs/BUILD.bazel | 2 + unified/swift-syntax-rs/src/lib.rs | 21 ++++ .../SwiftSyntaxFFI/SwiftSyntaxFFI.swift | 99 +++++++++++++++++-- 3 files changed, 116 insertions(+), 6 deletions(-) diff --git a/unified/swift-syntax-rs/BUILD.bazel b/unified/swift-syntax-rs/BUILD.bazel index 374d0d784f3a..553226143cbb 100644 --- a/unified/swift-syntax-rs/BUILD.bazel +++ b/unified/swift-syntax-rs/BUILD.bazel @@ -36,7 +36,9 @@ cc_library( cc_library( name = "static_runtime_group_end", linkopts = [ + "-lBlocksRuntime", "-lc", + "-ldispatch", "-ldl", "-lm", "-lpthread", diff --git a/unified/swift-syntax-rs/src/lib.rs b/unified/swift-syntax-rs/src/lib.rs index 5f558d942fc8..a87c817a8935 100644 --- a/unified/swift-syntax-rs/src/lib.rs +++ b/unified/swift-syntax-rs/src/lib.rs @@ -120,6 +120,27 @@ mod tests { json.contains("\"kind\":\"sourceFile\""), "unexpected tree: {json}" ); + assert!( + json.contains("\"statements\":[]"), + "empty collections should be serialized as JSON arrays: {json}" + ); + } + + #[test] + fn serializes_json_strings_and_keys_deterministically() { + let source = "/* quote \" slash / backslash \\ tab \t newline\n emoji 😀 combining e\u{301} control \u{1} */\nlet x = 1"; + let json = parse_to_json(source).expect("parsing should succeed"); + + assert!( + json.contains( + r#""text":"\/* quote \" slash \/ backslash \\ tab \t newline\n emoji 😀 combining é control \u0001 *\/""# + ), + "JSON string was not escaped correctly: {json}" + ); + assert!( + json.contains(r#""start":{"column":1,"line":1,"offset":0}"#), + "JSON object keys were not sorted: {json}" + ); } #[test] diff --git a/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift b/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift index 9471c2ea143d..e423e75cf33f 100644 --- a/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift +++ b/unified/swift-syntax-rs/swift/Sources/SwiftSyntaxFFI/SwiftSyntaxFFI.swift @@ -1,4 +1,3 @@ -import Foundation import SwiftOperators import SwiftParser @@ -214,6 +213,93 @@ private final class PerSequenceFolder: SyntaxRewriter { } } +/// Write directly to stderr without Foundation, whose output APIs would pull ICU into static builds. +private func writeToStandardError(_ message: String) { + message.withCString { start in + var pointer = UnsafeRawPointer(start) + let end = pointer.advanced(by: strlen(start)) + while pointer != end { + let written = write(STDERR_FILENO, pointer, end - pointer) + if written <= 0 { + return + } + pointer = pointer.advanced(by: written) + } + } +} + +private struct JSONEncodingError: Error, CustomStringConvertible { + let type: Any.Type + + var description: String { + "unsupported JSON value of type \(String(reflecting: type))" + } +} + +private let hexDigits = Array("0123456789abcdef".utf8) + +private func appendJSONString(_ string: String, to output: inout [UInt8]) { + output.append(UInt8(ascii: "\"")) + for scalar in string.unicodeScalars { + switch scalar.value { + case 0x08: + output.append(contentsOf: "\\b".utf8) + case 0x09: + output.append(contentsOf: "\\t".utf8) + case 0x0a: + output.append(contentsOf: "\\n".utf8) + case 0x0c: + output.append(contentsOf: "\\f".utf8) + case 0x0d: + output.append(contentsOf: "\\r".utf8) + case 0x22: + output.append(contentsOf: "\\\"".utf8) + case 0x2f: + output.append(contentsOf: "\\/".utf8) + case 0x5c: + output.append(contentsOf: "\\\\".utf8) + case 0x00...0x1f: + output.append(contentsOf: "\\u00".utf8) + output.append(hexDigits[Int(scalar.value >> 4)]) + output.append(hexDigits[Int(scalar.value & 0x0f)]) + default: + output.append(contentsOf: String(scalar).utf8) + } + } + output.append(UInt8(ascii: "\"")) +} + +private func appendJSON(_ value: Any, to output: inout [UInt8]) throws { + switch value { + case let string as String: + appendJSONString(string, to: &output) + case let integer as Int: + output.append(contentsOf: String(integer).utf8) + case let array as [Any]: + output.append(UInt8(ascii: "[")) + for (index, element) in array.enumerated() { + if index != 0 { + output.append(UInt8(ascii: ",")) + } + try appendJSON(element, to: &output) + } + output.append(UInt8(ascii: "]")) + case let object as [String: Any]: + output.append(UInt8(ascii: "{")) + for (index, key) in object.keys.sorted().enumerated() { + if index != 0 { + output.append(UInt8(ascii: ",")) + } + appendJSONString(key, to: &output) + output.append(UInt8(ascii: ":")) + try appendJSON(object[key]!, to: &output) + } + output.append(UInt8(ascii: "}")) + default: + throw JSONEncodingError(type: type(of: value)) + } +} + /// Parse the given NUL-terminated Swift source string and return a /// heap-allocated, NUL-terminated JSON representation of the syntax tree. /// @@ -231,13 +317,14 @@ public func ssr_parse_json(_ source: UnsafePointer?) -> UnsafeMutablePoin let converter = SourceLocationConverter(fileName: "", tree: tree) let json = serialize(folded, converter) - guard - let data = try? JSONSerialization.data( - withJSONObject: json, options: [.sortedKeys]), - let string = String(data: data, encoding: .utf8) - else { + var bytes: [UInt8] = [] + do { + try appendJSON(json, to: &bytes) + } catch { + writeToStandardError("SwiftSyntaxFFI: JSON serialization failed: \(error)\n") return nil } + let string = String(decoding: bytes, as: UTF8.self) return strdup(string) } From fcdb89cdd9eafabf1466995ed4eb441f058c4021 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 26 Aug 2026 19:22:02 +0100 Subject: [PATCH 152/181] Rust: Rename isConstant -> hasConstant. --- .../HardcodedCryptographicValueExtensions.qll | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index 768f684cea5b..b1a27e7b2882 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -62,19 +62,19 @@ module HardcodedCryptographicValue { abstract class Barrier extends DataFlow::Node { } /** - * Holds if `e` is a literal or a combination of literals that is constant. + * Holds if `e` is a literal or a combination of literals that may be a constant. */ - private predicate isConstant(Expr e) { + private predicate hasConstant(Expr e) { e instanceof LiteralExpr // e.g. `0` or - forex(Expr elem | elem = e.(ArrayListExpr).getExpr(_) | isConstant(elem)) // e.g. `[0, 0, 0, 0]` + forex(Expr elem | elem = e.(ArrayListExpr).getExpr(_) | hasConstant(elem)) // e.g. `[0, 0, 0, 0]` or - isConstant(e.(ArrayRepeatExpr).getRepeatOperand()) // e.g. `[0; 10]` + hasConstant(e.(ArrayRepeatExpr).getRepeatOperand()) // e.g. `[0; 10]` or // a match expression with one or more constant arms; taint would reach here // anyway, but we make it a source to avoid reporting many similar results // on each match arm. - isConstant(e.(MatchExpr).getMatchArmList().getAnArm().getExpr()) + hasConstant(e.(MatchExpr).getMatchArmList().getAnArm().getExpr()) or // e.g. `const MY_CONST: u64 = ...` // the constant initializer / body is the preferred source location for flow paths, when available. @@ -86,15 +86,15 @@ module HardcodedCryptographicValue { not exists(e.(ConstAccess).getConst().getBody()) or // e.g. `1 << 4` - isConstant(e.(BinaryExpr).getLhs()) and - isConstant(e.(BinaryExpr).getRhs()) + hasConstant(e.(BinaryExpr).getLhs()) and + hasConstant(e.(BinaryExpr).getRhs()) } /** * A constant, considered as a flow source. */ private class ConstantSource extends Source { - ConstantSource() { isConstant(this.asExpr()) } + ConstantSource() { hasConstant(this.asExpr()) } } /** From c0baa61dd9eab1ed0eec28c3ed13ca6675022afa Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 26 Aug 2026 19:39:51 +0100 Subject: [PATCH 153/181] Rust: Additional test case for arrays. --- .../HardcodedCryptographicValue.expected | 55 ++++++++++++------- .../security/CWE-798/test_cookie.rs | 8 +++ 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index d77634d1fd9e..8e1f1ba135a1 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -9,8 +9,10 @@ | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:26:18:32 | &array1 | This hard-coded value is used as $@. | test_cookie.rs:18:26:18:32 | &array1 | a key | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:26:22:32 | &array2 | This hard-coded value is used as $@. | test_cookie.rs:22:26:22:32 | &array2 | a key | | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:50:34:50:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:50:34:50:39 | array2 | a key | -| test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:61:34:61:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:61:34:61:39 | array3 | a key | +| test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:38:26:38:32 | &array4 | This hard-coded value is used as $@. | test_cookie.rs:38:26:38:32 | &array4 | a key | +| test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:38:26:38:32 | &array4 | This hard-coded value is used as $@. | test_cookie.rs:38:26:38:32 | &array4 | a key | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:58:34:58:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:58:34:58:39 | array2 | a key | +| test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:69:34:69:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:69:34:69:39 | array3 | a key | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | This hard-coded value is used as $@. | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | a salt | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | This hard-coded value is used as $@. | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | a salt | | test_heuristic.rs:40:27:40:32 | 0xFFFF | test_heuristic.rs:40:27:40:32 | 0xFFFF | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | This hard-coded value is used as $@. | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | a salt | @@ -70,16 +72,22 @@ edges | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:9:25:12 | str3 | provenance | | | test_cookie.rs:30:26:30:29 | str3 | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | provenance | MaD:13 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | test_cookie.rs:30:26:30:40 | str3.as_bytes() | provenance | Sink:MaD:5 | -| test_cookie.rs:46:9:46:14 | array2 | test_cookie.rs:50:34:50:39 | array2 | provenance | Sink:MaD:1 | -| test_cookie.rs:46:18:46:37 | ...::from(...) | test_cookie.rs:46:9:46:14 | array2 | provenance | | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:8 | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:9 | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:10 | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:11 | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | test_cookie.rs:46:18:46:37 | ...::from(...) | provenance | MaD:12 | -| test_cookie.rs:57:9:57:14 | array3 [element] | test_cookie.rs:61:34:61:39 | array3 | provenance | Sink:MaD:1 | -| test_cookie.rs:57:23:57:25 | 0u8 | test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | provenance | MaD:15 | -| test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | test_cookie.rs:57:9:57:14 | array3 [element] | provenance | | +| test_cookie.rs:33:9:33:14 | array4 [element] | test_cookie.rs:38:27:38:32 | array4 [element] | provenance | | +| test_cookie.rs:33:27:37:5 | [...] [element] | test_cookie.rs:33:9:33:14 | array4 [element] | provenance | | +| test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:33:27:37:5 | [...] [element] | provenance | | +| test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:33:27:37:5 | [...] [element] | provenance | | +| test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | test_cookie.rs:38:26:38:32 | &array4 | provenance | Sink:MaD:5 | +| test_cookie.rs:38:27:38:32 | array4 [element] | test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | provenance | | +| test_cookie.rs:54:9:54:14 | array2 | test_cookie.rs:58:34:58:39 | array2 | provenance | Sink:MaD:1 | +| test_cookie.rs:54:18:54:37 | ...::from(...) | test_cookie.rs:54:9:54:14 | array2 | provenance | | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:8 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:9 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:10 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:11 | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:12 | +| test_cookie.rs:65:9:65:14 | array3 [element] | test_cookie.rs:69:34:69:39 | array3 | provenance | Sink:MaD:1 | +| test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:65:23:65:29 | ...::from_elem(...) [element] | provenance | MaD:15 | +| test_cookie.rs:65:23:65:29 | ...::from_elem(...) [element] | test_cookie.rs:65:9:65:14 | array3 [element] | provenance | | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | provenance | | | test_heuristic.rs:39:25:39:59 | ... as u64 | test_heuristic.rs:82:22:82:31 | MY_CONST_2 | provenance | | | test_heuristic.rs:39:62:40:33 | static MY_STATIC_3 | test_heuristic.rs:83:22:83:32 | MY_STATIC_3 | provenance | | @@ -163,14 +171,21 @@ nodes | test_cookie.rs:30:26:30:29 | str3 | semmle.label | str3 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() | semmle.label | str3.as_bytes() | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | semmle.label | str3.as_bytes() [&ref] | -| test_cookie.rs:46:9:46:14 | array2 | semmle.label | array2 | -| test_cookie.rs:46:18:46:37 | ...::from(...) | semmle.label | ...::from(...) | -| test_cookie.rs:46:28:46:36 | [0u8; 64] | semmle.label | [0u8; 64] | -| test_cookie.rs:50:34:50:39 | array2 | semmle.label | array2 | -| test_cookie.rs:57:9:57:14 | array3 [element] | semmle.label | array3 [element] | -| test_cookie.rs:57:23:57:25 | 0u8 | semmle.label | 0u8 | -| test_cookie.rs:57:23:57:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | -| test_cookie.rs:61:34:61:39 | array3 | semmle.label | array3 | +| test_cookie.rs:33:9:33:14 | array4 [element] | semmle.label | array4 [element] | +| test_cookie.rs:33:27:37:5 | [...] [element] | semmle.label | [...] [element] | +| test_cookie.rs:34:9:34:9 | 1 | semmle.label | 1 | +| test_cookie.rs:35:9:35:9 | 2 | semmle.label | 2 | +| test_cookie.rs:38:26:38:32 | &array4 | semmle.label | &array4 | +| test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | semmle.label | &array4 [&ref, element] | +| test_cookie.rs:38:27:38:32 | array4 [element] | semmle.label | array4 [element] | +| test_cookie.rs:54:9:54:14 | array2 | semmle.label | array2 | +| test_cookie.rs:54:18:54:37 | ...::from(...) | semmle.label | ...::from(...) | +| test_cookie.rs:54:28:54:36 | [0u8; 64] | semmle.label | [0u8; 64] | +| test_cookie.rs:58:34:58:39 | array2 | semmle.label | array2 | +| test_cookie.rs:65:9:65:14 | array3 [element] | semmle.label | array3 [element] | +| test_cookie.rs:65:23:65:25 | 0u8 | semmle.label | 0u8 | +| test_cookie.rs:65:23:65:29 | ...::from_elem(...) [element] | semmle.label | ...::from_elem(...) [element] | +| test_cookie.rs:69:34:69:39 | array3 | semmle.label | array3 | | test_heuristic.rs:38:25:38:30 | 0xFFFF | semmle.label | 0xFFFF | | test_heuristic.rs:39:25:39:59 | ... as u64 | semmle.label | ... as u64 | | test_heuristic.rs:39:62:40:33 | static MY_STATIC_3 | semmle.label | static MY_STATIC_3 | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs index 410ddf1b8aaa..cc051bb658aa 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs @@ -29,6 +29,14 @@ fn test_cookie_jar(array_var: &[u8], val: u64) { }; // $ Alert[rust/hard-coded-cryptographic-value] let key3 = Key::from(str3.as_bytes()); // $ Sink _ = jar.signed_mut(&key3); + + let array4: [u8; 3] = [ + 1, // $ Alert[rust/hard-coded-cryptographic-value] + 2, // $ Alert[rust/hard-coded-cryptographic-value] + val as u8 + ]; + let key4 = Key::from(&array4); // $ Sink + _ = jar.signed_mut(&key4); } fn test_biscotti_crypto(array_var: &[u8]) { From 02d670aa513cfd8277718a8f0efc603fe74d41b3 Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 26 Aug 2026 19:29:05 +0100 Subject: [PATCH 154/181] Rust: Make hasConstant behaviour on arrays consistent. --- .../HardcodedCryptographicValueExtensions.qll | 7 ++++-- .../HardcodedCryptographicValue.expected | 23 ++++++++----------- .../security/CWE-798/test_cookie.rs | 6 ++--- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll index b1a27e7b2882..71f2f4cdbe31 100644 --- a/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll +++ b/rust/ql/lib/codeql/rust/security/HardcodedCryptographicValueExtensions.qll @@ -62,12 +62,15 @@ module HardcodedCryptographicValue { abstract class Barrier extends DataFlow::Node { } /** - * Holds if `e` is a literal or a combination of literals that may be a constant. + * Holds if `e` is a literal or an expression that contains a constant. For example: + * ``` + * ["hello", "world", s] + * ``` */ private predicate hasConstant(Expr e) { e instanceof LiteralExpr // e.g. `0` or - forex(Expr elem | elem = e.(ArrayListExpr).getExpr(_) | hasConstant(elem)) // e.g. `[0, 0, 0, 0]` + exists(Expr elem | elem = e.(ArrayListExpr).getExpr(_) | hasConstant(elem)) // e.g. `[0, 0, 0, 0]` or hasConstant(e.(ArrayRepeatExpr).getRepeatOperand()) // e.g. `[0; 10]` or diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 8e1f1ba135a1..039891ffb4d6 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -9,8 +9,7 @@ | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:17:28:17:34 | [0; 64] | test_cookie.rs:18:26:18:32 | &array1 | This hard-coded value is used as $@. | test_cookie.rs:18:26:18:32 | &array1 | a key | | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:21:28:21:34 | [0; 64] | test_cookie.rs:22:26:22:32 | &array2 | This hard-coded value is used as $@. | test_cookie.rs:22:26:22:32 | &array2 | a key | | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:30:26:30:40 | str3.as_bytes() | This hard-coded value is used as $@. | test_cookie.rs:30:26:30:40 | str3.as_bytes() | a key | -| test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:38:26:38:32 | &array4 | This hard-coded value is used as $@. | test_cookie.rs:38:26:38:32 | &array4 | a key | -| test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:38:26:38:32 | &array4 | This hard-coded value is used as $@. | test_cookie.rs:38:26:38:32 | &array4 | a key | +| test_cookie.rs:33:27:37:5 | [...] | test_cookie.rs:33:27:37:5 | [...] | test_cookie.rs:38:26:38:32 | &array4 | This hard-coded value is used as $@. | test_cookie.rs:38:26:38:32 | &array4 | a key | | test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:58:34:58:39 | array2 | This hard-coded value is used as $@. | test_cookie.rs:58:34:58:39 | array2 | a key | | test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:65:23:65:25 | 0u8 | test_cookie.rs:69:34:69:39 | array3 | This hard-coded value is used as $@. | test_cookie.rs:69:34:69:39 | array3 | a key | | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:38:25:38:30 | 0xFFFF | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | This hard-coded value is used as $@. | test_heuristic.rs:81:22:81:31 | MY_CONST_1 | a salt | @@ -72,12 +71,10 @@ edges | test_cookie.rs:25:16:29:5 | match ... { ... } | test_cookie.rs:25:9:25:12 | str3 | provenance | | | test_cookie.rs:30:26:30:29 | str3 | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | provenance | MaD:13 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | test_cookie.rs:30:26:30:40 | str3.as_bytes() | provenance | Sink:MaD:5 | -| test_cookie.rs:33:9:33:14 | array4 [element] | test_cookie.rs:38:27:38:32 | array4 [element] | provenance | | -| test_cookie.rs:33:27:37:5 | [...] [element] | test_cookie.rs:33:9:33:14 | array4 [element] | provenance | | -| test_cookie.rs:34:9:34:9 | 1 | test_cookie.rs:33:27:37:5 | [...] [element] | provenance | | -| test_cookie.rs:35:9:35:9 | 2 | test_cookie.rs:33:27:37:5 | [...] [element] | provenance | | -| test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | test_cookie.rs:38:26:38:32 | &array4 | provenance | Sink:MaD:5 | -| test_cookie.rs:38:27:38:32 | array4 [element] | test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | provenance | | +| test_cookie.rs:33:9:33:14 | array4 | test_cookie.rs:38:27:38:32 | array4 | provenance | | +| test_cookie.rs:33:27:37:5 | [...] | test_cookie.rs:33:9:33:14 | array4 | provenance | | +| test_cookie.rs:38:26:38:32 | &array4 [&ref] | test_cookie.rs:38:26:38:32 | &array4 | provenance | Sink:MaD:5 | +| test_cookie.rs:38:27:38:32 | array4 | test_cookie.rs:38:26:38:32 | &array4 [&ref] | provenance | | | test_cookie.rs:54:9:54:14 | array2 | test_cookie.rs:58:34:58:39 | array2 | provenance | Sink:MaD:1 | | test_cookie.rs:54:18:54:37 | ...::from(...) | test_cookie.rs:54:9:54:14 | array2 | provenance | | | test_cookie.rs:54:28:54:36 | [0u8; 64] | test_cookie.rs:54:18:54:37 | ...::from(...) | provenance | MaD:8 | @@ -171,13 +168,11 @@ nodes | test_cookie.rs:30:26:30:29 | str3 | semmle.label | str3 | | test_cookie.rs:30:26:30:40 | str3.as_bytes() | semmle.label | str3.as_bytes() | | test_cookie.rs:30:26:30:40 | str3.as_bytes() [&ref] | semmle.label | str3.as_bytes() [&ref] | -| test_cookie.rs:33:9:33:14 | array4 [element] | semmle.label | array4 [element] | -| test_cookie.rs:33:27:37:5 | [...] [element] | semmle.label | [...] [element] | -| test_cookie.rs:34:9:34:9 | 1 | semmle.label | 1 | -| test_cookie.rs:35:9:35:9 | 2 | semmle.label | 2 | +| test_cookie.rs:33:9:33:14 | array4 | semmle.label | array4 | +| test_cookie.rs:33:27:37:5 | [...] | semmle.label | [...] | | test_cookie.rs:38:26:38:32 | &array4 | semmle.label | &array4 | -| test_cookie.rs:38:26:38:32 | &array4 [&ref, element] | semmle.label | &array4 [&ref, element] | -| test_cookie.rs:38:27:38:32 | array4 [element] | semmle.label | array4 [element] | +| test_cookie.rs:38:26:38:32 | &array4 [&ref] | semmle.label | &array4 [&ref] | +| test_cookie.rs:38:27:38:32 | array4 | semmle.label | array4 | | test_cookie.rs:54:9:54:14 | array2 | semmle.label | array2 | | test_cookie.rs:54:18:54:37 | ...::from(...) | semmle.label | ...::from(...) | | test_cookie.rs:54:28:54:36 | [0u8; 64] | semmle.label | [0u8; 64] | diff --git a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs index cc051bb658aa..f28491c713ee 100644 --- a/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs +++ b/rust/ql/test/query-tests/security/CWE-798/test_cookie.rs @@ -31,10 +31,10 @@ fn test_cookie_jar(array_var: &[u8], val: u64) { _ = jar.signed_mut(&key3); let array4: [u8; 3] = [ - 1, // $ Alert[rust/hard-coded-cryptographic-value] - 2, // $ Alert[rust/hard-coded-cryptographic-value] + 1, + 2, val as u8 - ]; + ]; // $ Alert[rust/hard-coded-cryptographic-value] let key4 = Key::from(&array4); // $ Sink _ = jar.signed_mut(&key4); } From fd0b81334f32f474aee5ea36aa18933d6b57eb47 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Wed, 26 Aug 2026 16:52:25 +0200 Subject: [PATCH 155/181] Docs: add linux-arm64 to supported platforms Add arm64 to the Linux row of the customer-facing supported-platforms table, following the existing macOS Apple Silicon precedent. Marked as beta via a new footnote. Part of native Linux Arm64 support. Release-gated: must land together with the actual arm release. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/codeql/reusables/supported-platforms.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/codeql/reusables/supported-platforms.rst b/docs/codeql/reusables/supported-platforms.rst index 5e679da12fa2..4205eef267d6 100644 --- a/docs/codeql/reusables/supported-platforms.rst +++ b/docs/codeql/reusables/supported-platforms.rst @@ -6,7 +6,7 @@ Operating system,Supported versions,Supported CPU architectures Linux,"Ubuntu 22.04 - Ubuntu 24.04","x86-64" + Ubuntu 24.04","x86-64, arm64 [1]_" Windows,"Windows 10 / Windows Server 2019 Windows 11 / Windows Server 2022/2025","x86-64" @@ -14,8 +14,10 @@ macOS 15 Sequoia - macOS 26 Tahoe","x86-64, arm64 (Apple Silicon) [1]_" + macOS 26 Tahoe","x86-64, arm64 (Apple Silicon) [2]_" .. container:: footnote-group - .. [1] Support for Apple Silicon is currently in beta. + .. [1] Support for Linux on arm64 is currently in beta. + + .. [2] Support for Apple Silicon is currently in beta. From abf5a0dd07276c62b8eaad5f6d0513465ef35053 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 27 Aug 2026 11:39:38 +0200 Subject: [PATCH 156/181] Python: translate Rust escapes in `tsg-python` output `tsg-python` serialises strings with Rust's `Debug` formatting, which `literal_eval` on the Python side disagrees with in two ways: - characters Rust considers non-printable, including grapheme-extending ones such as U+FE0F, U+200D and combining accents, come out as `\u{...}`, which Python does not accept at all; - NUL comes out as `\0`, which Python reads as the start of an *octal* escape, so `"\0" + "1"` silently decodes to U+0001. Everything else Rust emits round-trips, verified exhaustively over every Unicode scalar value paired with every printable ASCII neighbour. Also stop `Logger.log` from applying `%`-formatting when there are no arguments, which turned the resulting warning into a `TypeError` and dropped the whole file from the analysis when the offending literal happened to contain a `%` directive. Along the way, settle on `warning` as the logger method name, matching `Logger` and the standard library. `Logger.warn` never existed, so the two remaining `logger.warn` calls would have raised `AttributeError`. Fixes #22435 Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- python/extractor/semmle/logging.py | 10 +- python/extractor/semmle/python/imports.py | 2 +- .../semmle/python/parser/dump_ast.py | 4 +- .../semmle/python/parser/tsg_parser.py | 31 ++++ python/extractor/semmle/python/passes/flow.py | 4 +- python/extractor/semmle/worker.py | 2 +- .../tests/parser/unicode_escapes_new.expected | 150 ++++++++++++++++++ .../tests/parser/unicode_escapes_new.py | 28 ++++ python/extractor/tests/test_tsg_parser.py | 77 +++++++++ python/extractor/tsg-python/src/main.rs | 3 + .../2026-08-27-tsg-parser-unicode-escapes.md | 4 + 11 files changed, 308 insertions(+), 7 deletions(-) create mode 100644 python/extractor/tests/parser/unicode_escapes_new.expected create mode 100644 python/extractor/tests/parser/unicode_escapes_new.py create mode 100644 python/extractor/tests/test_tsg_parser.py create mode 100644 python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md diff --git a/python/extractor/semmle/logging.py b/python/extractor/semmle/logging.py index 31805040bf6d..64037163e697 100644 --- a/python/extractor/semmle/logging.py +++ b/python/extractor/semmle/logging.py @@ -65,6 +65,14 @@ def write_message_with_proc(level, proc_id, text): _logging_process = None +def format_message(fmt, args): + '''Applies `%`-formatting to `fmt`, but only when there are arguments to interpolate. + + This mirrors the standard library's `logging` behaviour, and means that a message that has + already been formatted -- and may therefore contain arbitrary `%` directives coming from the + code being analysed -- is passed through unharmed.''' + return fmt % args if args else fmt + def stop(): _logging_process.join() @@ -105,7 +113,7 @@ def log(self, level, fmt, *args): '''Log a message in a process safe fashion. Message will be of the form [level] fmt%args.''' if level <= self.level: - txt = fmt % args + txt = format_message(fmt, args) try: self.queue.put((self.color | level, self.proc_id, txt), False) except Exception: diff --git a/python/extractor/semmle/python/imports.py b/python/extractor/semmle/python/imports.py index 8da7df474480..98b848d3a688 100644 --- a/python/extractor/semmle/python/imports.py +++ b/python/extractor/semmle/python/imports.py @@ -252,6 +252,6 @@ def importer_from_options(options, finder, logger): importer = CachingModuleImporter(options.trap_cache, finder, logger) except Exception as ex: if options.trap_cache is not None: - logger.warn("Failed to create caching importer: %s", ex) + logger.warning("Failed to create caching importer: %s", ex) importer = ModuleImporter(finder, logger) return importer diff --git a/python/extractor/semmle/python/parser/dump_ast.py b/python/extractor/semmle/python/parser/dump_ast.py index 802bed8fac24..3a7db5ab0713 100644 --- a/python/extractor/semmle/python/parser/dump_ast.py +++ b/python/extractor/semmle/python/parser/dump_ast.py @@ -99,12 +99,12 @@ def visit(self, node, level=0, visited=None): class StdoutLogger(logging.Logger): error_count = 0 def log(self, level, fmt, *args): - sys.stdout.write(fmt % args + "\n") + sys.stdout.write(logging.format_message(fmt, args) + "\n") def info(self, fmt, *args): self.log(logging.INFO, fmt, *args) - def warn(self, fmt, *args): + def warning(self, fmt, *args): self.log(logging.WARN, fmt, *args) self.error_count += 1 diff --git a/python/extractor/semmle/python/parser/tsg_parser.py b/python/extractor/semmle/python/parser/tsg_parser.py index 356faf249ed3..2ce1ec0cd18b 100644 --- a/python/extractor/semmle/python/parser/tsg_parser.py +++ b/python/extractor/semmle/python/parser/tsg_parser.py @@ -3,6 +3,7 @@ # Functions and classes used for parsing Python files using `tree-sitter-graph` from ast import literal_eval +import re import sys import os import semmle.python.parser @@ -144,6 +145,7 @@ def read_tsg_python_output(path, logger): elif value == "#null": # e.g. `exc: #null` value = None else: # literal values, e.g. `name: "k1.k2"` or `level: 5` + value = rust_to_python_escapes(value) try: if key =="s" and value[0] == '"': # e.g. `s: "k1.k2"` value = evaluate_string(value) @@ -171,6 +173,35 @@ def read_tsg_python_output(path, logger): logger.debug("Read {} nodes and {} edges from TSG output".format(len(node_attr), len(edge_attr))) return node_attr, edge_attr +# `tsg-python` serialises string values using Rust's `Debug` formatting, which diverges from what +# Python's `literal_eval` accepts in two ways: +# - characters Rust considers non-printable -- including grapheme-extending ones such as the U+FE0F +# variation selector, U+200D zero width joiner and combining accents -- are rendered as `\u{...}`, +# a syntax Python does not know at all; +# - NUL is rendered as `\0`, which Python reads as the start of an *octal* escape, silently +# swallowing up to two more digits (`"\0" + "1"` would decode to `\x01`). +# Everything else Rust emits (`\t`, `\r`, `\n`, `\\`, `\"`, and unescaped characters) is read back +# identically by `literal_eval`, as verified exhaustively over every Unicode scalar value. +_RUST_ESCAPE = re.compile(r"\\(?:u\{([0-9a-fA-F]{1,6})\}|.)", re.DOTALL) + +def rust_to_python_escapes(text): + """Rewrites Rust escapes in `text` that Python would reject or misread into their equivalents. + + Matching every escape sequence (rather than only the offending ones) keeps the scan in step with + the backslashes, so an escaped backslash -- how a literal `\\u{fe0f}` in the source is + serialised -- is left alone.""" + if "\\u{" not in text and "\\0" not in text: + return text + def replace(match): + code_point = match.group(1) + if code_point is None: + return "\\x00" if match.group(0) == "\\0" else match.group(0) + code_point = int(code_point, 16) + if code_point > 0xFFFF: + return "\\U{:08x}".format(code_point) + return "\\u{:04x}".format(code_point) + return _RUST_ESCAPE.sub(replace, text) + def evaluate_string(s): s = literal_eval(s) prefix, quotes, content = split_string(s, None) diff --git a/python/extractor/semmle/python/passes/flow.py b/python/extractor/semmle/python/passes/flow.py index 9f434fe0c4c8..6ea5405a8540 100755 --- a/python/extractor/semmle/python/passes/flow.py +++ b/python/extractor/semmle/python/passes/flow.py @@ -12,7 +12,7 @@ from semmle.python.passes import unroller from semmle.python import modules import semmle.graph as graph -from semmle.logging import Logger +from semmle.logging import Logger, format_message __all__ = [ 'FlowPass' ] @@ -1924,7 +1924,7 @@ def write_ssa_phi(out, phi, arg): class FakeLogger(object): def debug(self, fmt, *args): - print(fmt % args) + print(format_message(fmt, args)) def traceback(self): print(traceback.format_exc()) diff --git a/python/extractor/semmle/worker.py b/python/extractor/semmle/worker.py index 96761a01c77e..ac8231390742 100644 --- a/python/extractor/semmle/worker.py +++ b/python/extractor/semmle/worker.py @@ -39,7 +39,7 @@ def __init__(self, max_depth, logger: Logger): changed_paths = data.get('changes', []) self.overlay_changes = { os.path.abspath(p) for p in changed_paths } except (IOError, ValueError) as e: - logger.warn("Failed to read overlay changes from '%s' (falling back to full extraction): %s", overlay_changes_file, e) + logger.warning("Failed to read overlay changes from '%s' (falling back to full extraction): %s", overlay_changes_file, e) self.overlay_changes = None def add_root(self, mod): diff --git a/python/extractor/tests/parser/unicode_escapes_new.expected b/python/extractor/tests/parser/unicode_escapes_new.expected new file mode 100644 index 000000000000..ed1ba2237543 --- /dev/null +++ b/python/extractor/tests/parser/unicode_escapes_new.expected @@ -0,0 +1,150 @@ +Module: [6, 0] - [29, 0] + body: [ + TypeAlias: [6, 0] - [6, 12] + name: + Name: [6, 5] - [6, 6] + variable: Variable('X', None) + ctx: Store + type_parameters: [] + value: + Name: [6, 9] - [6, 12] + variable: Variable('int', None) + ctx: Load + Assign: [9, 0] - [9, 37] + targets: [ + Name: [9, 0] - [9, 4] + variable: Variable('warn', None) + ctx: Store + ] + value: + Str: [9, 7] - [9, 37] + s: '⚠️ problem %s: %s' + prefix: '"' + implicitly_concatenated_parts: None + Assign: [10, 0] - [10, 35] + targets: [ + Name: [10, 0] - [10, 8] + variable: Variable('warn_raw', None) + ctx: Store + ] + value: + Str: [10, 11] - [10, 35] + s: '⚠️ problem %s: %s' + prefix: '"' + implicitly_concatenated_parts: None + Assign: [13, 0] - [13, 19] + targets: [ + Name: [13, 0] - [13, 3] + variable: Variable('zwj', None) + ctx: Store + ] + value: + Str: [13, 6] - [13, 19] + s: '👨\u200d💻' + prefix: '"' + implicitly_concatenated_parts: None + Assign: [16, 0] - [16, 14] + targets: [ + Name: [16, 0] - [16, 3] + variable: Variable('nfd', None) + ctx: Store + ] + value: + Str: [16, 6] - [16, 14] + s: 'café' + prefix: '"' + implicitly_concatenated_parts: None + Assign: [17, 0] - [17, 28] + targets: [ + Name: [17, 0] - [17, 11] + variable: Variable('soft_hyphen', None) + ctx: Store + ] + value: + Str: [17, 14] - [17, 28] + s: 'soft\xadhyphen' + prefix: '"' + implicitly_concatenated_parts: None + Assign: [20, 0] - [20, 12] + targets: [ + Name: [20, 0] - [20, 6] + variable: Variable('café', None) + ctx: Store + ] + value: + Name: [20, 9] - [20, 12] + variable: Variable('nfd', None) + ctx: Load + Assign: [23, 0] - [23, 23] + targets: [ + Name: [23, 0] - [23, 3] + variable: Variable('raw', None) + ctx: Store + ] + value: + Str: [23, 6] - [23, 23] + s: '⚠️\\u{fe0f}' + prefix: 'r"' + implicitly_concatenated_parts: None + Assign: [24, 0] - [24, 23] + targets: [ + Name: [24, 0] - [24, 6] + variable: Variable('joined', None) + ctx: Store + ] + value: + JoinedStr: [24, 9] - [24, 23] + values: [ + Str: [24, 9] - [24, 12] + s: '' + prefix: 'f"' + implicitly_concatenated_parts: None + Name: [24, 12] - [24, 15] + variable: Variable('zwj', None) + ctx: Load + Str: [24, 15] - [24, 23] + s: '⚠️' + prefix: 'f"' + implicitly_concatenated_parts: None + ] + Assign: [25, 0] - [25, 37] + targets: [ + Name: [25, 0] - [25, 12] + variable: Variable('concatenated', None) + ctx: Store + ] + value: + Str: [25, 15] - [25, 37] + s: '⚠️👨\u200d💻' + prefix: '"' + implicitly_concatenated_parts: [ + StringPart: [25, 15] - [25, 23] + prefix: '"' + text: '"⚠️"' + s: '⚠️' + StringPart: [25, 24] - [25, 37] + prefix: '"' + text: '"👨\u200d💻"' + s: '👨\u200d💻' + ] + Assign: [28, 0] - [28, 17] + targets: [ + Name: [28, 0] - [28, 1] + variable: Variable('d', None) + ctx: Store + ] + value: + Dict: [28, 4] - [28, 17] + items: [ + KeyValuePair: [28, 5] - [28, 16] + key: + Str: [28, 5] - [28, 13] + s: '⚠️' + prefix: '"' + implicitly_concatenated_parts: None + value: + Num: [28, 15] - [28, 16] + n: 1 + text: '1' + ] + ] diff --git a/python/extractor/tests/parser/unicode_escapes_new.py b/python/extractor/tests/parser/unicode_escapes_new.py new file mode 100644 index 000000000000..72cc435be7ef --- /dev/null +++ b/python/extractor/tests/parser/unicode_escapes_new.py @@ -0,0 +1,28 @@ +# Characters that Rust's `Debug` formatting escapes as `\u{...}` when `tsg-python` serialises the +# source text. See https://github.com/github/codeql/issues/22435. + +# PEP 695 syntax is what makes the old parser bail out and hand the file to `tsg-python` in the +# first place, so keep the reported reproducer intact. +type X = int + +# U+FE0F variation selector, next to a `%` directive. +warn = "\u26a0\ufe0f problem %s: %s" +warn_raw = "⚠️ problem %s: %s" + +# U+200D zero width joiner. +zwj = "👨‍💻" + +# Combining acute accent (NFD), and a soft hyphen. +nfd = "café" +soft_hyphen = "soft­hyphen" + +# Combining marks are valid in identifiers too. +café = nfd + +# In f-strings, raw strings and implicit concatenations too. +raw = r"⚠️\u{fe0f}" +joined = f"{zwj}⚠️" +concatenated = "⚠️" "👨‍💻" + +# ... and outside of string literals. +d = {"⚠️": 1} # comment with ⚠️ and 👨‍💻 diff --git a/python/extractor/tests/test_tsg_parser.py b/python/extractor/tests/test_tsg_parser.py new file mode 100644 index 000000000000..40249fb1eb4c --- /dev/null +++ b/python/extractor/tests/test_tsg_parser.py @@ -0,0 +1,77 @@ +import unittest + +from ast import literal_eval + +from semmle.logging import format_message +from semmle.python.parser.tsg_parser import evaluate_string, rust_to_python_escapes + + +class RustEscapeTest(unittest.TestCase): + """`tsg-python` serialises strings with Rust's `Debug` formatting, which escapes characters such + as U+FE0F as `\\u{...}` -- a syntax Python's `literal_eval` does not accept -- and NUL as `\\0`, + which Python reads as an octal escape.""" + + def test_untouched_without_escapes(self): + text = '"caf\u00e9 \u2713 \U0001f4be"' + self.assertEqual(rust_to_python_escapes(text), text) + + def test_basic_multilingual_plane(self): + self.assertEqual(rust_to_python_escapes(r'"\u{fe0f}"'), r'"\ufe0f"') + self.assertEqual(rust_to_python_escapes(r'"\u{200d}"'), r'"\u200d"') + + def test_short_and_astral_code_points(self): + self.assertEqual(rust_to_python_escapes(r'"\u{0}"'), r'"\u0000"') + self.assertEqual(rust_to_python_escapes(r'"\u{1f4a9}"'), r'"\U0001f4a9"') + + def test_other_escapes_are_preserved(self): + self.assertEqual(rust_to_python_escapes(r'"a\nb\"c\u{ad}"'), r'"a\nb\"c\u00ad"') + + def test_escaped_backslash_is_not_an_escape_introducer(self): + # How a raw string `r"\u{fe0f}"` in the analysed source gets serialised: the `\u{fe0f}` is + # literal text, not an escape, and must survive unchanged. + self.assertEqual(rust_to_python_escapes(r'"\\u{fe0f}"'), r'"\\u{fe0f}"') + + def test_nul_is_not_left_as_an_octal_escape(self): + # Rust renders NUL as `\0`; Python would read that as the start of an octal escape and + # swallow the digits that follow, decoding `"\01"` to U+0001 instead of NUL then `1`. + self.assertEqual(rust_to_python_escapes(r'"\01"'), r'"\x001"') + + def test_every_escape_shape_round_trips(self): + # Rust's `Debug for str` only ever emits these shapes. Checked exhaustively against every + # Unicode scalar value, each also paired with every printable ASCII neighbour. + for rendered, expected in [ + (r'"\0"', "\x00"), + (r'"\t"', "\t"), + (r'"\n"', "\n"), + (r'"\r"', "\r"), + (r'"\\"', "\\"), + (r'"\""', '"'), + (r'"\u{1}"', "\u0001"), + (r'"\u{1f}"', "\u001f"), + (r'"\u{300}"', "\u0300"), + (r'"\u{fe0f}"', "\ufe0f"), + (r'"\u{e0100}"', "\U000e0100"), + (r'"\u{10fffe}"', "\U0010fffe"), + ]: + for neighbour in ["", "0", "7", "9", "f", "u", "{"]: + with self.subTest(rendered=rendered, neighbour=neighbour): + text = rendered[:-1] + neighbour + '"' + self.assertEqual(literal_eval(rust_to_python_escapes(text)), expected + neighbour) + + def test_evaluate_string_on_reported_value(self): + # The exact value from https://github.com/github/codeql/issues/22435 that used to raise + # `truncated \uXXXX escape`. + value = rust_to_python_escapes('"\\"\u26a0\\u{fe0f} problem %s: %s\\""') + self.assertEqual(evaluate_string(value), "\u26a0\ufe0f problem %s: %s") + + +class FormatMessageTest(unittest.TestCase): + """A pre-formatted log message may contain `%` directives coming from the analysed source, and + must not be `%`-formatted again.""" + + def test_no_arguments(self): + message = "Error while parsing value '%s: %s'" + self.assertEqual(format_message(message, ()), message) + + def test_with_arguments(self): + self.assertEqual(format_message("%s and %s", ("a", "b")), "a and b") diff --git a/python/extractor/tsg-python/src/main.rs b/python/extractor/tsg-python/src/main.rs index 6e07a8cd86e7..19b2f6dcfece 100644 --- a/python/extractor/tsg-python/src/main.rs +++ b/python/extractor/tsg-python/src/main.rs @@ -710,6 +710,9 @@ fn main() -> Result<()> { add_syntax_error_nodes(&mut graph, &syntax_errors); } + // `pretty_print` renders string values with Rust's `Debug` formatting, so non-printable and + // grapheme-extending characters come out as `\u{...}`. The reader on the other side + // (`semmle/python/parser/tsg_parser.py`) translates those into Python escapes. print!("{}", graph.pretty_print()); Ok(()) } diff --git a/python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md b/python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md new file mode 100644 index 000000000000..56b70081d529 --- /dev/null +++ b/python/ql/lib/change-notes/2026-08-27-tsg-parser-unicode-escapes.md @@ -0,0 +1,4 @@ +--- +category: fix +--- +* Fixed a bug where a Python file could be silently dropped from the analysis (with a spurious "A parse error occurred" diagnostic) when it contained a string literal, comment, or identifier with a character such as the U+FE0F emoji variation selector, a U+200D zero width joiner, or a combining accent. From e464c999564c2bc8f757372f0084626ef2e8f30a Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 27 Aug 2026 11:25:38 +0200 Subject: [PATCH 157/181] Docs: note Rosetta 2 requirement for Apple Silicon Replace the Apple Silicon supported-platforms footnote with guidance on when Rosetta 2 is needed: building your code during analysis requires Rosetta 2, while analyzing an interpreted language or using build mode none runs natively. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/codeql/reusables/supported-platforms.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/reusables/supported-platforms.rst b/docs/codeql/reusables/supported-platforms.rst index 4205eef267d6..8a7f31849b4f 100644 --- a/docs/codeql/reusables/supported-platforms.rst +++ b/docs/codeql/reusables/supported-platforms.rst @@ -20,4 +20,4 @@ .. [1] Support for Linux on arm64 is currently in beta. - .. [2] Support for Apple Silicon is currently in beta. + .. [2] On Apple Silicon, building your code during analysis requires Rosetta 2; analyzing an interpreted language or using build mode ``none`` runs natively. From 3e88b36a406d52d4aa44bd23f1aef3dc431e396f Mon Sep 17 00:00:00 2001 From: Taus Date: Wed, 26 Aug 2026 22:05:42 +0000 Subject: [PATCH 158/181] yeast: Support optional guards in rules Permits the use of guards of the form `where expr` (with `expr` being any Rust expression that evaluates to a boolean) inside of rules. The guard should come after the query itself, and before the `=>` that separates the query from the body, like so: ``` (foo bar: _? @bar) where bar.is_some() => (baz bar: {bar}) ``` If the guard is absent, it behaves as if it were `where true`. Inside of the guard body, all captures are treated as if they are raw. Translation of non-raw captures only happens if the guard succeeds. The guard can also access the user-defined context. This context is shared with the body if the guard succeeds, and discarded if the guard fails (just as it is currently discarded after running a rule body). (I think it's unlikely that we'll ever want to mutate the context from inside the guard, but you never know...) --- shared/yeast-macros/src/lib.rs | 18 +++ shared/yeast-macros/src/parse.rs | 141 +++++++++++++++------- shared/yeast/doc/yeast.md | 48 ++++++++ shared/yeast/src/lib.rs | 166 ++++++++++++++----------- shared/yeast/tests/test.rs | 201 +++++++++++++++++++++++++++++++ 5 files changed, 459 insertions(+), 115 deletions(-) diff --git a/shared/yeast-macros/src/lib.rs b/shared/yeast-macros/src/lib.rs index 82b0e3e7b408..e9f7b46d0570 100644 --- a/shared/yeast-macros/src/lib.rs +++ b/shared/yeast-macros/src/lib.rs @@ -122,6 +122,15 @@ pub fn trees(input: TokenStream) -> TokenStream { /// (output_template field: {name} {repeated}) /// ) /// +/// // A guard filters a successful query match. Every capture is raw in the +/// // guard because guards run before capture translation. +/// rule!( +/// (query_pattern field: _? @value) +/// where value.is_none() +/// => +/// (output_template) +/// ) +/// /// // Shorthand: captures become fields on the output node /// rule!((query ...) => output_kind) /// ``` @@ -131,6 +140,15 @@ pub fn trees(input: TokenStream) -> TokenStream { /// - `@name` (after `*`/`+`) → `name: Vec` /// - `@name` (after `?`) → `name: Option` /// +/// A guard is an optional Rust condition between the query and `=>`. It is +/// evaluated after the query matches and before any `@` captures are +/// translated. Returning false makes the driver try the next rule. All +/// captures are therefore raw in the guard; `@` versus `@@` controls only +/// whether the capture is translated for the transform. `ctx` provides +/// mutable user-context access, and `ast` provides read-only AST access. +/// Mutations to `ctx` are visible to the transform when the guard succeeds. +/// Omitting the guard is equivalent to writing `where true`. +/// /// `tree!` and `trees!` can be used without explicit context inside `{...}`. #[proc_macro] pub fn rule(input: TokenStream) -> TokenStream { diff --git a/shared/yeast-macros/src/parse.rs b/shared/yeast-macros/src/parse.rs index 34e859c912e9..87fb5435bcd1 100644 --- a/shared/yeast-macros/src/parse.rs +++ b/shared/yeast-macros/src/parse.rs @@ -645,6 +645,32 @@ enum CaptureMultiplicity { Repeated, } +fn capture_bindings<'a>(captures: impl Iterator) -> Vec { + captures + .map(|cap| { + let name = Ident::new(&cap.name, Span::call_site()); + let name_str = &cap.name; + match cap.multiplicity { + CaptureMultiplicity::Repeated => { + quote! { + let #name: Vec = __captures.get_all(#name_str); + } + } + CaptureMultiplicity::Optional => { + quote! { + let #name: Option = __captures.get_opt(#name_str); + } + } + CaptureMultiplicity::Single => { + quote! { + let #name: yeast::Id = __captures.get_var(#name_str).unwrap(); + } + } + } + }) + .collect() +} + /// Walk a token stream and extract all `@name` captures, noting whether /// they appear after `*` or `+` (repeated) or not. fn extract_captures(stream: &TokenStream) -> Vec { @@ -806,7 +832,7 @@ fn try_consume_return_annotation(tokens: &mut Tokens) -> Result Result { let mut tokens = input.into_iter().peekable(); - // Collect query tokens up to `=>` + // Collect query and optional `where` guard tokens up to `=>`. let mut query_tokens = Vec::new(); loop { match tokens.peek() { @@ -830,7 +856,7 @@ pub fn parse_rule_top(input: TokenStream) -> Result { } } - let query_stream: TokenStream = query_tokens.into_iter().collect(); + let (query_stream, guard) = split_rule_guard(query_tokens)?; // Extract captures from query let captures = extract_captures(&query_stream); @@ -838,40 +864,22 @@ pub fn parse_rule_top(input: TokenStream) -> Result { // Parse query let query_code = parse_query_top(query_stream.clone())?; + let (raw_captures, translated_captures): (Vec<_>, Vec<_>) = + captures.iter().partition(|capture| capture.raw); + // Capture names marked `@@name` (raw) — passed to the auto-translate // prefix as a skip list so those captures keep their input-schema ids. - let raw_capture_names: Vec<&str> = captures + let raw_capture_names: Vec<&str> = raw_captures .iter() - .filter(|c| c.raw) - .map(|c| c.name.as_str()) + .map(|capture| capture.name.as_str()) .collect(); - // Generate capture bindings + // Both capture sets are bound raw in the guard, which runs before + // auto-translation. In the transform, raw captures remain unchanged + // while translated captures are bound after auto-translation. let ctx_ident = Ident::new(IMPLICIT_CTX, Span::call_site()); - let bindings: Vec = captures - .iter() - .map(|cap| { - let name = Ident::new(&cap.name, Span::call_site()); - let name_str = &cap.name; - match cap.multiplicity { - CaptureMultiplicity::Repeated => { - quote! { - let #name: Vec = __captures.get_all(#name_str); - } - } - CaptureMultiplicity::Optional => { - quote! { - let #name: Option = __captures.get_opt(#name_str); - } - } - CaptureMultiplicity::Single => { - quote! { - let #name: yeast::Id = __captures.get_var(#name_str).unwrap(); - } - } - } - }) - .collect(); + let raw_bindings = capture_bindings(raw_captures.into_iter()); + let translated_bindings = capture_bindings(translated_captures.into_iter()); // Parse transform: the token(s) after `=>` fall into one of three // shapes, dispatched in order: @@ -1015,24 +1023,36 @@ pub fn parse_rule_top(input: TokenStream) -> Result { } }; + let guard = guard.unwrap_or_else(|| syn::parse_quote!(true)); Ok(quote! { { let __query = #query_code; - yeast::Rule::new(__query, Box::new(|__ast: &mut yeast::Ast, mut __captures: yeast::captures::Captures, __fresh: &yeast::tree_builder::FreshScope, __source_range: Option, __user_ctx: &mut _, __translator: yeast::TranslatorHandle<'_, _>| { - // Auto-translation prefix: recursively translate every - // captured node before invoking the user's transform body, - // except for `@@name` captures listed in `__skip` which the - // body consumes raw. - // For OneShot rules this preserves the legacy behaviour - // (input-schema captures translated to output-schema - // nodes); for Repeating rules it is a no-op. - let __skip: &[&str] = &[#(#raw_capture_names),*]; - __translator.auto_translate_captures(&mut __captures, __ast, __user_ctx, __skip)?; - #(#bindings)* - let mut #ctx_ident = yeast::build::BuildCtx::with_translator(__ast, &__captures, __fresh, __source_range, __user_ctx, __translator); - let __result: Vec = { #transform_body }; - Ok(__result) - })) + yeast::Rule::guarded( + __query, + Box::new(|__ast: &yeast::Ast, __captures: &yeast::captures::Captures, __user_ctx: &mut _| { + #(#raw_bindings)* + #(#translated_bindings)* + let ast = __ast; + let #ctx_ident = __user_ctx; + Ok(#guard) + }), + Box::new(|__ast: &mut yeast::Ast, mut __captures: yeast::captures::Captures, __fresh: &yeast::tree_builder::FreshScope, __source_range: Option, __user_ctx: &mut _, __translator: yeast::TranslatorHandle<'_, _>| { + // Auto-translation prefix: recursively translate every + // captured node before invoking the user's transform body, + // except for `@@name` captures listed in `__skip` which the + // body consumes raw. + // For OneShot rules this preserves the legacy behaviour + // (input-schema captures translated to output-schema + // nodes); for Repeating rules it is a no-op. + let __skip: &[&str] = &[#(#raw_capture_names),*]; + __translator.auto_translate_captures(&mut __captures, __ast, __user_ctx, __skip)?; + #(#raw_bindings)* + #(#translated_bindings)* + let mut #ctx_ident = yeast::build::BuildCtx::with_translator(__ast, &__captures, __fresh, __source_range, __user_ctx, __translator); + let __result: Vec = { #transform_body }; + Ok(__result) + }), + ) } }) } @@ -1041,6 +1061,37 @@ pub fn parse_rule_top(input: TokenStream) -> Result { // Token utilities // --------------------------------------------------------------------------- +/// Split the tokens before a rule's `=>` into its query and optional +/// top-level `where guard`. Groups are opaque `TokenTree`s, so a `where` +/// inside the query or guard expression is not mistaken for the separator. +fn split_rule_guard(tokens: Vec) -> Result<(TokenStream, Option)> { + let guard_index = tokens + .iter() + .position(|tok| matches!(tok, TokenTree::Ident(ident) if ident == "where")); + + let Some(guard_index) = guard_index else { + return Ok((tokens.into_iter().collect(), None)); + }; + + let query: TokenStream = tokens[..guard_index].iter().cloned().collect(); + if query.is_empty() { + return Err(syn::Error::new( + Span::call_site(), + "expected query before rule guard", + )); + } + + let guard_tokens: TokenStream = tokens[guard_index + 1..].iter().cloned().collect(); + if guard_tokens.is_empty() { + return Err(syn::Error::new_spanned( + tokens[guard_index].clone(), + "expected expression after rule guard `where`", + )); + } + let guard = syn::parse2::(guard_tokens)?; + Ok((query, Some(guard))) +} + fn peek_is_at(tokens: &mut Tokens) -> bool { matches!(tokens.peek(), Some(TokenTree::Punct(p)) if p.as_char() == '@') } diff --git a/shared/yeast/doc/yeast.md b/shared/yeast/doc/yeast.md index be3bc913c700..3e3e1cd3610f 100644 --- a/shared/yeast/doc/yeast.md +++ b/shared/yeast/doc/yeast.md @@ -458,6 +458,54 @@ yeast::rule!( The shorthand `=> kind` form auto-generates the template, mapping each capture name to a field of the same name on the output node. +### Guards + +A rule may include a Rust guard between its query and `=>`. The guard runs +after the query matches but before any captures are translated. If it returns +`false`, the rule is treated as a non-match and the driver tries the next rule. +Omitting the guard is equivalent to writing `where true`: + +```rust +rule!( + (tupleExpr + elements: (labeledExpr + label: _? @label + expression: @inner) + elements: _* @rest) + where label.is_none() && rest.is_empty() + => + expr { inner } +) +``` + +Every capture is a raw input-schema id in the guard, regardless of whether it +uses `@` or `@@`, because the guard runs before translation. The marker controls +the transform binding only: `@inner` is translated after the guard accepts the +rule, while a capture marked `@@` would remain raw in the transform as well. +In this example `label` and `rest` are empty whenever the guard succeeds, so +there is nothing to translate for those captures. + +Guards receive the mutable user context as `ctx` and the raw AST as `ast`. +The framework clones the user context before evaluating each guard. If the +guard succeeds, its context mutations are visible to the rule transform and +recursive translation; if it fails, the clone is discarded before the next +rule is tried: + +```rust +rule!( + (tupleExpr elements: _* @elements) + where { + ctx.in_pattern = true; + elements + .first() + .and_then(|element| ast.get_node(*element)) + .is_some() + } + => + (tuple_pattern element: {elements}) +) +``` + ### Annotation form Rules that need imperative logic — mutating [`BuildCtx`] state per diff --git a/shared/yeast/src/lib.rs b/shared/yeast/src/lib.rs index c290246541f5..94f75faa4763 100644 --- a/shared/yeast/src/lib.rs +++ b/shared/yeast/src/lib.rs @@ -1014,8 +1014,16 @@ pub type Transform = Box< + Sync, >; +/// Predicate evaluated after a rule's query matches and before its transform +/// runs. Returning `false` makes the rule behave as if its query did not +/// match, so the driver continues to the next rule. The user context is a +/// private clone for this rule attempt; mutations are retained for the +/// transform when the guard succeeds and discarded when it fails. +pub type Guard = Box Result + Send + Sync>; + pub struct Rule { query: QueryNode, + guard: Option>, transform: Transform, /// If true, after this rule fires on a node the engine will try to /// re-apply this same rule on the result root. Defaults to false: @@ -1025,9 +1033,22 @@ pub struct Rule { } impl Rule { + /// Construct an unguarded rule from its query and transform. pub fn new(query: QueryNode, transform: Transform) -> Self { Self { query, + guard: None, + transform, + repeated: false, + } + } + + /// Construct a guarded rule. The guard sees raw captures and shares its + /// private user-context clone with the transform when it succeeds. + pub fn guarded(query: QueryNode, guard: Guard, transform: Transform) -> Self { + Self { + query, + guard: Some(guard), transform, repeated: false, } @@ -1042,30 +1063,29 @@ impl Rule { self } - fn try_rule( - &self, - ast: &mut Ast, - node: Id, - fresh: &tree_builder::FreshScope, - user_ctx: &mut C, - translator: TranslatorHandle<'_, C>, - ) -> Result>, String> { - match self.try_match(ast, node)? { - Some(captures) => Ok(Some( - self.run_transform(ast, captures, node, fresh, user_ctx, translator)?, - )), - None => Ok(None), + /// Attempt to match this rule's query against `node`, returning the raw + /// captures on success. Does not evaluate the guard or invoke the + /// transform. + fn match_query(&self, ast: &Ast, node: Id) -> Result, String> { + let mut captures = Captures::new(); + if !self.query.do_match(ast, node, &mut captures)? { + return Ok(None); } + Ok(Some(captures)) } - /// Attempt to match this rule's query against `node`, returning the - /// resulting captures on success. Does not invoke the transform. - fn try_match(&self, ast: &Ast, node: Id) -> Result, String> { - let mut captures = Captures::new(); - if self.query.do_match(ast, node, &mut captures)? { - Ok(Some(captures)) + /// Evaluate this rule's guard against a successful query match. An + /// unguarded rule always succeeds. + fn guard_matches( + &self, + ast: &Ast, + captures: &Captures, + user_ctx: &mut C, + ) -> Result { + if let Some(guard) = &self.guard { + guard(ast, captures, user_ctx) } else { - Ok(None) + Ok(true) } } @@ -1154,13 +1174,19 @@ fn apply_repeating_rules_inner( if Some(rule_ptr) == skip_rule { continue; } - // Give each rule attempt a private clone of the user context. - // Any mutations the rule makes are visible to its transform and - // to the recursive translation of its result, but never leak - // back to the parent — the clone is simply dropped when we - // return. This is also `?`-safe: an error return drops `local` - // without touching the caller's `user_ctx`. + let Some(captures) = rule.match_query(ast, id)? else { + continue; + }; + + // Give each structurally-matching rule a private clone of the user + // context before its guard runs. Guard mutations are visible to the + // transform and recursive translation when the guard succeeds, but a + // failed guard drops the clone before trying the next rule. let mut local = user_ctx.clone(); + if !rule.guard_matches(ast, &captures, &mut local)? { + continue; + } + // Repeating rules don't need a real translator: their captures // aren't auto-translated (Repeating preserves the input schema), // and `ctx.translate(id)` errors if invoked from a Repeating @@ -1168,29 +1194,25 @@ fn apply_repeating_rules_inner( let translator = TranslatorHandle { inner: TranslatorImpl::Repeating, }; - let try_result = rule.try_rule(ast, id, fresh, &mut local, translator)?; - if let Some(result_node) = try_result { - // For non-repeated rules, suppress further application of *this* - // rule on the result root, so a rule whose output matches its own - // query doesn't loop. Other rules and child traversal are - // unaffected. - let next_skip = if rule.repeated { None } else { Some(rule_ptr) }; - let mut results = Vec::new(); - for node in result_node { - results.extend(apply_repeating_rules_inner( - index, - ast, - &mut local, - node, - fresh, - rewrite_depth + 1, - next_skip, - )?); - } - return Ok(results); + let result_nodes = rule.run_transform(ast, captures, id, fresh, &mut local, translator)?; + + // For non-repeated rules, suppress further application of *this* + // rule on the result root, so a rule whose output matches its own + // query doesn't loop. Other rules and child traversal are unaffected. + let next_skip = if rule.repeated { None } else { Some(rule_ptr) }; + let mut results = Vec::new(); + for node in result_nodes { + results.extend(apply_repeating_rules_inner( + index, + ast, + &mut local, + node, + fresh, + rewrite_depth + 1, + next_skip, + )?); } - // Rule didn't match; `local` is dropped as we loop to the next - // rule. + return Ok(results); } // Take the parent's fields by ownership: the recursion will rewrite @@ -1271,29 +1293,33 @@ fn apply_one_shot_rules_inner( let node_kind = ast.get_node(id).map(|n| n.kind_name()).unwrap_or(""); for rule in index.rules_for_kind(node_kind) { - if let Some(captures) = rule.try_match(ast, id)? { - // Give the rule a private clone of the user context. Any - // mutations the rule (or its transitively-translated - // captures) make are visible during this rule's transform, - // but never leak back — the clone is dropped when we - // return. `?`-safe: an error return drops `local` without - // touching the caller's `user_ctx`. - let mut local = user_ctx.clone(); - // Build the translator handle the transform will use to - // recursively translate captures (or, for macro-generated - // rules, the auto-translate prefix uses it to translate every - // capture up front, preserving the legacy behavior). - let translator = TranslatorHandle { - inner: TranslatorImpl::OneShot { - index, - fresh, - rewrite_depth, - matched_root: id, - }, - }; - let result = rule.run_transform(ast, captures, id, fresh, &mut local, translator)?; - return Ok(result); + let Some(captures) = rule.match_query(ast, id)? else { + continue; + }; + + // Clone only after the query matches, but before the guard runs. + // Guard mutations are visible to the transform and transitively- + // translated captures when the guard succeeds; a failed guard drops + // the clone before trying the next rule. + let mut local = user_ctx.clone(); + if !rule.guard_matches(ast, &captures, &mut local)? { + continue; } + + // Build the translator handle the transform will use to recursively + // translate captures (or, for macro-generated rules, the + // auto-translate prefix uses it to translate every capture up front, + // preserving the legacy behavior). + let translator = TranslatorHandle { + inner: TranslatorImpl::OneShot { + index, + fresh, + rewrite_depth, + matched_root: id, + }, + }; + let result = rule.run_transform(ast, captures, id, fresh, &mut local, translator)?; + return Ok(result); } Err(format!( diff --git a/shared/yeast/tests/test.rs b/shared/yeast/tests/test.rs index bdc17c7593dc..60ed8afe84dd 100644 --- a/shared/yeast/tests/test.rs +++ b/shared/yeast/tests/test.rs @@ -918,6 +918,104 @@ fn test_shorthand_rule() { ); } +#[derive(Clone, Default)] +struct GuardTestContext { + enabled: bool, + selected: bool, +} + +fn guarded_integer_rules() -> Vec> { + vec![ + yeast::rule!( + (integer) @@raw + where { + ctx.selected = ctx.enabled && ast.source_text(raw) == "1"; + ctx.selected + } + => + identifier { + assert!(ctx.selected); + tree!((identifier "guarded")) + } + ), + yeast::rule!((integer) => (identifier "fallback")), + ] +} + +#[test] +fn test_rule_guard_reads_raw_capture_and_user_context() { + fn run(input: &str, enabled: bool) -> String { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = + yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang) + .unwrap(); + let phases = vec![Phase::new( + "test", + PhaseKind::Repeating, + guarded_integer_rules(), + )]; + let runner = Runner::with_schema(lang, &schema, &phases); + let mut user_ctx = GuardTestContext { + enabled, + selected: false, + }; + let ast = runner.run_with_ctx(input, &mut user_ctx).unwrap(); + dump_ast(&ast, ast.get_root(), input) + } + + assert_dump_eq( + &run("1", true), + r#" + program + identifier "guarded" + "#, + ); + assert_dump_eq( + &run("2", true), + r#" + program + identifier "fallback" + "#, + ); + assert_dump_eq( + &run("1", false), + r#" + program + identifier "fallback" + "#, + ); +} + +#[test] +fn test_rule_guard_binds_optional_and_repeated_raw_captures() { + fn rules() -> Vec { + vec![ + yeast::rule!( + (array (_)? @@first (_)* @@rest) + where first.is_some() && rest.is_empty() + => + (identifier "single") + ), + yeast::rule!((array) => (identifier "multiple")), + ] + } + + assert_dump_eq( + &run_and_dump("[1]", rules()), + r#" + program + identifier "single" + "#, + ); + assert_dump_eq( + &run_and_dump("[1, 2]", rules()), + r#" + program + identifier "multiple" + "#, + ); +} + #[test] fn test_chained_rules_output_only_kind() { // Exercise rule chaining where an intermediate kind exists only in the @@ -1134,6 +1232,84 @@ fn test_one_shot_phase_errors_when_no_rule_matches() { ); } +#[test] +fn test_one_shot_guard_runs_before_capture_translation() { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = + yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang).unwrap(); + let rules: Vec = vec![ + yeast::rule!( + (program (_)* @stmts) + => + (program stmt: {stmts}) + ), + // There is deliberately no OneShot rule for `identifier`. If this + // rule translated `@left` before binding it raw in the guard, the run + // would fail instead of evaluating the guard and falling through to + // the next assignment rule. + yeast::rule!( + (assignment left: (_) @left) + where ast.source_text(left) == "not-x" + => + (first_node left: {left}) + ), + yeast::rule!((assignment) => (identifier "fallback")), + ]; + let phases = vec![Phase::new("translate", PhaseKind::OneShot, rules)]; + let runner: Runner = Runner::with_schema(lang, &schema, &phases); + + let input = "x = 1"; + let ast = runner.run(input).unwrap(); + let dump = dump_ast(&ast, ast.get_root(), input); + assert_dump_eq( + &dump, + r#" + program + stmt: identifier "fallback" + "#, + ); +} + +#[test] +fn test_one_shot_guard_context_mutation_is_visible_to_transform() { + let lang: tree_sitter::Language = tree_sitter_ruby::LANGUAGE.into(); + let schema = + yeast::node_types_yaml::schema_from_yaml_with_language(OUTPUT_SCHEMA_YAML, &lang).unwrap(); + let rules: Vec> = vec![ + yeast::rule!( + (program (_)* @stmts) + => + (program stmt: {stmts}) + ), + yeast::rule!( + (integer) + where { + ctx.selected = true; + true + } + => + identifier { + assert!(ctx.selected); + tree!((identifier "guarded")) + } + ), + ]; + let phases = vec![Phase::new("translate", PhaseKind::OneShot, rules)]; + let runner = Runner::with_schema(lang, &schema, &phases); + let mut user_ctx = GuardTestContext::default(); + + let input = "1"; + let ast = runner.run_with_ctx(input, &mut user_ctx).unwrap(); + let dump = dump_ast(&ast, ast.get_root(), input); + assert_dump_eq( + &dump, + r#" + program + stmt: identifier "guarded" + "#, + ); +} + /// OneShot recursion must apply rules to *captured* nodes, even if the rule /// returns a captured child verbatim. A buggy implementation that only /// recurses into the children of the rule's output (rather than into the @@ -1549,6 +1725,31 @@ fn test_rules_macro_accepts_bare_shorthand_form() { ); } +#[test] +fn test_rules_macro_accepts_bare_guarded_rule() { + let rules: Vec = yeast::rules! { + input: "tests/input-types.yml", + output: "tests/node-types.yml", + [ + (integer) @@raw + where ast.source_text(raw) == "1" + => + (identifier "guarded"), + + (integer) => (identifier "fallback"), + ] + }; + + let dump = run_and_dump("1", rules); + assert_dump_eq( + &dump, + r#" + program + identifier "guarded" + "#, + ); +} + /// Backwards-compat: explicit `rule!(...)` invocations inside `rules!` /// should still type-check and behave the same as the bare form. #[test] From 51a107eaac1676cceecb3990da365c9b4163b21d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 27 Aug 2026 09:39:12 +0200 Subject: [PATCH 159/181] C#: Convert the OData test to use the Sink for the alert location and update test expected output. --- .../frameworks/OData/OData.expected | 24 +++++++++---------- .../library-tests/frameworks/OData/OData.ql | 3 ++- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index a2e0614a51ec..7cef6368a276 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -67,15 +67,15 @@ nodes | OData.cs:104:18:104:23 | access to property Name | semmle.label | access to property Name | subpaths #select -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:49:18:49:23 | access to local variable entity | $@ | OData.cs:49:18:49:23 | access to local variable entity | access to local variable entity | -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:50:18:50:28 | access to property Name | $@ | OData.cs:50:18:50:28 | access to property Name | access to property Name | -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:51:18:51:31 | access to property Content | $@ | OData.cs:51:18:51:31 | access to property Content | access to property Content | -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:52:18:52:38 | access to property Owner | $@ | OData.cs:52:18:52:38 | access to property Owner | access to property Owner | -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:55:22:55:28 | access to property Owner | $@ | OData.cs:55:22:55:28 | access to property Owner | access to property Owner | -| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | $@ | OData.cs:65:26:65:35 | access to property Label | access to property Label | -| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:72:22:72:34 | access to property Category | $@ | OData.cs:72:22:72:34 | access to property Category | access to property Category | -| OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:80:18:80:28 | access to property Name | $@ | OData.cs:80:18:80:28 | access to property Name | access to property Name | -| OData.cs:83:39:83:43 | delta : Delta | OData.cs:83:39:83:43 | delta : Delta | OData.cs:86:18:86:30 | access to property Name | $@ | OData.cs:86:18:86:30 | access to property Name | access to property Name | -| OData.cs:89:45:89:49 | delta : Delta | OData.cs:89:45:89:49 | delta : Delta | OData.cs:92:18:92:23 | access to property Name | $@ | OData.cs:92:18:92:23 | access to property Name | access to property Name | -| OData.cs:95:67:95:71 | delta : Delta | OData.cs:95:67:95:71 | delta : Delta | OData.cs:98:18:98:30 | access to property Name | $@ | OData.cs:98:18:98:30 | access to property Name | access to property Name | -| OData.cs:101:71:101:75 | delta : Delta | OData.cs:101:71:101:75 | delta : Delta | OData.cs:104:18:104:23 | access to property Name | $@ | OData.cs:104:18:104:23 | access to property Name | access to property Name | +| OData.cs:49:18:49:23 | access to local variable entity | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:49:18:49:23 | access to local variable entity | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | +| OData.cs:50:18:50:28 | access to property Name | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:50:18:50:28 | access to property Name | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | +| OData.cs:51:18:51:31 | access to property Content | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:51:18:51:31 | access to property Content | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | +| OData.cs:52:18:52:38 | access to property Owner | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:52:18:52:38 | access to property Owner | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | +| OData.cs:55:22:55:28 | access to property Owner | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:55:22:55:28 | access to property Owner | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | +| OData.cs:65:26:65:35 | access to property Label | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | This path depends on an $@. | OData.cs:59:55:59:64 | parameters | ODataParameters value | +| OData.cs:72:22:72:34 | access to property Category | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:72:22:72:34 | access to property Category | This path depends on an $@. | OData.cs:59:55:59:64 | parameters | ODataParameters value | +| OData.cs:80:18:80:28 | access to property Name | OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:80:18:80:28 | access to property Name | This path depends on an $@. | OData.cs:76:52:76:61 | parameters | ODataParameters value | +| OData.cs:86:18:86:30 | access to property Name | OData.cs:83:39:83:43 | delta : Delta | OData.cs:86:18:86:30 | access to property Name | This path depends on an $@. | OData.cs:83:39:83:43 | delta | ODataParameters value | +| OData.cs:92:18:92:23 | access to property Name | OData.cs:89:45:89:49 | delta : Delta | OData.cs:92:18:92:23 | access to property Name | This path depends on an $@. | OData.cs:89:45:89:49 | delta | ODataParameters value | +| OData.cs:98:18:98:30 | access to property Name | OData.cs:95:67:95:71 | delta : Delta | OData.cs:98:18:98:30 | access to property Name | This path depends on an $@. | OData.cs:95:67:95:71 | delta | ODataParameters value | +| OData.cs:104:18:104:23 | access to property Name | OData.cs:101:71:101:75 | delta : Delta | OData.cs:104:18:104:23 | access to property Name | This path depends on an $@. | OData.cs:101:71:101:75 | delta | ODataParameters value | diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.ql b/csharp/ql/test/library-tests/frameworks/OData/OData.ql index b25ef30bc470..f0636d555b51 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.ql +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.ql @@ -25,4 +25,5 @@ module Taint = TaintTracking::Global; from Taint::PathNode source, Taint::PathNode sink where Taint::flowPath(source, sink) -select source, source, sink, "$@", sink, sink.toString() +select sink.getNode(), source, sink, "This path depends on an $@.", source.getNode(), + "ODataParameters value" From 538d51f3f95aba0332c84b9869d50560a44ff416 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 27 Aug 2026 10:05:34 +0200 Subject: [PATCH 160/181] C#: Convert the test to use inline expectations and update expected test output. --- .../library-tests/frameworks/OData/OData.cs | 24 +++++++++---------- .../frameworks/OData/OData.expected | 14 +++++++---- .../library-tests/frameworks/OData/OData.ql | 9 +++---- 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index a16a821da070..91d0440c3288 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -46,13 +46,13 @@ void Sink(object o) { } void CastFromDictionary(ODataActionParameters parameters) { var entity = (BoundEntity)parameters["Entity"]; - Sink(entity); - Sink(entity.Name); - Sink(entity.Content); - Sink(entity.Metadata.Owner); + Sink(entity); // $ hasTaintFlow=line:46 + Sink(entity.Name); // $ hasTaintFlow=line:46 + Sink(entity.Content); // $ hasTaintFlow=line:46 + Sink(entity.Metadata.Owner); // $ hasTaintFlow=line:46 foreach (var m in entity.Revisions) { - Sink(m.Owner); + Sink(m.Owner); // $ hasTaintFlow=line:46 } } @@ -62,14 +62,14 @@ void IsAsFromDictionary(ODataActionParameters parameters) { foreach (var item in items1) { - Sink(item.Label); + Sink(item.Label); // $ hasTaintFlow=line:59 } } var items2 = parameters["Items"] as IEnumerable; foreach (var item in items2) { - Sink(item.Category); + Sink(item.Category); // $ hasTaintFlow=line:59 } } @@ -77,31 +77,31 @@ void UpcastThenIndex(ODataActionParameters parameters) { IDictionary dict = parameters; var entity = (BoundEntity)dict["Entity"]; - Sink(entity.Name); + Sink(entity.Name); // $ hasTaintFlow=line:76 } void DeltaPatch(Delta delta, Widget original) { delta.Patch(original); - Sink(original.Name); + Sink(original.Name); // $ hasTaintFlow=line:83 } void DeltaGetInstance(Delta delta) { var w = delta.GetInstance(); - Sink(w.Name); + Sink(w.Name); // $ hasTaintFlow=line:89 } void LegacyDeltaPatch(System.Web.Http.OData.Delta delta, Widget original) { delta.Patch(original); - Sink(original.Name); + Sink(original.Name); // $ hasTaintFlow=line:95 } void LegacyDeltaGetEntity(System.Web.Http.OData.Delta delta) { var w = delta.GetEntity(); - Sink(w.Name); + Sink(w.Name); // $ hasTaintFlow=line:101 } void Untainted() diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index 7cef6368a276..86f12b08f3c2 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -1,3 +1,8 @@ +models +| 1 | Summary: Microsoft.AspNet.OData; Delta; true; GetInstance; (); ; Argument[this]; ReturnValue; taint; manual | +| 2 | Summary: Microsoft.AspNet.OData; Delta; true; Patch; (TStructuralType); ; Argument[this]; Argument[0]; taint; manual | +| 3 | Summary: System.Web.Http.OData; Delta; true; GetEntity; (); ; Argument[this]; ReturnValue; taint; manual | +| 4 | Summary: System.Web.Http.OData; Delta; true; Patch; (TEntityType); ; Argument[this]; Argument[0]; taint; manual | edges | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:48:26:48:58 | (...) ... : BoundEntity | provenance | | | OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:49:18:49:23 | access to local variable entity | provenance | | @@ -15,18 +20,18 @@ edges | OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | OData.cs:80:18:80:28 | access to property Name | provenance | | | OData.cs:79:26:79:52 | (...) ... : BoundEntity | OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | provenance | | | OData.cs:83:39:83:43 | delta : Delta | OData.cs:85:13:85:17 | access to parameter delta : Delta | provenance | | -| OData.cs:85:13:85:17 | access to parameter delta : Delta | OData.cs:85:25:85:32 | [post] access to parameter original : Widget | provenance | MaD:143 | +| OData.cs:85:13:85:17 | access to parameter delta : Delta | OData.cs:85:25:85:32 | [post] access to parameter original : Widget | provenance | MaD:2 | | OData.cs:85:25:85:32 | [post] access to parameter original : Widget | OData.cs:86:18:86:30 | access to property Name | provenance | | | OData.cs:89:45:89:49 | delta : Delta | OData.cs:91:21:91:25 | access to parameter delta : Delta | provenance | | | OData.cs:91:17:91:17 | access to local variable w : Widget | OData.cs:92:18:92:23 | access to property Name | provenance | | -| OData.cs:91:21:91:25 | access to parameter delta : Delta | OData.cs:91:21:91:39 | call to method GetInstance : Widget | provenance | MaD:142 | +| OData.cs:91:21:91:25 | access to parameter delta : Delta | OData.cs:91:21:91:39 | call to method GetInstance : Widget | provenance | MaD:1 | | OData.cs:91:21:91:39 | call to method GetInstance : Widget | OData.cs:91:17:91:17 | access to local variable w : Widget | provenance | | | OData.cs:95:67:95:71 | delta : Delta | OData.cs:97:13:97:17 | access to parameter delta : Delta | provenance | | -| OData.cs:97:13:97:17 | access to parameter delta : Delta | OData.cs:97:25:97:32 | [post] access to parameter original : Widget | provenance | MaD:153 | +| OData.cs:97:13:97:17 | access to parameter delta : Delta | OData.cs:97:25:97:32 | [post] access to parameter original : Widget | provenance | MaD:4 | | OData.cs:97:25:97:32 | [post] access to parameter original : Widget | OData.cs:98:18:98:30 | access to property Name | provenance | | | OData.cs:101:71:101:75 | delta : Delta | OData.cs:103:21:103:25 | access to parameter delta : Delta | provenance | | | OData.cs:103:17:103:17 | access to local variable w : Widget | OData.cs:104:18:104:23 | access to property Name | provenance | | -| OData.cs:103:21:103:25 | access to parameter delta : Delta | OData.cs:103:21:103:37 | call to method GetEntity : Widget | provenance | MaD:152 | +| OData.cs:103:21:103:25 | access to parameter delta : Delta | OData.cs:103:21:103:37 | call to method GetEntity : Widget | provenance | MaD:3 | | OData.cs:103:21:103:37 | call to method GetEntity : Widget | OData.cs:103:17:103:17 | access to local variable w : Widget | provenance | | nodes | OData.cs:46:55:46:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | @@ -66,6 +71,7 @@ nodes | OData.cs:103:21:103:37 | call to method GetEntity : Widget | semmle.label | call to method GetEntity : Widget | | OData.cs:104:18:104:23 | access to property Name | semmle.label | access to property Name | subpaths +testFailures #select | OData.cs:49:18:49:23 | access to local variable entity | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:49:18:49:23 | access to local variable entity | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | | OData.cs:50:18:50:28 | access to property Name | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:50:18:50:28 | access to property Name | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.ql b/csharp/ql/test/library-tests/frameworks/OData/OData.ql index f0636d555b51..df79cc58cdb4 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.ql +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.ql @@ -3,7 +3,8 @@ */ import csharp -import Taint::PathGraph +import utils.test.InlineFlowTest +import PathGraph module TaintConfig implements DataFlow::ConfigSig { predicate isSource(DataFlow::Node n) { @@ -21,9 +22,9 @@ module TaintConfig implements DataFlow::ConfigSig { } } -module Taint = TaintTracking::Global; +import TaintFlowTest -from Taint::PathNode source, Taint::PathNode sink -where Taint::flowPath(source, sink) +from PathNode source, PathNode sink +where flowPath(source, sink) select sink.getNode(), source, sink, "This path depends on an $@.", source.getNode(), "ODataParameters value" From 5b2568d4ea3c10aac18258378fb46658ecae3c16 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 27 Aug 2026 10:23:04 +0200 Subject: [PATCH 161/181] C#: Use unique types pr test case (otherwise they will interfere with each other in relation to identifying which members will be tainted). --- .../library-tests/frameworks/OData/OData.cs | 37 +++-- .../frameworks/OData/OData.expected | 156 +++++++++--------- 2 files changed, 100 insertions(+), 93 deletions(-) diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.cs b/csharp/ql/test/library-tests/frameworks/OData/OData.cs index 91d0440c3288..8e63a2dec7d4 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.cs +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.cs @@ -8,7 +8,7 @@ public class EntityMetadata public string Owner { get; set; } } - public class BoundEntity + public class BoundEntity1 { public string Name { get; set; } @@ -19,6 +19,11 @@ public class BoundEntity public List Revisions { get; set; } } + public class BoundEntity2 + { + public string Name { get; set; } + } + public class RelatedItem { public string Label { get; set; } @@ -45,14 +50,14 @@ void Sink(object o) { } void CastFromDictionary(ODataActionParameters parameters) { - var entity = (BoundEntity)parameters["Entity"]; - Sink(entity); // $ hasTaintFlow=line:46 - Sink(entity.Name); // $ hasTaintFlow=line:46 - Sink(entity.Content); // $ hasTaintFlow=line:46 - Sink(entity.Metadata.Owner); // $ hasTaintFlow=line:46 + var entity = (BoundEntity1)parameters["Entity"]; + Sink(entity); // $ hasTaintFlow=line:51 + Sink(entity.Name); // $ hasTaintFlow=line:51 + Sink(entity.Content); // $ hasTaintFlow=line:51 + Sink(entity.Metadata.Owner); // $ hasTaintFlow=line:51 foreach (var m in entity.Revisions) { - Sink(m.Owner); // $ hasTaintFlow=line:46 + Sink(m.Owner); // $ hasTaintFlow=line:51 } } @@ -62,46 +67,46 @@ void IsAsFromDictionary(ODataActionParameters parameters) { foreach (var item in items1) { - Sink(item.Label); // $ hasTaintFlow=line:59 + Sink(item.Label); // $ hasTaintFlow=line:64 } } var items2 = parameters["Items"] as IEnumerable; foreach (var item in items2) { - Sink(item.Category); // $ hasTaintFlow=line:59 + Sink(item.Category); // $ hasTaintFlow=line:64 } } void UpcastThenIndex(ODataActionParameters parameters) { - IDictionary dict = parameters; - var entity = (BoundEntity)dict["Entity"]; - Sink(entity.Name); // $ hasTaintFlow=line:76 + var dict = (IDictionary)parameters; + var entity = (BoundEntity2)dict["Entity"]; + Sink(entity.Name); // $ hasTaintFlow=line:81 } void DeltaPatch(Delta delta, Widget original) { delta.Patch(original); - Sink(original.Name); // $ hasTaintFlow=line:83 + Sink(original.Name); // $ hasTaintFlow=line:88 } void DeltaGetInstance(Delta delta) { var w = delta.GetInstance(); - Sink(w.Name); // $ hasTaintFlow=line:89 + Sink(w.Name); // $ hasTaintFlow=line:94 } void LegacyDeltaPatch(System.Web.Http.OData.Delta delta, Widget original) { delta.Patch(original); - Sink(original.Name); // $ hasTaintFlow=line:95 + Sink(original.Name); // $ hasTaintFlow=line:100 } void LegacyDeltaGetEntity(System.Web.Http.OData.Delta delta) { var w = delta.GetEntity(); - Sink(w.Name); // $ hasTaintFlow=line:101 + Sink(w.Name); // $ hasTaintFlow=line:106 } void Untainted() diff --git a/csharp/ql/test/library-tests/frameworks/OData/OData.expected b/csharp/ql/test/library-tests/frameworks/OData/OData.expected index 86f12b08f3c2..1c69969e8756 100644 --- a/csharp/ql/test/library-tests/frameworks/OData/OData.expected +++ b/csharp/ql/test/library-tests/frameworks/OData/OData.expected @@ -4,84 +4,86 @@ models | 3 | Summary: System.Web.Http.OData; Delta; true; GetEntity; (); ; Argument[this]; ReturnValue; taint; manual | | 4 | Summary: System.Web.Http.OData; Delta; true; Patch; (TEntityType); ; Argument[this]; Argument[0]; taint; manual | edges -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:48:26:48:58 | (...) ... : BoundEntity | provenance | | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:49:18:49:23 | access to local variable entity | provenance | | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:50:18:50:28 | access to property Name | provenance | | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:51:18:51:31 | access to property Content | provenance | | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:52:18:52:38 | access to property Owner | provenance | | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | OData.cs:55:22:55:28 | access to property Owner | provenance | | -| OData.cs:48:26:48:58 | (...) ... : BoundEntity | OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | provenance | | -| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | provenance | | -| OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:69:26:69:72 | ... as ... : IEnumerable | provenance | | -| OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | OData.cs:72:22:72:34 | access to property Category | provenance | | -| OData.cs:69:26:69:72 | ... as ... : IEnumerable | OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | provenance | | -| OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | provenance | | -| OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | OData.cs:79:26:79:52 | (...) ... : BoundEntity | provenance | | -| OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | OData.cs:80:18:80:28 | access to property Name | provenance | | -| OData.cs:79:26:79:52 | (...) ... : BoundEntity | OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | provenance | | -| OData.cs:83:39:83:43 | delta : Delta | OData.cs:85:13:85:17 | access to parameter delta : Delta | provenance | | -| OData.cs:85:13:85:17 | access to parameter delta : Delta | OData.cs:85:25:85:32 | [post] access to parameter original : Widget | provenance | MaD:2 | -| OData.cs:85:25:85:32 | [post] access to parameter original : Widget | OData.cs:86:18:86:30 | access to property Name | provenance | | -| OData.cs:89:45:89:49 | delta : Delta | OData.cs:91:21:91:25 | access to parameter delta : Delta | provenance | | -| OData.cs:91:17:91:17 | access to local variable w : Widget | OData.cs:92:18:92:23 | access to property Name | provenance | | -| OData.cs:91:21:91:25 | access to parameter delta : Delta | OData.cs:91:21:91:39 | call to method GetInstance : Widget | provenance | MaD:1 | -| OData.cs:91:21:91:39 | call to method GetInstance : Widget | OData.cs:91:17:91:17 | access to local variable w : Widget | provenance | | -| OData.cs:95:67:95:71 | delta : Delta | OData.cs:97:13:97:17 | access to parameter delta : Delta | provenance | | -| OData.cs:97:13:97:17 | access to parameter delta : Delta | OData.cs:97:25:97:32 | [post] access to parameter original : Widget | provenance | MaD:4 | -| OData.cs:97:25:97:32 | [post] access to parameter original : Widget | OData.cs:98:18:98:30 | access to property Name | provenance | | -| OData.cs:101:71:101:75 | delta : Delta | OData.cs:103:21:103:25 | access to parameter delta : Delta | provenance | | -| OData.cs:103:17:103:17 | access to local variable w : Widget | OData.cs:104:18:104:23 | access to property Name | provenance | | -| OData.cs:103:21:103:25 | access to parameter delta : Delta | OData.cs:103:21:103:37 | call to method GetEntity : Widget | provenance | MaD:3 | -| OData.cs:103:21:103:37 | call to method GetEntity : Widget | OData.cs:103:17:103:17 | access to local variable w : Widget | provenance | | +| OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:53:26:53:59 | (...) ... : BoundEntity1 | provenance | | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | OData.cs:54:18:54:23 | access to local variable entity | provenance | | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | OData.cs:55:18:55:28 | access to property Name | provenance | | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | OData.cs:56:18:56:31 | access to property Content | provenance | | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | OData.cs:57:18:57:38 | access to property Owner | provenance | | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | OData.cs:60:22:60:28 | access to property Owner | provenance | | +| OData.cs:53:26:53:59 | (...) ... : BoundEntity1 | OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | provenance | | +| OData.cs:64:55:64:64 | parameters : ODataActionParameters | OData.cs:70:26:70:35 | access to property Label | provenance | | +| OData.cs:64:55:64:64 | parameters : ODataActionParameters | OData.cs:74:26:74:72 | ... as ... : IEnumerable | provenance | | +| OData.cs:74:17:74:22 | access to local variable items2 : IEnumerable | OData.cs:77:22:77:34 | access to property Category | provenance | | +| OData.cs:74:26:74:72 | ... as ... : IEnumerable | OData.cs:74:17:74:22 | access to local variable items2 : IEnumerable | provenance | | +| OData.cs:81:52:81:61 | parameters : ODataActionParameters | OData.cs:83:24:83:62 | (...) ... : ODataActionParameters | provenance | | +| OData.cs:83:17:83:20 | access to local variable dict : ODataActionParameters | OData.cs:84:26:84:53 | (...) ... : BoundEntity2 | provenance | | +| OData.cs:83:24:83:62 | (...) ... : ODataActionParameters | OData.cs:83:17:83:20 | access to local variable dict : ODataActionParameters | provenance | | +| OData.cs:84:17:84:22 | access to local variable entity : BoundEntity2 | OData.cs:85:18:85:28 | access to property Name | provenance | | +| OData.cs:84:26:84:53 | (...) ... : BoundEntity2 | OData.cs:84:17:84:22 | access to local variable entity : BoundEntity2 | provenance | | +| OData.cs:88:39:88:43 | delta : Delta | OData.cs:90:13:90:17 | access to parameter delta : Delta | provenance | | +| OData.cs:90:13:90:17 | access to parameter delta : Delta | OData.cs:90:25:90:32 | [post] access to parameter original : Widget | provenance | MaD:2 | +| OData.cs:90:25:90:32 | [post] access to parameter original : Widget | OData.cs:91:18:91:30 | access to property Name | provenance | | +| OData.cs:94:45:94:49 | delta : Delta | OData.cs:96:21:96:25 | access to parameter delta : Delta | provenance | | +| OData.cs:96:17:96:17 | access to local variable w : Widget | OData.cs:97:18:97:23 | access to property Name | provenance | | +| OData.cs:96:21:96:25 | access to parameter delta : Delta | OData.cs:96:21:96:39 | call to method GetInstance : Widget | provenance | MaD:1 | +| OData.cs:96:21:96:39 | call to method GetInstance : Widget | OData.cs:96:17:96:17 | access to local variable w : Widget | provenance | | +| OData.cs:100:67:100:71 | delta : Delta | OData.cs:102:13:102:17 | access to parameter delta : Delta | provenance | | +| OData.cs:102:13:102:17 | access to parameter delta : Delta | OData.cs:102:25:102:32 | [post] access to parameter original : Widget | provenance | MaD:4 | +| OData.cs:102:25:102:32 | [post] access to parameter original : Widget | OData.cs:103:18:103:30 | access to property Name | provenance | | +| OData.cs:106:71:106:75 | delta : Delta | OData.cs:108:21:108:25 | access to parameter delta : Delta | provenance | | +| OData.cs:108:17:108:17 | access to local variable w : Widget | OData.cs:109:18:109:23 | access to property Name | provenance | | +| OData.cs:108:21:108:25 | access to parameter delta : Delta | OData.cs:108:21:108:37 | call to method GetEntity : Widget | provenance | MaD:3 | +| OData.cs:108:21:108:37 | call to method GetEntity : Widget | OData.cs:108:17:108:17 | access to local variable w : Widget | provenance | | nodes -| OData.cs:46:55:46:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | -| OData.cs:48:17:48:22 | access to local variable entity : BoundEntity | semmle.label | access to local variable entity : BoundEntity | -| OData.cs:48:26:48:58 | (...) ... : BoundEntity | semmle.label | (...) ... : BoundEntity | -| OData.cs:49:18:49:23 | access to local variable entity | semmle.label | access to local variable entity | -| OData.cs:50:18:50:28 | access to property Name | semmle.label | access to property Name | -| OData.cs:51:18:51:31 | access to property Content | semmle.label | access to property Content | -| OData.cs:52:18:52:38 | access to property Owner | semmle.label | access to property Owner | -| OData.cs:55:22:55:28 | access to property Owner | semmle.label | access to property Owner | -| OData.cs:59:55:59:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | -| OData.cs:65:26:65:35 | access to property Label | semmle.label | access to property Label | -| OData.cs:69:17:69:22 | access to local variable items2 : IEnumerable | semmle.label | access to local variable items2 : IEnumerable | -| OData.cs:69:26:69:72 | ... as ... : IEnumerable | semmle.label | ... as ... : IEnumerable | -| OData.cs:72:22:72:34 | access to property Category | semmle.label | access to property Category | -| OData.cs:76:52:76:61 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | -| OData.cs:78:41:78:44 | access to local variable dict : ODataActionParameters | semmle.label | access to local variable dict : ODataActionParameters | -| OData.cs:79:17:79:22 | access to local variable entity : BoundEntity | semmle.label | access to local variable entity : BoundEntity | -| OData.cs:79:26:79:52 | (...) ... : BoundEntity | semmle.label | (...) ... : BoundEntity | -| OData.cs:80:18:80:28 | access to property Name | semmle.label | access to property Name | -| OData.cs:83:39:83:43 | delta : Delta | semmle.label | delta : Delta | -| OData.cs:85:13:85:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | -| OData.cs:85:25:85:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | -| OData.cs:86:18:86:30 | access to property Name | semmle.label | access to property Name | -| OData.cs:89:45:89:49 | delta : Delta | semmle.label | delta : Delta | -| OData.cs:91:17:91:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | -| OData.cs:91:21:91:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | -| OData.cs:91:21:91:39 | call to method GetInstance : Widget | semmle.label | call to method GetInstance : Widget | -| OData.cs:92:18:92:23 | access to property Name | semmle.label | access to property Name | -| OData.cs:95:67:95:71 | delta : Delta | semmle.label | delta : Delta | -| OData.cs:97:13:97:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | -| OData.cs:97:25:97:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | -| OData.cs:98:18:98:30 | access to property Name | semmle.label | access to property Name | -| OData.cs:101:71:101:75 | delta : Delta | semmle.label | delta : Delta | -| OData.cs:103:17:103:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | -| OData.cs:103:21:103:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | -| OData.cs:103:21:103:37 | call to method GetEntity : Widget | semmle.label | call to method GetEntity : Widget | -| OData.cs:104:18:104:23 | access to property Name | semmle.label | access to property Name | +| OData.cs:51:55:51:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:53:17:53:22 | access to local variable entity : BoundEntity1 | semmle.label | access to local variable entity : BoundEntity1 | +| OData.cs:53:26:53:59 | (...) ... : BoundEntity1 | semmle.label | (...) ... : BoundEntity1 | +| OData.cs:54:18:54:23 | access to local variable entity | semmle.label | access to local variable entity | +| OData.cs:55:18:55:28 | access to property Name | semmle.label | access to property Name | +| OData.cs:56:18:56:31 | access to property Content | semmle.label | access to property Content | +| OData.cs:57:18:57:38 | access to property Owner | semmle.label | access to property Owner | +| OData.cs:60:22:60:28 | access to property Owner | semmle.label | access to property Owner | +| OData.cs:64:55:64:64 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:70:26:70:35 | access to property Label | semmle.label | access to property Label | +| OData.cs:74:17:74:22 | access to local variable items2 : IEnumerable | semmle.label | access to local variable items2 : IEnumerable | +| OData.cs:74:26:74:72 | ... as ... : IEnumerable | semmle.label | ... as ... : IEnumerable | +| OData.cs:77:22:77:34 | access to property Category | semmle.label | access to property Category | +| OData.cs:81:52:81:61 | parameters : ODataActionParameters | semmle.label | parameters : ODataActionParameters | +| OData.cs:83:17:83:20 | access to local variable dict : ODataActionParameters | semmle.label | access to local variable dict : ODataActionParameters | +| OData.cs:83:24:83:62 | (...) ... : ODataActionParameters | semmle.label | (...) ... : ODataActionParameters | +| OData.cs:84:17:84:22 | access to local variable entity : BoundEntity2 | semmle.label | access to local variable entity : BoundEntity2 | +| OData.cs:84:26:84:53 | (...) ... : BoundEntity2 | semmle.label | (...) ... : BoundEntity2 | +| OData.cs:85:18:85:28 | access to property Name | semmle.label | access to property Name | +| OData.cs:88:39:88:43 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:90:13:90:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:90:25:90:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | +| OData.cs:91:18:91:30 | access to property Name | semmle.label | access to property Name | +| OData.cs:94:45:94:49 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:96:17:96:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | +| OData.cs:96:21:96:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:96:21:96:39 | call to method GetInstance : Widget | semmle.label | call to method GetInstance : Widget | +| OData.cs:97:18:97:23 | access to property Name | semmle.label | access to property Name | +| OData.cs:100:67:100:71 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:102:13:102:17 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:102:25:102:32 | [post] access to parameter original : Widget | semmle.label | [post] access to parameter original : Widget | +| OData.cs:103:18:103:30 | access to property Name | semmle.label | access to property Name | +| OData.cs:106:71:106:75 | delta : Delta | semmle.label | delta : Delta | +| OData.cs:108:17:108:17 | access to local variable w : Widget | semmle.label | access to local variable w : Widget | +| OData.cs:108:21:108:25 | access to parameter delta : Delta | semmle.label | access to parameter delta : Delta | +| OData.cs:108:21:108:37 | call to method GetEntity : Widget | semmle.label | call to method GetEntity : Widget | +| OData.cs:109:18:109:23 | access to property Name | semmle.label | access to property Name | subpaths testFailures #select -| OData.cs:49:18:49:23 | access to local variable entity | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:49:18:49:23 | access to local variable entity | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | -| OData.cs:50:18:50:28 | access to property Name | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:50:18:50:28 | access to property Name | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | -| OData.cs:51:18:51:31 | access to property Content | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:51:18:51:31 | access to property Content | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | -| OData.cs:52:18:52:38 | access to property Owner | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:52:18:52:38 | access to property Owner | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | -| OData.cs:55:22:55:28 | access to property Owner | OData.cs:46:55:46:64 | parameters : ODataActionParameters | OData.cs:55:22:55:28 | access to property Owner | This path depends on an $@. | OData.cs:46:55:46:64 | parameters | ODataParameters value | -| OData.cs:65:26:65:35 | access to property Label | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:65:26:65:35 | access to property Label | This path depends on an $@. | OData.cs:59:55:59:64 | parameters | ODataParameters value | -| OData.cs:72:22:72:34 | access to property Category | OData.cs:59:55:59:64 | parameters : ODataActionParameters | OData.cs:72:22:72:34 | access to property Category | This path depends on an $@. | OData.cs:59:55:59:64 | parameters | ODataParameters value | -| OData.cs:80:18:80:28 | access to property Name | OData.cs:76:52:76:61 | parameters : ODataActionParameters | OData.cs:80:18:80:28 | access to property Name | This path depends on an $@. | OData.cs:76:52:76:61 | parameters | ODataParameters value | -| OData.cs:86:18:86:30 | access to property Name | OData.cs:83:39:83:43 | delta : Delta | OData.cs:86:18:86:30 | access to property Name | This path depends on an $@. | OData.cs:83:39:83:43 | delta | ODataParameters value | -| OData.cs:92:18:92:23 | access to property Name | OData.cs:89:45:89:49 | delta : Delta | OData.cs:92:18:92:23 | access to property Name | This path depends on an $@. | OData.cs:89:45:89:49 | delta | ODataParameters value | -| OData.cs:98:18:98:30 | access to property Name | OData.cs:95:67:95:71 | delta : Delta | OData.cs:98:18:98:30 | access to property Name | This path depends on an $@. | OData.cs:95:67:95:71 | delta | ODataParameters value | -| OData.cs:104:18:104:23 | access to property Name | OData.cs:101:71:101:75 | delta : Delta | OData.cs:104:18:104:23 | access to property Name | This path depends on an $@. | OData.cs:101:71:101:75 | delta | ODataParameters value | +| OData.cs:54:18:54:23 | access to local variable entity | OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:54:18:54:23 | access to local variable entity | This path depends on an $@. | OData.cs:51:55:51:64 | parameters | ODataParameters value | +| OData.cs:55:18:55:28 | access to property Name | OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:55:18:55:28 | access to property Name | This path depends on an $@. | OData.cs:51:55:51:64 | parameters | ODataParameters value | +| OData.cs:56:18:56:31 | access to property Content | OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:56:18:56:31 | access to property Content | This path depends on an $@. | OData.cs:51:55:51:64 | parameters | ODataParameters value | +| OData.cs:57:18:57:38 | access to property Owner | OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:57:18:57:38 | access to property Owner | This path depends on an $@. | OData.cs:51:55:51:64 | parameters | ODataParameters value | +| OData.cs:60:22:60:28 | access to property Owner | OData.cs:51:55:51:64 | parameters : ODataActionParameters | OData.cs:60:22:60:28 | access to property Owner | This path depends on an $@. | OData.cs:51:55:51:64 | parameters | ODataParameters value | +| OData.cs:70:26:70:35 | access to property Label | OData.cs:64:55:64:64 | parameters : ODataActionParameters | OData.cs:70:26:70:35 | access to property Label | This path depends on an $@. | OData.cs:64:55:64:64 | parameters | ODataParameters value | +| OData.cs:77:22:77:34 | access to property Category | OData.cs:64:55:64:64 | parameters : ODataActionParameters | OData.cs:77:22:77:34 | access to property Category | This path depends on an $@. | OData.cs:64:55:64:64 | parameters | ODataParameters value | +| OData.cs:85:18:85:28 | access to property Name | OData.cs:81:52:81:61 | parameters : ODataActionParameters | OData.cs:85:18:85:28 | access to property Name | This path depends on an $@. | OData.cs:81:52:81:61 | parameters | ODataParameters value | +| OData.cs:91:18:91:30 | access to property Name | OData.cs:88:39:88:43 | delta : Delta | OData.cs:91:18:91:30 | access to property Name | This path depends on an $@. | OData.cs:88:39:88:43 | delta | ODataParameters value | +| OData.cs:97:18:97:23 | access to property Name | OData.cs:94:45:94:49 | delta : Delta | OData.cs:97:18:97:23 | access to property Name | This path depends on an $@. | OData.cs:94:45:94:49 | delta | ODataParameters value | +| OData.cs:103:18:103:30 | access to property Name | OData.cs:100:67:100:71 | delta : Delta | OData.cs:103:18:103:30 | access to property Name | This path depends on an $@. | OData.cs:100:67:100:71 | delta | ODataParameters value | +| OData.cs:109:18:109:23 | access to property Name | OData.cs:106:71:106:75 | delta : Delta | OData.cs:109:18:109:23 | access to property Name | This path depends on an $@. | OData.cs:106:71:106:75 | delta | ODataParameters value | From 8519b913eed24e2022a3f79407320f60c61e00af Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 27 Aug 2026 11:25:03 +0200 Subject: [PATCH 162/181] C#: Remove recursion. --- csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll index 16422fda1d8c..bc0cbb431e3f 100644 --- a/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll +++ b/csharp/ql/lib/semmle/code/csharp/frameworks/OData.qll @@ -36,9 +36,9 @@ class ODataActionParametersClass extends Class { * -- may hold the value of) an `ODataActionParameters` dictionary. */ private predicate isODataActionParametersValue(Expr e) { - e.getType() instanceof ODataActionParametersClass - or - DataFlow::localExprFlow(any(Expr e0 | isODataActionParametersValue(e0)), e) + exists(ParameterAccess e0 | e0.getType() instanceof ODataActionParametersClass | + e0 = e or DataFlow::localExprFlow(e0, e) + ) } /** From caac5d81219efb6dea33754618aead7c7edd5fdb Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Thu, 27 Aug 2026 14:31:57 +0200 Subject: [PATCH 163/181] Widen escape round-trip test to all printable ASCII neighbours The test claimed exhaustive coverage but checked seven suffix characters and no prefix at all. Cover every printable ASCII neighbour on both sides of each escape shape, rendering `"` and `\` as Rust would. 2280 cases, 24ms. Also state the NUL case as the single literal `"\01"`, since the `+` notation read as concatenation of two separate literals. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- .../semmle/python/parser/tsg_parser.py | 3 +- python/extractor/tests/test_tsg_parser.py | 46 +++++++++++-------- 2 files changed, 29 insertions(+), 20 deletions(-) diff --git a/python/extractor/semmle/python/parser/tsg_parser.py b/python/extractor/semmle/python/parser/tsg_parser.py index 2ce1ec0cd18b..83dc853b525e 100644 --- a/python/extractor/semmle/python/parser/tsg_parser.py +++ b/python/extractor/semmle/python/parser/tsg_parser.py @@ -179,7 +179,8 @@ def read_tsg_python_output(path, logger): # variation selector, U+200D zero width joiner and combining accents -- are rendered as `\u{...}`, # a syntax Python does not know at all; # - NUL is rendered as `\0`, which Python reads as the start of an *octal* escape, silently -# swallowing up to two more digits (`"\0" + "1"` would decode to `\x01`). +# swallowing up to two more digits (NUL followed by `1` is emitted as `"\01"`, which decodes +# to `\x01`). # Everything else Rust emits (`\t`, `\r`, `\n`, `\\`, `\"`, and unescaped characters) is read back # identically by `literal_eval`, as verified exhaustively over every Unicode scalar value. _RUST_ESCAPE = re.compile(r"\\(?:u\{([0-9a-fA-F]{1,6})\}|.)", re.DOTALL) diff --git a/python/extractor/tests/test_tsg_parser.py b/python/extractor/tests/test_tsg_parser.py index 40249fb1eb4c..b4df0007e905 100644 --- a/python/extractor/tests/test_tsg_parser.py +++ b/python/extractor/tests/test_tsg_parser.py @@ -37,26 +37,34 @@ def test_nul_is_not_left_as_an_octal_escape(self): self.assertEqual(rust_to_python_escapes(r'"\01"'), r'"\x001"') def test_every_escape_shape_round_trips(self): - # Rust's `Debug for str` only ever emits these shapes. Checked exhaustively against every - # Unicode scalar value, each also paired with every printable ASCII neighbour. - for rendered, expected in [ - (r'"\0"', "\x00"), - (r'"\t"', "\t"), - (r'"\n"', "\n"), - (r'"\r"', "\r"), - (r'"\\"', "\\"), - (r'"\""', '"'), - (r'"\u{1}"', "\u0001"), - (r'"\u{1f}"', "\u001f"), - (r'"\u{300}"', "\u0300"), - (r'"\u{fe0f}"', "\ufe0f"), - (r'"\u{e0100}"', "\U000e0100"), - (r'"\u{10fffe}"', "\U0010fffe"), + # Rust's `Debug for str` only ever emits these escape shapes. Check that each round-trips + # with every printable ASCII neighbour before and after it. + for escape_shape, expected in [ + (r'\0', "\x00"), + (r'\t', "\t"), + (r'\n', "\n"), + (r'\r', "\r"), + (r'\\', "\\"), + (r'\"', '"'), + (r'\u{1}', "\u0001"), + (r'\u{1f}', "\u001f"), + (r'\u{300}', "\u0300"), + (r'\u{fe0f}', "\ufe0f"), + (r'\u{e0100}', "\U000e0100"), + (r'\u{10fffe}', "\U0010fffe"), ]: - for neighbour in ["", "0", "7", "9", "f", "u", "{"]: - with self.subTest(rendered=rendered, neighbour=neighbour): - text = rendered[:-1] + neighbour + '"' - self.assertEqual(literal_eval(rust_to_python_escapes(text)), expected + neighbour) + for neighbour in map(chr, range(0x20, 0x7F)): + rendered_neighbour = {"\\": r"\\", '"': r'\"'}.get(neighbour, neighbour) + for position, text, expected_value in [ + ("before", '"' + rendered_neighbour + escape_shape + '"', neighbour + expected), + ("after", '"' + escape_shape + rendered_neighbour + '"', expected + neighbour), + ]: + with self.subTest( + escape_shape=escape_shape, + neighbour=neighbour, + position=position, + ): + self.assertEqual(literal_eval(rust_to_python_escapes(text)), expected_value) def test_evaluate_string_on_reported_value(self): # The exact value from https://github.com/github/codeql/issues/22435 that used to raise From 3d4cd3773b2ea2c717572bbd11f1c28bdd94d8ff Mon Sep 17 00:00:00 2001 From: Geoffrey White <40627776+geoffw0@users.noreply.github.com> Date: Wed, 26 Aug 2026 22:35:34 +0100 Subject: [PATCH 164/181] Rust: Accept changes to .expected files. --- .../rust-code-scanning.qls.expected | 1 + .../rust-security-and-quality.qls.expected | 1 + .../rust-security-extended.qls.expected | 1 + .../CWE-078/CommandInjection.expected | 60 +++++++++---------- 4 files changed, 33 insertions(+), 30 deletions(-) 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 9b10079767ba..d7611c2993b8 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 @@ -10,6 +10,7 @@ ql/rust/ql/src/queries/diagnostics/UnextractedElements.ql ql/rust/ql/src/queries/diagnostics/UnresolvedMacroCalls.ql ql/rust/ql/src/queries/security/CWE-020/RegexInjection.ql ql/rust/ql/src/queries/security/CWE-022/TaintedPath.ql +ql/rust/ql/src/queries/security/CWE-078/CommandInjection.ql ql/rust/ql/src/queries/security/CWE-079/XSS.ql ql/rust/ql/src/queries/security/CWE-089/SqlInjection.ql ql/rust/ql/src/queries/security/CWE-295/DisabledCertificateCheck.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 4059cb40ab61..6c8d1fe5897f 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 @@ -10,6 +10,7 @@ ql/rust/ql/src/queries/diagnostics/UnextractedElements.ql ql/rust/ql/src/queries/diagnostics/UnresolvedMacroCalls.ql ql/rust/ql/src/queries/security/CWE-020/RegexInjection.ql ql/rust/ql/src/queries/security/CWE-022/TaintedPath.ql +ql/rust/ql/src/queries/security/CWE-078/CommandInjection.ql ql/rust/ql/src/queries/security/CWE-079/XSS.ql ql/rust/ql/src/queries/security/CWE-089/SqlInjection.ql ql/rust/ql/src/queries/security/CWE-117/LogInjection.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 2d660d4f3a3e..f41a12fae037 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 @@ -10,6 +10,7 @@ ql/rust/ql/src/queries/diagnostics/UnextractedElements.ql ql/rust/ql/src/queries/diagnostics/UnresolvedMacroCalls.ql ql/rust/ql/src/queries/security/CWE-020/RegexInjection.ql ql/rust/ql/src/queries/security/CWE-022/TaintedPath.ql +ql/rust/ql/src/queries/security/CWE-078/CommandInjection.ql ql/rust/ql/src/queries/security/CWE-079/XSS.ql ql/rust/ql/src/queries/security/CWE-089/SqlInjection.ql ql/rust/ql/src/queries/security/CWE-117/LogInjection.ql diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index be6128cef5d0..3b9da31661a4 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -17,45 +17,45 @@ edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | | main.rs:4:22:4:37 | ...::args(...) | main.rs:4:22:4:37 | ...::args(...) [element] | provenance | Src:MaD:7 | -| main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:8 | -| main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:15 | +| main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:9 | | main.rs:4:22:4:74 | ... .unwrap_or(...) | main.rs:4:9:4:18 | arg_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:34:14:34:26 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:47:23:47:35 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:52:40:52:69 | MacroExpr | provenance | | | main.rs:5:25:5:69 | ...::get(...) | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:11 | -| main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:13 | -| main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:12 | +| main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:10 | +| main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:12 | +| main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:11 | | main.rs:5:25:8:38 | ... .unwrap_or(...) | main.rs:5:9:5:21 | remote_string | provenance | | -| main.rs:27:18:27:27 | arg_string | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:27:18:27:27 | arg_string | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | main.rs:27:18:27:36 | arg_string.as_str() | provenance | Sink:MaD:3 | -| main.rs:34:14:34:26 | remote_string | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:34:14:34:26 | remote_string | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:34:14:34:35 | remote_string.as_str() [&ref] | main.rs:34:14:34:35 | remote_string.as_str() | provenance | Sink:MaD:1 | -| main.rs:40:14:40:23 | arg_string | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:40:14:40:23 | arg_string | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:40:14:40:32 | arg_string.as_str() [&ref] | main.rs:40:14:40:32 | arg_string.as_str() | provenance | Sink:MaD:1 | | main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:15:47:45 | &... | provenance | Sink:MaD:2 Sink:MaD:2 | | main.rs:47:15:47:45 | &... [&ref, element, &ref] | main.rs:47:15:47:45 | &... | provenance | Sink:MaD:2 Sink:MaD:2 Sink:MaD:2 | | main.rs:47:16:47:45 | [...] [element, &ref] | main.rs:47:15:47:45 | &... [&ref, element, &ref] | provenance | | -| main.rs:47:23:47:35 | remote_string | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:47:23:47:35 | remote_string | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:47:23:47:44 | remote_string.as_str() [&ref] | main.rs:47:16:47:45 | [...] [element, &ref] | provenance | | | main.rs:52:9:52:28 | concatenated_command | main.rs:53:18:53:37 | concatenated_command | provenance | | | main.rs:52:40:52:69 | ...::format(...) | main.rs:52:40:52:69 | { ... } | provenance | | | main.rs:52:40:52:69 | ...::must_use(...) | main.rs:52:9:52:28 | concatenated_command | provenance | | -| main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:14 | -| main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:15 | -| main.rs:53:18:53:37 | concatenated_command | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | provenance | MaD:9 | +| main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:13 | +| main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:14 | +| main.rs:53:18:53:37 | concatenated_command | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | provenance | MaD:8 | | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | main.rs:53:18:53:46 | concatenated_command.as_str() | provenance | Sink:MaD:3 | | main.rs:59:9:59:21 | remote_string | main.rs:65:48:65:60 | remote_string | provenance | | | main.rs:59:9:59:21 | remote_string | main.rs:73:14:73:26 | remote_string | provenance | | | main.rs:59:25:59:69 | ...::get(...) | main.rs:59:25:59:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:11 | -| main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:13 | -| main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:12 | +| main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:10 | +| main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:12 | +| main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:11 | | main.rs:59:25:62:38 | ... .unwrap_or(...) | main.rs:59:9:59:21 | remote_string | provenance | | -| main.rs:65:48:65:60 | remote_string | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:65:48:65:60 | remote_string | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:48:65:69 | remote_string.as_str() | provenance | Sink:MaD:5 | -| main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:73:14:73:26 | remote_string | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:73:14:73:35 | remote_string.as_str() [&ref] | main.rs:73:14:73:35 | remote_string.as_str() | provenance | Sink:MaD:4 | | main.rs:82:27:82:42 | ...: ... [&ref] | main.rs:86:18:86:27 | user_input | provenance | Sink:MaD:1 | | main.rs:95:27:95:40 | ...: ... [&ref] | main.rs:100:22:100:29 | filename | provenance | Sink:MaD:1 | @@ -68,14 +68,14 @@ edges | main.rs:138:9:138:18 | arg_string | main.rs:143:40:143:49 | arg_string | provenance | | | main.rs:138:9:138:18 | arg_string | main.rs:144:31:144:40 | arg_string | provenance | | | main.rs:138:22:138:37 | ...::args(...) | main.rs:138:22:138:37 | ...::args(...) [element] | provenance | Src:MaD:7 | -| main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:8 | -| main.rs:138:22:138:44 | ... .nth(...) [Some] | main.rs:138:22:138:74 | ... .unwrap_or(...) | provenance | MaD:10 | +| main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:15 | +| main.rs:138:22:138:44 | ... .nth(...) [Some] | main.rs:138:22:138:74 | ... .unwrap_or(...) | provenance | MaD:9 | | main.rs:138:22:138:74 | ... .unwrap_or(...) | main.rs:138:9:138:18 | arg_string | provenance | | -| main.rs:142:39:142:48 | arg_string | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:142:39:142:48 | arg_string | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | -| main.rs:143:40:143:49 | arg_string | main.rs:143:40:143:58 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:143:40:143:49 | arg_string | main.rs:143:40:143:58 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:143:40:143:58 | arg_string.as_str() [&ref] | main.rs:95:27:95:40 | ...: ... [&ref] | provenance | | -| main.rs:144:31:144:40 | arg_string | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | provenance | MaD:9 | +| main.rs:144:31:144:40 | arg_string | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:144:31:144:49 | arg_string.as_str() [&ref] | main.rs:107:30:107:42 | ...: ... [&ref] | provenance | | models | 1 | Sink: ::arg; Argument[0]; command-injection | @@ -85,14 +85,14 @@ models | 5 | Sink: ::new; Argument[0]; command-injection | | 6 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 7 | Source: std::env::args; ReturnValue.Element; commandargs | -| 8 | Summary: <_ as core::iter::traits::iterator::Iterator>::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 9 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 10 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 12 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 14 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 15 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 8 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | +| 9 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 10 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 12 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 13 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 14 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | +| 15 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | nodes | main.rs:4:9:4:18 | arg_string | semmle.label | arg_string | | main.rs:4:22:4:37 | ...::args(...) | semmle.label | ...::args(...) | From 4623819f24396eed618750bac4bac1ac81d7e3ba Mon Sep 17 00:00:00 2001 From: AkshayK Date: Thu, 27 Aug 2026 11:42:17 -0400 Subject: [PATCH 165/181] cpp: model libpq query functions as SQL-injection sinks Add the PostgreSQL libpq query-execution functions as sql-injection sinks so cpp/sql-injection flags tainted data reaching their SQL text: - PQexec / PQsendQuery: query at argument 1 - PQexecParams / PQsendQueryParams: command at argument 1 - PQprepare / PQsendPrepare: query at argument 2 The *Prepared forms take a prepared-statement name rather than SQL text and are not modeled. Follows the existing Oracle.oci sink convention. --- .../2026-08-27-libpq-sql-sinks.md | 4 ++ cpp/ql/lib/ext/Postgres.model.yml | 16 ++++++++ .../CWE-089/SqlTainted/SqlTainted.expected | 25 ++++++++++++ .../CWE/CWE-089/SqlTainted/test_libpq.c | 38 +++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md create mode 100644 cpp/ql/lib/ext/Postgres.model.yml create mode 100644 cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c diff --git a/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md b/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md new file mode 100644 index 000000000000..94899fdafafa --- /dev/null +++ b/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* Added the PostgreSQL libpq query-execution functions (`PQexec`, `PQexecParams`, `PQprepare`, and their asynchronous `PQsendQuery`/`PQsendQueryParams`/`PQsendPrepare` counterparts) as `sql-injection` sinks, so the "Uncontrolled data used in SQL query" query flags tainted data reaching their command/query arguments. diff --git a/cpp/ql/lib/ext/Postgres.model.yml b/cpp/ql/lib/ext/Postgres.model.yml new file mode 100644 index 000000000000..958522e09cbe --- /dev/null +++ b/cpp/ql/lib/ext/Postgres.model.yml @@ -0,0 +1,16 @@ +# partial model of the PostgreSQL libpq C API +extensions: + - addsTo: + pack: codeql/cpp-all + extensible: sinkModel + data: # namespace, type, subtypes, name, signature, ext, input, kind, provenance + # Functions that take a raw SQL command string. The `*Params`/`*Prepare` forms still + # interpret their command/query text as SQL, so injection into that text is a sink even + # though the parameter *values* are passed separately. The `*Prepared` forms take a + # prepared-statement name rather than SQL text and are therefore not modeled here. + - ["", "", False, "PQexec", "", "", "Argument[*1]", "sql-injection", "manual"] + - ["", "", False, "PQexecParams", "", "", "Argument[*1]", "sql-injection", "manual"] + - ["", "", False, "PQprepare", "", "", "Argument[*2]", "sql-injection", "manual"] + - ["", "", False, "PQsendQuery", "", "", "Argument[*1]", "sql-injection", "manual"] + - ["", "", False, "PQsendQueryParams", "", "", "Argument[*1]", "sql-injection", "manual"] + - ["", "", False, "PQsendPrepare", "", "", "Argument[*2]", "sql-injection", "manual"] diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected index 2e00cb866749..5dedd13a12bd 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected @@ -6,6 +6,12 @@ | test.c:106:24:106:29 | query1 | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | | test.c:107:28:107:33 | query1 | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | | test.cpp:43:27:43:33 | *access to array | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | This argument to a SQL query function is derived from $@ and then passed to pqxx::work::exec1((unnamed parameter 0)). | test.cpp:39:27:39:30 | **argv | user input (a command-line argument) | +| test_libpq.c:29:16:29:24 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:29:16:29:24 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:30:22:30:30 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:30:22:30:30 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:31:27:31:35 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:31:27:31:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:32:21:32:29 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:32:21:32:29 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:33:27:33:35 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:33:27:33:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:34:31:34:39 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:34:31:34:39 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | edges | test.c:14:27:14:30 | **argv | test.c:15:20:15:26 | *access to array | provenance | | | test.c:15:20:15:26 | *access to array | test.c:21:18:21:23 | *query1 | provenance | TaintFunction | @@ -20,9 +26,21 @@ edges | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | provenance | TaintFunction Sink:MaD:2 | | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | provenance | TaintFunction Sink:MaD:1 | | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | provenance | | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:29:16:29:24 | userInput | provenance | Sink:MaD:3 | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:30:22:30:30 | userInput | provenance | Sink:MaD:4 | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:31:27:31:35 | userInput | provenance | Sink:MaD:5 | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:32:21:32:29 | userInput | provenance | Sink:MaD:7 | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:33:27:33:35 | userInput | provenance | Sink:MaD:8 | +| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:34:31:34:39 | userInput | provenance | Sink:MaD:6 | models | 1 | Sink: ; ; false; OCIStmtPrepare2; ; ; Argument[*3]; sql-injection; manual | | 2 | Sink: ; ; false; OCIStmtPrepare; ; ; Argument[*2]; sql-injection; manual | +| 3 | Sink: ; ; false; PQexec; ; ; Argument[*1]; sql-injection; manual | +| 4 | Sink: ; ; false; PQexecParams; ; ; Argument[*1]; sql-injection; manual | +| 5 | Sink: ; ; false; PQprepare; ; ; Argument[*2]; sql-injection; manual | +| 6 | Sink: ; ; false; PQsendPrepare; ; ; Argument[*2]; sql-injection; manual | +| 7 | Sink: ; ; false; PQsendQuery; ; ; Argument[*1]; sql-injection; manual | +| 8 | Sink: ; ; false; PQsendQueryParams; ; ; Argument[*1]; sql-injection; manual | nodes | test.c:14:27:14:30 | **argv | semmle.label | **argv | | test.c:15:20:15:26 | *access to array | semmle.label | *access to array | @@ -41,4 +59,11 @@ nodes | test.c:107:28:107:33 | query1 | semmle.label | query1 | | test.cpp:39:27:39:30 | **argv | semmle.label | **argv | | test.cpp:43:27:43:33 | *access to array | semmle.label | *access to array | +| test_libpq.c:26:8:26:16 | gets output argument | semmle.label | gets output argument | +| test_libpq.c:29:16:29:24 | userInput | semmle.label | userInput | +| test_libpq.c:30:22:30:30 | userInput | semmle.label | userInput | +| test_libpq.c:31:27:31:35 | userInput | semmle.label | userInput | +| test_libpq.c:32:21:32:29 | userInput | semmle.label | userInput | +| test_libpq.c:33:27:33:35 | userInput | semmle.label | userInput | +| test_libpq.c:34:31:34:39 | userInput | semmle.label | userInput | subpaths diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c new file mode 100644 index 000000000000..4fc26907b136 --- /dev/null +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c @@ -0,0 +1,38 @@ +// Test case for the PostgreSQL libpq SQL-injection sinks modeled in Postgres.model.yml. +// Associated with CWE-089: SQL injection. + +typedef unsigned long size_t; +typedef unsigned int Oid; +typedef struct pg_conn PGconn; +typedef struct pg_result PGresult; + +PGresult *PQexec(PGconn *conn, const char *query); +PGresult *PQexecParams(PGconn *conn, const char *command, int nParams, + const Oid *paramTypes, const char *const *paramValues, + const int *paramLengths, const int *paramFormats, int resultFormat); +PGresult *PQprepare(PGconn *conn, const char *stmtName, const char *query, int nParams, + const Oid *paramTypes); +int PQsendQuery(PGconn *conn, const char *query); +int PQsendQueryParams(PGconn *conn, const char *command, int nParams, const Oid *paramTypes, + const char *const *paramValues, const int *paramLengths, + const int *paramFormats, int resultFormat); +int PQsendPrepare(PGconn *conn, const char *stmtName, const char *query, int nParams, + const Oid *paramTypes); + +char *gets(char *s); + +void libpqTests(PGconn *conn) { + char userInput[1000]; + gets(userInput); // $ Source + + // A user-controlled string is interpreted as SQL. + PQexec(conn, userInput); // $ Alert + PQexecParams(conn, userInput, 0, 0, 0, 0, 0, 0); // $ Alert + PQprepare(conn, "stmt", userInput, 0, 0); // $ Alert + PQsendQuery(conn, userInput); // $ Alert + PQsendQueryParams(conn, userInput, 0, 0, 0, 0, 0, 0); // $ Alert + PQsendPrepare(conn, "stmt", userInput, 0, 0); // $ Alert + + // A constant query is safe. + PQexec(conn, "SELECT 1"); // GOOD +} From 3e6e3be090cadbde0162da510c962c18cf37b3e7 Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 28 Aug 2026 08:34:30 +0200 Subject: [PATCH 166/181] unified: Update qldoc --- unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index e570b2ea4e55..8a62162f5b23 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -325,7 +325,7 @@ private predicate isInheritableMemberNode(NameBindingNode node) { ) } -/** A name-binding node that has members. */ +/** A name-binding node that can have members. */ class NamespaceNode extends NameBindingNode { NamespaceNode() { storeStep(_, _, this) or From 4185f7543b763fcf007f35245023bbd729d10f3b Mon Sep 17 00:00:00 2001 From: Asger F Date: Fri, 28 Aug 2026 09:04:57 +0200 Subject: [PATCH 167/181] unified: Remove superfluous parens --- .../ql/lib/codeql/unified/internal/StaticNameBinding.qll | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll index 8a62162f5b23..989ffc59357d 100644 --- a/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll +++ b/unified/ql/lib/codeql/unified/internal/StaticNameBinding.qll @@ -179,11 +179,9 @@ predicate storeStep(NameBindingNode node1, string name, NameBindingNode node2) { nameDecl.getDeclaration() = member and node1.isIdentifier(nameDecl) and name = nameDecl.getName() and - ( - if isInstanceMember(member) - then node2.isInstanceMemberNamespace(cls) - else node2.isStaticMemberNamespace(cls) - ) + if isInstanceMember(member) + then node2.isInstanceMemberNamespace(cls) + else node2.isStaticMemberNamespace(cls) ) or exists(TopLevel top, Stmt stmt, NameDeclaration nameDecl | From b304770cb1b05964a8e77e84ab54416001a6f437 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 28 Aug 2026 09:30:24 +0200 Subject: [PATCH 168/181] Unified: Implement simple LOC counting --- unified/ql/lib/codeql/files/FileSystem.qll | 20 +++++++++++++ .../ql/src/diagnostic/ExtractorInformation.ql | 28 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/unified/ql/lib/codeql/files/FileSystem.qll b/unified/ql/lib/codeql/files/FileSystem.qll index a50c1cd3432a..897a855612be 100644 --- a/unified/ql/lib/codeql/files/FileSystem.qll +++ b/unified/ql/lib/codeql/files/FileSystem.qll @@ -2,6 +2,7 @@ overlay[local] module; +private import unified private import codeql.Locations private import codeql.util.FileSystem @@ -37,4 +38,23 @@ module Folder = Impl::Folder; class File extends Container, Impl::File { /** Holds if this file was extracted from ordinary source code. */ predicate fromSource() { any() } + + /** + * Gets the number of lines containing code in this file. This value + * is approximate. + */ + overlay[local?] + int getNumberOfLinesOfCode() { + result = + count(int line | + exists(AstNode node, Location loc | + not node instanceof Comment and + not node instanceof TopLevel and + loc = node.getLocation() and + this = loc.getFile() and + line = loc.getStartLine() and + not loc instanceof EmptyLocation + ) + ) + } } diff --git a/unified/ql/src/diagnostic/ExtractorInformation.ql b/unified/ql/src/diagnostic/ExtractorInformation.ql index 37469504b617..6e52b4fa0887 100644 --- a/unified/ql/src/diagnostic/ExtractorInformation.ql +++ b/unified/ql/src/diagnostic/ExtractorInformation.ql @@ -9,9 +9,37 @@ private import unified private import codeql.unified.internal.AnalysisQuality +predicate fileCount(string key, int value) { + key = "Number of files" and + value = strictcount(File f) +} + +predicate fileCountByExtension(string key, int value) { + exists(string extension | + key = "Number of files with extension " + extension and + value = strictcount(File f | f.getExtension() = extension) + ) +} + +predicate numberOfLinesOfCode(string key, int value) { + key = "Number of lines of code" and + value = strictsum(File f | any() | f.getNumberOfLinesOfCode()) +} + +predicate numberOfLinesOfCodeByExtension(string key, int value) { + exists(string extension | + key = "Number of lines of code with extension " + extension and + value = strictsum(File f | f.getExtension() = extension | f.getNumberOfLinesOfCode()) + ) +} + from string key, float value where ( + fileCount(key, value) or + fileCountByExtension(key, value) or + numberOfLinesOfCode(key, value) or + numberOfLinesOfCodeByExtension(key, value) or StaticNameResolutionStatsReport::keyValuePair(key, value) or FilesCoveredByModuleManifestStatsReport::keyValuePair(key, value) ) and From 1649fafe3b65b0fad8dc3691f0ca76eac9123b41 Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 28 Aug 2026 10:38:48 +0200 Subject: [PATCH 169/181] Rust: Use angle brackets for trait item canonical paths Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4e7f3f7f-82b3-403c-93fa-984f56c89a70 --- .../customizing-library-models-for-rust.rst | 6 +- ...-28-angle-bracket-trait-canonical-paths.md | 6 + .../rust/dataflow/internal/DataFlowImpl.qll | 2 +- .../rust/frameworks/asyncstd/io.model.yml | 4 +- .../codeql/rust/frameworks/futures.model.yml | 16 +- .../rust/frameworks/mysql-async.model.yml | 40 ++-- .../codeql/rust/frameworks/mysql.model.yml | 74 +++--- .../rustcrypto/rustcrypto.model.yml | 26 +-- .../lib/codeql/rust/frameworks/sqlx.model.yml | 2 +- .../rust/frameworks/stdlib/alloc.model.yml | 18 +- .../rust/frameworks/stdlib/core.model.yml | 164 +++++++------- .../rust/frameworks/stdlib/io.model.yml | 26 +-- .../codeql/rust/frameworks/tokio/io.model.yml | 68 +++--- .../lib/codeql/rust/frameworks/warp.model.yml | 6 +- .../codeql/rust/internal/PathResolution.qll | 8 +- .../canonical_path/canonical_paths.expected | 6 +- .../dataflow/collections/inline-flow.expected | 4 +- .../dataflow/global/inline-flow.expected | 2 +- .../dataflow/local/inline-flow.expected | 80 +++---- .../dataflow/modeled/inline-flow.expected | 102 ++++----- .../dataflow/models/models.expected | 110 ++++----- .../dataflow/models/models.ext.yml | 4 +- .../sources/database/InlineFlow.expected | 122 +++++----- .../dataflow/sources/env/InlineFlow.expected | 44 ++-- .../dataflow/sources/file/InlineFlow.expected | 152 ++++++------- .../dataflow/sources/net/InlineFlow.expected | 210 +++++++++--------- .../sources/stdin/InlineFlow.expected | 194 ++++++++-------- .../web_frameworks/InlineFlow.expected | 36 +-- .../strings/inline-taint-flow.expected | 30 +-- .../dataflow/taint/inline-taint-flow.expected | 66 +++--- .../security/CWE-022/TaintedPath.expected | 68 +++--- .../security/CWE-079/warp/XSS.expected | 2 +- .../security/CWE-089/SqlInjection.expected | 112 +++++----- .../security/CWE-117/LogInjection.expected | 64 +++--- .../CWE-312/CleartextLogging.expected | 22 +- .../security/CWE-614/InsecureCookie.expected | 84 +++---- .../UncontrolledAllocationSize.expected | 86 +++---- .../HardcodedCryptographicValue.expected | 2 +- .../security/CWE-918/RequestForgery.expected | 2 +- 39 files changed, 1033 insertions(+), 1037 deletions(-) create mode 100644 rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md diff --git a/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst b/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst index 16e0307421b4..45983f4e62c5 100644 --- a/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst +++ b/docs/codeql/codeql-language-guides/customizing-library-models-for-rust.rst @@ -74,7 +74,7 @@ Canonical paths take the following forms: - **Free functions**: ``crate::module::function``, for example ``std::env::var`` or ``std::fs::read_to_string``. - **Inherent methods**: ``::method``, for example ``::open``. - **Trait methods with a concrete type**: ``::method``, for example ``::read_to_end``. -- **Trait methods**: ``Trait::method``, for example ``core::clone::Clone::clone``. This form matches any type that implements the trait and is useful for modeling broadly applicable trait methods. For a type that has a specific model (``::method``), that model will take precedence over the trait model. +- **Trait methods**: ``::method``, for example ``::clone``. This form matches any type that implements the trait and is useful for modeling broadly applicable trait methods. For a type that has a specific model (``::method``), that model will take precedence over the trait model. Examples of custom model definitions ------------------------------------- @@ -270,10 +270,10 @@ We need to add tuples to the ``summaryModel(path, input, output, kind, provenanc pack: codeql/rust-all extensible: summaryModel data: - - ["core::iter::traits::iterator::Iterator::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] -- The first value ``core::iter::traits::iterator::Iterator::map`` is the canonical path. The ``Trait::method`` form matches any type that implements the ``Iterator`` trait. +- The first value ``::map`` is the canonical path. The ``::method`` form matches any type that implements the ``Iterator`` trait. - The second value ``Argument[self].Element`` is the access path to the input — the elements of the iterator (the receiver). - The third value ``Argument[0].Parameter[0]`` is the access path to the output: diff --git a/rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md b/rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md new file mode 100644 index 000000000000..280f78d5555b --- /dev/null +++ b/rust/ql/lib/change-notes/2026-08-28-angle-bracket-trait-canonical-paths.md @@ -0,0 +1,6 @@ +--- +category: minorAnalysis +--- +* Canonical paths for Rust trait items now use the format `::item` instead of + `crate::Trait::item`. Custom data extension models that reference trait items must be + updated to use the new format. diff --git a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll index c038312f84dc..bf6076e09055 100644 --- a/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll +++ b/rust/ql/lib/codeql/rust/dataflow/internal/DataFlowImpl.qll @@ -357,7 +357,7 @@ private module Aliases { * * However, this would require support for [generalized reverse flow][1], which * is not yet implemented, so instead we simulate reverse flow where it would - * have applied via the model for `core::ops::index::IndexMut::index_mut`. + * have applied via the model for `::index_mut`. * * The same is the case for compound assignments like `a[i] += rhs`, which are * treated as `(*a.index_mut(i)).add_assign(rhs)`. diff --git a/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml index 10c5b112a336..dfc63f6f846f 100644 --- a/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/asyncstd/io.model.yml @@ -3,5 +3,5 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: - - ["async_std::io::read::ReadExt::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] - - ["async_std::io::read::ReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read", "Argument[self]", "Argument[0].Reference", "taint", "manual"] + - ["::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/futures.model.yml b/rust/ql/lib/codeql/rust/frameworks/futures.model.yml index ccd7aebb6309..7b1aaab494fd 100644 --- a/rust/ql/lib/codeql/rust/frameworks/futures.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/futures.model.yml @@ -5,11 +5,11 @@ extensions: data: - ["futures_executor::local_pool::block_on", "Argument[0]", "ReturnValue", "value", "manual"] - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["futures_util::io::AsyncReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["futures_util::io::AsyncReadExt::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["futures_util::io::AsyncBufReadExt::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["futures_util::io::AsyncBufReadExt::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - - ["futures_util::io::AsyncBufReadExt::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["futures_util::io::AsyncBufReadExt::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["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", "manual"] - - ["futures_io::if_std::AsyncRead::poll_read", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::lines", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::poll_fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::poll_read", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml b/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml index 9925945ecd69..d0c1a5acf2b3 100644 --- a/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/mysql-async.model.yml @@ -3,28 +3,28 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["mysql_async::queryable::Queryable::query", "Argument[0]", "sql-injection", "manual"] - - ["mysql_async::queryable::Queryable::query_drop", "Argument[0]", "sql-injection", "manual"] - - ["mysql_async::queryable::Queryable::query_first", "Argument[0]", "sql-injection", "manual"] - - ["mysql_async::queryable::Queryable::query_fold", "Argument[0]", "sql-injection", "manual"] - - ["mysql_async::queryable::Queryable::query_stream", "Argument[0]", "sql-injection", "manual"] - - ["mysql_async::queryable::Queryable::query_map", "Argument[0]", "sql-injection", "manual"] + - ["::query", "Argument[0]", "sql-injection", "manual"] + - ["::query_drop", "Argument[0]", "sql-injection", "manual"] + - ["::query_first", "Argument[0]", "sql-injection", "manual"] + - ["::query_fold", "Argument[0]", "sql-injection", "manual"] + - ["::query_stream", "Argument[0]", "sql-injection", "manual"] + - ["::query_map", "Argument[0]", "sql-injection", "manual"] - ["::query_iter", "Argument[0]", "sql-injection", "manual"] - ["::prep", "Argument[0]", "sql-injection", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel data: - - ["mysql_async::queryable::Queryable::query", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql_async::queryable::Queryable::exec", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql_async::queryable::Queryable::query_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["mysql_async::queryable::Queryable::exec_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["mysql_async::queryable::Queryable::query_fold", "Argument[2].Parameter[1]", "database", "manual"] - - ["mysql_async::queryable::Queryable::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] + - ["::query", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["::exec", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["::query_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["::exec_first", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["::query_fold", "Argument[2].Parameter[1]", "database", "manual"] + - ["::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] - ["::query_iter", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - ["::exec_iter", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql_async::queryable::Queryable::query_map", "Argument[1].Parameter[0]", "database", "manual"] - - ["mysql_async::queryable::Queryable::exec_map", "Argument[2].Parameter[0]", "database", "manual"] + - ["::query_map", "Argument[1].Parameter[0]", "database", "manual"] + - ["::exec_map", "Argument[2].Parameter[0]", "database", "manual"] - ["::get", "ReturnValue.Field[core::option::Option::Some(0)]", "database", "manual"] - ["::get_opt", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] - ["::take", "ReturnValue.Field[core::option::Option::Some(0)]", "database", "manual"] @@ -35,9 +35,9 @@ extensions: pack: codeql/rust-all extensible: summaryModel data: - - ["mysql_async::queryable::Queryable::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] - - ["mysql_async::queryable::Queryable::query_fold", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql_async::queryable::Queryable::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] - - ["mysql_async::queryable::Queryable::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql_async::queryable::Queryable::query_map", "Argument[1].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["mysql_async::queryable::Queryable::query_map", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] + - ["::query_fold", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] + - ["::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::query_map", "Argument[1].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::query_map", "Argument[2].ReturnValue", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Element", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml b/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml index b1f43db0db14..819d4c65b8b4 100644 --- a/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/mysql.model.yml @@ -3,52 +3,52 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["mysql::conn::queryable::Queryable::query", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_opt", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_drop", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_first", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_first_opt", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[0]", "sql-injection", "manual"] + - ["::query", "Argument[0]", "sql-injection", "manual"] + - ["::query_opt", "Argument[0]", "sql-injection", "manual"] + - ["::query_drop", "Argument[0]", "sql-injection", "manual"] + - ["::query_first", "Argument[0]", "sql-injection", "manual"] + - ["::query_first_opt", "Argument[0]", "sql-injection", "manual"] + - ["::query_fold", "Argument[0]", "sql-injection", "manual"] + - ["::query_fold_opt", "Argument[0]", "sql-injection", "manual"] - ["::query_iter", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_map", "Argument[0]", "sql-injection", "manual"] - - ["mysql::conn::queryable::Queryable::query_map_opt", "Argument[0]", "sql-injection", "manual"] + - ["::query_map", "Argument[0]", "sql-injection", "manual"] + - ["::query_map_opt", "Argument[0]", "sql-injection", "manual"] - ["::prep", "Argument[0]", "sql-injection", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel data: - - ["mysql::conn::queryable::Queryable::query", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold", "Argument[2].Parameter[1]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[2].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold_opt", "Argument[3].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::query", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["::exec", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] + - ["::query_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::exec_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Element.Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::query_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["::exec_first", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "database", "manual"] + - ["::query_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::exec_first_opt", "ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::query_fold", "Argument[2].Parameter[1]", "database", "manual"] + - ["::exec_fold", "Argument[3].Parameter[1]", "database", "manual"] + - ["::query_fold_opt", "Argument[2].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::exec_fold_opt", "Argument[3].Parameter[1].Field[core::result::Result::Ok(0)]", "database", "manual"] - ["::query_iter", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - ["::exec_iter", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_map", "Argument[1].Parameter[0]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::query_map_opt", "Argument[1].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_map", "Argument[2].Parameter[0]", "database", "manual"] - - ["mysql::conn::queryable::Queryable::exec_map_opt", "Argument[2].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::query_map", "Argument[1].Parameter[0]", "database", "manual"] + - ["::query_map_opt", "Argument[1].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] + - ["::exec_map", "Argument[2].Parameter[0]", "database", "manual"] + - ["::exec_map_opt", "Argument[2].Parameter[0].Field[core::result::Result::Ok(0)]", "database", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel data: - - ["mysql::conn::queryable::Queryable::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::query_fold_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold_opt", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_fold_opt", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] - - ["mysql::conn::queryable::Queryable::query_map", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["mysql::conn::queryable::Queryable::query_map_opt", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_map", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] - - ["mysql::conn::queryable::Queryable::exec_map_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::query_fold", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] + - ["::query_fold", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::exec_fold", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] + - ["::exec_fold", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::query_fold_opt", "Argument[1]", "Argument[2].Parameter[0]", "value", "manual"] + - ["::query_fold_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::exec_fold_opt", "Argument[2]", "Argument[3].Parameter[0]", "value", "manual"] + - ["::exec_fold_opt", "Argument[3].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)]", "value", "manual"] + - ["::query_map", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::query_map_opt", "Argument[1].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::exec_map", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] + - ["::exec_map_opt", "Argument[2].ReturnValue", "ReturnValue.Field[core::result::Result::Ok(0)].Element", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml index f4bcb94ba206..e745e0caf9af 100644 --- a/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/rustcrypto/rustcrypto.model.yml @@ -3,19 +3,19 @@ extensions: pack: codeql/rust-all extensible: sinkModel data: - - ["digest::digest::Digest::new_with_prefix", "Argument[0]", "hasher-input", "manual"] - - ["digest::digest::Digest::update", "Argument[0]", "hasher-input", "manual"] - - ["digest::digest::Digest::chain_update", "Argument[0]", "hasher-input", "manual"] - - ["digest::digest::Digest::digest", "Argument[0]", "hasher-input", "manual"] + - ["::new_with_prefix", "Argument[0]", "hasher-input", "manual"] + - ["::update", "Argument[0]", "hasher-input", "manual"] + - ["::chain_update", "Argument[0]", "hasher-input", "manual"] + - ["::digest", "Argument[0]", "hasher-input", "manual"] - ["md5::compute", "Argument[0]", "hasher-input", "manual"] - - ["crypto_common::KeyInit::new", "Argument[0]", "credentials-key", "manual"] - - ["crypto_common::KeyInit::new", "Argument[1]", "credentials-iv", "manual"] - - ["crypto_common::KeyInit::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["crypto_common::KeyInit::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - - ["crypto_common::KeyIvInit::new", "Argument[0]", "credentials-key", "manual"] - - ["crypto_common::KeyIvInit::new", "Argument[1]", "credentials-iv", "manual"] - - ["crypto_common::KeyIvInit::new_from_slice", "Argument[0]", "credentials-key", "manual"] - - ["crypto_common::KeyIvInit::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] + - ["::new", "Argument[0]", "credentials-key", "manual"] + - ["::new", "Argument[1]", "credentials-iv", "manual"] + - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] + - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - ["::new", "Argument[0]", "credentials-key", "manual"] - ["::new", "Argument[1]", "credentials-iv", "manual"] - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] @@ -32,4 +32,4 @@ extensions: - ["::new", "Argument[1]", "credentials-iv", "manual"] - ["::new_from_slice", "Argument[0]", "credentials-key", "manual"] - ["::new_from_slice", "Argument[1]", "credentials-iv", "manual"] - - ["aead::Aead::encrypt", "Argument[0]", "credentials-nonce", "manual"] + - ["::encrypt", "Argument[0]", "credentials-nonce", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml b/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml index 57db37bd9eb5..4f6c2369b4d0 100644 --- a/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/sqlx.model.yml @@ -10,7 +10,7 @@ extensions: - ["sqlx_core::query_scalar::query_scalar", "Argument[0]", "sql-injection", "manual"] - ["sqlx_core::query_scalar_with::query_scalar_with", "Argument[0]", "sql-injection", "manual"] - ["sqlx_core::raw_sql::raw_sql", "Argument[0]", "sql-injection", "manual"] - - ["sqlx_core::executor::Executor::execute", "Argument[0]", "sql-injection", "manual"] + - ["::execute", "Argument[0]", "sql-injection", "manual"] - addsTo: pack: codeql/rust-all extensible: sourceModel diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml index 7b97fdb1c4c9..738c2c2072aa 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/alloc.model.yml @@ -13,12 +13,12 @@ extensions: - ["alloc::alloc::alloc", "Argument[0]", "alloc-layout", "manual"] - ["alloc::alloc::alloc_zeroed", "Argument[0]", "alloc-layout", "manual"] - ["alloc::alloc::realloc", "Argument[2]", "alloc-size", "manual"] - - ["core::alloc::global::GlobalAlloc::alloc", "Argument[0]", "alloc-layout", "manual"] - - ["core::alloc::global::GlobalAlloc::alloc_zeroed", "Argument[0]", "alloc-layout", "manual"] - - ["core::alloc::Allocator::allocate", "Argument[0]", "alloc-layout", "manual"] - - ["core::alloc::Allocator::allocate_zeroed", "Argument[0]", "alloc-layout", "manual"] - - ["core::alloc::Allocator::grow", "Argument[2]", "alloc-layout", "manual"] - - ["core::alloc::Allocator::grow_zeroed", "Argument[2]", "alloc-layout", "manual"] + - ["::alloc", "Argument[0]", "alloc-layout", "manual"] + - ["::alloc_zeroed", "Argument[0]", "alloc-layout", "manual"] + - ["::allocate", "Argument[0]", "alloc-layout", "manual"] + - ["::allocate_zeroed", "Argument[0]", "alloc-layout", "manual"] + - ["::grow", "Argument[2]", "alloc-layout", "manual"] + - ["::grow_zeroed", "Argument[2]", "alloc-layout", "manual"] - addsTo: pack: codeql/rust-all extensible: summaryModel @@ -49,7 +49,7 @@ extensions: # String - ["::as_str", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - ["::as_bytes", "Argument[self].Reference", "ReturnValue.Reference.Element", "taint", "manual"] - - ["alloc::string::ToString::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Overwrite generated model - ["::add", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::add", "Argument[0].Reference", "ReturnValue", "taint", "manual"] @@ -57,8 +57,8 @@ extensions: - ["alloc::vec::from_elem", "Argument[0]", "ReturnValue.Element", "value", "manual"] - ["::deref", "Argument[self].Reference.Element", "ReturnValue.Reference.Element", "value", "manual"] # ToOwned - - ["alloc::borrow::ToOwned::to_owned", "Argument[self].Reference", "ReturnValue", "taint", "manual"] - - ["alloc::borrow::ToOwned::clone_into", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::to_owned", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::clone_into", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - addsTo: pack: codeql/rust-all extensible: neutralModel diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml index 69887cea50a4..cc59fe4082e7 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/core.model.yml @@ -6,102 +6,102 @@ extensions: # Builtin deref - ["<& as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"] - ["<&mut as core::ops::deref::Deref>::deref", "Argument[self].Reference", "ReturnValue", "value", "manual"] - - ["core::ops::deref::Deref::deref", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] + - ["::deref", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] # Index - - ["core::ops::index::Index::index", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] - - ["core::ops::index::IndexMut::index_mut", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] + - ["::index", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] + - ["::index_mut", "Argument[self].Reference.Element", "ReturnValue.Reference", "value", "manual"] # Unary operators - - ["core::ops::arith::Neg::neg", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::neg", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::neg", "Argument[self].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::Not::not", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::not", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::not", "Argument[self].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Arithmetic operators - - ["core::ops::arith::Add::add", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::arith::Add::add", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::Sub::sub", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::arith::Sub::sub", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::Mul::mul", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::arith::Mul::mul", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::Div::div", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::arith::Div::div", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::Rem::rem", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::arith::Rem::rem", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::add", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::add", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::sub", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::sub", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::mul", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::mul", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::div", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::div", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::rem", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::rem", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Arithmetic assignment expressions - - ["core::ops::arith::AddAssign::add_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::AddAssign::add_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::AddAssign::add_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::AddAssign::add_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::SubAssign::sub_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::SubAssign::sub_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::SubAssign::sub_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::SubAssign::sub_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::MulAssign::mul_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::MulAssign::mul_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::MulAssign::mul_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::MulAssign::mul_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::DivAssign::div_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::DivAssign::div_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::DivAssign::div_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::DivAssign::div_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::RemAssign::rem_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::RemAssign::rem_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::arith::RemAssign::rem_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::arith::RemAssign::rem_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::add_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::add_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::add_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::add_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::sub_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::sub_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::sub_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::sub_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::mul_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::mul_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::mul_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::mul_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::div_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::div_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::div_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::div_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::rem_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::rem_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::rem_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::rem_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Bitwise operators - - ["core::ops::bit::BitAnd::bitand", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::bit::BitAnd::bitand", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitOr::bitor", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::bit::BitOr::bitor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitXor::bitxor", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::bit::BitXor::bitxor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitand", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::bitand", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitor", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::bitor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitxor", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::bitxor", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Bitwise assignment operators - - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitAndAssign::bitand_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitOrAssign::bitor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::BitXorAssign::bitxor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitand_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::bitand_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::bitand_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitand_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::bitor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::bitor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitxor_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::bitxor_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::bitxor_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::bitxor_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Shift operators - - ["core::ops::bit::Shl::shl", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::bit::Shl::shl", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::Shr::shr", "Argument[self,0]", "ReturnValue", "taint", "manual"] - - ["core::ops::bit::Shr::shr", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shl", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::shl", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shr", "Argument[self,0]", "ReturnValue", "taint", "manual"] + - ["::shr", "Argument[self,0].Field[core::num::wrapping::Wrapping(0)]", "ReturnValue.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Shift assignment operators - - ["core::ops::bit::ShlAssign::shl_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::ShlAssign::shl_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::ShlAssign::shl_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::ShlAssign::shl_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::ShrAssign::shr_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::ShrAssign::shr_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] - - ["core::ops::bit::ShrAssign::shr_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] - - ["core::ops::bit::ShrAssign::shr_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shl_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::shl_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::shl_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shl_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shr_assign", "Argument[self].Reference", "Argument[self].Reference", "taint", "manual"] + - ["::shr_assign", "Argument[0]", "Argument[self].Reference", "taint", "manual"] + - ["::shr_assign", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] + - ["::shr_assign", "Argument[0].Field[core::num::wrapping::Wrapping(0)]", "Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]", "taint", "manual"] # Clone - - ["core::clone::Clone::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"] + - ["::clone", "Argument[self].Reference", "ReturnValue", "value", "manual"] # Conversions - - ["core::convert::Into::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] - - ["core::convert::Into::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] + - ["::into", "Argument[self].Element", "ReturnValue.Element", "taint", "manual"] + - ["::into", "Argument[self].Reference.Element", "ReturnValue.Element", "taint", "manual"] # From - - ["core::convert::From::from", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["::from", "Argument[0]", "ReturnValue", "taint", "manual"] # Iterator - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - - ["value_trait::array::Array::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] + - ["::iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::iter_mut", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - ["::into_iter", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::nth", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::collect", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] - - ["core::iter::traits::iterator::Iterator::chain", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["core::iter::traits::iterator::Iterator::chain", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["core::iter::traits::iterator::Iterator::take", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["::nth", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] + - ["::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] + - ["::collect", "Argument[self].Element", "ReturnValue.Element", "value", "manual"] + - ["::map", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["::for_each", "Argument[self].Element", "Argument[0].Parameter[0]", "value", "manual"] + - ["::chain", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::chain", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["::take", "Argument[self]", "ReturnValue", "taint", "manual"] # Option - ["::map", "Argument[self].Field[core::option::Option::Some(0)]", "Argument[0].Parameter[0]", "value", "manual"] - ["::map", "Argument[0].ReturnValue", "ReturnValue.Field[core::option::Option::Some(0)]", "value", "manual"] @@ -130,9 +130,9 @@ extensions: - ["::trim", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - ["::to_string", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Ord - - ["core::cmp::Ord::min", "Argument[self,0]", "ReturnValue", "value", "manual"] - - ["core::cmp::Ord::max", "Argument[self,0]", "ReturnValue", "value", "manual"] - - ["core::cmp::Ord::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"] + - ["::min", "Argument[self,0]", "ReturnValue", "value", "manual"] + - ["::max", "Argument[self,0]", "ReturnValue", "value", "manual"] + - ["::clamp", "Argument[self,0,1]", "ReturnValue", "value", "manual"] # Slice - ["<[]>::get", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Reference", "value", "manual"] - addsTo: diff --git a/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml index f6527ae912b7..fb7ff0da28e5 100644 --- a/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/stdlib/io.model.yml @@ -9,20 +9,20 @@ extensions: extensible: summaryModel data: - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["std::io::BufRead::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::fill_buf", "Argument[self].Reference", "ReturnValue.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::buffer", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - - ["std::io::Read::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["std::io::Read::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["std::io::Read::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["std::io::Read::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["std::io::BufRead::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["std::io::BufRead::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - - ["std::io::BufRead::split", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["std::io::BufRead::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["std::io::Read::bytes", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["std::io::Read::chain", "Argument[self]", "ReturnValue", "taint", "manual"] - - ["std::io::Read::chain", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["std::io::Read::take", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["::split", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::lines", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::bytes", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::chain", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::chain", "Argument[0]", "ReturnValue", "taint", "manual"] + - ["::take", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::lock", "Argument[self].Reference", "ReturnValue", "taint", "manual"] - ["::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - ["::next", "Argument[self].Reference.Element", "ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]", "value", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml b/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml index ceb3e8372d3a..9e3a3f2ac8b8 100644 --- a/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/tokio/io.model.yml @@ -9,40 +9,40 @@ extensions: extensible: summaryModel data: - ["::new", "Argument[0]", "ReturnValue", "taint", "manual"] - - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::fill_buf", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - ["::buffer", "Argument[self].Reference", "ReturnValue.Reference", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] - - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::split", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::read", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_to_string", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_to_end", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_exact", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_line", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_until", "Argument[self].Reference", "Argument[1].Reference", "taint", "manual"] + - ["::split", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::next_segment", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] - - ["tokio::io::util::async_buf_read_ext::AsyncBufReadExt::lines", "Argument[self]", "ReturnValue", "taint", "manual"] + - ["::lines", "Argument[self]", "ReturnValue", "taint", "manual"] - ["::next_line", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_buf", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_u128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_i128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] - - ["tokio::io::util::async_read_ext::AsyncReadExt::read_f64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_buf", "Argument[self].Reference", "Argument[0].Reference", "taint", "manual"] + - ["::read_u8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_u128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i8", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i8_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i16", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i16_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i128", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_i128_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_f32", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_f32_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_f64", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] + - ["::read_f64_le", "Argument[self].Reference", "ReturnValue.Future.Field[core::result::Result::Ok(0)]", "taint", "manual"] diff --git a/rust/ql/lib/codeql/rust/frameworks/warp.model.yml b/rust/ql/lib/codeql/rust/frameworks/warp.model.yml index 32ba4f1f0a84..916b506fc9e4 100644 --- a/rust/ql/lib/codeql/rust/frameworks/warp.model.yml +++ b/rust/ql/lib/codeql/rust/frameworks/warp.model.yml @@ -3,9 +3,9 @@ extensions: pack: codeql/rust-all extensible: sourceModel data: - - ["warp::filter::Filter::then", "Argument[0].Parameter[0..7]", "remote", "manual"] - - ["warp::filter::Filter::map", "Argument[0].Parameter[0..7]", "remote", "manual"] - - ["warp::filter::Filter::and_then", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::then", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::map", "Argument[0].Parameter[0..7]", "remote", "manual"] + - ["::and_then", "Argument[0].Parameter[0..7]", "remote", "manual"] - addsTo: pack: codeql/rust-all extensible: sinkModel diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 9af7f6abad45..707aad9cddd2 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1104,6 +1104,9 @@ final class TraitItemNode extends ImplOrTraitItemNode, NamedItemNode, TypeItemNo bindingset[c] private string getCanonicalPathPart(Crate c, int i) { + i = -1 and + result = "<" + or i = 0 and result = this.getCanonicalPathPrefix(c) or @@ -1112,6 +1115,9 @@ final class TraitItemNode extends ImplOrTraitItemNode, NamedItemNode, TypeItemNo or i = 2 and result = this.getName() + or + i = 3 and + result = ">" } language[monotonicAggregates] @@ -1123,7 +1129,7 @@ final class TraitItemNode extends ImplOrTraitItemNode, NamedItemNode, TypeItemNo language[monotonicAggregates] override string getCanonicalPathPrefixFor(Crate c, ItemNode child) { this.providesCanonicalPathPrefixFor(c, child) and - result = this.getCanonicalPath(c) + result = strictconcat(int i | i in [-1 .. 3] | this.getCanonicalPathPart(c, i) order by i) } } diff --git a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected index b93f75b3ad70..4950c4652e51 100644 --- a/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected +++ b/rust/ql/test/extractor-tests/canonical_path/canonical_paths.expected @@ -8,13 +8,13 @@ | regular.rs:1:1:2:18 | impl ...::PartialEq for Struct::<...> { ... } | | | regular.rs:1:1:2:18 | struct Struct | test::regular::Struct | | regular.rs:4:1:6:1 | trait Trait | test::regular::Trait | -| regular.rs:5:5:5:16 | fn f | test::regular::Trait::f | +| regular.rs:5:5:5:16 | fn f | ::f | | regular.rs:8:1:10:1 | impl Trait for Struct { ... } | | | regular.rs:9:5:9:18 | fn f | ::f | | regular.rs:12:1:14:1 | impl Struct { ... } | | | regular.rs:13:5:13:18 | fn g | ::g | | regular.rs:16:1:18:1 | trait TraitWithBlanketImpl | test::regular::TraitWithBlanketImpl | -| regular.rs:17:5:17:16 | fn h | test::regular::TraitWithBlanketImpl::h | +| regular.rs:17:5:17:16 | fn h | ::h | | regular.rs:20:1:22:1 | impl TraitWithBlanketImpl for T { ... } | <_ as test::regular::TraitWithBlanketImpl> | | regular.rs:21:5:21:18 | fn h | <_ as test::regular::TraitWithBlanketImpl>::h | | regular.rs:24:1:24:12 | fn free | test::regular::free | @@ -29,6 +29,6 @@ | regular.rs:66:5:66:40 | fn is_alphanum | test::regular::is_alphanum | | regular.rs:69:1:71:1 | fn is_number_or_letter | test::regular::is_number_or_letter | | regular.rs:73:1:75:1 | trait Abs | test::regular::Abs | -| regular.rs:74:5:74:25 | fn abs | test::regular::Abs::abs | +| regular.rs:74:5:74:25 | fn abs | ::abs | | regular.rs:77:1:85:1 | impl Abs for i32 { ... } | | | regular.rs:78:5:84:5 | fn abs | ::abs | diff --git a/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected b/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected index e4d20768e1e4..b8bc4fd7d7f3 100644 --- a/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/collections/inline-flow.expected @@ -1,7 +1,7 @@ models | 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 2 | Summary: core::ops::arith::AddAssign::add_assign; Argument[0]; Argument[self].Reference; taint | -| 3 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 2 | Summary: ::add_assign; Argument[0]; Argument[self].Reference; taint | +| 3 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | edges | main.rs:15:13:15:13 | s | main.rs:16:20:16:20 | s | provenance | | | main.rs:15:17:15:25 | source(...) | main.rs:15:13:15:13 | s | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected index 299fd896ad68..e13411a7ab03 100644 --- a/rust/ql/test/library-tests/dataflow/global/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/global/inline-flow.expected @@ -1,6 +1,6 @@ models | 1 | Summary: <& as core::ops::deref::Deref>::deref; Argument[self].Reference; ReturnValue; value | -| 2 | Summary: core::ops::arith::Mul::mul; Argument[self,0]; ReturnValue; taint | +| 2 | Summary: ::mul; Argument[self,0]; ReturnValue; taint | | 3 | Summary: futures_executor::local_pool::block_on; Argument[0]; ReturnValue; value | edges | main.rs:12:28:14:1 | { ... } | main.rs:17:13:17:23 | get_data(...) | provenance | | 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 e9c603a97eb3..3dbfa8da04d9 100644 --- a/rust/ql/test/library-tests/dataflow/local/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/local/inline-flow.expected @@ -3,21 +3,21 @@ models | 2 | Summary: ::deref; Argument[self].Reference.Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | | 3 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | | 4 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 5 | Summary: ::from; Argument[0]; ReturnValue; taint | -| 6 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 7 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | -| 8 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 9 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | -| 10 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 11 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 12 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | -| 14 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 15 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 16 | Summary: alloc::string::ToString::to_string; Argument[self].Reference; ReturnValue; taint | -| 17 | Summary: core::convert::Into::into; Argument[self].Element; ReturnValue.Element; taint | -| 18 | Summary: core::convert::Into::into; Argument[self].Reference.Element; ReturnValue.Element; taint | -| 19 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 5 | Summary: ::to_string; Argument[self].Reference; ReturnValue; taint | +| 6 | Summary: ::into; Argument[self].Element; ReturnValue.Element; taint | +| 7 | Summary: ::into; Argument[self].Reference.Element; ReturnValue.Element; taint | +| 8 | Summary: ::from; Argument[0]; ReturnValue; taint | +| 9 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 10 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap_or; Argument[0]; ReturnValue; value | +| 12 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 13 | Summary: ::unwrap_or_else; Argument[0].ReturnValue; ReturnValue; value | +| 14 | Summary: ::unwrap_or_else; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 15 | Summary: ::err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 16 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 17 | Summary: ::expect_err; Argument[self].Field[core::result::Result::Err(0)]; ReturnValue; value | +| 18 | Summary: ::ok; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 19 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | edges | main.rs:23:9:23:9 | s | main.rs:24:10:24:10 | s | provenance | | | main.rs:23:9:23:9 | s | main.rs:26:12:26:12 | x | provenance | | @@ -129,17 +129,17 @@ edges | main.rs:278:9:278:10 | s1 [Some] | main.rs:279:10:279:11 | s1 [Some] | provenance | | | 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:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:6 | +| main.rs:279:10:279:11 | s1 [Some] | main.rs:279:10:279:20 | s1.unwrap() | provenance | MaD:10 | | main.rs:283:9:283:10 | s1 [Some] | main.rs:284:10:284:11 | s1 [Some] | provenance | | | 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:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:8 | -| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:7 | +| main.rs:284:10:284:11 | s1 [Some] | main.rs:284:10:284:24 | s1.unwrap_or(...) | provenance | MaD:12 | +| main.rs:287:23:287:32 | source(...) | main.rs:287:10:287:33 | s2.unwrap_or(...) | provenance | MaD:11 | | main.rs:291:9:291:10 | s1 [Some] | main.rs:292:10:292:11 | s1 [Some] | provenance | | | 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:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:10 | -| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:9 | +| main.rs:292:10:292:11 | s1 [Some] | main.rs:292:10:292:32 | s1.unwrap_or_else(...) | provenance | MaD:14 | +| main.rs:295:31:295:40 | source(...) | main.rs:295:10:295:41 | s2.unwrap_or_else(...) | provenance | MaD:13 | | 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 | | @@ -150,16 +150,16 @@ edges | 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:12 | o1a [Some] | provenance | | -| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:14 | +| main.rs:309:28:309:29 | r1 [Ok] | main.rs:309:28:309:34 | r1.ok() [Some] | provenance | MaD:18 | | main.rs:309:28:309:34 | r1.ok() [Some] | main.rs:309:9:309:11 | o1a [Some] | provenance | | -| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:6 | +| main.rs:311:10:311:12 | o1a [Some] | main.rs:311:10:311:21 | o1a.unwrap() | provenance | MaD:10 | | main.rs:314:9:314:10 | r2 [Err] | main.rs:316:28:316:29 | r2 [Err] | provenance | | | 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:12 | o2b [Some] | provenance | | -| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:11 | +| main.rs:316:28:316:29 | r2 [Err] | main.rs:316:28:316:35 | r2.err() [Some] | provenance | MaD:15 | | main.rs:316:28:316:35 | r2.err() [Some] | main.rs:316:9:316:11 | o2b [Some] | provenance | | -| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:6 | +| main.rs:318:10:318:12 | o2b [Some] | main.rs:318:10:318:21 | o2b.unwrap() | provenance | MaD:10 | | 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 | | @@ -169,11 +169,11 @@ edges | main.rs:335:9:335:10 | s1 [Ok] | main.rs:336:10:336:11 | s1 [Ok] | provenance | | | 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:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:12 | +| main.rs:336:10:336:11 | s1 [Ok] | main.rs:336:10:336:22 | s1.expect(...) | provenance | MaD:16 | | main.rs:339:9:339:10 | s2 [Err] | main.rs:341:10:341:11 | s2 [Err] | provenance | | | 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:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:13 | +| main.rs:341:10:341:11 | s2 [Err] | main.rs:341:10:341:26 | s2.expect_err(...) | provenance | MaD:17 | | 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 | | @@ -222,13 +222,13 @@ edges | 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 | MaD:19 | +| main.rs:431:14:431:17 | arr1 [element] | main.rs:431:14:431:20 | arr1[2] | provenance | MaD:9 | | 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 | MaD:19 | +| main.rs:435:14:435:17 | arr2 [element] | main.rs:435:14:435:20 | arr2[4] | provenance | MaD:9 | | 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 | | @@ -249,9 +249,9 @@ edges | 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 | MaD:19 | +| main.rs:471:13:471:19 | mut_arr [element] | main.rs:471:13:471:22 | mut_arr[1] | provenance | MaD:9 | | 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 | MaD:19 | +| main.rs:473:10:473:16 | mut_arr [element] | main.rs:473:10:473:19 | mut_arr[0] | provenance | MaD:9 | | 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:506:13:506:13 | a | provenance | | @@ -260,27 +260,27 @@ edges | main.rs:506:9:506:9 | b | main.rs:507:13:507:13 | b | provenance | | | main.rs:506:9:506:9 | b | main.rs:508:18:508:18 | b | provenance | | | main.rs:506:9:506:9 | b | main.rs:511:17:511:17 | b | provenance | | -| main.rs:506:13:506:13 | a | main.rs:506:13:506:25 | a.to_string() | provenance | MaD:16 | +| main.rs:506:13:506:13 | a | main.rs:506:13:506:25 | a.to_string() | provenance | MaD:5 | | main.rs:506:13:506:25 | a.to_string() | main.rs:506:9:506:9 | b | provenance | | | main.rs:507:9:507:9 | c | main.rs:512:10:512:10 | c | provenance | | | main.rs:507:13:507:13 | b | main.rs:507:13:507:28 | b.parse() [Ok] | provenance | MaD:4 | -| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:15 | +| main.rs:507:13:507:28 | b.parse() [Ok] | main.rs:507:13:507:37 | ... .unwrap() | provenance | MaD:19 | | main.rs:507:13:507:37 | ... .unwrap() | main.rs:507:9:507:9 | c | provenance | | | main.rs:508:9:508:9 | d | main.rs:513:10:513:10 | d | provenance | | | main.rs:508:18:508:18 | b | main.rs:508:18:508:26 | b.parse() [Ok] | provenance | MaD:4 | -| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:15 | +| main.rs:508:18:508:26 | b.parse() [Ok] | main.rs:508:18:508:35 | ... .unwrap() | provenance | MaD:19 | | main.rs:508:18:508:35 | ... .unwrap() | main.rs:508:9:508:9 | d | 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 | MaD:19 | +| main.rs:519:10:519:11 | vs [element] | main.rs:519:10:519:14 | vs[0] | provenance | MaD:9 | | 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 | MaD:19 | +| main.rs:544:10:544:15 | vs_mut [element] | main.rs:544:10:544:18 | vs_mut[0] | provenance | MaD:9 | | 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:555:9:555:9 | b | main.rs:560:15:560:15 | b | provenance | | @@ -297,16 +297,16 @@ edges | main.rs:566:9:566:9 | a | main.rs:569:10:569:10 | a | provenance | | | main.rs:566:9:566:9 | a | main.rs:570:20:570:20 | a | provenance | | | main.rs:566:18:566:27 | source(...) | main.rs:566:9:566:9 | a | provenance | | -| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:17 | -| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:18 | +| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:6 | +| main.rs:569:10:569:10 | a | main.rs:569:10:569:17 | a.into() | provenance | MaD:7 | | main.rs:570:20:570:20 | a | main.rs:570:10:570:21 | ...::from(...) | provenance | ReflexiveFrom | | main.rs:572:9:572:9 | b | main.rs:574:10:574:17 | b as i64 | provenance | | | main.rs:572:9:572:9 | b | main.rs:575:10:575:10 | b | provenance | | | main.rs:572:9:572:9 | b | main.rs:576:20:576:20 | b | provenance | | | main.rs:572:18:572:27 | source(...) | main.rs:572:9:572:9 | b | provenance | | -| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:17 | -| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:18 | -| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:5 | +| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:6 | +| main.rs:575:10:575:10 | b | main.rs:575:10:575:17 | b.into() | provenance | MaD:7 | +| main.rs:576:20:576:20 | b | main.rs:576:10:576:21 | ...::from(...) | provenance | MaD:8 | nodes | main.rs:19:10:19:18 | source(...) | semmle.label | source(...) | | main.rs:23:9:23:9 | s | semmle.label | s | diff --git a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected index cbab732aef78..22ec0b630b32 100644 --- a/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected +++ b/rust/ql/test/library-tests/dataflow/modeled/inline-flow.expected @@ -3,24 +3,24 @@ models | 2 | Summary: ::into_pin; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | | 3 | Summary: ::new; Argument[0]; ReturnValue.Field[alloc::boxed::Box(0)]; value | | 4 | Summary: ::pin; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; value | -| 5 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | -| 6 | Summary: ::clone; Argument[self]; ReturnValue; value | -| 7 | Summary: ::map_or; Argument[1].ReturnValue; ReturnValue; value | -| 8 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 9 | Summary: ::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value | -| 10 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | -| 11 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Reference; ReturnValue.Reference; value | -| 12 | Summary: ::into_inner; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | -| 13 | Summary: ::into_inner_unchecked; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | -| 14 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 15 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | -| 16 | Summary: ::new_unchecked; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | -| 17 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 18 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 19 | Summary: core::cmp::Ord::clamp; Argument[self,0,1]; ReturnValue; value | -| 20 | Summary: core::cmp::Ord::max; Argument[self,0]; ReturnValue; value | -| 21 | Summary: core::cmp::Ord::min; Argument[self,0]; ReturnValue; value | -| 22 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | +| 5 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 6 | Summary: ::clamp; Argument[self,0,1]; ReturnValue; value | +| 7 | Summary: ::max; Argument[self,0]; ReturnValue; value | +| 8 | Summary: ::min; Argument[self,0]; ReturnValue; value | +| 9 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 10 | Summary: ::clone; Argument[self]; ReturnValue; value | +| 11 | Summary: ::add; Argument[self,0]; ReturnValue; taint | +| 12 | Summary: ::map_or; Argument[1].ReturnValue; ReturnValue; value | +| 13 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 14 | Summary: ::zip; Argument[0].Field[core::option::Option::Some(0)]; ReturnValue.Field[core::option::Option::Some(0)].Field[1]; value | +| 15 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Field[alloc::boxed::Box(0)]; ReturnValue.Reference; value | +| 16 | Summary: ::deref; Argument[self].Reference.Field[core::pin::Pin::pointer].Reference; ReturnValue.Reference; value | +| 17 | Summary: ::into_inner; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | +| 18 | Summary: ::into_inner_unchecked; Argument[0].Field[core::pin::Pin::pointer]; ReturnValue; value | +| 19 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 20 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 21 | Summary: ::new_unchecked; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 22 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | | 23 | Summary: core::ptr::read; Argument[0].Reference; ReturnValue; value | | 24 | Summary: core::ptr::write; Argument[1]; Argument[0].Reference; value | edges @@ -28,27 +28,27 @@ edges | main.rs:12:9:12:9 | a [Some] | main.rs:14:13:14:13 | a [Some] | provenance | | | main.rs:12:13:12:28 | Some(...) [Some] | main.rs:12:9:12:9 | a [Some] | provenance | | | main.rs:12:18:12:27 | source(...) | main.rs:12:13:12:28 | Some(...) [Some] | provenance | | -| main.rs:13:10:13:10 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:8 | +| main.rs:13:10:13:10 | a [Some] | main.rs:13:10:13:19 | a.unwrap() | provenance | MaD:13 | | main.rs:14:9:14:9 | b [Some] | main.rs:15:10:15:10 | b [Some] | provenance | | -| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | MaD:18 | +| main.rs:14:13:14:13 | a [Some] | main.rs:14:13:14:21 | a.clone() [Some] | provenance | MaD:5 | | main.rs:14:13:14:21 | a.clone() [Some] | main.rs:14:9:14:9 | b [Some] | provenance | | -| main.rs:15:10:15:10 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:8 | +| main.rs:15:10:15:10 | b [Some] | main.rs:15:10:15:19 | b.unwrap() | provenance | MaD:13 | | main.rs:19:9:19:9 | a [Ok] | main.rs:20:10:20:10 | a [Ok] | provenance | | | main.rs:19:9:19:9 | a [Ok] | main.rs:21:13:21:13 | a [Ok] | provenance | | | main.rs:19:31:19:44 | Ok(...) [Ok] | main.rs:19:9:19:9 | a [Ok] | provenance | | | main.rs:19:34:19:43 | source(...) | main.rs:19:31:19:44 | Ok(...) [Ok] | provenance | | -| main.rs:20:10:20:10 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:17 | +| main.rs:20:10:20:10 | a [Ok] | main.rs:20:10:20:19 | a.unwrap() | provenance | MaD:22 | | main.rs:21:9:21:9 | b [Ok] | main.rs:22:10:22:10 | b [Ok] | provenance | | -| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | MaD:18 | +| main.rs:21:13:21:13 | a [Ok] | main.rs:21:13:21:21 | a.clone() [Ok] | provenance | MaD:5 | | main.rs:21:13:21:21 | a.clone() [Ok] | main.rs:21:9:21:9 | b [Ok] | provenance | | -| main.rs:22:10:22:10 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:17 | +| main.rs:22:10:22:10 | b [Ok] | main.rs:22:10:22:19 | b.unwrap() | provenance | MaD:22 | | main.rs:26:9:26:9 | a | main.rs:27:10:27:10 | a | provenance | | | main.rs:26:9:26:9 | a | main.rs:28:13:28:13 | a | provenance | | | main.rs:26:13:26:22 | source(...) | main.rs:26:9:26:9 | a | provenance | | | main.rs:28:9:28:9 | b | main.rs:29:10:29:10 | b | provenance | | | main.rs:28:9:28:9 | b [&ref] | main.rs:29:10:29:10 | b | provenance | | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:5 | -| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() [&ref] | provenance | MaD:6 | +| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() | provenance | MaD:9 | +| main.rs:28:13:28:13 | a | main.rs:28:13:28:21 | a.clone() [&ref] | provenance | MaD:10 | | main.rs:28:13:28:21 | a.clone() | main.rs:28:9:28:9 | b | provenance | | | main.rs:28:13:28:21 | a.clone() [&ref] | main.rs:28:9:28:9 | b [&ref] | provenance | | | main.rs:43:18:43:22 | SelfParam [&ref, Wrapper] | main.rs:44:26:44:31 | self.n | provenance | | @@ -73,15 +73,15 @@ edges | main.rs:66:22:66:31 | source(...) | main.rs:66:17:66:32 | Some(...) [Some] | provenance | | | main.rs:67:13:67:13 | z [Some, tuple.1] | main.rs:68:15:68:15 | z [Some, tuple.1] | provenance | | | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | main.rs:67:13:67:13 | z [Some, tuple.1] | provenance | | -| main.rs:67:23:67:23 | b [Some] | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | provenance | MaD:9 | +| main.rs:67:23:67:23 | b [Some] | main.rs:67:17:67:24 | a.zip(...) [Some, tuple.1] | provenance | MaD:14 | | main.rs:68:15:68:15 | z [Some, tuple.1] | main.rs:69:13:69:24 | Some(...) [Some, tuple.1] | provenance | | | main.rs:69:13:69:24 | Some(...) [Some, tuple.1] | main.rs:69:18:69:23 | TuplePat [tuple.1] | provenance | | | main.rs:69:18:69:23 | TuplePat [tuple.1] | main.rs:69:22:69:22 | m | provenance | | | main.rs:69:22:69:22 | m | main.rs:71:22:71:22 | m | provenance | | | main.rs:79:13:79:13 | b | main.rs:80:14:80:14 | b | provenance | | | main.rs:79:17:79:47 | a.map_or(...) | main.rs:79:13:79:13 | b | provenance | | -| main.rs:79:33:79:46 | ... + ... | main.rs:79:17:79:47 | a.map_or(...) | provenance | MaD:7 | -| main.rs:79:37:79:46 | source(...) | main.rs:79:33:79:46 | ... + ... | provenance | MaD:22 | +| main.rs:79:33:79:46 | ... + ... | main.rs:79:17:79:47 | a.map_or(...) | provenance | MaD:12 | +| main.rs:79:37:79:46 | source(...) | main.rs:79:33:79:46 | ... + ... | provenance | MaD:11 | | main.rs:92:29:92:29 | [post] y [&ref] | main.rs:93:33:93:33 | y [&ref] | provenance | | | main.rs:92:32:92:41 | source(...) | main.rs:92:29:92:29 | [post] y [&ref] | provenance | MaD:24 | | main.rs:93:33:93:33 | y [&ref] | main.rs:93:18:93:34 | ...::read(...) | provenance | MaD:23 | @@ -97,8 +97,8 @@ edges | main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | main.rs:115:31:115:34 | pin1 [Pin, &ref] | provenance | | | main.rs:109:24:109:35 | ...::new(...) | main.rs:109:13:109:20 | mut pin1 | provenance | | | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | main.rs:109:13:109:20 | mut pin1 [Pin, &ref] | provenance | | -| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) | provenance | MaD:14 | -| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:15 | +| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) | provenance | MaD:19 | +| main.rs:109:33:109:34 | &i [&ref] | main.rs:109:24:109:35 | ...::new(...) [Pin, &ref] | provenance | MaD:20 | | main.rs:109:34:109:34 | i | main.rs:109:33:109:34 | &i [&ref] | provenance | | | main.rs:110:13:110:20 | mut pin2 [Pin, Box(0)] | main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | provenance | | | main.rs:110:24:110:34 | ...::pin(...) [Pin, Box(0)] | main.rs:110:13:110:20 | mut pin2 [Pin, Box(0)] | provenance | | @@ -108,56 +108,56 @@ edges | main.rs:111:38:111:48 | ...::new(...) [Box(0)] | main.rs:111:24:111:49 | ...::into_pin(...) [Pin, Box(0)] | provenance | MaD:2 | | main.rs:111:47:111:47 | i | main.rs:111:38:111:48 | ...::new(...) [Box(0)] | provenance | MaD:3 | | main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | main.rs:118:15:118:18 | pin4 [Pin, &ref] | provenance | | -| main.rs:112:24:112:27 | &mut pinned [&ref] | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | provenance | MaD:16 | +| main.rs:112:24:112:27 | &mut pinned [&ref] | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | provenance | MaD:21 | | main.rs:112:24:112:27 | ...::new_unchecked(...) [Pin, &ref] | main.rs:112:13:112:20 | mut pin4 [Pin, &ref] | provenance | | | main.rs:112:24:112:27 | mut pinned | main.rs:112:24:112:27 | pinned | provenance | | | main.rs:112:24:112:27 | pinned | main.rs:112:24:112:27 | &mut pinned [&ref] | provenance | | -| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:10 | -| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:11 | -| main.rs:114:15:114:18 | pin1 [Pin, &ref] | main.rs:114:14:114:18 | * ... | provenance | MaD:11 | +| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:15 | +| main.rs:114:15:114:18 | pin1 | main.rs:114:14:114:18 | * ... | provenance | MaD:16 | +| main.rs:114:15:114:18 | pin1 [Pin, &ref] | main.rs:114:14:114:18 | * ... | provenance | MaD:16 | | main.rs:115:15:115:35 | ...::into_inner(...) | main.rs:115:14:115:35 | * ... | provenance | MaD:1 | | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | main.rs:115:14:115:35 | * ... | provenance | MaD:1 | -| main.rs:115:31:115:34 | pin1 | main.rs:115:15:115:35 | ...::into_inner(...) | provenance | MaD:12 | -| main.rs:115:31:115:34 | pin1 [Pin, &ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:12 | -| main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | main.rs:116:14:116:18 | * ... | provenance | MaD:10 | -| main.rs:117:15:117:18 | pin3 [Pin, Box(0)] | main.rs:117:14:117:18 | * ... | provenance | MaD:10 | -| main.rs:118:15:118:18 | pin4 [Pin, &ref] | main.rs:118:14:118:18 | * ... | provenance | MaD:11 | +| main.rs:115:31:115:34 | pin1 | main.rs:115:15:115:35 | ...::into_inner(...) | provenance | MaD:17 | +| main.rs:115:31:115:34 | pin1 [Pin, &ref] | main.rs:115:15:115:35 | ...::into_inner(...) [&ref] | provenance | MaD:17 | +| main.rs:116:15:116:18 | pin2 [Pin, Box(0)] | main.rs:116:14:116:18 | * ... | provenance | MaD:15 | +| main.rs:117:15:117:18 | pin3 [Pin, Box(0)] | main.rs:117:14:117:18 | * ... | provenance | MaD:15 | +| main.rs:118:15:118:18 | pin4 [Pin, &ref] | main.rs:118:14:118:18 | * ... | provenance | MaD:16 | | main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:123:34:123:35 | ms [MyStruct] | provenance | | | main.rs:122:13:122:18 | mut ms [MyStruct] | main.rs:127:14:127:15 | ms [MyStruct] | provenance | | | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | main.rs:122:13:122:18 | mut ms [MyStruct] | provenance | | | main.rs:122:38:122:47 | source(...) | main.rs:122:22:122:49 | MyStruct {...} [MyStruct] | provenance | | | main.rs:123:13:123:20 | mut pin1 [Pin, &ref, MyStruct] | main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | provenance | | | main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | main.rs:123:13:123:20 | mut pin1 [Pin, &ref, MyStruct] | provenance | | -| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | provenance | MaD:15 | +| main.rs:123:33:123:35 | &ms [&ref, MyStruct] | main.rs:123:24:123:36 | ...::new(...) [Pin, &ref, MyStruct] | provenance | MaD:20 | | main.rs:123:34:123:35 | ms [MyStruct] | main.rs:123:33:123:35 | &ms [&ref, MyStruct] | provenance | | | main.rs:127:14:127:15 | ms [MyStruct] | main.rs:127:14:127:19 | ms.val | provenance | | | main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | main.rs:129:14:129:38 | ... .val | provenance | | -| main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | provenance | MaD:12 | +| main.rs:129:30:129:33 | pin1 [Pin, &ref, MyStruct] | main.rs:129:14:129:34 | ...::into_inner(...) [&ref, MyStruct] | provenance | MaD:17 | | main.rs:136:13:136:18 | mut ms [MyStruct] | main.rs:137:44:137:45 | ms [MyStruct] | provenance | | | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | main.rs:136:13:136:18 | mut ms [MyStruct] | provenance | | | main.rs:136:38:136:47 | source(...) | main.rs:136:22:136:49 | MyStruct {...} [MyStruct] | provenance | | | main.rs:137:13:137:20 | mut pin5 [Pin, &ref, MyStruct] | main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | provenance | | | main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | main.rs:137:13:137:20 | mut pin5 [Pin, &ref, MyStruct] | provenance | | -| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | provenance | MaD:16 | +| main.rs:137:43:137:45 | &ms [&ref, MyStruct] | main.rs:137:24:137:46 | ...::new_unchecked(...) [Pin, &ref, MyStruct] | provenance | MaD:21 | | main.rs:137:44:137:45 | ms [MyStruct] | main.rs:137:43:137:45 | &ms [&ref, MyStruct] | provenance | | | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | main.rs:139:14:139:48 | ... .val | provenance | | -| main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | provenance | MaD:13 | +| main.rs:139:40:139:43 | pin5 [Pin, &ref, MyStruct] | main.rs:139:14:139:44 | ...::into_inner_unchecked(...) [&ref, MyStruct] | provenance | MaD:18 | | main.rs:153:9:153:9 | a | main.rs:155:13:155:13 | a | provenance | | | main.rs:153:13:153:22 | source(...) | main.rs:153:9:153:9 | a | provenance | | | main.rs:154:9:154:9 | b | main.rs:155:19:155:19 | b | provenance | | | main.rs:154:13:154:22 | source(...) | main.rs:154:9:154:9 | b | provenance | | | main.rs:155:9:155:9 | c | main.rs:156:10:156:10 | c | provenance | | -| main.rs:155:13:155:13 | a | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:21 | +| main.rs:155:13:155:13 | a | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:8 | | main.rs:155:13:155:20 | a.min(...) | main.rs:155:9:155:9 | c | provenance | | -| main.rs:155:19:155:19 | b | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:21 | +| main.rs:155:19:155:19 | b | main.rs:155:13:155:20 | a.min(...) | provenance | MaD:8 | | main.rs:158:9:158:9 | d | main.rs:160:13:160:13 | d | provenance | | | main.rs:158:13:158:22 | source(...) | main.rs:158:9:158:9 | d | provenance | | | main.rs:159:9:159:9 | e | main.rs:160:19:160:19 | e | provenance | | | main.rs:159:13:159:22 | source(...) | main.rs:159:9:159:9 | e | provenance | | | main.rs:160:9:160:9 | f | main.rs:161:10:161:10 | f | provenance | | -| main.rs:160:13:160:13 | d | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:20 | +| main.rs:160:13:160:13 | d | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:7 | | main.rs:160:13:160:20 | d.max(...) | main.rs:160:9:160:9 | f | provenance | | -| main.rs:160:19:160:19 | e | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:20 | +| main.rs:160:19:160:19 | e | main.rs:160:13:160:20 | d.max(...) | provenance | MaD:7 | | main.rs:163:9:163:9 | g | main.rs:166:13:166:13 | g | provenance | | | main.rs:163:13:163:22 | source(...) | main.rs:163:9:163:9 | g | provenance | | | main.rs:164:9:164:9 | h | main.rs:166:21:166:21 | h | provenance | | @@ -165,10 +165,10 @@ edges | main.rs:165:9:165:9 | i | main.rs:166:24:166:24 | i | provenance | | | main.rs:165:13:165:22 | source(...) | main.rs:165:9:165:9 | i | provenance | | | main.rs:166:9:166:9 | j | main.rs:167:10:167:10 | j | provenance | | -| main.rs:166:13:166:13 | g | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:19 | +| main.rs:166:13:166:13 | g | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:6 | | main.rs:166:13:166:25 | g.clamp(...) | main.rs:166:9:166:9 | j | provenance | | -| main.rs:166:21:166:21 | h | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:19 | -| main.rs:166:24:166:24 | i | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:19 | +| main.rs:166:21:166:21 | h | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:6 | +| main.rs:166:24:166:24 | i | main.rs:166:13:166:25 | g.clamp(...) | provenance | MaD:6 | nodes | main.rs:12:9:12:9 | a [Some] | semmle.label | a [Some] | | main.rs:12:13:12:28 | Some(...) [Some] | semmle.label | Some(...) [Some] | diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index e33d40856ce5..15e5d5f268d0 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -8,7 +8,7 @@ models | 7 | Sink: main::sink_out_of_function::pass_sink; Argument[0].ReturnValue; test-sink | | 8 | Sink: main::sink_out_of_function::pass_sink_nested; Argument[0].ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-sink | | 9 | Source: ::source; ReturnValue.Field[main::MyFieldEnum::C::field_c]; test-source | -| 10 | Source: main::MyTrait::test_param_source; Parameter[0]; test-source | +| 10 | Source: ::test_param_source; Parameter[0]; test-source | | 11 | Source: main::arg_source; Argument[0]; test-source | | 12 | Source: main::enum_source; ReturnValue.Field[main::MyFieldEnum::D::field_d]; test-source | | 13 | Source: main::enum_source_nested; ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | @@ -18,27 +18,26 @@ models | 17 | Source: main::source_into_function::pass_source; Argument[1].Parameter[0]; test-source | | 18 | Source: main::source_into_function::pass_source_nested; Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]; test-source | | 19 | Summary: <_ as main::MyTrait3>::flow_through3; Argument[0]; ReturnValue; value | -| 20 | Summary: core::cmp::Ord::max; Argument[self,0]; ReturnValue; value | -| 21 | Summary: core::cmp::PartialOrd::lt; Argument[self].Reference; ReturnValue; taint | -| 22 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 20 | Summary: ::max; Argument[self,0]; ReturnValue; value | +| 21 | Summary: ::lt; Argument[self].Reference; ReturnValue; taint | +| 22 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | | 23 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | | 24 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | | 25 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 26 | Summary: main::external_file::MyTrait2::flow_through2; Argument[0]; ReturnValue; value | -| 27 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 28 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 29 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 30 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 31 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 32 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 33 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 34 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 35 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 36 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 37 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 38 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 39 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 40 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 26 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 27 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 28 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 29 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 30 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 31 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 32 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 33 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 34 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 35 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 36 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 37 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 38 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 39 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -53,8 +52,8 @@ edges | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -65,8 +64,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -75,8 +74,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -93,8 +92,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -103,8 +102,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -121,8 +120,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -131,16 +130,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -151,8 +150,8 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | @@ -165,8 +164,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -175,8 +174,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -227,8 +226,8 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | @@ -369,12 +368,6 @@ edges | main.rs:497:9:497:10 | x6 | main.rs:498:10:498:11 | x6 | provenance | | | main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:21 | | main.rs:497:14:497:27 | ... < ... | main.rs:497:9:497:10 | x6 | provenance | | -| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | -| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | -| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | -| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | -| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:26 | -| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:26 | | main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | | main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | | main.rs:506:14:506:44 | ...::flow_through3(...) | main.rs:506:9:506:10 | x9 | provenance | | @@ -389,10 +382,10 @@ edges | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -792,14 +785,6 @@ nodes | main.rs:497:14:497:23 | source(...) | semmle.label | source(...) | | main.rs:497:14:497:27 | ... < ... | semmle.label | ... < ... | | main.rs:498:10:498:11 | x6 | semmle.label | x6 | -| main.rs:503:9:503:10 | x8 | semmle.label | x8 | -| main.rs:503:9:503:10 | x8 | semmle.label | x8 | -| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | -| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | -| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | -| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | -| main.rs:504:10:504:11 | x8 | semmle.label | x8 | -| main.rs:504:10:504:11 | x8 | semmle.label | x8 | | main.rs:506:9:506:10 | x9 | semmle.label | x9 | | main.rs:506:9:506:10 | x9 | semmle.label | x9 | | main.rs:506:14:506:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | @@ -838,6 +823,7 @@ subpaths | main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | main.rs:221:13:221:23 | apply(...) | | main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | main.rs:221:13:221:23 | apply(...) | testFailures +| main.rs:504:15:504:34 | //... | Missing result: hasValueFlow=29 | invalidSpecComponent #select | main.rs:16:10:16:20 | identity(...) | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:20 | identity(...) | $@ | main.rs:15:13:15:21 | source(...) | source(...) | @@ -915,8 +901,6 @@ invalidSpecComponent | main.rs:492:10:492:11 | x4 | main.rs:491:14:491:23 | source(...) | main.rs:492:10:492:11 | x4 | $@ | main.rs:491:14:491:23 | source(...) | source(...) | | main.rs:495:10:495:11 | x5 | main.rs:494:14:494:23 | source(...) | main.rs:495:10:495:11 | x5 | $@ | main.rs:494:14:494:23 | source(...) | source(...) | | main.rs:498:10:498:11 | x6 | main.rs:497:14:497:23 | source(...) | main.rs:498:10:498:11 | x6 | $@ | main.rs:497:14:497:23 | source(...) | source(...) | -| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | -| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | | main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | | main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index 1d5b0a506b7a..e4623b191643 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -8,7 +8,7 @@ extensions: - ["main::enum_source_nested", "ReturnValue.Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]", "test-source", "manual"] - ["::source", "ReturnValue.Field[main::MyFieldEnum::C::field_c]", "test-source", "manual"] - ["main::arg_source", "Argument[0]", "test-source", "manual"] - - ["main::MyTrait::test_param_source", "Parameter[0]", "test-source", "manual"] + - ["::test_param_source", "Parameter[0]", "test-source", "manual"] - ["main::source_into_function::pass_source", "Argument[1].Parameter[0]", "test-source", "manual"] - ["main::source_into_function::pass_source_nested", "Argument[1].Parameter[0].Field[main::MyFieldEnum::E::field_e].Field[core::option::Option::Some(0)]", "test-source", "manual"] - ["main::external_file::generated_source", "ReturnValue", "test-source", "dfc-generated"] # not actually generated, but we want to test behaviour of generated models here. @@ -48,7 +48,7 @@ extensions: - ["main::apply", "Argument[0]", "Argument[1].Parameter[0]", "value", "manual"] - ["main::apply", "Argument[1].ReturnValue", "ReturnValue", "value", "manual"] - ["main::get_async_number", "Argument[0]", "ReturnValue.Future", "value", "manual"] - - ["core::cmp::PartialOrd::lt", "Argument[self].Reference", "ReturnValue", "taint", "manual"] + - ["::lt", "Argument[self].Reference", "ReturnValue", "taint", "manual"] # Overwrites the generic trait model for i32 - ["::lt", "Argument[0]", "ReturnValue", "taint", "manual"] - ["main::external_file::generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] diff --git a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected index e59f8893b52e..a59260cd2694 100644 --- a/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/database/InlineFlow.expected @@ -1,98 +1,98 @@ models | 1 | Source: ::exec_iter; ReturnValue.Field[core::result::Result::Ok(0)].Element; database | -| 2 | Source: ::get; ReturnValue.Field[core::option::Option::Some(0)]; database | -| 3 | Source: ::get_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | -| 4 | Source: ::take; ReturnValue.Field[core::option::Option::Some(0)]; database | -| 5 | Source: ::take_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | -| 6 | Source: mysql::conn::queryable::Queryable::query_first; ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; database | -| 7 | Source: mysql::conn::queryable::Queryable::query_fold; Argument[2].Parameter[1]; database | -| 8 | Source: mysql::conn::queryable::Queryable::query_map; Argument[1].Parameter[0]; database | -| 9 | Source: mysql_async::queryable::Queryable::query_fold; Argument[2].Parameter[1]; database | -| 10 | Source: mysql_async::queryable::Queryable::query_map; Argument[1].Parameter[0]; database | -| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 12 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: core::ops::arith::Add::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 14 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | -| 15 | Summary: mysql::conn::queryable::Queryable::query_fold; Argument[2].ReturnValue; ReturnValue.Field[core::result::Result::Ok(0)]; value | -| 16 | Summary: mysql_async::queryable::Queryable::query_fold; Argument[2].ReturnValue; ReturnValue.Future.Field[core::result::Result::Ok(0)]; value | +| 2 | Source: ::query_first; ReturnValue.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; database | +| 3 | Source: ::query_fold; Argument[2].Parameter[1]; database | +| 4 | Source: ::query_map; Argument[1].Parameter[0]; database | +| 5 | Source: ::query_fold; Argument[2].Parameter[1]; database | +| 6 | Source: ::query_map; Argument[1].Parameter[0]; database | +| 7 | Source: ::get; ReturnValue.Field[core::option::Option::Some(0)]; database | +| 8 | Source: ::get_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | +| 9 | Source: ::take; ReturnValue.Field[core::option::Option::Some(0)]; database | +| 10 | Source: ::take_opt; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; database | +| 11 | Summary: ::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 12 | Summary: ::add; Argument[self,0]; ReturnValue; taint | +| 13 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 15 | Summary: ::query_fold; Argument[2].ReturnValue; ReturnValue.Field[core::result::Result::Ok(0)]; value | +| 16 | Summary: ::query_fold; Argument[2].ReturnValue; ReturnValue.Future.Field[core::result::Result::Ok(0)]; value | edges | test.rs:18:13:18:14 | v1 | test.rs:19:14:19:15 | v1 | provenance | | -| test.rs:18:24:18:33 | row.get(...) | test.rs:18:24:18:33 | row.get(...) [Some] | provenance | Src:MaD:2 | -| test.rs:18:24:18:33 | row.get(...) [Some] | test.rs:18:24:18:42 | ... .unwrap() | provenance | MaD:11 | +| test.rs:18:24:18:33 | row.get(...) | test.rs:18:24:18:33 | row.get(...) [Some] | provenance | Src:MaD:7 | +| test.rs:18:24:18:33 | row.get(...) [Some] | test.rs:18:24:18:42 | ... .unwrap() | provenance | MaD:13 | | test.rs:18:24:18:42 | ... .unwrap() | test.rs:18:13:18:14 | v1 | provenance | | | test.rs:21:13:21:14 | v2 | test.rs:22:14:22:15 | v2 | provenance | | -| test.rs:21:24:21:37 | row.get_opt(...) | test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:3 | -| test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | test.rs:21:24:21:46 | ... .unwrap() [Ok] | provenance | MaD:11 | -| test.rs:21:24:21:46 | ... .unwrap() [Ok] | test.rs:21:24:21:55 | ... .unwrap() | provenance | MaD:12 | +| test.rs:21:24:21:37 | row.get_opt(...) | test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:8 | +| test.rs:21:24:21:37 | row.get_opt(...) [Some, Ok] | test.rs:21:24:21:46 | ... .unwrap() [Ok] | provenance | MaD:13 | +| test.rs:21:24:21:46 | ... .unwrap() [Ok] | test.rs:21:24:21:55 | ... .unwrap() | provenance | MaD:14 | | test.rs:21:24:21:55 | ... .unwrap() | test.rs:21:13:21:14 | v2 | provenance | | | test.rs:24:13:24:14 | v3 | test.rs:25:14:25:15 | v3 | provenance | | -| test.rs:24:24:24:34 | row.take(...) | test.rs:24:24:24:34 | row.take(...) [Some] | provenance | Src:MaD:4 | -| test.rs:24:24:24:34 | row.take(...) [Some] | test.rs:24:24:24:43 | ... .unwrap() | provenance | MaD:11 | +| test.rs:24:24:24:34 | row.take(...) | test.rs:24:24:24:34 | row.take(...) [Some] | provenance | Src:MaD:9 | +| test.rs:24:24:24:34 | row.take(...) [Some] | test.rs:24:24:24:43 | ... .unwrap() | provenance | MaD:13 | | test.rs:24:24:24:43 | ... .unwrap() | test.rs:24:13:24:14 | v3 | provenance | | | test.rs:27:13:27:14 | v4 | test.rs:28:14:28:15 | v4 | provenance | | -| test.rs:27:24:27:38 | row.take_opt(...) | test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:5 | -| test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | test.rs:27:24:27:47 | ... .unwrap() [Ok] | provenance | MaD:11 | -| test.rs:27:24:27:47 | ... .unwrap() [Ok] | test.rs:27:24:27:56 | ... .unwrap() | provenance | MaD:12 | +| test.rs:27:24:27:38 | row.take_opt(...) | test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | +| test.rs:27:24:27:38 | row.take_opt(...) [Some, Ok] | test.rs:27:24:27:47 | ... .unwrap() [Ok] | provenance | MaD:13 | +| test.rs:27:24:27:47 | ... .unwrap() [Ok] | test.rs:27:24:27:56 | ... .unwrap() | provenance | MaD:14 | | test.rs:27:24:27:56 | ... .unwrap() | test.rs:27:13:27:14 | v4 | provenance | | | test.rs:37:13:37:14 | v6 | test.rs:38:14:38:15 | v6 | provenance | | -| test.rs:37:23:37:63 | conn.query_first(...) | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | provenance | Src:MaD:6 | +| test.rs:37:23:37:63 | conn.query_first(...) | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | provenance | Src:MaD:2 | | test.rs:37:23:37:63 | conn.query_first(...) [Ok, Some] | test.rs:37:23:37:64 | TryExpr [Some] | provenance | | -| test.rs:37:23:37:64 | TryExpr [Some] | test.rs:37:23:37:73 | ... .unwrap() | provenance | MaD:11 | +| test.rs:37:23:37:64 | TryExpr [Some] | test.rs:37:23:37:73 | ... .unwrap() | provenance | MaD:13 | | test.rs:37:23:37:73 | ... .unwrap() | test.rs:37:13:37:14 | v6 | provenance | | | test.rs:40:13:40:18 | mut t1 [element] | test.rs:42:20:42:21 | t1 [element] | provenance | | | test.rs:40:22:40:71 | conn.exec_iter(...) | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | provenance | Src:MaD:1 | | test.rs:40:22:40:71 | conn.exec_iter(...) [Ok, element] | test.rs:40:22:40:72 | TryExpr [element] | provenance | | | test.rs:40:22:40:72 | TryExpr [element] | test.rs:40:13:40:18 | mut t1 [element] | provenance | | -| test.rs:41:14:41:61 | ... .get(...) | test.rs:41:14:41:61 | ... .get(...) [Some] | provenance | Src:MaD:2 | -| test.rs:41:14:41:61 | ... .get(...) [Some] | test.rs:41:14:41:70 | ... .unwrap() | provenance | MaD:11 | +| test.rs:41:14:41:61 | ... .get(...) | test.rs:41:14:41:61 | ... .get(...) [Some] | provenance | Src:MaD:7 | +| test.rs:41:14:41:61 | ... .get(...) [Some] | test.rs:41:14:41:70 | ... .unwrap() | provenance | MaD:13 | | test.rs:42:13:42:15 | row | test.rs:44:22:44:22 | v | provenance | | | test.rs:42:20:42:21 | t1 [element] | test.rs:42:13:42:15 | row | provenance | | -| test.rs:50:13:52:13 | \|...\| ... | test.rs:51:22:51:27 | values | provenance | Src:MaD:8 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:58:22:58:29 | values.0 | provenance | Src:MaD:8 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:59:22:59:29 | values.1 | provenance | Src:MaD:8 | -| test.rs:57:13:61:13 | \|...\| ... | test.rs:60:22:60:29 | values.2 | provenance | Src:MaD:8 | +| test.rs:50:13:52:13 | \|...\| ... | test.rs:51:22:51:27 | values | provenance | Src:MaD:4 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:58:22:58:29 | values.0 | provenance | Src:MaD:4 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:59:22:59:29 | values.1 | provenance | Src:MaD:4 | +| test.rs:57:13:61:13 | \|...\| ... | test.rs:60:22:60:29 | values.2 | provenance | Src:MaD:4 | | test.rs:64:13:64:17 | total | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:13:64:17 | total [Wrapping] | test.rs:68:14:68:18 | total | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | test.rs:64:21:67:11 | TryExpr [Wrapping] | provenance | | | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | test.rs:64:21:67:11 | TryExpr | provenance | | | test.rs:64:21:67:11 | TryExpr | test.rs:64:13:64:17 | total | provenance | | | test.rs:64:21:67:11 | TryExpr [Wrapping] | test.rs:64:13:64:17 | total [Wrapping] | provenance | | -| test.rs:64:65:67:9 | \|...\| ... | test.rs:65:18:65:20 | row | provenance | Src:MaD:7 | -| test.rs:64:65:67:9 | \|...\| ... | test.rs:66:19:66:21 | row | provenance | Src:MaD:7 | +| test.rs:64:65:67:9 | \|...\| ... | test.rs:65:18:65:20 | row | provenance | Src:MaD:3 | +| test.rs:64:65:67:9 | \|...\| ... | test.rs:66:19:66:21 | row | provenance | Src:MaD:3 | | test.rs:64:86:67:9 | { ... } | test.rs:64:21:67:10 | conn.query_fold(...) [Ok] | provenance | MaD:15 | | test.rs:64:86:67:9 | { ... } [Wrapping] | test.rs:64:21:67:10 | conn.query_fold(...) [Ok, Wrapping] | provenance | MaD:15 | | test.rs:66:13:66:21 | ... + ... | test.rs:64:86:67:9 | { ... } | provenance | | | test.rs:66:13:66:21 | ... + ... [Wrapping] | test.rs:64:86:67:9 | { ... } [Wrapping] | provenance | | -| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:14 | -| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... [Wrapping] | provenance | MaD:13 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:71:17:71:18 | id | provenance | Src:MaD:7 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:72:17:72:20 | name | provenance | Src:MaD:7 | -| test.rs:70:72:78:9 | \|...\| ... | test.rs:73:17:73:19 | age | provenance | Src:MaD:7 | +| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... | provenance | MaD:12 | +| test.rs:66:19:66:21 | row | test.rs:66:13:66:21 | ... + ... [Wrapping] | provenance | MaD:11 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:71:17:71:18 | id | provenance | Src:MaD:3 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:72:17:72:20 | name | provenance | Src:MaD:3 | +| test.rs:70:72:78:9 | \|...\| ... | test.rs:73:17:73:19 | age | provenance | Src:MaD:3 | | test.rs:71:17:71:18 | id | test.rs:74:18:74:19 | id | provenance | | | test.rs:72:17:72:20 | name | test.rs:75:18:75:21 | name | provenance | | | test.rs:73:17:73:19 | age | test.rs:76:18:76:20 | age | provenance | | | test.rs:105:13:105:14 | v1 | test.rs:106:14:106:15 | v1 | provenance | | -| test.rs:105:24:105:33 | row.get(...) | test.rs:105:24:105:33 | row.get(...) [Some] | provenance | Src:MaD:2 | -| test.rs:105:24:105:33 | row.get(...) [Some] | test.rs:105:24:105:42 | ... .unwrap() | provenance | MaD:11 | +| test.rs:105:24:105:33 | row.get(...) | test.rs:105:24:105:33 | row.get(...) [Some] | provenance | Src:MaD:7 | +| test.rs:105:24:105:33 | row.get(...) [Some] | test.rs:105:24:105:42 | ... .unwrap() | provenance | MaD:13 | | test.rs:105:24:105:42 | ... .unwrap() | test.rs:105:13:105:14 | v1 | provenance | | | test.rs:108:13:108:14 | v2 | test.rs:109:14:109:15 | v2 | provenance | | -| test.rs:108:24:108:37 | row.get_opt(...) | test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:3 | -| test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | test.rs:108:24:108:46 | ... .unwrap() [Ok] | provenance | MaD:11 | -| test.rs:108:24:108:46 | ... .unwrap() [Ok] | test.rs:108:24:108:55 | ... .unwrap() | provenance | MaD:12 | +| test.rs:108:24:108:37 | row.get_opt(...) | test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | provenance | Src:MaD:8 | +| test.rs:108:24:108:37 | row.get_opt(...) [Some, Ok] | test.rs:108:24:108:46 | ... .unwrap() [Ok] | provenance | MaD:13 | +| test.rs:108:24:108:46 | ... .unwrap() [Ok] | test.rs:108:24:108:55 | ... .unwrap() | provenance | MaD:14 | | test.rs:108:24:108:55 | ... .unwrap() | test.rs:108:13:108:14 | v2 | provenance | | | test.rs:111:13:111:14 | v3 | test.rs:112:14:112:15 | v3 | provenance | | -| test.rs:111:24:111:34 | row.take(...) | test.rs:111:24:111:34 | row.take(...) [Some] | provenance | Src:MaD:4 | -| test.rs:111:24:111:34 | row.take(...) [Some] | test.rs:111:24:111:43 | ... .unwrap() | provenance | MaD:11 | +| test.rs:111:24:111:34 | row.take(...) | test.rs:111:24:111:34 | row.take(...) [Some] | provenance | Src:MaD:9 | +| test.rs:111:24:111:34 | row.take(...) [Some] | test.rs:111:24:111:43 | ... .unwrap() | provenance | MaD:13 | | test.rs:111:24:111:43 | ... .unwrap() | test.rs:111:13:111:14 | v3 | provenance | | | test.rs:114:13:114:14 | v4 | test.rs:115:14:115:15 | v4 | provenance | | -| test.rs:114:24:114:38 | row.take_opt(...) | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:5 | -| test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | test.rs:114:24:114:47 | ... .unwrap() [Ok] | provenance | MaD:11 | -| test.rs:114:24:114:47 | ... .unwrap() [Ok] | test.rs:114:24:114:56 | ... .unwrap() | provenance | MaD:12 | +| test.rs:114:24:114:38 | row.take_opt(...) | test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | provenance | Src:MaD:10 | +| test.rs:114:24:114:38 | row.take_opt(...) [Some, Ok] | test.rs:114:24:114:47 | ... .unwrap() [Ok] | provenance | MaD:13 | +| test.rs:114:24:114:47 | ... .unwrap() [Ok] | test.rs:114:24:114:56 | ... .unwrap() | provenance | MaD:14 | | test.rs:114:24:114:56 | ... .unwrap() | test.rs:114:13:114:14 | v4 | provenance | | -| test.rs:137:13:139:13 | \|...\| ... | test.rs:138:22:138:27 | values | provenance | Src:MaD:10 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:145:22:145:29 | values.0 | provenance | Src:MaD:10 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:146:22:146:29 | values.1 | provenance | Src:MaD:10 | -| test.rs:144:13:148:13 | \|...\| ... | test.rs:147:22:147:29 | values.2 | provenance | Src:MaD:10 | +| test.rs:137:13:139:13 | \|...\| ... | test.rs:138:22:138:27 | values | provenance | Src:MaD:6 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:145:22:145:29 | values.0 | provenance | Src:MaD:6 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:146:22:146:29 | values.1 | provenance | Src:MaD:6 | +| test.rs:144:13:148:13 | \|...\| ... | test.rs:147:22:147:29 | values.2 | provenance | Src:MaD:6 | | test.rs:151:13:151:17 | total | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:13:151:17 | total [Wrapping] | test.rs:155:14:155:18 | total | provenance | | | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | test.rs:151:21:154:16 | await ... [Ok, Wrapping] | provenance | | @@ -101,17 +101,17 @@ edges | test.rs:151:21:154:16 | await ... [Ok] | test.rs:151:21:154:17 | TryExpr | provenance | | | test.rs:151:21:154:17 | TryExpr | test.rs:151:13:151:17 | total | provenance | | | test.rs:151:21:154:17 | TryExpr [Wrapping] | test.rs:151:13:151:17 | total [Wrapping] | provenance | | -| test.rs:151:65:154:9 | \|...\| ... | test.rs:152:18:152:20 | row | provenance | Src:MaD:9 | -| test.rs:151:65:154:9 | \|...\| ... | test.rs:153:19:153:21 | row | provenance | Src:MaD:9 | +| test.rs:151:65:154:9 | \|...\| ... | test.rs:152:18:152:20 | row | provenance | Src:MaD:5 | +| test.rs:151:65:154:9 | \|...\| ... | test.rs:153:19:153:21 | row | provenance | Src:MaD:5 | | test.rs:151:86:154:9 | { ... } | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok] | provenance | MaD:16 | | test.rs:151:86:154:9 | { ... } [Wrapping] | test.rs:151:21:154:10 | conn.query_fold(...) [future, Ok, Wrapping] | provenance | MaD:16 | | test.rs:153:13:153:21 | ... + ... | test.rs:151:86:154:9 | { ... } | provenance | | | test.rs:153:13:153:21 | ... + ... [Wrapping] | test.rs:151:86:154:9 | { ... } [Wrapping] | provenance | | -| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:14 | -| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... [Wrapping] | provenance | MaD:13 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:158:17:158:18 | id | provenance | Src:MaD:9 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:159:17:159:20 | name | provenance | Src:MaD:9 | -| test.rs:157:72:165:9 | \|...\| ... | test.rs:160:17:160:19 | age | provenance | Src:MaD:9 | +| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... | provenance | MaD:12 | +| test.rs:153:19:153:21 | row | test.rs:153:13:153:21 | ... + ... [Wrapping] | provenance | MaD:11 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:158:17:158:18 | id | provenance | Src:MaD:5 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:159:17:159:20 | name | provenance | Src:MaD:5 | +| test.rs:157:72:165:9 | \|...\| ... | test.rs:160:17:160:19 | age | provenance | Src:MaD:5 | | test.rs:158:17:158:18 | id | test.rs:161:18:161:19 | id | provenance | | | test.rs:159:17:159:20 | name | test.rs:162:18:162:21 | name | provenance | | | test.rs:160:17:160:19 | age | test.rs:163:18:163:20 | age | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected index 5f09299d8536..1cfff2c68405 100644 --- a/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/env/InlineFlow.expected @@ -9,23 +9,23 @@ models | 8 | Source: std::env::vars; ReturnValue.Element; environment | | 9 | Source: std::env::vars_os; ReturnValue.Element; environment | | 10 | Summary: ::deref; Argument[self]; ReturnValue; value | -| 11 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 12 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 13 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 15 | Summary: core::iter::traits::iterator::Iterator::collect; Argument[self].Element; ReturnValue.Element; value | -| 16 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 17 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 11 | Summary: ::collect; Argument[self].Element; ReturnValue.Element; value | +| 12 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 13 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 14 | Summary: ::expect; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 15 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 16 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 17 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | edges | test.rs:6:10:6:30 | ...::var(...) | test.rs:6:10:6:30 | ...::var(...) | provenance | Src:MaD:6 | | test.rs:7:10:7:33 | ...::var_os(...) | test.rs:7:10:7:33 | ...::var_os(...) | provenance | Src:MaD:7 | | test.rs:9:9:9:12 | var1 | test.rs:12:10:12:13 | var1 | provenance | | | test.rs:9:16:9:36 | ...::var(...) | test.rs:9:16:9:36 | ...::var(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:9:16:9:36 | ...::var(...) [Ok] | test.rs:9:16:9:59 | ... .expect(...) | provenance | MaD:13 | +| test.rs:9:16:9:36 | ...::var(...) [Ok] | test.rs:9:16:9:59 | ... .expect(...) | provenance | MaD:16 | | test.rs:9:16:9:59 | ... .expect(...) | test.rs:9:9:9:12 | var1 | provenance | | | test.rs:10:9:10:12 | var2 | test.rs:13:10:13:13 | var2 | provenance | | | test.rs:10:16:10:39 | ...::var_os(...) | test.rs:10:16:10:39 | ...::var_os(...) [Some] | provenance | Src:MaD:7 | -| test.rs:10:16:10:39 | ...::var_os(...) [Some] | test.rs:10:16:10:48 | ... .unwrap() | provenance | MaD:12 | +| test.rs:10:16:10:39 | ...::var_os(...) [Some] | test.rs:10:16:10:48 | ... .unwrap() | provenance | MaD:15 | | test.rs:10:16:10:48 | ... .unwrap() | test.rs:10:9:10:12 | var2 | provenance | | | test.rs:15:9:15:20 | TuplePat | test.rs:16:14:16:16 | key | provenance | | | test.rs:15:9:15:20 | TuplePat | test.rs:17:14:17:18 | value | provenance | | @@ -38,32 +38,32 @@ edges | test.rs:27:9:27:12 | args [element] | test.rs:28:20:28:23 | args [element] | provenance | | | test.rs:27:9:27:12 | args [element] | test.rs:29:17:29:20 | args [element] | provenance | | | test.rs:27:29:27:44 | ...::args(...) | test.rs:27:29:27:44 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:27:29:27:44 | ...::args(...) [element] | test.rs:27:29:27:54 | ... .collect() [element] | provenance | MaD:15 | +| test.rs:27:29:27:44 | ...::args(...) [element] | test.rs:27:29:27:54 | ... .collect() [element] | provenance | MaD:11 | | test.rs:27:29:27:54 | ... .collect() [element] | test.rs:27:9:27:12 | args [element] | provenance | | | test.rs:28:9:28:15 | my_path [&ref] | test.rs:34:10:34:16 | my_path | provenance | | | test.rs:28:19:28:26 | &... [&ref] | test.rs:28:9:28:15 | my_path [&ref] | provenance | | -| test.rs:28:20:28:23 | args [element] | test.rs:28:20:28:26 | args[0] | provenance | MaD:17 | +| test.rs:28:20:28:23 | args [element] | test.rs:28:20:28:26 | args[0] | provenance | MaD:13 | | test.rs:28:20:28:26 | args[0] | test.rs:28:19:28:26 | &... [&ref] | provenance | | | test.rs:29:9:29:12 | arg1 [&ref] | test.rs:35:10:35:13 | arg1 | provenance | | | test.rs:29:16:29:23 | &... [&ref] | test.rs:29:9:29:12 | arg1 [&ref] | provenance | | -| test.rs:29:17:29:20 | args [element] | test.rs:29:17:29:23 | args[1] | provenance | MaD:17 | +| test.rs:29:17:29:20 | args [element] | test.rs:29:17:29:23 | args[1] | provenance | MaD:13 | | test.rs:29:17:29:23 | args[1] | test.rs:29:16:29:23 | &... [&ref] | provenance | | | test.rs:30:9:30:12 | arg2 | test.rs:36:10:36:13 | arg2 | provenance | | | test.rs:30:16:30:31 | ...::args(...) | test.rs:30:16:30:31 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:30:16:30:31 | ...::args(...) [element] | test.rs:30:16:30:38 | ... .nth(...) [Some] | provenance | MaD:16 | -| test.rs:30:16:30:38 | ... .nth(...) [Some] | test.rs:30:16:30:47 | ... .unwrap() | provenance | MaD:12 | +| test.rs:30:16:30:31 | ...::args(...) [element] | test.rs:30:16:30:38 | ... .nth(...) [Some] | provenance | MaD:12 | +| test.rs:30:16:30:38 | ... .nth(...) [Some] | test.rs:30:16:30:47 | ... .unwrap() | provenance | MaD:15 | | test.rs:30:16:30:47 | ... .unwrap() | test.rs:30:9:30:12 | arg2 | provenance | | | test.rs:31:9:31:12 | arg3 | test.rs:37:10:37:13 | arg3 | provenance | | | test.rs:31:16:31:34 | ...::args_os(...) | test.rs:31:16:31:34 | ...::args_os(...) [element] | provenance | Src:MaD:2 | -| test.rs:31:16:31:34 | ...::args_os(...) [element] | test.rs:31:16:31:41 | ... .nth(...) [Some] | provenance | MaD:16 | -| test.rs:31:16:31:41 | ... .nth(...) [Some] | test.rs:31:16:31:50 | ... .unwrap() | provenance | MaD:12 | +| test.rs:31:16:31:34 | ...::args_os(...) [element] | test.rs:31:16:31:41 | ... .nth(...) [Some] | provenance | MaD:12 | +| test.rs:31:16:31:41 | ... .nth(...) [Some] | test.rs:31:16:31:50 | ... .unwrap() | provenance | MaD:15 | | test.rs:31:16:31:50 | ... .unwrap() | test.rs:31:9:31:12 | arg3 | provenance | | | test.rs:32:9:32:12 | arg4 | test.rs:38:10:38:13 | arg4 | provenance | | | test.rs:32:16:32:31 | ...::args(...) | test.rs:32:16:32:31 | ...::args(...) [element] | provenance | Src:MaD:1 | -| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:16 | -| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:12 | +| test.rs:32:16:32:31 | ...::args(...) [element] | test.rs:32:16:32:38 | ... .nth(...) [Some] | provenance | MaD:12 | +| test.rs:32:16:32:38 | ... .nth(...) [Some] | test.rs:32:16:32:47 | ... .unwrap() | provenance | MaD:15 | | test.rs:32:16:32:47 | ... .unwrap() | test.rs:32:16:32:64 | ... .parse() [Ok] | provenance | MaD:10 | -| test.rs:32:16:32:64 | ... .parse() [Ok] | test.rs:32:16:32:73 | ... .unwrap() | provenance | MaD:14 | +| test.rs:32:16:32:64 | ... .parse() [Ok] | test.rs:32:16:32:73 | ... .unwrap() | provenance | MaD:17 | | test.rs:32:16:32:73 | ... .unwrap() | test.rs:32:9:32:12 | arg4 | provenance | | | test.rs:40:9:40:11 | arg | test.rs:41:14:41:16 | arg | provenance | | | test.rs:40:16:40:31 | ...::args(...) | test.rs:40:16:40:31 | ...::args(...) [element] | provenance | Src:MaD:1 | @@ -73,15 +73,15 @@ edges | test.rs:44:16:44:34 | ...::args_os(...) [element] | test.rs:44:9:44:11 | arg | provenance | | | test.rs:50:9:50:11 | dir | test.rs:54:10:54:12 | dir | provenance | | | test.rs:50:15:50:37 | ...::current_dir(...) | test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | provenance | Src:MaD:3 | -| test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | test.rs:50:15:50:54 | ... .expect(...) | provenance | MaD:13 | +| test.rs:50:15:50:37 | ...::current_dir(...) [Ok] | test.rs:50:15:50:54 | ... .expect(...) | provenance | MaD:16 | | test.rs:50:15:50:54 | ... .expect(...) | test.rs:50:9:50:11 | dir | provenance | | | test.rs:51:9:51:11 | exe | test.rs:55:10:55:12 | exe | provenance | | | test.rs:51:15:51:37 | ...::current_exe(...) | test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | provenance | Src:MaD:4 | -| test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | test.rs:51:15:51:54 | ... .expect(...) | provenance | MaD:13 | +| test.rs:51:15:51:37 | ...::current_exe(...) [Ok] | test.rs:51:15:51:54 | ... .expect(...) | provenance | MaD:16 | | test.rs:51:15:51:54 | ... .expect(...) | test.rs:51:9:51:11 | exe | provenance | | | test.rs:52:9:52:12 | home | test.rs:56:10:56:13 | home | provenance | | | test.rs:52:16:52:35 | ...::home_dir(...) | test.rs:52:16:52:35 | ...::home_dir(...) [Some] | provenance | Src:MaD:5 | -| test.rs:52:16:52:35 | ...::home_dir(...) [Some] | test.rs:52:16:52:52 | ... .expect(...) | provenance | MaD:11 | +| test.rs:52:16:52:35 | ...::home_dir(...) [Some] | test.rs:52:16:52:52 | ... .expect(...) | provenance | MaD:14 | | test.rs:52:16:52:52 | ... .expect(...) | test.rs:52:9:52:12 | home | provenance | | nodes | test.rs:6:10:6:30 | ...::var(...) | semmle.label | ...::var(...) | diff --git a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected index 77cebe65dd52..03e1db8d327c 100644 --- a/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/file/InlineFlow.expected @@ -16,35 +16,35 @@ models | 15 | Source: tokio::fs::read_link::read_link; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | | 16 | Source: tokio::fs::read_to_string::read_to_string; ReturnValue.Future.Field[core::result::Result::Ok(0)]; file | | 17 | Summary: ::to_mut; Argument[self].Reference.Field[alloc::borrow::Cow::Owned(0)]; ReturnValue.Reference; value | -| 18 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 19 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 20 | Summary: ::deref; Argument[self].Reference; ReturnValue.Reference; taint | -| 21 | Summary: ::into_string; Argument[self].Field[std::ffi::os_str::OsString::inner].Field[std::sys::os_str::bytes::Buf::inner]; ReturnValue.Field[core::result::Result::Ok(0)].Field[alloc::string::String::vec]; value | -| 22 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 23 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 24 | Summary: ::from; Argument[0]; ReturnValue.Field[std::path::PathBuf::inner]; value | -| 25 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | -| 26 | Summary: ::as_path; Argument[self].Reference; ReturnValue.Reference; value | -| 27 | Summary: ::into_boxed_path; Argument[self]; ReturnValue.Field[alloc::boxed::Box(0)]; taint | -| 28 | Summary: ::into_os_string; Argument[self].Field[std::path::PathBuf::inner]; ReturnValue; value | -| 29 | Summary: async_std::io::read::ReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | -| 30 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 31 | Summary: std::io::Read::bytes; Argument[self]; ReturnValue; taint | -| 32 | Summary: std::io::Read::chain; Argument[0]; ReturnValue; taint | -| 33 | Summary: std::io::Read::chain; Argument[self]; ReturnValue; taint | -| 34 | Summary: std::io::Read::read; Argument[self].Reference; Argument[0].Reference; taint | -| 35 | Summary: std::io::Read::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 36 | Summary: std::io::Read::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 37 | Summary: std::io::Read::take; Argument[self]; ReturnValue; taint | -| 38 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | -| 39 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_buf; Argument[self].Reference; Argument[0].Reference; taint | -| 40 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 41 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 42 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 43 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 44 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 45 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 46 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 18 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 19 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 20 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 21 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 22 | Summary: ::deref; Argument[self].Reference; ReturnValue.Reference; taint | +| 23 | Summary: ::into_string; Argument[self].Field[std::ffi::os_str::OsString::inner].Field[std::sys::os_str::bytes::Buf::inner]; ReturnValue.Field[core::result::Result::Ok(0)].Field[alloc::string::String::vec]; value | +| 24 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 25 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 26 | Summary: ::bytes; Argument[self]; ReturnValue; taint | +| 27 | Summary: ::chain; Argument[0]; ReturnValue; taint | +| 28 | Summary: ::chain; Argument[self]; ReturnValue; taint | +| 29 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 30 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 31 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 32 | Summary: ::take; Argument[self]; ReturnValue; taint | +| 33 | Summary: ::from; Argument[0]; ReturnValue.Field[std::path::PathBuf::inner]; value | +| 34 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | +| 35 | Summary: ::as_path; Argument[self].Reference; ReturnValue.Reference; value | +| 36 | Summary: ::into_boxed_path; Argument[self]; ReturnValue.Field[alloc::boxed::Box(0)]; taint | +| 37 | Summary: ::into_os_string; Argument[self].Field[std::path::PathBuf::inner]; ReturnValue; value | +| 38 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 39 | Summary: ::read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 40 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 41 | Summary: ::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 42 | Summary: ::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 43 | Summary: ::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 44 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 45 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 46 | Summary: ::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | edges | test.rs:12:13:12:18 | buffer | test.rs:13:14:13:19 | buffer | provenance | | | test.rs:12:31:12:55 | ...::read(...) | test.rs:12:31:12:55 | ...::read(...) [Ok] | provenance | Src:MaD:11 | @@ -71,26 +71,26 @@ edges | test.rs:30:13:30:16 | path | test.rs:41:14:41:17 | path | provenance | | | test.rs:30:13:30:16 | path | test.rs:42:14:42:17 | path | provenance | | | test.rs:30:20:30:27 | e.path() | test.rs:30:13:30:16 | path | provenance | Src:MaD:4 | -| test.rs:31:14:31:17 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:30 | -| test.rs:32:14:32:17 | path | test.rs:32:14:32:25 | path.clone() | provenance | MaD:30 | -| test.rs:32:14:32:25 | path.clone() | test.rs:32:14:32:35 | ... .as_path() | provenance | MaD:26 | -| test.rs:33:14:33:17 | path | test.rs:33:14:33:25 | path.clone() | provenance | MaD:30 | -| test.rs:33:14:33:25 | path.clone() | test.rs:33:14:33:42 | ... .into_os_string() | provenance | MaD:28 | -| test.rs:34:39:34:42 | path | test.rs:34:39:34:50 | path.clone() | provenance | MaD:30 | -| test.rs:34:39:34:50 | path.clone() | test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | provenance | MaD:27 | -| test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | test.rs:34:14:34:69 | ...::from(...) | provenance | MaD:24 | -| test.rs:35:14:35:17 | path | test.rs:35:14:35:25 | path.clone() | provenance | MaD:30 | -| test.rs:35:14:35:25 | path.clone() | test.rs:35:14:35:37 | ... .as_os_str() | provenance | MaD:25 | -| test.rs:36:14:36:17 | path | test.rs:36:14:36:25 | path.clone() | provenance | MaD:30 | -| test.rs:36:14:36:25 | path.clone() | test.rs:36:14:36:41 | ... .as_mut_os_str() | provenance | MaD:25 | -| test.rs:37:14:37:17 | path | test.rs:37:14:37:26 | path.to_str() | provenance | MaD:25 | -| test.rs:38:14:38:17 | path | test.rs:38:14:38:31 | path.to_path_buf() | provenance | MaD:25 | -| test.rs:39:14:39:17 | path | test.rs:39:14:39:29 | path.file_name() [Some, &ref] | provenance | MaD:25 | -| test.rs:39:14:39:29 | path.file_name() [Some, &ref] | test.rs:39:14:39:38 | ... .unwrap() | provenance | MaD:18 | -| test.rs:40:14:40:17 | path | test.rs:40:14:40:29 | path.extension() [Some, &ref] | provenance | MaD:25 | -| test.rs:40:14:40:29 | path.extension() [Some, &ref] | test.rs:40:14:40:38 | ... .unwrap() | provenance | MaD:18 | -| test.rs:41:14:41:17 | path | test.rs:41:14:41:32 | path.canonicalize() [Ok] | provenance | MaD:25 | -| test.rs:41:14:41:32 | path.canonicalize() [Ok] | test.rs:41:14:41:41 | ... .unwrap() | provenance | MaD:19 | +| test.rs:31:14:31:17 | path | test.rs:31:14:31:25 | path.clone() | provenance | MaD:19 | +| test.rs:32:14:32:17 | path | test.rs:32:14:32:25 | path.clone() | provenance | MaD:19 | +| test.rs:32:14:32:25 | path.clone() | test.rs:32:14:32:35 | ... .as_path() | provenance | MaD:35 | +| test.rs:33:14:33:17 | path | test.rs:33:14:33:25 | path.clone() | provenance | MaD:19 | +| test.rs:33:14:33:25 | path.clone() | test.rs:33:14:33:42 | ... .into_os_string() | provenance | MaD:37 | +| test.rs:34:39:34:42 | path | test.rs:34:39:34:50 | path.clone() | provenance | MaD:19 | +| test.rs:34:39:34:50 | path.clone() | test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | provenance | MaD:36 | +| test.rs:34:39:34:68 | ... .into_boxed_path() [Box(0)] | test.rs:34:14:34:69 | ...::from(...) | provenance | MaD:33 | +| test.rs:35:14:35:17 | path | test.rs:35:14:35:25 | path.clone() | provenance | MaD:19 | +| test.rs:35:14:35:25 | path.clone() | test.rs:35:14:35:37 | ... .as_os_str() | provenance | MaD:34 | +| test.rs:36:14:36:17 | path | test.rs:36:14:36:25 | path.clone() | provenance | MaD:19 | +| test.rs:36:14:36:25 | path.clone() | test.rs:36:14:36:41 | ... .as_mut_os_str() | provenance | MaD:34 | +| test.rs:37:14:37:17 | path | test.rs:37:14:37:26 | path.to_str() | provenance | MaD:34 | +| test.rs:38:14:38:17 | path | test.rs:38:14:38:31 | path.to_path_buf() | provenance | MaD:34 | +| test.rs:39:14:39:17 | path | test.rs:39:14:39:29 | path.file_name() [Some, &ref] | provenance | MaD:34 | +| test.rs:39:14:39:29 | path.file_name() [Some, &ref] | test.rs:39:14:39:38 | ... .unwrap() | provenance | MaD:20 | +| test.rs:40:14:40:17 | path | test.rs:40:14:40:29 | path.extension() [Some, &ref] | provenance | MaD:34 | +| test.rs:40:14:40:29 | path.extension() [Some, &ref] | test.rs:40:14:40:38 | ... .unwrap() | provenance | MaD:20 | +| test.rs:41:14:41:17 | path | test.rs:41:14:41:32 | path.canonicalize() [Ok] | provenance | MaD:34 | +| test.rs:41:14:41:32 | path.canonicalize() [Ok] | test.rs:41:14:41:41 | ... .unwrap() | provenance | MaD:21 | | test.rs:44:13:44:21 | file_name | test.rs:45:14:45:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:46:14:46:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:47:14:47:22 | file_name | provenance | | @@ -98,16 +98,16 @@ edges | test.rs:44:13:44:21 | file_name | test.rs:49:14:49:22 | file_name | provenance | | | test.rs:44:13:44:21 | file_name | test.rs:50:14:50:22 | file_name | provenance | | | test.rs:44:25:44:37 | e.file_name() | test.rs:44:13:44:21 | file_name | provenance | Src:MaD:3 | -| test.rs:45:14:45:22 | file_name | test.rs:45:14:45:30 | file_name.clone() | provenance | MaD:30 | -| test.rs:46:14:46:22 | file_name | test.rs:46:14:46:30 | file_name.clone() | provenance | MaD:30 | -| test.rs:46:14:46:30 | file_name.clone() | test.rs:46:14:46:44 | ... .into_string() [Ok, String] | provenance | MaD:21 | -| test.rs:46:14:46:44 | ... .into_string() [Ok, String] | test.rs:46:14:46:53 | ... .unwrap() | provenance | MaD:19 | -| test.rs:47:14:47:22 | file_name | test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | provenance | MaD:20 | -| test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | test.rs:47:14:47:40 | ... .unwrap() | provenance | MaD:18 | -| test.rs:48:14:48:22 | file_name | test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | provenance | MaD:20 | +| test.rs:45:14:45:22 | file_name | test.rs:45:14:45:30 | file_name.clone() | provenance | MaD:19 | +| test.rs:46:14:46:22 | file_name | test.rs:46:14:46:30 | file_name.clone() | provenance | MaD:19 | +| test.rs:46:14:46:30 | file_name.clone() | test.rs:46:14:46:44 | ... .into_string() [Ok, String] | provenance | MaD:23 | +| test.rs:46:14:46:44 | ... .into_string() [Ok, String] | test.rs:46:14:46:53 | ... .unwrap() | provenance | MaD:21 | +| test.rs:47:14:47:22 | file_name | test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | provenance | MaD:22 | +| test.rs:47:14:47:31 | file_name.to_str() [Some, &ref] | test.rs:47:14:47:40 | ... .unwrap() | provenance | MaD:20 | +| test.rs:48:14:48:22 | file_name | test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | provenance | MaD:22 | | test.rs:48:14:48:40 | file_name.to_string_lossy() [Owned] | test.rs:48:14:48:49 | ... .to_mut() | provenance | MaD:17 | -| test.rs:49:14:49:22 | file_name | test.rs:49:14:49:30 | file_name.clone() | provenance | MaD:30 | -| test.rs:49:14:49:30 | file_name.clone() | test.rs:49:14:49:49 | ... .as_encoded_bytes() | provenance | MaD:20 | +| test.rs:49:14:49:22 | file_name | test.rs:49:14:49:30 | file_name.clone() | provenance | MaD:19 | +| test.rs:49:14:49:30 | file_name.clone() | test.rs:49:14:49:49 | ... .as_encoded_bytes() | provenance | MaD:22 | | test.rs:68:13:68:18 | target | test.rs:69:14:69:19 | target | provenance | | | test.rs:68:22:68:49 | ...::read_link(...) | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | provenance | Src:MaD:12 | | test.rs:68:22:68:49 | ...::read_link(...) [Ok] | test.rs:68:22:68:50 | TryExpr | provenance | | @@ -144,45 +144,45 @@ edges | test.rs:110:20:110:50 | ...::open(...) | test.rs:110:20:110:50 | ...::open(...) [Ok] | provenance | Src:MaD:5 | | test.rs:110:20:110:50 | ...::open(...) [Ok] | test.rs:110:20:110:51 | TryExpr | provenance | | | test.rs:110:20:110:51 | TryExpr | test.rs:110:9:110:16 | mut file | provenance | | -| test.rs:114:22:114:25 | file | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:114:22:114:25 | file | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:114:32:114:42 | [post] &mut buffer [&ref] | test.rs:114:37:114:42 | [post] buffer | provenance | | | test.rs:114:37:114:42 | [post] buffer | test.rs:115:15:115:20 | buffer | provenance | | | test.rs:115:15:115:20 | buffer | test.rs:115:14:115:20 | &buffer | provenance | | -| test.rs:120:22:120:25 | file | test.rs:120:39:120:49 | [post] &mut buffer [&ref] | provenance | MaD:22 | +| test.rs:120:22:120:25 | file | test.rs:120:39:120:49 | [post] &mut buffer [&ref] | provenance | MaD:24 | | test.rs:120:39:120:49 | [post] &mut buffer [&ref] | test.rs:120:44:120:49 | [post] buffer | provenance | | | test.rs:120:44:120:49 | [post] buffer | test.rs:121:15:121:20 | buffer | provenance | | | test.rs:121:15:121:20 | buffer | test.rs:121:14:121:20 | &buffer | provenance | | -| test.rs:126:22:126:25 | file | test.rs:126:42:126:52 | [post] &mut buffer [&ref] | provenance | MaD:23 | +| test.rs:126:22:126:25 | file | test.rs:126:42:126:52 | [post] &mut buffer [&ref] | provenance | MaD:25 | | test.rs:126:42:126:52 | [post] &mut buffer [&ref] | test.rs:126:47:126:52 | [post] buffer | provenance | | | test.rs:126:47:126:52 | [post] buffer | test.rs:127:15:127:20 | buffer | provenance | | | test.rs:127:15:127:20 | buffer | test.rs:127:14:127:20 | &buffer | provenance | | -| test.rs:132:9:132:12 | file | test.rs:132:25:132:35 | [post] &mut buffer [&ref] | provenance | MaD:35 | +| test.rs:132:9:132:12 | file | test.rs:132:25:132:35 | [post] &mut buffer [&ref] | provenance | MaD:30 | | test.rs:132:25:132:35 | [post] &mut buffer [&ref] | test.rs:132:30:132:35 | [post] buffer | provenance | | | test.rs:132:30:132:35 | [post] buffer | test.rs:133:15:133:20 | buffer | provenance | | | test.rs:133:15:133:20 | buffer | test.rs:133:14:133:20 | &buffer | provenance | | -| test.rs:136:17:136:20 | file | test.rs:136:17:136:28 | file.bytes() | provenance | MaD:31 | +| test.rs:136:17:136:20 | file | test.rs:136:17:136:28 | file.bytes() | provenance | MaD:26 | | test.rs:136:17:136:28 | file.bytes() | test.rs:137:14:137:17 | byte | provenance | | | test.rs:143:13:143:18 | mut f1 | test.rs:145:22:145:23 | f1 | provenance | | | test.rs:143:22:143:63 | ... .open(...) | test.rs:143:22:143:63 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:143:22:143:63 | ... .open(...) [Ok] | test.rs:143:22:143:72 | ... .unwrap() | provenance | MaD:19 | +| test.rs:143:22:143:63 | ... .open(...) [Ok] | test.rs:143:22:143:72 | ... .unwrap() | provenance | MaD:21 | | test.rs:143:22:143:72 | ... .unwrap() | test.rs:143:13:143:18 | mut f1 | provenance | | -| test.rs:145:22:145:23 | f1 | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:145:22:145:23 | f1 | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:145:30:145:40 | [post] &mut buffer [&ref] | test.rs:145:35:145:40 | [post] buffer | provenance | | | test.rs:145:35:145:40 | [post] buffer | test.rs:146:15:146:20 | buffer | provenance | | | test.rs:146:15:146:20 | buffer | test.rs:146:14:146:20 | &buffer | provenance | | | test.rs:150:13:150:18 | mut f2 | test.rs:155:22:155:23 | f2 | provenance | | | test.rs:150:22:152:27 | ... .open(...) | test.rs:150:22:152:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:150:22:152:27 | ... .open(...) [Ok] | test.rs:150:22:153:21 | ... .unwrap() | provenance | MaD:19 | +| test.rs:150:22:152:27 | ... .open(...) [Ok] | test.rs:150:22:153:21 | ... .unwrap() | provenance | MaD:21 | | test.rs:150:22:153:21 | ... .unwrap() | test.rs:150:13:150:18 | mut f2 | provenance | | -| test.rs:155:22:155:23 | f2 | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:155:22:155:23 | f2 | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:155:30:155:40 | [post] &mut buffer [&ref] | test.rs:155:35:155:40 | [post] buffer | provenance | | | test.rs:155:35:155:40 | [post] buffer | test.rs:156:15:156:20 | buffer | provenance | | | test.rs:156:15:156:20 | buffer | test.rs:156:14:156:20 | &buffer | provenance | | | test.rs:160:13:160:18 | mut f3 | test.rs:168:22:168:23 | f3 | provenance | | | test.rs:160:22:165:27 | ... .open(...) | test.rs:160:22:165:27 | ... .open(...) [Ok] | provenance | Src:MaD:6 | -| test.rs:160:22:165:27 | ... .open(...) [Ok] | test.rs:160:22:166:21 | ... .unwrap() | provenance | MaD:19 | +| test.rs:160:22:165:27 | ... .open(...) [Ok] | test.rs:160:22:166:21 | ... .unwrap() | provenance | MaD:21 | | test.rs:160:22:166:21 | ... .unwrap() | test.rs:160:13:160:18 | mut f3 | provenance | | -| test.rs:168:22:168:23 | f3 | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:168:22:168:23 | f3 | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:168:30:168:40 | [post] &mut buffer [&ref] | test.rs:168:35:168:40 | [post] buffer | provenance | | | test.rs:168:35:168:40 | [post] buffer | test.rs:169:15:169:20 | buffer | provenance | | | test.rs:169:15:169:20 | buffer | test.rs:169:14:169:20 | &buffer | provenance | | @@ -195,10 +195,10 @@ edges | test.rs:177:21:177:59 | ...::open(...) [Ok] | test.rs:177:21:177:60 | TryExpr | provenance | | | test.rs:177:21:177:60 | TryExpr | test.rs:177:13:177:17 | file2 | provenance | | | test.rs:178:13:178:22 | mut reader | test.rs:179:9:179:14 | reader | provenance | | -| test.rs:178:26:178:30 | file1 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:33 | +| test.rs:178:26:178:30 | file1 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:28 | | test.rs:178:26:178:43 | file1.chain(...) | test.rs:178:13:178:22 | mut reader | provenance | | -| test.rs:178:38:178:42 | file2 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:32 | -| test.rs:179:9:179:14 | reader | test.rs:179:31:179:41 | [post] &mut buffer [&ref] | provenance | MaD:36 | +| test.rs:178:38:178:42 | file2 | test.rs:178:26:178:43 | file1.chain(...) | provenance | MaD:27 | +| test.rs:179:9:179:14 | reader | test.rs:179:31:179:41 | [post] &mut buffer [&ref] | provenance | MaD:31 | | test.rs:179:31:179:41 | [post] &mut buffer [&ref] | test.rs:179:36:179:41 | [post] buffer | provenance | | | test.rs:179:36:179:41 | [post] buffer | test.rs:180:15:180:20 | buffer | provenance | | | test.rs:180:15:180:20 | buffer | test.rs:180:14:180:20 | &buffer | provenance | | @@ -207,9 +207,9 @@ edges | test.rs:185:21:185:51 | ...::open(...) [Ok] | test.rs:185:21:185:52 | TryExpr | provenance | | | test.rs:185:21:185:52 | TryExpr | test.rs:185:13:185:17 | file1 | provenance | | | test.rs:186:13:186:22 | mut reader | test.rs:187:9:187:14 | reader | provenance | | -| test.rs:186:26:186:30 | file1 | test.rs:186:26:186:40 | file1.take(...) | provenance | MaD:37 | +| test.rs:186:26:186:30 | file1 | test.rs:186:26:186:40 | file1.take(...) | provenance | MaD:32 | | test.rs:186:26:186:40 | file1.take(...) | test.rs:186:13:186:22 | mut reader | provenance | | -| test.rs:187:9:187:14 | reader | test.rs:187:31:187:41 | [post] &mut buffer [&ref] | provenance | MaD:36 | +| test.rs:187:9:187:14 | reader | test.rs:187:31:187:41 | [post] &mut buffer [&ref] | provenance | MaD:31 | | test.rs:187:31:187:41 | [post] &mut buffer [&ref] | test.rs:187:36:187:41 | [post] buffer | provenance | | | test.rs:187:36:187:41 | [post] buffer | test.rs:188:15:188:20 | buffer | provenance | | | test.rs:188:15:188:20 | buffer | test.rs:188:14:188:20 | &buffer | provenance | | @@ -280,7 +280,7 @@ edges | test.rs:274:20:274:56 | ...::open(...) [future, Ok] | test.rs:274:20:274:62 | await ... [Ok] | provenance | | | test.rs:274:20:274:62 | await ... [Ok] | test.rs:274:20:274:63 | TryExpr | provenance | | | test.rs:274:20:274:63 | TryExpr | test.rs:274:9:274:16 | mut file | provenance | | -| test.rs:278:22:278:25 | file | test.rs:278:32:278:42 | [post] &mut buffer [&ref] | provenance | MaD:29 | +| test.rs:278:22:278:25 | file | test.rs:278:32:278:42 | [post] &mut buffer [&ref] | provenance | MaD:18 | | test.rs:278:32:278:42 | [post] &mut buffer [&ref] | test.rs:278:37:278:42 | [post] buffer | provenance | | | test.rs:278:37:278:42 | [post] buffer | test.rs:279:15:279:20 | buffer | provenance | | | test.rs:279:15:279:20 | buffer | test.rs:279:14:279:20 | &buffer | provenance | | @@ -289,7 +289,7 @@ edges | test.rs:285:22:285:69 | ... .open(...) [future, Ok] | test.rs:285:22:285:75 | await ... [Ok] | provenance | | | test.rs:285:22:285:75 | await ... [Ok] | test.rs:285:22:285:76 | TryExpr | provenance | | | test.rs:285:22:285:76 | TryExpr | test.rs:285:13:285:18 | mut f1 | provenance | | -| test.rs:287:22:287:23 | f1 | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | provenance | MaD:29 | +| test.rs:287:22:287:23 | f1 | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | provenance | MaD:18 | | test.rs:287:30:287:40 | [post] &mut buffer [&ref] | test.rs:287:35:287:40 | [post] buffer | provenance | | | test.rs:287:35:287:40 | [post] buffer | test.rs:288:15:288:20 | buffer | provenance | | | test.rs:288:15:288:20 | buffer | test.rs:288:14:288:20 | &buffer | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected index cbe63e1acbdf..821dd11cda66 100644 --- a/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/net/InlineFlow.expected @@ -7,72 +7,72 @@ models | 6 | Source: ::connect; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | | 7 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 8 | Source: reqwest::get; ReturnValue.Future.Field[core::result::Result::Ok(0)]; remote | -| 9 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 10 | Summary: ::new; Argument[0].Reference; ReturnValue; value | -| 11 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | -| 12 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 13 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 14 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 15 | Summary: ::body; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | -| 16 | Summary: ::body_mut; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | -| 17 | Summary: ::into_body; Argument[self].Field[http::response::Response::body]; ReturnValue; value | -| 18 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 19 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 20 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 21 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 22 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 23 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 24 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 25 | Summary: ::try_clone; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 26 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | -| 27 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | -| 28 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | -| 29 | Summary: core::ops::deref::Deref::deref; Argument[self].Reference; ReturnValue.Reference; taint | -| 30 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 31 | Summary: 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 | -| 32 | Summary: futures_io::if_std::AsyncRead::poll_read; Argument[self].Reference; Argument[1].Reference; taint | -| 33 | Summary: futures_util::io::AsyncBufReadExt::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 34 | Summary: futures_util::io::AsyncBufReadExt::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 35 | Summary: futures_util::io::AsyncBufReadExt::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 36 | Summary: futures_util::io::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | -| 37 | Summary: futures_util::io::AsyncReadExt::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 38 | Summary: std::io::BufRead::lines; Argument[self]; ReturnValue; taint | -| 39 | Summary: std::io::BufRead::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 40 | Summary: std::io::Read::read; Argument[self].Reference; Argument[0].Reference; taint | -| 41 | Summary: std::io::Read::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 42 | Summary: std::io::Read::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 43 | Summary: std::io::Read::take; Argument[self]; ReturnValue; taint | -| 44 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | +| 9 | Summary: ::deref; Argument[self].Reference; ReturnValue.Reference; taint | +| 10 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 12 | Summary: ::new; Argument[0].Reference; ReturnValue; value | +| 13 | Summary: ::new; Argument[0]; ReturnValue.Field[core::pin::Pin::pointer]; value | +| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 15 | Summary: ::poll_fill_buf; Argument[self].Reference; ReturnValue.Field[core::task::poll::Poll::Ready(0)].Field[core::result::Result::Ok(0)]; taint | +| 16 | Summary: ::poll_read; Argument[self].Reference; Argument[1].Reference; taint | +| 17 | Summary: ::connect; Argument[1]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 18 | Summary: ::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 19 | Summary: ::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 20 | Summary: ::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 21 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 22 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 23 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 24 | Summary: ::body; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | +| 25 | Summary: ::body_mut; Argument[self].Reference.Field[http::response::Response::body]; ReturnValue.Reference; value | +| 26 | Summary: ::into_body; Argument[self].Field[http::response::Response::body]; ReturnValue; value | +| 27 | Summary: ::bytes; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 28 | Summary: ::chunk; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 29 | Summary: ::text; Argument[self]; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 30 | Summary: ::bytes; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 31 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 32 | Summary: ::text_with_charset; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 33 | Summary: ::lines; Argument[self]; ReturnValue; taint | +| 34 | Summary: ::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 35 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 36 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 37 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 38 | Summary: ::take; Argument[self]; ReturnValue; taint | +| 39 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 40 | Summary: ::try_clone; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 41 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 42 | Summary: ::peek; Argument[self].Reference; Argument[0].Reference; taint | +| 43 | Summary: ::try_read; Argument[self].Reference; Argument[0].Reference; taint | +| 44 | Summary: ::try_read_buf; Argument[self].Reference; Argument[0].Reference; taint | edges | test.rs:11:9:11:22 | remote_string1 | test.rs:12:10:12:23 | remote_string1 | provenance | | | test.rs:11:26:11:62 | ...::get(...) | test.rs:11:26:11:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | | test.rs:11:26:11:62 | ...::get(...) [Ok] | test.rs:11:26:11:63 | TryExpr | provenance | | -| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:22 | +| test.rs:11:26:11:63 | TryExpr | test.rs:11:26:11:70 | ... .text() [Ok] | provenance | MaD:31 | | test.rs:11:26:11:70 | ... .text() [Ok] | test.rs:11:26:11:71 | TryExpr | provenance | | | test.rs:11:26:11:71 | TryExpr | test.rs:11:9:11:22 | remote_string1 | provenance | | | test.rs:14:9:14:22 | remote_string2 | test.rs:15:10:15:23 | remote_string2 | provenance | | | test.rs:14:26:14:62 | ...::get(...) | test.rs:14:26:14:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | -| test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:12 | -| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:22 | -| test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:12 | +| test.rs:14:26:14:62 | ...::get(...) [Ok] | test.rs:14:26:14:71 | ... .unwrap() | provenance | MaD:14 | +| test.rs:14:26:14:71 | ... .unwrap() | test.rs:14:26:14:78 | ... .text() [Ok] | provenance | MaD:31 | +| test.rs:14:26:14:78 | ... .text() [Ok] | test.rs:14:26:14:87 | ... .unwrap() | provenance | MaD:14 | | test.rs:14:26:14:87 | ... .unwrap() | test.rs:14:9:14:22 | remote_string2 | provenance | | | test.rs:17:9:17:22 | remote_string3 | test.rs:18:10:18:23 | remote_string3 | provenance | | | test.rs:17:26:17:62 | ...::get(...) | test.rs:17:26:17:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | -| test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:12 | -| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:23 | -| test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:12 | +| test.rs:17:26:17:62 | ...::get(...) [Ok] | test.rs:17:26:17:71 | ... .unwrap() | provenance | MaD:14 | +| test.rs:17:26:17:71 | ... .unwrap() | test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | provenance | MaD:32 | +| test.rs:17:26:17:98 | ... .text_with_charset(...) [Ok] | test.rs:17:26:17:107 | ... .unwrap() | provenance | MaD:14 | | test.rs:17:26:17:107 | ... .unwrap() | test.rs:17:9:17:22 | remote_string3 | provenance | | | test.rs:20:9:20:22 | remote_string4 | test.rs:21:10:21:23 | remote_string4 | provenance | | | test.rs:20:26:20:62 | ...::get(...) | test.rs:20:26:20:62 | ...::get(...) [Ok] | provenance | Src:MaD:7 | -| test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:12 | -| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:21 | -| test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:12 | +| test.rs:20:26:20:62 | ...::get(...) [Ok] | test.rs:20:26:20:71 | ... .unwrap() | provenance | MaD:14 | +| test.rs:20:26:20:71 | ... .unwrap() | test.rs:20:26:20:79 | ... .bytes() [Ok] | provenance | MaD:30 | +| test.rs:20:26:20:79 | ... .bytes() [Ok] | test.rs:20:26:20:88 | ... .unwrap() | provenance | MaD:14 | | test.rs:20:26:20:88 | ... .unwrap() | test.rs:20:9:20:22 | remote_string4 | provenance | | | test.rs:23:9:23:22 | remote_string5 | test.rs:24:10:24:23 | remote_string5 | provenance | | | test.rs:23:26:23:52 | ...::get(...) | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:23:26:23:52 | ...::get(...) [future, Ok] | test.rs:23:26:23:58 | await ... [Ok] | provenance | | | test.rs:23:26:23:58 | await ... [Ok] | test.rs:23:26:23:59 | TryExpr | provenance | | -| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:20 | +| test.rs:23:26:23:59 | TryExpr | test.rs:23:26:23:66 | ... .text() [future, Ok] | provenance | MaD:29 | | test.rs:23:26:23:66 | ... .text() [future, Ok] | test.rs:23:26:23:72 | await ... [Ok] | provenance | | | test.rs:23:26:23:72 | await ... [Ok] | test.rs:23:26:23:73 | TryExpr | provenance | | | test.rs:23:26:23:73 | TryExpr | test.rs:23:9:23:22 | remote_string5 | provenance | | @@ -80,7 +80,7 @@ edges | test.rs:26:26:26:52 | ...::get(...) | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | provenance | Src:MaD:8 | | test.rs:26:26:26:52 | ...::get(...) [future, Ok] | test.rs:26:26:26:58 | await ... [Ok] | provenance | | | test.rs:26:26:26:58 | await ... [Ok] | test.rs:26:26:26:59 | TryExpr | provenance | | -| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:18 | +| test.rs:26:26:26:59 | TryExpr | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | provenance | MaD:27 | | test.rs:26:26:26:67 | ... .bytes() [future, Ok] | test.rs:26:26:26:73 | await ... [Ok] | provenance | | | test.rs:26:26:26:73 | await ... [Ok] | test.rs:26:26:26:74 | TryExpr | provenance | | | test.rs:26:26:26:74 | TryExpr | test.rs:26:9:26:22 | remote_string6 | provenance | | @@ -90,13 +90,13 @@ edges | test.rs:29:24:29:50 | ...::get(...) [future, Ok] | test.rs:29:24:29:56 | await ... [Ok] | provenance | | | test.rs:29:24:29:56 | await ... [Ok] | test.rs:29:24:29:57 | TryExpr | provenance | | | test.rs:29:24:29:57 | TryExpr | test.rs:29:9:29:20 | mut request1 | provenance | | -| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:19 | +| test.rs:30:10:30:17 | request1 | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | provenance | MaD:28 | | test.rs:30:10:30:25 | request1.chunk() [future, Ok, Some] | test.rs:30:10:30:31 | await ... [Ok, Some] | provenance | | | test.rs:30:10:30:31 | await ... [Ok, Some] | test.rs:30:10:30:32 | TryExpr [Some] | provenance | | -| test.rs:30:10:30:32 | TryExpr [Some] | test.rs:30:10:30:41 | ... .unwrap() | provenance | MaD:9 | +| test.rs:30:10:30:32 | TryExpr [Some] | test.rs:30:10:30:41 | ... .unwrap() | provenance | MaD:11 | | test.rs:31:15:31:25 | Some(...) [Some] | test.rs:31:20:31:24 | chunk | provenance | | | test.rs:31:20:31:24 | chunk | test.rs:32:14:32:18 | chunk | provenance | | -| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:19 | +| test.rs:31:29:31:36 | request1 | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | provenance | MaD:28 | | test.rs:31:29:31:44 | request1.chunk() [future, Ok, Some] | test.rs:31:29:31:50 | await ... [Ok, Some] | provenance | | | test.rs:31:29:31:50 | await ... [Ok, Some] | test.rs:31:29:31:51 | TryExpr [Some] | provenance | | | test.rs:31:29:31:51 | TryExpr [Some] | test.rs:31:15:31:25 | Some(...) [Some] | provenance | | @@ -116,42 +116,42 @@ edges | test.rs:67:24:67:57 | await ... [Ok] | test.rs:67:24:67:58 | TryExpr | provenance | | | test.rs:67:24:67:58 | TryExpr | test.rs:67:9:67:20 | mut response | provenance | | | test.rs:68:11:68:18 | response | test.rs:68:10:68:18 | &response | provenance | | -| test.rs:76:18:76:25 | response | test.rs:76:18:76:32 | response.body() | provenance | MaD:15 | -| test.rs:77:18:77:25 | response | test.rs:77:18:77:36 | response.body_mut() | provenance | MaD:16 | +| test.rs:76:18:76:25 | response | test.rs:76:18:76:32 | response.body() | provenance | MaD:24 | +| test.rs:77:18:77:25 | response | test.rs:77:18:77:36 | response.body_mut() | provenance | MaD:25 | | test.rs:79:17:79:20 | body | test.rs:80:19:80:22 | body | provenance | | -| test.rs:79:24:79:31 | response | test.rs:79:24:79:43 | response.into_body() | provenance | MaD:17 | +| test.rs:79:24:79:31 | response | test.rs:79:24:79:43 | response.into_body() | provenance | MaD:26 | | test.rs:79:24:79:43 | response.into_body() | test.rs:79:17:79:20 | body | provenance | | | test.rs:80:19:80:22 | body | test.rs:80:18:80:22 | &body | provenance | | | test.rs:155:13:155:22 | mut stream | test.rs:162:17:162:22 | stream | provenance | | | test.rs:155:26:155:62 | ...::connect(...) | test.rs:155:26:155:62 | ...::connect(...) [Ok] | provenance | Src:MaD:4 | | test.rs:155:26:155:62 | ...::connect(...) [Ok] | test.rs:155:26:155:63 | TryExpr | provenance | | | test.rs:155:26:155:63 | TryExpr | test.rs:155:13:155:22 | mut stream | provenance | | -| test.rs:162:17:162:22 | stream | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | provenance | MaD:40 | +| test.rs:162:17:162:22 | stream | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | provenance | MaD:35 | | test.rs:162:29:162:39 | [post] &mut buffer [&ref] | test.rs:162:34:162:39 | [post] buffer | provenance | | | test.rs:162:34:162:39 | [post] buffer | test.rs:165:15:165:20 | buffer | provenance | | | test.rs:162:34:162:39 | [post] buffer | test.rs:166:14:166:19 | buffer | provenance | | | test.rs:165:15:165:20 | buffer | test.rs:165:14:165:20 | &buffer | provenance | | -| test.rs:166:14:166:19 | buffer | test.rs:166:14:166:22 | buffer[0] | provenance | MaD:30 | +| test.rs:166:14:166:19 | buffer | test.rs:166:14:166:22 | buffer[0] | provenance | MaD:10 | | test.rs:174:13:174:22 | mut stream | test.rs:182:58:182:63 | stream | provenance | | | test.rs:174:13:174:22 | mut stream | test.rs:203:54:203:59 | stream | provenance | | | test.rs:174:26:174:105 | ...::connect_timeout(...) | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | provenance | Src:MaD:5 | | test.rs:174:26:174:105 | ...::connect_timeout(...) [Ok] | test.rs:174:26:174:106 | TryExpr | provenance | | | test.rs:174:26:174:106 | TryExpr | test.rs:174:13:174:22 | mut stream | provenance | | | test.rs:182:21:182:30 | mut reader | test.rs:185:27:185:32 | reader | provenance | | -| test.rs:182:34:182:64 | ...::new(...) | test.rs:182:34:182:74 | ... .take(...) | provenance | MaD:43 | +| test.rs:182:34:182:64 | ...::new(...) | test.rs:182:34:182:74 | ... .take(...) | provenance | MaD:38 | | test.rs:182:34:182:74 | ... .take(...) | test.rs:182:21:182:30 | mut reader | provenance | | -| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:24 | -| test.rs:185:27:185:32 | reader | test.rs:185:44:185:52 | [post] &mut line [&ref] | provenance | MaD:39 | +| test.rs:182:58:182:63 | stream | test.rs:182:34:182:64 | ...::new(...) | provenance | MaD:39 | +| test.rs:185:27:185:32 | reader | test.rs:185:44:185:52 | [post] &mut line [&ref] | provenance | MaD:34 | | test.rs:185:44:185:52 | [post] &mut line [&ref] | test.rs:185:49:185:52 | [post] line | provenance | | | test.rs:185:49:185:52 | [post] line | test.rs:192:35:192:38 | line | provenance | | | test.rs:192:35:192:38 | line | test.rs:192:34:192:38 | &line | provenance | | | test.rs:203:21:203:26 | reader | test.rs:204:29:204:34 | reader | provenance | | -| test.rs:203:30:203:73 | ...::new(...) | test.rs:203:30:203:83 | ... .take(...) | provenance | MaD:43 | +| test.rs:203:30:203:73 | ...::new(...) | test.rs:203:30:203:83 | ... .take(...) | provenance | MaD:38 | | test.rs:203:30:203:83 | ... .take(...) | test.rs:203:21:203:26 | reader | provenance | | -| test.rs:203:54:203:59 | stream | test.rs:203:54:203:71 | stream.try_clone() [Ok] | provenance | MaD:25 | +| test.rs:203:54:203:59 | stream | test.rs:203:54:203:71 | stream.try_clone() [Ok] | provenance | MaD:40 | | test.rs:203:54:203:71 | stream.try_clone() [Ok] | test.rs:203:54:203:72 | TryExpr | provenance | | -| test.rs:203:54:203:72 | TryExpr | test.rs:203:30:203:73 | ...::new(...) | provenance | MaD:24 | -| test.rs:204:29:204:34 | reader | test.rs:204:29:204:42 | reader.lines() | provenance | MaD:38 | +| test.rs:203:54:203:72 | TryExpr | test.rs:203:30:203:73 | ...::new(...) | provenance | MaD:39 | +| test.rs:204:29:204:34 | reader | test.rs:204:29:204:42 | reader.lines() | provenance | MaD:33 | | test.rs:204:29:204:42 | reader.lines() | test.rs:205:28:205:37 | Ok(...) | provenance | | | test.rs:205:28:205:37 | Ok(...) | test.rs:207:30:207:35 | string | provenance | | | test.rs:224:9:224:24 | mut tokio_stream | test.rs:232:17:232:28 | tokio_stream | provenance | | @@ -162,46 +162,46 @@ edges | test.rs:224:28:224:66 | ...::connect(...) [future, Ok] | test.rs:224:28:224:72 | await ... [Ok] | provenance | | | test.rs:224:28:224:72 | await ... [Ok] | test.rs:224:28:224:73 | TryExpr | provenance | | | test.rs:224:28:224:73 | TryExpr | test.rs:224:9:224:24 | mut tokio_stream | provenance | | -| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:26 | +| test.rs:232:17:232:28 | tokio_stream | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | provenance | MaD:42 | | test.rs:232:35:232:46 | [post] &mut buffer1 [&ref] | test.rs:232:40:232:46 | [post] buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:239:15:239:21 | buffer1 | provenance | | | test.rs:232:40:232:46 | [post] buffer1 | test.rs:240:14:240:20 | buffer1 | provenance | | -| test.rs:236:18:236:29 | tokio_stream | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | provenance | MaD:44 | +| test.rs:236:18:236:29 | tokio_stream | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | provenance | MaD:41 | | test.rs:236:36:236:47 | [post] &mut buffer2 [&ref] | test.rs:236:41:236:47 | [post] buffer2 | provenance | | | test.rs:236:41:236:47 | [post] buffer2 | test.rs:243:15:243:21 | buffer2 | provenance | | | test.rs:236:41:236:47 | [post] buffer2 | test.rs:244:14:244:20 | buffer2 | provenance | | | test.rs:239:15:239:21 | buffer1 | test.rs:239:14:239:21 | &buffer1 | provenance | | -| test.rs:240:14:240:20 | buffer1 | test.rs:240:14:240:23 | buffer1[0] | provenance | MaD:30 | +| test.rs:240:14:240:20 | buffer1 | test.rs:240:14:240:23 | buffer1[0] | provenance | MaD:10 | | test.rs:243:15:243:21 | buffer2 | test.rs:243:14:243:21 | &buffer2 | provenance | | -| test.rs:244:14:244:20 | buffer2 | test.rs:244:14:244:23 | buffer2[0] | provenance | MaD:30 | -| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:27 | +| test.rs:244:14:244:20 | buffer2 | test.rs:244:14:244:23 | buffer2[0] | provenance | MaD:10 | +| test.rs:252:19:252:30 | tokio_stream | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | provenance | MaD:43 | | test.rs:252:41:252:51 | [post] &mut buffer [&ref] | test.rs:252:46:252:51 | [post] buffer | provenance | | | test.rs:252:46:252:51 | [post] buffer | test.rs:259:27:259:32 | buffer | provenance | | | test.rs:259:27:259:32 | buffer | test.rs:259:26:259:32 | &buffer | provenance | | -| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:28 | +| test.rs:275:19:275:30 | tokio_stream | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | provenance | MaD:44 | | test.rs:275:45:275:55 | [post] &mut buffer [&ref] | test.rs:275:50:275:55 | [post] buffer | provenance | | | test.rs:275:50:275:55 | [post] buffer | test.rs:282:27:282:32 | buffer | provenance | | | test.rs:282:27:282:32 | buffer | test.rs:282:26:282:32 | &buffer | provenance | | | test.rs:332:9:332:18 | mut client | test.rs:333:22:333:27 | client | provenance | | | test.rs:332:22:332:75 | ...::new(...) | test.rs:332:22:332:75 | ...::new(...) [Ok] | provenance | Src:MaD:3 | -| test.rs:332:22:332:75 | ...::new(...) [Ok] | test.rs:332:22:332:84 | ... .unwrap() | provenance | MaD:12 | +| test.rs:332:22:332:75 | ...::new(...) [Ok] | test.rs:332:22:332:84 | ... .unwrap() | provenance | MaD:14 | | test.rs:332:22:332:84 | ... .unwrap() | test.rs:332:9:332:18 | mut client | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:334:11:334:16 | reader | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:338:22:338:27 | reader | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:344:22:344:27 | reader | provenance | | | test.rs:333:9:333:18 | mut reader | test.rs:350:22:350:27 | reader | provenance | | -| test.rs:333:22:333:27 | client | test.rs:333:22:333:36 | client.reader() | provenance | MaD:29 | +| test.rs:333:22:333:27 | client | test.rs:333:22:333:36 | client.reader() | provenance | MaD:9 | | test.rs:333:22:333:36 | client.reader() | test.rs:333:9:333:18 | mut reader | provenance | | | test.rs:334:11:334:16 | reader | test.rs:334:10:334:16 | &reader | provenance | | -| test.rs:338:22:338:27 | reader | test.rs:338:34:338:44 | [post] &mut buffer [&ref] | provenance | MaD:40 | +| test.rs:338:22:338:27 | reader | test.rs:338:34:338:44 | [post] &mut buffer [&ref] | provenance | MaD:35 | | test.rs:338:34:338:44 | [post] &mut buffer [&ref] | test.rs:338:39:338:44 | [post] buffer | provenance | | | test.rs:338:39:338:44 | [post] buffer | test.rs:339:15:339:20 | buffer | provenance | | | test.rs:339:15:339:20 | buffer | test.rs:339:14:339:20 | &buffer | provenance | | -| test.rs:344:22:344:27 | reader | test.rs:344:41:344:51 | [post] &mut buffer [&ref] | provenance | MaD:41 | +| test.rs:344:22:344:27 | reader | test.rs:344:41:344:51 | [post] &mut buffer [&ref] | provenance | MaD:36 | | test.rs:344:41:344:51 | [post] &mut buffer [&ref] | test.rs:344:46:344:51 | [post] buffer | provenance | | | test.rs:344:46:344:51 | [post] buffer | test.rs:345:15:345:20 | buffer | provenance | | | test.rs:345:15:345:20 | buffer | test.rs:345:14:345:20 | &buffer | provenance | | -| test.rs:350:22:350:27 | reader | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | provenance | MaD:42 | +| test.rs:350:22:350:27 | reader | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | provenance | MaD:37 | | test.rs:350:44:350:54 | [post] &mut buffer [&ref] | test.rs:350:49:350:54 | [post] buffer | provenance | | | test.rs:350:49:350:54 | [post] buffer | test.rs:351:15:351:20 | buffer | provenance | | | test.rs:351:15:351:20 | buffer | test.rs:351:14:351:20 | &buffer | provenance | | @@ -220,38 +220,38 @@ edges | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | test.rs:380:26:380:66 | await ... [Ok] | provenance | | | test.rs:380:26:380:66 | await ... [Ok] | test.rs:380:26:380:67 | TryExpr | provenance | | | test.rs:380:26:380:67 | TryExpr | test.rs:380:13:380:22 | mut reader | provenance | | -| test.rs:380:57:380:59 | tcp | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | provenance | MaD:13 | +| test.rs:380:57:380:59 | tcp | test.rs:380:26:380:60 | connector.connect(...) [future, Ok] | provenance | MaD:17 | | test.rs:381:15:381:20 | reader | test.rs:381:14:381:20 | &reader | provenance | | | test.rs:386:17:386:26 | mut pinned | test.rs:387:19:387:24 | pinned | provenance | | | test.rs:386:17:386:26 | mut pinned | test.rs:389:30:389:35 | pinned | provenance | | | test.rs:386:17:386:26 | mut pinned [Pin, &ref] | test.rs:387:19:387:24 | pinned [Pin, &ref] | provenance | | | test.rs:386:30:386:50 | ...::new(...) | test.rs:386:17:386:26 | mut pinned | provenance | | | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | test.rs:386:17:386:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) | provenance | MaD:10 | -| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | +| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) | provenance | MaD:12 | +| test.rs:386:39:386:49 | &mut reader [&ref] | test.rs:386:30:386:50 | ...::new(...) [Pin, &ref] | provenance | MaD:13 | | test.rs:386:44:386:49 | reader | test.rs:386:39:386:49 | &mut reader [&ref] | provenance | | | test.rs:387:19:387:24 | pinned | test.rs:387:18:387:24 | &pinned | provenance | | | test.rs:387:19:387:24 | pinned [Pin, &ref] | test.rs:387:18:387:24 | &pinned | provenance | | -| test.rs:389:30:389:35 | pinned | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | provenance | MaD:32 | +| test.rs:389:30:389:35 | pinned | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | provenance | MaD:16 | | test.rs:389:56:389:66 | [post] &mut buffer [&ref] | test.rs:389:61:389:66 | [post] buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:391:23:391:28 | buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:392:23:392:28 | buffer | provenance | | | test.rs:389:61:389:66 | [post] buffer | test.rs:392:23:392:33 | buffer[...] | provenance | | | test.rs:391:23:391:28 | buffer | test.rs:391:22:391:28 | &buffer | provenance | | -| test.rs:392:23:392:28 | buffer | test.rs:392:23:392:33 | buffer[...] | provenance | MaD:30 | +| test.rs:392:23:392:28 | buffer | test.rs:392:23:392:33 | buffer[...] | provenance | MaD:10 | | test.rs:392:23:392:33 | buffer[...] | test.rs:392:22:392:33 | &... | provenance | | -| test.rs:399:63:399:73 | &mut reader [&ref] | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | provenance | MaD:36 | +| test.rs:399:63:399:73 | &mut reader [&ref] | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | provenance | MaD:21 | | test.rs:399:68:399:73 | reader | test.rs:399:63:399:73 | &mut reader [&ref] | provenance | | | test.rs:399:76:399:87 | [post] &mut buffer1 [&ref] | test.rs:399:81:399:87 | [post] buffer1 | provenance | | | test.rs:399:81:399:87 | [post] buffer1 | test.rs:400:19:400:25 | buffer1 | provenance | | | test.rs:399:81:399:87 | [post] buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | | -| test.rs:400:19:400:25 | buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | MaD:30 | +| test.rs:400:19:400:25 | buffer1 | test.rs:400:19:400:40 | buffer1[...] | provenance | MaD:10 | | test.rs:400:19:400:40 | buffer1[...] | test.rs:400:18:400:40 | &... | provenance | | -| test.rs:403:31:403:36 | reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:36 | +| test.rs:403:31:403:36 | reader | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | provenance | MaD:21 | | test.rs:403:43:403:54 | [post] &mut buffer2 [&ref] | test.rs:403:48:403:54 | [post] buffer2 | provenance | | | test.rs:403:48:403:54 | [post] buffer2 | test.rs:405:19:405:25 | buffer2 | provenance | | | test.rs:403:48:403:54 | [post] buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | | -| test.rs:405:19:405:25 | buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | MaD:30 | +| test.rs:405:19:405:25 | buffer2 | test.rs:405:19:405:40 | buffer2[...] | provenance | MaD:10 | | test.rs:405:19:405:40 | buffer2[...] | test.rs:405:18:405:40 | &... | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:409:15:409:21 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:413:44:413:50 | reader2 | provenance | | @@ -266,30 +266,30 @@ edges | test.rs:408:13:408:23 | mut reader2 | test.rs:493:31:493:37 | reader2 | provenance | | | test.rs:408:13:408:23 | mut reader2 | test.rs:500:31:500:37 | reader2 | provenance | | | test.rs:408:27:408:61 | ...::new(...) | test.rs:408:13:408:23 | mut reader2 | provenance | | -| test.rs:408:55:408:60 | reader | test.rs:408:27:408:61 | ...::new(...) | provenance | MaD:14 | +| test.rs:408:55:408:60 | reader | test.rs:408:27:408:61 | ...::new(...) | provenance | MaD:23 | | test.rs:409:15:409:21 | reader2 | test.rs:409:14:409:21 | &reader2 | provenance | | | test.rs:413:17:413:26 | mut pinned | test.rs:414:19:414:24 | pinned | provenance | | | test.rs:413:17:413:26 | mut pinned | test.rs:416:26:416:31 | pinned | provenance | | | test.rs:413:17:413:26 | mut pinned [Pin, &ref] | test.rs:414:19:414:24 | pinned [Pin, &ref] | provenance | | | test.rs:413:30:413:51 | ...::new(...) | test.rs:413:17:413:26 | mut pinned | provenance | | | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | test.rs:413:17:413:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) | provenance | MaD:10 | -| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | +| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) | provenance | MaD:12 | +| test.rs:413:39:413:50 | &mut reader2 [&ref] | test.rs:413:30:413:51 | ...::new(...) [Pin, &ref] | provenance | MaD:13 | | test.rs:413:44:413:50 | reader2 | test.rs:413:39:413:50 | &mut reader2 [&ref] | provenance | | | test.rs:414:19:414:24 | pinned | test.rs:414:18:414:24 | &pinned | provenance | | | test.rs:414:19:414:24 | pinned [Pin, &ref] | test.rs:414:18:414:24 | &pinned | provenance | | | test.rs:416:17:416:22 | buffer [Ready, Ok] | test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | provenance | | | test.rs:416:17:416:22 | buffer [Ready, Ok] | test.rs:418:23:418:28 | buffer [Ready, Ok] | provenance | | -| test.rs:416:26:416:31 | pinned | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:31 | +| test.rs:416:26:416:31 | pinned | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:15 | | test.rs:416:26:416:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:416:17:416:22 | buffer [Ready, Ok] | provenance | | | test.rs:417:20:417:39 | ...::Ready(...) [Ready, Ok] | test.rs:417:32:417:38 | Ok(...) [Ok] | provenance | | | test.rs:417:32:417:38 | Ok(...) [Ok] | test.rs:417:35:417:37 | buf | provenance | | | test.rs:417:35:417:37 | buf | test.rs:419:22:419:24 | buf | provenance | | | test.rs:418:23:418:28 | buffer [Ready, Ok] | test.rs:418:22:418:28 | &buffer | provenance | | | test.rs:423:17:423:23 | buffer2 [Ready, Ok] | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | provenance | | -| test.rs:423:27:423:48 | ...::new(...) | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:31 | +| test.rs:423:27:423:48 | ...::new(...) | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | provenance | MaD:15 | | test.rs:423:27:423:71 | ... .poll_fill_buf(...) [Ready, Ok] | test.rs:423:17:423:23 | buffer2 [Ready, Ok] | provenance | | -| test.rs:423:36:423:47 | &mut reader2 [&ref] | test.rs:423:27:423:48 | ...::new(...) | provenance | MaD:10 | +| test.rs:423:36:423:47 | &mut reader2 [&ref] | test.rs:423:27:423:48 | ...::new(...) | provenance | MaD:12 | | test.rs:423:41:423:47 | reader2 | test.rs:423:36:423:47 | &mut reader2 [&ref] | provenance | | | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | test.rs:425:17:425:36 | ...::Ready(...) [Ready, Ok] | provenance | | | test.rs:424:20:424:26 | buffer2 [Ready, Ok] | test.rs:426:27:426:33 | buffer2 [Ready, Ok] | provenance | | @@ -298,7 +298,7 @@ edges | test.rs:425:32:425:34 | buf | test.rs:427:26:427:28 | buf | provenance | | | test.rs:426:27:426:33 | buffer2 [Ready, Ok] | test.rs:426:26:426:33 | &buffer2 | provenance | | | test.rs:437:17:437:22 | buffer | test.rs:438:18:438:23 | buffer | provenance | | -| test.rs:437:26:437:32 | reader2 | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:33 | +| test.rs:437:26:437:32 | reader2 | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:18 | | test.rs:437:26:437:43 | reader2.fill_buf() [future, Ok] | test.rs:437:26:437:49 | await ... [Ok] | provenance | | | test.rs:437:26:437:49 | await ... [Ok] | test.rs:437:26:437:50 | TryExpr | provenance | | | test.rs:437:26:437:50 | TryExpr | test.rs:437:17:437:22 | buffer | provenance | | @@ -307,64 +307,64 @@ edges | test.rs:444:17:444:26 | mut pinned [Pin, &ref] | test.rs:445:19:445:24 | pinned [Pin, &ref] | provenance | | | test.rs:444:30:444:51 | ...::new(...) | test.rs:444:17:444:26 | mut pinned | provenance | | | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | test.rs:444:17:444:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) | provenance | MaD:10 | -| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | +| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) | provenance | MaD:12 | +| test.rs:444:39:444:50 | &mut reader2 [&ref] | test.rs:444:30:444:51 | ...::new(...) [Pin, &ref] | provenance | MaD:13 | | test.rs:444:44:444:50 | reader2 | test.rs:444:39:444:50 | &mut reader2 [&ref] | provenance | | | test.rs:445:19:445:24 | pinned | test.rs:445:18:445:24 | &pinned | provenance | | | test.rs:445:19:445:24 | pinned [Pin, &ref] | test.rs:445:18:445:24 | &pinned | provenance | | -| test.rs:447:30:447:35 | pinned | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | provenance | MaD:32 | +| test.rs:447:30:447:35 | pinned | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | provenance | MaD:16 | | test.rs:447:56:447:66 | [post] &mut buffer [&ref] | test.rs:447:61:447:66 | [post] buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:448:19:448:24 | buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:450:23:450:28 | buffer | provenance | | | test.rs:447:61:447:66 | [post] buffer | test.rs:450:23:450:33 | buffer[...] | provenance | | | test.rs:448:19:448:24 | buffer | test.rs:448:18:448:24 | &buffer | provenance | | -| test.rs:450:23:450:28 | buffer | test.rs:450:23:450:33 | buffer[...] | provenance | MaD:30 | +| test.rs:450:23:450:28 | buffer | test.rs:450:23:450:33 | buffer[...] | provenance | MaD:10 | | test.rs:450:23:450:33 | buffer[...] | test.rs:450:22:450:33 | &... | provenance | | -| test.rs:457:63:457:74 | &mut reader2 [&ref] | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | provenance | MaD:36 | +| test.rs:457:63:457:74 | &mut reader2 [&ref] | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | provenance | MaD:21 | | test.rs:457:68:457:74 | reader2 | test.rs:457:63:457:74 | &mut reader2 [&ref] | provenance | | | test.rs:457:77:457:88 | [post] &mut buffer1 [&ref] | test.rs:457:82:457:88 | [post] buffer1 | provenance | | | test.rs:457:82:457:88 | [post] buffer1 | test.rs:458:19:458:25 | buffer1 | provenance | | | test.rs:457:82:457:88 | [post] buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | | -| test.rs:458:19:458:25 | buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | MaD:30 | +| test.rs:458:19:458:25 | buffer1 | test.rs:458:19:458:40 | buffer1[...] | provenance | MaD:10 | | test.rs:458:19:458:40 | buffer1[...] | test.rs:458:18:458:40 | &... | provenance | | -| test.rs:461:31:461:37 | reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:36 | +| test.rs:461:31:461:37 | reader2 | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | provenance | MaD:21 | | test.rs:461:44:461:55 | [post] &mut buffer2 [&ref] | test.rs:461:49:461:55 | [post] buffer2 | provenance | | | test.rs:461:49:461:55 | [post] buffer2 | test.rs:462:19:462:25 | buffer2 | provenance | | | test.rs:461:49:461:55 | [post] buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | | -| test.rs:462:19:462:25 | buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | MaD:30 | +| test.rs:462:19:462:25 | buffer2 | test.rs:462:19:462:40 | buffer2[...] | provenance | MaD:10 | | test.rs:462:19:462:40 | buffer2[...] | test.rs:462:18:462:40 | &... | provenance | | | test.rs:467:17:467:26 | mut pinned | test.rs:468:19:468:24 | pinned | provenance | | | test.rs:467:17:467:26 | mut pinned | test.rs:470:26:470:31 | pinned | provenance | | | test.rs:467:17:467:26 | mut pinned [Pin, &ref] | test.rs:468:19:468:24 | pinned [Pin, &ref] | provenance | | | test.rs:467:30:467:51 | ...::new(...) | test.rs:467:17:467:26 | mut pinned | provenance | | | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | test.rs:467:17:467:26 | mut pinned [Pin, &ref] | provenance | | -| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) | provenance | MaD:10 | -| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | provenance | MaD:11 | +| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) | provenance | MaD:12 | +| test.rs:467:39:467:50 | &mut reader2 [&ref] | test.rs:467:30:467:51 | ...::new(...) [Pin, &ref] | provenance | MaD:13 | | test.rs:467:44:467:50 | reader2 | test.rs:467:39:467:50 | &mut reader2 [&ref] | provenance | | | test.rs:468:19:468:24 | pinned | test.rs:468:18:468:24 | &pinned | provenance | | | test.rs:468:19:468:24 | pinned [Pin, &ref] | test.rs:468:18:468:24 | &pinned | provenance | | | test.rs:470:17:470:22 | buffer [Ready, Ok] | test.rs:471:19:471:24 | buffer [Ready, Ok] | provenance | | | test.rs:470:17:470:22 | buffer [Ready, Ok] | test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | provenance | | -| test.rs:470:26:470:31 | pinned | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:31 | +| test.rs:470:26:470:31 | pinned | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | provenance | MaD:15 | | test.rs:470:26:470:54 | pinned.poll_fill_buf(...) [Ready, Ok] | test.rs:470:17:470:22 | buffer [Ready, Ok] | provenance | | | test.rs:471:19:471:24 | buffer [Ready, Ok] | test.rs:471:18:471:24 | &buffer | provenance | | | test.rs:472:20:472:39 | ...::Ready(...) [Ready, Ok] | test.rs:472:32:472:38 | Ok(...) [Ok] | provenance | | | test.rs:472:32:472:38 | Ok(...) [Ok] | test.rs:472:35:472:37 | buf | provenance | | | test.rs:472:35:472:37 | buf | test.rs:473:22:473:24 | buf | provenance | | | test.rs:479:17:479:22 | buffer | test.rs:480:18:480:23 | buffer | provenance | | -| test.rs:479:26:479:32 | reader2 | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:33 | +| test.rs:479:26:479:32 | reader2 | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | provenance | MaD:18 | | test.rs:479:26:479:43 | reader2.fill_buf() [future, Ok] | test.rs:479:26:479:49 | await ... [Ok] | provenance | | | test.rs:479:26:479:49 | await ... [Ok] | test.rs:479:26:479:50 | TryExpr | provenance | | | test.rs:479:26:479:50 | TryExpr | test.rs:479:17:479:22 | buffer | provenance | | -| test.rs:486:31:486:37 | reader2 | test.rs:486:57:486:65 | [post] &mut line [&ref] | provenance | MaD:35 | +| test.rs:486:31:486:37 | reader2 | test.rs:486:57:486:65 | [post] &mut line [&ref] | provenance | MaD:20 | | test.rs:486:57:486:65 | [post] &mut line [&ref] | test.rs:486:62:486:65 | [post] line | provenance | | | test.rs:486:62:486:65 | [post] line | test.rs:487:19:487:22 | line | provenance | | | test.rs:487:19:487:22 | line | test.rs:487:18:487:22 | &line | provenance | | -| test.rs:493:31:493:37 | reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:34 | +| test.rs:493:31:493:37 | reader2 | test.rs:493:49:493:57 | [post] &mut line [&ref] | provenance | MaD:19 | | test.rs:493:49:493:57 | [post] &mut line [&ref] | test.rs:493:54:493:57 | [post] line | provenance | | | test.rs:493:54:493:57 | [post] line | test.rs:494:19:494:22 | line | provenance | | | test.rs:494:19:494:22 | line | test.rs:494:18:494:22 | &line | provenance | | -| test.rs:500:31:500:37 | reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:37 | +| test.rs:500:31:500:37 | reader2 | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:500:51:500:61 | [post] &mut buffer [&ref] | test.rs:500:56:500:61 | [post] buffer | provenance | | | test.rs:500:56:500:61 | [post] buffer | test.rs:501:19:501:24 | buffer | provenance | | | test.rs:501:19:501:24 | buffer | test.rs:501:18:501:24 | &buffer | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected index 02ca3cbc184d..ee6f7abf3bca 100644 --- a/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/stdin/InlineFlow.expected @@ -1,161 +1,161 @@ models | 1 | Source: std::io::stdio::stdin; ReturnValue; stdin | | 2 | Source: tokio::io::stdin::stdin; ReturnValue; stdin | -| 3 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 4 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 5 | Summary: ::next; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; value | -| 6 | Summary: ::fill_buf; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 7 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | -| 8 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 9 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | -| 10 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 11 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 12 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 13 | Summary: ::lock; Argument[self].Reference; ReturnValue; taint | -| 14 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 15 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | -| 16 | Summary: ::new; Argument[0]; ReturnValue; taint | -| 17 | Summary: ::next_line; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 18 | Summary: ::next_segment; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | -| 19 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 20 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 21 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 22 | Summary: std::io::BufRead::lines; Argument[self]; ReturnValue; taint | -| 23 | Summary: std::io::BufRead::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 24 | Summary: std::io::BufRead::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 25 | Summary: std::io::BufRead::split; Argument[self]; ReturnValue; taint | -| 26 | Summary: std::io::Read::bytes; Argument[self]; ReturnValue; taint | -| 27 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 28 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::lines; Argument[self]; ReturnValue; taint | -| 29 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_line; Argument[self].Reference; Argument[0].Reference; taint | -| 30 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::read_until; Argument[self].Reference; Argument[1].Reference; taint | -| 31 | Summary: tokio::io::util::async_buf_read_ext::AsyncBufReadExt::split; Argument[self]; ReturnValue; taint | -| 32 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read; Argument[self].Reference; Argument[0].Reference; taint | -| 33 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_buf; Argument[self].Reference; Argument[0].Reference; taint | -| 34 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_exact; Argument[self].Reference; Argument[0].Reference; taint | -| 35 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 36 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 37 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | -| 38 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | -| 39 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | -| 40 | Summary: tokio::io::util::async_read_ext::AsyncReadExt::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 3 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 4 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 5 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 6 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 7 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 8 | Summary: ::lines; Argument[self]; ReturnValue; taint | +| 9 | Summary: ::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 10 | Summary: ::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 11 | Summary: ::split; Argument[self]; ReturnValue; taint | +| 12 | Summary: ::bytes; Argument[self]; ReturnValue; taint | +| 13 | Summary: ::next; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)].Field[core::result::Result::Ok(0)]; value | +| 14 | Summary: ::fill_buf; Argument[self].Reference; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 15 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | +| 16 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 17 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 18 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 19 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 20 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 21 | Summary: ::lock; Argument[self].Reference; ReturnValue; taint | +| 22 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 23 | Summary: ::fill_buf; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 24 | Summary: ::lines; Argument[self]; ReturnValue; taint | +| 25 | Summary: ::read_line; Argument[self].Reference; Argument[0].Reference; taint | +| 26 | Summary: ::read_until; Argument[self].Reference; Argument[1].Reference; taint | +| 27 | Summary: ::split; Argument[self]; ReturnValue; taint | +| 28 | Summary: ::read; Argument[self].Reference; Argument[0].Reference; taint | +| 29 | Summary: ::read_buf; Argument[self].Reference; Argument[0].Reference; taint | +| 30 | Summary: ::read_exact; Argument[self].Reference; Argument[0].Reference; taint | +| 31 | Summary: ::read_f32; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 32 | Summary: ::read_i16; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 33 | Summary: ::read_i64_le; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 34 | Summary: ::read_to_end; Argument[self].Reference; Argument[0].Reference; taint | +| 35 | Summary: ::read_to_string; Argument[self].Reference; Argument[0].Reference; taint | +| 36 | Summary: ::read_u8; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)]; taint | +| 37 | Summary: ::buffer; Argument[self].Reference; ReturnValue.Reference; taint | +| 38 | Summary: ::new; Argument[0]; ReturnValue; taint | +| 39 | Summary: ::next_line; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | +| 40 | Summary: ::next_segment; Argument[self].Reference; ReturnValue.Future.Field[core::result::Result::Ok(0)].Field[core::option::Option::Some(0)]; taint | edges | test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:22:13:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | provenance | MaD:9 | +| test.rs:13:22:13:37 | ...::stdin(...) | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | provenance | MaD:17 | | test.rs:13:44:13:54 | [post] &mut buffer [&ref] | test.rs:13:49:13:54 | [post] buffer | provenance | | | test.rs:13:49:13:54 | [post] buffer | test.rs:14:15:14:20 | buffer | provenance | | | test.rs:14:15:14:20 | buffer | test.rs:14:14:14:20 | &buffer | provenance | | | test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:22:19:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | provenance | MaD:11 | +| test.rs:19:22:19:37 | ...::stdin(...) | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | provenance | MaD:19 | | test.rs:19:51:19:61 | [post] &mut buffer [&ref] | test.rs:19:56:19:61 | [post] buffer | provenance | | | test.rs:19:56:19:61 | [post] buffer | test.rs:20:15:20:20 | buffer | provenance | | | test.rs:20:15:20:20 | buffer | test.rs:20:14:20:20 | &buffer | provenance | | | test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:22:25:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | provenance | MaD:12 | +| test.rs:25:22:25:37 | ...::stdin(...) | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | provenance | MaD:20 | | test.rs:25:54:25:64 | [post] &mut buffer [&ref] | test.rs:25:59:25:64 | [post] buffer | provenance | | | test.rs:25:59:25:64 | [post] buffer | test.rs:26:15:26:20 | buffer | provenance | | | test.rs:26:15:26:20 | buffer | test.rs:26:14:26:20 | &buffer | provenance | | | test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:37 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:44 | ... .lock() | provenance | MaD:13 | -| test.rs:31:22:31:44 | ... .lock() | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | provenance | MaD:14 | +| test.rs:31:22:31:37 | ...::stdin(...) | test.rs:31:22:31:44 | ... .lock() | provenance | MaD:21 | +| test.rs:31:22:31:44 | ... .lock() | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | provenance | MaD:22 | | test.rs:31:61:31:71 | [post] &mut buffer [&ref] | test.rs:31:66:31:71 | [post] buffer | provenance | | | test.rs:31:66:31:71 | [post] buffer | test.rs:32:15:32:20 | buffer | provenance | | | test.rs:32:15:32:20 | buffer | test.rs:32:14:32:20 | &buffer | provenance | | | test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:9:37:24 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | provenance | MaD:10 | +| test.rs:37:9:37:24 | ...::stdin(...) | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | provenance | MaD:18 | | test.rs:37:37:37:47 | [post] &mut buffer [&ref] | test.rs:37:42:37:47 | [post] buffer | provenance | | | test.rs:37:42:37:47 | [post] buffer | test.rs:38:15:38:20 | buffer | provenance | | | test.rs:38:15:38:20 | buffer | test.rs:38:14:38:20 | &buffer | provenance | | | test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:32 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:40 | ... .bytes() | provenance | MaD:26 | +| test.rs:41:17:41:32 | ...::stdin(...) | test.rs:41:17:41:40 | ... .bytes() | provenance | MaD:12 | | test.rs:41:17:41:40 | ... .bytes() | test.rs:42:14:42:17 | byte | provenance | | | test.rs:48:13:48:22 | mut reader | test.rs:49:20:49:25 | reader | provenance | | | test.rs:48:26:48:66 | ...::new(...) | test.rs:48:13:48:22 | mut reader | provenance | | -| test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:26:48:66 | ...::new(...) | provenance | MaD:8 | +| test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:26:48:66 | ...::new(...) | provenance | MaD:16 | | test.rs:48:50:48:65 | ...::stdin(...) | test.rs:48:50:48:65 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:49:13:49:16 | data | test.rs:50:15:50:18 | data | provenance | | -| test.rs:49:20:49:25 | reader | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | provenance | MaD:6 | +| test.rs:49:20:49:25 | reader | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | provenance | MaD:14 | | test.rs:49:20:49:36 | reader.fill_buf() [Ok] | test.rs:49:20:49:37 | TryExpr | provenance | | | test.rs:49:20:49:37 | TryExpr | test.rs:49:13:49:16 | data | provenance | | | test.rs:50:15:50:18 | data | test.rs:50:14:50:18 | &data | provenance | | | test.rs:54:13:54:18 | reader | test.rs:55:20:55:25 | reader | provenance | | | test.rs:54:22:54:62 | ...::new(...) | test.rs:54:13:54:18 | reader | provenance | | -| test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:22:54:62 | ...::new(...) | provenance | MaD:8 | +| test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:22:54:62 | ...::new(...) | provenance | MaD:16 | | test.rs:54:46:54:61 | ...::stdin(...) | test.rs:54:46:54:61 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:55:13:55:16 | data [&ref] | test.rs:56:15:56:18 | data [&ref] | provenance | | -| test.rs:55:20:55:25 | reader | test.rs:55:20:55:34 | reader.buffer() [&ref] | provenance | MaD:7 | +| test.rs:55:20:55:25 | reader | test.rs:55:20:55:34 | reader.buffer() [&ref] | provenance | MaD:15 | | test.rs:55:20:55:34 | reader.buffer() [&ref] | test.rs:55:13:55:16 | data [&ref] | provenance | | | test.rs:56:15:56:18 | data [&ref] | test.rs:56:14:56:18 | &data | provenance | | | test.rs:61:13:61:22 | mut reader | test.rs:62:9:62:14 | reader | provenance | | | test.rs:61:26:61:66 | ...::new(...) | test.rs:61:13:61:22 | mut reader | provenance | | -| test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:26:61:66 | ...::new(...) | provenance | MaD:8 | +| test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:26:61:66 | ...::new(...) | provenance | MaD:16 | | test.rs:61:50:61:65 | ...::stdin(...) | test.rs:61:50:61:65 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:62:9:62:14 | reader | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | provenance | MaD:23 | +| test.rs:62:9:62:14 | reader | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | provenance | MaD:9 | | test.rs:62:26:62:36 | [post] &mut buffer [&ref] | test.rs:62:31:62:36 | [post] buffer | provenance | | | test.rs:62:31:62:36 | [post] buffer | test.rs:63:15:63:20 | buffer | provenance | | | test.rs:63:15:63:20 | buffer | test.rs:63:14:63:20 | &buffer | provenance | | | test.rs:68:13:68:22 | mut reader | test.rs:69:9:69:14 | reader | provenance | | | test.rs:68:26:68:66 | ...::new(...) | test.rs:68:13:68:22 | mut reader | provenance | | -| test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:26:68:66 | ...::new(...) | provenance | MaD:8 | +| test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:26:68:66 | ...::new(...) | provenance | MaD:16 | | test.rs:68:50:68:65 | ...::stdin(...) | test.rs:68:50:68:65 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:69:9:69:14 | reader | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | provenance | MaD:24 | +| test.rs:69:9:69:14 | reader | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | provenance | MaD:10 | | test.rs:69:33:69:43 | [post] &mut buffer [&ref] | test.rs:69:38:69:43 | [post] buffer | provenance | | | test.rs:69:38:69:43 | [post] buffer | test.rs:70:15:70:20 | buffer | provenance | | | test.rs:69:38:69:43 | [post] buffer | test.rs:71:14:71:19 | buffer | provenance | | | test.rs:70:15:70:20 | buffer | test.rs:70:14:70:20 | &buffer | provenance | | -| test.rs:71:14:71:19 | buffer | test.rs:71:14:71:22 | buffer[0] | provenance | MaD:21 | +| test.rs:71:14:71:19 | buffer | test.rs:71:14:71:22 | buffer[0] | provenance | MaD:5 | | test.rs:75:13:75:28 | mut reader_split | test.rs:76:14:76:25 | reader_split | provenance | | | test.rs:75:13:75:28 | mut reader_split | test.rs:77:33:77:44 | reader_split | provenance | | -| test.rs:75:32:75:72 | ...::new(...) | test.rs:75:32:75:84 | ... .split(...) | provenance | MaD:25 | +| test.rs:75:32:75:72 | ...::new(...) | test.rs:75:32:75:84 | ... .split(...) | provenance | MaD:11 | | test.rs:75:32:75:84 | ... .split(...) | test.rs:75:13:75:28 | mut reader_split | provenance | | -| test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:32:75:72 | ...::new(...) | provenance | MaD:8 | +| test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:32:75:72 | ...::new(...) | provenance | MaD:16 | | test.rs:75:56:75:71 | ...::stdin(...) | test.rs:75:56:75:71 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:76:14:76:25 | reader_split | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | provenance | MaD:5 | -| test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | test.rs:76:14:76:41 | ... .unwrap() [Ok] | provenance | MaD:3 | -| test.rs:76:14:76:41 | ... .unwrap() [Ok] | test.rs:76:14:76:50 | ... .unwrap() | provenance | MaD:4 | +| test.rs:76:14:76:25 | reader_split | test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | provenance | MaD:13 | +| test.rs:76:14:76:32 | reader_split.next() [Some, Ok] | test.rs:76:14:76:41 | ... .unwrap() [Ok] | provenance | MaD:6 | +| test.rs:76:14:76:41 | ... .unwrap() [Ok] | test.rs:76:14:76:50 | ... .unwrap() | provenance | MaD:7 | | test.rs:77:19:77:29 | Some(...) [Some, Ok] | test.rs:77:24:77:28 | chunk [Ok] | provenance | | | test.rs:77:24:77:28 | chunk [Ok] | test.rs:78:18:78:22 | chunk [Ok] | provenance | | -| test.rs:77:33:77:44 | reader_split | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | provenance | MaD:5 | +| test.rs:77:33:77:44 | reader_split | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | provenance | MaD:13 | | test.rs:77:33:77:51 | reader_split.next() [Some, Ok] | test.rs:77:19:77:29 | Some(...) [Some, Ok] | provenance | | -| test.rs:78:18:78:22 | chunk [Ok] | test.rs:78:18:78:31 | chunk.unwrap() | provenance | MaD:4 | +| test.rs:78:18:78:22 | chunk [Ok] | test.rs:78:18:78:31 | chunk.unwrap() | provenance | MaD:7 | | test.rs:83:13:83:18 | reader | test.rs:84:21:84:26 | reader | provenance | | | test.rs:83:22:83:62 | ...::new(...) | test.rs:83:13:83:18 | reader | provenance | | -| test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:22:83:62 | ...::new(...) | provenance | MaD:8 | +| test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:22:83:62 | ...::new(...) | provenance | MaD:16 | | test.rs:83:46:83:61 | ...::stdin(...) | test.rs:83:46:83:61 | ...::stdin(...) | provenance | Src:MaD:1 | -| test.rs:84:21:84:26 | reader | test.rs:84:21:84:34 | reader.lines() | provenance | MaD:22 | +| test.rs:84:21:84:26 | reader | test.rs:84:21:84:34 | reader.lines() | provenance | MaD:8 | | test.rs:84:21:84:34 | reader.lines() | test.rs:85:18:85:21 | line | provenance | | | test.rs:90:13:90:18 | reader | test.rs:91:20:91:25 | reader | provenance | | | test.rs:90:22:90:62 | ...::new(...) | test.rs:90:13:90:18 | reader | provenance | | -| test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:22:90:62 | ...::new(...) | provenance | MaD:8 | +| test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:22:90:62 | ...::new(...) | provenance | MaD:16 | | test.rs:90:46:90:61 | ...::stdin(...) | test.rs:90:46:90:61 | ...::stdin(...) | provenance | Src:MaD:1 | | test.rs:91:13:91:16 | line | test.rs:92:14:92:17 | line | provenance | | -| test.rs:91:20:91:25 | reader | test.rs:91:20:91:33 | reader.lines() | provenance | MaD:22 | -| test.rs:91:20:91:33 | reader.lines() | test.rs:91:20:91:40 | ... .nth(...) [Some] | provenance | MaD:20 | -| test.rs:91:20:91:40 | ... .nth(...) [Some] | test.rs:91:20:91:49 | ... .unwrap() | provenance | MaD:3 | +| test.rs:91:20:91:25 | reader | test.rs:91:20:91:33 | reader.lines() | provenance | MaD:8 | +| test.rs:91:20:91:33 | reader.lines() | test.rs:91:20:91:40 | ... .nth(...) [Some] | provenance | MaD:4 | +| test.rs:91:20:91:40 | ... .nth(...) [Some] | test.rs:91:20:91:49 | ... .unwrap() | provenance | MaD:6 | | test.rs:91:20:91:49 | ... .unwrap() | test.rs:91:13:91:16 | line | provenance | | -| test.rs:92:14:92:17 | line | test.rs:92:14:92:26 | line.unwrap() | provenance | MaD:4 | -| test.rs:92:14:92:26 | line.unwrap() | test.rs:92:14:92:34 | ... .clone() | provenance | MaD:19 | +| test.rs:92:14:92:17 | line | test.rs:92:14:92:26 | line.unwrap() | provenance | MaD:7 | +| test.rs:92:14:92:26 | line.unwrap() | test.rs:92:14:92:34 | ... .clone() | provenance | MaD:3 | | test.rs:109:13:109:21 | mut stdin | test.rs:111:22:111:26 | stdin | provenance | | | test.rs:109:25:109:42 | ...::stdin(...) | test.rs:109:13:109:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:111:22:111:26 | stdin | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | provenance | MaD:32 | +| test.rs:111:22:111:26 | stdin | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | provenance | MaD:28 | | test.rs:111:33:111:43 | [post] &mut buffer [&ref] | test.rs:111:38:111:43 | [post] buffer | provenance | | | test.rs:111:38:111:43 | [post] buffer | test.rs:112:15:112:20 | buffer | provenance | | | test.rs:112:15:112:20 | buffer | test.rs:112:14:112:20 | &buffer | provenance | | | test.rs:116:13:116:21 | mut stdin | test.rs:118:22:118:26 | stdin | provenance | | | test.rs:116:25:116:42 | ...::stdin(...) | test.rs:116:13:116:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:118:22:118:26 | stdin | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | provenance | MaD:38 | +| test.rs:118:22:118:26 | stdin | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | provenance | MaD:34 | | test.rs:118:40:118:50 | [post] &mut buffer [&ref] | test.rs:118:45:118:50 | [post] buffer | provenance | | | test.rs:118:45:118:50 | [post] buffer | test.rs:119:15:119:20 | buffer | provenance | | | test.rs:119:15:119:20 | buffer | test.rs:119:14:119:20 | &buffer | provenance | | | test.rs:123:13:123:21 | mut stdin | test.rs:125:22:125:26 | stdin | provenance | | | test.rs:123:25:123:42 | ...::stdin(...) | test.rs:123:13:123:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:125:22:125:26 | stdin | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | provenance | MaD:39 | +| test.rs:125:22:125:26 | stdin | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | provenance | MaD:35 | | test.rs:125:43:125:53 | [post] &mut buffer [&ref] | test.rs:125:48:125:53 | [post] buffer | provenance | | | test.rs:125:48:125:53 | [post] buffer | test.rs:126:15:126:20 | buffer | provenance | | | test.rs:126:15:126:20 | buffer | test.rs:126:14:126:20 | &buffer | provenance | | | test.rs:130:13:130:21 | mut stdin | test.rs:132:9:132:13 | stdin | provenance | | | test.rs:130:25:130:42 | ...::stdin(...) | test.rs:130:13:130:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:132:9:132:13 | stdin | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | provenance | MaD:34 | +| test.rs:132:9:132:13 | stdin | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | provenance | MaD:30 | | test.rs:132:26:132:36 | [post] &mut buffer [&ref] | test.rs:132:31:132:36 | [post] buffer | provenance | | | test.rs:132:31:132:36 | [post] buffer | test.rs:133:15:133:20 | buffer | provenance | | | test.rs:133:15:133:20 | buffer | test.rs:133:14:133:20 | &buffer | provenance | | @@ -165,98 +165,98 @@ edges | test.rs:137:13:137:21 | mut stdin | test.rs:141:18:141:22 | stdin | provenance | | | test.rs:137:25:137:42 | ...::stdin(...) | test.rs:137:13:137:21 | mut stdin | provenance | Src:MaD:2 | | test.rs:138:13:138:14 | v1 | test.rs:142:14:142:15 | v1 | provenance | | -| test.rs:138:18:138:22 | stdin | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | provenance | MaD:40 | +| test.rs:138:18:138:22 | stdin | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | provenance | MaD:36 | | test.rs:138:18:138:32 | stdin.read_u8() [future, Ok] | test.rs:138:18:138:38 | await ... [Ok] | provenance | | | test.rs:138:18:138:38 | await ... [Ok] | test.rs:138:18:138:39 | TryExpr | provenance | | | test.rs:138:18:138:39 | TryExpr | test.rs:138:13:138:14 | v1 | provenance | | | test.rs:139:13:139:14 | v2 | test.rs:143:14:143:15 | v2 | provenance | | -| test.rs:139:18:139:22 | stdin | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | provenance | MaD:36 | +| test.rs:139:18:139:22 | stdin | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | provenance | MaD:32 | | test.rs:139:18:139:33 | stdin.read_i16() [future, Ok] | test.rs:139:18:139:39 | await ... [Ok] | provenance | | | test.rs:139:18:139:39 | await ... [Ok] | test.rs:139:18:139:40 | TryExpr | provenance | | | test.rs:139:18:139:40 | TryExpr | test.rs:139:13:139:14 | v2 | provenance | | | test.rs:140:13:140:14 | v3 | test.rs:144:14:144:15 | v3 | provenance | | -| test.rs:140:18:140:22 | stdin | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | provenance | MaD:35 | +| test.rs:140:18:140:22 | stdin | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | provenance | MaD:31 | | test.rs:140:18:140:33 | stdin.read_f32() [future, Ok] | test.rs:140:18:140:39 | await ... [Ok] | provenance | | | test.rs:140:18:140:39 | await ... [Ok] | test.rs:140:18:140:40 | TryExpr | provenance | | | test.rs:140:18:140:40 | TryExpr | test.rs:140:13:140:14 | v3 | provenance | | | test.rs:141:13:141:14 | v4 | test.rs:145:14:145:15 | v4 | provenance | | -| test.rs:141:18:141:22 | stdin | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:37 | +| test.rs:141:18:141:22 | stdin | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | provenance | MaD:33 | | test.rs:141:18:141:36 | stdin.read_i64_le() [future, Ok] | test.rs:141:18:141:42 | await ... [Ok] | provenance | | | test.rs:141:18:141:42 | await ... [Ok] | test.rs:141:18:141:43 | TryExpr | provenance | | | test.rs:141:18:141:43 | TryExpr | test.rs:141:13:141:14 | v4 | provenance | | | test.rs:149:13:149:21 | mut stdin | test.rs:151:9:151:13 | stdin | provenance | | | test.rs:149:25:149:42 | ...::stdin(...) | test.rs:149:13:149:21 | mut stdin | provenance | Src:MaD:2 | -| test.rs:151:9:151:13 | stdin | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | provenance | MaD:33 | +| test.rs:151:9:151:13 | stdin | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | provenance | MaD:29 | | test.rs:151:24:151:34 | [post] &mut buffer [&ref] | test.rs:151:29:151:34 | [post] buffer | provenance | | | test.rs:151:29:151:34 | [post] buffer | test.rs:152:15:152:20 | buffer | provenance | | | test.rs:152:15:152:20 | buffer | test.rs:152:14:152:20 | &buffer | provenance | | | test.rs:158:13:158:22 | mut reader | test.rs:159:20:159:25 | reader | provenance | | | test.rs:158:26:158:70 | ...::new(...) | test.rs:158:13:158:22 | mut reader | provenance | | -| test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:26:158:70 | ...::new(...) | provenance | MaD:16 | +| test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:26:158:70 | ...::new(...) | provenance | MaD:38 | | test.rs:158:52:158:69 | ...::stdin(...) | test.rs:158:52:158:69 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:159:13:159:16 | data | test.rs:160:15:160:18 | data | provenance | | -| test.rs:159:20:159:25 | reader | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | provenance | MaD:27 | +| test.rs:159:20:159:25 | reader | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | provenance | MaD:23 | | test.rs:159:20:159:36 | reader.fill_buf() [future, Ok] | test.rs:159:20:159:42 | await ... [Ok] | provenance | | | test.rs:159:20:159:42 | await ... [Ok] | test.rs:159:20:159:43 | TryExpr | provenance | | | test.rs:159:20:159:43 | TryExpr | test.rs:159:13:159:16 | data | provenance | | | test.rs:160:15:160:18 | data | test.rs:160:14:160:18 | &data | provenance | | | test.rs:164:13:164:18 | reader | test.rs:165:20:165:25 | reader | provenance | | | test.rs:164:22:164:66 | ...::new(...) | test.rs:164:13:164:18 | reader | provenance | | -| test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:22:164:66 | ...::new(...) | provenance | MaD:16 | +| test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:22:164:66 | ...::new(...) | provenance | MaD:38 | | test.rs:164:48:164:65 | ...::stdin(...) | test.rs:164:48:164:65 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:165:13:165:16 | data [&ref] | test.rs:166:15:166:18 | data [&ref] | provenance | | -| test.rs:165:20:165:25 | reader | test.rs:165:20:165:34 | reader.buffer() [&ref] | provenance | MaD:15 | +| test.rs:165:20:165:25 | reader | test.rs:165:20:165:34 | reader.buffer() [&ref] | provenance | MaD:37 | | test.rs:165:20:165:34 | reader.buffer() [&ref] | test.rs:165:13:165:16 | data [&ref] | provenance | | | test.rs:166:15:166:18 | data [&ref] | test.rs:166:14:166:18 | &data | provenance | | | test.rs:171:13:171:22 | mut reader | test.rs:172:9:172:14 | reader | provenance | | | test.rs:171:26:171:70 | ...::new(...) | test.rs:171:13:171:22 | mut reader | provenance | | -| test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:26:171:70 | ...::new(...) | provenance | MaD:16 | +| test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:26:171:70 | ...::new(...) | provenance | MaD:38 | | test.rs:171:52:171:69 | ...::stdin(...) | test.rs:171:52:171:69 | ...::stdin(...) | provenance | Src:MaD:2 | -| test.rs:172:9:172:14 | reader | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | provenance | MaD:29 | +| test.rs:172:9:172:14 | reader | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | provenance | MaD:25 | | test.rs:172:26:172:36 | [post] &mut buffer [&ref] | test.rs:172:31:172:36 | [post] buffer | provenance | | | test.rs:172:31:172:36 | [post] buffer | test.rs:173:15:173:20 | buffer | provenance | | | test.rs:173:15:173:20 | buffer | test.rs:173:14:173:20 | &buffer | provenance | | | test.rs:178:13:178:22 | mut reader | test.rs:179:9:179:14 | reader | provenance | | | test.rs:178:26:178:70 | ...::new(...) | test.rs:178:13:178:22 | mut reader | provenance | | -| test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:26:178:70 | ...::new(...) | provenance | MaD:16 | +| test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:26:178:70 | ...::new(...) | provenance | MaD:38 | | test.rs:178:52:178:69 | ...::stdin(...) | test.rs:178:52:178:69 | ...::stdin(...) | provenance | Src:MaD:2 | -| test.rs:179:9:179:14 | reader | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | provenance | MaD:30 | +| test.rs:179:9:179:14 | reader | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | provenance | MaD:26 | | test.rs:179:33:179:43 | [post] &mut buffer [&ref] | test.rs:179:38:179:43 | [post] buffer | provenance | | | test.rs:179:38:179:43 | [post] buffer | test.rs:180:15:180:20 | buffer | provenance | | | test.rs:179:38:179:43 | [post] buffer | test.rs:181:14:181:19 | buffer | provenance | | | test.rs:180:15:180:20 | buffer | test.rs:180:14:180:20 | &buffer | provenance | | -| test.rs:181:14:181:19 | buffer | test.rs:181:14:181:22 | buffer[0] | provenance | MaD:21 | +| test.rs:181:14:181:19 | buffer | test.rs:181:14:181:22 | buffer[0] | provenance | MaD:5 | | test.rs:185:13:185:28 | mut reader_split | test.rs:186:14:186:25 | reader_split | provenance | | | test.rs:185:13:185:28 | mut reader_split | test.rs:187:33:187:44 | reader_split | provenance | | -| test.rs:185:32:185:76 | ...::new(...) | test.rs:185:32:185:88 | ... .split(...) | provenance | MaD:31 | +| test.rs:185:32:185:76 | ...::new(...) | test.rs:185:32:185:88 | ... .split(...) | provenance | MaD:27 | | test.rs:185:32:185:88 | ... .split(...) | test.rs:185:13:185:28 | mut reader_split | provenance | | -| test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:32:185:76 | ...::new(...) | provenance | MaD:16 | +| test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:32:185:76 | ...::new(...) | provenance | MaD:38 | | test.rs:185:58:185:75 | ...::stdin(...) | test.rs:185:58:185:75 | ...::stdin(...) | provenance | Src:MaD:2 | -| test.rs:186:14:186:25 | reader_split | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:18 | +| test.rs:186:14:186:25 | reader_split | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:40 | | test.rs:186:14:186:40 | reader_split.next_segment() [future, Ok, Some] | test.rs:186:14:186:46 | await ... [Ok, Some] | provenance | | | test.rs:186:14:186:46 | await ... [Ok, Some] | test.rs:186:14:186:47 | TryExpr [Some] | provenance | | -| test.rs:186:14:186:47 | TryExpr [Some] | test.rs:186:14:186:56 | ... .unwrap() | provenance | MaD:3 | +| test.rs:186:14:186:47 | TryExpr [Some] | test.rs:186:14:186:56 | ... .unwrap() | provenance | MaD:6 | | test.rs:187:19:187:29 | Some(...) [Some] | test.rs:187:24:187:28 | chunk | provenance | | | test.rs:187:24:187:28 | chunk | test.rs:188:18:188:22 | chunk | provenance | | -| test.rs:187:33:187:44 | reader_split | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:18 | +| test.rs:187:33:187:44 | reader_split | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | provenance | MaD:40 | | test.rs:187:33:187:59 | reader_split.next_segment() [future, Ok, Some] | test.rs:187:33:187:65 | await ... [Ok, Some] | provenance | | | test.rs:187:33:187:65 | await ... [Ok, Some] | test.rs:187:33:187:66 | TryExpr [Some] | provenance | | | test.rs:187:33:187:66 | TryExpr [Some] | test.rs:187:19:187:29 | Some(...) [Some] | provenance | | | test.rs:193:13:193:18 | reader | test.rs:194:25:194:30 | reader | provenance | | | test.rs:193:22:193:66 | ...::new(...) | test.rs:193:13:193:18 | reader | provenance | | -| test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:22:193:66 | ...::new(...) | provenance | MaD:16 | +| test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:22:193:66 | ...::new(...) | provenance | MaD:38 | | test.rs:193:48:193:65 | ...::stdin(...) | test.rs:193:48:193:65 | ...::stdin(...) | provenance | Src:MaD:2 | | test.rs:194:13:194:21 | mut lines | test.rs:195:14:195:18 | lines | provenance | | | test.rs:194:13:194:21 | mut lines | test.rs:196:32:196:36 | lines | provenance | | -| test.rs:194:25:194:30 | reader | test.rs:194:25:194:38 | reader.lines() | provenance | MaD:28 | +| test.rs:194:25:194:30 | reader | test.rs:194:25:194:38 | reader.lines() | provenance | MaD:24 | | test.rs:194:25:194:38 | reader.lines() | test.rs:194:13:194:21 | mut lines | provenance | | -| test.rs:195:14:195:18 | lines | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:17 | +| test.rs:195:14:195:18 | lines | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | provenance | MaD:39 | | test.rs:195:14:195:30 | lines.next_line() [future, Ok, Some] | test.rs:195:14:195:36 | await ... [Ok, Some] | provenance | | | test.rs:195:14:195:36 | await ... [Ok, Some] | test.rs:195:14:195:37 | TryExpr [Some] | provenance | | -| test.rs:195:14:195:37 | TryExpr [Some] | test.rs:195:14:195:46 | ... .unwrap() | provenance | MaD:3 | +| test.rs:195:14:195:37 | TryExpr [Some] | test.rs:195:14:195:46 | ... .unwrap() | provenance | MaD:6 | | test.rs:196:19:196:28 | Some(...) [Some] | test.rs:196:24:196:27 | line | provenance | | | test.rs:196:24:196:27 | line | test.rs:197:18:197:21 | line | provenance | | -| test.rs:196:32:196:36 | lines | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:17 | +| test.rs:196:32:196:36 | lines | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | provenance | MaD:39 | | test.rs:196:32:196:48 | lines.next_line() [future, Ok, Some] | test.rs:196:32:196:54 | await ... [Ok, Some] | provenance | | | test.rs:196:32:196:54 | await ... [Ok, Some] | test.rs:196:32:196:55 | TryExpr [Some] | provenance | | | test.rs:196:32:196:55 | TryExpr [Some] | test.rs:196:19:196:28 | Some(...) [Some] | provenance | | diff --git a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected index 1a4b8bf8faac..c1f6cce28888 100644 --- a/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected +++ b/rust/ql/test/library-tests/dataflow/sources/web_frameworks/InlineFlow.expected @@ -3,12 +3,12 @@ models | 2 | Source: ::to; Argument[0].Parameter[0..7]; remote | | 3 | Source: ::get; Argument[0].Parameter[0..7]; remote | | 4 | Source: ::on; Argument[1].Parameter[0..7]; remote | -| 5 | Source: axum::routing::method_routing::get; Argument[0].Parameter[0..7]; remote | -| 6 | Source: axum::routing::method_routing::post; Argument[0].Parameter[0..7]; remote | -| 7 | Source: axum::routing::method_routing::put; Argument[0].Parameter[0..7]; remote | -| 8 | Source: warp::filter::Filter::and_then; Argument[0].Parameter[0..7]; remote | -| 9 | Source: warp::filter::Filter::map; Argument[0].Parameter[0..7]; remote | -| 10 | Source: warp::filter::Filter::then; Argument[0].Parameter[0..7]; remote | +| 5 | Source: ::and_then; Argument[0].Parameter[0..7]; remote | +| 6 | Source: ::map; Argument[0].Parameter[0..7]; remote | +| 7 | Source: ::then; Argument[0].Parameter[0..7]; remote | +| 8 | Source: axum::routing::method_routing::get; Argument[0].Parameter[0..7]; remote | +| 9 | Source: axum::routing::method_routing::post; Argument[0].Parameter[0..7]; remote | +| 10 | Source: axum::routing::method_routing::put; Argument[0].Parameter[0..7]; remote | | 11 | Summary: ::into_inner; Argument[self]; ReturnValue; taint | | 12 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference.Element; taint | | 13 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | @@ -45,20 +45,20 @@ edges | test.rs:133:44:133:61 | my_actix_handler_3 | test.rs:116:14:116:14 | a | provenance | Src:MaD:2 | | test.rs:148:14:148:14 | a | test.rs:148:14:148:23 | a.as_str() | provenance | MaD:13 | | test.rs:149:14:149:14 | a | test.rs:149:14:149:25 | a.as_bytes() | provenance | MaD:12 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:148:14:148:14 | a | provenance | Src:MaD:5 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:149:14:149:14 | a | provenance | Src:MaD:5 | -| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:150:14:150:14 | a | provenance | Src:MaD:5 | -| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:156:14:156:14 | a | provenance | Src:MaD:6 | -| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:157:14:157:14 | b | provenance | Src:MaD:6 | -| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:164:18:164:20 | key | provenance | Src:MaD:7 | -| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:165:18:165:22 | value | provenance | Src:MaD:7 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:148:14:148:14 | a | provenance | Src:MaD:8 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:149:14:149:14 | a | provenance | Src:MaD:8 | +| test.rs:200:34:200:50 | my_axum_handler_1 | test.rs:150:14:150:14 | a | provenance | Src:MaD:8 | +| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:156:14:156:14 | a | provenance | Src:MaD:9 | +| test.rs:201:39:201:55 | my_axum_handler_2 | test.rs:157:14:157:14 | b | provenance | Src:MaD:9 | +| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:164:18:164:20 | key | provenance | Src:MaD:10 | +| test.rs:202:33:202:49 | my_axum_handler_3 | test.rs:165:18:165:22 | value | provenance | Src:MaD:10 | | test.rs:205:65:205:81 | my_axum_handler_5 | test.rs:181:14:181:20 | payload | provenance | Src:MaD:4 | -| test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:187:14:187:17 | body | provenance | Src:MaD:5 | +| test.rs:207:33:207:49 | my_axum_handler_6 | test.rs:187:14:187:17 | body | provenance | Src:MaD:8 | | test.rs:207:56:207:72 | my_axum_handler_7 | test.rs:193:14:193:17 | body | provenance | Src:MaD:3 | -| test.rs:222:37:227:9 | \|...\| ... | test.rs:224:18:224:18 | a | provenance | Src:MaD:9 | -| test.rs:231:13:235:13 | \|...\| ... | test.rs:232:22:232:22 | a | provenance | Src:MaD:10 | -| test.rs:240:13:248:9 | \|...\| ... | test.rs:243:22:243:23 | id | provenance | Src:MaD:8 | -| test.rs:253:13:258:14 | \|...\| ... | test.rs:255:22:255:22 | a | provenance | Src:MaD:9 | +| test.rs:222:37:227:9 | \|...\| ... | test.rs:224:18:224:18 | a | provenance | Src:MaD:6 | +| test.rs:231:13:235:13 | \|...\| ... | test.rs:232:22:232:22 | a | provenance | Src:MaD:7 | +| test.rs:240:13:248:9 | \|...\| ... | test.rs:243:22:243:23 | id | provenance | Src:MaD:5 | +| test.rs:253:13:258:14 | \|...\| ... | test.rs:255:22:255:22 | a | provenance | Src:MaD:6 | nodes | test.rs:11:31:11:31 | a | semmle.label | a | | test.rs:13:14:13:14 | a | semmle.label | a | diff --git a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected index 55d2b7cd679e..c02095aee9eb 100644 --- a/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/strings/inline-taint-flow.expected @@ -3,17 +3,17 @@ models | 2 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | | 3 | Summary: ::add; Argument[self]; ReturnValue; taint | | 4 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 5 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 6 | Summary: alloc::string::ToString::to_string; Argument[self].Reference; ReturnValue; taint | -| 7 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | -| 8 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 5 | Summary: ::to_string; Argument[self].Reference; ReturnValue; taint | +| 6 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 7 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 8 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | edges | main.rs:27:9:27:9 | s | main.rs:28:19:28:19 | s | provenance | | | main.rs:27:9:27:9 | s | main.rs:28:19:28:25 | s[...] | provenance | | | main.rs:27:13:27:22 | source(...) | main.rs:27:9:27:9 | s | provenance | | | main.rs:28:9:28:14 | sliced [&ref] | main.rs:29:16:29:21 | sliced | provenance | | | main.rs:28:18:28:25 | &... [&ref] | main.rs:28:9:28:14 | sliced [&ref] | provenance | | -| main.rs:28:19:28:19 | s | main.rs:28:19:28:25 | s[...] | provenance | MaD:8 | +| main.rs:28:19:28:19 | s | main.rs:28:19:28:25 | s[...] | provenance | MaD:6 | | main.rs:28:19:28:25 | s[...] | main.rs:28:18:28:25 | &... [&ref] | provenance | | | main.rs:33:9:33:10 | s1 | main.rs:36:14:36:15 | s1 | provenance | | | main.rs:33:14:33:23 | source(...) | main.rs:33:9:33:10 | s1 | provenance | | @@ -32,7 +32,7 @@ edges | main.rs:58:9:58:10 | s1 | main.rs:59:14:59:15 | s1 | provenance | | | main.rs:58:14:58:29 | source_slice(...) | main.rs:58:9:58:10 | s1 | provenance | | | main.rs:59:9:59:10 | s2 | main.rs:60:10:60:11 | s2 | provenance | | -| main.rs:59:14:59:15 | s1 | main.rs:59:14:59:27 | s1.to_string() | provenance | MaD:6 | +| main.rs:59:14:59:15 | s1 | main.rs:59:14:59:27 | s1.to_string() | provenance | MaD:5 | | main.rs:59:14:59:27 | s1.to_string() | main.rs:59:9:59:10 | s2 | provenance | | | main.rs:64:9:64:9 | s | main.rs:65:16:65:16 | s | provenance | | | main.rs:64:13:64:22 | source(...) | main.rs:64:9:64:9 | s | provenance | | @@ -44,32 +44,32 @@ edges | main.rs:69:13:69:22 | source(...) | main.rs:69:9:69:9 | s | provenance | | | main.rs:71:9:71:18 | formatted1 | main.rs:72:10:72:19 | formatted1 | provenance | | | main.rs:71:22:71:62 | ...::format(...) | main.rs:71:9:71:18 | formatted1 | provenance | | -| main.rs:71:34:71:61 | MacroExpr | main.rs:71:22:71:62 | ...::format(...) | provenance | MaD:5 | +| main.rs:71:34:71:61 | MacroExpr | main.rs:71:22:71:62 | ...::format(...) | provenance | MaD:7 | | main.rs:74:9:74:18 | formatted2 | main.rs:75:10:75:19 | formatted2 | provenance | | | main.rs:74:22:74:60 | ...::format(...) | main.rs:74:9:74:18 | formatted2 | provenance | | -| main.rs:74:34:74:59 | MacroExpr | main.rs:74:22:74:60 | ...::format(...) | provenance | MaD:5 | +| main.rs:74:34:74:59 | MacroExpr | main.rs:74:22:74:60 | ...::format(...) | provenance | MaD:7 | | main.rs:77:9:77:13 | width | main.rs:78:34:78:74 | MacroExpr | provenance | | | main.rs:77:17:77:32 | source_usize(...) | main.rs:77:9:77:13 | width | provenance | | | main.rs:78:9:78:18 | formatted3 | main.rs:79:10:79:19 | formatted3 | provenance | | | main.rs:78:22:78:75 | ...::format(...) | main.rs:78:9:78:18 | formatted3 | provenance | | -| main.rs:78:34:78:74 | MacroExpr | main.rs:78:22:78:75 | ...::format(...) | provenance | MaD:5 | +| main.rs:78:34:78:74 | MacroExpr | main.rs:78:22:78:75 | ...::format(...) | provenance | MaD:7 | | main.rs:81:9:81:18 | formatted4 | main.rs:82:10:82:19 | formatted4 | provenance | | | main.rs:81:22:81:65 | ...::format(...) | main.rs:81:9:81:18 | formatted4 | provenance | | -| main.rs:81:39:81:64 | MacroExpr | main.rs:81:22:81:65 | ...::format(...) | provenance | MaD:5 | +| main.rs:81:39:81:64 | MacroExpr | main.rs:81:22:81:65 | ...::format(...) | provenance | MaD:7 | | main.rs:84:9:84:18 | formatted5 | main.rs:85:10:85:19 | formatted5 | provenance | | | main.rs:84:22:84:67 | ...::format(...) | main.rs:84:9:84:18 | formatted5 | provenance | | -| main.rs:84:41:84:66 | MacroExpr | main.rs:84:22:84:67 | ...::format(...) | provenance | MaD:5 | +| main.rs:84:41:84:66 | MacroExpr | main.rs:84:22:84:67 | ...::format(...) | provenance | MaD:7 | | main.rs:89:9:89:10 | s1 | main.rs:93:18:93:25 | MacroExpr | provenance | | | main.rs:89:9:89:10 | s1 | main.rs:94:18:94:32 | MacroExpr | provenance | | | main.rs:89:14:89:23 | source(...) | main.rs:89:9:89:10 | s1 | provenance | | | main.rs:93:18:93:25 | ...::format(...) | main.rs:93:18:93:25 | { ... } | provenance | | | main.rs:93:18:93:25 | ...::must_use(...) | main.rs:93:10:93:26 | MacroExpr | provenance | | -| main.rs:93:18:93:25 | MacroExpr | main.rs:93:18:93:25 | ...::format(...) | provenance | MaD:5 | -| main.rs:93:18:93:25 | { ... } | main.rs:93:18:93:25 | ...::must_use(...) | provenance | MaD:7 | +| main.rs:93:18:93:25 | MacroExpr | main.rs:93:18:93:25 | ...::format(...) | provenance | MaD:7 | +| main.rs:93:18:93:25 | { ... } | main.rs:93:18:93:25 | ...::must_use(...) | provenance | MaD:8 | | main.rs:94:18:94:32 | ...::format(...) | main.rs:94:18:94:32 | { ... } | provenance | | | main.rs:94:18:94:32 | ...::must_use(...) | main.rs:94:10:94:33 | MacroExpr | provenance | | -| main.rs:94:18:94:32 | MacroExpr | main.rs:94:18:94:32 | ...::format(...) | provenance | MaD:5 | -| main.rs:94:18:94:32 | { ... } | main.rs:94:18:94:32 | ...::must_use(...) | provenance | MaD:7 | +| main.rs:94:18:94:32 | MacroExpr | main.rs:94:18:94:32 | ...::format(...) | provenance | MaD:7 | +| main.rs:94:18:94:32 | { ... } | main.rs:94:18:94:32 | ...::must_use(...) | provenance | MaD:8 | nodes | main.rs:27:9:27:9 | s | semmle.label | s | | main.rs:27:13:27:22 | source(...) | semmle.label | source(...) | diff --git a/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected b/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected index 360578746a53..2f3bba8677f1 100644 --- a/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected +++ b/rust/ql/test/library-tests/dataflow/taint/inline-taint-flow.expected @@ -1,39 +1,39 @@ models | 1 | Summary: ::neg; Argument[self].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | | 2 | Summary: ::not; Argument[self].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 3 | Summary: core::ops::arith::Add::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 4 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | -| 5 | Summary: core::ops::arith::AddAssign::add_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 6 | Summary: core::ops::arith::AddAssign::add_assign; Argument[0]; Argument[self].Reference; taint | -| 7 | Summary: core::ops::arith::AddAssign::add_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 8 | Summary: core::ops::arith::AddAssign::add_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 9 | Summary: core::ops::arith::Mul::mul; Argument[self,0]; ReturnValue; taint | -| 10 | Summary: core::ops::arith::MulAssign::mul_assign; Argument[0]; Argument[self].Reference; taint | -| 11 | Summary: core::ops::arith::MulAssign::mul_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 12 | Summary: core::ops::arith::Neg::neg; Argument[self]; ReturnValue; taint | -| 13 | Summary: core::ops::arith::Sub::sub; Argument[self,0]; ReturnValue; taint | -| 14 | Summary: core::ops::arith::SubAssign::sub_assign; Argument[0]; Argument[self].Reference; taint | -| 15 | Summary: core::ops::arith::SubAssign::sub_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 16 | Summary: core::ops::bit::BitAnd::bitand; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 17 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 18 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[0]; Argument[self].Reference; taint | -| 19 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 20 | Summary: core::ops::bit::BitAndAssign::bitand_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 21 | Summary: core::ops::bit::BitOr::bitor; Argument[self,0]; ReturnValue; taint | -| 22 | Summary: core::ops::bit::BitXor::bitxor; Argument[self,0]; ReturnValue; taint | -| 23 | Summary: core::ops::bit::BitXorAssign::bitxor_assign; Argument[0]; Argument[self].Reference; taint | -| 24 | Summary: core::ops::bit::BitXorAssign::bitxor_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 25 | Summary: core::ops::bit::Not::not; Argument[self]; ReturnValue; taint | -| 26 | Summary: core::ops::bit::Shl::shl; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | -| 27 | Summary: core::ops::bit::Shl::shl; Argument[self,0]; ReturnValue; taint | -| 28 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 29 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[0]; Argument[self].Reference; taint | -| 30 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | -| 31 | Summary: core::ops::bit::ShlAssign::shl_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 32 | Summary: core::ops::bit::Shr::shr; Argument[self,0]; ReturnValue; taint | -| 33 | Summary: core::ops::bit::ShrAssign::shr_assign; Argument[0]; Argument[self].Reference; taint | -| 34 | Summary: core::ops::bit::ShrAssign::shr_assign; Argument[self].Reference; Argument[self].Reference; taint | -| 35 | Summary: core::ops::index::Index::index; Argument[self].Reference.Element; ReturnValue.Reference; value | +| 3 | Summary: ::add; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 4 | Summary: ::add; Argument[self,0]; ReturnValue; taint | +| 5 | Summary: ::add_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 6 | Summary: ::add_assign; Argument[0]; Argument[self].Reference; taint | +| 7 | Summary: ::add_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 8 | Summary: ::add_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 9 | Summary: ::mul; Argument[self,0]; ReturnValue; taint | +| 10 | Summary: ::mul_assign; Argument[0]; Argument[self].Reference; taint | +| 11 | Summary: ::mul_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 12 | Summary: ::neg; Argument[self]; ReturnValue; taint | +| 13 | Summary: ::sub; Argument[self,0]; ReturnValue; taint | +| 14 | Summary: ::sub_assign; Argument[0]; Argument[self].Reference; taint | +| 15 | Summary: ::sub_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 16 | Summary: ::bitand; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 17 | Summary: ::bitand_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 18 | Summary: ::bitand_assign; Argument[0]; Argument[self].Reference; taint | +| 19 | Summary: ::bitand_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 20 | Summary: ::bitand_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 21 | Summary: ::bitor; Argument[self,0]; ReturnValue; taint | +| 22 | Summary: ::bitxor; Argument[self,0]; ReturnValue; taint | +| 23 | Summary: ::bitxor_assign; Argument[0]; Argument[self].Reference; taint | +| 24 | Summary: ::bitxor_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 25 | Summary: ::not; Argument[self]; ReturnValue; taint | +| 26 | Summary: ::shl; Argument[self,0].Field[core::num::wrapping::Wrapping(0)]; ReturnValue.Field[core::num::wrapping::Wrapping(0)]; taint | +| 27 | Summary: ::shl; Argument[self,0]; ReturnValue; taint | +| 28 | Summary: ::shl_assign; Argument[0].Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 29 | Summary: ::shl_assign; Argument[0]; Argument[self].Reference; taint | +| 30 | Summary: ::shl_assign; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; Argument[self].Reference.Field[core::num::wrapping::Wrapping(0)]; taint | +| 31 | Summary: ::shl_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 32 | Summary: ::shr; Argument[self,0]; ReturnValue; taint | +| 33 | Summary: ::shr_assign; Argument[0]; Argument[self].Reference; taint | +| 34 | Summary: ::shr_assign; Argument[self].Reference; Argument[self].Reference; taint | +| 35 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | edges | main.rs:12:9:12:9 | a | main.rs:13:10:13:10 | a | provenance | | | main.rs:12:9:12:9 | a | main.rs:14:14:14:14 | a | provenance | | diff --git a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected index 4c263e2c9498..6151a3eabd10 100644 --- a/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected +++ b/rust/ql/test/query-tests/security/CWE-022/TaintedPath.expected @@ -19,34 +19,34 @@ edges | src/main.rs:7:11:7:19 | file_name | src/main.rs:9:35:9:43 | file_name | provenance | | | src/main.rs:9:9:9:17 | file_path | src/main.rs:11:24:11:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:9:21:9:44 | ...::from(...) | src/main.rs:9:9:9:17 | file_path | provenance | | -| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:12 | +| src/main.rs:9:35:9:43 | file_name | src/main.rs:9:21:9:44 | ...::from(...) | provenance | MaD:14 | | src/main.rs:38:11:38:19 | file_path | src/main.rs:41:52:41:60 | file_path | provenance | | | src/main.rs:41:9:41:17 | file_path | src/main.rs:46:24:46:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:41:21:41:62 | public_path.join(...) | src/main.rs:41:9:41:17 | file_path | provenance | | -| src/main.rs:41:38:41:61 | ...::from(...) | src/main.rs:41:21:41:62 | public_path.join(...) | provenance | MaD:10 | -| src/main.rs:41:52:41:60 | file_path | src/main.rs:41:38:41:61 | ...::from(...) | provenance | MaD:12 | +| src/main.rs:41:38:41:61 | ...::from(...) | src/main.rs:41:21:41:62 | public_path.join(...) | provenance | MaD:12 | +| src/main.rs:41:52:41:60 | file_path | src/main.rs:41:38:41:61 | ...::from(...) | provenance | MaD:14 | | src/main.rs:63:11:63:19 | file_path | src/main.rs:66:32:66:40 | file_path | provenance | | | src/main.rs:66:9:66:17 | file_path [&ref] | src/main.rs:71:24:71:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | src/main.rs:66:9:66:17 | file_path [&ref] | provenance | | -| src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:11 | +| src/main.rs:66:31:66:40 | &file_path [&ref] | src/main.rs:66:21:66:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:66:32:66:40 | file_path | src/main.rs:66:31:66:40 | &file_path [&ref] | provenance | | | src/main.rs:76:11:76:19 | file_path | src/main.rs:79:52:79:60 | file_path | provenance | | | src/main.rs:79:9:79:17 | file_path | src/main.rs:80:21:80:29 | file_path | provenance | | | src/main.rs:79:21:79:62 | public_path.join(...) | src/main.rs:79:9:79:17 | file_path | provenance | | -| src/main.rs:79:38:79:61 | ...::from(...) | src/main.rs:79:21:79:62 | public_path.join(...) | provenance | MaD:10 | -| src/main.rs:79:52:79:60 | file_path | src/main.rs:79:38:79:61 | ...::from(...) | provenance | MaD:12 | +| src/main.rs:79:38:79:61 | ...::from(...) | src/main.rs:79:21:79:62 | public_path.join(...) | provenance | MaD:12 | +| src/main.rs:79:52:79:60 | file_path | src/main.rs:79:38:79:61 | ...::from(...) | provenance | MaD:14 | | src/main.rs:80:9:80:17 | file_path | src/main.rs:85:24:85:32 | file_path | provenance | Sink:MaD:6 | -| src/main.rs:80:21:80:29 | file_path | src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | provenance | MaD:13 | -| src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | src/main.rs:80:21:80:53 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:80:21:80:29 | file_path | src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | provenance | MaD:15 | +| src/main.rs:80:21:80:44 | file_path.canonicalize() [Ok] | src/main.rs:80:21:80:53 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:80:21:80:53 | ... .unwrap() | src/main.rs:80:9:80:17 | file_path | provenance | | | src/main.rs:90:11:90:19 | file_path | src/main.rs:93:32:93:40 | file_path | provenance | | | src/main.rs:93:9:93:17 | file_path [&ref] | src/main.rs:98:21:98:29 | file_path [&ref] | provenance | | | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | src/main.rs:93:9:93:17 | file_path [&ref] | provenance | | -| src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:11 | +| src/main.rs:93:31:93:40 | &file_path [&ref] | src/main.rs:93:21:93:41 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:93:32:93:40 | file_path | src/main.rs:93:31:93:40 | &file_path [&ref] | provenance | | | src/main.rs:98:9:98:17 | file_path | src/main.rs:99:24:99:32 | file_path | provenance | Sink:MaD:6 | | src/main.rs:98:21:98:29 | file_path [&ref] | src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | provenance | Config | -| src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:98:21:98:44 | file_path.canonicalize() [Ok] | src/main.rs:98:21:98:53 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:98:21:98:53 | ... .unwrap() | src/main.rs:98:9:98:17 | file_path | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:104:33:104:37 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:106:39:106:43 | path1 | provenance | | @@ -56,51 +56,51 @@ edges | src/main.rs:103:9:103:13 | path1 | src/main.rs:122:27:122:31 | path1 | provenance | | | src/main.rs:103:9:103:13 | path1 | src/main.rs:123:37:123:41 | path1 | provenance | | | src/main.rs:103:17:103:32 | ...::args(...) | src/main.rs:103:17:103:32 | ...::args(...) [element] | provenance | Src:MaD:7 | -| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:15 | -| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:8 | +| src/main.rs:103:17:103:32 | ...::args(...) [element] | src/main.rs:103:17:103:39 | ... .nth(...) [Some] | provenance | MaD:9 | +| src/main.rs:103:17:103:39 | ... .nth(...) [Some] | src/main.rs:103:17:103:48 | ... .unwrap() | provenance | MaD:10 | | src/main.rs:103:17:103:48 | ... .unwrap() | src/main.rs:103:9:103:13 | path1 | provenance | | -| src/main.rs:104:33:104:37 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:14 | +| src/main.rs:104:33:104:37 | path1 | src/main.rs:104:33:104:45 | path1.clone() | provenance | MaD:8 | | src/main.rs:104:33:104:45 | path1.clone() | src/main.rs:104:33:104:45 | path1.clone() | provenance | Sink:MaD:2 | | src/main.rs:106:9:106:13 | path2 | src/main.rs:107:33:107:37 | path2 | provenance | Sink:MaD:2 | -| src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | src/main.rs:106:17:106:61 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:106:17:106:61 | ... .unwrap() | src/main.rs:106:9:106:13 | path2 | provenance | | -| src/main.rs:106:39:106:43 | path1 | src/main.rs:106:39:106:51 | path1.clone() | provenance | MaD:14 | +| src/main.rs:106:39:106:43 | path1 | src/main.rs:106:39:106:51 | path1.clone() | provenance | MaD:8 | | src/main.rs:106:39:106:51 | path1.clone() | src/main.rs:106:17:106:52 | ...::canonicalize(...) [Ok] | provenance | Config | | src/main.rs:109:9:109:13 | path3 | src/main.rs:110:35:110:39 | path3 | provenance | Sink:MaD:4 | | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | src/main.rs:109:17:109:60 | await ... [Ok] | provenance | | -| src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:109:17:109:60 | await ... [Ok] | src/main.rs:109:17:109:69 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:109:17:109:69 | ... .unwrap() | src/main.rs:109:9:109:13 | path3 | provenance | | -| src/main.rs:109:41:109:45 | path1 | src/main.rs:109:41:109:53 | path1.clone() | provenance | MaD:14 | +| src/main.rs:109:41:109:45 | path1 | src/main.rs:109:41:109:53 | path1.clone() | provenance | MaD:8 | | src/main.rs:109:41:109:53 | path1.clone() | src/main.rs:109:17:109:54 | ...::canonicalize(...) [future, Ok] | provenance | Config | | src/main.rs:112:9:112:13 | path4 | src/main.rs:113:39:113:43 | path4 | provenance | Sink:MaD:1 | | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | src/main.rs:112:17:112:64 | await ... [Ok] | provenance | | -| src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:112:17:112:64 | await ... [Ok] | src/main.rs:112:17:112:73 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:112:17:112:73 | ... .unwrap() | src/main.rs:112:9:112:13 | path4 | provenance | | -| src/main.rs:112:45:112:49 | path1 | src/main.rs:112:45:112:57 | path1.clone() | provenance | MaD:14 | +| src/main.rs:112:45:112:49 | path1 | src/main.rs:112:45:112:57 | path1.clone() | provenance | MaD:8 | | src/main.rs:112:45:112:57 | path1.clone() | src/main.rs:112:17:112:58 | ...::canonicalize(...) [future, Ok] | provenance | Config | | src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:116:33:116:37 | path5 | provenance | Sink:MaD:2 | | src/main.rs:115:9:115:13 | path5 [&ref] | src/main.rs:118:17:118:21 | path5 [&ref] | provenance | | | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | src/main.rs:115:9:115:13 | path5 [&ref] | provenance | | -| src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:11 | +| src/main.rs:115:38:115:43 | &path1 [&ref] | src/main.rs:115:17:115:44 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:115:39:115:43 | path1 | src/main.rs:115:38:115:43 | &path1 [&ref] | provenance | | | src/main.rs:118:9:118:13 | path6 | src/main.rs:119:33:119:37 | path6 | provenance | Sink:MaD:2 | | src/main.rs:118:17:118:21 | path5 [&ref] | src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | provenance | Config | -| src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:9 | +| src/main.rs:118:17:118:36 | path5.canonicalize() [Ok] | src/main.rs:118:17:118:45 | ... .unwrap() | provenance | MaD:11 | | src/main.rs:118:17:118:45 | ... .unwrap() | src/main.rs:118:9:118:13 | path6 | provenance | | -| src/main.rs:122:27:122:31 | path1 | src/main.rs:122:27:122:39 | path1.clone() | provenance | MaD:14 | +| src/main.rs:122:27:122:31 | path1 | src/main.rs:122:27:122:39 | path1.clone() | provenance | MaD:8 | | src/main.rs:122:27:122:39 | path1.clone() | src/main.rs:122:27:122:39 | path1.clone() | provenance | Sink:MaD:5 | -| src/main.rs:123:37:123:41 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:14 | +| src/main.rs:123:37:123:41 | path1 | src/main.rs:123:37:123:49 | path1.clone() | provenance | MaD:8 | | src/main.rs:123:37:123:49 | path1.clone() | src/main.rs:123:37:123:49 | path1.clone() | provenance | Sink:MaD:5 | | src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:172:26:172:33 | path_str [&ref] | provenance | | | src/main.rs:170:16:170:29 | ...: ... [&ref] | src/main.rs:174:36:174:43 | path_str | provenance | Sink:MaD:2 | | src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:173:8:173:11 | path | provenance | Sink:MaD:3 | | src/main.rs:172:9:172:12 | path [&ref] | src/main.rs:177:36:177:39 | path | provenance | Sink:MaD:2 | | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | src/main.rs:172:9:172:12 | path [&ref] | provenance | | -| src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:11 | +| src/main.rs:172:26:172:33 | path_str [&ref] | src/main.rs:172:16:172:34 | ...::new(...) [&ref] | provenance | MaD:13 | | src/main.rs:185:9:185:13 | path1 | src/main.rs:186:18:186:22 | path1 | provenance | | | src/main.rs:185:17:185:32 | ...::args(...) | src/main.rs:185:17:185:32 | ...::args(...) [element] | provenance | Src:MaD:7 | -| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:15 | -| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:8 | +| src/main.rs:185:17:185:32 | ...::args(...) [element] | src/main.rs:185:17:185:39 | ... .nth(...) [Some] | provenance | MaD:9 | +| src/main.rs:185:17:185:39 | ... .nth(...) [Some] | src/main.rs:185:17:185:48 | ... .unwrap() | provenance | MaD:10 | | src/main.rs:185:17:185:48 | ... .unwrap() | src/main.rs:185:9:185:13 | path1 | provenance | | | src/main.rs:186:17:186:22 | &path1 [&ref] | src/main.rs:170:16:170:29 | ...: ... [&ref] | provenance | | | src/main.rs:186:18:186:22 | path1 | src/main.rs:186:17:186:22 | &path1 [&ref] | provenance | | @@ -112,14 +112,14 @@ models | 5 | Sink: std::fs::copy; Argument[0,1]; path-injection | | 6 | Sink: std::fs::read_to_string; Argument[0]; path-injection | | 7 | Source: std::env::args; ReturnValue.Element; commandargs | -| 8 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 9 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 10 | Summary: ::join; Argument[0]; ReturnValue; taint | -| 11 | Summary: ::new; Argument[0].Reference; ReturnValue.Reference; value | -| 12 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | -| 13 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | -| 14 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 15 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 8 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 9 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 10 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 12 | Summary: ::join; Argument[0]; ReturnValue; taint | +| 13 | Summary: ::new; Argument[0].Reference; ReturnValue.Reference; value | +| 14 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | +| 15 | Summary: ::deref; Argument[self].Reference.Field[std::path::PathBuf::inner]; ReturnValue.Reference; value | nodes | src/main.rs:7:11:7:19 | file_name | semmle.label | file_name | | src/main.rs:9:9:9:17 | file_path | semmle.label | file_path | diff --git a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected index 2190976dafc8..e6f56c8e71cb 100644 --- a/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected +++ b/rust/ql/test/query-tests/security/CWE-079/warp/XSS.expected @@ -9,7 +9,7 @@ edges | main.rs:9:32:9:56 | { ... } | main.rs:9:32:9:56 | ...::must_use(...) | provenance | MaD:4 | models | 1 | Sink: warp::reply::html; Argument[0]; html-injection | -| 2 | Source: warp::filter::Filter::map; Argument[0].Parameter[0..7]; remote | +| 2 | Source: ::map; Argument[0].Parameter[0..7]; remote | | 3 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes diff --git a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected index ec9018280bc3..f01246e128df 100644 --- a/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-089/SqlInjection.expected @@ -35,9 +35,9 @@ edges | mysql.rs:12:13:12:29 | mut remote_string | mysql.rs:18:71:18:83 | remote_string | provenance | | | mysql.rs:12:33:12:77 | ...::get(...) | mysql.rs:12:33:12:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| mysql.rs:12:33:12:77 | ...::get(...) [Ok] | mysql.rs:12:33:13:21 | ... .unwrap() | provenance | MaD:29 | -| mysql.rs:12:33:13:21 | ... .unwrap() | mysql.rs:12:33:14:19 | ... .text() [Ok] | provenance | MaD:31 | -| mysql.rs:12:33:14:19 | ... .text() [Ok] | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | provenance | MaD:30 | +| mysql.rs:12:33:12:77 | ...::get(...) [Ok] | mysql.rs:12:33:13:21 | ... .unwrap() | provenance | MaD:30 | +| mysql.rs:12:33:13:21 | ... .unwrap() | mysql.rs:12:33:14:19 | ... .text() [Ok] | provenance | MaD:32 | +| mysql.rs:12:33:14:19 | ... .text() [Ok] | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | provenance | MaD:31 | | mysql.rs:12:33:15:40 | ... .unwrap_or(...) | mysql.rs:12:13:12:29 | mut remote_string | provenance | | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:25:38:25:49 | unsafe_query | provenance | | | mysql.rs:17:13:17:24 | unsafe_query | mysql.rs:26:64:26:75 | unsafe_query | provenance | | @@ -57,36 +57,36 @@ edges | mysql.rs:18:70:18:83 | &remote_string [&ref] | mysql.rs:18:13:18:83 | ... + ... | provenance | MaD:25 | | mysql.rs:18:71:18:83 | remote_string | mysql.rs:18:70:18:83 | &remote_string [&ref] | provenance | | | mysql.rs:25:38:25:49 | unsafe_query | mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | Sink:MaD:5 | +| mysql.rs:25:38:25:58 | unsafe_query.as_str() [&ref] | mysql.rs:25:38:25:58 | unsafe_query.as_str() | provenance | Sink:MaD:3 | | mysql.rs:26:64:26:75 | unsafe_query | mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | Sink:MaD:13 | +| mysql.rs:26:64:26:84 | unsafe_query.as_str() [&ref] | mysql.rs:26:64:26:84 | unsafe_query.as_str() | provenance | Sink:MaD:11 | | mysql.rs:27:25:27:36 | unsafe_query | mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | Sink:MaD:6 | +| mysql.rs:27:25:27:45 | unsafe_query.as_str() [&ref] | mysql.rs:27:25:27:45 | unsafe_query.as_str() | provenance | Sink:MaD:4 | | mysql.rs:28:39:28:50 | unsafe_query | mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | Sink:MaD:7 | +| mysql.rs:28:39:28:59 | unsafe_query.as_str() [&ref] | mysql.rs:28:39:28:59 | unsafe_query.as_str() | provenance | Sink:MaD:5 | | mysql.rs:29:65:29:76 | unsafe_query | mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | Sink:MaD:8 | +| mysql.rs:29:65:29:85 | unsafe_query.as_str() [&ref] | mysql.rs:29:65:29:85 | unsafe_query.as_str() | provenance | Sink:MaD:6 | | mysql.rs:30:33:30:44 | unsafe_query | mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | Sink:MaD:9 | +| mysql.rs:30:33:30:53 | unsafe_query.as_str() [&ref] | mysql.rs:30:33:30:53 | unsafe_query.as_str() | provenance | Sink:MaD:7 | | mysql.rs:32:13:32:24 | unsafe_query | mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | Sink:MaD:10 | +| mysql.rs:32:13:32:33 | unsafe_query.as_str() [&ref] | mysql.rs:32:13:32:33 | unsafe_query.as_str() | provenance | Sink:MaD:8 | | mysql.rs:36:33:36:44 | unsafe_query | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:36:33:36:53 | unsafe_query.as_str() [&ref] | mysql.rs:36:33:36:53 | unsafe_query.as_str() | provenance | Sink:MaD:2 | | mysql.rs:37:32:37:43 | unsafe_query | mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | Sink:MaD:11 | +| mysql.rs:37:32:37:52 | unsafe_query.as_str() [&ref] | mysql.rs:37:32:37:52 | unsafe_query.as_str() | provenance | Sink:MaD:9 | | mysql.rs:39:13:39:24 | unsafe_query | mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | Sink:MaD:12 | +| mysql.rs:39:13:39:33 | unsafe_query.as_str() [&ref] | mysql.rs:39:13:39:33 | unsafe_query.as_str() | provenance | Sink:MaD:10 | | mysql.rs:42:39:42:50 | unsafe_query | mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | Sink:MaD:5 | +| mysql.rs:42:39:42:59 | unsafe_query.as_str() [&ref] | mysql.rs:42:39:42:59 | unsafe_query.as_str() | provenance | Sink:MaD:3 | | mysql.rs:75:31:75:42 | unsafe_query | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:75:31:75:51 | unsafe_query.as_str() [&ref] | mysql.rs:75:31:75:51 | unsafe_query.as_str() | provenance | Sink:MaD:1 | | mysql.rs:80:26:80:37 | unsafe_query | mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | Sink:MaD:6 | +| mysql.rs:80:26:80:46 | unsafe_query.as_str() [&ref] | mysql.rs:80:26:80:46 | unsafe_query.as_str() | provenance | Sink:MaD:4 | | mysql.rs:97:13:97:29 | mut remote_string | mysql.rs:103:71:103:83 | remote_string | provenance | | | mysql.rs:97:33:97:77 | ...::get(...) | mysql.rs:97:33:97:77 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| mysql.rs:97:33:97:77 | ...::get(...) [Ok] | mysql.rs:97:33:98:21 | ... .unwrap() | provenance | MaD:29 | -| mysql.rs:97:33:98:21 | ... .unwrap() | mysql.rs:97:33:99:19 | ... .text() [Ok] | provenance | MaD:31 | -| mysql.rs:97:33:99:19 | ... .text() [Ok] | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | provenance | MaD:30 | +| mysql.rs:97:33:97:77 | ...::get(...) [Ok] | mysql.rs:97:33:98:21 | ... .unwrap() | provenance | MaD:30 | +| mysql.rs:97:33:98:21 | ... .unwrap() | mysql.rs:97:33:99:19 | ... .text() [Ok] | provenance | MaD:32 | +| mysql.rs:97:33:99:19 | ... .text() [Ok] | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | provenance | MaD:31 | | mysql.rs:97:33:100:40 | ... .unwrap_or(...) | mysql.rs:97:13:97:29 | mut remote_string | provenance | | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:110:38:110:49 | unsafe_query | provenance | | | mysql.rs:102:13:102:24 | unsafe_query | mysql.rs:111:25:111:36 | unsafe_query | provenance | | @@ -110,27 +110,27 @@ edges | mysql.rs:114:25:114:36 | unsafe_query | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:114:25:114:45 | unsafe_query.as_str() [&ref] | mysql.rs:114:25:114:45 | unsafe_query.as_str() | provenance | Sink:MaD:17 | | mysql.rs:116:33:116:44 | unsafe_query | mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | Sink:MaD:4 | +| mysql.rs:116:33:116:53 | unsafe_query.as_str() [&ref] | mysql.rs:116:33:116:53 | unsafe_query.as_str() | provenance | Sink:MaD:13 | | mysql.rs:118:40:118:51 | unsafe_query | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:118:40:118:60 | unsafe_query.as_str() [&ref] | mysql.rs:118:40:118:60 | unsafe_query.as_str() | provenance | Sink:MaD:19 | | mysql.rs:121:24:121:35 | unsafe_query | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:121:24:121:44 | unsafe_query.as_str() [&ref] | mysql.rs:121:24:121:44 | unsafe_query.as_str() | provenance | Sink:MaD:18 | | mysql.rs:149:31:149:42 | unsafe_query | mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | -| mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | Sink:MaD:3 | +| mysql.rs:149:31:149:51 | unsafe_query.as_str() [&ref] | mysql.rs:149:31:149:51 | unsafe_query.as_str() | provenance | Sink:MaD:12 | | mysql.rs:154:26:154:37 | unsafe_query | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | provenance | MaD:27 | | mysql.rs:154:26:154:46 | unsafe_query.as_str() [&ref] | mysql.rs:154:26:154:46 | unsafe_query.as_str() | provenance | Sink:MaD:15 | | sqlx.rs:47:9:47:18 | arg_string | sqlx.rs:53:27:53:36 | arg_string | provenance | | | sqlx.rs:47:22:47:37 | ...::args(...) | sqlx.rs:47:22:47:37 | ...::args(...) [element] | provenance | Src:MaD:24 | -| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:34 | -| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:28 | +| sqlx.rs:47:22:47:37 | ...::args(...) [element] | sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | provenance | MaD:28 | +| sqlx.rs:47:22:47:44 | ... .nth(...) [Some] | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | provenance | MaD:29 | | sqlx.rs:47:22:47:77 | ... .unwrap_or(...) | sqlx.rs:47:9:47:18 | arg_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:54:27:54:39 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:55:84:55:96 | remote_string | provenance | | | sqlx.rs:48:9:48:21 | remote_string | sqlx.rs:59:17:59:72 | MacroExpr | provenance | | | sqlx.rs:48:25:48:69 | ...::get(...) | sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:29 | -| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:31 | -| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:30 | +| sqlx.rs:48:25:48:69 | ...::get(...) [Ok] | sqlx.rs:48:25:48:78 | ... .unwrap() | provenance | MaD:30 | +| sqlx.rs:48:25:48:78 | ... .unwrap() | sqlx.rs:48:25:48:85 | ... .text() [Ok] | provenance | MaD:32 | +| sqlx.rs:48:25:48:85 | ... .text() [Ok] | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | provenance | MaD:31 | | sqlx.rs:48:25:48:118 | ... .unwrap_or(...) | sqlx.rs:48:9:48:21 | remote_string | provenance | | | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | provenance | | | sqlx.rs:53:26:53:36 | &arg_string [&ref] | sqlx.rs:53:9:53:22 | unsafe_query_1 [&ref] | provenance | | @@ -146,8 +146,8 @@ edges | sqlx.rs:56:9:56:22 | unsafe_query_4 | sqlx.rs:82:29:82:42 | unsafe_query_4 | provenance | | | sqlx.rs:59:17:59:72 | ...::format(...) | sqlx.rs:59:17:59:72 | { ... } | provenance | | | sqlx.rs:59:17:59:72 | ...::must_use(...) | sqlx.rs:56:9:56:22 | unsafe_query_4 | provenance | | -| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:32 | -| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:33 | +| sqlx.rs:59:17:59:72 | MacroExpr | sqlx.rs:59:17:59:72 | ...::format(...) | provenance | MaD:33 | +| sqlx.rs:59:17:59:72 | { ... } | sqlx.rs:59:17:59:72 | ...::must_use(...) | provenance | MaD:34 | | sqlx.rs:78:25:78:38 | unsafe_query_1 [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | provenance | MaD:27 | | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() [&ref] | sqlx.rs:78:25:78:47 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:80:29:80:42 | unsafe_query_2 [&ref] | sqlx.rs:80:29:80:51 | unsafe_query_2.as_str() [&ref] | provenance | MaD:27 | @@ -158,9 +158,9 @@ edges | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() [&ref] | sqlx.rs:82:29:82:51 | unsafe_query_4.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:100:9:100:21 | remote_string | sqlx.rs:102:84:102:96 | remote_string | provenance | | | sqlx.rs:100:25:100:69 | ...::get(...) | sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:29 | -| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:31 | -| sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:30 | +| sqlx.rs:100:25:100:69 | ...::get(...) [Ok] | sqlx.rs:100:25:100:78 | ... .unwrap() | provenance | MaD:30 | +| sqlx.rs:100:25:100:78 | ... .unwrap() | sqlx.rs:100:25:100:85 | ... .text() [Ok] | provenance | MaD:32 | +| sqlx.rs:100:25:100:85 | ... .text() [Ok] | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | provenance | MaD:31 | | sqlx.rs:100:25:100:118 | ... .unwrap_or(...) | sqlx.rs:100:9:100:21 | remote_string | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:113:31:113:44 | unsafe_query_1 | provenance | | | sqlx.rs:102:9:102:22 | unsafe_query_1 | sqlx.rs:120:29:120:42 | unsafe_query_1 | provenance | | @@ -186,9 +186,9 @@ edges | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() [&ref] | sqlx.rs:153:29:153:51 | unsafe_query_1.as_str() | provenance | Sink:MaD:20 | | sqlx.rs:173:9:173:21 | remote_string | sqlx.rs:175:84:175:96 | remote_string | provenance | | | sqlx.rs:173:25:173:69 | ...::get(...) | sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | provenance | Src:MaD:23 | -| sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:29 | -| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:31 | -| sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:30 | +| sqlx.rs:173:25:173:69 | ...::get(...) [Ok] | sqlx.rs:173:25:173:78 | ... .unwrap() | provenance | MaD:30 | +| sqlx.rs:173:25:173:78 | ... .unwrap() | sqlx.rs:173:25:173:85 | ... .text() [Ok] | provenance | MaD:32 | +| sqlx.rs:173:25:173:85 | ... .text() [Ok] | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | provenance | MaD:31 | | sqlx.rs:173:25:173:118 | ... .unwrap_or(...) | sqlx.rs:173:9:173:21 | remote_string | provenance | | | sqlx.rs:175:9:175:22 | unsafe_query_1 | sqlx.rs:188:29:188:42 | unsafe_query_1 | provenance | | | sqlx.rs:175:26:175:96 | ... + ... | sqlx.rs:175:26:175:102 | ... + ... | provenance | MaD:26 | @@ -200,23 +200,23 @@ edges models | 1 | Sink: ::prep; Argument[0]; sql-injection | | 2 | Sink: ::query_iter; Argument[0]; sql-injection | -| 3 | Sink: ::prep; Argument[0]; sql-injection | -| 4 | Sink: ::query_iter; Argument[0]; sql-injection | -| 5 | Sink: mysql::conn::queryable::Queryable::query; Argument[0]; sql-injection | -| 6 | Sink: mysql::conn::queryable::Queryable::query_drop; Argument[0]; sql-injection | -| 7 | Sink: mysql::conn::queryable::Queryable::query_first; Argument[0]; sql-injection | -| 8 | Sink: mysql::conn::queryable::Queryable::query_first_opt; Argument[0]; sql-injection | -| 9 | Sink: mysql::conn::queryable::Queryable::query_fold; Argument[0]; sql-injection | -| 10 | Sink: mysql::conn::queryable::Queryable::query_fold_opt; Argument[0]; sql-injection | -| 11 | Sink: mysql::conn::queryable::Queryable::query_map; Argument[0]; sql-injection | -| 12 | Sink: mysql::conn::queryable::Queryable::query_map_opt; Argument[0]; sql-injection | -| 13 | Sink: mysql::conn::queryable::Queryable::query_opt; Argument[0]; sql-injection | -| 14 | Sink: mysql_async::queryable::Queryable::query; Argument[0]; sql-injection | -| 15 | Sink: mysql_async::queryable::Queryable::query_drop; Argument[0]; sql-injection | -| 16 | Sink: mysql_async::queryable::Queryable::query_first; Argument[0]; sql-injection | -| 17 | Sink: mysql_async::queryable::Queryable::query_fold; Argument[0]; sql-injection | -| 18 | Sink: mysql_async::queryable::Queryable::query_map; Argument[0]; sql-injection | -| 19 | Sink: mysql_async::queryable::Queryable::query_stream; Argument[0]; sql-injection | +| 3 | Sink: ::query; Argument[0]; sql-injection | +| 4 | Sink: ::query_drop; Argument[0]; sql-injection | +| 5 | Sink: ::query_first; Argument[0]; sql-injection | +| 6 | Sink: ::query_first_opt; Argument[0]; sql-injection | +| 7 | Sink: ::query_fold; Argument[0]; sql-injection | +| 8 | Sink: ::query_fold_opt; Argument[0]; sql-injection | +| 9 | Sink: ::query_map; Argument[0]; sql-injection | +| 10 | Sink: ::query_map_opt; Argument[0]; sql-injection | +| 11 | Sink: ::query_opt; Argument[0]; sql-injection | +| 12 | Sink: ::prep; Argument[0]; sql-injection | +| 13 | Sink: ::query_iter; Argument[0]; sql-injection | +| 14 | Sink: ::query; Argument[0]; sql-injection | +| 15 | Sink: ::query_drop; Argument[0]; sql-injection | +| 16 | Sink: ::query_first; Argument[0]; sql-injection | +| 17 | Sink: ::query_fold; Argument[0]; sql-injection | +| 18 | Sink: ::query_map; Argument[0]; sql-injection | +| 19 | Sink: ::query_stream; Argument[0]; sql-injection | | 20 | Sink: sqlx_core::query::query; Argument[0]; sql-injection | | 21 | Sink: sqlx_core::query_as::query_as; Argument[0]; sql-injection | | 22 | Sink: sqlx_core::raw_sql::raw_sql; Argument[0]; sql-injection | @@ -225,13 +225,13 @@ models | 25 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | | 26 | Summary: ::add; Argument[self]; ReturnValue; taint | | 27 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 28 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 29 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 30 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 31 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 32 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 33 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | -| 34 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 28 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 29 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 30 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 31 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 32 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 33 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 34 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | mysql.rs:12:13:12:29 | mut remote_string | semmle.label | mut remote_string | | mysql.rs:12:33:12:77 | ...::get(...) | semmle.label | ...::get(...) | diff --git a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected index ad2659ce297f..5b8c80bda2cc 100644 --- a/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-117/LogInjection.expected @@ -21,7 +21,7 @@ edges | main.rs:8:9:8:12 | args [element] | main.rs:9:20:9:23 | args [element] | provenance | | | main.rs:8:29:8:39 | ...::args(...) | main.rs:8:29:8:39 | ...::args(...) [element] | provenance | Src:MaD:6 | -| main.rs:8:29:8:39 | ...::args(...) [element] | main.rs:8:29:8:49 | ... .collect() [element] | provenance | MaD:22 | +| main.rs:8:29:8:39 | ...::args(...) [element] | main.rs:8:29:8:49 | ... .collect() [element] | provenance | MaD:12 | | main.rs:8:29:8:49 | ... .collect() [element] | main.rs:8:9:8:12 | args [element] | provenance | | | main.rs:9:9:9:16 | username | main.rs:15:11:15:36 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:9:9:9:16 | username | main.rs:18:12:18:37 | MacroExpr | provenance | Sink:MaD:1 | @@ -29,27 +29,27 @@ edges | main.rs:9:9:9:16 | username | main.rs:26:55:26:62 | username | provenance | | | main.rs:9:9:9:16 | username | main.rs:30:11:30:66 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:9:9:9:16 | username | main.rs:52:29:52:36 | username | provenance | | -| main.rs:9:20:9:23 | args [element] | main.rs:9:20:9:30 | args.get(...) [Some, &ref] | provenance | MaD:9 | -| main.rs:9:20:9:30 | args.get(...) [Some, &ref] | main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | provenance | MaD:12 | -| main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | main.rs:9:20:9:72 | ... .clone() | provenance | MaD:20 | +| main.rs:9:20:9:23 | args [element] | main.rs:9:20:9:30 | args.get(...) [Some, &ref] | provenance | MaD:10 | +| main.rs:9:20:9:30 | args.get(...) [Some, &ref] | main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | provenance | MaD:16 | +| main.rs:9:20:9:64 | ... .unwrap_or(...) [&ref] | main.rs:9:20:9:72 | ... .clone() | provenance | MaD:11 | | main.rs:9:20:9:72 | ... .clone() | main.rs:9:9:9:16 | username | provenance | | | main.rs:10:9:10:18 | user_input | main.rs:16:11:16:44 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:10:9:10:18 | user_input | main.rs:19:12:19:39 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:10:22:10:48 | ...::var(...) | main.rs:10:22:10:48 | ...::var(...) [Ok] | provenance | Src:MaD:7 | -| main.rs:10:22:10:48 | ...::var(...) [Ok] | main.rs:10:22:10:81 | ... .unwrap_or(...) | provenance | MaD:15 | +| main.rs:10:22:10:48 | ...::var(...) [Ok] | main.rs:10:22:10:81 | ... .unwrap_or(...) | provenance | MaD:19 | | main.rs:10:22:10:81 | ... .unwrap_or(...) | main.rs:10:9:10:18 | user_input | provenance | | | main.rs:11:9:11:19 | remote_data | main.rs:17:12:17:46 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:11:9:11:19 | remote_data | main.rs:30:11:30:66 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:11:23:11:71 | ...::get(...) | main.rs:11:23:11:71 | ...::get(...) [Ok] | provenance | Src:MaD:5 | -| main.rs:11:23:11:71 | ...::get(...) [Ok] | main.rs:11:23:12:17 | ... .unwrap() | provenance | MaD:14 | -| main.rs:11:23:12:17 | ... .unwrap() | main.rs:11:23:12:24 | ... .text() [Ok] | provenance | MaD:17 | -| main.rs:11:23:12:24 | ... .text() [Ok] | main.rs:11:23:12:61 | ... .unwrap_or(...) | provenance | MaD:15 | +| main.rs:11:23:11:71 | ...::get(...) [Ok] | main.rs:11:23:12:17 | ... .unwrap() | provenance | MaD:18 | +| main.rs:11:23:12:17 | ... .unwrap() | main.rs:11:23:12:24 | ... .text() [Ok] | provenance | MaD:21 | +| main.rs:11:23:12:24 | ... .text() [Ok] | main.rs:11:23:12:61 | ... .unwrap_or(...) | provenance | MaD:19 | | main.rs:11:23:12:61 | ... .unwrap_or(...) | main.rs:11:9:11:19 | remote_data | provenance | | | main.rs:22:9:22:21 | formatted_msg | main.rs:23:11:23:29 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:22:33:22:63 | ...::format(...) | main.rs:22:33:22:63 | { ... } | provenance | | | main.rs:22:33:22:63 | ...::must_use(...) | main.rs:22:9:22:21 | formatted_msg | provenance | | -| main.rs:22:33:22:63 | MacroExpr | main.rs:22:33:22:63 | ...::format(...) | provenance | MaD:18 | -| main.rs:22:33:22:63 | { ... } | main.rs:22:33:22:63 | ...::must_use(...) | provenance | MaD:21 | +| main.rs:22:33:22:63 | MacroExpr | main.rs:22:33:22:63 | ...::format(...) | provenance | MaD:22 | +| main.rs:22:33:22:63 | { ... } | main.rs:22:33:22:63 | ...::must_use(...) | provenance | MaD:23 | | main.rs:26:9:26:18 | concat_msg | main.rs:27:11:27:26 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:26:22:26:62 | ... + ... | main.rs:26:9:26:18 | concat_msg | provenance | | | main.rs:26:54:26:62 | &username [&ref] | main.rs:26:22:26:62 | ... + ... | provenance | MaD:8 | @@ -59,7 +59,7 @@ edges | main.rs:56:27:56:40 | ...: ... [&ref] | main.rs:65:38:65:45 | username [&ref] | provenance | | | main.rs:65:9:65:17 | user_info [UserInfo] | main.rs:66:28:66:36 | user_info [UserInfo] | provenance | | | main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | main.rs:65:9:65:17 | user_info [UserInfo] | provenance | | -| main.rs:65:38:65:45 | username [&ref] | main.rs:65:38:65:57 | username.to_string() | provenance | MaD:19 | +| main.rs:65:38:65:45 | username [&ref] | main.rs:65:38:65:57 | username.to_string() | provenance | MaD:9 | | main.rs:65:38:65:57 | username.to_string() | main.rs:65:21:65:59 | UserInfo {...} [UserInfo] | provenance | | | main.rs:66:28:66:36 | user_info [UserInfo] | main.rs:66:28:66:41 | user_info.name | provenance | | | main.rs:66:28:66:41 | user_info.name | main.rs:66:11:66:41 | MacroExpr | provenance | Sink:MaD:1 | @@ -70,20 +70,20 @@ edges | main.rs:109:13:109:21 | user_data | main.rs:116:16:116:37 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:109:13:109:21 | user_data | main.rs:119:15:119:75 | MacroExpr | provenance | Sink:MaD:1 | | main.rs:109:25:109:40 | ...::args(...) | main.rs:109:25:109:40 | ...::args(...) [element] | provenance | Src:MaD:6 | -| main.rs:109:25:109:40 | ...::args(...) [element] | main.rs:109:25:109:47 | ... .nth(...) [Some] | provenance | MaD:23 | -| main.rs:109:25:109:47 | ... .nth(...) [Some] | main.rs:109:25:109:67 | ... .unwrap_or_default() | provenance | MaD:13 | +| main.rs:109:25:109:40 | ...::args(...) [element] | main.rs:109:25:109:47 | ... .nth(...) [Some] | provenance | MaD:13 | +| main.rs:109:25:109:47 | ... .nth(...) [Some] | main.rs:109:25:109:67 | ... .unwrap_or_default() | provenance | MaD:17 | | main.rs:109:25:109:67 | ... .unwrap_or_default() | main.rs:109:13:109:21 | user_data | provenance | | | main.rs:127:13:127:21 | user_data | main.rs:130:18:130:38 | MacroExpr | provenance | Sink:MaD:3 | | main.rs:127:13:127:21 | user_data | main.rs:131:19:131:49 | MacroExpr | provenance | Sink:MaD:2 | | main.rs:127:25:127:45 | ...::var(...) | main.rs:127:25:127:45 | ...::var(...) [Ok] | provenance | Src:MaD:7 | -| main.rs:127:25:127:45 | ...::var(...) [Ok] | main.rs:127:25:127:65 | ... .unwrap_or_default() | provenance | MaD:16 | +| main.rs:127:25:127:45 | ...::var(...) [Ok] | main.rs:127:25:127:65 | ... .unwrap_or_default() | provenance | MaD:20 | | main.rs:127:25:127:65 | ... .unwrap_or_default() | main.rs:127:13:127:21 | user_data | provenance | | | main.rs:141:13:141:18 | m_path [Some] | main.rs:143:26:143:31 | m_path [Some] | provenance | | -| main.rs:141:22:141:27 | o_path | main.rs:141:22:141:38 | o_path.map(...) [Some] | provenance | MaD:10 | -| main.rs:141:22:141:27 | o_path | main.rs:141:34:141:34 | ... | provenance | MaD:10 | +| main.rs:141:22:141:27 | o_path | main.rs:141:22:141:38 | o_path.map(...) [Some] | provenance | MaD:14 | +| main.rs:141:22:141:27 | o_path | main.rs:141:34:141:34 | ... | provenance | MaD:14 | | main.rs:141:22:141:38 | o_path.map(...) [Some] | main.rs:141:13:141:18 | m_path [Some] | provenance | | | main.rs:141:34:141:34 | ... | main.rs:141:37:141:37 | x | provenance | | -| main.rs:143:26:143:31 | m_path [Some] | main.rs:143:26:143:40 | m_path.unwrap() | provenance | MaD:11 | +| main.rs:143:26:143:31 | m_path [Some] | main.rs:143:26:143:40 | m_path.unwrap() | provenance | MaD:15 | | main.rs:143:26:143:40 | m_path.unwrap() | main.rs:143:18:143:40 | MacroExpr | provenance | Sink:MaD:3 | | main.rs:150:32:150:48 | my_axum_handler_1 | main.rs:141:22:141:27 | o_path | provenance | Src:MaD:4 | models @@ -95,21 +95,21 @@ models | 6 | Source: std::env::args; ReturnValue.Element; commandargs | | 7 | Source: std::env::var; ReturnValue.Field[core::result::Result::Ok(0)]; environment | | 8 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | -| 9 | Summary: ::deref; Argument[self].Reference.Element; ReturnValue.Reference.Element; value | -| 10 | Summary: ::map; Argument[self].Field[core::option::Option::Some(0)]; Argument[0].Parameter[0]; value | -| 11 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 12 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 13 | Summary: ::unwrap_or_default; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 14 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 15 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 16 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 17 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 18 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 19 | Summary: alloc::string::ToString::to_string; Argument[self].Reference; ReturnValue; taint | -| 20 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | -| 21 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | -| 22 | Summary: core::iter::traits::iterator::Iterator::collect; Argument[self].Element; ReturnValue.Element; value | -| 23 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 9 | Summary: ::to_string; Argument[self].Reference; ReturnValue; taint | +| 10 | Summary: ::deref; Argument[self].Reference.Element; ReturnValue.Reference.Element; value | +| 11 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 12 | Summary: ::collect; Argument[self].Element; ReturnValue.Element; value | +| 13 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 14 | Summary: ::map; Argument[self].Field[core::option::Option::Some(0)]; Argument[0].Parameter[0]; value | +| 15 | Summary: ::unwrap; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 16 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 17 | Summary: ::unwrap_or_default; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 18 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 19 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 20 | Summary: ::unwrap_or_default; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 21 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 22 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 23 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:8:9:8:12 | args [element] | semmle.label | args [element] | | main.rs:8:29:8:39 | ...::args(...) | semmle.label | ...::args(...) | diff --git a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected index 702f5f48952d..6fb6fee32f28 100644 --- a/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected +++ b/rust/ql/test/query-tests/security/CWE-312/CleartextLogging.expected @@ -122,7 +122,7 @@ edges | test_logging.rs:99:9:99:10 | m3 | test_logging.rs:100:11:100:18 | MacroExpr | provenance | Sink:MaD:11 | | test_logging.rs:99:22:99:45 | ...::format(...) | test_logging.rs:99:22:99:45 | { ... } | provenance | | | test_logging.rs:99:22:99:45 | ...::must_use(...) | test_logging.rs:99:9:99:10 | m3 | provenance | | -| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:99:22:99:45 | MacroExpr | test_logging.rs:99:22:99:45 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:99:22:99:45 | { ... } | test_logging.rs:99:22:99:45 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:99:38:99:45 | password | test_logging.rs:99:22:99:45 | MacroExpr | provenance | | | test_logging.rs:118:28:118:41 | get_password(...) | test_logging.rs:118:12:118:41 | MacroExpr | provenance | Sink:MaD:11 | @@ -139,7 +139,7 @@ edges | test_logging.rs:176:34:176:79 | MacroExpr | test_logging.rs:176:33:176:79 | &... [&ref] | provenance | | | test_logging.rs:176:42:176:78 | ...::format(...) | test_logging.rs:176:42:176:78 | { ... } | provenance | | | test_logging.rs:176:42:176:78 | ...::must_use(...) | test_logging.rs:176:34:176:79 | MacroExpr | provenance | | -| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:176:42:176:78 | MacroExpr | test_logging.rs:176:42:176:78 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:176:42:176:78 | { ... } | test_logging.rs:176:42:176:78 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:176:70:176:78 | password2 | test_logging.rs:176:42:176:78 | MacroExpr | provenance | | | test_logging.rs:180:35:180:81 | &... | test_logging.rs:180:35:180:81 | &... | provenance | Sink:MaD:3 | @@ -148,12 +148,12 @@ edges | test_logging.rs:180:36:180:81 | MacroExpr | test_logging.rs:180:35:180:81 | &... [&ref] | provenance | | | test_logging.rs:180:44:180:80 | ...::format(...) | test_logging.rs:180:44:180:80 | { ... } | provenance | | | test_logging.rs:180:44:180:80 | ...::must_use(...) | test_logging.rs:180:36:180:81 | MacroExpr | provenance | | -| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:180:44:180:80 | MacroExpr | test_logging.rs:180:44:180:80 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:180:44:180:80 | { ... } | test_logging.rs:180:44:180:80 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:180:72:180:80 | password2 | test_logging.rs:180:44:180:80 | MacroExpr | provenance | | | test_logging.rs:183:9:183:19 | err_result2 [Err] | test_logging.rs:184:13:184:23 | err_result2 | provenance | Sink:MaD:4 | | test_logging.rs:183:47:183:68 | Err(...) [Err] | test_logging.rs:183:9:183:19 | err_result2 [Err] | provenance | | -| test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | MaD:19 | +| test_logging.rs:183:51:183:59 | password2 | test_logging.rs:183:51:183:67 | password2.clone() | provenance | MaD:18 | | test_logging.rs:183:51:183:67 | password2.clone() | test_logging.rs:183:47:183:68 | Err(...) [Err] | provenance | | | test_logging.rs:187:9:187:19 | err_result3 [Err] | test_logging.rs:188:13:188:23 | err_result3 | provenance | Sink:MaD:5 | | test_logging.rs:187:47:187:60 | Err(...) [Err] | test_logging.rs:187:9:187:19 | err_result3 [Err] | provenance | | @@ -184,35 +184,35 @@ edges | test_logging.rs:229:30:229:71 | ... .as_str() [&ref] | test_logging.rs:229:30:229:71 | ... .as_str() | provenance | Sink:MaD:2 | | test_logging.rs:229:38:229:61 | ...::format(...) | test_logging.rs:229:38:229:61 | { ... } | provenance | | | test_logging.rs:229:38:229:61 | ...::must_use(...) | test_logging.rs:229:30:229:62 | MacroExpr | provenance | | -| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:229:38:229:61 | MacroExpr | test_logging.rs:229:38:229:61 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:229:38:229:61 | { ... } | test_logging.rs:229:38:229:61 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:229:54:229:61 | password | test_logging.rs:229:38:229:61 | MacroExpr | provenance | | | test_logging.rs:242:16:242:50 | MacroExpr | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:242:16:242:61 | ... .as_bytes() [&ref, element] | test_logging.rs:242:16:242:61 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:242:24:242:49 | ...::format(...) | test_logging.rs:242:24:242:49 | { ... } | provenance | | | test_logging.rs:242:24:242:49 | ...::must_use(...) | test_logging.rs:242:16:242:50 | MacroExpr | provenance | | -| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:242:24:242:49 | MacroExpr | test_logging.rs:242:24:242:49 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:242:24:242:49 | { ... } | test_logging.rs:242:24:242:49 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:242:42:242:49 | password | test_logging.rs:242:24:242:49 | MacroExpr | provenance | | | test_logging.rs:245:20:245:54 | MacroExpr | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:245:20:245:65 | ... .as_bytes() [&ref, element] | test_logging.rs:245:20:245:65 | ... .as_bytes() | provenance | Sink:MaD:8 Sink:MaD:8 | | test_logging.rs:245:28:245:53 | ...::format(...) | test_logging.rs:245:28:245:53 | { ... } | provenance | | | test_logging.rs:245:28:245:53 | ...::must_use(...) | test_logging.rs:245:20:245:54 | MacroExpr | provenance | | -| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:245:28:245:53 | MacroExpr | test_logging.rs:245:28:245:53 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:245:28:245:53 | { ... } | test_logging.rs:245:28:245:53 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:245:46:245:53 | password | test_logging.rs:245:28:245:53 | MacroExpr | provenance | | | test_logging.rs:248:15:248:49 | MacroExpr | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:248:15:248:60 | ... .as_bytes() [&ref, element] | test_logging.rs:248:15:248:60 | ... .as_bytes() | provenance | Sink:MaD:7 Sink:MaD:7 | | test_logging.rs:248:23:248:48 | ...::format(...) | test_logging.rs:248:23:248:48 | { ... } | provenance | | | test_logging.rs:248:23:248:48 | ...::must_use(...) | test_logging.rs:248:15:248:49 | MacroExpr | provenance | | -| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:248:23:248:48 | MacroExpr | test_logging.rs:248:23:248:48 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:248:23:248:48 | { ... } | test_logging.rs:248:23:248:48 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:248:41:248:48 | password | test_logging.rs:248:23:248:48 | MacroExpr | provenance | | | test_logging.rs:251:15:251:49 | MacroExpr | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | provenance | MaD:16 | | test_logging.rs:251:15:251:60 | ... .as_bytes() [&ref, element] | test_logging.rs:251:15:251:60 | ... .as_bytes() | provenance | Sink:MaD:6 Sink:MaD:6 | | test_logging.rs:251:23:251:48 | ...::format(...) | test_logging.rs:251:23:251:48 | { ... } | provenance | | | test_logging.rs:251:23:251:48 | ...::must_use(...) | test_logging.rs:251:15:251:49 | MacroExpr | provenance | | -| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:18 | +| test_logging.rs:251:23:251:48 | MacroExpr | test_logging.rs:251:23:251:48 | ...::format(...) | provenance | MaD:19 | | test_logging.rs:251:23:251:48 | { ... } | test_logging.rs:251:23:251:48 | ...::must_use(...) | provenance | MaD:20 | | test_logging.rs:251:41:251:48 | password | test_logging.rs:251:23:251:48 | MacroExpr | provenance | | models @@ -233,8 +233,8 @@ models | 15 | Summary: ::add; Argument[0].Reference; ReturnValue; taint | | 16 | Summary: ::as_bytes; Argument[self].Reference; ReturnValue.Reference.Element; taint | | 17 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 18 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 19 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | +| 18 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 19 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 20 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | test_logging.rs:42:12:42:35 | MacroExpr | semmle.label | MacroExpr | diff --git a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected index 3719d4c9d7e2..bd1d0fe81ae2 100644 --- a/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected +++ b/rust/ql/test/query-tests/security/CWE-614/InsecureCookie.expected @@ -126,9 +126,9 @@ edges | main.rs:58:9:58:13 | mut a | main.rs:59:13:59:13 | a | provenance | | | main.rs:58:9:58:13 | mut a | main.rs:60:22:60:22 | a | provenance | | | main.rs:58:17:58:44 | ...::new(...) | main.rs:58:9:58:13 | mut a | provenance | Src:MaD:17 | -| main.rs:59:13:59:13 | a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:38 | +| main.rs:59:13:59:13 | a | main.rs:59:13:59:21 | a.clone() | provenance | MaD:35 | | main.rs:59:13:59:21 | a.clone() | main.rs:59:13:59:21 | a.clone() | provenance | Sink:MaD:4 | -| main.rs:60:22:60:22 | a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:38 | +| main.rs:60:22:60:22 | a | main.rs:60:22:60:30 | a.clone() | provenance | MaD:35 | | main.rs:60:22:60:30 | a.clone() | main.rs:60:22:60:30 | a.clone() | provenance | Sink:MaD:5 | | main.rs:63:5:63:5 | [SSA] a | main.rs:64:13:64:13 | a | provenance | | | main.rs:63:5:63:5 | [SSA] a | main.rs:70:29:70:29 | a | provenance | | @@ -136,56 +136,56 @@ edges | main.rs:63:5:63:5 | a | main.rs:64:13:64:13 | a | provenance | | | main.rs:63:5:63:5 | a | main.rs:70:29:70:29 | a | provenance | | | main.rs:63:5:63:5 | a | main.rs:79:30:79:30 | a | provenance | | -| main.rs:64:13:64:13 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:38 | +| main.rs:64:13:64:13 | a | main.rs:64:13:64:21 | a.clone() | provenance | MaD:35 | | main.rs:64:13:64:21 | a.clone() | main.rs:64:13:64:21 | a.clone() | provenance | Sink:MaD:4 | | main.rs:68:9:68:13 | mut b | main.rs:69:20:69:20 | b | provenance | | | main.rs:68:17:68:37 | ...::named(...) | main.rs:68:9:68:13 | mut b | provenance | Src:MaD:16 | -| main.rs:69:20:69:20 | b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:38 | +| main.rs:69:20:69:20 | b | main.rs:69:20:69:28 | b.clone() | provenance | MaD:35 | | main.rs:69:20:69:28 | b.clone() | main.rs:69:20:69:28 | b.clone() | provenance | Sink:MaD:8 | -| main.rs:70:29:70:29 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:38 | +| main.rs:70:29:70:29 | a | main.rs:70:29:70:37 | a.clone() | provenance | MaD:35 | | main.rs:70:29:70:37 | a.clone() | main.rs:70:29:70:37 | a.clone() | provenance | Sink:MaD:9 | | main.rs:71:5:71:5 | [SSA] b | main.rs:72:20:72:20 | b | provenance | | | main.rs:71:5:71:5 | b | main.rs:72:20:72:20 | b | provenance | | -| main.rs:72:20:72:20 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:38 | +| main.rs:72:20:72:20 | b | main.rs:72:20:72:28 | b.clone() | provenance | MaD:35 | | main.rs:72:20:72:28 | b.clone() | main.rs:72:20:72:28 | b.clone() | provenance | Sink:MaD:8 | | main.rs:77:9:77:13 | mut c | main.rs:78:21:78:21 | c | provenance | | | main.rs:77:9:77:13 | mut c | main.rs:83:21:83:21 | c | provenance | | | main.rs:77:17:77:36 | ...::from(...) | main.rs:77:9:77:13 | mut c | provenance | Src:MaD:14 | -| main.rs:78:21:78:21 | c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:38 | +| main.rs:78:21:78:21 | c | main.rs:78:21:78:29 | c.clone() | provenance | MaD:35 | | main.rs:78:21:78:29 | c.clone() | main.rs:78:21:78:29 | c.clone() | provenance | Sink:MaD:6 | -| main.rs:79:30:79:30 | a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:38 | +| main.rs:79:30:79:30 | a | main.rs:79:30:79:38 | a.clone() | provenance | MaD:35 | | main.rs:79:30:79:38 | a.clone() | main.rs:79:30:79:38 | a.clone() | provenance | Sink:MaD:7 | -| main.rs:83:21:83:21 | c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:38 | +| main.rs:83:21:83:21 | c | main.rs:83:21:83:29 | c.clone() | provenance | MaD:35 | | main.rs:83:21:83:29 | c.clone() | main.rs:83:21:83:29 | c.clone() | provenance | Sink:MaD:6 | | main.rs:87:9:87:13 | mut d | main.rs:88:13:88:13 | d | provenance | | | main.rs:87:9:87:13 | mut d | main.rs:94:13:94:13 | d | provenance | | | main.rs:87:17:87:36 | ...::from(...) | main.rs:87:9:87:13 | mut d | provenance | Src:MaD:14 | -| main.rs:88:13:88:13 | d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:38 | +| main.rs:88:13:88:13 | d | main.rs:88:13:88:21 | d.clone() | provenance | MaD:35 | | main.rs:88:13:88:21 | d.clone() | main.rs:88:13:88:21 | d.clone() | provenance | Sink:MaD:4 | -| main.rs:94:13:94:13 | d | main.rs:94:13:94:21 | d.clone() | provenance | MaD:38 | +| main.rs:94:13:94:13 | d | main.rs:94:13:94:21 | d.clone() | provenance | MaD:35 | | main.rs:94:13:94:21 | d.clone() | main.rs:94:13:94:21 | d.clone() | provenance | Sink:MaD:4 | | main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:36 | ...::build(...) | provenance | Src:MaD:15 | | main.rs:114:5:114:36 | ...::build(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | MaD:32 | | main.rs:114:5:114:54 | ... .partitioned(...) | main.rs:114:5:114:54 | ... .partitioned(...) | provenance | Sink:MaD:2 | | main.rs:122:9:122:9 | a | main.rs:123:20:123:20 | a | provenance | | | main.rs:122:13:122:58 | ...::new(...) | main.rs:122:9:122:9 | a | provenance | Src:MaD:13 | -| main.rs:123:20:123:20 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:38 | +| main.rs:123:20:123:20 | a | main.rs:123:20:123:28 | a.clone() | provenance | MaD:35 | | main.rs:123:20:123:28 | a.clone() | main.rs:123:20:123:28 | a.clone() | provenance | Sink:MaD:1 | | main.rs:130:9:130:9 | c | main.rs:131:20:131:20 | c | provenance | | | main.rs:130:9:130:9 | c | main.rs:134:13:134:13 | c | provenance | | | main.rs:130:13:130:13 | b | main.rs:130:13:130:31 | b.set_secure(...) | provenance | MaD:27 | | main.rs:130:13:130:31 | b.set_secure(...) | main.rs:130:9:130:9 | c | provenance | | -| main.rs:131:20:131:20 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:38 | +| main.rs:131:20:131:20 | c | main.rs:131:20:131:28 | c.clone() | provenance | MaD:35 | | main.rs:131:20:131:28 | c.clone() | main.rs:131:20:131:28 | c.clone() | provenance | Sink:MaD:1 | | main.rs:134:9:134:9 | d | main.rs:135:20:135:20 | d | provenance | | | main.rs:134:13:134:13 | c | main.rs:134:13:134:35 | c.set_partitioned(...) | provenance | MaD:24 | | main.rs:134:13:134:35 | c.set_partitioned(...) | main.rs:134:9:134:9 | d | provenance | | -| main.rs:135:20:135:20 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:38 | +| main.rs:135:20:135:20 | d | main.rs:135:20:135:28 | d.clone() | provenance | MaD:35 | | main.rs:135:20:135:28 | d.clone() | main.rs:135:20:135:28 | d.clone() | provenance | Sink:MaD:1 | | main.rs:146:9:146:9 | g | main.rs:147:20:147:20 | g | provenance | | | main.rs:146:13:146:13 | f | main.rs:146:13:146:31 | f.set_secure(...) | provenance | MaD:27 | | main.rs:146:13:146:31 | f.set_secure(...) | main.rs:146:9:146:9 | g | provenance | | -| main.rs:147:20:147:20 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:38 | +| main.rs:147:20:147:20 | g | main.rs:147:20:147:28 | g.clone() | provenance | MaD:35 | | main.rs:147:20:147:28 | g.clone() | main.rs:147:20:147:28 | g.clone() | provenance | Sink:MaD:1 | | main.rs:151:9:151:9 | h | main.rs:152:20:152:20 | h | provenance | Sink:MaD:1 | | main.rs:151:13:151:61 | ...::from(...) | main.rs:151:9:151:9 | h | provenance | Src:MaD:12 | @@ -202,40 +202,40 @@ edges | main.rs:155:9:155:9 | i | main.rs:166:20:166:20 | i | provenance | | | main.rs:155:9:155:9 | i | main.rs:167:20:167:20 | i | provenance | | | main.rs:155:13:155:58 | ...::new(...) | main.rs:155:9:155:9 | i | provenance | Src:MaD:13 | -| main.rs:156:20:156:20 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:38 | +| main.rs:156:20:156:20 | i | main.rs:156:20:156:28 | i.clone() | provenance | MaD:35 | | main.rs:156:20:156:28 | i.clone() | main.rs:156:20:156:46 | ... .set_name(...) | provenance | MaD:23 | | main.rs:156:20:156:46 | ... .set_name(...) | main.rs:156:20:156:46 | ... .set_name(...) | provenance | Sink:MaD:1 | -| main.rs:157:20:157:20 | i | main.rs:157:20:157:28 | i.clone() | provenance | MaD:38 | +| main.rs:157:20:157:20 | i | main.rs:157:20:157:28 | i.clone() | provenance | MaD:35 | | main.rs:157:20:157:28 | i.clone() | main.rs:157:20:157:48 | ... .set_value(...) | provenance | MaD:28 | | main.rs:157:20:157:48 | ... .set_value(...) | main.rs:157:20:157:48 | ... .set_value(...) | provenance | Sink:MaD:1 | -| main.rs:158:20:158:20 | i | main.rs:158:20:158:28 | i.clone() | provenance | MaD:38 | +| main.rs:158:20:158:20 | i | main.rs:158:20:158:28 | i.clone() | provenance | MaD:35 | | main.rs:158:20:158:28 | i.clone() | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | MaD:21 | | main.rs:158:20:158:48 | ... .set_http_only(...) | main.rs:158:20:158:48 | ... .set_http_only(...) | provenance | Sink:MaD:1 | -| main.rs:159:20:159:20 | i | main.rs:159:20:159:28 | i.clone() | provenance | MaD:38 | +| main.rs:159:20:159:20 | i | main.rs:159:20:159:28 | i.clone() | provenance | MaD:35 | | main.rs:159:20:159:28 | i.clone() | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | MaD:26 | | main.rs:159:20:159:70 | ... .set_same_site(...) | main.rs:159:20:159:70 | ... .set_same_site(...) | provenance | Sink:MaD:1 | -| main.rs:160:20:160:20 | i | main.rs:160:20:160:28 | i.clone() | provenance | MaD:38 | +| main.rs:160:20:160:20 | i | main.rs:160:20:160:28 | i.clone() | provenance | MaD:35 | | main.rs:160:20:160:28 | i.clone() | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | MaD:22 | | main.rs:160:20:160:46 | ... .set_max_age(...) | main.rs:160:20:160:46 | ... .set_max_age(...) | provenance | Sink:MaD:1 | -| main.rs:161:20:161:20 | i | main.rs:161:20:161:28 | i.clone() | provenance | MaD:38 | +| main.rs:161:20:161:20 | i | main.rs:161:20:161:28 | i.clone() | provenance | MaD:35 | | main.rs:161:20:161:28 | i.clone() | main.rs:161:20:161:42 | ... .set_path(...) | provenance | MaD:25 | | main.rs:161:20:161:42 | ... .set_path(...) | main.rs:161:20:161:42 | ... .set_path(...) | provenance | Sink:MaD:1 | -| main.rs:162:20:162:20 | i | main.rs:162:20:162:28 | i.clone() | provenance | MaD:38 | +| main.rs:162:20:162:20 | i | main.rs:162:20:162:28 | i.clone() | provenance | MaD:35 | | main.rs:162:20:162:28 | i.clone() | main.rs:162:20:162:41 | ... .unset_path() | provenance | MaD:31 | | main.rs:162:20:162:41 | ... .unset_path() | main.rs:162:20:162:41 | ... .unset_path() | provenance | Sink:MaD:1 | -| main.rs:163:20:163:20 | i | main.rs:163:20:163:28 | i.clone() | provenance | MaD:38 | +| main.rs:163:20:163:20 | i | main.rs:163:20:163:28 | i.clone() | provenance | MaD:35 | | main.rs:163:20:163:28 | i.clone() | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | MaD:19 | | main.rs:163:20:163:54 | ... .set_domain(...) | main.rs:163:20:163:54 | ... .set_domain(...) | provenance | Sink:MaD:1 | -| main.rs:164:20:164:20 | i | main.rs:164:20:164:28 | i.clone() | provenance | MaD:38 | +| main.rs:164:20:164:20 | i | main.rs:164:20:164:28 | i.clone() | provenance | MaD:35 | | main.rs:164:20:164:28 | i.clone() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | MaD:29 | | main.rs:164:20:164:43 | ... .unset_domain() | main.rs:164:20:164:43 | ... .unset_domain() | provenance | Sink:MaD:1 | -| main.rs:165:20:165:20 | i | main.rs:165:20:165:28 | i.clone() | provenance | MaD:38 | +| main.rs:165:20:165:20 | i | main.rs:165:20:165:28 | i.clone() | provenance | MaD:35 | | main.rs:165:20:165:28 | i.clone() | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | MaD:20 | | main.rs:165:20:165:46 | ... .set_expires(...) | main.rs:165:20:165:46 | ... .set_expires(...) | provenance | Sink:MaD:1 | -| main.rs:166:20:166:20 | i | main.rs:166:20:166:28 | i.clone() | provenance | MaD:38 | +| main.rs:166:20:166:20 | i | main.rs:166:20:166:28 | i.clone() | provenance | MaD:35 | | main.rs:166:20:166:28 | i.clone() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | MaD:30 | | main.rs:166:20:166:44 | ... .unset_expires() | main.rs:166:20:166:44 | ... .unset_expires() | provenance | Sink:MaD:1 | -| main.rs:167:20:167:20 | i | main.rs:167:20:167:28 | i.clone() | provenance | MaD:38 | +| main.rs:167:20:167:20 | i | main.rs:167:20:167:28 | i.clone() | provenance | MaD:35 | | main.rs:167:20:167:28 | i.clone() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | MaD:18 | | main.rs:167:20:167:45 | ... .make_permanent() | main.rs:167:20:167:45 | ... .make_permanent() | provenance | Sink:MaD:1 | | main.rs:173:22:173:59 | ...::build(...) | main.rs:173:22:173:59 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:2 | @@ -246,28 +246,28 @@ edges | main.rs:198:5:198:63 | ... .path(...) | main.rs:198:5:198:63 | ... .path(...) | provenance | Sink:MaD:3 | | main.rs:201:5:201:11 | [SSA] cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | | main.rs:201:5:201:11 | cookie1 | main.rs:202:13:202:19 | cookie1 | provenance | | -| main.rs:202:13:202:19 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:38 | +| main.rs:202:13:202:19 | cookie1 | main.rs:202:13:202:27 | cookie1.clone() | provenance | MaD:35 | | main.rs:202:13:202:27 | cookie1.clone() | main.rs:202:13:202:27 | cookie1.clone() | provenance | Sink:MaD:4 | | main.rs:212:5:212:39 | ...::build(...) | main.rs:212:5:212:39 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:3 | | main.rs:214:9:214:15 | cookie3 | main.rs:215:13:215:19 | cookie3 | provenance | | | main.rs:214:19:214:51 | ...::new(...) | main.rs:214:9:214:15 | cookie3 | provenance | Src:MaD:17 | -| main.rs:215:13:215:19 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:38 | +| main.rs:215:13:215:19 | cookie3 | main.rs:215:13:215:27 | cookie3.clone() | provenance | MaD:35 | | main.rs:215:13:215:27 | cookie3.clone() | main.rs:215:13:215:27 | cookie3.clone() | provenance | Sink:MaD:4 | | main.rs:218:5:218:11 | [SSA] cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | | main.rs:218:5:218:11 | cookie2 | main.rs:219:13:219:19 | cookie2 | provenance | | -| main.rs:219:13:219:19 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:38 | +| main.rs:219:13:219:19 | cookie2 | main.rs:219:13:219:27 | cookie2.clone() | provenance | MaD:35 | | main.rs:219:13:219:27 | cookie2.clone() | main.rs:219:13:219:27 | cookie2.clone() | provenance | Sink:MaD:4 | | main.rs:228:5:228:11 | [SSA] cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | | main.rs:228:5:228:11 | cookie1 | main.rs:229:13:229:19 | cookie1 | provenance | | -| main.rs:229:13:229:19 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:38 | +| main.rs:229:13:229:19 | cookie1 | main.rs:229:13:229:27 | cookie1.clone() | provenance | MaD:35 | | main.rs:229:13:229:27 | cookie1.clone() | main.rs:229:13:229:27 | cookie1.clone() | provenance | Sink:MaD:11 | | main.rs:241:9:241:25 | cookie_config_bad | main.rs:242:43:242:59 | cookie_config_bad | provenance | Sink:MaD:10 | -| main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:37 | +| main.rs:241:29:241:62 | ...::new(...) | main.rs:241:29:241:76 | ... .secure(...) | provenance | MaD:38 | | main.rs:241:29:241:76 | ... .secure(...) | main.rs:241:9:241:25 | cookie_config_bad | provenance | | | main.rs:244:9:244:26 | cookie_config_bad2 | main.rs:245:43:245:60 | cookie_config_bad2 | provenance | Sink:MaD:10 | -| main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:37 | -| main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:35 | -| main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:36 | +| main.rs:244:30:244:63 | ...::new(...) | main.rs:244:30:244:77 | ... .secure(...) | provenance | MaD:38 | +| main.rs:244:30:244:77 | ... .secure(...) | main.rs:244:30:244:90 | ... .name(...) | provenance | MaD:36 | +| main.rs:244:30:244:90 | ... .name(...) | main.rs:244:30:244:100 | ... .path(...) | provenance | MaD:37 | | main.rs:244:30:244:100 | ... .path(...) | main.rs:244:9:244:26 | cookie_config_bad2 | provenance | | | main.rs:259:5:259:43 | ...::build(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | MaD:34 | | main.rs:259:5:259:57 | ... .secure(...) | main.rs:259:5:259:57 | ... .secure(...) | provenance | Sink:MaD:3 | @@ -276,16 +276,16 @@ edges | main.rs:260:5:260:67 | ... .path(...) | main.rs:260:5:260:67 | ... .path(...) | provenance | Sink:MaD:3 | | main.rs:263:5:263:11 | [SSA] cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | | main.rs:263:5:263:11 | cookie1 | main.rs:264:13:264:19 | cookie1 | provenance | | -| main.rs:264:13:264:19 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:38 | +| main.rs:264:13:264:19 | cookie1 | main.rs:264:13:264:27 | cookie1.clone() | provenance | MaD:35 | | main.rs:264:13:264:27 | cookie1.clone() | main.rs:264:13:264:27 | cookie1.clone() | provenance | Sink:MaD:4 | | main.rs:274:5:274:43 | ...::build(...) | main.rs:274:5:274:43 | ...::build(...) | provenance | Src:MaD:15 Sink:MaD:3 | | main.rs:276:9:276:15 | cookie3 | main.rs:277:13:277:19 | cookie3 | provenance | | | main.rs:276:19:276:55 | ...::new(...) | main.rs:276:9:276:15 | cookie3 | provenance | Src:MaD:17 | -| main.rs:277:13:277:19 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:38 | +| main.rs:277:13:277:19 | cookie3 | main.rs:277:13:277:27 | cookie3.clone() | provenance | MaD:35 | | main.rs:277:13:277:27 | cookie3.clone() | main.rs:277:13:277:27 | cookie3.clone() | provenance | Sink:MaD:4 | | main.rs:280:5:280:11 | [SSA] cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | | main.rs:280:5:280:11 | cookie2 | main.rs:281:13:281:19 | cookie2 | provenance | | -| main.rs:281:13:281:19 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:38 | +| main.rs:281:13:281:19 | cookie2 | main.rs:281:13:281:27 | cookie2.clone() | provenance | MaD:35 | | main.rs:281:13:281:27 | cookie2.clone() | main.rs:281:13:281:27 | cookie2.clone() | provenance | Sink:MaD:4 | models | 1 | Sink: ::insert; Argument[0]; cookie-use | @@ -322,10 +322,10 @@ models | 32 | Summary: ::partitioned; Argument[self].OptionalBarrier[cookie-partitioned-arg0]; ReturnValue; taint | | 33 | Summary: ::path; Argument[self]; ReturnValue; taint | | 34 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | -| 35 | Summary: ::name; Argument[self]; ReturnValue; taint | -| 36 | Summary: ::path; Argument[self]; ReturnValue; taint | -| 37 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | -| 38 | Summary: core::clone::Clone::clone; Argument[self].Reference; ReturnValue; value | +| 35 | Summary: ::clone; Argument[self].Reference; ReturnValue; value | +| 36 | Summary: ::name; Argument[self]; ReturnValue; taint | +| 37 | Summary: ::path; Argument[self]; ReturnValue; taint | +| 38 | Summary: ::secure; Argument[self].OptionalBarrier[cookie-secure-arg0]; ReturnValue; taint | nodes | main.rs:8:19:8:50 | ...::build(...) | semmle.label | ...::build(...) | | main.rs:8:19:8:64 | ... .secure(...) | semmle.label | ... .secure(...) | diff --git a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected index 92ecb8e09d84..d90b16185cb1 100644 --- a/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected +++ b/rust/ql/test/query-tests/security/CWE-770/UncontrolledAllocationSize.expected @@ -62,14 +62,14 @@ edges | main.rs:20:9:20:10 | l2 | main.rs:22:31:22:32 | l2 | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:23:31:23:32 | l2 | provenance | | | main.rs:20:9:20:10 | l2 | main.rs:24:38:24:39 | l2 | provenance | Sink:MaD:16 | -| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:38 | +| main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | main.rs:20:14:20:63 | ... .unwrap() | provenance | MaD:41 | | main.rs:20:14:20:63 | ... .unwrap() | main.rs:20:9:20:10 | l2 | provenance | | | main.rs:20:50:20:50 | v | main.rs:20:14:20:54 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:22:31:22:32 | l2 | main.rs:22:31:22:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | -| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:38 | +| main.rs:22:31:22:44 | l2.align_to(...) [Ok] | main.rs:22:31:22:53 | ... .unwrap() | provenance | MaD:41 | | main.rs:22:31:22:53 | ... .unwrap() | main.rs:22:31:22:53 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:23:31:23:32 | l2 | main.rs:23:31:23:44 | l2.align_to(...) [Ok] | provenance | MaD:24 | -| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:38 | +| main.rs:23:31:23:44 | l2.align_to(...) [Ok] | main.rs:23:31:23:53 | ... .unwrap() | provenance | MaD:41 | | main.rs:23:31:23:53 | ... .unwrap() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | MaD:32 | | main.rs:23:31:23:68 | ... .pad_to_align() | main.rs:23:31:23:68 | ... .pad_to_align() | provenance | Sink:MaD:15 | | main.rs:29:9:29:10 | l4 | main.rs:30:31:30:32 | l4 | provenance | Sink:MaD:15 | @@ -77,12 +77,12 @@ edges | main.rs:29:60:29:60 | v | main.rs:29:14:29:64 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | | main.rs:32:9:32:10 | l5 | main.rs:33:31:33:32 | l5 | provenance | Sink:MaD:15 | | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | main.rs:32:9:32:10 | l5 | provenance | | -| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:43 | +| main.rs:32:60:32:60 | v | main.rs:32:60:32:89 | ... * ... | provenance | MaD:38 | | main.rs:32:60:32:89 | ... * ... | main.rs:32:14:32:118 | ...::from_size_align_unchecked(...) | provenance | MaD:31 | | main.rs:35:9:35:10 | s6 | main.rs:36:60:36:61 | s6 | provenance | | | main.rs:35:14:35:54 | ... + ... | main.rs:35:9:35:10 | s6 | provenance | | -| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:42 | -| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:43 | +| main.rs:35:15:35:49 | ... * ... | main.rs:35:14:35:54 | ... + ... | provenance | MaD:37 | +| main.rs:35:49:35:49 | v | main.rs:35:15:35:49 | ... * ... | provenance | MaD:38 | | main.rs:36:9:36:10 | l6 | main.rs:37:31:37:32 | l6 | provenance | Sink:MaD:15 | | main.rs:36:9:36:10 | l6 | main.rs:39:60:39:61 | l6 | provenance | | | main.rs:36:14:36:65 | ...::from_size_align_unchecked(...) | main.rs:36:9:36:10 | l6 | provenance | | @@ -97,21 +97,21 @@ edges | main.rs:43:44:43:51 | ...: usize | main.rs:54:48:54:48 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:58:34:58:34 | v | provenance | | | main.rs:43:44:43:51 | ...: usize | main.rs:67:46:67:46 | v | provenance | | -| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:50:31:50:51 | ... .unwrap() [tuple.0] | main.rs:50:31:50:53 | ... .0 | provenance | | | main.rs:50:31:50:53 | ... .0 | main.rs:50:31:50:53 | ... .0 | provenance | Sink:MaD:15 | | main.rs:50:41:50:41 | v | main.rs:50:31:50:42 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | -| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:51:31:51:55 | ... .unwrap() [tuple.0] | main.rs:51:31:51:57 | ... .0 | provenance | | | main.rs:51:31:51:57 | ... .0 | main.rs:51:31:51:57 | ... .0 | provenance | Sink:MaD:15 | -| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:42 | +| main.rs:51:41:51:41 | v | main.rs:51:41:51:45 | ... + ... | provenance | MaD:37 | | main.rs:51:41:51:45 | ... + ... | main.rs:51:31:51:46 | l2.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | -| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:38 | +| main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | main.rs:53:31:53:58 | ... .unwrap() | provenance | MaD:41 | | main.rs:53:31:53:58 | ... .unwrap() | main.rs:53:31:53:58 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:53:48:53:48 | v | main.rs:53:31:53:49 | l2.repeat_packed(...) [Ok] | provenance | MaD:34 | -| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:38 | +| main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | main.rs:54:31:54:63 | ... .unwrap() | provenance | MaD:41 | | main.rs:54:31:54:63 | ... .unwrap() | main.rs:54:31:54:63 | ... .unwrap() | provenance | Sink:MaD:15 | -| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:43 | +| main.rs:54:48:54:48 | v | main.rs:54:48:54:53 | ... * ... | provenance | MaD:38 | | main.rs:54:48:54:53 | ... * ... | main.rs:54:31:54:54 | l2.repeat_packed(...) [Ok] | provenance | MaD:34 | | main.rs:58:9:58:20 | TuplePat [tuple.0] | main.rs:58:10:58:11 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:59:31:59:32 | k1 | provenance | Sink:MaD:15 | @@ -119,32 +119,32 @@ edges | main.rs:58:10:58:11 | k1 | main.rs:62:24:62:25 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:64:48:64:49 | k1 | provenance | | | main.rs:58:10:58:11 | k1 | main.rs:65:31:65:32 | k1 | provenance | | -| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:37 | +| main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | provenance | MaD:40 | | main.rs:58:24:58:66 | ... .expect(...) [tuple.0] | main.rs:58:9:58:20 | TuplePat [tuple.0] | provenance | | | main.rs:58:34:58:34 | v | main.rs:58:24:58:35 | l3.repeat(...) [Ok, tuple.0] | provenance | MaD:33 | | main.rs:60:9:60:20 | TuplePat [tuple.0] | main.rs:60:10:60:11 | k2 | provenance | | | main.rs:60:10:60:11 | k2 | main.rs:61:31:61:32 | k2 | provenance | Sink:MaD:15 | -| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:60:24:60:45 | ... .unwrap() [tuple.0] | main.rs:60:9:60:20 | TuplePat [tuple.0] | provenance | | | main.rs:60:34:60:35 | k1 | main.rs:60:24:60:36 | l3.extend(...) [Ok, tuple.0] | provenance | MaD:26 | | main.rs:62:9:62:20 | TuplePat [tuple.0] | main.rs:62:10:62:11 | k3 | provenance | | | main.rs:62:10:62:11 | k3 | main.rs:63:31:63:32 | k3 | provenance | Sink:MaD:15 | | main.rs:62:24:62:25 | k1 | main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | provenance | MaD:27 | -| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:38 | +| main.rs:62:24:62:36 | k1.extend(...) [Ok, tuple.0] | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | provenance | MaD:41 | | main.rs:62:24:62:45 | ... .unwrap() [tuple.0] | main.rs:62:9:62:20 | TuplePat [tuple.0] | provenance | | -| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:38 | +| main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | main.rs:64:31:64:59 | ... .unwrap() | provenance | MaD:41 | | main.rs:64:31:64:59 | ... .unwrap() | main.rs:64:31:64:59 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:64:48:64:49 | k1 | main.rs:64:31:64:50 | l3.extend_packed(...) [Ok] | provenance | MaD:28 | | main.rs:65:31:65:32 | k1 | main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | provenance | MaD:29 | -| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:38 | +| main.rs:65:31:65:50 | k1.extend_packed(...) [Ok] | main.rs:65:31:65:59 | ... .unwrap() | provenance | MaD:41 | | main.rs:65:31:65:59 | ... .unwrap() | main.rs:65:31:65:59 | ... .unwrap() | provenance | Sink:MaD:15 | | main.rs:67:9:67:10 | l4 | main.rs:68:31:68:32 | l4 | provenance | Sink:MaD:15 | -| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:38 | +| main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | main.rs:67:14:67:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:67:14:67:56 | ... .unwrap() | main.rs:67:9:67:10 | l4 | provenance | | | main.rs:67:46:67:46 | v | main.rs:67:14:67:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:86:35:86:42 | ...: usize | main.rs:87:54:87:54 | v | provenance | | | main.rs:87:9:87:14 | layout | main.rs:88:31:88:36 | layout | provenance | Sink:MaD:15 | -| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:38 | +| main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | main.rs:87:18:87:67 | ... .unwrap() | provenance | MaD:41 | | main.rs:87:18:87:67 | ... .unwrap() | main.rs:87:9:87:14 | layout | provenance | | | main.rs:87:54:87:54 | v | main.rs:87:18:87:58 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:91:38:91:45 | ...: usize | main.rs:92:47:92:47 | v | provenance | | @@ -160,31 +160,31 @@ edges | main.rs:92:9:92:10 | l1 | main.rs:111:35:111:36 | l1 | provenance | Sink:MaD:15 | | main.rs:92:9:92:10 | l1 | main.rs:146:35:146:36 | l1 | provenance | Sink:MaD:15 | | main.rs:92:9:92:10 | l1 | main.rs:177:31:177:32 | l1 | provenance | Sink:MaD:15 | -| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:38 | +| main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | main.rs:92:14:92:57 | ... .unwrap() | provenance | MaD:41 | | main.rs:92:14:92:57 | ... .unwrap() | main.rs:92:9:92:10 | l1 | provenance | | | main.rs:92:47:92:47 | v | main.rs:92:14:92:48 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:101:13:101:14 | l3 | main.rs:103:35:103:36 | l3 | provenance | Sink:MaD:15 | -| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:38 | +| main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | main.rs:101:18:101:61 | ... .unwrap() | provenance | MaD:41 | | main.rs:101:18:101:61 | ... .unwrap() | main.rs:101:13:101:14 | l3 | provenance | | | main.rs:101:51:101:51 | v | main.rs:101:18:101:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:105:33:105:33 | v | main.rs:86:35:86:42 | ...: usize | provenance | | | main.rs:145:13:145:14 | l9 | main.rs:148:35:148:36 | l9 | provenance | Sink:MaD:15 | -| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:38 | +| main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | main.rs:145:18:145:61 | ... .unwrap() | provenance | MaD:41 | | main.rs:145:18:145:61 | ... .unwrap() | main.rs:145:13:145:14 | l9 | provenance | | | main.rs:145:51:145:51 | v | main.rs:145:18:145:52 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:151:9:151:11 | l10 | main.rs:152:31:152:33 | l10 | provenance | Sink:MaD:15 | -| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:38 | +| main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | main.rs:151:15:151:78 | ... .unwrap() | provenance | MaD:41 | | main.rs:151:15:151:78 | ... .unwrap() | main.rs:151:9:151:11 | l10 | provenance | | | main.rs:151:48:151:68 | ...::min(...) | main.rs:151:15:151:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | -| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:40 | +| main.rs:151:62:151:62 | v | main.rs:151:48:151:68 | ...::min(...) | provenance | MaD:43 | | main.rs:154:9:154:11 | l11 | main.rs:155:31:155:33 | l11 | provenance | Sink:MaD:15 | -| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:38 | +| main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | main.rs:154:15:154:78 | ... .unwrap() | provenance | MaD:41 | | main.rs:154:15:154:78 | ... .unwrap() | main.rs:154:9:154:11 | l11 | provenance | | | main.rs:154:48:154:68 | ...::max(...) | main.rs:154:15:154:69 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | -| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:39 | +| main.rs:154:62:154:62 | v | main.rs:154:48:154:68 | ...::max(...) | provenance | MaD:42 | | main.rs:161:13:161:15 | l13 | main.rs:162:35:162:37 | l13 | provenance | Sink:MaD:15 | | main.rs:161:13:161:15 | l13 | main.rs:169:35:169:37 | l13 | provenance | Sink:MaD:15 | -| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:38 | +| main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | main.rs:161:19:161:68 | ... .unwrap() | provenance | MaD:41 | | main.rs:161:19:161:68 | ... .unwrap() | main.rs:161:13:161:15 | l13 | provenance | | | main.rs:161:55:161:55 | v | main.rs:161:19:161:59 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:183:29:183:36 | ...: usize | main.rs:192:46:192:46 | v | provenance | | @@ -198,7 +198,7 @@ edges | main.rs:192:9:192:10 | l2 | main.rs:208:53:208:54 | l2 | provenance | Sink:MaD:9 | | main.rs:192:9:192:10 | l2 | main.rs:210:60:210:61 | l2 | provenance | Sink:MaD:10 | | main.rs:192:9:192:10 | l2 | main.rs:213:51:213:52 | l2 | provenance | Sink:MaD:11 | -| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:38 | +| main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | main.rs:192:14:192:56 | ... .unwrap() | provenance | MaD:41 | | main.rs:192:14:192:56 | ... .unwrap() | main.rs:192:9:192:10 | l2 | provenance | | | main.rs:192:46:192:46 | v | main.rs:192:14:192:47 | ...::array::<...>(...) [Ok] | provenance | MaD:25 | | main.rs:217:27:217:34 | ...: usize | main.rs:219:26:219:26 | v | provenance | Sink:MaD:20 | @@ -214,15 +214,15 @@ edges | main.rs:283:9:283:17 | num_bytes | main.rs:285:54:285:62 | num_bytes | provenance | | | main.rs:283:21:283:30 | user_input | main.rs:283:21:283:47 | user_input.parse() [Ok] | provenance | MaD:23 | | main.rs:283:21:283:47 | user_input.parse() [Ok] | main.rs:283:21:283:48 | TryExpr | provenance | | -| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:43 | +| main.rs:283:21:283:48 | TryExpr | main.rs:283:21:283:77 | ... * ... | provenance | MaD:38 | | main.rs:283:21:283:77 | ... * ... | main.rs:283:9:283:17 | num_bytes | provenance | | | main.rs:285:9:285:14 | layout | main.rs:287:40:287:45 | layout | provenance | Sink:MaD:15 | -| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:38 | +| main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | main.rs:285:18:285:75 | ... .unwrap() | provenance | MaD:41 | | main.rs:285:18:285:75 | ... .unwrap() | main.rs:285:9:285:14 | layout | provenance | | | main.rs:285:54:285:62 | num_bytes | main.rs:285:18:285:66 | ...::from_size_align(...) [Ok] | provenance | MaD:30 | | main.rs:311:25:311:40 | ...::args(...) | main.rs:311:25:311:40 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:41 | -| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:36 | +| main.rs:311:25:311:40 | ...::args(...) [element] | main.rs:311:25:311:47 | ... .nth(...) [Some] | provenance | MaD:36 | +| main.rs:311:25:311:47 | ... .nth(...) [Some] | main.rs:311:25:311:74 | ... .unwrap_or(...) | provenance | MaD:39 | | main.rs:311:25:311:74 | ... .unwrap_or(...) | main.rs:282:24:282:41 | ...: String | provenance | | | main.rs:317:26:317:33 | ...: usize | main.rs:331:26:331:26 | a | provenance | Sink:MaD:20 | | main.rs:339:9:339:9 | v | main.rs:342:34:342:34 | v | provenance | | @@ -233,10 +233,10 @@ edges | main.rs:339:9:339:9 | v | main.rs:347:22:347:22 | v | provenance | | | main.rs:339:9:339:9 | v | main.rs:349:24:349:24 | v | provenance | | | main.rs:339:13:339:28 | ...::args(...) | main.rs:339:13:339:28 | ...::args(...) [element] | provenance | Src:MaD:22 | -| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:41 | -| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:36 | +| main.rs:339:13:339:28 | ...::args(...) [element] | main.rs:339:13:339:35 | ... .nth(...) [Some] | provenance | MaD:36 | +| main.rs:339:13:339:35 | ... .nth(...) [Some] | main.rs:339:13:339:65 | ... .unwrap_or(...) | provenance | MaD:39 | | main.rs:339:13:339:65 | ... .unwrap_or(...) | main.rs:339:13:339:82 | ... .parse() [Ok] | provenance | MaD:23 | -| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:38 | +| main.rs:339:13:339:82 | ... .parse() [Ok] | main.rs:339:13:339:91 | ... .unwrap() | provenance | MaD:41 | | main.rs:339:13:339:91 | ... .unwrap() | main.rs:339:9:339:9 | v | provenance | | | main.rs:342:34:342:34 | v | main.rs:12:36:12:43 | ...: usize | provenance | | | main.rs:343:42:343:42 | v | main.rs:43:44:43:51 | ...: usize | provenance | | @@ -281,14 +281,14 @@ models | 33 | Summary: ::repeat; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)].Field[0]; taint | | 34 | Summary: ::repeat_packed; Argument[0]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | | 35 | Summary: ::size; Argument[self].Reference; ReturnValue; taint | -| 36 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 37 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 38 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 39 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | -| 40 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | -| 41 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | -| 42 | Summary: core::ops::arith::Add::add; Argument[self,0]; ReturnValue; taint | -| 43 | Summary: core::ops::arith::Mul::mul; Argument[self,0]; ReturnValue; taint | +| 36 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 37 | Summary: ::add; Argument[self,0]; ReturnValue; taint | +| 38 | Summary: ::mul; Argument[self,0]; ReturnValue; taint | +| 39 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 40 | Summary: ::expect; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 41 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 42 | Summary: core::cmp::max; Argument[0]; ReturnValue; value | +| 43 | Summary: core::cmp::min; Argument[0]; ReturnValue; value | nodes | main.rs:12:36:12:43 | ...: usize | semmle.label | ...: usize | | main.rs:18:41:18:41 | v | semmle.label | v | diff --git a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected index 039891ffb4d6..28c66266ed89 100644 --- a/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected +++ b/rust/ql/test/query-tests/security/CWE-798/HardcodedCryptographicValue.expected @@ -102,7 +102,7 @@ models | 3 | Sink: ::new; Argument[0]; credentials-key | | 4 | Sink: ::new; Argument[1]; credentials-iv | | 5 | Sink: ::from; Argument[0].Reference; credentials-key | -| 6 | Sink: crypto_common::KeyInit::new_from_slice; Argument[0]; credentials-key | +| 6 | Sink: ::new_from_slice; Argument[0]; credentials-key | | 7 | Source: core::mem::zeroed; ReturnValue.Element; constant-source | | 8 | Summary: ::from; Argument[0].Field[alloc::borrow::Cow::Owned(0)]; ReturnValue; value | | 9 | Summary: ::from; Argument[0].Field[alloc::bstr::ByteString(0)]; ReturnValue; value | diff --git a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected index 53b03f7ed2f1..2a74d0f58387 100644 --- a/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected +++ b/rust/ql/test/query-tests/security/CWE-918/RequestForgery.expected @@ -45,7 +45,7 @@ edges | request_forgery_tests.rs:68:42:68:42 | a | request_forgery_tests.rs:68:41:68:42 | &a [&ref] | provenance | | models | 1 | Sink: reqwest::get; Argument[0]; request-url | -| 2 | Source: warp::filter::Filter::and_then; Argument[0].Parameter[0..7]; remote | +| 2 | Source: ::and_then; Argument[0].Parameter[0..7]; remote | | 3 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | | 4 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes From 516815c564baa5527f49ecf7b37ef858c0bb24f1 Mon Sep 17 00:00:00 2001 From: Simon Friis Vindum Date: Thu, 27 Aug 2026 15:21:30 +0200 Subject: [PATCH 170/181] Rust: Reuse Cargo target dir when running QL tests --- rust/codeql-extractor.yml | 3 ++- rust/extractor/src/config.rs | 30 ++++++++++++++++++++++------- rust/extractor/src/qltest.rs | 37 ++++++++++++++++++++++++------------ 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/rust/codeql-extractor.yml b/rust/codeql-extractor.yml index 4556e29ca9d3..819793ec26cc 100644 --- a/rust/codeql-extractor.yml +++ b/rust/codeql-extractor.yml @@ -36,7 +36,8 @@ options: This value is an optional path to use as `CARGO_TARGET_DIR` for the internal cargo commands the extractor uses. Pointing it to a persistent directory may reduce execution time of consecutive extractor runs. By default, a new scratch - directory is used for each run. + directory is used for each extraction, while qltests use the test's `target` + directory so artifacts can be reused across runs. type: string cargo_target: title: Target architecture diff --git a/rust/extractor/src/config.rs b/rust/extractor/src/config.rs index bd615c083bc2..9bf7487012df 100644 --- a/rust/extractor/src/config.rs +++ b/rust/extractor/src/config.rs @@ -76,6 +76,21 @@ pub struct Config { } impl Config { + /// Returns the directory where Cargo should place its build cache. + pub(crate) fn cargo_target_dir(&self) -> PathBuf { + self.cargo_target_dir.clone().unwrap_or_else(|| { + // When the `target` directory is not explicitly set, we default to + // the relative `target` directory (cargo's default) when running + // qltests. This directory is preserved, so subsequent builds + // benefit from the cache. + if self.qltest { + PathBuf::from("target") + } else { + self.scratch_dir.join("target") + } + }) + } + pub fn extract() -> anyhow::Result { let args = argfile::expand_args(argfile::parse_fromfile, argfile::PREFIX) .context("expanding parameter files")?; @@ -108,11 +123,17 @@ impl Config { figment.extract().context("loading configuration") } - fn get_extra_env(&self) -> FxHashMap> { + pub(crate) fn get_extra_env(&self) -> FxHashMap> { let mut extra_env = FxHashMap::default(); // RUSTUP_AUTO_INSTALL is set to 0 by rust-analyzer (https://github.com/rust-lang/rust-analyzer/issues/20719), // but we do want to allow rustup to auto-install toolchains if needed, so we set it to 1 here. extra_env.insert("RUSTUP_AUTO_INSTALL".to_owned(), Some("1".to_owned())); + if self.qltest_cargo_check { + // When running qltests we add this flag to match the `cargo check` + // invocation in the `cargo_check` function. This is necessary as + // Cargo does not re-use the cache when `RUSTFLAGS` differ. + extra_env.insert("RUSTFLAGS".to_owned(), Some("-Awarnings".to_owned())); + } extra_env.extend(self.cargo_extra_env.clone()); extra_env } @@ -182,12 +203,7 @@ impl Config { .iter() .map(|p| join_path_buf(dir, p)) .collect(), - target_dir_config: Utf8PathBuf::from_path_buf( - self.cargo_target_dir - .clone() - .unwrap_or_else(|| self.scratch_dir.join("target")), - ) - .map_or( + target_dir_config: Utf8PathBuf::from_path_buf(self.cargo_target_dir()).map_or( TargetDirectoryConfig::None, TargetDirectoryConfig::Directory, ), diff --git a/rust/extractor/src/qltest.rs b/rust/extractor/src/qltest.rs index bd9849cbb09f..afda1bc050e4 100644 --- a/rust/extractor/src/qltest.rs +++ b/rust/extractor/src/qltest.rs @@ -90,6 +90,29 @@ fn set_sources(config: &mut Config) -> anyhow::Result<()> { Ok(()) } +fn cargo_check(config: &Config) -> anyhow::Result<()> { + let mut command = Command::new("cargo"); + command.env("CARGO_TARGET_DIR", config.cargo_target_dir()); + // Pass the extra environment variables to the initial `cargo check`. + for (key, value) in config.get_extra_env() { + match value { + Some(value) => command.env(key, value), + None => command.env_remove(key), + }; + } + let status = command + .arg("check") + .arg("-q") + .status() + .context("spawning cargo check")?; + if status.success() { + info!("cargo check successful"); + Ok(()) + } else { + anyhow::bail!("requested cargo check failed"); + } +} + pub(crate) fn prepare(config: &mut Config) -> anyhow::Result<()> { dump_lib()?; set_sources(config)?; @@ -98,17 +121,7 @@ pub(crate) fn prepare(config: &mut Config) -> anyhow::Result<()> { dump_nightly_toolchain()?; } if config.qltest_cargo_check { - let status = Command::new("cargo") - .env("RUSTFLAGS", "-Awarnings") - .arg("check") - .arg("-q") - .status() - .context("spawning cargo check")?; - if status.success() { - info!("cargo check successful"); - } else { - anyhow::bail!("requested cargo check failed"); - } - }; + cargo_check(config)?; + } Ok(()) } From 048314d40306708897ee97de90211a48c95215bb Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Fri, 28 Aug 2026 13:55:54 +0200 Subject: [PATCH 171/181] Rust: Update command injection expected output Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../CWE-078/CommandInjection.expected | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected index 3b9da31661a4..e3d423933f7e 100644 --- a/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected +++ b/rust/ql/test/query-tests/security/CWE-078/CommandInjection.expected @@ -17,16 +17,16 @@ edges | main.rs:4:9:4:18 | arg_string | main.rs:27:18:27:27 | arg_string | provenance | | | main.rs:4:9:4:18 | arg_string | main.rs:40:14:40:23 | arg_string | provenance | | | main.rs:4:22:4:37 | ...::args(...) | main.rs:4:22:4:37 | ...::args(...) [element] | provenance | Src:MaD:7 | -| main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:15 | -| main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:9 | +| main.rs:4:22:4:37 | ...::args(...) [element] | main.rs:4:22:4:44 | ... .nth(...) [Some] | provenance | MaD:9 | +| main.rs:4:22:4:44 | ... .nth(...) [Some] | main.rs:4:22:4:74 | ... .unwrap_or(...) | provenance | MaD:10 | | main.rs:4:22:4:74 | ... .unwrap_or(...) | main.rs:4:9:4:18 | arg_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:34:14:34:26 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:47:23:47:35 | remote_string | provenance | | | main.rs:5:9:5:21 | remote_string | main.rs:52:40:52:69 | MacroExpr | provenance | | | main.rs:5:25:5:69 | ...::get(...) | main.rs:5:25:5:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:10 | -| main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:12 | -| main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:11 | +| main.rs:5:25:5:69 | ...::get(...) [Ok] | main.rs:5:25:6:17 | ... .unwrap() | provenance | MaD:11 | +| main.rs:5:25:6:17 | ... .unwrap() | main.rs:5:25:7:15 | ... .text() [Ok] | provenance | MaD:13 | +| main.rs:5:25:7:15 | ... .text() [Ok] | main.rs:5:25:8:38 | ... .unwrap_or(...) | provenance | MaD:12 | | main.rs:5:25:8:38 | ... .unwrap_or(...) | main.rs:5:9:5:21 | remote_string | provenance | | | main.rs:27:18:27:27 | arg_string | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:27:18:27:36 | arg_string.as_str() [&ref] | main.rs:27:18:27:36 | arg_string.as_str() | provenance | Sink:MaD:3 | @@ -42,16 +42,16 @@ edges | main.rs:52:9:52:28 | concatenated_command | main.rs:53:18:53:37 | concatenated_command | provenance | | | main.rs:52:40:52:69 | ...::format(...) | main.rs:52:40:52:69 | { ... } | provenance | | | main.rs:52:40:52:69 | ...::must_use(...) | main.rs:52:9:52:28 | concatenated_command | provenance | | -| main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:13 | -| main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:14 | +| main.rs:52:40:52:69 | MacroExpr | main.rs:52:40:52:69 | ...::format(...) | provenance | MaD:14 | +| main.rs:52:40:52:69 | { ... } | main.rs:52:40:52:69 | ...::must_use(...) | provenance | MaD:15 | | main.rs:53:18:53:37 | concatenated_command | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | provenance | MaD:8 | | main.rs:53:18:53:46 | concatenated_command.as_str() [&ref] | main.rs:53:18:53:46 | concatenated_command.as_str() | provenance | Sink:MaD:3 | | main.rs:59:9:59:21 | remote_string | main.rs:65:48:65:60 | remote_string | provenance | | | main.rs:59:9:59:21 | remote_string | main.rs:73:14:73:26 | remote_string | provenance | | | main.rs:59:25:59:69 | ...::get(...) | main.rs:59:25:59:69 | ...::get(...) [Ok] | provenance | Src:MaD:6 | -| main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:10 | -| main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:12 | -| main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:11 | +| main.rs:59:25:59:69 | ...::get(...) [Ok] | main.rs:59:25:60:17 | ... .unwrap() | provenance | MaD:11 | +| main.rs:59:25:60:17 | ... .unwrap() | main.rs:59:25:61:15 | ... .text() [Ok] | provenance | MaD:13 | +| main.rs:59:25:61:15 | ... .text() [Ok] | main.rs:59:25:62:38 | ... .unwrap_or(...) | provenance | MaD:12 | | main.rs:59:25:62:38 | ... .unwrap_or(...) | main.rs:59:9:59:21 | remote_string | provenance | | | main.rs:65:48:65:60 | remote_string | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:65:48:65:69 | remote_string.as_str() [&ref] | main.rs:65:48:65:69 | remote_string.as_str() | provenance | Sink:MaD:5 | @@ -68,8 +68,8 @@ edges | main.rs:138:9:138:18 | arg_string | main.rs:143:40:143:49 | arg_string | provenance | | | main.rs:138:9:138:18 | arg_string | main.rs:144:31:144:40 | arg_string | provenance | | | main.rs:138:22:138:37 | ...::args(...) | main.rs:138:22:138:37 | ...::args(...) [element] | provenance | Src:MaD:7 | -| main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:15 | -| main.rs:138:22:138:44 | ... .nth(...) [Some] | main.rs:138:22:138:74 | ... .unwrap_or(...) | provenance | MaD:9 | +| main.rs:138:22:138:37 | ...::args(...) [element] | main.rs:138:22:138:44 | ... .nth(...) [Some] | provenance | MaD:9 | +| main.rs:138:22:138:44 | ... .nth(...) [Some] | main.rs:138:22:138:74 | ... .unwrap_or(...) | provenance | MaD:10 | | main.rs:138:22:138:74 | ... .unwrap_or(...) | main.rs:138:9:138:18 | arg_string | provenance | | | main.rs:142:39:142:48 | arg_string | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | provenance | MaD:8 | | main.rs:142:39:142:57 | arg_string.as_str() [&ref] | main.rs:82:27:82:42 | ...: ... [&ref] | provenance | | @@ -86,13 +86,13 @@ models | 6 | Source: reqwest::blocking::get; ReturnValue.Field[core::result::Result::Ok(0)]; remote | | 7 | Source: std::env::args; ReturnValue.Element; commandargs | | 8 | Summary: ::as_str; Argument[self].Reference; ReturnValue.Reference; taint | -| 9 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | -| 10 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 11 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | -| 12 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | -| 13 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | -| 14 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | -| 15 | Summary: core::iter::traits::iterator::Iterator::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 9 | Summary: ::nth; Argument[self].Reference.Element; ReturnValue.Field[core::option::Option::Some(0)]; value | +| 10 | Summary: ::unwrap_or; Argument[self].Field[core::option::Option::Some(0)]; ReturnValue; value | +| 11 | Summary: ::unwrap; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 12 | Summary: ::unwrap_or; Argument[self].Field[core::result::Result::Ok(0)]; ReturnValue; value | +| 13 | Summary: ::text; Argument[self]; ReturnValue.Field[core::result::Result::Ok(0)]; taint | +| 14 | Summary: alloc::fmt::format; Argument[0]; ReturnValue; taint | +| 15 | Summary: core::hint::must_use; Argument[0]; ReturnValue; value | nodes | main.rs:4:9:4:18 | arg_string | semmle.label | arg_string | | main.rs:4:22:4:37 | ...::args(...) | semmle.label | ...::args(...) | From f0de9c3913ba381d56832ddf3f083283d7ac3695 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 28 Aug 2026 13:39:54 +0100 Subject: [PATCH 172/181] C++: Add a crazy false positive from a Microsoft internal issue. --- .../UnsafeArrayForDaysOfYear.expected | 1 + .../Leap Year/UnsafeArrayForDaysOfYear/test.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected index 37dd8b1ae7d0..b4b42dcf499d 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected @@ -1,3 +1,4 @@ | test.cpp:17:6:17:10 | items | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | | test.cpp:25:15:25:26 | new[] | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | | test.cpp:52:20:52:23 | call to vector | There is a std::vector allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | +| test.cpp:78:11:78:29 | __PRETTY_FUNCTION__ | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp index f76167c1893b..1759215eb55f 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp +++ b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp @@ -68,3 +68,12 @@ void VectorOfDays_FalsePositive(int dayOfYear, int x) items[dayOfYear - 1] = x; } + +void f_______________________________________________________this_name_must_be_exactly_357_chars__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________() { + // Using this magic compiler variable results in a `const char` array being + // initialized with the function name which (including `void`, a space, + // and `()`). in this case, this adds up to exactly 364 characters. + // The initializer for `__PRETTY_FUNCTION__` thus initializes an array of + // length 365 (because the null-terminator adds another character). + auto x = __PRETTY_FUNCTION__; // $ SPURIOUS: Alert +} \ No newline at end of file From fcfdf8103b922bef213516e2f1951a6df597d2fb Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 28 Aug 2026 13:41:02 +0100 Subject: [PATCH 173/181] C++: Exclude compiler generated variables from a case in 'cpp/leap-year/unsafe-array-for-days-of-the-year'. --- cpp/ql/src/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear.ql | 1 + .../UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected | 1 - .../Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/src/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear.ql b/cpp/ql/src/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear.ql index b27db937b577..e6b1ccaa6687 100644 --- a/cpp/ql/src/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear.ql +++ b/cpp/ql/src/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear.ql @@ -26,6 +26,7 @@ where or exists(Variable var | var = element and + not var.isCompilerGenerated() and var.getType() instanceof LeapYearUnsafeDaysOfTheYearArrayType and allocType = "an array allocation" ) diff --git a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected index b4b42dcf499d..37dd8b1ae7d0 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/UnsafeArrayForDaysOfYear.expected @@ -1,4 +1,3 @@ | test.cpp:17:6:17:10 | items | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | | test.cpp:25:15:25:26 | new[] | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | | test.cpp:52:20:52:23 | call to vector | There is a std::vector allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | -| test.cpp:78:11:78:29 | __PRETTY_FUNCTION__ | There is an array allocation with a hard-coded set of 365 elements, which may indicate the number of days in a year without considering leap year scenarios. | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp index 1759215eb55f..b772c4cc3526 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp +++ b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp @@ -75,5 +75,5 @@ void f_______________________________________________________this_name_must_be_e // and `()`). in this case, this adds up to exactly 364 characters. // The initializer for `__PRETTY_FUNCTION__` thus initializes an array of // length 365 (because the null-terminator adds another character). - auto x = __PRETTY_FUNCTION__; // $ SPURIOUS: Alert + auto x = __PRETTY_FUNCTION__; // clean } \ No newline at end of file From 2fe9ff3a67d1bf5b9851f492ef76e739b95db7f7 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 28 Aug 2026 13:45:54 +0100 Subject: [PATCH 174/181] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp index b772c4cc3526..3994fce4ee88 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp +++ b/cpp/ql/test/query-tests/Likely Bugs/Leap Year/UnsafeArrayForDaysOfYear/test.cpp @@ -71,8 +71,8 @@ void VectorOfDays_FalsePositive(int dayOfYear, int x) void f_______________________________________________________this_name_must_be_exactly_357_chars__________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________() { // Using this magic compiler variable results in a `const char` array being - // initialized with the function name which (including `void`, a space, - // and `()`). in this case, this adds up to exactly 364 characters. + // initialized with the function signature. Including `void`, a space, and + // `()`, the signature adds up to exactly 364 characters in this case. // The initializer for `__PRETTY_FUNCTION__` thus initializes an array of // length 365 (because the null-terminator adds another character). auto x = __PRETTY_FUNCTION__; // clean From 416b3ee158e535467072b0068c1dbd50627a9615 Mon Sep 17 00:00:00 2001 From: Mathias Vorreiter Pedersen Date: Fri, 28 Aug 2026 13:49:19 +0100 Subject: [PATCH 175/181] C++: Add an amazing change note. --- .../src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md diff --git a/cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md b/cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md new file mode 100644 index 000000000000..4ba04f0de358 --- /dev/null +++ b/cpp/ql/src/change-notes/2026-08-28-leap-year-unsafe-array-fp.md @@ -0,0 +1,4 @@ +--- +category: minorAnalysis +--- +* The `cpp/leap-year/unsafe-array-for-days-of-the-year` query ("Unsafe array for days of the year") no longer reports an alert on the `__PRETTY_FUNCTION__` variable (and related variables) when the enclosing function has a signature that is exactly 364 characters. \ No newline at end of file From 001729245b8d1c2ab6edd560deb3eb03d02a9935 Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 28 Aug 2026 16:13:12 +0200 Subject: [PATCH 176/181] Docs: remove blank line between supported-platform footnotes Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/codeql/reusables/supported-platforms.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/codeql/reusables/supported-platforms.rst b/docs/codeql/reusables/supported-platforms.rst index 8a7f31849b4f..2944d8e6cc0a 100644 --- a/docs/codeql/reusables/supported-platforms.rst +++ b/docs/codeql/reusables/supported-platforms.rst @@ -19,5 +19,4 @@ .. container:: footnote-group .. [1] Support for Linux on arm64 is currently in beta. - .. [2] On Apple Silicon, building your code during analysis requires Rosetta 2; analyzing an interpreted language or using build mode ``none`` runs natively. From c4c66676e82727a9ba5e0323a88f2965676beb7a Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Fri, 28 Aug 2026 17:03:31 +0200 Subject: [PATCH 177/181] Docs: keep beta marker on Apple Silicon Restore the "currently in beta" marker on the Apple Silicon footnote while keeping the Rosetta 2 guidance, so the note now states both the beta status and when Rosetta 2 is required. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/codeql/reusables/supported-platforms.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/codeql/reusables/supported-platforms.rst b/docs/codeql/reusables/supported-platforms.rst index 2944d8e6cc0a..c12b89fc37e6 100644 --- a/docs/codeql/reusables/supported-platforms.rst +++ b/docs/codeql/reusables/supported-platforms.rst @@ -19,4 +19,4 @@ .. container:: footnote-group .. [1] Support for Linux on arm64 is currently in beta. - .. [2] On Apple Silicon, building your code during analysis requires Rosetta 2; analyzing an interpreted language or using build mode ``none`` runs natively. + .. [2] Support for Apple Silicon is currently in beta. Building your code during analysis requires Rosetta 2; analyzing an interpreted language or using build mode ``none`` runs natively. From 4796ff463e3dd83b535b26c7c8797721a5fa62e1 Mon Sep 17 00:00:00 2001 From: AkshayK Date: Sun, 30 Aug 2026 16:15:50 -0400 Subject: [PATCH 178/181] cpp: address review feedback on libpq SQL-injection sinks Trim the model-file comment and change note to house style, drop the redundant test header comment, and regenerate the expected results for the shifted line numbers. --- .../2026-08-27-libpq-sql-sinks.md | 2 +- cpp/ql/lib/ext/Postgres.model.yml | 8 ++-- .../CWE-089/SqlTainted/SqlTainted.expected | 38 +++++++++---------- .../CWE/CWE-089/SqlTainted/test_libpq.c | 3 -- 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md b/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md index 94899fdafafa..64cba8096173 100644 --- a/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md +++ b/cpp/ql/lib/change-notes/2026-08-27-libpq-sql-sinks.md @@ -1,4 +1,4 @@ --- category: minorAnalysis --- -* Added the PostgreSQL libpq query-execution functions (`PQexec`, `PQexecParams`, `PQprepare`, and their asynchronous `PQsendQuery`/`PQsendQueryParams`/`PQsendPrepare` counterparts) as `sql-injection` sinks, so the "Uncontrolled data used in SQL query" query flags tainted data reaching their command/query arguments. +* Added the PostgreSQL libpq (asynchronous) query-execution functions `PQexec`, `PQexecParams`, `PQprepare`, `PQsendQuery`, `PQsendQueryParams`, `PQsendPrepare` as `sql-injection` sinks. diff --git a/cpp/ql/lib/ext/Postgres.model.yml b/cpp/ql/lib/ext/Postgres.model.yml index 958522e09cbe..5c977ebc5756 100644 --- a/cpp/ql/lib/ext/Postgres.model.yml +++ b/cpp/ql/lib/ext/Postgres.model.yml @@ -4,10 +4,10 @@ extensions: pack: codeql/cpp-all extensible: sinkModel data: # namespace, type, subtypes, name, signature, ext, input, kind, provenance - # Functions that take a raw SQL command string. The `*Params`/`*Prepare` forms still - # interpret their command/query text as SQL, so injection into that text is a sink even - # though the parameter *values* are passed separately. The `*Prepared` forms take a - # prepared-statement name rather than SQL text and are therefore not modeled here. + # The `*Params`/`*Prepare` functions interpret their command/query text as SQL, + # so injection into that text is a sink even though the parameter values are + # passed separately. The `*Prepared` functions take a prepared-statement name + # rather than SQL text and are therefore not modeled here. - ["", "", False, "PQexec", "", "", "Argument[*1]", "sql-injection", "manual"] - ["", "", False, "PQexecParams", "", "", "Argument[*1]", "sql-injection", "manual"] - ["", "", False, "PQprepare", "", "", "Argument[*2]", "sql-injection", "manual"] diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected index 5dedd13a12bd..1f8441edcd61 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/SqlTainted.expected @@ -6,12 +6,12 @@ | test.c:106:24:106:29 | query1 | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | | test.c:107:28:107:33 | query1 | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | This argument to a SQL query function is derived from $@. | test.c:101:8:101:16 | gets output argument | user input (string read by gets) | | test.cpp:43:27:43:33 | *access to array | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | This argument to a SQL query function is derived from $@ and then passed to pqxx::work::exec1((unnamed parameter 0)). | test.cpp:39:27:39:30 | **argv | user input (a command-line argument) | -| test_libpq.c:29:16:29:24 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:29:16:29:24 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | -| test_libpq.c:30:22:30:30 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:30:22:30:30 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | -| test_libpq.c:31:27:31:35 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:31:27:31:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | -| test_libpq.c:32:21:32:29 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:32:21:32:29 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | -| test_libpq.c:33:27:33:35 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:33:27:33:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | -| test_libpq.c:34:31:34:39 | userInput | test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:34:31:34:39 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:26:8:26:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:26:16:26:24 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:26:16:26:24 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:27:22:27:30 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:27:22:27:30 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:28:27:28:35 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:28:27:28:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:29:21:29:29 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:29:21:29:29 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:30:27:30:35 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:30:27:30:35 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | +| test_libpq.c:31:31:31:39 | userInput | test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:31:31:31:39 | userInput | This argument to a SQL query function is derived from $@. | test_libpq.c:23:8:23:16 | gets output argument | user input (string read by gets) | edges | test.c:14:27:14:30 | **argv | test.c:15:20:15:26 | *access to array | provenance | | | test.c:15:20:15:26 | *access to array | test.c:21:18:21:23 | *query1 | provenance | TaintFunction | @@ -26,12 +26,12 @@ edges | test.c:101:8:101:16 | gets output argument | test.c:106:24:106:29 | query1 | provenance | TaintFunction Sink:MaD:2 | | test.c:101:8:101:16 | gets output argument | test.c:107:28:107:33 | query1 | provenance | TaintFunction Sink:MaD:1 | | test.cpp:39:27:39:30 | **argv | test.cpp:43:27:43:33 | *access to array | provenance | | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:29:16:29:24 | userInput | provenance | Sink:MaD:3 | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:30:22:30:30 | userInput | provenance | Sink:MaD:4 | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:31:27:31:35 | userInput | provenance | Sink:MaD:5 | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:32:21:32:29 | userInput | provenance | Sink:MaD:7 | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:33:27:33:35 | userInput | provenance | Sink:MaD:8 | -| test_libpq.c:26:8:26:16 | gets output argument | test_libpq.c:34:31:34:39 | userInput | provenance | Sink:MaD:6 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:26:16:26:24 | userInput | provenance | Sink:MaD:3 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:27:22:27:30 | userInput | provenance | Sink:MaD:4 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:28:27:28:35 | userInput | provenance | Sink:MaD:5 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:29:21:29:29 | userInput | provenance | Sink:MaD:7 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:30:27:30:35 | userInput | provenance | Sink:MaD:8 | +| test_libpq.c:23:8:23:16 | gets output argument | test_libpq.c:31:31:31:39 | userInput | provenance | Sink:MaD:6 | models | 1 | Sink: ; ; false; OCIStmtPrepare2; ; ; Argument[*3]; sql-injection; manual | | 2 | Sink: ; ; false; OCIStmtPrepare; ; ; Argument[*2]; sql-injection; manual | @@ -59,11 +59,11 @@ nodes | test.c:107:28:107:33 | query1 | semmle.label | query1 | | test.cpp:39:27:39:30 | **argv | semmle.label | **argv | | test.cpp:43:27:43:33 | *access to array | semmle.label | *access to array | -| test_libpq.c:26:8:26:16 | gets output argument | semmle.label | gets output argument | -| test_libpq.c:29:16:29:24 | userInput | semmle.label | userInput | -| test_libpq.c:30:22:30:30 | userInput | semmle.label | userInput | -| test_libpq.c:31:27:31:35 | userInput | semmle.label | userInput | -| test_libpq.c:32:21:32:29 | userInput | semmle.label | userInput | -| test_libpq.c:33:27:33:35 | userInput | semmle.label | userInput | -| test_libpq.c:34:31:34:39 | userInput | semmle.label | userInput | +| test_libpq.c:23:8:23:16 | gets output argument | semmle.label | gets output argument | +| test_libpq.c:26:16:26:24 | userInput | semmle.label | userInput | +| test_libpq.c:27:22:27:30 | userInput | semmle.label | userInput | +| test_libpq.c:28:27:28:35 | userInput | semmle.label | userInput | +| test_libpq.c:29:21:29:29 | userInput | semmle.label | userInput | +| test_libpq.c:30:27:30:35 | userInput | semmle.label | userInput | +| test_libpq.c:31:31:31:39 | userInput | semmle.label | userInput | subpaths diff --git a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c index 4fc26907b136..85ebe943ce62 100644 --- a/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c +++ b/cpp/ql/test/query-tests/Security/CWE/CWE-089/SqlTainted/test_libpq.c @@ -1,6 +1,3 @@ -// Test case for the PostgreSQL libpq SQL-injection sinks modeled in Postgres.model.yml. -// Associated with CWE-089: SQL injection. - typedef unsigned long size_t; typedef unsigned int Oid; typedef struct pg_conn PGconn; From a7186e559a734dffbaf9a99202fb08f9902a15bc Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 31 Aug 2026 09:15:07 +0200 Subject: [PATCH 179/181] Rust: Fix model missed by Copilot --- .../dataflow/models/models.expected | 130 ++++++++++-------- .../dataflow/models/models.ext.yml | 2 +- 2 files changed, 74 insertions(+), 58 deletions(-) diff --git a/rust/ql/test/library-tests/dataflow/models/models.expected b/rust/ql/test/library-tests/dataflow/models/models.expected index 15e5d5f268d0..e9f7bd86efd8 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.expected +++ b/rust/ql/test/library-tests/dataflow/models/models.expected @@ -21,23 +21,24 @@ models | 20 | Summary: ::max; Argument[self,0]; ReturnValue; value | | 21 | Summary: ::lt; Argument[self].Reference; ReturnValue; taint | | 22 | Summary: ::index; Argument[self].Reference.Element; ReturnValue.Reference; value | -| 23 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | -| 24 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | -| 25 | Summary: main::coerce; Argument[0]; ReturnValue; taint | -| 26 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | -| 27 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | -| 28 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | -| 29 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | -| 30 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | -| 31 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | -| 32 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | -| 33 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | -| 34 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | -| 35 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | -| 36 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | -| 37 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | -| 38 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | -| 39 | Summary: main::snd; Argument[1]; ReturnValue; value | +| 23 | Summary: ::flow_through2; Argument[0]; ReturnValue; value | +| 24 | Summary: main::apply; Argument[0]; Argument[1].Parameter[0]; value | +| 25 | Summary: main::apply; Argument[1].ReturnValue; ReturnValue; value | +| 26 | Summary: main::coerce; Argument[0]; ReturnValue; taint | +| 27 | Summary: main::external_file::generated_summary; Argument[0]; ReturnValue; value | +| 28 | Summary: main::external_file::neutral_manual_summary; Argument[0]; ReturnValue; value | +| 29 | Summary: main::get_array_element; Argument[0].Element; ReturnValue; value | +| 30 | Summary: main::get_async_number; Argument[0]; ReturnValue.Future; value | +| 31 | Summary: main::get_struct_field; Argument[0].Field[main::MyStruct::field1]; ReturnValue; value | +| 32 | Summary: main::get_tuple_element; Argument[0].Field[0]; ReturnValue; value | +| 33 | Summary: main::get_var_field; Argument[0].Field[main::MyFieldEnum::C::field_c]; ReturnValue; value | +| 34 | Summary: main::get_var_pos; Argument[0].Field[main::MyPosEnum::A(0)]; ReturnValue; value | +| 35 | Summary: main::set_array_element; Argument[0]; ReturnValue.Element; value | +| 36 | Summary: main::set_struct_field; Argument[0]; ReturnValue.Field[main::MyStruct::field2]; value | +| 37 | Summary: main::set_tuple_element; Argument[0]; ReturnValue.Field[1]; value | +| 38 | Summary: main::set_var_field; Argument[0]; ReturnValue.Field[main::MyFieldEnum::D::field_d]; value | +| 39 | Summary: main::set_var_pos; Argument[0]; ReturnValue.Field[main::MyPosEnum::B(0)]; value | +| 40 | Summary: main::snd; Argument[1]; ReturnValue; value | edges | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | | main.rs:15:9:15:9 | s | main.rs:16:19:16:19 | s | provenance | | @@ -47,13 +48,13 @@ edges | main.rs:16:19:16:19 | s | main.rs:16:10:16:20 | identity(...) | provenance | QL | | main.rs:25:9:25:9 | s | main.rs:26:17:26:17 | s | provenance | | | main.rs:25:13:25:22 | source(...) | main.rs:25:9:25:9 | s | provenance | | -| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:25 | +| main.rs:26:17:26:17 | s | main.rs:26:10:26:18 | coerce(...) | provenance | MaD:26 | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:9:41:10 | s1 | main.rs:42:17:42:18 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | | main.rs:41:14:41:23 | source(...) | main.rs:41:9:41:10 | s1 | provenance | | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | -| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:39 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | +| main.rs:42:17:42:18 | s1 | main.rs:42:10:42:19 | snd(...) | provenance | MaD:40 | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:9:54:9 | s | main.rs:55:27:55:27 | s | provenance | | | main.rs:54:13:54:21 | source(...) | main.rs:54:9:54:9 | s | provenance | | @@ -64,8 +65,8 @@ edges | main.rs:55:14:55:28 | ...::A(...) [A] | main.rs:55:9:55:10 | e1 [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | | main.rs:55:27:55:27 | s | main.rs:55:14:55:28 | ...::A(...) [A] | provenance | | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | -| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:33 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | +| main.rs:56:22:56:23 | e1 [A] | main.rs:56:10:56:24 | get_var_pos(...) | provenance | MaD:34 | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:9:67:9 | s | main.rs:68:26:68:26 | s | provenance | | | main.rs:67:13:67:21 | source(...) | main.rs:67:9:67:9 | s | provenance | | @@ -74,8 +75,8 @@ edges | main.rs:68:9:68:10 | e1 [B] | main.rs:69:11:69:12 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | | main.rs:68:14:68:27 | set_var_pos(...) [B] | main.rs:68:9:68:10 | e1 [B] | provenance | | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | -| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:38 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | +| main.rs:68:26:68:26 | s | main.rs:68:14:68:27 | set_var_pos(...) [B] | provenance | MaD:39 | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:69:11:69:12 | e1 [B] | main.rs:71:9:71:23 | ...::B(...) [B] | provenance | | | main.rs:71:9:71:23 | ...::B(...) [B] | main.rs:71:22:71:22 | i | provenance | | @@ -92,8 +93,8 @@ edges | main.rs:88:14:88:42 | ...::C {...} [C] | main.rs:88:9:88:10 | e1 [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | | main.rs:88:40:88:40 | s | main.rs:88:14:88:42 | ...::C {...} [C] | provenance | | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | -| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:32 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | +| main.rs:89:24:89:25 | e1 [C] | main.rs:89:10:89:26 | get_var_field(...) | provenance | MaD:33 | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:9:100:9 | s | main.rs:101:28:101:28 | s | provenance | | | main.rs:100:13:100:21 | source(...) | main.rs:100:9:100:9 | s | provenance | | @@ -102,8 +103,8 @@ edges | main.rs:101:9:101:10 | e1 [D] | main.rs:102:11:102:12 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | | main.rs:101:14:101:29 | set_var_field(...) [D] | main.rs:101:9:101:10 | e1 [D] | provenance | | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | -| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:37 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | +| main.rs:101:28:101:28 | s | main.rs:101:14:101:29 | set_var_field(...) [D] | provenance | MaD:38 | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:102:11:102:12 | e1 [D] | main.rs:104:9:104:37 | ...::D {...} [D] | provenance | | | main.rs:104:9:104:37 | ...::D {...} [D] | main.rs:104:35:104:35 | i | provenance | | @@ -120,8 +121,8 @@ edges | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | main.rs:121:9:121:17 | my_struct [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | | main.rs:122:17:122:17 | s | main.rs:121:21:124:5 | MyStruct {...} [MyStruct.field1] | provenance | | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | -| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:30 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | +| main.rs:125:27:125:35 | my_struct [MyStruct.field1] | main.rs:125:10:125:36 | get_struct_field(...) | provenance | MaD:31 | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:9:142:9 | s | main.rs:143:38:143:38 | s | provenance | | | main.rs:142:13:142:21 | source(...) | main.rs:142:9:142:9 | s | provenance | | @@ -130,16 +131,16 @@ edges | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | main.rs:143:9:143:17 | my_struct [MyStruct.field2] | provenance | | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | -| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:35 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | +| main.rs:143:38:143:38 | s | main.rs:143:21:143:39 | set_struct_field(...) [MyStruct.field2] | provenance | MaD:36 | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:145:10:145:18 | my_struct [MyStruct.field2] | main.rs:145:10:145:25 | my_struct.field2 | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:9:154:9 | s | main.rs:155:29:155:29 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | | main.rs:154:13:154:21 | source(...) | main.rs:154:9:154:9 | s | provenance | | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | -| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:28 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | +| main.rs:155:28:155:30 | [...] [element] | main.rs:155:10:155:31 | get_array_element(...) | provenance | MaD:29 | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:155:29:155:29 | s | main.rs:155:28:155:30 | [...] [element] | provenance | | | main.rs:164:9:164:9 | s | main.rs:165:33:165:33 | s | provenance | | @@ -150,8 +151,8 @@ edges | main.rs:165:9:165:11 | arr [element] | main.rs:166:10:166:12 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | | main.rs:165:15:165:34 | set_array_element(...) [element] | main.rs:165:9:165:11 | arr [element] | provenance | | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | -| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:34 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | +| main.rs:165:33:165:33 | s | main.rs:165:15:165:34 | set_array_element(...) [element] | provenance | MaD:35 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | | main.rs:166:10:166:12 | arr [element] | main.rs:166:10:166:15 | arr[0] | provenance | MaD:22 | | main.rs:175:9:175:9 | s | main.rs:176:14:176:14 | s | provenance | | @@ -164,8 +165,8 @@ edges | main.rs:176:13:176:18 | TupleExpr [tuple.0] | main.rs:176:9:176:9 | t [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | | main.rs:176:14:176:14 | s | main.rs:176:13:176:18 | TupleExpr [tuple.0] | provenance | | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | -| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:31 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | +| main.rs:177:28:177:28 | t [tuple.0] | main.rs:177:10:177:29 | get_tuple_element(...) | provenance | MaD:32 | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:9:188:9 | s | main.rs:189:31:189:31 | s | provenance | | | main.rs:188:13:188:22 | source(...) | main.rs:188:9:188:9 | s | provenance | | @@ -174,8 +175,8 @@ edges | main.rs:189:9:189:9 | t [tuple.1] | main.rs:191:10:191:10 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | main.rs:189:9:189:9 | t [tuple.1] | provenance | | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | -| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:36 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | +| main.rs:189:31:189:31 | s | main.rs:189:13:189:32 | set_tuple_element(...) [tuple.1] | provenance | MaD:37 | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:191:10:191:10 | t [tuple.1] | main.rs:191:10:191:12 | t.1 | provenance | | | main.rs:203:9:203:9 | s | main.rs:208:11:208:11 | s | provenance | | @@ -184,8 +185,8 @@ edges | main.rs:203:13:203:22 | source(...) | main.rs:203:9:203:9 | s | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | | main.rs:204:14:204:14 | ... | main.rs:205:14:205:14 | n | provenance | | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:23 | -| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:23 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:24 | +| main.rs:208:11:208:11 | s | main.rs:204:14:204:14 | ... | provenance | MaD:24 | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:212:13:212:22 | source(...) | main.rs:214:23:214:23 | f [captured s] | provenance | | | main.rs:213:40:213:40 | s | main.rs:213:17:213:42 | if ... {...} else {...} | provenance | | @@ -194,14 +195,14 @@ edges | main.rs:214:9:214:9 | t | main.rs:215:10:215:10 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | | main.rs:214:13:214:24 | apply(...) | main.rs:214:9:214:9 | t | provenance | | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:23 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:23 | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:24 | | main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:24 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:23 | -| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:23 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:25 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:213:40:213:40 | s | provenance | MaD:25 | | main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:24 | | main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:24 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:25 | +| main.rs:214:23:214:23 | f [captured s] | main.rs:214:13:214:24 | apply(...) | provenance | MaD:25 | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:9:219:9 | s | main.rs:221:19:221:19 | s | provenance | | | main.rs:219:13:219:22 | source(...) | main.rs:219:9:219:9 | s | provenance | | @@ -212,10 +213,10 @@ edges | main.rs:221:9:221:9 | t | main.rs:222:10:222:10 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | | main.rs:221:13:221:23 | apply(...) | main.rs:221:9:221:9 | t | provenance | | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:23 | -| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:23 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:23 | -| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:23 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:24 | +| main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | provenance | MaD:24 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:24 | +| main.rs:221:19:221:19 | s | main.rs:221:13:221:23 | apply(...) | provenance | MaD:24 | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:9:231:9 | s | main.rs:232:30:232:30 | s | provenance | | | main.rs:231:13:231:22 | source(...) | main.rs:231:9:231:9 | s | provenance | | @@ -226,8 +227,8 @@ edges | main.rs:232:13:232:31 | get_async_number(...) [future] | main.rs:232:13:232:37 | await ... | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | | main.rs:232:13:232:37 | await ... | main.rs:232:9:232:9 | t | provenance | | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | -| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:29 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | +| main.rs:232:30:232:30 | s | main.rs:232:13:232:31 | get_async_number(...) [future] | provenance | MaD:30 | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:9:257:9 | s [D] | main.rs:258:11:258:11 | s [D] | provenance | | | main.rs:257:13:257:27 | enum_source(...) | main.rs:257:9:257:9 | s [D] | provenance | Src:MaD:12 | @@ -368,6 +369,12 @@ edges | main.rs:497:9:497:10 | x6 | main.rs:498:10:498:11 | x6 | provenance | | | main.rs:497:14:497:23 | source(...) | main.rs:497:14:497:27 | ... < ... | provenance | MaD:21 | | main.rs:497:14:497:27 | ... < ... | main.rs:497:9:497:10 | x6 | provenance | | +| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | +| main.rs:503:9:503:10 | x8 | main.rs:504:10:504:11 | x8 | provenance | | +| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | +| main.rs:503:14:503:44 | ...::flow_through2(...) | main.rs:503:9:503:10 | x8 | provenance | | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:23 | +| main.rs:503:34:503:43 | source(...) | main.rs:503:14:503:44 | ...::flow_through2(...) | provenance | MaD:23 | | main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | | main.rs:506:9:506:10 | x9 | main.rs:507:10:507:11 | x9 | provenance | | | main.rs:506:14:506:44 | ...::flow_through3(...) | main.rs:506:9:506:10 | x9 | provenance | | @@ -382,10 +389,10 @@ edges | main.rs:522:20:522:28 | source(...) | main.rs:522:20:522:28 | source(...) | provenance | Sink:MaD:4 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | | main.rs:524:25:524:33 | source(...) | main.rs:524:25:524:33 | source(...) | provenance | Sink:MaD:5 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | -| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:26 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | -| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:27 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | +| main.rs:525:28:525:36 | source(...) | main.rs:525:10:525:37 | generated_summary(...) | provenance | MaD:27 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | +| main.rs:527:33:527:41 | source(...) | main.rs:527:10:527:42 | neutral_manual_summary(...) | provenance | MaD:28 | nodes | main.rs:15:9:15:9 | s | semmle.label | s | | main.rs:15:9:15:9 | s | semmle.label | s | @@ -785,6 +792,14 @@ nodes | main.rs:497:14:497:23 | source(...) | semmle.label | source(...) | | main.rs:497:14:497:27 | ... < ... | semmle.label | ... < ... | | main.rs:498:10:498:11 | x6 | semmle.label | x6 | +| main.rs:503:9:503:10 | x8 | semmle.label | x8 | +| main.rs:503:9:503:10 | x8 | semmle.label | x8 | +| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | +| main.rs:503:14:503:44 | ...::flow_through2(...) | semmle.label | ...::flow_through2(...) | +| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | +| main.rs:503:34:503:43 | source(...) | semmle.label | source(...) | +| main.rs:504:10:504:11 | x8 | semmle.label | x8 | +| main.rs:504:10:504:11 | x8 | semmle.label | x8 | | main.rs:506:9:506:10 | x9 | semmle.label | x9 | | main.rs:506:9:506:10 | x9 | semmle.label | x9 | | main.rs:506:14:506:44 | ...::flow_through3(...) | semmle.label | ...::flow_through3(...) | @@ -823,7 +838,6 @@ subpaths | main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | main.rs:221:13:221:23 | apply(...) | | main.rs:221:19:221:19 | s | main.rs:220:14:220:14 | ... | main.rs:220:17:220:42 | if ... {...} else {...} | main.rs:221:13:221:23 | apply(...) | testFailures -| main.rs:504:15:504:34 | //... | Missing result: hasValueFlow=29 | invalidSpecComponent #select | main.rs:16:10:16:20 | identity(...) | main.rs:15:13:15:21 | source(...) | main.rs:16:10:16:20 | identity(...) | $@ | main.rs:15:13:15:21 | source(...) | source(...) | @@ -901,6 +915,8 @@ invalidSpecComponent | main.rs:492:10:492:11 | x4 | main.rs:491:14:491:23 | source(...) | main.rs:492:10:492:11 | x4 | $@ | main.rs:491:14:491:23 | source(...) | source(...) | | main.rs:495:10:495:11 | x5 | main.rs:494:14:494:23 | source(...) | main.rs:495:10:495:11 | x5 | $@ | main.rs:494:14:494:23 | source(...) | source(...) | | main.rs:498:10:498:11 | x6 | main.rs:497:14:497:23 | source(...) | main.rs:498:10:498:11 | x6 | $@ | main.rs:497:14:497:23 | source(...) | source(...) | +| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | +| main.rs:504:10:504:11 | x8 | main.rs:503:34:503:43 | source(...) | main.rs:504:10:504:11 | x8 | $@ | main.rs:503:34:503:43 | source(...) | source(...) | | main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | | main.rs:507:10:507:11 | x9 | main.rs:506:34:506:43 | source(...) | main.rs:507:10:507:11 | x9 | $@ | main.rs:506:34:506:43 | source(...) | source(...) | | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | main.rs:519:10:519:28 | generated_source(...) | $@ | main.rs:519:10:519:28 | generated_source(...) | generated_source(...) | diff --git a/rust/ql/test/library-tests/dataflow/models/models.ext.yml b/rust/ql/test/library-tests/dataflow/models/models.ext.yml index e4623b191643..1a5e01e8a1c9 100644 --- a/rust/ql/test/library-tests/dataflow/models/models.ext.yml +++ b/rust/ql/test/library-tests/dataflow/models/models.ext.yml @@ -54,7 +54,7 @@ extensions: - ["main::external_file::generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] - ["main::external_file::neutral_generated_summary", "Argument[0]", "ReturnValue", "value", "dfc-generated"] - ["main::external_file::neutral_manual_summary", "Argument[0]", "ReturnValue", "value", "manual"] - - ["main::external_file::MyTrait2::flow_through2", "Argument[0]", "ReturnValue", "value", "manual"] + - ["::flow_through2", "Argument[0]", "ReturnValue", "value", "manual"] - ["<_ as main::MyTrait3>::flow_through3", "Argument[0]", "ReturnValue", "value", "manual"] - addsTo: pack: codeql/rust-all From 13ecf2e55c4396ad64c15b62353d9677ae58fda1 Mon Sep 17 00:00:00 2001 From: Jeroen Ketema Date: Mon, 31 Aug 2026 10:10:01 +0200 Subject: [PATCH 180/181] C++: Improve test stability when models are added Without the additional filtering test results may change when new models are added (whether those are relevant for this test or not). --- .../NonConstantFormat.expected | 44 ++++++++++--------- .../NonConstantFormat/NonConstantFormat.qlref | 4 +- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected b/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected index a4395489d4ee..d0784987f322 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected +++ b/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.expected @@ -1,3 +1,23 @@ +#select +| NonConstantFormat.c:30:10:30:16 | *access to array | NonConstantFormat.c:28:27:28:30 | **argv | NonConstantFormat.c:30:10:30:16 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:30:3:30:8 | call to printf | printf | +| NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:41:2:41:7 | call to printf | printf | +| NonConstantFormat.c:45:9:45:48 | *call to gettext | NonConstantFormat.c:45:11:45:47 | *call to any_random_function | NonConstantFormat.c:45:9:45:48 | *call to gettext | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:45:2:45:7 | call to printf | printf | +| nested.cpp:21:23:21:26 | *fmt0 | nested.cpp:42:24:42:34 | *call to ext_fmt_str | nested.cpp:21:23:21:26 | *fmt0 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:21:5:21:12 | call to snprintf | snprintf | +| nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:79:5:79:14 | call to diagnostic | diagnostic | +| nested.cpp:87:18:87:20 | *fmt | nested.cpp:86:19:86:46 | *call to __builtin_alloca | nested.cpp:87:18:87:20 | *fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:87:7:87:16 | call to diagnostic | diagnostic | +| test.cpp:130:20:130:26 | *access to array | test.cpp:46:27:46:30 | **argv | test.cpp:130:20:130:26 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:130:2:130:10 | call to sprintf | sprintf | +| test.cpp:170:12:170:14 | *res | test.cpp:167:31:167:34 | *data | test.cpp:170:12:170:14 | *res | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:170:5:170:10 | call to printf | printf | +| test.cpp:195:31:195:33 | *str | test.cpp:193:32:193:34 | *str | test.cpp:195:31:195:33 | *str | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:195:3:195:18 | call to StringCchPrintfW | StringCchPrintfW | +| test.cpp:197:11:197:14 | *wstr | test.cpp:193:32:193:34 | *str | test.cpp:197:11:197:14 | *wstr | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:197:3:197:9 | call to wprintf | wprintf | +| test.cpp:205:12:205:20 | *... + ... | test.cpp:204:25:204:36 | *call to get_string | test.cpp:205:12:205:20 | *... + ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:205:5:205:10 | call to printf | printf | +| test.cpp:206:12:206:16 | *hello | test.cpp:204:25:204:36 | *call to get_string | test.cpp:206:12:206:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:206:5:206:10 | call to printf | printf | +| test.cpp:211:12:211:16 | *hello | test.cpp:209:25:209:36 | *call to get_string | test.cpp:211:12:211:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:211:5:211:10 | call to printf | printf | +| test.cpp:217:12:217:16 | *hello | test.cpp:215:25:215:36 | *call to get_string | test.cpp:217:12:217:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:217:5:217:10 | call to printf | printf | +| test.cpp:223:12:223:16 | *hello | test.cpp:221:25:221:36 | *call to get_string | test.cpp:223:12:223:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:223:5:223:10 | call to printf | printf | +| test.cpp:228:12:228:18 | *++ ... | test.cpp:227:25:227:36 | *call to get_string | test.cpp:228:12:228:18 | *++ ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:228:5:228:10 | call to printf | printf | +| test.cpp:235:12:235:16 | *hello | test.cpp:232:25:232:36 | *call to get_string | test.cpp:235:12:235:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:235:5:235:10 | call to printf | printf | +| test.cpp:242:12:242:16 | *hello | test.cpp:239:25:239:36 | *call to get_string | test.cpp:242:12:242:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:242:5:242:10 | call to printf | printf | +| test.cpp:247:12:247:16 | *hello | test.cpp:245:25:245:36 | *call to get_string | test.cpp:247:12:247:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:247:5:247:10 | call to printf | printf | edges | NonConstantFormat.c:28:27:28:30 | **argv | NonConstantFormat.c:30:10:30:16 | *access to array | provenance | | | NonConstantFormat.c:45:11:45:47 | *call to any_random_function | NonConstantFormat.c:45:9:45:48 | *call to gettext | provenance | DataFlowFunction | @@ -15,7 +35,7 @@ edges | test.cpp:193:32:193:34 | *str | test.cpp:195:31:195:33 | *str | provenance | | | test.cpp:193:32:193:34 | *str | test.cpp:197:11:197:14 | *wstr | provenance | TaintFunction | | test.cpp:195:20:195:23 | StringCchPrintfW output argument | test.cpp:197:11:197:14 | *wstr | provenance | | -| test.cpp:195:31:195:33 | *str | test.cpp:195:20:195:23 | StringCchPrintfW output argument | provenance | MaD:403 | +| test.cpp:195:31:195:33 | *str | test.cpp:195:20:195:23 | StringCchPrintfW output argument | provenance | MaD:1 | | test.cpp:204:25:204:36 | *call to get_string | test.cpp:204:25:204:36 | *call to get_string | provenance | | | test.cpp:204:25:204:36 | *call to get_string | test.cpp:205:12:205:20 | *... + ... | provenance | | | test.cpp:204:25:204:36 | *call to get_string | test.cpp:206:12:206:16 | *hello | provenance | | @@ -37,6 +57,8 @@ edges | test.cpp:239:25:239:36 | *call to get_string | test.cpp:242:12:242:16 | *hello | provenance | | | test.cpp:245:25:245:36 | *call to get_string | test.cpp:245:25:245:36 | *call to get_string | provenance | | | test.cpp:245:25:245:36 | *call to get_string | test.cpp:247:12:247:16 | *hello | provenance | | +models +| 1 | Summary: ; ; false; StringCchPrintfW; ; ; Argument[*2..8]; Argument[*0]; taint; manual | nodes | NonConstantFormat.c:28:27:28:30 | **argv | semmle.label | **argv | | NonConstantFormat.c:30:10:30:16 | *access to array | semmle.label | *access to array | @@ -93,23 +115,3 @@ nodes | test.cpp:245:25:245:36 | *call to get_string | semmle.label | *call to get_string | | test.cpp:247:12:247:16 | *hello | semmle.label | *hello | subpaths -#select -| NonConstantFormat.c:30:10:30:16 | *access to array | NonConstantFormat.c:28:27:28:30 | **argv | NonConstantFormat.c:30:10:30:16 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:30:3:30:8 | call to printf | printf | -| NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | NonConstantFormat.c:41:9:41:45 | *call to any_random_function | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:41:2:41:7 | call to printf | printf | -| NonConstantFormat.c:45:9:45:48 | *call to gettext | NonConstantFormat.c:45:11:45:47 | *call to any_random_function | NonConstantFormat.c:45:9:45:48 | *call to gettext | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | NonConstantFormat.c:45:2:45:7 | call to printf | printf | -| nested.cpp:21:23:21:26 | *fmt0 | nested.cpp:42:24:42:34 | *call to ext_fmt_str | nested.cpp:21:23:21:26 | *fmt0 | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:21:5:21:12 | call to snprintf | snprintf | -| nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | nested.cpp:79:32:79:38 | *call to get_fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:79:5:79:14 | call to diagnostic | diagnostic | -| nested.cpp:87:18:87:20 | *fmt | nested.cpp:86:19:86:46 | *call to __builtin_alloca | nested.cpp:87:18:87:20 | *fmt | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | nested.cpp:87:7:87:16 | call to diagnostic | diagnostic | -| test.cpp:130:20:130:26 | *access to array | test.cpp:46:27:46:30 | **argv | test.cpp:130:20:130:26 | *access to array | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:130:2:130:10 | call to sprintf | sprintf | -| test.cpp:170:12:170:14 | *res | test.cpp:167:31:167:34 | *data | test.cpp:170:12:170:14 | *res | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:170:5:170:10 | call to printf | printf | -| test.cpp:195:31:195:33 | *str | test.cpp:193:32:193:34 | *str | test.cpp:195:31:195:33 | *str | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:195:3:195:18 | call to StringCchPrintfW | StringCchPrintfW | -| test.cpp:197:11:197:14 | *wstr | test.cpp:193:32:193:34 | *str | test.cpp:197:11:197:14 | *wstr | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:197:3:197:9 | call to wprintf | wprintf | -| test.cpp:205:12:205:20 | *... + ... | test.cpp:204:25:204:36 | *call to get_string | test.cpp:205:12:205:20 | *... + ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:205:5:205:10 | call to printf | printf | -| test.cpp:206:12:206:16 | *hello | test.cpp:204:25:204:36 | *call to get_string | test.cpp:206:12:206:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:206:5:206:10 | call to printf | printf | -| test.cpp:211:12:211:16 | *hello | test.cpp:209:25:209:36 | *call to get_string | test.cpp:211:12:211:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:211:5:211:10 | call to printf | printf | -| test.cpp:217:12:217:16 | *hello | test.cpp:215:25:215:36 | *call to get_string | test.cpp:217:12:217:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:217:5:217:10 | call to printf | printf | -| test.cpp:223:12:223:16 | *hello | test.cpp:221:25:221:36 | *call to get_string | test.cpp:223:12:223:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:223:5:223:10 | call to printf | printf | -| test.cpp:228:12:228:18 | *++ ... | test.cpp:227:25:227:36 | *call to get_string | test.cpp:228:12:228:18 | *++ ... | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:228:5:228:10 | call to printf | printf | -| test.cpp:235:12:235:16 | *hello | test.cpp:232:25:232:36 | *call to get_string | test.cpp:235:12:235:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:235:5:235:10 | call to printf | printf | -| test.cpp:242:12:242:16 | *hello | test.cpp:239:25:239:36 | *call to get_string | test.cpp:242:12:242:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:242:5:242:10 | call to printf | printf | -| test.cpp:247:12:247:16 | *hello | test.cpp:245:25:245:36 | *call to get_string | test.cpp:247:12:247:16 | *hello | The format string argument to $@ has a source which cannot be verified to originate from a string literal. | test.cpp:247:5:247:10 | call to printf | printf | diff --git a/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.qlref b/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.qlref index cb71273232ca..e33cbe4e51e1 100644 --- a/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.qlref +++ b/cpp/ql/test/query-tests/Likely Bugs/Format/NonConstantFormat/NonConstantFormat.qlref @@ -1,2 +1,4 @@ query: Likely Bugs/Format/NonConstantFormat.ql -postprocess: utils/test/InlineExpectationsTestQuery.ql +postprocess: + - utils/test/PrettyPrintModels.ql + - utils/test/InlineExpectationsTestQuery.ql From 5e9dade29749c5d1ebff51b1658176aefbd7338e Mon Sep 17 00:00:00 2001 From: Tom Hvitved Date: Mon, 31 Aug 2026 13:41:00 +0200 Subject: [PATCH 181/181] Rust: Start canonical path part indices at zero Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> Copilot-Session: 4e7f3f7f-82b3-403c-93fa-984f56c89a70 --- .../ql/lib/codeql/rust/internal/PathResolution.qll | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rust/ql/lib/codeql/rust/internal/PathResolution.qll b/rust/ql/lib/codeql/rust/internal/PathResolution.qll index 707aad9cddd2..42f3f1d5ba3e 100644 --- a/rust/ql/lib/codeql/rust/internal/PathResolution.qll +++ b/rust/ql/lib/codeql/rust/internal/PathResolution.qll @@ -1104,32 +1104,32 @@ final class TraitItemNode extends ImplOrTraitItemNode, NamedItemNode, TypeItemNo bindingset[c] private string getCanonicalPathPart(Crate c, int i) { - i = -1 and + i = 0 and result = "<" or - i = 0 and + i = 1 and result = this.getCanonicalPathPrefix(c) or - i = 1 and + i = 2 and result = "::" or - i = 2 and + i = 3 and result = this.getName() or - i = 3 and + i = 4 and result = ">" } language[monotonicAggregates] override string getCanonicalPath(Crate c) { this.hasCanonicalPath(c) and - result = strictconcat(int i | i in [0 .. 2] | this.getCanonicalPathPart(c, i) order by i) + result = strictconcat(int i | i in [1 .. 3] | this.getCanonicalPathPart(c, i) order by i) } language[monotonicAggregates] override string getCanonicalPathPrefixFor(Crate c, ItemNode child) { this.providesCanonicalPathPrefixFor(c, child) and - result = strictconcat(int i | i in [-1 .. 3] | this.getCanonicalPathPart(c, i) order by i) + result = strictconcat(int i | i in [0 .. 4] | this.getCanonicalPathPart(c, i) order by i) } }