mirror of
https://github.com/github/codeql.git
synced 2026-06-25 22:57:01 +02:00
Compare commits
12 Commits
yoff/pytho
...
copilot/cr
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
29eba2f38e | ||
|
|
a24d222d96 | ||
|
|
bcfee987f0 | ||
|
|
e1d4fe8605 | ||
|
|
11725e8921 | ||
|
|
41297c588c | ||
|
|
18f49ed1a2 | ||
|
|
5f31632445 | ||
|
|
6a2a337ffe | ||
|
|
cf896f243f | ||
|
|
bae2d18446 | ||
|
|
2fb5321a50 |
@@ -0,0 +1,413 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Collections.Immutable;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Http;
|
||||||
|
using System.Security.Cryptography.X509Certificates;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Semmle.Util;
|
||||||
|
using Semmle.Util.Logging;
|
||||||
|
|
||||||
|
namespace Semmle.Extraction.CSharp.DependencyFetching
|
||||||
|
{
|
||||||
|
internal sealed partial class FeedManager : IDisposable
|
||||||
|
{
|
||||||
|
internal const string PublicNugetOrgFeed = "https://api.nuget.org/v3/index.json";
|
||||||
|
|
||||||
|
private readonly ILogger logger;
|
||||||
|
private readonly IDotNet dotnet;
|
||||||
|
private readonly FileProvider fileProvider;
|
||||||
|
private readonly DependabotProxy? dependabotProxy;
|
||||||
|
private readonly DependencyDirectory emptyPackageDirectory;
|
||||||
|
|
||||||
|
public ImmutableHashSet<string> PrivateRegistryFeeds { get; }
|
||||||
|
public bool HasPrivateRegistryFeeds { get; }
|
||||||
|
public bool CheckNugetFeedResponsiveness { get; } = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.CheckNugetFeedResponsiveness);
|
||||||
|
|
||||||
|
public FeedManager(ILogger logger, IDotNet dotnet, DependabotProxy? dependabotProxy, FileProvider fileProvider)
|
||||||
|
{
|
||||||
|
this.logger = logger;
|
||||||
|
this.dotnet = dotnet;
|
||||||
|
this.dependabotProxy = dependabotProxy;
|
||||||
|
this.fileProvider = fileProvider;
|
||||||
|
PrivateRegistryFeeds = dependabotProxy?.RegistryURLs.ToImmutableHashSet() ?? [];
|
||||||
|
HasPrivateRegistryFeeds = PrivateRegistryFeeds.Count > 0;
|
||||||
|
emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string? GetDirectoryName(string path)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return new FileInfo(path).Directory?.FullName;
|
||||||
|
}
|
||||||
|
catch (Exception exc)
|
||||||
|
{
|
||||||
|
logger.LogWarning($"Failed to get directory of '{path}': {exc}");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<string> GetFeeds(Func<IList<string>> getNugetFeeds)
|
||||||
|
{
|
||||||
|
var results = getNugetFeeds();
|
||||||
|
var regex = EnabledNugetFeed();
|
||||||
|
foreach (var result in results)
|
||||||
|
{
|
||||||
|
var match = regex.Match(result);
|
||||||
|
if (!match.Success)
|
||||||
|
{
|
||||||
|
logger.LogError($"Failed to parse feed from '{result}'");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var url = match.Groups[1].Value;
|
||||||
|
if (!url.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase) &&
|
||||||
|
!url.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase))
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Skipping feed '{url}' as it is not a valid URL.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(url))
|
||||||
|
{
|
||||||
|
yield return url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<string> GetFeedsFromFolder(string folderPath) =>
|
||||||
|
GetFeeds(() => dotnet.GetNugetFeedsFromFolder(folderPath));
|
||||||
|
|
||||||
|
|
||||||
|
private IEnumerable<string> GetFeedsFromNugetConfig(string nugetConfigPath) =>
|
||||||
|
GetFeeds(() => dotnet.GetNugetFeeds(nugetConfigPath));
|
||||||
|
|
||||||
|
private string FeedsToRestoreArgument(IEnumerable<string> feeds)
|
||||||
|
{
|
||||||
|
// If there are no feeds, we want to override any default feeds that `dotnet restore` would use by passing a dummy source argument.
|
||||||
|
if (!feeds.Any())
|
||||||
|
{
|
||||||
|
return $" -s \"{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($" -s \"{feed}\"");
|
||||||
|
}
|
||||||
|
|
||||||
|
return feedArgs.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Constructs the list of NuGet sources to use for this restore.
|
||||||
|
/// (1) Use the feeds we get from `dotnet nuget list source`
|
||||||
|
/// (2) Use private registries, if they are configured
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">Path to project/solution</param>
|
||||||
|
/// <param name="reachableFeeds">The set of reachable NuGet feeds.</param>
|
||||||
|
/// <returns>A string representing the NuGet sources argument for the restore command.</returns>
|
||||||
|
public string? MakeRestoreSourcesArgument(string path, HashSet<string> reachableFeeds)
|
||||||
|
{
|
||||||
|
// Do not construct a set of explicit NuGet sources to use for restore.
|
||||||
|
if (!CheckNugetFeedResponsiveness && !HasPrivateRegistryFeeds)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find the path specific feeds.
|
||||||
|
var folder = GetDirectoryName(path);
|
||||||
|
var feedsToConsider = folder is not null ? GetFeedsFromFolder(folder).ToHashSet() : new HashSet<string>();
|
||||||
|
|
||||||
|
if (HasPrivateRegistryFeeds)
|
||||||
|
{
|
||||||
|
feedsToConsider.UnionWith(PrivateRegistryFeeds);
|
||||||
|
}
|
||||||
|
|
||||||
|
var feedsToUse = CheckNugetFeedResponsiveness
|
||||||
|
? feedsToConsider.Where(reachableFeeds.Contains)
|
||||||
|
: feedsToConsider;
|
||||||
|
|
||||||
|
return FeedsToRestoreArgument(feedsToUse);
|
||||||
|
}
|
||||||
|
|
||||||
|
private (int initialTimeout, int tryCount) GetFeedRequestSettings(bool isFallback)
|
||||||
|
{
|
||||||
|
int timeoutMilliSeconds = isFallback && int.TryParse(Environment.GetEnvironmentVariable(EnvironmentVariableNames.NugetFeedResponsivenessInitialTimeoutForFallback), out timeoutMilliSeconds)
|
||||||
|
? timeoutMilliSeconds
|
||||||
|
: int.TryParse(Environment.GetEnvironmentVariable(EnvironmentVariableNames.NugetFeedResponsivenessInitialTimeout), out timeoutMilliSeconds)
|
||||||
|
? timeoutMilliSeconds
|
||||||
|
: 1000;
|
||||||
|
logger.LogDebug($"Initial timeout for NuGet feed reachability check is {timeoutMilliSeconds}ms.");
|
||||||
|
|
||||||
|
int tryCount = isFallback && int.TryParse(Environment.GetEnvironmentVariable(EnvironmentVariableNames.NugetFeedResponsivenessRequestCountForFallback), out tryCount)
|
||||||
|
? tryCount
|
||||||
|
: int.TryParse(Environment.GetEnvironmentVariable(EnvironmentVariableNames.NugetFeedResponsivenessRequestCount), out tryCount)
|
||||||
|
? tryCount
|
||||||
|
: 4;
|
||||||
|
logger.LogDebug($"Number of tries for NuGet feed reachability check is {tryCount}.");
|
||||||
|
|
||||||
|
return (timeoutMilliSeconds, tryCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task<HttpResponseMessage> ExecuteGetRequest(string address, HttpClient httpClient, CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
return await httpClient.GetAsync(address, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount, out bool isTimeout)
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Checking if NuGet feed '{feed}' is reachable...");
|
||||||
|
|
||||||
|
// Configure the HttpClient to be aware of the Dependabot Proxy, if used.
|
||||||
|
HttpClientHandler httpClientHandler = new();
|
||||||
|
if (dependabotProxy != null)
|
||||||
|
{
|
||||||
|
httpClientHandler.Proxy = new WebProxy(dependabotProxy.Address);
|
||||||
|
|
||||||
|
if (dependabotProxy.Certificate != null)
|
||||||
|
{
|
||||||
|
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, _) =>
|
||||||
|
{
|
||||||
|
if (chain is null || cert is null)
|
||||||
|
{
|
||||||
|
var msg = cert is null && chain is null
|
||||||
|
? "certificate and chain"
|
||||||
|
: chain is null
|
||||||
|
? "chain"
|
||||||
|
: "certificate";
|
||||||
|
logger.LogWarning($"Dependabot proxy certificate validation failed due to missing {msg}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;
|
||||||
|
chain.ChainPolicy.CustomTrustStore.Add(dependabotProxy.Certificate);
|
||||||
|
return chain.Build(cert);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
using HttpClient client = new(httpClientHandler);
|
||||||
|
|
||||||
|
isTimeout = false;
|
||||||
|
|
||||||
|
for (var i = 0; i < tryCount; i++)
|
||||||
|
{
|
||||||
|
using var cts = new CancellationTokenSource();
|
||||||
|
cts.CancelAfter(timeoutMilliSeconds);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Attempt {i + 1}/{tryCount} to reach NuGet feed '{feed}'.");
|
||||||
|
using var response = ExecuteGetRequest(feed, client, cts.Token).GetAwaiter().GetResult();
|
||||||
|
response.EnsureSuccessStatusCode();
|
||||||
|
logger.LogInfo($"Querying NuGet feed '{feed}' succeeded.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch (Exception exc)
|
||||||
|
{
|
||||||
|
if (exc is TaskCanceledException tce &&
|
||||||
|
tce.CancellationToken == cts.Token &&
|
||||||
|
cts.Token.IsCancellationRequested)
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Didn't receive answer from NuGet feed '{feed}' in {timeoutMilliSeconds}ms.");
|
||||||
|
timeoutMilliSeconds *= 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.LogInfo($"Querying NuGet feed '{feed}' failed. The reason for the failure: {exc.Message}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.LogWarning($"Didn't receive answer from NuGet feed '{feed}'. Tried it {tryCount} times.");
|
||||||
|
isTimeout = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Retrieves a list of excluded NuGet feeds from the corresponding environment variable.
|
||||||
|
/// </summary>
|
||||||
|
private HashSet<string> GetExcludedFeeds()
|
||||||
|
{
|
||||||
|
var excludedFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.ExcludedNugetFeedsFromResponsivenessCheck)
|
||||||
|
.ToHashSet();
|
||||||
|
|
||||||
|
if (excludedFeeds.Count > 0)
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Excluded NuGet feeds from responsiveness check: {string.Join(", ", excludedFeeds.OrderBy(f => f))}");
|
||||||
|
}
|
||||||
|
|
||||||
|
return excludedFeeds;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks that we can connect to the specified NuGet feeds.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="feeds">The set of package feeds to check.</param>
|
||||||
|
/// <param name="reachableFeeds">The list of feeds that were reachable.</param>
|
||||||
|
/// <returns>
|
||||||
|
/// 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.
|
||||||
|
/// </returns>
|
||||||
|
public bool CheckSpecifiedFeeds(HashSet<string> feeds, out HashSet<string> reachableFeeds)
|
||||||
|
{
|
||||||
|
// Exclude any feeds from the feed check that are configured by the corresponding environment variable.
|
||||||
|
// These feeds are always assumed to be reachable.
|
||||||
|
var excludedFeeds = GetExcludedFeeds();
|
||||||
|
|
||||||
|
HashSet<string> feedsToCheck = feeds.Where(feed =>
|
||||||
|
{
|
||||||
|
if (excludedFeeds.Contains(feed))
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Not checking reachability of NuGet feed '{feed}' as it is in the list of excluded feeds.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}).ToHashSet();
|
||||||
|
|
||||||
|
reachableFeeds = GetReachableNuGetFeeds(feedsToCheck, isFallback: false, out var isTimeout).ToHashSet();
|
||||||
|
|
||||||
|
// Always consider feeds excluded for the reachability check as reachable.
|
||||||
|
reachableFeeds.UnionWith(feeds.Where(feed => excludedFeeds.Contains(feed)));
|
||||||
|
|
||||||
|
return isTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsDefaultFeedReachable()
|
||||||
|
{
|
||||||
|
if (CheckNugetFeedResponsiveness)
|
||||||
|
{
|
||||||
|
var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback: false);
|
||||||
|
return IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount, out var _);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Tests which of the feeds given by <paramref name="feedsToCheck"/> are reachable.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="feedsToCheck">The feeds to check.</param>
|
||||||
|
/// <param name="isFallback">Whether the feeds are fallback feeds or not.</param>
|
||||||
|
/// <param name="isTimeout">Whether a timeout occurred while checking the feeds.</param>
|
||||||
|
/// <returns>The list of feeds that could be reached.</returns>
|
||||||
|
private List<string> GetReachableNuGetFeeds(HashSet<string> feedsToCheck, bool isFallback, out bool isTimeout)
|
||||||
|
{
|
||||||
|
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;
|
||||||
|
})
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
if (reachableFeeds.Count == 0)
|
||||||
|
{
|
||||||
|
logger.LogWarning($"No {fallbackStr}NuGet feeds are reachable.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Reachable {fallbackStr}NuGet feeds: {string.Join(", ", reachableFeeds.OrderBy(f => f))}");
|
||||||
|
}
|
||||||
|
|
||||||
|
isTimeout = timeout;
|
||||||
|
return reachableFeeds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<string> GetReachableFallbackNugetFeeds(HashSet<string>? feedsFromNugetConfigs)
|
||||||
|
{
|
||||||
|
var fallbackFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.FallbackNugetFeeds).ToHashSet();
|
||||||
|
if (fallbackFeeds.Count == 0)
|
||||||
|
{
|
||||||
|
fallbackFeeds.Add(PublicNugetOrgFeed);
|
||||||
|
logger.LogInfo($"No fallback NuGet feeds specified. Adding default feed: {PublicNugetOrgFeed}");
|
||||||
|
|
||||||
|
var shouldAddNugetConfigFeeds = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.AddNugetConfigFeedsToFallback);
|
||||||
|
logger.LogInfo($"Adding feeds from nuget.config to fallback restore: {shouldAddNugetConfigFeeds}");
|
||||||
|
|
||||||
|
if (shouldAddNugetConfigFeeds && feedsFromNugetConfigs?.Count > 0)
|
||||||
|
{
|
||||||
|
// There are some feeds in `feedsFromNugetConfigs` that have already been checked for reachability, we could skip those.
|
||||||
|
// But we might use different responsiveness testing settings when we try them in the fallback logic, so checking them again is safer.
|
||||||
|
fallbackFeeds.UnionWith(feedsFromNugetConfigs);
|
||||||
|
logger.LogInfo($"Using NuGet feeds from nuget.config files as fallback feeds: {string.Join(", ", feedsFromNugetConfigs.OrderBy(f => f))}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetReachableNuGetFeeds(fallbackFeeds, isFallback: true, out var _);
|
||||||
|
}
|
||||||
|
|
||||||
|
public (HashSet<string> explicitFeeds, HashSet<string> allFeeds) GetAllFeeds()
|
||||||
|
{
|
||||||
|
var nugetConfigs = fileProvider.NugetConfigs;
|
||||||
|
|
||||||
|
// Find feeds that are explicitly configured in the NuGet configuration files that we found.
|
||||||
|
var explicitFeeds = nugetConfigs
|
||||||
|
.SelectMany(GetFeedsFromNugetConfig)
|
||||||
|
.ToHashSet();
|
||||||
|
|
||||||
|
if (explicitFeeds.Count > 0)
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Found {explicitFeeds.Count} NuGet feeds in nuget.config files: {string.Join(", ", explicitFeeds.OrderBy(f => f))}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logger.LogDebug("No NuGet feeds found in nuget.config files.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// If private package registries are configured for C#, then consider those
|
||||||
|
// in addition to the ones that are configured in `nuget.config` files.
|
||||||
|
if (HasPrivateRegistryFeeds)
|
||||||
|
{
|
||||||
|
logger.LogInfo($"Found {PrivateRegistryFeeds.Count} private registry feeds configured for C#: {string.Join(", ", PrivateRegistryFeeds.OrderBy(f => f))}");
|
||||||
|
explicitFeeds.UnionWith(PrivateRegistryFeeds);
|
||||||
|
}
|
||||||
|
|
||||||
|
HashSet<string> allFeeds = [];
|
||||||
|
|
||||||
|
// Add all explicitFeeds to the set of all feeds.
|
||||||
|
allFeeds.UnionWith(explicitFeeds);
|
||||||
|
|
||||||
|
// Obtain the list of feeds from the root source directory.
|
||||||
|
// If a NuGet file is present it will be respected, otherwise we will just get the machine/environment specific feeds.
|
||||||
|
var nugetFeedsFromRoot = GetFeedsFromFolder(fileProvider.SourceDir.FullName);
|
||||||
|
allFeeds.UnionWith(nugetFeedsFromRoot);
|
||||||
|
|
||||||
|
if (nugetConfigs.Count > 0)
|
||||||
|
{
|
||||||
|
var nugetConfigFeeds = nugetConfigs
|
||||||
|
.Select(GetDirectoryName)
|
||||||
|
.Where(folder => folder != null)
|
||||||
|
.SelectMany(folder => GetFeedsFromFolder(folder!))
|
||||||
|
.ToHashSet();
|
||||||
|
|
||||||
|
allFeeds.UnionWith(nugetConfigFeeds);
|
||||||
|
}
|
||||||
|
|
||||||
|
logger.LogInfo($"Found {allFeeds.Count} NuGet feeds (with inherited ones) in nuget.config files: {string.Join(", ", allFeeds.OrderBy(f => f))}");
|
||||||
|
|
||||||
|
return (explicitFeeds, allFeeds);
|
||||||
|
}
|
||||||
|
|
||||||
|
[GeneratedRegex(@"^E\s(.*)$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline)]
|
||||||
|
private static partial Regex EnabledNugetFeed();
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
emptyPackageDirectory.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,9 +4,6 @@ using System.Collections.Generic;
|
|||||||
using System.Collections.Immutable;
|
using System.Collections.Immutable;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
|
||||||
using System.Net.Http;
|
|
||||||
using System.Security.Cryptography.X509Certificates;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
@@ -19,24 +16,19 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
{
|
{
|
||||||
internal sealed partial class NugetPackageRestorer : IDisposable
|
internal sealed partial class NugetPackageRestorer : IDisposable
|
||||||
{
|
{
|
||||||
internal const string PublicNugetOrgFeed = "https://api.nuget.org/v3/index.json";
|
|
||||||
|
|
||||||
private readonly FileProvider fileProvider;
|
private readonly FileProvider fileProvider;
|
||||||
private readonly FileContent fileContent;
|
private readonly FileContent fileContent;
|
||||||
private readonly IDotNet dotnet;
|
private readonly IDotNet dotnet;
|
||||||
private readonly DependabotProxy? dependabotProxy;
|
|
||||||
private readonly IDiagnosticsWriter diagnosticsWriter;
|
private readonly IDiagnosticsWriter diagnosticsWriter;
|
||||||
private readonly DependencyDirectory legacyPackageDirectory;
|
private readonly DependencyDirectory legacyPackageDirectory;
|
||||||
private readonly DependencyDirectory missingPackageDirectory;
|
private readonly DependencyDirectory missingPackageDirectory;
|
||||||
private readonly DependencyDirectory emptyPackageDirectory;
|
|
||||||
private readonly ILogger logger;
|
private readonly ILogger logger;
|
||||||
private readonly ICompilationInfoContainer compilationInfoContainer;
|
private readonly ICompilationInfoContainer compilationInfoContainer;
|
||||||
private readonly bool checkNugetFeedResponsiveness = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.CheckNugetFeedResponsiveness);
|
private readonly FeedManager feedManager;
|
||||||
private readonly ImmutableHashSet<string> privateRegistryFeeds;
|
|
||||||
private readonly bool hasPrivateRegistryFeeds;
|
|
||||||
|
|
||||||
public DependencyDirectory PackageDirectory { get; }
|
public DependencyDirectory PackageDirectory { get; }
|
||||||
|
|
||||||
|
|
||||||
public NugetPackageRestorer(
|
public NugetPackageRestorer(
|
||||||
FileProvider fileProvider,
|
FileProvider fileProvider,
|
||||||
FileContent fileContent,
|
FileContent fileContent,
|
||||||
@@ -49,9 +41,6 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
this.fileProvider = fileProvider;
|
this.fileProvider = fileProvider;
|
||||||
this.fileContent = fileContent;
|
this.fileContent = fileContent;
|
||||||
this.dotnet = dotnet;
|
this.dotnet = dotnet;
|
||||||
this.dependabotProxy = dependabotProxy;
|
|
||||||
this.privateRegistryFeeds = dependabotProxy?.RegistryURLs.ToImmutableHashSet() ?? [];
|
|
||||||
this.hasPrivateRegistryFeeds = privateRegistryFeeds.Count > 0;
|
|
||||||
this.diagnosticsWriter = diagnosticsWriter;
|
this.diagnosticsWriter = diagnosticsWriter;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.compilationInfoContainer = compilationInfoContainer;
|
this.compilationInfoContainer = compilationInfoContainer;
|
||||||
@@ -59,7 +48,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
PackageDirectory = new DependencyDirectory("packages", "package", logger);
|
PackageDirectory = new DependencyDirectory("packages", "package", logger);
|
||||||
legacyPackageDirectory = new DependencyDirectory("legacypackages", "legacy package", logger);
|
legacyPackageDirectory = new DependencyDirectory("legacypackages", "legacy package", logger);
|
||||||
missingPackageDirectory = new DependencyDirectory("missingpackages", "missing package", logger);
|
missingPackageDirectory = new DependencyDirectory("missingpackages", "missing package", logger);
|
||||||
emptyPackageDirectory = new DependencyDirectory("empty", "empty package", logger);
|
feedManager = new FeedManager(logger, dotnet, dependabotProxy, fileProvider);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string? TryRestore(string package)
|
public string? TryRestore(string package)
|
||||||
@@ -118,20 +107,22 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
public HashSet<AssemblyLookupLocation> Restore()
|
public HashSet<AssemblyLookupLocation> Restore()
|
||||||
{
|
{
|
||||||
var assemblyLookupLocations = new HashSet<AssemblyLookupLocation>();
|
var assemblyLookupLocations = new HashSet<AssemblyLookupLocation>();
|
||||||
logger.LogInfo($"Checking NuGet feed responsiveness: {checkNugetFeedResponsiveness}");
|
logger.LogInfo($"Checking NuGet feed responsiveness: {feedManager.CheckNugetFeedResponsiveness}");
|
||||||
compilationInfoContainer.CompilationInfos.Add(("NuGet feed responsiveness checked", checkNugetFeedResponsiveness ? "1" : "0"));
|
compilationInfoContainer.CompilationInfos.Add(("NuGet feed responsiveness checked", feedManager.CheckNugetFeedResponsiveness ? "1" : "0"));
|
||||||
|
|
||||||
HashSet<string> explicitFeeds = [];
|
HashSet<string> explicitFeeds = [];
|
||||||
HashSet<string> reachableFeeds = [];
|
HashSet<string> reachableFeeds = [];
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
EmitNugetConfigDiagnostics();
|
||||||
|
|
||||||
// Find feeds that are configured in NuGet.config files and divide them into ones that
|
// Find feeds that are configured in NuGet.config files and divide them into ones that
|
||||||
// are explicitly configured for the project or by a private registry, and "all feeds"
|
// are explicitly configured for the project or by a private registry, and "all feeds"
|
||||||
// (including inherited ones) from other locations on the host outside of the working directory.
|
// (including inherited ones) from other locations on the host outside of the working directory.
|
||||||
(explicitFeeds, var allFeeds) = GetAllFeeds();
|
(explicitFeeds, var allFeeds) = feedManager.GetAllFeeds();
|
||||||
|
|
||||||
if (checkNugetFeedResponsiveness)
|
if (feedManager.CheckNugetFeedResponsiveness)
|
||||||
{
|
{
|
||||||
var inheritedFeeds = allFeeds.Except(explicitFeeds).ToHashSet();
|
var inheritedFeeds = allFeeds.Except(explicitFeeds).ToHashSet();
|
||||||
|
|
||||||
@@ -140,7 +131,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
compilationInfoContainer.CompilationInfos.Add(("Inherited NuGet feed count", inheritedFeeds.Count.ToString()));
|
compilationInfoContainer.CompilationInfos.Add(("Inherited NuGet feed count", inheritedFeeds.Count.ToString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
var timeout = CheckSpecifiedFeeds(explicitFeeds, out var reachableExplicitFeeds);
|
var timeout = feedManager.CheckSpecifiedFeeds(explicitFeeds, out var reachableExplicitFeeds);
|
||||||
reachableFeeds.UnionWith(reachableExplicitFeeds);
|
reachableFeeds.UnionWith(reachableExplicitFeeds);
|
||||||
|
|
||||||
var allExplicitReachable = explicitFeeds.Count == reachableExplicitFeeds.Count;
|
var allExplicitReachable = explicitFeeds.Count == reachableExplicitFeeds.Count;
|
||||||
@@ -157,11 +148,11 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Inherited feeds should only be used, if they are indeed reachable (as they may be environment specific).
|
// Inherited feeds should only be used, if they are indeed reachable (as they may be environment specific).
|
||||||
CheckSpecifiedFeeds(inheritedFeeds, out var reachableInheritedFeeds);
|
feedManager.CheckSpecifiedFeeds(inheritedFeeds, out var reachableInheritedFeeds);
|
||||||
reachableFeeds.UnionWith(reachableInheritedFeeds);
|
reachableFeeds.UnionWith(reachableInheritedFeeds);
|
||||||
}
|
}
|
||||||
|
|
||||||
using (var packagesConfigRestore = PackagesConfigRestoreFactory.Create(fileProvider, legacyPackageDirectory, logger, IsDefaultFeedReachable))
|
using (var packagesConfigRestore = PackagesConfigRestoreFactory.Create(fileProvider, legacyPackageDirectory, logger, feedManager.IsDefaultFeedReachable))
|
||||||
{
|
{
|
||||||
var count = packagesConfigRestore.InstallPackages();
|
var count = packagesConfigRestore.InstallPackages();
|
||||||
|
|
||||||
@@ -215,7 +206,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
|
|
||||||
var usedPackageNames = GetAllUsedPackageDirNames(dependencies);
|
var usedPackageNames = GetAllUsedPackageDirNames(dependencies);
|
||||||
|
|
||||||
var missingPackageLocation = checkNugetFeedResponsiveness
|
var missingPackageLocation = feedManager.CheckNugetFeedResponsiveness
|
||||||
? DownloadMissingPackagesFromSpecificFeeds(usedPackageNames, explicitFeeds)
|
? DownloadMissingPackagesFromSpecificFeeds(usedPackageNames, explicitFeeds)
|
||||||
: DownloadMissingPackages(usedPackageNames);
|
: DownloadMissingPackages(usedPackageNames);
|
||||||
|
|
||||||
@@ -226,79 +217,6 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
return assemblyLookupLocations;
|
return assemblyLookupLocations;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Tests which of the feeds given by <paramref name="feedsToCheck"/> are reachable.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="feedsToCheck">The feeds to check.</param>
|
|
||||||
/// <param name="isFallback">Whether the feeds are fallback feeds or not.</param>
|
|
||||||
/// <param name="isTimeout">Whether a timeout occurred while checking the feeds.</param>
|
|
||||||
/// <returns>The list of feeds that could be reached.</returns>
|
|
||||||
private List<string> GetReachableNuGetFeeds(HashSet<string> feedsToCheck, bool isFallback, out bool isTimeout)
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
})
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
if (reachableFeeds.Count == 0)
|
|
||||||
{
|
|
||||||
logger.LogWarning($"No {fallbackStr}NuGet feeds are reachable.");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
logger.LogInfo($"Reachable {fallbackStr}NuGet feeds: {string.Join(", ", reachableFeeds.OrderBy(f => f))}");
|
|
||||||
}
|
|
||||||
|
|
||||||
isTimeout = timeout;
|
|
||||||
return reachableFeeds;
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool IsDefaultFeedReachable()
|
|
||||||
{
|
|
||||||
if (checkNugetFeedResponsiveness)
|
|
||||||
{
|
|
||||||
var (initialTimeout, tryCount) = GetFeedRequestSettings(isFallback: false);
|
|
||||||
return IsFeedReachable(PublicNugetOrgFeed, initialTimeout, tryCount, out var _);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<string> GetReachableFallbackNugetFeeds(HashSet<string>? feedsFromNugetConfigs)
|
|
||||||
{
|
|
||||||
var fallbackFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.FallbackNugetFeeds).ToHashSet();
|
|
||||||
if (fallbackFeeds.Count == 0)
|
|
||||||
{
|
|
||||||
fallbackFeeds.Add(PublicNugetOrgFeed);
|
|
||||||
logger.LogInfo($"No fallback NuGet feeds specified. Adding default feed: {PublicNugetOrgFeed}");
|
|
||||||
|
|
||||||
var shouldAddNugetConfigFeeds = EnvironmentVariables.GetBooleanOptOut(EnvironmentVariableNames.AddNugetConfigFeedsToFallback);
|
|
||||||
logger.LogInfo($"Adding feeds from nuget.config to fallback restore: {shouldAddNugetConfigFeeds}");
|
|
||||||
|
|
||||||
if (shouldAddNugetConfigFeeds && feedsFromNugetConfigs?.Count > 0)
|
|
||||||
{
|
|
||||||
// There are some feeds in `feedsFromNugetConfigs` that have already been checked for reachability, we could skip those.
|
|
||||||
// But we might use different responsiveness testing settings when we try them in the fallback logic, so checking them again is safer.
|
|
||||||
fallbackFeeds.UnionWith(feedsFromNugetConfigs);
|
|
||||||
logger.LogInfo($"Using NuGet feeds from nuget.config files as fallback feeds: {string.Join(", ", feedsFromNugetConfigs.OrderBy(f => f))}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var reachableFallbackFeeds = GetReachableNuGetFeeds(fallbackFeeds, isFallback: true, out var _);
|
|
||||||
|
|
||||||
compilationInfoContainer.CompilationInfos.Add(("Reachable fallback NuGet feed count", reachableFallbackFeeds.Count.ToString()));
|
|
||||||
|
|
||||||
return reachableFallbackFeeds;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Executes `dotnet restore` on all solution files in solutions.
|
/// Executes `dotnet restore` on all solution files in solutions.
|
||||||
@@ -321,7 +239,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
var projects = fileProvider.Solutions.SelectMany(solution =>
|
var projects = fileProvider.Solutions.SelectMany(solution =>
|
||||||
{
|
{
|
||||||
logger.LogInfo($"Restoring solution {solution}...");
|
logger.LogInfo($"Restoring solution {solution}...");
|
||||||
var nugetSources = MakeRestoreSourcesArgument(solution, reachableFeeds);
|
var nugetSources = feedManager.MakeRestoreSourcesArgument(solution, reachableFeeds);
|
||||||
var res = dotnet.Restore(new(solution, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, NugetSources: nugetSources, TargetWindows: isWindows));
|
var res = dotnet.Restore(new(solution, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, NugetSources: nugetSources, TargetWindows: isWindows));
|
||||||
if (res.Success)
|
if (res.Success)
|
||||||
{
|
{
|
||||||
@@ -346,57 +264,6 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
return projects;
|
return projects;
|
||||||
}
|
}
|
||||||
|
|
||||||
private string FeedsToRestoreArgument(IEnumerable<string> feeds)
|
|
||||||
{
|
|
||||||
// If there are no feeds, we want to override any default feeds that `dotnet restore` would use by passing a dummy source argument.
|
|
||||||
if (!feeds.Any())
|
|
||||||
{
|
|
||||||
return $" -s \"{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($" -s \"{feed}\"");
|
|
||||||
}
|
|
||||||
|
|
||||||
return feedArgs.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Constructs the list of NuGet sources to use for this restore.
|
|
||||||
/// (1) Use the feeds we get from `dotnet nuget list source`
|
|
||||||
/// (2) Use private registries, if they are configured
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="path">Path to project/solution</param>
|
|
||||||
/// <param name="reachableFeeds">The set of reachable NuGet feeds.</param>
|
|
||||||
/// <returns>A string representing the NuGet sources argument for the restore command.</returns>
|
|
||||||
private string? MakeRestoreSourcesArgument(string path, HashSet<string> reachableFeeds)
|
|
||||||
{
|
|
||||||
// Do not construct an set of explicit NuGet sources to use for restore.
|
|
||||||
if (!checkNugetFeedResponsiveness && !hasPrivateRegistryFeeds)
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find the path specific feeds.
|
|
||||||
var folder = GetDirectoryName(path);
|
|
||||||
var feedsToConsider = folder is not null ? GetFeeds(() => dotnet.GetNugetFeedsFromFolder(folder)).ToHashSet() : [];
|
|
||||||
|
|
||||||
if (hasPrivateRegistryFeeds)
|
|
||||||
{
|
|
||||||
feedsToConsider.UnionWith(privateRegistryFeeds);
|
|
||||||
}
|
|
||||||
|
|
||||||
var feedsToUse = checkNugetFeedResponsiveness
|
|
||||||
? feedsToConsider.Where(reachableFeeds.Contains)
|
|
||||||
: feedsToConsider;
|
|
||||||
|
|
||||||
return FeedsToRestoreArgument(feedsToUse);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Executes `dotnet restore` on all projects in projects.
|
/// Executes `dotnet restore` on all projects in projects.
|
||||||
/// This is done in parallel for performance reasons.
|
/// This is done in parallel for performance reasons.
|
||||||
@@ -421,7 +288,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
foreach (var project in projectGroup)
|
foreach (var project in projectGroup)
|
||||||
{
|
{
|
||||||
logger.LogInfo($"Restoring project {project}...");
|
logger.LogInfo($"Restoring project {project}...");
|
||||||
var nugetSources = MakeRestoreSourcesArgument(project, reachableFeeds);
|
var nugetSources = feedManager.MakeRestoreSourcesArgument(project, reachableFeeds);
|
||||||
var res = dotnet.Restore(new(project, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, NugetSources: nugetSources, TargetWindows: isWindows));
|
var res = dotnet.Restore(new(project, PackageDirectory.DirInfo.FullName, ForceDotnetRefAssemblyFetching: true, NugetSources: nugetSources, TargetWindows: isWindows));
|
||||||
assets.AddDependenciesRange(res.AssetsFilePaths);
|
assets.AddDependenciesRange(res.AssetsFilePaths);
|
||||||
lock (sync)
|
lock (sync)
|
||||||
@@ -450,7 +317,9 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
|
|
||||||
private AssemblyLookupLocation? DownloadMissingPackagesFromSpecificFeeds(IEnumerable<string> usedPackageNames, HashSet<string>? feedsFromNugetConfigs)
|
private AssemblyLookupLocation? DownloadMissingPackagesFromSpecificFeeds(IEnumerable<string> usedPackageNames, HashSet<string>? feedsFromNugetConfigs)
|
||||||
{
|
{
|
||||||
var reachableFallbackFeeds = GetReachableFallbackNugetFeeds(feedsFromNugetConfigs);
|
var reachableFallbackFeeds = feedManager.GetReachableFallbackNugetFeeds(feedsFromNugetConfigs);
|
||||||
|
compilationInfoContainer.CompilationInfos.Add(("Reachable fallback NuGet feed count", reachableFallbackFeeds.Count.ToString()));
|
||||||
|
|
||||||
if (reachableFallbackFeeds.Count > 0)
|
if (reachableFallbackFeeds.Count > 0)
|
||||||
{
|
{
|
||||||
return DownloadMissingPackages(usedPackageNames, fallbackNugetFeeds: reachableFallbackFeeds);
|
return DownloadMissingPackages(usedPackageNames, fallbackNugetFeeds: reachableFallbackFeeds);
|
||||||
@@ -736,147 +605,6 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<HttpResponseMessage> ExecuteGetRequest(string address, HttpClient httpClient, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
return await httpClient.GetAsync(address, HttpCompletionOption.ResponseHeadersRead, cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
private bool IsFeedReachable(string feed, int timeoutMilliSeconds, int tryCount, out bool isTimeout)
|
|
||||||
{
|
|
||||||
logger.LogInfo($"Checking if NuGet feed '{feed}' is reachable...");
|
|
||||||
|
|
||||||
// Configure the HttpClient to be aware of the Dependabot Proxy, if used.
|
|
||||||
HttpClientHandler httpClientHandler = new();
|
|
||||||
if (dependabotProxy != null)
|
|
||||||
{
|
|
||||||
httpClientHandler.Proxy = new WebProxy(dependabotProxy.Address);
|
|
||||||
|
|
||||||
if (dependabotProxy.Certificate != null)
|
|
||||||
{
|
|
||||||
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, _) =>
|
|
||||||
{
|
|
||||||
if (chain is null || cert is null)
|
|
||||||
{
|
|
||||||
var msg = cert is null && chain is null
|
|
||||||
? "certificate and chain"
|
|
||||||
: chain is null
|
|
||||||
? "chain"
|
|
||||||
: "certificate";
|
|
||||||
logger.LogWarning($"Dependabot proxy certificate validation failed due to missing {msg}");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
chain.ChainPolicy.TrustMode = X509ChainTrustMode.CustomRootTrust;
|
|
||||||
chain.ChainPolicy.CustomTrustStore.Add(dependabotProxy.Certificate);
|
|
||||||
return chain.Build(cert);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
using HttpClient client = new(httpClientHandler);
|
|
||||||
|
|
||||||
isTimeout = false;
|
|
||||||
|
|
||||||
for (var i = 0; i < tryCount; i++)
|
|
||||||
{
|
|
||||||
using var cts = new CancellationTokenSource();
|
|
||||||
cts.CancelAfter(timeoutMilliSeconds);
|
|
||||||
try
|
|
||||||
{
|
|
||||||
logger.LogInfo($"Attempt {i + 1}/{tryCount} to reach NuGet feed '{feed}'.");
|
|
||||||
using var response = ExecuteGetRequest(feed, client, cts.Token).GetAwaiter().GetResult();
|
|
||||||
response.EnsureSuccessStatusCode();
|
|
||||||
logger.LogInfo($"Querying NuGet feed '{feed}' succeeded.");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception exc)
|
|
||||||
{
|
|
||||||
if (exc is TaskCanceledException tce &&
|
|
||||||
tce.CancellationToken == cts.Token &&
|
|
||||||
cts.Token.IsCancellationRequested)
|
|
||||||
{
|
|
||||||
logger.LogInfo($"Didn't receive answer from NuGet feed '{feed}' in {timeoutMilliSeconds}ms.");
|
|
||||||
timeoutMilliSeconds *= 2;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.LogInfo($"Querying NuGet feed '{feed}' failed. The reason for the failure: {exc.Message}");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.LogWarning($"Didn't receive answer from NuGet feed '{feed}'. Tried it {tryCount} times.");
|
|
||||||
isTimeout = true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private (int initialTimeout, int tryCount) GetFeedRequestSettings(bool isFallback)
|
|
||||||
{
|
|
||||||
int timeoutMilliSeconds = isFallback && int.TryParse(Environment.GetEnvironmentVariable(EnvironmentVariableNames.NugetFeedResponsivenessInitialTimeoutForFallback), out timeoutMilliSeconds)
|
|
||||||
? timeoutMilliSeconds
|
|
||||||
: int.TryParse(Environment.GetEnvironmentVariable(EnvironmentVariableNames.NugetFeedResponsivenessInitialTimeout), out timeoutMilliSeconds)
|
|
||||||
? timeoutMilliSeconds
|
|
||||||
: 1000;
|
|
||||||
logger.LogDebug($"Initial timeout for NuGet feed reachability check is {timeoutMilliSeconds}ms.");
|
|
||||||
|
|
||||||
int tryCount = isFallback && int.TryParse(Environment.GetEnvironmentVariable(EnvironmentVariableNames.NugetFeedResponsivenessRequestCountForFallback), out tryCount)
|
|
||||||
? tryCount
|
|
||||||
: int.TryParse(Environment.GetEnvironmentVariable(EnvironmentVariableNames.NugetFeedResponsivenessRequestCount), out tryCount)
|
|
||||||
? tryCount
|
|
||||||
: 4;
|
|
||||||
logger.LogDebug($"Number of tries for NuGet feed reachability check is {tryCount}.");
|
|
||||||
|
|
||||||
return (timeoutMilliSeconds, tryCount);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Retrieves a list of excluded NuGet feeds from the corresponding environment variable.
|
|
||||||
/// </summary>
|
|
||||||
private HashSet<string> GetExcludedFeeds()
|
|
||||||
{
|
|
||||||
var excludedFeeds = EnvironmentVariables.GetURLs(EnvironmentVariableNames.ExcludedNugetFeedsFromResponsivenessCheck)
|
|
||||||
.ToHashSet();
|
|
||||||
|
|
||||||
if (excludedFeeds.Count > 0)
|
|
||||||
{
|
|
||||||
logger.LogInfo($"Excluded NuGet feeds from responsiveness check: {string.Join(", ", excludedFeeds.OrderBy(f => f))}");
|
|
||||||
}
|
|
||||||
|
|
||||||
return excludedFeeds;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Checks that we can connect to the specified NuGet feeds.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="feeds">The set of package feeds to check.</param>
|
|
||||||
/// <param name="reachableFeeds">The list of feeds that were reachable.</param>
|
|
||||||
/// <returns>
|
|
||||||
/// 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.
|
|
||||||
/// </returns>
|
|
||||||
private bool CheckSpecifiedFeeds(HashSet<string> feeds, out HashSet<string> reachableFeeds)
|
|
||||||
{
|
|
||||||
// Exclude any feeds from the feed check that are configured by the corresponding environment variable.
|
|
||||||
// These feeds are always assumed to be reachable.
|
|
||||||
var excludedFeeds = GetExcludedFeeds();
|
|
||||||
|
|
||||||
HashSet<string> feedsToCheck = feeds.Where(feed =>
|
|
||||||
{
|
|
||||||
if (excludedFeeds.Contains(feed))
|
|
||||||
{
|
|
||||||
logger.LogInfo($"Not checking reachability of NuGet feed '{feed}' as it is in the list of excluded feeds.");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}).ToHashSet();
|
|
||||||
|
|
||||||
reachableFeeds = GetReachableNuGetFeeds(feedsToCheck, isFallback: false, out var isTimeout).ToHashSet();
|
|
||||||
|
|
||||||
// Always consider feeds excluded for the reachability check as reachable.
|
|
||||||
reachableFeeds.UnionWith(feeds.Where(feed => excludedFeeds.Contains(feed)));
|
|
||||||
|
|
||||||
return isTimeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// If <paramref name="allFeedsReachable"/> is `false`, logs this and emits a diagnostic.
|
/// If <paramref name="allFeedsReachable"/> is `false`, logs this and emits a diagnostic.
|
||||||
/// Adds a `CompilationInfos` entry either way.
|
/// Adds a `CompilationInfos` entry either way.
|
||||||
@@ -899,56 +627,15 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
compilationInfoContainer.CompilationInfos.Add(("All NuGet feeds reachable", allFeedsReachable ? "1" : "0"));
|
compilationInfoContainer.CompilationInfos.Add(("All NuGet feeds reachable", allFeedsReachable ? "1" : "0"));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<string> GetFeeds(Func<IList<string>> getNugetFeeds)
|
private void EmitNugetConfigDiagnostics()
|
||||||
{
|
{
|
||||||
var results = getNugetFeeds();
|
|
||||||
var regex = EnabledNugetFeed();
|
|
||||||
foreach (var result in results)
|
|
||||||
{
|
|
||||||
var match = regex.Match(result);
|
|
||||||
if (!match.Success)
|
|
||||||
{
|
|
||||||
logger.LogError($"Failed to parse feed from '{result}'");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
var url = match.Groups[1].Value;
|
|
||||||
if (!url.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase) &&
|
|
||||||
!url.StartsWith("http://", StringComparison.InvariantCultureIgnoreCase))
|
|
||||||
{
|
|
||||||
logger.LogInfo($"Skipping feed '{url}' as it is not a valid URL.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(url))
|
|
||||||
{
|
|
||||||
yield return url;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private string? GetDirectoryName(string path)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
return new FileInfo(path).Directory?.FullName;
|
|
||||||
}
|
|
||||||
catch (Exception exc)
|
|
||||||
{
|
|
||||||
logger.LogWarning($"Failed to get directory of '{path}': {exc}");
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private (HashSet<string> explicitFeeds, HashSet<string> allFeeds) GetAllFeeds()
|
|
||||||
{
|
|
||||||
var nugetConfigs = fileProvider.NugetConfigs;
|
|
||||||
|
|
||||||
// On systems with case-sensitive file systems (for simplicity, we assume that is Linux), the
|
// On systems with case-sensitive file systems (for simplicity, we assume that is Linux), the
|
||||||
// filenames of NuGet configuration files must be named correctly. For compatibility with projects
|
// filenames of NuGet configuration files must be named correctly. For compatibility with projects
|
||||||
// that are typically built on Windows or macOS where this doesn't matter, we accept all variants
|
// that are typically built on Windows or macOS where this doesn't matter, we accept all variants
|
||||||
// of `nuget.config` ourselves. However, `dotnet` does not. If we detect that incorrectly-named
|
// of `nuget.config` ourselves. However, `dotnet` does not. If we detect that incorrectly-named
|
||||||
// files are present, we emit a diagnostic to warn the user.
|
// files are present, we emit a diagnostic to warn the user.
|
||||||
|
var nugetConfigs = fileProvider.NugetConfigs;
|
||||||
|
|
||||||
if (SystemBuildActions.Instance.IsLinux())
|
if (SystemBuildActions.Instance.IsLinux())
|
||||||
{
|
{
|
||||||
string[] acceptedNugetConfigNames = ["nuget.config", "NuGet.config", "NuGet.Config"];
|
string[] acceptedNugetConfigNames = ["nuget.config", "NuGet.config", "NuGet.Config"];
|
||||||
@@ -978,53 +665,6 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find feeds that are explicitly configured in the NuGet configuration files that we found.
|
|
||||||
var explicitFeeds = nugetConfigs
|
|
||||||
.SelectMany(config => GetFeeds(() => dotnet.GetNugetFeeds(config)))
|
|
||||||
.ToHashSet();
|
|
||||||
|
|
||||||
if (explicitFeeds.Count > 0)
|
|
||||||
{
|
|
||||||
logger.LogInfo($"Found {explicitFeeds.Count} NuGet feeds in nuget.config files: {string.Join(", ", explicitFeeds.OrderBy(f => f))}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
logger.LogDebug("No NuGet feeds found in nuget.config files.");
|
|
||||||
}
|
|
||||||
|
|
||||||
// If private package registries are configured for C#, then consider those
|
|
||||||
// in addition to the ones that are configured in `nuget.config` files.
|
|
||||||
if (hasPrivateRegistryFeeds)
|
|
||||||
{
|
|
||||||
logger.LogInfo($"Found {privateRegistryFeeds.Count} private registry feeds configured for C#: {string.Join(", ", privateRegistryFeeds.OrderBy(f => f))}");
|
|
||||||
explicitFeeds.UnionWith(privateRegistryFeeds);
|
|
||||||
}
|
|
||||||
|
|
||||||
HashSet<string> allFeeds = [];
|
|
||||||
|
|
||||||
// Add all explicitFeeds to the set of all feeds.
|
|
||||||
allFeeds.UnionWith(explicitFeeds);
|
|
||||||
|
|
||||||
// Obtain the list of feeds from the root source directory.
|
|
||||||
// If a NuGet file is present it will be respected, otherwise we will just get the machine/environment specific feeds.
|
|
||||||
var nugetFeedsFromRoot = GetFeeds(() => dotnet.GetNugetFeedsFromFolder(fileProvider.SourceDir.FullName));
|
|
||||||
allFeeds.UnionWith(nugetFeedsFromRoot);
|
|
||||||
|
|
||||||
if (nugetConfigs.Count > 0)
|
|
||||||
{
|
|
||||||
var nugetConfigFeeds = nugetConfigs
|
|
||||||
.Select(GetDirectoryName)
|
|
||||||
.Where(folder => folder != null)
|
|
||||||
.SelectMany(folder => GetFeeds(() => dotnet.GetNugetFeedsFromFolder(folder!)))
|
|
||||||
.ToHashSet();
|
|
||||||
|
|
||||||
allFeeds.UnionWith(nugetConfigFeeds);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.LogInfo($"Found {allFeeds.Count} NuGet feeds (with inherited ones) in nuget.config files: {string.Join(", ", allFeeds.OrderBy(f => f))}");
|
|
||||||
|
|
||||||
return (explicitFeeds, allFeeds);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[GeneratedRegex(@"<TargetFramework>.*</TargetFramework>", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline)]
|
[GeneratedRegex(@"<TargetFramework>.*</TargetFramework>", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline)]
|
||||||
@@ -1036,15 +676,12 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
[GeneratedRegex(@"^(.+)\.(\d+\.\d+\.\d+(-(.+))?)$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline)]
|
[GeneratedRegex(@"^(.+)\.(\d+\.\d+\.\d+(-(.+))?)$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline)]
|
||||||
private static partial Regex LegacyNugetPackage();
|
private static partial Regex LegacyNugetPackage();
|
||||||
|
|
||||||
[GeneratedRegex(@"^E\s(.*)$", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline)]
|
|
||||||
private static partial Regex EnabledNugetFeed();
|
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
{
|
{
|
||||||
PackageDirectory?.Dispose();
|
PackageDirectory?.Dispose();
|
||||||
legacyPackageDirectory?.Dispose();
|
legacyPackageDirectory?.Dispose();
|
||||||
missingPackageDirectory?.Dispose();
|
missingPackageDirectory?.Dispose();
|
||||||
emptyPackageDirectory?.Dispose();
|
feedManager.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
return new NugetExeWrapper(fileProvider, packageDirectory, logger, useDefaultFeed);
|
return new NugetExeWrapper(fileProvider, packageDirectory, logger, useDefaultFeed);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new NoOpPackagesConfig(fileProvider, logger);
|
return new NoOpPackagesConfig(fileProvider.PackagesConfigs, logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -302,7 +302,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
private void AddDefaultPackageSource(string nugetConfig)
|
private void AddDefaultPackageSource(string nugetConfig)
|
||||||
{
|
{
|
||||||
logger.LogInfo("Adding default package source...");
|
logger.LogInfo("Adding default package source...");
|
||||||
RunMonoNugetCommand($"sources add -Name DefaultNugetOrg -Source {NugetPackageRestorer.PublicNugetOrgFeed} -ConfigFile \"{nugetConfig}\"", out _);
|
RunMonoNugetCommand($"sources add -Name DefaultNugetOrg -Source {FeedManager.PublicNugetOrgFeed} -ConfigFile \"{nugetConfig}\"", out _);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
@@ -343,15 +343,15 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
|||||||
private class NoOpPackagesConfig : IPackagesConfigRestore
|
private class NoOpPackagesConfig : IPackagesConfigRestore
|
||||||
{
|
{
|
||||||
private readonly Semmle.Util.Logging.ILogger logger;
|
private readonly Semmle.Util.Logging.ILogger logger;
|
||||||
private readonly FileProvider fileProvider;
|
private readonly ICollection<string> packagesConfigs;
|
||||||
|
|
||||||
public NoOpPackagesConfig(FileProvider fileProvider, Semmle.Util.Logging.ILogger logger)
|
public NoOpPackagesConfig(ICollection<string> packagesConfigs, Semmle.Util.Logging.ILogger logger)
|
||||||
{
|
{
|
||||||
this.fileProvider = fileProvider;
|
this.packagesConfigs = packagesConfigs;
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int PackageCount => fileProvider.PackagesConfigs.Count;
|
public int PackageCount => packagesConfigs.Count;
|
||||||
|
|
||||||
public int InstallPackages()
|
public int InstallPackages()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -75,7 +75,8 @@ module Ast implements AstSig<Location> {
|
|||||||
|
|
||||||
additional predicate skipControlFlow(AstNode e) {
|
additional predicate skipControlFlow(AstNode e) {
|
||||||
e instanceof TypeAccess and
|
e instanceof TypeAccess and
|
||||||
not e instanceof TypeAccessPatternExpr
|
not e instanceof TypeAccessPatternExpr and
|
||||||
|
not any(CS::SpecificCatchClause sc).getTypeAccess() = e
|
||||||
or
|
or
|
||||||
not e.getFile().fromSource()
|
not e.getFile().fromSource()
|
||||||
}
|
}
|
||||||
@@ -220,7 +221,12 @@ module Ast implements AstSig<Location> {
|
|||||||
final private class FinalCatchClause = CS::CatchClause;
|
final private class FinalCatchClause = CS::CatchClause;
|
||||||
|
|
||||||
class CatchClause extends FinalCatchClause {
|
class CatchClause extends FinalCatchClause {
|
||||||
AstNode getVariable() { result = this.(CS::SpecificCatchClause).getVariableDeclExpr() }
|
AstNode getPattern() {
|
||||||
|
result = this.(CS::SpecificCatchClause).getVariableDeclExpr() or
|
||||||
|
result = this.(CS::SpecificCatchClause).getTypeAccess()
|
||||||
|
}
|
||||||
|
|
||||||
|
AstNode getVariable() { none() }
|
||||||
|
|
||||||
Expr getCondition() { result = this.getFilterClause() }
|
Expr getCondition() { result = this.getFilterClause() }
|
||||||
|
|
||||||
|
|||||||
@@ -447,13 +447,13 @@
|
|||||||
| ExitMethods.cs:20:10:20:11 | Entry | ExitMethods.cs:20:10:20:11 | Exit | 8 |
|
| ExitMethods.cs:20:10:20:11 | Entry | ExitMethods.cs:20:10:20:11 | Exit | 8 |
|
||||||
| ExitMethods.cs:26:10:26:11 | Entry | ExitMethods.cs:26:10:26:11 | Exit | 8 |
|
| ExitMethods.cs:26:10:26:11 | Entry | ExitMethods.cs:26:10:26:11 | Exit | 8 |
|
||||||
| ExitMethods.cs:32:10:32:11 | Entry | ExitMethods.cs:32:10:32:11 | Exit | 8 |
|
| ExitMethods.cs:32:10:32:11 | Entry | ExitMethods.cs:32:10:32:11 | Exit | 8 |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:44:9:47:9 | catch (...) {...} | 9 |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:44:16:44:32 | access to type ArgumentException | 10 |
|
||||||
| ExitMethods.cs:38:10:38:11 | Exit | ExitMethods.cs:38:10:38:11 | Exit | 1 |
|
| ExitMethods.cs:38:10:38:11 | Exit | ExitMethods.cs:38:10:38:11 | Exit | 1 |
|
||||||
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:38:10:38:11 | Normal Exit | 1 |
|
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:38:10:38:11 | Normal Exit | 1 |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] | ExitMethods.cs:46:13:46:19 | return ...; | 4 |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] | ExitMethods.cs:46:13:46:19 | return ...; | 4 |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | catch (...) {...} | 2 |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:48:16:48:24 | access to type Exception | 4 |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | ExitMethods.cs:50:13:50:19 | return ...; | 4 |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | ExitMethods.cs:50:13:50:19 | return ...; | 4 |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | Exceptional Exit | 2 |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] | ExitMethods.cs:38:10:38:11 | Exceptional Exit | 3 |
|
||||||
| ExitMethods.cs:54:10:54:11 | Entry | ExitMethods.cs:54:10:54:11 | Exit | 7 |
|
| ExitMethods.cs:54:10:54:11 | Entry | ExitMethods.cs:54:10:54:11 | Exit | 7 |
|
||||||
| ExitMethods.cs:60:10:60:11 | Entry | ExitMethods.cs:60:10:60:11 | Exit | 7 |
|
| ExitMethods.cs:60:10:60:11 | Entry | ExitMethods.cs:60:10:60:11 | Exit | 7 |
|
||||||
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:68:13:68:13 | access to parameter b | 5 |
|
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:68:13:68:13 | access to parameter b | 5 |
|
||||||
@@ -508,13 +508,13 @@
|
|||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:19:10:19:11 | Normal Exit | 1 |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:19:10:19:11 | Normal Exit | 1 |
|
||||||
| Finally.cs:21:9:51:9 | After try {...} ... | Finally.cs:20:5:52:5 | After {...} | 2 |
|
| Finally.cs:21:9:51:9 | After try {...} ... | Finally.cs:20:5:52:5 | After {...} | 2 |
|
||||||
| Finally.cs:23:13:23:37 | After call to method WriteLine | Finally.cs:24:13:24:19 | return ...; | 4 |
|
| Finally.cs:23:13:23:37 | After call to method WriteLine | Finally.cs:24:13:24:19 | return ...; | 4 |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [match] | Finally.cs:28:13:28:18 | throw ...; | 7 |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:38:26:39 | IOException ex | 2 |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | catch (...) {...} | 2 |
|
| Finally.cs:26:38:26:39 | After IOException ex [match] | Finally.cs:28:13:28:18 | throw ...; | 6 |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | catch (...) {...} | 1 |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:30:41:30:42 | ArgumentException ex | 4 |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [match] | Finally.cs:38:17:38:44 | throw ...; | 17 |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [match] | Finally.cs:38:17:38:44 | throw ...; | 16 |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | catch (...) {...} | 2 |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:41:16:41:24 | access to type Exception | 4 |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [match] | Finally.cs:42:9:43:9 | {...} | 2 |
|
| Finally.cs:41:16:41:24 | After access to type Exception [match] | Finally.cs:42:9:43:9 | {...} | 2 |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:46:13:46:19 | return ...; | 6 |
|
| Finally.cs:41:16:41:24 | After access to type Exception [no-match] | Finally.cs:46:13:46:19 | return ...; | 6 |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:49:9:51:9 | After {...} | 8 |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:49:9:51:9 | After {...} | 8 |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:58:13:58:37 | call to method WriteLine | 8 |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:58:13:58:37 | call to method WriteLine | 8 |
|
||||||
| Finally.cs:54:10:54:11 | Exceptional Exit | Finally.cs:54:10:54:11 | Exceptional Exit | 1 |
|
| Finally.cs:54:10:54:11 | Exceptional Exit | Finally.cs:54:10:54:11 | Exceptional Exit | 1 |
|
||||||
@@ -522,11 +522,12 @@
|
|||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:54:10:54:11 | Normal Exit | 1 |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:54:10:54:11 | Normal Exit | 1 |
|
||||||
| Finally.cs:56:9:71:9 | After try {...} ... | Finally.cs:55:5:72:5 | After {...} | 2 |
|
| Finally.cs:56:9:71:9 | After try {...} ... | Finally.cs:55:5:72:5 | After {...} | 2 |
|
||||||
| Finally.cs:58:13:58:37 | After call to method WriteLine | Finally.cs:59:13:59:19 | return ...; | 4 |
|
| Finally.cs:58:13:58:37 | After call to method WriteLine | Finally.cs:59:13:59:19 | return ...; | 4 |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [match] | Finally.cs:63:13:63:18 | throw ...; | 7 |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:38:61:39 | IOException ex | 2 |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | catch (...) {...} | 2 |
|
| Finally.cs:61:38:61:39 | After IOException ex [match] | Finally.cs:63:13:63:18 | throw ...; | 6 |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | catch (...) {...} | 1 |
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:65:26:65:26 | Exception e | 4 |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:65:35:65:51 | ... != ... | 9 |
|
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | 1 |
|
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | 1 |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:65:35:65:51 | ... != ... | 8 |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [no-match] | Finally.cs:65:26:65:26 | After Exception e [no-match] | 1 |
|
||||||
| Finally.cs:65:35:65:51 | After ... != ... [false] | Finally.cs:65:35:65:51 | After ... != ... [false] | 1 |
|
| Finally.cs:65:35:65:51 | After ... != ... [false] | Finally.cs:65:35:65:51 | After ... != ... [false] | 1 |
|
||||||
| Finally.cs:65:35:65:51 | After ... != ... [true] | Finally.cs:66:9:67:9 | {...} | 2 |
|
| Finally.cs:65:35:65:51 | After ... != ... [true] | Finally.cs:66:9:67:9 | {...} | 2 |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:69:9:71:9 | After {...} | 8 |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:69:9:71:9 | After {...} | 8 |
|
||||||
@@ -589,9 +590,10 @@
|
|||||||
| Finally.cs:158:21:158:36 | After ... == ... [false] | Finally.cs:157:13:160:13 | After {...} | 3 |
|
| Finally.cs:158:21:158:36 | After ... == ... [false] | Finally.cs:157:13:160:13 | After {...} | 3 |
|
||||||
| Finally.cs:158:21:158:36 | After ... == ... [true] | Finally.cs:159:27:159:44 | object creation of type Exception | 5 |
|
| Finally.cs:158:21:158:36 | After ... == ... [true] | Finally.cs:159:27:159:44 | object creation of type Exception | 5 |
|
||||||
| Finally.cs:159:27:159:44 | After object creation of type Exception | Finally.cs:159:21:159:45 | throw ...; | 2 |
|
| Finally.cs:159:27:159:44 | After object creation of type Exception | Finally.cs:159:21:159:45 | throw ...; | 2 |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:161:39:161:54 | ... == ... | 9 |
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:166:13:168:13 | After {...} | 10 |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:166:13:168:13 | After {...} | 11 |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:30:161:30 | Exception e | 2 |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | catch (...) {...} | 1 |
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:161:39:161:54 | ... == ... | 8 |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [no-match] | Finally.cs:161:30:161:30 | After Exception e [no-match] | 1 |
|
||||||
| Finally.cs:161:39:161:54 | After ... == ... [false] | Finally.cs:161:39:161:54 | After ... == ... [false] | 1 |
|
| Finally.cs:161:39:161:54 | After ... == ... [false] | Finally.cs:161:39:161:54 | After ... == ... [false] | 1 |
|
||||||
| Finally.cs:161:39:161:54 | After ... == ... [true] | Finally.cs:162:13:164:13 | After {...} | 13 |
|
| Finally.cs:161:39:161:54 | After ... == ... [true] | Finally.cs:162:13:164:13 | After {...} | 13 |
|
||||||
| Finally.cs:172:11:172:20 | Entry | Finally.cs:172:11:172:20 | Exit | 11 |
|
| Finally.cs:172:11:172:20 | Entry | Finally.cs:172:11:172:20 | Exit | 11 |
|
||||||
@@ -609,9 +611,10 @@
|
|||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [false] | Finally.cs:185:13:187:13 | After {...} | 3 |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [false] | Finally.cs:185:13:187:13 | After {...} | 3 |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:186:31:186:46 | object creation of type ExceptionB | 4 |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:186:31:186:46 | object creation of type ExceptionB | 4 |
|
||||||
| Finally.cs:186:31:186:46 | After object creation of type ExceptionB | Finally.cs:186:25:186:47 | throw ...; | 2 |
|
| Finally.cs:186:31:186:46 | After object creation of type ExceptionB | Finally.cs:186:25:186:47 | throw ...; | 2 |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:38:188:39 | access to parameter b2 | 2 |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | 1 |
|
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | 1 |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | catch (...) {...} | 1 |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:20:188:29 | access to type ExceptionB | 2 |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:38:188:39 | access to parameter b2 | 2 |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] | 1 |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] | 1 |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] | 1 |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | access to parameter b1 | 4 |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | access to parameter b1 | 4 |
|
||||||
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:189:13:191:13 | After {...} | 3 |
|
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:189:13:191:13 | After {...} | 3 |
|
||||||
@@ -633,7 +636,7 @@
|
|||||||
| Finally.cs:209:21:209:22 | After access to parameter b3 [true] | Finally.cs:209:25:209:47 | throw ...; | 6 |
|
| Finally.cs:209:21:209:22 | After access to parameter b3 [true] | Finally.cs:209:25:209:47 | throw ...; | 6 |
|
||||||
| Finally.cs:216:10:216:12 | Entry | Finally.cs:220:13:220:36 | call to method WriteLine | 8 |
|
| Finally.cs:216:10:216:12 | Entry | Finally.cs:220:13:220:36 | call to method WriteLine | 8 |
|
||||||
| Finally.cs:220:13:220:36 | After call to method WriteLine | Finally.cs:219:9:221:9 | After {...} | 3 |
|
| Finally.cs:220:13:220:36 | After call to method WriteLine | Finally.cs:219:9:221:9 | After {...} | 3 |
|
||||||
| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:223:9:225:9 | After {...} | 10 |
|
| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:223:9:225:9 | After {...} | 9 |
|
||||||
| Finally.cs:227:9:229:9 | {...} | Finally.cs:216:10:216:12 | Exit | 18 |
|
| Finally.cs:227:9:229:9 | {...} | Finally.cs:216:10:216:12 | Exit | 18 |
|
||||||
| Finally.cs:233:10:233:12 | Entry | Finally.cs:239:21:239:22 | access to parameter b1 | 10 |
|
| Finally.cs:233:10:233:12 | Entry | Finally.cs:239:21:239:22 | access to parameter b1 | 10 |
|
||||||
| Finally.cs:233:10:233:12 | Exceptional Exit | Finally.cs:233:10:233:12 | Exceptional Exit | 1 |
|
| Finally.cs:233:10:233:12 | Exceptional Exit | Finally.cs:233:10:233:12 | Exceptional Exit | 1 |
|
||||||
|
|||||||
@@ -264,12 +264,12 @@ conditionBlock
|
|||||||
| DefaultParam.cs:3:12:3:13 | Entry | DefaultParam.cs:3:30:3:30 | After s [no-match] | false |
|
| DefaultParam.cs:3:12:3:13 | Entry | DefaultParam.cs:3:30:3:30 | After s [no-match] | false |
|
||||||
| DefaultParam.cs:3:42:3:42 | i | DefaultParam.cs:3:42:3:42 | After i [match] | true |
|
| DefaultParam.cs:3:42:3:42 | i | DefaultParam.cs:3:42:3:42 | After i [match] | true |
|
||||||
| DefaultParam.cs:3:42:3:42 | i | DefaultParam.cs:3:42:3:42 | After i [no-match] | false |
|
| DefaultParam.cs:3:42:3:42 | i | DefaultParam.cs:3:42:3:42 | After i [no-match] | false |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] | true |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] | true |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | false |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | false |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | false |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | false |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | false |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] | false |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | true |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | true |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | false |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] | false |
|
||||||
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:68:13:68:13 | After access to parameter b [false] | false |
|
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:68:13:68:13 | After access to parameter b [false] | false |
|
||||||
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:68:13:68:13 | After access to parameter b [true] | true |
|
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:68:13:68:13 | After access to parameter b [true] | true |
|
||||||
| ExitMethods.cs:72:17:72:27 | Entry | ExitMethods.cs:74:13:74:13 | After access to parameter b [false] | false |
|
| ExitMethods.cs:72:17:72:27 | Entry | ExitMethods.cs:74:13:74:13 | After access to parameter b [false] | false |
|
||||||
@@ -280,29 +280,31 @@ conditionBlock
|
|||||||
| ExitMethods.cs:115:16:115:34 | Entry | ExitMethods.cs:117:16:117:30 | After call to method Contains [true] | true |
|
| ExitMethods.cs:115:16:115:34 | Entry | ExitMethods.cs:117:16:117:30 | After call to method Contains [true] | true |
|
||||||
| ExitMethods.cs:140:17:140:42 | Entry | ExitMethods.cs:142:13:142:13 | After access to parameter b [false] | false |
|
| ExitMethods.cs:140:17:140:42 | Entry | ExitMethods.cs:142:13:142:13 | After access to parameter b [false] | false |
|
||||||
| ExitMethods.cs:140:17:140:42 | Entry | ExitMethods.cs:142:13:142:13 | After access to parameter b [true] | true |
|
| ExitMethods.cs:140:17:140:42 | Entry | ExitMethods.cs:142:13:142:13 | After access to parameter b [true] | true |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | After catch (...) {...} [match] | true |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:38:26:39 | After IOException ex [match] | true |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | false |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:38:26:39 | After IOException ex [no-match] | false |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [match] | false |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:30:41:30:42 | After ArgumentException ex [match] | false |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | false |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | false |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [match] | true |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:41:16:41:24 | After access to type Exception [match] | false |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | false |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:41:16:41:24 | After access to type Exception [no-match] | false |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [match] | false |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:30:41:30:42 | After ArgumentException ex [match] | true |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | false |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | false |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [match] | false |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [match] | false |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | false |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [no-match] | false |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [match] | true |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [match] | true |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | false |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [no-match] | false |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [match] | true |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:38:61:39 | After IOException ex [match] | true |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:35:65:51 | After ... != ... [false] | true |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:38:61:39 | After IOException ex [no-match] | false |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:35:65:51 | After ... != ... [true] | true |
|
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [match] | true |
|
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | false |
|
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [match] | false |
|
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | false |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | false |
|
||||||
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:26:65:26 | After Exception e [match] | false |
|
||||||
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:26:65:26 | After Exception e [no-match] | false |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:35:65:51 | After ... != ... [false] | false |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:35:65:51 | After ... != ... [false] | false |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:35:65:51 | After ... != ... [true] | false |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:35:65:51 | After ... != ... [true] | false |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:65:35:65:51 | After ... != ... [false] | false |
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:65:26:65:26 | After Exception e [match] | true |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:65:35:65:51 | After ... != ... [true] | true |
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:65:26:65:26 | After Exception e [no-match] | false |
|
||||||
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:65:35:65:51 | After ... != ... [false] | true |
|
||||||
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:65:35:65:51 | After ... != ... [true] | true |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:65:35:65:51 | After ... != ... [false] | false |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:65:35:65:51 | After ... != ... [true] | true |
|
||||||
| Finally.cs:77:9:100:9 | [LoopHeader] while (...) ... | Finally.cs:74:10:74:11 | Exceptional Exit | true |
|
| Finally.cs:77:9:100:9 | [LoopHeader] while (...) ... | Finally.cs:74:10:74:11 | Exceptional Exit | true |
|
||||||
| Finally.cs:77:9:100:9 | [LoopHeader] while (...) ... | Finally.cs:77:16:77:20 | After ... > ... [false] | false |
|
| Finally.cs:77:9:100:9 | [LoopHeader] while (...) ... | Finally.cs:77:16:77:20 | After ... > ... [false] | false |
|
||||||
| Finally.cs:77:9:100:9 | [LoopHeader] while (...) ... | Finally.cs:77:16:77:20 | After ... > ... [true] | true |
|
| Finally.cs:77:9:100:9 | [LoopHeader] while (...) ... | Finally.cs:77:16:77:20 | After ... > ... [true] | true |
|
||||||
@@ -354,33 +356,36 @@ conditionBlock
|
|||||||
| Finally.cs:158:21:158:31 | After access to property Length | Finally.cs:158:21:158:36 | After ... == ... [false] | false |
|
| Finally.cs:158:21:158:31 | After access to property Length | Finally.cs:158:21:158:36 | After ... == ... [false] | false |
|
||||||
| Finally.cs:158:21:158:31 | After access to property Length | Finally.cs:158:21:158:36 | After ... == ... [true] | true |
|
| Finally.cs:158:21:158:31 | After access to property Length | Finally.cs:158:21:158:36 | After ... == ... [true] | true |
|
||||||
| Finally.cs:158:21:158:31 | After access to property Length | Finally.cs:159:27:159:44 | After object creation of type Exception | true |
|
| Finally.cs:158:21:158:31 | After access to property Length | Finally.cs:159:27:159:44 | After object creation of type Exception | true |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:161:39:161:54 | After ... == ... [false] | false |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:30:161:30 | After Exception e [match] | true |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:161:39:161:54 | After ... == ... [true] | true |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:30:161:30 | After Exception e [no-match] | false |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [match] | true |
|
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:39:161:54 | After ... == ... [false] | true |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:39:161:54 | After ... == ... [false] | true |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:39:161:54 | After ... == ... [true] | true |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:39:161:54 | After ... == ... [true] | true |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:161:39:161:54 | After ... == ... [false] | false |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:161:39:161:54 | After ... == ... [true] | true |
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:180:17:180:18 | After access to parameter b1 [false] | false |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:180:17:180:18 | After access to parameter b1 [false] | false |
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:180:17:180:18 | After access to parameter b1 [true] | true |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:180:17:180:18 | After access to parameter b1 [true] | true |
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:180:27:180:42 | After object creation of type ExceptionA | true |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:180:27:180:42 | After object creation of type ExceptionA | true |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:21:186:22 | After access to parameter b2 [false] | false |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:21:186:22 | After access to parameter b2 [false] | false |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:21:186:22 | After access to parameter b2 [true] | true |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:21:186:22 | After access to parameter b2 [true] | true |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:31:186:46 | After object creation of type ExceptionB | true |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:31:186:46 | After object creation of type ExceptionB | true |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [match] | true |
|
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | true |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | true |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | catch (...) {...} | true |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | catch (...) {...} | true |
|
||||||
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | true |
|
||||||
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] | true |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [false] | true |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [false] | true |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [true] | true |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [true] | true |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [false] | true |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [false] | true |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [true] | true |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [true] | true |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] | false |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | true |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] | true |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] | false |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] | true |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:190:21:190:22 | After access to parameter b1 [true] | true |
|
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [match] | true |
|
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [false] | true |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [false] | true |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [true] | true |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [true] | true |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [false] | true |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [false] | true |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [true] | true |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [true] | true |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] | false |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] | true |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] | true |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:190:21:190:22 | After access to parameter b1 [true] | true |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] | false |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] | false |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [true] | true |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [true] | true |
|
||||||
| Finally.cs:195:10:195:12 | Entry | Finally.cs:199:17:199:18 | After access to parameter b1 [false] | false |
|
| Finally.cs:195:10:195:12 | Entry | Finally.cs:199:17:199:18 | After access to parameter b1 [false] | false |
|
||||||
|
|||||||
@@ -2816,16 +2816,20 @@ dominance
|
|||||||
| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | catch (...) {...} |
|
| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | catch (...) {...} |
|
||||||
| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:13:42:30 | Before call to method ErrorAlways |
|
| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:13:42:30 | Before call to method ErrorAlways |
|
||||||
| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways |
|
| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] | ExitMethods.cs:45:9:47:9 | {...} |
|
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | catch (...) {...} |
|
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | catch (...) {...} |
|
||||||
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:44:16:44:32 | access to type ArgumentException |
|
||||||
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] | ExitMethods.cs:45:9:47:9 | {...} |
|
||||||
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] |
|
||||||
|
| ExitMethods.cs:44:16:44:32 | access to type ArgumentException | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] |
|
||||||
|
| ExitMethods.cs:44:16:44:32 | access to type ArgumentException | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] |
|
||||||
| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:46:13:46:19 | Before return ...; |
|
| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:46:13:46:19 | Before return ...; |
|
||||||
| ExitMethods.cs:46:13:46:19 | Before return ...; | ExitMethods.cs:46:13:46:19 | return ...; |
|
| ExitMethods.cs:46:13:46:19 | Before return ...; | ExitMethods.cs:46:13:46:19 | return ...; |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | ExitMethods.cs:49:9:51:9 | {...} |
|
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | Exceptional Exit |
|
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | Exceptional Exit |
|
||||||
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:48:16:48:24 | access to type Exception |
|
||||||
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | ExitMethods.cs:49:9:51:9 | {...} |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | access to type Exception | ExitMethods.cs:48:16:48:24 | After access to type Exception [match] |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | access to type Exception | ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] |
|
||||||
| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:50:13:50:19 | Before return ...; |
|
| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:50:13:50:19 | Before return ...; |
|
||||||
| ExitMethods.cs:50:13:50:19 | Before return ...; | ExitMethods.cs:50:13:50:19 | return ...; |
|
| ExitMethods.cs:50:13:50:19 | Before return ...; | ExitMethods.cs:50:13:50:19 | return ...; |
|
||||||
| ExitMethods.cs:54:10:54:11 | Entry | ExitMethods.cs:55:5:58:5 | {...} |
|
| ExitMethods.cs:54:10:54:11 | Entry | ExitMethods.cs:55:5:58:5 | {...} |
|
||||||
@@ -3124,20 +3128,22 @@ dominance
|
|||||||
| Finally.cs:23:13:23:38 | After ...; | Finally.cs:24:13:24:19 | Before return ...; |
|
| Finally.cs:23:13:23:38 | After ...; | Finally.cs:24:13:24:19 | Before return ...; |
|
||||||
| Finally.cs:23:31:23:36 | "Try2" | Finally.cs:23:13:23:37 | call to method WriteLine |
|
| Finally.cs:23:31:23:36 | "Try2" | Finally.cs:23:13:23:37 | call to method WriteLine |
|
||||||
| Finally.cs:24:13:24:19 | Before return ...; | Finally.cs:24:13:24:19 | return ...; |
|
| Finally.cs:24:13:24:19 | Before return ...; | Finally.cs:24:13:24:19 | return ...; |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [match] | Finally.cs:26:38:26:39 | IOException ex |
|
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | catch (...) {...} |
|
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | catch (...) {...} |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [match] |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:38:26:39 | IOException ex |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:26:38:26:39 | After IOException ex [match] | Finally.cs:26:48:26:51 | true |
|
||||||
| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:26:48:26:51 | true |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:26:38:26:39 | After IOException ex [match] |
|
||||||
|
| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:26:38:26:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:26:48:26:51 | After true [true] | Finally.cs:27:9:29:9 | {...} |
|
| Finally.cs:26:48:26:51 | After true [true] | Finally.cs:27:9:29:9 | {...} |
|
||||||
| Finally.cs:26:48:26:51 | true | Finally.cs:26:48:26:51 | After true [true] |
|
| Finally.cs:26:48:26:51 | true | Finally.cs:26:48:26:51 | After true [true] |
|
||||||
| Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | Before throw ...; |
|
| Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | Before throw ...; |
|
||||||
| Finally.cs:28:13:28:18 | Before throw ...; | Finally.cs:28:13:28:18 | throw ...; |
|
| Finally.cs:28:13:28:18 | Before throw ...; | Finally.cs:28:13:28:18 | throw ...; |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [match] | Finally.cs:30:41:30:42 | ArgumentException ex |
|
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | catch (...) {...} |
|
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | catch (...) {...} |
|
||||||
| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [match] |
|
| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:30:41:30:42 | ArgumentException ex |
|
||||||
| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [match] | Finally.cs:31:9:40:9 | {...} |
|
||||||
| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:31:9:40:9 | {...} |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:30:41:30:42 | After ArgumentException ex [match] |
|
||||||
|
| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] |
|
||||||
| Finally.cs:31:9:40:9 | {...} | Finally.cs:32:13:39:13 | try {...} ... |
|
| Finally.cs:31:9:40:9 | {...} | Finally.cs:32:13:39:13 | try {...} ... |
|
||||||
| Finally.cs:32:13:39:13 | try {...} ... | Finally.cs:33:13:35:13 | {...} |
|
| Finally.cs:32:13:39:13 | try {...} ... | Finally.cs:33:13:35:13 | {...} |
|
||||||
| Finally.cs:33:13:35:13 | {...} | Finally.cs:34:17:34:32 | if (...) ... |
|
| Finally.cs:33:13:35:13 | {...} | Finally.cs:34:17:34:32 | if (...) ... |
|
||||||
@@ -3152,12 +3158,13 @@ dominance
|
|||||||
| Finally.cs:38:23:38:43 | Before object creation of type Exception | Finally.cs:38:37:38:42 | "Boo!" |
|
| Finally.cs:38:23:38:43 | Before object creation of type Exception | Finally.cs:38:37:38:42 | "Boo!" |
|
||||||
| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:38:23:38:43 | After object creation of type Exception |
|
| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:38:23:38:43 | After object creation of type Exception |
|
||||||
| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:38:23:38:43 | object creation of type Exception |
|
| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:38:23:38:43 | object creation of type Exception |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [match] | Finally.cs:42:9:43:9 | {...} |
|
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:44:9:47:9 | catch {...} |
|
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:44:9:47:9 | catch {...} |
|
||||||
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [match] |
|
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:41:16:41:24 | access to type Exception |
|
||||||
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:41:16:41:24 | After access to type Exception [match] | Finally.cs:42:9:43:9 | {...} |
|
||||||
| Finally.cs:44:9:47:9 | After catch {...} [match] | Finally.cs:45:9:47:9 | {...} |
|
| Finally.cs:41:16:41:24 | After access to type Exception [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:44:9:47:9 | After catch {...} [match] |
|
| Finally.cs:41:16:41:24 | access to type Exception | Finally.cs:41:16:41:24 | After access to type Exception [match] |
|
||||||
|
| Finally.cs:41:16:41:24 | access to type Exception | Finally.cs:41:16:41:24 | After access to type Exception [no-match] |
|
||||||
|
| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:45:9:47:9 | {...} |
|
||||||
| Finally.cs:45:9:47:9 | {...} | Finally.cs:46:13:46:19 | Before return ...; |
|
| Finally.cs:45:9:47:9 | {...} | Finally.cs:46:13:46:19 | Before return ...; |
|
||||||
| Finally.cs:46:13:46:19 | Before return ...; | Finally.cs:46:13:46:19 | return ...; |
|
| Finally.cs:46:13:46:19 | Before return ...; | Finally.cs:46:13:46:19 | return ...; |
|
||||||
| Finally.cs:49:9:51:9 | After {...} | Finally.cs:19:10:19:11 | Exceptional Exit |
|
| Finally.cs:49:9:51:9 | After {...} | Finally.cs:19:10:19:11 | Exceptional Exit |
|
||||||
@@ -3183,19 +3190,20 @@ dominance
|
|||||||
| Finally.cs:58:13:58:38 | After ...; | Finally.cs:59:13:59:19 | Before return ...; |
|
| Finally.cs:58:13:58:38 | After ...; | Finally.cs:59:13:59:19 | Before return ...; |
|
||||||
| Finally.cs:58:31:58:36 | "Try3" | Finally.cs:58:13:58:37 | call to method WriteLine |
|
| Finally.cs:58:31:58:36 | "Try3" | Finally.cs:58:13:58:37 | call to method WriteLine |
|
||||||
| Finally.cs:59:13:59:19 | Before return ...; | Finally.cs:59:13:59:19 | return ...; |
|
| Finally.cs:59:13:59:19 | Before return ...; | Finally.cs:59:13:59:19 | return ...; |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [match] | Finally.cs:61:38:61:39 | IOException ex |
|
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | catch (...) {...} |
|
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | catch (...) {...} |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [match] |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:38:61:39 | IOException ex |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:61:38:61:39 | After IOException ex [match] | Finally.cs:61:48:61:51 | true |
|
||||||
| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:61:48:61:51 | true |
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:61:38:61:39 | After IOException ex [match] |
|
||||||
|
| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:61:38:61:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:61:48:61:51 | After true [true] | Finally.cs:62:9:64:9 | {...} |
|
| Finally.cs:61:48:61:51 | After true [true] | Finally.cs:62:9:64:9 | {...} |
|
||||||
| Finally.cs:61:48:61:51 | true | Finally.cs:61:48:61:51 | After true [true] |
|
| Finally.cs:61:48:61:51 | true | Finally.cs:61:48:61:51 | After true [true] |
|
||||||
| Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | Before throw ...; |
|
| Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | Before throw ...; |
|
||||||
| Finally.cs:63:13:63:18 | Before throw ...; | Finally.cs:63:13:63:18 | throw ...; |
|
| Finally.cs:63:13:63:18 | Before throw ...; | Finally.cs:63:13:63:18 | throw ...; |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:65:26:65:26 | Exception e |
|
| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:65:26:65:26 | Exception e |
|
||||||
| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [match] |
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:65:35:65:51 | Before ... != ... |
|
||||||
| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:65:26:65:26 | Exception e | Finally.cs:65:26:65:26 | After Exception e [match] |
|
||||||
| Finally.cs:65:26:65:26 | Exception e | Finally.cs:65:35:65:51 | Before ... != ... |
|
| Finally.cs:65:26:65:26 | Exception e | Finally.cs:65:26:65:26 | After Exception e [no-match] |
|
||||||
| Finally.cs:65:35:65:35 | access to local variable e | Finally.cs:65:35:65:43 | access to property Message |
|
| Finally.cs:65:35:65:35 | access to local variable e | Finally.cs:65:35:65:43 | access to property Message |
|
||||||
| Finally.cs:65:35:65:43 | After access to property Message | Finally.cs:65:48:65:51 | null |
|
| Finally.cs:65:35:65:43 | After access to property Message | Finally.cs:65:48:65:51 | null |
|
||||||
| Finally.cs:65:35:65:43 | Before access to property Message | Finally.cs:65:35:65:35 | access to local variable e |
|
| Finally.cs:65:35:65:43 | Before access to property Message | Finally.cs:65:35:65:35 | access to local variable e |
|
||||||
@@ -3468,11 +3476,11 @@ dominance
|
|||||||
| Finally.cs:159:27:159:44 | Before object creation of type Exception | Finally.cs:159:41:159:43 | "1" |
|
| Finally.cs:159:27:159:44 | Before object creation of type Exception | Finally.cs:159:41:159:43 | "1" |
|
||||||
| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
||||||
| Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception |
|
| Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:161:30:161:30 | Exception e |
|
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:165:13:168:13 | catch {...} |
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:165:13:168:13 | catch {...} |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [match] |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:30:161:30 | Exception e |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:161:39:161:54 | Before ... == ... |
|
||||||
| Finally.cs:161:30:161:30 | Exception e | Finally.cs:161:39:161:54 | Before ... == ... |
|
| Finally.cs:161:30:161:30 | Exception e | Finally.cs:161:30:161:30 | After Exception e [match] |
|
||||||
|
| Finally.cs:161:30:161:30 | Exception e | Finally.cs:161:30:161:30 | After Exception e [no-match] |
|
||||||
| Finally.cs:161:39:161:39 | access to local variable e | Finally.cs:161:39:161:47 | access to property Message |
|
| Finally.cs:161:39:161:39 | access to local variable e | Finally.cs:161:39:161:47 | access to property Message |
|
||||||
| Finally.cs:161:39:161:47 | After access to property Message | Finally.cs:161:52:161:54 | "1" |
|
| Finally.cs:161:39:161:47 | After access to property Message | Finally.cs:161:52:161:54 | "1" |
|
||||||
| Finally.cs:161:39:161:47 | Before access to property Message | Finally.cs:161:39:161:39 | access to local variable e |
|
| Finally.cs:161:39:161:47 | Before access to property Message | Finally.cs:161:39:161:39 | access to local variable e |
|
||||||
@@ -3493,8 +3501,7 @@ dominance
|
|||||||
| Finally.cs:163:35:163:41 | Before access to array element | Finally.cs:163:35:163:38 | access to parameter args |
|
| Finally.cs:163:35:163:41 | Before access to array element | Finally.cs:163:35:163:38 | access to parameter args |
|
||||||
| Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:35:163:41 | After access to array element |
|
| Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:35:163:41 | After access to array element |
|
||||||
| Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:41 | access to array element |
|
| Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:41 | access to array element |
|
||||||
| Finally.cs:165:13:168:13 | After catch {...} [match] | Finally.cs:166:13:168:13 | {...} |
|
| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:166:13:168:13 | {...} |
|
||||||
| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:165:13:168:13 | After catch {...} [match] |
|
|
||||||
| Finally.cs:166:13:168:13 | {...} | Finally.cs:167:17:167:38 | ...; |
|
| Finally.cs:166:13:168:13 | {...} | Finally.cs:167:17:167:38 | ...; |
|
||||||
| Finally.cs:167:17:167:37 | After call to method WriteLine | Finally.cs:167:17:167:38 | After ...; |
|
| Finally.cs:167:17:167:37 | After call to method WriteLine | Finally.cs:167:17:167:38 | After ...; |
|
||||||
| Finally.cs:167:17:167:37 | Before call to method WriteLine | Finally.cs:167:35:167:36 | "" |
|
| Finally.cs:167:17:167:37 | Before call to method WriteLine | Finally.cs:167:35:167:36 | "" |
|
||||||
@@ -3566,9 +3573,10 @@ dominance
|
|||||||
| Finally.cs:186:31:186:46 | Before object creation of type ExceptionB | Finally.cs:186:31:186:46 | object creation of type ExceptionB |
|
| Finally.cs:186:31:186:46 | Before object creation of type ExceptionB | Finally.cs:186:31:186:46 | object creation of type ExceptionB |
|
||||||
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:38:188:39 | access to parameter b2 |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:20:188:29 | access to type ExceptionB |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:38:188:39 | access to parameter b2 |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:188:20:188:29 | access to type ExceptionB | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
|
| Finally.cs:188:20:188:29 | access to type ExceptionB | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:189:13:191:13 | {...} |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:189:13:191:13 | {...} |
|
||||||
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
@@ -3663,8 +3671,7 @@ dominance
|
|||||||
| Finally.cs:220:13:220:37 | ...; | Finally.cs:220:13:220:36 | Before call to method WriteLine |
|
| Finally.cs:220:13:220:37 | ...; | Finally.cs:220:13:220:36 | Before call to method WriteLine |
|
||||||
| Finally.cs:220:13:220:37 | After ...; | Finally.cs:219:9:221:9 | After {...} |
|
| Finally.cs:220:13:220:37 | After ...; | Finally.cs:219:9:221:9 | After {...} |
|
||||||
| Finally.cs:220:31:220:35 | "Try" | Finally.cs:220:13:220:36 | call to method WriteLine |
|
| Finally.cs:220:31:220:35 | "Try" | Finally.cs:220:13:220:36 | call to method WriteLine |
|
||||||
| Finally.cs:222:9:225:9 | After catch {...} [match] | Finally.cs:223:9:225:9 | {...} |
|
| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:223:9:225:9 | {...} |
|
||||||
| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:222:9:225:9 | After catch {...} [match] |
|
|
||||||
| Finally.cs:223:9:225:9 | {...} | Finally.cs:224:13:224:39 | ...; |
|
| Finally.cs:223:9:225:9 | {...} | Finally.cs:224:13:224:39 | ...; |
|
||||||
| Finally.cs:224:13:224:38 | After call to method WriteLine | Finally.cs:224:13:224:39 | After ...; |
|
| Finally.cs:224:13:224:38 | After call to method WriteLine | Finally.cs:224:13:224:39 | After ...; |
|
||||||
| Finally.cs:224:13:224:38 | Before call to method WriteLine | Finally.cs:224:31:224:37 | "Catch" |
|
| Finally.cs:224:13:224:38 | Before call to method WriteLine | Finally.cs:224:31:224:37 | "Catch" |
|
||||||
@@ -10615,13 +10622,17 @@ postDominance
|
|||||||
| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:42:25:42:29 | false |
|
| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:42:25:42:29 | false |
|
||||||
| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:41:9:43:9 | {...} |
|
| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:41:9:43:9 | {...} |
|
||||||
| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:13:42:30 | Before call to method ErrorAlways |
|
| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:13:42:30 | Before call to method ErrorAlways |
|
||||||
|
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] |
|
||||||
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways |
|
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways |
|
||||||
| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:44:16:44:32 | access to type ArgumentException | ExitMethods.cs:44:9:47:9 | catch (...) {...} |
|
||||||
|
| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] |
|
||||||
| ExitMethods.cs:46:13:46:19 | Before return ...; | ExitMethods.cs:45:9:47:9 | {...} |
|
| ExitMethods.cs:46:13:46:19 | Before return ...; | ExitMethods.cs:45:9:47:9 | {...} |
|
||||||
| ExitMethods.cs:46:13:46:19 | return ...; | ExitMethods.cs:46:13:46:19 | Before return ...; |
|
| ExitMethods.cs:46:13:46:19 | return ...; | ExitMethods.cs:46:13:46:19 | Before return ...; |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | ExitMethods.cs:48:9:51:9 | catch (...) {...} |
|
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] |
|
||||||
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] |
|
||||||
| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | ExitMethods.cs:48:16:48:24 | access to type Exception |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | access to type Exception | ExitMethods.cs:48:9:51:9 | catch (...) {...} |
|
||||||
|
| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:48:16:48:24 | After access to type Exception [match] |
|
||||||
| ExitMethods.cs:50:13:50:19 | Before return ...; | ExitMethods.cs:49:9:51:9 | {...} |
|
| ExitMethods.cs:50:13:50:19 | Before return ...; | ExitMethods.cs:49:9:51:9 | {...} |
|
||||||
| ExitMethods.cs:50:13:50:19 | return ...; | ExitMethods.cs:50:13:50:19 | Before return ...; |
|
| ExitMethods.cs:50:13:50:19 | return ...; | ExitMethods.cs:50:13:50:19 | Before return ...; |
|
||||||
| ExitMethods.cs:54:10:54:11 | Exceptional Exit | ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 |
|
| ExitMethods.cs:54:10:54:11 | Exceptional Exit | ExitMethods.cs:56:9:56:22 | call to method ErrorAlways2 |
|
||||||
@@ -10911,15 +10922,17 @@ postDominance
|
|||||||
| Finally.cs:23:31:23:36 | "Try2" | Finally.cs:23:13:23:37 | Before call to method WriteLine |
|
| Finally.cs:23:31:23:36 | "Try2" | Finally.cs:23:13:23:37 | Before call to method WriteLine |
|
||||||
| Finally.cs:24:13:24:19 | Before return ...; | Finally.cs:23:13:23:38 | After ...; |
|
| Finally.cs:24:13:24:19 | Before return ...; | Finally.cs:23:13:23:38 | After ...; |
|
||||||
| Finally.cs:24:13:24:19 | return ...; | Finally.cs:24:13:24:19 | Before return ...; |
|
| Finally.cs:24:13:24:19 | return ...; | Finally.cs:24:13:24:19 | Before return ...; |
|
||||||
| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:26:9:29:9 | After catch (...) {...} [match] |
|
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:26:38:26:39 | After IOException ex [no-match] |
|
||||||
|
| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:26:9:29:9 | catch (...) {...} |
|
||||||
| Finally.cs:26:48:26:51 | After true [true] | Finally.cs:26:48:26:51 | true |
|
| Finally.cs:26:48:26:51 | After true [true] | Finally.cs:26:48:26:51 | true |
|
||||||
| Finally.cs:26:48:26:51 | true | Finally.cs:26:38:26:39 | IOException ex |
|
| Finally.cs:26:48:26:51 | true | Finally.cs:26:38:26:39 | After IOException ex [match] |
|
||||||
| Finally.cs:27:9:29:9 | {...} | Finally.cs:26:48:26:51 | After true [true] |
|
| Finally.cs:27:9:29:9 | {...} | Finally.cs:26:48:26:51 | After true [true] |
|
||||||
| Finally.cs:28:13:28:18 | Before throw ...; | Finally.cs:27:9:29:9 | {...} |
|
| Finally.cs:28:13:28:18 | Before throw ...; | Finally.cs:27:9:29:9 | {...} |
|
||||||
| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:28:13:28:18 | Before throw ...; |
|
| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:28:13:28:18 | Before throw ...; |
|
||||||
|
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] |
|
||||||
| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:30:9:40:9 | After catch (...) {...} [match] |
|
| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:30:9:40:9 | catch (...) {...} |
|
||||||
| Finally.cs:31:9:40:9 | {...} | Finally.cs:30:41:30:42 | ArgumentException ex |
|
| Finally.cs:31:9:40:9 | {...} | Finally.cs:30:41:30:42 | After ArgumentException ex [match] |
|
||||||
| Finally.cs:32:13:39:13 | try {...} ... | Finally.cs:31:9:40:9 | {...} |
|
| Finally.cs:32:13:39:13 | try {...} ... | Finally.cs:31:9:40:9 | {...} |
|
||||||
| Finally.cs:33:13:35:13 | {...} | Finally.cs:32:13:39:13 | try {...} ... |
|
| Finally.cs:33:13:35:13 | {...} | Finally.cs:32:13:39:13 | try {...} ... |
|
||||||
| Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:33:13:35:13 | {...} |
|
| Finally.cs:34:17:34:32 | if (...) ... | Finally.cs:33:13:35:13 | {...} |
|
||||||
@@ -10934,11 +10947,12 @@ postDominance
|
|||||||
| Finally.cs:38:23:38:43 | Before object creation of type Exception | Finally.cs:38:17:38:44 | Before throw ...; |
|
| Finally.cs:38:23:38:43 | Before object creation of type Exception | Finally.cs:38:17:38:44 | Before throw ...; |
|
||||||
| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:38:37:38:42 | "Boo!" |
|
| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:38:37:38:42 | "Boo!" |
|
||||||
| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:38:23:38:43 | Before object creation of type Exception |
|
| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:38:23:38:43 | Before object creation of type Exception |
|
||||||
|
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [no-match] |
|
||||||
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:42:9:43:9 | {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [match] |
|
| Finally.cs:41:16:41:24 | access to type Exception | Finally.cs:41:9:43:9 | catch (...) {...} |
|
||||||
| Finally.cs:44:9:47:9 | After catch {...} [match] | Finally.cs:44:9:47:9 | catch {...} |
|
| Finally.cs:42:9:43:9 | {...} | Finally.cs:41:16:41:24 | After access to type Exception [match] |
|
||||||
| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:45:9:47:9 | {...} | Finally.cs:44:9:47:9 | After catch {...} [match] |
|
| Finally.cs:45:9:47:9 | {...} | Finally.cs:44:9:47:9 | catch {...} |
|
||||||
| Finally.cs:46:13:46:19 | Before return ...; | Finally.cs:45:9:47:9 | {...} |
|
| Finally.cs:46:13:46:19 | Before return ...; | Finally.cs:45:9:47:9 | {...} |
|
||||||
| Finally.cs:46:13:46:19 | return ...; | Finally.cs:46:13:46:19 | Before return ...; |
|
| Finally.cs:46:13:46:19 | return ...; | Finally.cs:46:13:46:19 | Before return ...; |
|
||||||
| Finally.cs:49:9:51:9 | After {...} | Finally.cs:50:13:50:41 | After ...; |
|
| Finally.cs:49:9:51:9 | After {...} | Finally.cs:50:13:50:41 | After ...; |
|
||||||
@@ -10966,21 +10980,23 @@ postDominance
|
|||||||
| Finally.cs:58:31:58:36 | "Try3" | Finally.cs:58:13:58:37 | Before call to method WriteLine |
|
| Finally.cs:58:31:58:36 | "Try3" | Finally.cs:58:13:58:37 | Before call to method WriteLine |
|
||||||
| Finally.cs:59:13:59:19 | Before return ...; | Finally.cs:58:13:58:38 | After ...; |
|
| Finally.cs:59:13:59:19 | Before return ...; | Finally.cs:58:13:58:38 | After ...; |
|
||||||
| Finally.cs:59:13:59:19 | return ...; | Finally.cs:59:13:59:19 | Before return ...; |
|
| Finally.cs:59:13:59:19 | return ...; | Finally.cs:59:13:59:19 | Before return ...; |
|
||||||
| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:61:9:64:9 | After catch (...) {...} [match] |
|
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:61:38:61:39 | After IOException ex [no-match] |
|
||||||
|
| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:61:9:64:9 | catch (...) {...} |
|
||||||
| Finally.cs:61:48:61:51 | After true [true] | Finally.cs:61:48:61:51 | true |
|
| Finally.cs:61:48:61:51 | After true [true] | Finally.cs:61:48:61:51 | true |
|
||||||
| Finally.cs:61:48:61:51 | true | Finally.cs:61:38:61:39 | IOException ex |
|
| Finally.cs:61:48:61:51 | true | Finally.cs:61:38:61:39 | After IOException ex [match] |
|
||||||
| Finally.cs:62:9:64:9 | {...} | Finally.cs:61:48:61:51 | After true [true] |
|
| Finally.cs:62:9:64:9 | {...} | Finally.cs:61:48:61:51 | After true [true] |
|
||||||
| Finally.cs:63:13:63:18 | Before throw ...; | Finally.cs:62:9:64:9 | {...} |
|
| Finally.cs:63:13:63:18 | Before throw ...; | Finally.cs:62:9:64:9 | {...} |
|
||||||
| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:63:13:63:18 | Before throw ...; |
|
| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:63:13:63:18 | Before throw ...; |
|
||||||
|
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:26:65:26 | After Exception e [no-match] |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
||||||
| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:65:26:65:26 | Exception e | Finally.cs:65:9:67:9 | After catch (...) {...} [match] |
|
| Finally.cs:65:26:65:26 | Exception e | Finally.cs:65:9:67:9 | catch (...) {...} |
|
||||||
| Finally.cs:65:35:65:35 | access to local variable e | Finally.cs:65:35:65:43 | Before access to property Message |
|
| Finally.cs:65:35:65:35 | access to local variable e | Finally.cs:65:35:65:43 | Before access to property Message |
|
||||||
| Finally.cs:65:35:65:43 | After access to property Message | Finally.cs:65:35:65:43 | access to property Message |
|
| Finally.cs:65:35:65:43 | After access to property Message | Finally.cs:65:35:65:43 | access to property Message |
|
||||||
| Finally.cs:65:35:65:43 | Before access to property Message | Finally.cs:65:35:65:51 | Before ... != ... |
|
| Finally.cs:65:35:65:43 | Before access to property Message | Finally.cs:65:35:65:51 | Before ... != ... |
|
||||||
| Finally.cs:65:35:65:43 | access to property Message | Finally.cs:65:35:65:35 | access to local variable e |
|
| Finally.cs:65:35:65:43 | access to property Message | Finally.cs:65:35:65:35 | access to local variable e |
|
||||||
| Finally.cs:65:35:65:51 | ... != ... | Finally.cs:65:48:65:51 | null |
|
| Finally.cs:65:35:65:51 | ... != ... | Finally.cs:65:48:65:51 | null |
|
||||||
| Finally.cs:65:35:65:51 | Before ... != ... | Finally.cs:65:26:65:26 | Exception e |
|
| Finally.cs:65:35:65:51 | Before ... != ... | Finally.cs:65:26:65:26 | After Exception e [match] |
|
||||||
| Finally.cs:65:48:65:51 | null | Finally.cs:65:35:65:43 | After access to property Message |
|
| Finally.cs:65:48:65:51 | null | Finally.cs:65:35:65:43 | After access to property Message |
|
||||||
| Finally.cs:66:9:67:9 | {...} | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
| Finally.cs:66:9:67:9 | {...} | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
||||||
| Finally.cs:69:9:71:9 | After {...} | Finally.cs:70:13:70:41 | After ...; |
|
| Finally.cs:69:9:71:9 | After {...} | Finally.cs:70:13:70:41 | After ...; |
|
||||||
@@ -11237,16 +11253,17 @@ postDominance
|
|||||||
| Finally.cs:159:27:159:44 | Before object creation of type Exception | Finally.cs:159:21:159:45 | Before throw ...; |
|
| Finally.cs:159:27:159:44 | Before object creation of type Exception | Finally.cs:159:21:159:45 | Before throw ...; |
|
||||||
| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:41:159:43 | "1" |
|
| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:41:159:43 | "1" |
|
||||||
| Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | Before object creation of type Exception |
|
| Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | Before object creation of type Exception |
|
||||||
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:161:30:161:30 | After Exception e [no-match] |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:159:21:159:45 | throw ...; |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:159:21:159:45 | throw ...; |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:159:27:159:44 | object creation of type Exception |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:159:27:159:44 | object creation of type Exception |
|
||||||
| Finally.cs:161:30:161:30 | Exception e | Finally.cs:161:13:164:13 | After catch (...) {...} [match] |
|
| Finally.cs:161:30:161:30 | Exception e | Finally.cs:161:13:164:13 | catch (...) {...} |
|
||||||
| Finally.cs:161:39:161:39 | access to local variable e | Finally.cs:161:39:161:47 | Before access to property Message |
|
| Finally.cs:161:39:161:39 | access to local variable e | Finally.cs:161:39:161:47 | Before access to property Message |
|
||||||
| Finally.cs:161:39:161:47 | After access to property Message | Finally.cs:161:39:161:47 | access to property Message |
|
| Finally.cs:161:39:161:47 | After access to property Message | Finally.cs:161:39:161:47 | access to property Message |
|
||||||
| Finally.cs:161:39:161:47 | Before access to property Message | Finally.cs:161:39:161:54 | Before ... == ... |
|
| Finally.cs:161:39:161:47 | Before access to property Message | Finally.cs:161:39:161:54 | Before ... == ... |
|
||||||
| Finally.cs:161:39:161:47 | access to property Message | Finally.cs:161:39:161:39 | access to local variable e |
|
| Finally.cs:161:39:161:47 | access to property Message | Finally.cs:161:39:161:39 | access to local variable e |
|
||||||
| Finally.cs:161:39:161:54 | ... == ... | Finally.cs:161:52:161:54 | "1" |
|
| Finally.cs:161:39:161:54 | ... == ... | Finally.cs:161:52:161:54 | "1" |
|
||||||
| Finally.cs:161:39:161:54 | Before ... == ... | Finally.cs:161:30:161:30 | Exception e |
|
| Finally.cs:161:39:161:54 | Before ... == ... | Finally.cs:161:30:161:30 | After Exception e [match] |
|
||||||
| Finally.cs:161:52:161:54 | "1" | Finally.cs:161:39:161:47 | After access to property Message |
|
| Finally.cs:161:52:161:54 | "1" | Finally.cs:161:39:161:47 | After access to property Message |
|
||||||
| Finally.cs:162:13:164:13 | After {...} | Finally.cs:163:17:163:43 | After ...; |
|
| Finally.cs:162:13:164:13 | After {...} | Finally.cs:163:17:163:43 | After ...; |
|
||||||
| Finally.cs:162:13:164:13 | {...} | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
| Finally.cs:162:13:164:13 | {...} | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
||||||
@@ -11260,10 +11277,9 @@ postDominance
|
|||||||
| Finally.cs:163:35:163:41 | Before access to array element | Finally.cs:163:17:163:42 | Before call to method WriteLine |
|
| Finally.cs:163:35:163:41 | Before access to array element | Finally.cs:163:17:163:42 | Before call to method WriteLine |
|
||||||
| Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:40:163:40 | 0 |
|
| Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:40:163:40 | 0 |
|
||||||
| Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:38 | access to parameter args |
|
| Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:38 | access to parameter args |
|
||||||
| Finally.cs:165:13:168:13 | After catch {...} [match] | Finally.cs:165:13:168:13 | catch {...} |
|
|
||||||
| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:166:13:168:13 | After {...} | Finally.cs:167:17:167:38 | After ...; |
|
| Finally.cs:166:13:168:13 | After {...} | Finally.cs:167:17:167:38 | After ...; |
|
||||||
| Finally.cs:166:13:168:13 | {...} | Finally.cs:165:13:168:13 | After catch {...} [match] |
|
| Finally.cs:166:13:168:13 | {...} | Finally.cs:165:13:168:13 | catch {...} |
|
||||||
| Finally.cs:167:17:167:37 | After call to method WriteLine | Finally.cs:167:17:167:37 | call to method WriteLine |
|
| Finally.cs:167:17:167:37 | After call to method WriteLine | Finally.cs:167:17:167:37 | call to method WriteLine |
|
||||||
| Finally.cs:167:17:167:37 | Before call to method WriteLine | Finally.cs:167:17:167:38 | ...; |
|
| Finally.cs:167:17:167:37 | Before call to method WriteLine | Finally.cs:167:17:167:38 | ...; |
|
||||||
| Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:167:35:167:36 | "" |
|
| Finally.cs:167:17:167:37 | call to method WriteLine | Finally.cs:167:35:167:36 | "" |
|
||||||
@@ -11332,11 +11348,12 @@ postDominance
|
|||||||
| Finally.cs:186:25:186:47 | throw ...; | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:186:25:186:47 | throw ...; | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:186:31:186:46 | Before object creation of type ExceptionB | Finally.cs:186:25:186:47 | Before throw ...; |
|
| Finally.cs:186:31:186:46 | Before object creation of type ExceptionB | Finally.cs:186:25:186:47 | Before throw ...; |
|
||||||
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | Before object creation of type ExceptionB |
|
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | Before object creation of type ExceptionB |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:13:191:13 | catch (...) {...} |
|
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:186:25:186:47 | throw ...; |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:186:25:186:47 | throw ...; |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:186:31:186:46 | object creation of type ExceptionB |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:186:31:186:46 | object creation of type ExceptionB |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:20:188:29 | access to type ExceptionB |
|
||||||
|
| Finally.cs:188:20:188:29 | access to type ExceptionB | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:188:38:188:39 | access to parameter b2 |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:188:38:188:39 | access to parameter b2 |
|
||||||
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
| Finally.cs:189:13:191:13 | After {...} | Finally.cs:190:17:190:47 | After if (...) ... |
|
| Finally.cs:189:13:191:13 | After {...} | Finally.cs:190:17:190:47 | After if (...) ... |
|
||||||
| Finally.cs:189:13:191:13 | {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:189:13:191:13 | {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:190:17:190:47 | After if (...) ... | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
| Finally.cs:190:17:190:47 | After if (...) ... | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
||||||
@@ -11426,9 +11443,8 @@ postDominance
|
|||||||
| Finally.cs:220:13:220:37 | ...; | Finally.cs:219:9:221:9 | {...} |
|
| Finally.cs:220:13:220:37 | ...; | Finally.cs:219:9:221:9 | {...} |
|
||||||
| Finally.cs:220:13:220:37 | After ...; | Finally.cs:220:13:220:36 | After call to method WriteLine |
|
| Finally.cs:220:13:220:37 | After ...; | Finally.cs:220:13:220:36 | After call to method WriteLine |
|
||||||
| Finally.cs:220:31:220:35 | "Try" | Finally.cs:220:13:220:36 | Before call to method WriteLine |
|
| Finally.cs:220:31:220:35 | "Try" | Finally.cs:220:13:220:36 | Before call to method WriteLine |
|
||||||
| Finally.cs:222:9:225:9 | After catch {...} [match] | Finally.cs:222:9:225:9 | catch {...} |
|
|
||||||
| Finally.cs:223:9:225:9 | After {...} | Finally.cs:224:13:224:39 | After ...; |
|
| Finally.cs:223:9:225:9 | After {...} | Finally.cs:224:13:224:39 | After ...; |
|
||||||
| Finally.cs:223:9:225:9 | {...} | Finally.cs:222:9:225:9 | After catch {...} [match] |
|
| Finally.cs:223:9:225:9 | {...} | Finally.cs:222:9:225:9 | catch {...} |
|
||||||
| Finally.cs:224:13:224:38 | After call to method WriteLine | Finally.cs:224:13:224:38 | call to method WriteLine |
|
| Finally.cs:224:13:224:38 | After call to method WriteLine | Finally.cs:224:13:224:38 | call to method WriteLine |
|
||||||
| Finally.cs:224:13:224:38 | Before call to method WriteLine | Finally.cs:224:13:224:39 | ...; |
|
| Finally.cs:224:13:224:38 | Before call to method WriteLine | Finally.cs:224:13:224:39 | ...; |
|
||||||
| Finally.cs:224:13:224:38 | call to method WriteLine | Finally.cs:224:31:224:37 | "Catch" |
|
| Finally.cs:224:13:224:38 | call to method WriteLine | Finally.cs:224:31:224:37 | "Catch" |
|
||||||
@@ -17407,18 +17423,18 @@ blockDominance
|
|||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:38:10:38:11 | Entry |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:38:10:38:11 | Entry |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:38:10:38:11 | Exit |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:38:10:38:11 | Exit |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:38:10:38:11 | Normal Exit |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:38:10:38:11 | Normal Exit |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:48:16:48:24 | After access to type Exception [match] |
|
||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] |
|
||||||
| ExitMethods.cs:38:10:38:11 | Exit | ExitMethods.cs:38:10:38:11 | Exit |
|
| ExitMethods.cs:38:10:38:11 | Exit | ExitMethods.cs:38:10:38:11 | Exit |
|
||||||
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:38:10:38:11 | Normal Exit |
|
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:38:10:38:11 | Normal Exit |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:48:16:48:24 | After access to type Exception [match] |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | ExitMethods.cs:48:16:48:24 | After access to type Exception [match] |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] | ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] |
|
||||||
| ExitMethods.cs:54:10:54:11 | Entry | ExitMethods.cs:54:10:54:11 | Entry |
|
| ExitMethods.cs:54:10:54:11 | Entry | ExitMethods.cs:54:10:54:11 | Entry |
|
||||||
| ExitMethods.cs:60:10:60:11 | Entry | ExitMethods.cs:60:10:60:11 | Entry |
|
| ExitMethods.cs:60:10:60:11 | Entry | ExitMethods.cs:60:10:60:11 | Entry |
|
||||||
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:66:17:66:26 | Entry |
|
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:66:17:66:26 | Entry |
|
||||||
@@ -17502,38 +17518,38 @@ blockDominance
|
|||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:19:10:19:11 | Normal Exit |
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:19:10:19:11 | Normal Exit |
|
||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:21:9:51:9 | After try {...} ... |
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:21:9:51:9 | After try {...} ... |
|
||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:23:13:23:37 | After call to method WriteLine |
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:23:13:23:37 | After call to method WriteLine |
|
||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:26:9:29:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:26:9:29:9 | catch (...) {...} |
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:26:9:29:9 | catch (...) {...} |
|
||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:30:9:40:9 | After catch (...) {...} [match] |
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:26:38:26:39 | After IOException ex [match] |
|
||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:26:38:26:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:41:9:43:9 | After catch (...) {...} [match] |
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:30:41:30:42 | After ArgumentException ex [match] |
|
||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] |
|
||||||
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:41:16:41:24 | After access to type Exception [match] |
|
||||||
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:41:16:41:24 | After access to type Exception [no-match] |
|
||||||
| Finally.cs:19:10:19:11 | Entry | Finally.cs:49:9:51:9 | {...} |
|
| Finally.cs:19:10:19:11 | Entry | Finally.cs:49:9:51:9 | {...} |
|
||||||
| Finally.cs:19:10:19:11 | Exceptional Exit | Finally.cs:19:10:19:11 | Exceptional Exit |
|
| Finally.cs:19:10:19:11 | Exceptional Exit | Finally.cs:19:10:19:11 | Exceptional Exit |
|
||||||
| Finally.cs:19:10:19:11 | Exit | Finally.cs:19:10:19:11 | Exit |
|
| Finally.cs:19:10:19:11 | Exit | Finally.cs:19:10:19:11 | Exit |
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:19:10:19:11 | Normal Exit |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:19:10:19:11 | Normal Exit |
|
||||||
| Finally.cs:21:9:51:9 | After try {...} ... | Finally.cs:21:9:51:9 | After try {...} ... |
|
| Finally.cs:21:9:51:9 | After try {...} ... | Finally.cs:21:9:51:9 | After try {...} ... |
|
||||||
| Finally.cs:23:13:23:37 | After call to method WriteLine | Finally.cs:23:13:23:37 | After call to method WriteLine |
|
| Finally.cs:23:13:23:37 | After call to method WriteLine | Finally.cs:23:13:23:37 | After call to method WriteLine |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [match] | Finally.cs:26:9:29:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | catch (...) {...} |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | catch (...) {...} |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [match] |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:38:26:39 | After IOException ex [match] |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:38:26:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [match] |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:30:41:30:42 | After ArgumentException ex [match] |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [match] | Finally.cs:30:9:40:9 | After catch (...) {...} [match] |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:41:16:41:24 | After access to type Exception [match] |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:41:16:41:24 | After access to type Exception [no-match] |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [match] |
|
| Finally.cs:26:38:26:39 | After IOException ex [match] | Finally.cs:26:38:26:39 | After IOException ex [match] |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:26:38:26:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [match] | Finally.cs:41:9:43:9 | After catch (...) {...} [match] |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:30:41:30:42 | After ArgumentException ex [match] |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] |
|
||||||
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [match] |
|
||||||
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [no-match] |
|
||||||
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [match] | Finally.cs:30:41:30:42 | After ArgumentException ex [match] |
|
||||||
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] |
|
||||||
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [match] |
|
||||||
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [no-match] |
|
||||||
|
| Finally.cs:41:16:41:24 | After access to type Exception [match] | Finally.cs:41:16:41:24 | After access to type Exception [match] |
|
||||||
|
| Finally.cs:41:16:41:24 | After access to type Exception [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [no-match] |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | Exceptional Exit |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | Exceptional Exit |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | Exit |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | Exit |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | Normal Exit |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | Normal Exit |
|
||||||
@@ -17545,11 +17561,12 @@ blockDominance
|
|||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:54:10:54:11 | Normal Exit |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:54:10:54:11 | Normal Exit |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:56:9:71:9 | After try {...} ... |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:56:9:71:9 | After try {...} ... |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:58:13:58:37 | After call to method WriteLine |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:58:13:58:37 | After call to method WriteLine |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:61:9:64:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:61:9:64:9 | catch (...) {...} |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:61:9:64:9 | catch (...) {...} |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:65:9:67:9 | After catch (...) {...} [match] |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:61:38:61:39 | After IOException ex [match] |
|
||||||
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:61:38:61:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:65:26:65:26 | After Exception e [match] |
|
||||||
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:65:26:65:26 | After Exception e [no-match] |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:69:9:71:9 | {...} |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:69:9:71:9 | {...} |
|
||||||
@@ -17558,23 +17575,26 @@ blockDominance
|
|||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:54:10:54:11 | Normal Exit |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:54:10:54:11 | Normal Exit |
|
||||||
| Finally.cs:56:9:71:9 | After try {...} ... | Finally.cs:56:9:71:9 | After try {...} ... |
|
| Finally.cs:56:9:71:9 | After try {...} ... | Finally.cs:56:9:71:9 | After try {...} ... |
|
||||||
| Finally.cs:58:13:58:37 | After call to method WriteLine | Finally.cs:58:13:58:37 | After call to method WriteLine |
|
| Finally.cs:58:13:58:37 | After call to method WriteLine | Finally.cs:58:13:58:37 | After call to method WriteLine |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [match] | Finally.cs:61:9:64:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | catch (...) {...} |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | catch (...) {...} |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [match] |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:38:61:39 | After IOException ex [match] |
|
||||||
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:38:61:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:26:65:26 | After Exception e [match] |
|
||||||
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:26:65:26 | After Exception e [no-match] |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:65:9:67:9 | After catch (...) {...} [match] |
|
| Finally.cs:61:38:61:39 | After IOException ex [match] | Finally.cs:61:38:61:39 | After IOException ex [match] |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:61:38:61:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:65:26:65:26 | After Exception e [match] |
|
||||||
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:65:26:65:26 | After Exception e [no-match] |
|
||||||
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
||||||
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:65:26:65:26 | After Exception e [match] |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [no-match] | Finally.cs:65:26:65:26 | After Exception e [no-match] |
|
||||||
| Finally.cs:65:35:65:51 | After ... != ... [false] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
| Finally.cs:65:35:65:51 | After ... != ... [false] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
||||||
| Finally.cs:65:35:65:51 | After ... != ... [true] | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
| Finally.cs:65:35:65:51 | After ... != ... [true] | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:54:10:54:11 | Exceptional Exit |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:54:10:54:11 | Exceptional Exit |
|
||||||
@@ -17783,9 +17803,10 @@ blockDominance
|
|||||||
| Finally.cs:147:10:147:11 | Entry | Finally.cs:158:21:158:36 | After ... == ... [false] |
|
| Finally.cs:147:10:147:11 | Entry | Finally.cs:158:21:158:36 | After ... == ... [false] |
|
||||||
| Finally.cs:147:10:147:11 | Entry | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
| Finally.cs:147:10:147:11 | Entry | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
||||||
| Finally.cs:147:10:147:11 | Entry | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
| Finally.cs:147:10:147:11 | Entry | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
||||||
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:13:164:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:13:164:13 | catch (...) {...} |
|
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:13:164:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:30:161:30 | After Exception e [match] |
|
||||||
|
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:30:161:30 | After Exception e [no-match] |
|
||||||
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
||||||
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
| Finally.cs:147:10:147:11 | Entry | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
||||||
| Finally.cs:147:10:147:11 | Exceptional Exit | Finally.cs:147:10:147:11 | Exceptional Exit |
|
| Finally.cs:147:10:147:11 | Exceptional Exit | Finally.cs:147:10:147:11 | Exceptional Exit |
|
||||||
@@ -17804,9 +17825,10 @@ blockDominance
|
|||||||
| Finally.cs:155:9:169:9 | {...} | Finally.cs:158:21:158:36 | After ... == ... [false] |
|
| Finally.cs:155:9:169:9 | {...} | Finally.cs:158:21:158:36 | After ... == ... [false] |
|
||||||
| Finally.cs:155:9:169:9 | {...} | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
| Finally.cs:155:9:169:9 | {...} | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
||||||
| Finally.cs:155:9:169:9 | {...} | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
| Finally.cs:155:9:169:9 | {...} | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
||||||
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:13:164:13 | catch (...) {...} |
|
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:13:164:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:30:161:30 | After Exception e [match] |
|
||||||
|
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:30:161:30 | After Exception e [no-match] |
|
||||||
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
||||||
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
| Finally.cs:155:9:169:9 | {...} | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
||||||
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:147:10:147:11 | Exceptional Exit |
|
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:147:10:147:11 | Exceptional Exit |
|
||||||
@@ -17821,15 +17843,17 @@ blockDominance
|
|||||||
| Finally.cs:158:21:158:36 | After ... == ... [true] | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
| Finally.cs:158:21:158:36 | After ... == ... [true] | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
||||||
| Finally.cs:158:21:158:36 | After ... == ... [true] | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
| Finally.cs:158:21:158:36 | After ... == ... [true] | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
||||||
| Finally.cs:159:27:159:44 | After object creation of type Exception | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
| Finally.cs:159:27:159:44 | After object creation of type Exception | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:161:13:164:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | catch (...) {...} |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:30:161:30 | After Exception e [match] |
|
||||||
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:30:161:30 | After Exception e [no-match] |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:161:30:161:30 | After Exception e [match] |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [no-match] | Finally.cs:161:30:161:30 | After Exception e [no-match] |
|
||||||
| Finally.cs:161:39:161:54 | After ... == ... [false] | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
| Finally.cs:161:39:161:54 | After ... == ... [false] | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
||||||
| Finally.cs:161:39:161:54 | After ... == ... [true] | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
| Finally.cs:161:39:161:54 | After ... == ... [true] | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
||||||
| Finally.cs:172:11:172:20 | Entry | Finally.cs:172:11:172:20 | Entry |
|
| Finally.cs:172:11:172:20 | Entry | Finally.cs:172:11:172:20 | Entry |
|
||||||
@@ -17847,9 +17871,10 @@ blockDominance
|
|||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] |
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:176:10:176:11 | Entry | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
| Finally.cs:176:10:176:11 | Entry | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
||||||
@@ -17869,9 +17894,10 @@ blockDominance
|
|||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:183:9:192:9 | {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
| Finally.cs:183:9:192:9 | {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
||||||
@@ -17881,27 +17907,30 @@ blockDominance
|
|||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [false] | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [false] | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [true] |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [true] |
|
||||||
| Finally.cs:186:31:186:46 | After object creation of type ExceptionB | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:186:31:186:46 | After object creation of type ExceptionB | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:190:21:190:22 | After access to parameter b1 [true] |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [true] |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:190:21:190:22 | After access to parameter b1 [true] |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:190:21:190:22 | After access to parameter b1 [true] |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
||||||
@@ -21668,14 +21697,14 @@ postBlockDominance
|
|||||||
| ExitMethods.cs:38:10:38:11 | Exit | ExitMethods.cs:38:10:38:11 | Exit |
|
| ExitMethods.cs:38:10:38:11 | Exit | ExitMethods.cs:38:10:38:11 | Exit |
|
||||||
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:38:10:38:11 | Entry |
|
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:38:10:38:11 | Entry |
|
||||||
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:38:10:38:11 | Normal Exit |
|
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:38:10:38:11 | Normal Exit |
|
||||||
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] |
|
||||||
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] |
|
||||||
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:48:16:48:24 | After access to type Exception [match] |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | ExitMethods.cs:48:16:48:24 | After access to type Exception [match] |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] | ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] |
|
||||||
| ExitMethods.cs:54:10:54:11 | Entry | ExitMethods.cs:54:10:54:11 | Entry |
|
| ExitMethods.cs:54:10:54:11 | Entry | ExitMethods.cs:54:10:54:11 | Entry |
|
||||||
| ExitMethods.cs:60:10:60:11 | Entry | ExitMethods.cs:60:10:60:11 | Entry |
|
| ExitMethods.cs:60:10:60:11 | Entry | ExitMethods.cs:60:10:60:11 | Entry |
|
||||||
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:66:17:66:26 | Entry |
|
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:66:17:66:26 | Entry |
|
||||||
@@ -21743,32 +21772,32 @@ postBlockDominance
|
|||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:19:10:19:11 | Normal Exit |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:19:10:19:11 | Normal Exit |
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:21:9:51:9 | After try {...} ... |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:21:9:51:9 | After try {...} ... |
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:23:13:23:37 | After call to method WriteLine |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:23:13:23:37 | After call to method WriteLine |
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:26:9:29:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:26:9:29:9 | catch (...) {...} |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:26:9:29:9 | catch (...) {...} |
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:30:9:40:9 | After catch (...) {...} [match] |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:26:38:26:39 | After IOException ex [match] |
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:26:38:26:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:41:9:43:9 | After catch (...) {...} [match] |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:30:41:30:42 | After ArgumentException ex [match] |
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] |
|
||||||
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:41:16:41:24 | After access to type Exception [match] |
|
||||||
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:41:16:41:24 | After access to type Exception [no-match] |
|
||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:49:9:51:9 | {...} |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:49:9:51:9 | {...} |
|
||||||
| Finally.cs:21:9:51:9 | After try {...} ... | Finally.cs:21:9:51:9 | After try {...} ... |
|
| Finally.cs:21:9:51:9 | After try {...} ... | Finally.cs:21:9:51:9 | After try {...} ... |
|
||||||
| Finally.cs:23:13:23:37 | After call to method WriteLine | Finally.cs:23:13:23:37 | After call to method WriteLine |
|
| Finally.cs:23:13:23:37 | After call to method WriteLine | Finally.cs:23:13:23:37 | After call to method WriteLine |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [match] | Finally.cs:26:9:29:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | catch (...) {...} |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | catch (...) {...} |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [match] | Finally.cs:30:9:40:9 | After catch (...) {...} [match] |
|
| Finally.cs:26:38:26:39 | After IOException ex [match] | Finally.cs:26:38:26:39 | After IOException ex [match] |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:26:38:26:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [match] | Finally.cs:41:9:43:9 | After catch (...) {...} [match] |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [match] | Finally.cs:30:41:30:42 | After ArgumentException ex [match] |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] |
|
||||||
|
| Finally.cs:41:16:41:24 | After access to type Exception [match] | Finally.cs:41:16:41:24 | After access to type Exception [match] |
|
||||||
|
| Finally.cs:41:16:41:24 | After access to type Exception [no-match] | Finally.cs:41:16:41:24 | After access to type Exception [no-match] |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | Entry |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | Entry |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:23:13:23:37 | After call to method WriteLine |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:23:13:23:37 | After call to method WriteLine |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:26:9:29:9 | catch (...) {...} |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:26:9:29:9 | catch (...) {...} |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [match] |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:26:38:26:39 | After IOException ex [match] |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:26:38:26:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [match] |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:30:41:30:42 | After ArgumentException ex [match] |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] |
|
||||||
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:41:16:41:24 | After access to type Exception [match] |
|
||||||
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:41:16:41:24 | After access to type Exception [no-match] |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:49:9:51:9 | {...} |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:49:9:51:9 | {...} |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:54:10:54:11 | Entry |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:54:10:54:11 | Entry |
|
||||||
| Finally.cs:54:10:54:11 | Exceptional Exit | Finally.cs:54:10:54:11 | Exceptional Exit |
|
| Finally.cs:54:10:54:11 | Exceptional Exit | Finally.cs:54:10:54:11 | Exceptional Exit |
|
||||||
@@ -21777,31 +21806,35 @@ postBlockDominance
|
|||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:54:10:54:11 | Normal Exit |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:54:10:54:11 | Normal Exit |
|
||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:56:9:71:9 | After try {...} ... |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:56:9:71:9 | After try {...} ... |
|
||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:58:13:58:37 | After call to method WriteLine |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:58:13:58:37 | After call to method WriteLine |
|
||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:61:9:64:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:61:9:64:9 | catch (...) {...} |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:61:9:64:9 | catch (...) {...} |
|
||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:65:9:67:9 | After catch (...) {...} [match] |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:61:38:61:39 | After IOException ex [match] |
|
||||||
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:61:38:61:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:65:26:65:26 | After Exception e [match] |
|
||||||
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:65:26:65:26 | After Exception e [no-match] |
|
||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:69:9:71:9 | {...} |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:69:9:71:9 | {...} |
|
||||||
| Finally.cs:56:9:71:9 | After try {...} ... | Finally.cs:56:9:71:9 | After try {...} ... |
|
| Finally.cs:56:9:71:9 | After try {...} ... | Finally.cs:56:9:71:9 | After try {...} ... |
|
||||||
| Finally.cs:58:13:58:37 | After call to method WriteLine | Finally.cs:58:13:58:37 | After call to method WriteLine |
|
| Finally.cs:58:13:58:37 | After call to method WriteLine | Finally.cs:58:13:58:37 | After call to method WriteLine |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [match] | Finally.cs:61:9:64:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | catch (...) {...} |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | catch (...) {...} |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:65:9:67:9 | After catch (...) {...} [match] |
|
| Finally.cs:61:38:61:39 | After IOException ex [match] | Finally.cs:61:38:61:39 | After IOException ex [match] |
|
||||||
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:61:38:61:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:26:65:26 | After Exception e [no-match] |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:65:26:65:26 | After Exception e [match] |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [no-match] | Finally.cs:65:26:65:26 | After Exception e [no-match] |
|
||||||
| Finally.cs:65:35:65:51 | After ... != ... [false] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
| Finally.cs:65:35:65:51 | After ... != ... [false] | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
||||||
| Finally.cs:65:35:65:51 | After ... != ... [true] | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
| Finally.cs:65:35:65:51 | After ... != ... [true] | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:54:10:54:11 | Entry |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:54:10:54:11 | Entry |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:58:13:58:37 | After call to method WriteLine |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:58:13:58:37 | After call to method WriteLine |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] |
|
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:61:9:64:9 | catch (...) {...} |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:61:9:64:9 | catch (...) {...} |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [match] |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:61:38:61:39 | After IOException ex [match] |
|
||||||
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:61:38:61:39 | After IOException ex [no-match] |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:65:26:65:26 | After Exception e [match] |
|
||||||
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:65:26:65:26 | After Exception e [no-match] |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:65:35:65:51 | After ... != ... [false] |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:65:35:65:51 | After ... != ... [true] |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:69:9:71:9 | {...} |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:69:9:71:9 | {...} |
|
||||||
@@ -21973,9 +22006,10 @@ postBlockDominance
|
|||||||
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:158:21:158:36 | After ... == ... [false] |
|
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:158:21:158:36 | After ... == ... [false] |
|
||||||
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
||||||
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
||||||
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:13:164:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:13:164:13 | catch (...) {...} |
|
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:13:164:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:30:161:30 | After Exception e [match] |
|
||||||
|
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:30:161:30 | After Exception e [no-match] |
|
||||||
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
||||||
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
| Finally.cs:149:9:169:9 | After try {...} ... | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
||||||
| Finally.cs:151:17:151:28 | After ... == ... [false] | Finally.cs:151:17:151:28 | After ... == ... [false] |
|
| Finally.cs:151:17:151:28 | After ... == ... [false] | Finally.cs:151:17:151:28 | After ... == ... [false] |
|
||||||
@@ -21996,21 +22030,24 @@ postBlockDominance
|
|||||||
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:158:21:158:36 | After ... == ... [false] |
|
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:158:21:158:36 | After ... == ... [false] |
|
||||||
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
||||||
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
||||||
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:13:164:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:13:164:13 | catch (...) {...} |
|
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:13:164:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:30:161:30 | After Exception e [match] |
|
||||||
|
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:30:161:30 | After Exception e [no-match] |
|
||||||
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
||||||
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
| Finally.cs:156:13:168:13 | After try {...} ... | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
||||||
| Finally.cs:158:21:158:31 | After access to property Length | Finally.cs:158:21:158:31 | After access to property Length |
|
| Finally.cs:158:21:158:31 | After access to property Length | Finally.cs:158:21:158:31 | After access to property Length |
|
||||||
| Finally.cs:158:21:158:36 | After ... == ... [false] | Finally.cs:158:21:158:36 | After ... == ... [false] |
|
| Finally.cs:158:21:158:36 | After ... == ... [false] | Finally.cs:158:21:158:36 | After ... == ... [false] |
|
||||||
| Finally.cs:158:21:158:36 | After ... == ... [true] | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
| Finally.cs:158:21:158:36 | After ... == ... [true] | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
||||||
| Finally.cs:159:27:159:44 | After object creation of type Exception | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
| Finally.cs:159:27:159:44 | After object creation of type Exception | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:161:13:164:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] |
|
||||||
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:161:30:161:30 | After Exception e [no-match] |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:158:21:158:36 | After ... == ... [true] |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:159:27:159:44 | After object creation of type Exception |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | catch (...) {...} |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:161:30:161:30 | After Exception e [match] |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [no-match] | Finally.cs:161:30:161:30 | After Exception e [no-match] |
|
||||||
| Finally.cs:161:39:161:54 | After ... == ... [false] | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
| Finally.cs:161:39:161:54 | After ... == ... [false] | Finally.cs:161:39:161:54 | After ... == ... [false] |
|
||||||
| Finally.cs:161:39:161:54 | After ... == ... [true] | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
| Finally.cs:161:39:161:54 | After ... == ... [true] | Finally.cs:161:39:161:54 | After ... == ... [true] |
|
||||||
| Finally.cs:172:11:172:20 | Entry | Finally.cs:172:11:172:20 | Entry |
|
| Finally.cs:172:11:172:20 | Entry | Finally.cs:172:11:172:20 | Entry |
|
||||||
@@ -22029,8 +22066,8 @@ postBlockDominance
|
|||||||
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
| Finally.cs:178:9:192:9 | After try {...} ... | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
||||||
| Finally.cs:180:17:180:18 | After access to parameter b1 [false] | Finally.cs:180:17:180:18 | After access to parameter b1 [false] |
|
| Finally.cs:180:17:180:18 | After access to parameter b1 [false] | Finally.cs:180:17:180:18 | After access to parameter b1 [false] |
|
||||||
@@ -22050,31 +22087,32 @@ postBlockDominance
|
|||||||
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
| Finally.cs:184:13:191:13 | After try {...} ... | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [false] | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [false] | Finally.cs:186:21:186:22 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:186:31:186:46 | After object creation of type ExceptionB | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:186:31:186:46 | After object creation of type ExceptionB | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:13:191:13 | catch (...) {...} |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:188:38:188:39 | After access to parameter b2 [false] |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:186:21:186:22 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:186:31:186:46 | After object creation of type ExceptionB |
|
||||||
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:188:13:191:13 | After catch (...) {...} [match] |
|
|
||||||
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] |
|
||||||
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:188:38:188:39 | After access to parameter b2 [true] |
|
||||||
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:190:21:190:22 | After access to parameter b1 [false] |
|
||||||
| Finally.cs:190:21:190:22 | After access to parameter b1 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [true] |
|
| Finally.cs:190:21:190:22 | After access to parameter b1 [true] | Finally.cs:190:21:190:22 | After access to parameter b1 [true] |
|
||||||
|
|||||||
@@ -3016,15 +3016,19 @@ nodeEnclosing
|
|||||||
| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] | ExitMethods.cs:38:10:38:11 | M6 |
|
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
|
| ExitMethods.cs:44:16:44:32 | access to type ArgumentException | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:46:13:46:19 | Before return ...; | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:46:13:46:19 | Before return ...; | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:46:13:46:19 | return ...; | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:46:13:46:19 | return ...; | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | ExitMethods.cs:38:10:38:11 | M6 |
|
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | access to type Exception | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:50:13:50:19 | Before return ...; | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:50:13:50:19 | Before return ...; | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:50:13:50:19 | return ...; | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:50:13:50:19 | return ...; | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
@@ -3358,18 +3362,20 @@ nodeEnclosing
|
|||||||
| Finally.cs:23:31:23:36 | "Try2" | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:23:31:23:36 | "Try2" | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:24:13:24:19 | Before return ...; | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:24:13:24:19 | Before return ...; | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:24:13:24:19 | return ...; | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:24:13:24:19 | return ...; | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [match] | Finally.cs:19:10:19:11 | M2 |
|
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:19:10:19:11 | M2 |
|
||||||
|
| Finally.cs:26:38:26:39 | After IOException ex [match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:26:48:26:51 | After true [true] | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:26:48:26:51 | After true [true] | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:26:48:26:51 | true | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:26:48:26:51 | true | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:27:9:29:9 | {...} | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:27:9:29:9 | {...} | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:28:13:28:18 | Before throw ...; | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:28:13:28:18 | Before throw ...; | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [match] | Finally.cs:19:10:19:11 | M2 |
|
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:19:10:19:11 | M2 |
|
||||||
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:31:9:40:9 | {...} | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:31:9:40:9 | {...} | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:32:13:39:13 | try {...} ... | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:32:13:39:13 | try {...} ... | Finally.cs:19:10:19:11 | M2 |
|
||||||
@@ -3386,11 +3392,12 @@ nodeEnclosing
|
|||||||
| Finally.cs:38:23:38:43 | Before object creation of type Exception | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:38:23:38:43 | Before object creation of type Exception | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [match] | Finally.cs:19:10:19:11 | M2 |
|
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:19:10:19:11 | M2 |
|
||||||
|
| Finally.cs:41:16:41:24 | After access to type Exception [match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
|
| Finally.cs:41:16:41:24 | After access to type Exception [no-match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
|
| Finally.cs:41:16:41:24 | access to type Exception | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:42:9:43:9 | {...} | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:42:9:43:9 | {...} | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:44:9:47:9 | After catch {...} [match] | Finally.cs:19:10:19:11 | M2 |
|
|
||||||
| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:45:9:47:9 | {...} | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:45:9:47:9 | {...} | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:46:13:46:19 | Before return ...; | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:46:13:46:19 | Before return ...; | Finally.cs:19:10:19:11 | M2 |
|
||||||
@@ -3420,18 +3427,20 @@ nodeEnclosing
|
|||||||
| Finally.cs:58:31:58:36 | "Try3" | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:58:31:58:36 | "Try3" | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:59:13:59:19 | Before return ...; | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:59:13:59:19 | Before return ...; | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:59:13:59:19 | return ...; | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:59:13:59:19 | return ...; | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [match] | Finally.cs:54:10:54:11 | M3 |
|
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:54:10:54:11 | M3 |
|
||||||
|
| Finally.cs:61:38:61:39 | After IOException ex [match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:61:48:61:51 | After true [true] | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:61:48:61:51 | After true [true] | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:61:48:61:51 | true | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:61:48:61:51 | true | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:62:9:64:9 | {...} | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:62:9:64:9 | {...} | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:63:13:63:18 | Before throw ...; | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:63:13:63:18 | Before throw ...; | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:54:10:54:11 | M3 |
|
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:54:10:54:11 | M3 |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [no-match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:65:26:65:26 | Exception e | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:65:26:65:26 | Exception e | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:65:35:65:35 | access to local variable e | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:65:35:65:35 | access to local variable e | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:65:35:65:43 | After access to property Message | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:65:35:65:43 | After access to property Message | Finally.cs:54:10:54:11 | M3 |
|
||||||
@@ -3719,9 +3728,10 @@ nodeEnclosing
|
|||||||
| Finally.cs:159:27:159:44 | Before object creation of type Exception | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:159:27:159:44 | Before object creation of type Exception | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:159:41:159:43 | "1" | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:159:41:159:43 | "1" | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:147:10:147:11 | M8 |
|
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:147:10:147:11 | M8 |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:147:10:147:11 | M8 |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [no-match] | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:161:30:161:30 | Exception e | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:161:30:161:30 | Exception e | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:161:39:161:39 | access to local variable e | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:161:39:161:39 | access to local variable e | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:161:39:161:47 | After access to property Message | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:161:39:161:47 | After access to property Message | Finally.cs:147:10:147:11 | M8 |
|
||||||
@@ -3744,7 +3754,6 @@ nodeEnclosing
|
|||||||
| Finally.cs:163:35:163:41 | Before access to array element | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:163:35:163:41 | Before access to array element | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:163:35:163:41 | access to array element | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:163:35:163:41 | access to array element | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:163:40:163:40 | 0 | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:163:40:163:40 | 0 | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:165:13:168:13 | After catch {...} [match] | Finally.cs:147:10:147:11 | M8 |
|
|
||||||
| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:166:13:168:13 | After {...} | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:166:13:168:13 | After {...} | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:166:13:168:13 | {...} | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:166:13:168:13 | {...} | Finally.cs:147:10:147:11 | M8 |
|
||||||
@@ -3825,9 +3834,11 @@ nodeEnclosing
|
|||||||
| Finally.cs:186:31:186:46 | After object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:186:31:186:46 | After object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:186:31:186:46 | Before object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:186:31:186:46 | Before object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:176:10:176:11 | M9 |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:176:10:176:11 | M9 |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:176:10:176:11 | M9 |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] | Finally.cs:176:10:176:11 | M9 |
|
||||||
|
| Finally.cs:188:20:188:29 | access to type ExceptionB | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:176:10:176:11 | M9 |
|
||||||
@@ -3929,7 +3940,6 @@ nodeEnclosing
|
|||||||
| Finally.cs:220:13:220:37 | ...; | Finally.cs:216:10:216:12 | M11 |
|
| Finally.cs:220:13:220:37 | ...; | Finally.cs:216:10:216:12 | M11 |
|
||||||
| Finally.cs:220:13:220:37 | After ...; | Finally.cs:216:10:216:12 | M11 |
|
| Finally.cs:220:13:220:37 | After ...; | Finally.cs:216:10:216:12 | M11 |
|
||||||
| Finally.cs:220:31:220:35 | "Try" | Finally.cs:216:10:216:12 | M11 |
|
| Finally.cs:220:31:220:35 | "Try" | Finally.cs:216:10:216:12 | M11 |
|
||||||
| Finally.cs:222:9:225:9 | After catch {...} [match] | Finally.cs:216:10:216:12 | M11 |
|
|
||||||
| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:216:10:216:12 | M11 |
|
| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:216:10:216:12 | M11 |
|
||||||
| Finally.cs:223:9:225:9 | After {...} | Finally.cs:216:10:216:12 | M11 |
|
| Finally.cs:223:9:225:9 | After {...} | Finally.cs:216:10:216:12 | M11 |
|
||||||
| Finally.cs:223:9:225:9 | {...} | Finally.cs:216:10:216:12 | M11 |
|
| Finally.cs:223:9:225:9 | {...} | Finally.cs:216:10:216:12 | M11 |
|
||||||
@@ -8830,10 +8840,10 @@ blockEnclosing
|
|||||||
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:38:10:38:11 | Entry | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:38:10:38:11 | Exit | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:38:10:38:11 | Exit | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:38:10:38:11 | Normal Exit | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | M6 |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] | ExitMethods.cs:38:10:38:11 | M6 |
|
||||||
| ExitMethods.cs:54:10:54:11 | Entry | ExitMethods.cs:54:10:54:11 | M7 |
|
| ExitMethods.cs:54:10:54:11 | Entry | ExitMethods.cs:54:10:54:11 | M7 |
|
||||||
| ExitMethods.cs:60:10:60:11 | Entry | ExitMethods.cs:60:10:60:11 | M8 |
|
| ExitMethods.cs:60:10:60:11 | Entry | ExitMethods.cs:60:10:60:11 | M8 |
|
||||||
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:66:17:66:26 | ErrorMaybe |
|
| ExitMethods.cs:66:17:66:26 | Entry | ExitMethods.cs:66:17:66:26 | ErrorMaybe |
|
||||||
@@ -8888,13 +8898,13 @@ blockEnclosing
|
|||||||
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:19:10:19:11 | Normal Exit | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:21:9:51:9 | After try {...} ... | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:21:9:51:9 | After try {...} ... | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:23:13:23:37 | After call to method WriteLine | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:23:13:23:37 | After call to method WriteLine | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [match] | Finally.cs:19:10:19:11 | M2 |
|
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:19:10:19:11 | M2 |
|
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [match] | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:26:38:26:39 | After IOException ex [match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [match] | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
|
| Finally.cs:41:16:41:24 | After access to type Exception [match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
|
| Finally.cs:41:16:41:24 | After access to type Exception [no-match] | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | M2 |
|
| Finally.cs:49:9:51:9 | {...} | Finally.cs:19:10:19:11 | M2 |
|
||||||
| Finally.cs:54:10:54:11 | Entry | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:54:10:54:11 | Entry | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:54:10:54:11 | Exceptional Exit | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:54:10:54:11 | Exceptional Exit | Finally.cs:54:10:54:11 | M3 |
|
||||||
@@ -8902,11 +8912,12 @@ blockEnclosing
|
|||||||
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:54:10:54:11 | Normal Exit | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:56:9:71:9 | After try {...} ... | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:56:9:71:9 | After try {...} ... | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:58:13:58:37 | After call to method WriteLine | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:58:13:58:37 | After call to method WriteLine | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [match] | Finally.cs:54:10:54:11 | M3 |
|
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:54:10:54:11 | M3 |
|
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:61:38:61:39 | After IOException ex [match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
|
| Finally.cs:65:26:65:26 | After Exception e [no-match] | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:65:35:65:51 | After ... != ... [false] | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:65:35:65:51 | After ... != ... [false] | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:65:35:65:51 | After ... != ... [true] | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:65:35:65:51 | After ... != ... [true] | Finally.cs:54:10:54:11 | M3 |
|
||||||
| Finally.cs:69:9:71:9 | {...} | Finally.cs:54:10:54:11 | M3 |
|
| Finally.cs:69:9:71:9 | {...} | Finally.cs:54:10:54:11 | M3 |
|
||||||
@@ -8969,9 +8980,10 @@ blockEnclosing
|
|||||||
| Finally.cs:158:21:158:36 | After ... == ... [false] | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:158:21:158:36 | After ... == ... [false] | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:158:21:158:36 | After ... == ... [true] | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:158:21:158:36 | After ... == ... [true] | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:159:27:159:44 | After object creation of type Exception | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:159:27:159:44 | After object creation of type Exception | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:147:10:147:11 | M8 |
|
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:147:10:147:11 | M8 |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:147:10:147:11 | M8 |
|
||||||
|
| Finally.cs:161:30:161:30 | After Exception e [no-match] | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:161:39:161:54 | After ... == ... [false] | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:161:39:161:54 | After ... == ... [false] | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:161:39:161:54 | After ... == ... [true] | Finally.cs:147:10:147:11 | M8 |
|
| Finally.cs:161:39:161:54 | After ... == ... [true] | Finally.cs:147:10:147:11 | M8 |
|
||||||
| Finally.cs:172:11:172:20 | Entry | Finally.cs:172:11:172:20 | ExceptionA |
|
| Finally.cs:172:11:172:20 | Entry | Finally.cs:172:11:172:20 | ExceptionA |
|
||||||
@@ -8989,9 +9001,10 @@ blockEnclosing
|
|||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [false] | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [false] | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:186:21:186:22 | After access to parameter b2 [true] | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:186:31:186:46 | After object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:186:31:186:46 | After object creation of type ExceptionB | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:176:10:176:11 | M9 |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:176:10:176:11 | M9 |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:176:10:176:11 | M9 |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:176:10:176:11 | M9 |
|
||||||
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:176:10:176:11 | M9 |
|
| Finally.cs:190:21:190:22 | After access to parameter b1 [false] | Finally.cs:176:10:176:11 | M9 |
|
||||||
|
|||||||
@@ -1398,9 +1398,11 @@
|
|||||||
| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:13:42:31 | ...; |
|
| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:13:42:31 | ...; |
|
||||||
| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:25:42:29 | false |
|
| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:25:42:29 | false |
|
||||||
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:44:9:47:9 | catch (...) {...} |
|
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:44:9:47:9 | catch (...) {...} |
|
||||||
|
| ExitMethods.cs:44:16:44:32 | access to type ArgumentException | ExitMethods.cs:44:16:44:32 | access to type ArgumentException |
|
||||||
| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:45:9:47:9 | {...} |
|
| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:45:9:47:9 | {...} |
|
||||||
| ExitMethods.cs:46:13:46:19 | return ...; | ExitMethods.cs:46:13:46:19 | return ...; |
|
| ExitMethods.cs:46:13:46:19 | return ...; | ExitMethods.cs:46:13:46:19 | return ...; |
|
||||||
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:48:9:51:9 | catch (...) {...} |
|
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:48:9:51:9 | catch (...) {...} |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | access to type Exception | ExitMethods.cs:48:16:48:24 | access to type Exception |
|
||||||
| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:49:9:51:9 | {...} |
|
| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:49:9:51:9 | {...} |
|
||||||
| ExitMethods.cs:50:13:50:19 | return ...; | ExitMethods.cs:50:13:50:19 | return ...; |
|
| ExitMethods.cs:50:13:50:19 | return ...; | ExitMethods.cs:50:13:50:19 | return ...; |
|
||||||
| ExitMethods.cs:55:5:58:5 | {...} | ExitMethods.cs:55:5:58:5 | {...} |
|
| ExitMethods.cs:55:5:58:5 | {...} | ExitMethods.cs:55:5:58:5 | {...} |
|
||||||
@@ -1569,6 +1571,7 @@
|
|||||||
| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:38:37:38:42 | "Boo!" |
|
| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:38:37:38:42 | "Boo!" |
|
||||||
| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:38:37:38:42 | "Boo!" |
|
| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:38:37:38:42 | "Boo!" |
|
||||||
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:41:9:43:9 | catch (...) {...} |
|
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:41:9:43:9 | catch (...) {...} |
|
||||||
|
| Finally.cs:41:16:41:24 | access to type Exception | Finally.cs:41:16:41:24 | access to type Exception |
|
||||||
| Finally.cs:42:9:43:9 | {...} | Finally.cs:42:9:43:9 | {...} |
|
| Finally.cs:42:9:43:9 | {...} | Finally.cs:42:9:43:9 | {...} |
|
||||||
| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:44:9:47:9 | catch {...} |
|
| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:44:9:47:9 | catch {...} |
|
||||||
| Finally.cs:45:9:47:9 | {...} | Finally.cs:45:9:47:9 | {...} |
|
| Finally.cs:45:9:47:9 | {...} | Finally.cs:45:9:47:9 | {...} |
|
||||||
@@ -1766,6 +1769,7 @@
|
|||||||
| Finally.cs:186:25:186:47 | throw ...; | Finally.cs:186:31:186:46 | object creation of type ExceptionB |
|
| Finally.cs:186:25:186:47 | throw ...; | Finally.cs:186:31:186:46 | object creation of type ExceptionB |
|
||||||
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | object creation of type ExceptionB |
|
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | object creation of type ExceptionB |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | catch (...) {...} |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | catch (...) {...} |
|
||||||
|
| Finally.cs:188:20:188:29 | access to type ExceptionB | Finally.cs:188:20:188:29 | access to type ExceptionB |
|
||||||
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:38:188:39 | access to parameter b2 |
|
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:38:188:39 | access to parameter b2 |
|
||||||
| Finally.cs:189:13:191:13 | {...} | Finally.cs:189:13:191:13 | {...} |
|
| Finally.cs:189:13:191:13 | {...} | Finally.cs:189:13:191:13 | {...} |
|
||||||
| Finally.cs:190:17:190:47 | if (...) ... | Finally.cs:190:17:190:47 | if (...) ... |
|
| Finally.cs:190:17:190:47 | if (...) ... | Finally.cs:190:17:190:47 | if (...) ... |
|
||||||
|
|||||||
@@ -3062,17 +3062,21 @@
|
|||||||
| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | catch (...) {...} | exception |
|
| ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | ExitMethods.cs:44:9:47:9 | catch (...) {...} | exception |
|
||||||
| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:13:42:30 | Before call to method ErrorAlways | |
|
| ExitMethods.cs:42:13:42:31 | ...; | ExitMethods.cs:42:13:42:30 | Before call to method ErrorAlways | |
|
||||||
| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | |
|
| ExitMethods.cs:42:25:42:29 | false | ExitMethods.cs:42:13:42:30 | call to method ErrorAlways | |
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] | ExitMethods.cs:45:9:47:9 | {...} | |
|
|
||||||
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | catch (...) {...} | |
|
| ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | ExitMethods.cs:48:9:51:9 | catch (...) {...} | |
|
||||||
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [match] | match |
|
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:44:16:44:32 | access to type ArgumentException | |
|
||||||
| ExitMethods.cs:44:9:47:9 | catch (...) {...} | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | no-match |
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] | ExitMethods.cs:45:9:47:9 | {...} | |
|
||||||
|
| ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | ExitMethods.cs:44:9:47:9 | After catch (...) {...} [no-match] | no-match |
|
||||||
|
| ExitMethods.cs:44:16:44:32 | access to type ArgumentException | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [match] | match |
|
||||||
|
| ExitMethods.cs:44:16:44:32 | access to type ArgumentException | ExitMethods.cs:44:16:44:32 | After access to type ArgumentException [no-match] | no-match |
|
||||||
| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:46:13:46:19 | Before return ...; | |
|
| ExitMethods.cs:45:9:47:9 | {...} | ExitMethods.cs:46:13:46:19 | Before return ...; | |
|
||||||
| ExitMethods.cs:46:13:46:19 | Before return ...; | ExitMethods.cs:46:13:46:19 | return ...; | |
|
| ExitMethods.cs:46:13:46:19 | Before return ...; | ExitMethods.cs:46:13:46:19 | return ...; | |
|
||||||
| ExitMethods.cs:46:13:46:19 | return ...; | ExitMethods.cs:38:10:38:11 | Normal Exit | return |
|
| ExitMethods.cs:46:13:46:19 | return ...; | ExitMethods.cs:38:10:38:11 | Normal Exit | return |
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | ExitMethods.cs:49:9:51:9 | {...} | |
|
|
||||||
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | Exceptional Exit | exception |
|
| ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | ExitMethods.cs:38:10:38:11 | Exceptional Exit | exception |
|
||||||
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [match] | match |
|
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:48:16:48:24 | access to type Exception | |
|
||||||
| ExitMethods.cs:48:9:51:9 | catch (...) {...} | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | no-match |
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | ExitMethods.cs:49:9:51:9 | {...} | |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] | ExitMethods.cs:48:9:51:9 | After catch (...) {...} [no-match] | no-match |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | access to type Exception | ExitMethods.cs:48:16:48:24 | After access to type Exception [match] | match |
|
||||||
|
| ExitMethods.cs:48:16:48:24 | access to type Exception | ExitMethods.cs:48:16:48:24 | After access to type Exception [no-match] | no-match |
|
||||||
| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:50:13:50:19 | Before return ...; | |
|
| ExitMethods.cs:49:9:51:9 | {...} | ExitMethods.cs:50:13:50:19 | Before return ...; | |
|
||||||
| ExitMethods.cs:50:13:50:19 | Before return ...; | ExitMethods.cs:50:13:50:19 | return ...; | |
|
| ExitMethods.cs:50:13:50:19 | Before return ...; | ExitMethods.cs:50:13:50:19 | return ...; | |
|
||||||
| ExitMethods.cs:50:13:50:19 | return ...; | ExitMethods.cs:38:10:38:11 | Normal Exit | return |
|
| ExitMethods.cs:50:13:50:19 | return ...; | ExitMethods.cs:38:10:38:11 | Normal Exit | return |
|
||||||
@@ -3393,21 +3397,23 @@
|
|||||||
| Finally.cs:23:31:23:36 | "Try2" | Finally.cs:23:13:23:37 | call to method WriteLine | |
|
| Finally.cs:23:31:23:36 | "Try2" | Finally.cs:23:13:23:37 | call to method WriteLine | |
|
||||||
| Finally.cs:24:13:24:19 | Before return ...; | Finally.cs:24:13:24:19 | return ...; | |
|
| Finally.cs:24:13:24:19 | Before return ...; | Finally.cs:24:13:24:19 | return ...; | |
|
||||||
| Finally.cs:24:13:24:19 | return ...; | Finally.cs:49:9:51:9 | {...} | return |
|
| Finally.cs:24:13:24:19 | return ...; | Finally.cs:49:9:51:9 | {...} | return |
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [match] | Finally.cs:26:38:26:39 | IOException ex | |
|
|
||||||
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | catch (...) {...} | |
|
| Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | Finally.cs:30:9:40:9 | catch (...) {...} | |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [match] | match |
|
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:38:26:39 | IOException ex | |
|
||||||
| Finally.cs:26:9:29:9 | catch (...) {...} | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | no-match |
|
| Finally.cs:26:38:26:39 | After IOException ex [match] | Finally.cs:26:48:26:51 | true | |
|
||||||
| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:26:48:26:51 | true | |
|
| Finally.cs:26:38:26:39 | After IOException ex [no-match] | Finally.cs:26:9:29:9 | After catch (...) {...} [no-match] | no-match |
|
||||||
|
| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:26:38:26:39 | After IOException ex [match] | match |
|
||||||
|
| Finally.cs:26:38:26:39 | IOException ex | Finally.cs:26:38:26:39 | After IOException ex [no-match] | no-match |
|
||||||
| Finally.cs:26:48:26:51 | After true [true] | Finally.cs:27:9:29:9 | {...} | |
|
| Finally.cs:26:48:26:51 | After true [true] | Finally.cs:27:9:29:9 | {...} | |
|
||||||
| Finally.cs:26:48:26:51 | true | Finally.cs:26:48:26:51 | After true [true] | true |
|
| Finally.cs:26:48:26:51 | true | Finally.cs:26:48:26:51 | After true [true] | true |
|
||||||
| Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | Before throw ...; | |
|
| Finally.cs:27:9:29:9 | {...} | Finally.cs:28:13:28:18 | Before throw ...; | |
|
||||||
| Finally.cs:28:13:28:18 | Before throw ...; | Finally.cs:28:13:28:18 | throw ...; | |
|
| Finally.cs:28:13:28:18 | Before throw ...; | Finally.cs:28:13:28:18 | throw ...; | |
|
||||||
| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:49:9:51:9 | {...} | exception |
|
| Finally.cs:28:13:28:18 | throw ...; | Finally.cs:49:9:51:9 | {...} | exception |
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [match] | Finally.cs:30:41:30:42 | ArgumentException ex | |
|
|
||||||
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | catch (...) {...} | |
|
| Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | Finally.cs:41:9:43:9 | catch (...) {...} | |
|
||||||
| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [match] | match |
|
| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:30:41:30:42 | ArgumentException ex | |
|
||||||
| Finally.cs:30:9:40:9 | catch (...) {...} | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | no-match |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [match] | Finally.cs:31:9:40:9 | {...} | |
|
||||||
| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:31:9:40:9 | {...} | |
|
| Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | Finally.cs:30:9:40:9 | After catch (...) {...} [no-match] | no-match |
|
||||||
|
| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:30:41:30:42 | After ArgumentException ex [match] | match |
|
||||||
|
| Finally.cs:30:41:30:42 | ArgumentException ex | Finally.cs:30:41:30:42 | After ArgumentException ex [no-match] | no-match |
|
||||||
| Finally.cs:31:9:40:9 | {...} | Finally.cs:32:13:39:13 | try {...} ... | |
|
| Finally.cs:31:9:40:9 | {...} | Finally.cs:32:13:39:13 | try {...} ... | |
|
||||||
| Finally.cs:32:13:39:13 | try {...} ... | Finally.cs:33:13:35:13 | {...} | |
|
| Finally.cs:32:13:39:13 | try {...} ... | Finally.cs:33:13:35:13 | {...} | |
|
||||||
| Finally.cs:33:13:35:13 | {...} | Finally.cs:34:17:34:32 | if (...) ... | |
|
| Finally.cs:33:13:35:13 | {...} | Finally.cs:34:17:34:32 | if (...) ... | |
|
||||||
@@ -3423,13 +3429,14 @@
|
|||||||
| Finally.cs:38:23:38:43 | Before object creation of type Exception | Finally.cs:38:37:38:42 | "Boo!" | |
|
| Finally.cs:38:23:38:43 | Before object creation of type Exception | Finally.cs:38:37:38:42 | "Boo!" | |
|
||||||
| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:38:23:38:43 | After object creation of type Exception | |
|
| Finally.cs:38:23:38:43 | object creation of type Exception | Finally.cs:38:23:38:43 | After object creation of type Exception | |
|
||||||
| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:38:23:38:43 | object creation of type Exception | |
|
| Finally.cs:38:37:38:42 | "Boo!" | Finally.cs:38:23:38:43 | object creation of type Exception | |
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [match] | Finally.cs:42:9:43:9 | {...} | |
|
|
||||||
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:44:9:47:9 | catch {...} | |
|
| Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | Finally.cs:44:9:47:9 | catch {...} | |
|
||||||
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [match] | match |
|
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:41:16:41:24 | access to type Exception | |
|
||||||
| Finally.cs:41:9:43:9 | catch (...) {...} | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | no-match |
|
| Finally.cs:41:16:41:24 | After access to type Exception [match] | Finally.cs:42:9:43:9 | {...} | |
|
||||||
|
| Finally.cs:41:16:41:24 | After access to type Exception [no-match] | Finally.cs:41:9:43:9 | After catch (...) {...} [no-match] | no-match |
|
||||||
|
| Finally.cs:41:16:41:24 | access to type Exception | Finally.cs:41:16:41:24 | After access to type Exception [match] | match |
|
||||||
|
| Finally.cs:41:16:41:24 | access to type Exception | Finally.cs:41:16:41:24 | After access to type Exception [no-match] | no-match |
|
||||||
| Finally.cs:42:9:43:9 | {...} | Finally.cs:49:9:51:9 | {...} | |
|
| Finally.cs:42:9:43:9 | {...} | Finally.cs:49:9:51:9 | {...} | |
|
||||||
| Finally.cs:44:9:47:9 | After catch {...} [match] | Finally.cs:45:9:47:9 | {...} | |
|
| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:45:9:47:9 | {...} | |
|
||||||
| Finally.cs:44:9:47:9 | catch {...} | Finally.cs:44:9:47:9 | After catch {...} [match] | match |
|
|
||||||
| Finally.cs:45:9:47:9 | {...} | Finally.cs:46:13:46:19 | Before return ...; | |
|
| Finally.cs:45:9:47:9 | {...} | Finally.cs:46:13:46:19 | Before return ...; | |
|
||||||
| Finally.cs:46:13:46:19 | Before return ...; | Finally.cs:46:13:46:19 | return ...; | |
|
| Finally.cs:46:13:46:19 | Before return ...; | Finally.cs:46:13:46:19 | return ...; | |
|
||||||
| Finally.cs:46:13:46:19 | return ...; | Finally.cs:49:9:51:9 | {...} | return |
|
| Finally.cs:46:13:46:19 | return ...; | Finally.cs:49:9:51:9 | {...} | return |
|
||||||
@@ -3460,21 +3467,23 @@
|
|||||||
| Finally.cs:58:31:58:36 | "Try3" | Finally.cs:58:13:58:37 | call to method WriteLine | |
|
| Finally.cs:58:31:58:36 | "Try3" | Finally.cs:58:13:58:37 | call to method WriteLine | |
|
||||||
| Finally.cs:59:13:59:19 | Before return ...; | Finally.cs:59:13:59:19 | return ...; | |
|
| Finally.cs:59:13:59:19 | Before return ...; | Finally.cs:59:13:59:19 | return ...; | |
|
||||||
| Finally.cs:59:13:59:19 | return ...; | Finally.cs:69:9:71:9 | {...} | return |
|
| Finally.cs:59:13:59:19 | return ...; | Finally.cs:69:9:71:9 | {...} | return |
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [match] | Finally.cs:61:38:61:39 | IOException ex | |
|
|
||||||
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | catch (...) {...} | |
|
| Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | Finally.cs:65:9:67:9 | catch (...) {...} | |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [match] | match |
|
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:38:61:39 | IOException ex | |
|
||||||
| Finally.cs:61:9:64:9 | catch (...) {...} | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | no-match |
|
| Finally.cs:61:38:61:39 | After IOException ex [match] | Finally.cs:61:48:61:51 | true | |
|
||||||
| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:61:48:61:51 | true | |
|
| Finally.cs:61:38:61:39 | After IOException ex [no-match] | Finally.cs:61:9:64:9 | After catch (...) {...} [no-match] | no-match |
|
||||||
|
| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:61:38:61:39 | After IOException ex [match] | match |
|
||||||
|
| Finally.cs:61:38:61:39 | IOException ex | Finally.cs:61:38:61:39 | After IOException ex [no-match] | no-match |
|
||||||
| Finally.cs:61:48:61:51 | After true [true] | Finally.cs:62:9:64:9 | {...} | |
|
| Finally.cs:61:48:61:51 | After true [true] | Finally.cs:62:9:64:9 | {...} | |
|
||||||
| Finally.cs:61:48:61:51 | true | Finally.cs:61:48:61:51 | After true [true] | true |
|
| Finally.cs:61:48:61:51 | true | Finally.cs:61:48:61:51 | After true [true] | true |
|
||||||
| Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | Before throw ...; | |
|
| Finally.cs:62:9:64:9 | {...} | Finally.cs:63:13:63:18 | Before throw ...; | |
|
||||||
| Finally.cs:63:13:63:18 | Before throw ...; | Finally.cs:63:13:63:18 | throw ...; | |
|
| Finally.cs:63:13:63:18 | Before throw ...; | Finally.cs:63:13:63:18 | throw ...; | |
|
||||||
| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:69:9:71:9 | {...} | exception |
|
| Finally.cs:63:13:63:18 | throw ...; | Finally.cs:69:9:71:9 | {...} | exception |
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [match] | Finally.cs:65:26:65:26 | Exception e | |
|
|
||||||
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:69:9:71:9 | {...} | exception |
|
| Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | Finally.cs:69:9:71:9 | {...} | exception |
|
||||||
| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [match] | match |
|
| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:65:26:65:26 | Exception e | |
|
||||||
| Finally.cs:65:9:67:9 | catch (...) {...} | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | no-match |
|
| Finally.cs:65:26:65:26 | After Exception e [match] | Finally.cs:65:35:65:51 | Before ... != ... | |
|
||||||
| Finally.cs:65:26:65:26 | Exception e | Finally.cs:65:35:65:51 | Before ... != ... | |
|
| Finally.cs:65:26:65:26 | After Exception e [no-match] | Finally.cs:65:9:67:9 | After catch (...) {...} [no-match] | no-match |
|
||||||
|
| Finally.cs:65:26:65:26 | Exception e | Finally.cs:65:26:65:26 | After Exception e [match] | match |
|
||||||
|
| Finally.cs:65:26:65:26 | Exception e | Finally.cs:65:26:65:26 | After Exception e [no-match] | no-match |
|
||||||
| Finally.cs:65:35:65:35 | access to local variable e | Finally.cs:65:35:65:43 | access to property Message | |
|
| Finally.cs:65:35:65:35 | access to local variable e | Finally.cs:65:35:65:43 | access to property Message | |
|
||||||
| Finally.cs:65:35:65:43 | After access to property Message | Finally.cs:65:48:65:51 | null | |
|
| Finally.cs:65:35:65:43 | After access to property Message | Finally.cs:65:48:65:51 | null | |
|
||||||
| Finally.cs:65:35:65:43 | Before access to property Message | Finally.cs:65:35:65:35 | access to local variable e | |
|
| Finally.cs:65:35:65:43 | Before access to property Message | Finally.cs:65:35:65:35 | access to local variable e | |
|
||||||
@@ -3787,11 +3796,12 @@
|
|||||||
| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:27:159:44 | After object creation of type Exception | |
|
| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:159:27:159:44 | After object creation of type Exception | |
|
||||||
| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:161:13:164:13 | catch (...) {...} | exception |
|
| Finally.cs:159:27:159:44 | object creation of type Exception | Finally.cs:161:13:164:13 | catch (...) {...} | exception |
|
||||||
| Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception | |
|
| Finally.cs:159:41:159:43 | "1" | Finally.cs:159:27:159:44 | object creation of type Exception | |
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [match] | Finally.cs:161:30:161:30 | Exception e | |
|
|
||||||
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:165:13:168:13 | catch {...} | |
|
| Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | Finally.cs:165:13:168:13 | catch {...} | |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [match] | match |
|
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:30:161:30 | Exception e | |
|
||||||
| Finally.cs:161:13:164:13 | catch (...) {...} | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | no-match |
|
| Finally.cs:161:30:161:30 | After Exception e [match] | Finally.cs:161:39:161:54 | Before ... == ... | |
|
||||||
| Finally.cs:161:30:161:30 | Exception e | Finally.cs:161:39:161:54 | Before ... == ... | |
|
| Finally.cs:161:30:161:30 | After Exception e [no-match] | Finally.cs:161:13:164:13 | After catch (...) {...} [no-match] | no-match |
|
||||||
|
| Finally.cs:161:30:161:30 | Exception e | Finally.cs:161:30:161:30 | After Exception e [match] | match |
|
||||||
|
| Finally.cs:161:30:161:30 | Exception e | Finally.cs:161:30:161:30 | After Exception e [no-match] | no-match |
|
||||||
| Finally.cs:161:39:161:39 | access to local variable e | Finally.cs:161:39:161:47 | access to property Message | |
|
| Finally.cs:161:39:161:39 | access to local variable e | Finally.cs:161:39:161:47 | access to property Message | |
|
||||||
| Finally.cs:161:39:161:47 | After access to property Message | Finally.cs:161:52:161:54 | "1" | |
|
| Finally.cs:161:39:161:47 | After access to property Message | Finally.cs:161:52:161:54 | "1" | |
|
||||||
| Finally.cs:161:39:161:47 | Before access to property Message | Finally.cs:161:39:161:39 | access to local variable e | |
|
| Finally.cs:161:39:161:47 | Before access to property Message | Finally.cs:161:39:161:39 | access to local variable e | |
|
||||||
@@ -3814,8 +3824,7 @@
|
|||||||
| Finally.cs:163:35:163:41 | Before access to array element | Finally.cs:163:35:163:38 | access to parameter args | |
|
| Finally.cs:163:35:163:41 | Before access to array element | Finally.cs:163:35:163:38 | access to parameter args | |
|
||||||
| Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:35:163:41 | After access to array element | |
|
| Finally.cs:163:35:163:41 | access to array element | Finally.cs:163:35:163:41 | After access to array element | |
|
||||||
| Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:41 | access to array element | |
|
| Finally.cs:163:40:163:40 | 0 | Finally.cs:163:35:163:41 | access to array element | |
|
||||||
| Finally.cs:165:13:168:13 | After catch {...} [match] | Finally.cs:166:13:168:13 | {...} | |
|
| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:166:13:168:13 | {...} | |
|
||||||
| Finally.cs:165:13:168:13 | catch {...} | Finally.cs:165:13:168:13 | After catch {...} [match] | match |
|
|
||||||
| Finally.cs:166:13:168:13 | After {...} | Finally.cs:156:13:168:13 | After try {...} ... | |
|
| Finally.cs:166:13:168:13 | After {...} | Finally.cs:156:13:168:13 | After try {...} ... | |
|
||||||
| Finally.cs:166:13:168:13 | {...} | Finally.cs:167:17:167:38 | ...; | |
|
| Finally.cs:166:13:168:13 | {...} | Finally.cs:167:17:167:38 | ...; | |
|
||||||
| Finally.cs:167:17:167:37 | After call to method WriteLine | Finally.cs:167:17:167:38 | After ...; | |
|
| Finally.cs:167:17:167:37 | After call to method WriteLine | Finally.cs:167:17:167:38 | After ...; | |
|
||||||
@@ -3896,10 +3905,12 @@
|
|||||||
| Finally.cs:186:31:186:46 | Before object creation of type ExceptionB | Finally.cs:186:31:186:46 | object creation of type ExceptionB | |
|
| Finally.cs:186:31:186:46 | Before object creation of type ExceptionB | Finally.cs:186:31:186:46 | object creation of type ExceptionB | |
|
||||||
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | After object creation of type ExceptionB | |
|
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:186:31:186:46 | After object creation of type ExceptionB | |
|
||||||
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:188:13:191:13 | catch (...) {...} | exception |
|
| Finally.cs:186:31:186:46 | object creation of type ExceptionB | Finally.cs:188:13:191:13 | catch (...) {...} | exception |
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [match] | Finally.cs:188:38:188:39 | access to parameter b2 | |
|
|
||||||
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:176:10:176:11 | Exceptional Exit | exception |
|
| Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | Finally.cs:176:10:176:11 | Exceptional Exit | exception |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [match] | match |
|
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:20:188:29 | access to type ExceptionB | |
|
||||||
| Finally.cs:188:13:191:13 | catch (...) {...} | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | no-match |
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | Finally.cs:188:38:188:39 | access to parameter b2 | |
|
||||||
|
| Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | no-match |
|
||||||
|
| Finally.cs:188:20:188:29 | access to type ExceptionB | Finally.cs:188:20:188:29 | After access to type ExceptionB [match] | match |
|
||||||
|
| Finally.cs:188:20:188:29 | access to type ExceptionB | Finally.cs:188:20:188:29 | After access to type ExceptionB [no-match] | no-match |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | no-match |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [false] | Finally.cs:188:13:191:13 | After catch (...) {...} [no-match] | no-match |
|
||||||
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:189:13:191:13 | {...} | |
|
| Finally.cs:188:38:188:39 | After access to parameter b2 [true] | Finally.cs:189:13:191:13 | {...} | |
|
||||||
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:38:188:39 | After access to parameter b2 [false] | false |
|
| Finally.cs:188:38:188:39 | access to parameter b2 | Finally.cs:188:38:188:39 | After access to parameter b2 [false] | false |
|
||||||
@@ -4009,8 +4020,7 @@
|
|||||||
| Finally.cs:220:13:220:37 | ...; | Finally.cs:220:13:220:36 | Before call to method WriteLine | |
|
| Finally.cs:220:13:220:37 | ...; | Finally.cs:220:13:220:36 | Before call to method WriteLine | |
|
||||||
| Finally.cs:220:13:220:37 | After ...; | Finally.cs:219:9:221:9 | After {...} | |
|
| Finally.cs:220:13:220:37 | After ...; | Finally.cs:219:9:221:9 | After {...} | |
|
||||||
| Finally.cs:220:31:220:35 | "Try" | Finally.cs:220:13:220:36 | call to method WriteLine | |
|
| Finally.cs:220:31:220:35 | "Try" | Finally.cs:220:13:220:36 | call to method WriteLine | |
|
||||||
| Finally.cs:222:9:225:9 | After catch {...} [match] | Finally.cs:223:9:225:9 | {...} | |
|
| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:223:9:225:9 | {...} | |
|
||||||
| Finally.cs:222:9:225:9 | catch {...} | Finally.cs:222:9:225:9 | After catch {...} [match] | match |
|
|
||||||
| Finally.cs:223:9:225:9 | After {...} | Finally.cs:227:9:229:9 | {...} | |
|
| Finally.cs:223:9:225:9 | After {...} | Finally.cs:227:9:229:9 | {...} | |
|
||||||
| Finally.cs:223:9:225:9 | {...} | Finally.cs:224:13:224:39 | ...; | |
|
| Finally.cs:223:9:225:9 | {...} | Finally.cs:224:13:224:39 | ...; | |
|
||||||
| Finally.cs:224:13:224:38 | After call to method WriteLine | Finally.cs:224:13:224:39 | After ...; | |
|
| Finally.cs:224:13:224:38 | After call to method WriteLine | Finally.cs:224:13:224:39 | After ...; | |
|
||||||
|
|||||||
@@ -336,11 +336,12 @@
|
|||||||
| patterns.cs:142:26:142:34 | { ... } | patterns.cs:142:26:142:34 | After { ... } | semmle.label | successor |
|
| patterns.cs:142:26:142:34 | { ... } | patterns.cs:142:26:142:34 | After { ... } | semmle.label | successor |
|
||||||
| patterns.cs:142:31:142:32 | 10 | patterns.cs:142:26:142:34 | { ... } | semmle.label | successor |
|
| patterns.cs:142:31:142:32 | 10 | patterns.cs:142:26:142:34 | { ... } | semmle.label | successor |
|
||||||
| patterns.cs:142:41:142:41 | 6 | patterns.cs:136:17:143:13 | After ... switch { ... } | semmle.label | successor |
|
| patterns.cs:142:41:142:41 | 6 | patterns.cs:136:17:143:13 | After ... switch { ... } | semmle.label | successor |
|
||||||
| patterns.cs:145:9:148:9 | After catch (...) {...} [match] | patterns.cs:145:41:145:42 | InvalidOperationException ex | semmle.label | successor |
|
|
||||||
| patterns.cs:145:9:148:9 | After catch (...) {...} [no-match] | patterns.cs:123:10:123:21 | Exceptional Exit | semmle.label | exception |
|
| patterns.cs:145:9:148:9 | After catch (...) {...} [no-match] | patterns.cs:123:10:123:21 | Exceptional Exit | semmle.label | exception |
|
||||||
| patterns.cs:145:9:148:9 | catch (...) {...} | patterns.cs:145:9:148:9 | After catch (...) {...} [match] | semmle.label | match |
|
| patterns.cs:145:9:148:9 | catch (...) {...} | patterns.cs:145:41:145:42 | InvalidOperationException ex | semmle.label | successor |
|
||||||
| patterns.cs:145:9:148:9 | catch (...) {...} | patterns.cs:145:9:148:9 | After catch (...) {...} [no-match] | semmle.label | no-match |
|
| patterns.cs:145:41:145:42 | After InvalidOperationException ex [match] | patterns.cs:146:9:148:9 | {...} | semmle.label | successor |
|
||||||
| patterns.cs:145:41:145:42 | InvalidOperationException ex | patterns.cs:146:9:148:9 | {...} | semmle.label | successor |
|
| patterns.cs:145:41:145:42 | After InvalidOperationException ex [no-match] | patterns.cs:145:9:148:9 | After catch (...) {...} [no-match] | semmle.label | no-match |
|
||||||
|
| patterns.cs:145:41:145:42 | InvalidOperationException ex | patterns.cs:145:41:145:42 | After InvalidOperationException ex [match] | semmle.label | match |
|
||||||
|
| patterns.cs:145:41:145:42 | InvalidOperationException ex | patterns.cs:145:41:145:42 | After InvalidOperationException ex [no-match] | semmle.label | no-match |
|
||||||
| patterns.cs:146:9:148:9 | After {...} | patterns.cs:134:9:148:9 | After try {...} ... | semmle.label | successor |
|
| patterns.cs:146:9:148:9 | After {...} | patterns.cs:134:9:148:9 | After try {...} ... | semmle.label | successor |
|
||||||
| patterns.cs:146:9:148:9 | {...} | patterns.cs:147:13:147:51 | ...; | semmle.label | successor |
|
| patterns.cs:146:9:148:9 | {...} | patterns.cs:147:13:147:51 | ...; | semmle.label | successor |
|
||||||
| patterns.cs:147:13:147:50 | After call to method WriteLine | patterns.cs:147:13:147:51 | After ...; | semmle.label | successor |
|
| patterns.cs:147:13:147:50 | After call to method WriteLine | patterns.cs:147:13:147:51 | After ...; | semmle.label | successor |
|
||||||
|
|||||||
@@ -138,7 +138,9 @@ private module Ast implements AstSig<Location> {
|
|||||||
final private class FinalCatchClause = J::CatchClause;
|
final private class FinalCatchClause = J::CatchClause;
|
||||||
|
|
||||||
class CatchClause extends FinalCatchClause {
|
class CatchClause extends FinalCatchClause {
|
||||||
AstNode getVariable() { result = super.getVariable() }
|
AstNode getPattern() { result = super.getVariable() }
|
||||||
|
|
||||||
|
AstNode getVariable() { none() }
|
||||||
|
|
||||||
Expr getCondition() { none() }
|
Expr getCondition() { none() }
|
||||||
|
|
||||||
|
|||||||
@@ -235,15 +235,16 @@
|
|||||||
| Test.kt:84:11:84:18 | After (...)... | 4 | Test.kt:85:3:85:10 | Before return ... |
|
| Test.kt:84:11:84:18 | After (...)... | 4 | Test.kt:85:3:85:10 | Before return ... |
|
||||||
| Test.kt:84:11:84:18 | After (...)... | 5 | Test.kt:85:10:85:10 | 1 |
|
| Test.kt:84:11:84:18 | After (...)... | 5 | Test.kt:85:10:85:10 | 1 |
|
||||||
| Test.kt:84:11:84:18 | After (...)... | 6 | Test.kt:85:3:85:10 | return ... |
|
| Test.kt:84:11:84:18 | After (...)... | 6 | Test.kt:85:3:85:10 | return ... |
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 0 | Test.kt:86:4:88:2 | After catch (...) [match] |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 1 | Test.kt:86:11:86:31 | e |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 2 | Test.kt:86:34:88:2 | { ... } |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 3 | Test.kt:87:3:87:10 | Before return ... |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 4 | Test.kt:87:10:87:10 | 2 |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 5 | Test.kt:87:3:87:10 | return ... |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [no-match] | 0 | Test.kt:86:4:88:2 | After catch (...) [no-match] |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [no-match] | 1 | Test.kt:82:1:89:1 | Exceptional Exit |
|
|
||||||
| Test.kt:86:4:88:2 | catch (...) | 0 | Test.kt:86:4:88:2 | catch (...) |
|
| Test.kt:86:4:88:2 | catch (...) | 0 | Test.kt:86:4:88:2 | catch (...) |
|
||||||
|
| Test.kt:86:4:88:2 | catch (...) | 1 | Test.kt:86:11:86:31 | e |
|
||||||
|
| Test.kt:86:11:86:31 | After e [match] | 0 | Test.kt:86:11:86:31 | After e [match] |
|
||||||
|
| Test.kt:86:11:86:31 | After e [match] | 1 | Test.kt:86:34:88:2 | { ... } |
|
||||||
|
| Test.kt:86:11:86:31 | After e [match] | 2 | Test.kt:87:3:87:10 | Before return ... |
|
||||||
|
| Test.kt:86:11:86:31 | After e [match] | 3 | Test.kt:87:10:87:10 | 2 |
|
||||||
|
| Test.kt:86:11:86:31 | After e [match] | 4 | Test.kt:87:3:87:10 | return ... |
|
||||||
|
| Test.kt:86:11:86:31 | After e [no-match] | 0 | Test.kt:86:11:86:31 | After e [no-match] |
|
||||||
|
| Test.kt:86:11:86:31 | After e [no-match] | 1 | Test.kt:86:4:88:2 | After catch (...) [no-match] |
|
||||||
|
| Test.kt:86:11:86:31 | After e [no-match] | 2 | Test.kt:82:1:89:1 | Exceptional Exit |
|
||||||
| Test.kt:91:1:98:1 | Entry | 0 | Test.kt:91:1:98:1 | Entry |
|
| Test.kt:91:1:98:1 | Entry | 0 | Test.kt:91:1:98:1 | Entry |
|
||||||
| Test.kt:91:1:98:1 | Entry | 1 | Test.kt:91:22:98:1 | { ... } |
|
| Test.kt:91:1:98:1 | Entry | 1 | Test.kt:91:22:98:1 | { ... } |
|
||||||
| Test.kt:91:1:98:1 | Entry | 2 | Test.kt:92:2:97:2 | try ... |
|
| Test.kt:91:1:98:1 | Entry | 2 | Test.kt:92:2:97:2 | try ... |
|
||||||
@@ -262,15 +263,16 @@
|
|||||||
| Test.kt:93:12:93:13 | After ...!! | 4 | Test.kt:94:3:94:10 | Before return ... |
|
| Test.kt:93:12:93:13 | After ...!! | 4 | Test.kt:94:3:94:10 | Before return ... |
|
||||||
| Test.kt:93:12:93:13 | After ...!! | 5 | Test.kt:94:10:94:10 | 1 |
|
| Test.kt:93:12:93:13 | After ...!! | 5 | Test.kt:94:10:94:10 | 1 |
|
||||||
| Test.kt:93:12:93:13 | After ...!! | 6 | Test.kt:94:3:94:10 | return ... |
|
| Test.kt:93:12:93:13 | After ...!! | 6 | Test.kt:94:3:94:10 | return ... |
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 0 | Test.kt:95:4:97:2 | After catch (...) [match] |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 1 | Test.kt:95:11:95:33 | e |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 2 | Test.kt:95:36:97:2 | { ... } |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 3 | Test.kt:96:3:96:10 | Before return ... |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 4 | Test.kt:96:10:96:10 | 2 |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 5 | Test.kt:96:3:96:10 | return ... |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [no-match] | 0 | Test.kt:95:4:97:2 | After catch (...) [no-match] |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [no-match] | 1 | Test.kt:91:1:98:1 | Exceptional Exit |
|
|
||||||
| Test.kt:95:4:97:2 | catch (...) | 0 | Test.kt:95:4:97:2 | catch (...) |
|
| Test.kt:95:4:97:2 | catch (...) | 0 | Test.kt:95:4:97:2 | catch (...) |
|
||||||
|
| Test.kt:95:4:97:2 | catch (...) | 1 | Test.kt:95:11:95:33 | e |
|
||||||
|
| Test.kt:95:11:95:33 | After e [match] | 0 | Test.kt:95:11:95:33 | After e [match] |
|
||||||
|
| Test.kt:95:11:95:33 | After e [match] | 1 | Test.kt:95:36:97:2 | { ... } |
|
||||||
|
| Test.kt:95:11:95:33 | After e [match] | 2 | Test.kt:96:3:96:10 | Before return ... |
|
||||||
|
| Test.kt:95:11:95:33 | After e [match] | 3 | Test.kt:96:10:96:10 | 2 |
|
||||||
|
| Test.kt:95:11:95:33 | After e [match] | 4 | Test.kt:96:3:96:10 | return ... |
|
||||||
|
| Test.kt:95:11:95:33 | After e [no-match] | 0 | Test.kt:95:11:95:33 | After e [no-match] |
|
||||||
|
| Test.kt:95:11:95:33 | After e [no-match] | 1 | Test.kt:95:4:97:2 | After catch (...) [no-match] |
|
||||||
|
| Test.kt:95:11:95:33 | After e [no-match] | 2 | Test.kt:91:1:98:1 | Exceptional Exit |
|
||||||
| Test.kt:100:1:110:1 | Entry | 0 | Test.kt:100:1:110:1 | Entry |
|
| Test.kt:100:1:110:1 | Entry | 0 | Test.kt:100:1:110:1 | Entry |
|
||||||
| Test.kt:100:1:110:1 | Entry | 1 | Test.kt:100:25:110:1 | { ... } |
|
| Test.kt:100:1:110:1 | Entry | 1 | Test.kt:100:25:110:1 | { ... } |
|
||||||
| Test.kt:100:1:110:1 | Entry | 2 | Test.kt:101:5:103:5 | <Expr>; |
|
| Test.kt:100:1:110:1 | Entry | 2 | Test.kt:101:5:103:5 | <Expr>; |
|
||||||
|
|||||||
@@ -32,17 +32,17 @@
|
|||||||
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Normal Exit |
|
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Normal Exit |
|
||||||
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:7:84:7 | x |
|
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:7:84:7 | x |
|
||||||
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
|
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
|
||||||
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:11:86:31 | e |
|
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:34:88:2 | { ... } |
|
||||||
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
|
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
|
||||||
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:11:86:31 | e |
|
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:34:88:2 | { ... } |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exceptional Exit |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exceptional Exit |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exit |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exit |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Normal Exit |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Normal Exit |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:7:93:7 | x |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:7:93:7 | x |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:11:95:33 | e |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:36:97:2 | { ... } |
|
||||||
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
|
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
|
||||||
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:11:95:33 | e |
|
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:36:97:2 | { ... } |
|
||||||
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Exit |
|
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Exit |
|
||||||
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Normal Exit |
|
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Normal Exit |
|
||||||
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
|
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
|
||||||
|
|||||||
@@ -20,16 +20,16 @@
|
|||||||
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
|
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
|
||||||
| Test.kt:84:7:84:7 | x | Test.kt:82:1:89:1 | Normal Exit |
|
| Test.kt:84:7:84:7 | x | Test.kt:82:1:89:1 | Normal Exit |
|
||||||
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
|
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
|
||||||
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:11:86:31 | e |
|
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:34:88:2 | { ... } |
|
||||||
| Test.kt:86:11:86:31 | e | Test.kt:82:1:89:1 | Normal Exit |
|
| Test.kt:86:34:88:2 | { ... } | Test.kt:82:1:89:1 | Normal Exit |
|
||||||
| Test.kt:91:1:98:1 | Exceptional Exit | Test.kt:91:1:98:1 | Exit |
|
| Test.kt:91:1:98:1 | Exceptional Exit | Test.kt:91:1:98:1 | Exit |
|
||||||
| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit |
|
| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:7:93:7 | x |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:7:93:7 | x |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
|
||||||
| Test.kt:93:7:93:7 | x | Test.kt:91:1:98:1 | Normal Exit |
|
| Test.kt:93:7:93:7 | x | Test.kt:91:1:98:1 | Normal Exit |
|
||||||
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
|
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
|
||||||
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:11:95:33 | e |
|
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:36:97:2 | { ... } |
|
||||||
| Test.kt:95:11:95:33 | e | Test.kt:91:1:98:1 | Normal Exit |
|
| Test.kt:95:36:97:2 | { ... } | Test.kt:91:1:98:1 | Normal Exit |
|
||||||
| Test.kt:100:1:110:1 | Normal Exit | Test.kt:100:1:110:1 | Exit |
|
| Test.kt:100:1:110:1 | Normal Exit | Test.kt:100:1:110:1 | Exit |
|
||||||
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:9:101:17 | After ... (value equals) ... [false] |
|
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:9:101:17 | After ... (value equals) ... [false] |
|
||||||
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
|
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
|
||||||
|
|||||||
@@ -136,8 +136,8 @@
|
|||||||
| Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:86:4:88:2 | catch (...) | CatchClause |
|
| Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:86:4:88:2 | catch (...) | CatchClause |
|
||||||
| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
|
| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
|
||||||
| Test.kt:85:10:85:10 | 1 | IntegerLiteral | Test.kt:85:3:85:10 | return ... | ReturnStmt |
|
| Test.kt:85:10:85:10 | 1 | IntegerLiteral | Test.kt:85:3:85:10 | return ... | ReturnStmt |
|
||||||
| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:82:1:89:1 | Exceptional Exit | Method |
|
|
||||||
| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr |
|
| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr |
|
||||||
|
| Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:82:1:89:1 | Exceptional Exit | Method |
|
||||||
| Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:86:34:88:2 | { ... } | BlockStmt |
|
| Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:86:34:88:2 | { ... } | BlockStmt |
|
||||||
| Test.kt:86:34:88:2 | { ... } | BlockStmt | Test.kt:87:10:87:10 | 2 | IntegerLiteral |
|
| Test.kt:86:34:88:2 | { ... } | BlockStmt | Test.kt:87:10:87:10 | 2 | IntegerLiteral |
|
||||||
| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
|
| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
|
||||||
@@ -155,8 +155,8 @@
|
|||||||
| Test.kt:93:12:93:13 | ...!! | NotNullExpr | Test.kt:95:4:97:2 | catch (...) | CatchClause |
|
| Test.kt:93:12:93:13 | ...!! | NotNullExpr | Test.kt:95:4:97:2 | catch (...) | CatchClause |
|
||||||
| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
|
| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
|
||||||
| Test.kt:94:10:94:10 | 1 | IntegerLiteral | Test.kt:94:3:94:10 | return ... | ReturnStmt |
|
| Test.kt:94:10:94:10 | 1 | IntegerLiteral | Test.kt:94:3:94:10 | return ... | ReturnStmt |
|
||||||
| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:91:1:98:1 | Exceptional Exit | Method |
|
|
||||||
| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr |
|
| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr |
|
||||||
|
| Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:91:1:98:1 | Exceptional Exit | Method |
|
||||||
| Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:95:36:97:2 | { ... } | BlockStmt |
|
| Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:95:36:97:2 | { ... } | BlockStmt |
|
||||||
| Test.kt:95:36:97:2 | { ... } | BlockStmt | Test.kt:96:10:96:10 | 2 | IntegerLiteral |
|
| Test.kt:95:36:97:2 | { ... } | BlockStmt | Test.kt:96:10:96:10 | 2 | IntegerLiteral |
|
||||||
| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
|
| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
|
||||||
|
|||||||
@@ -235,15 +235,16 @@
|
|||||||
| Test.kt:84:11:84:18 | After (...)... | 4 | Test.kt:85:3:85:10 | Before return ... |
|
| Test.kt:84:11:84:18 | After (...)... | 4 | Test.kt:85:3:85:10 | Before return ... |
|
||||||
| Test.kt:84:11:84:18 | After (...)... | 5 | Test.kt:85:10:85:10 | 1 |
|
| Test.kt:84:11:84:18 | After (...)... | 5 | Test.kt:85:10:85:10 | 1 |
|
||||||
| Test.kt:84:11:84:18 | After (...)... | 6 | Test.kt:85:3:85:10 | return ... |
|
| Test.kt:84:11:84:18 | After (...)... | 6 | Test.kt:85:3:85:10 | return ... |
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 0 | Test.kt:86:4:88:2 | After catch (...) [match] |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 1 | Test.kt:86:11:86:31 | e |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 2 | Test.kt:86:34:88:2 | { ... } |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 3 | Test.kt:87:3:87:10 | Before return ... |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 4 | Test.kt:87:10:87:10 | 2 |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [match] | 5 | Test.kt:87:3:87:10 | return ... |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [no-match] | 0 | Test.kt:86:4:88:2 | After catch (...) [no-match] |
|
|
||||||
| Test.kt:86:4:88:2 | After catch (...) [no-match] | 1 | Test.kt:82:1:89:1 | Exceptional Exit |
|
|
||||||
| Test.kt:86:4:88:2 | catch (...) | 0 | Test.kt:86:4:88:2 | catch (...) |
|
| Test.kt:86:4:88:2 | catch (...) | 0 | Test.kt:86:4:88:2 | catch (...) |
|
||||||
|
| Test.kt:86:4:88:2 | catch (...) | 1 | Test.kt:86:11:86:31 | e |
|
||||||
|
| Test.kt:86:11:86:31 | After e [match] | 0 | Test.kt:86:11:86:31 | After e [match] |
|
||||||
|
| Test.kt:86:11:86:31 | After e [match] | 1 | Test.kt:86:34:88:2 | { ... } |
|
||||||
|
| Test.kt:86:11:86:31 | After e [match] | 2 | Test.kt:87:3:87:10 | Before return ... |
|
||||||
|
| Test.kt:86:11:86:31 | After e [match] | 3 | Test.kt:87:10:87:10 | 2 |
|
||||||
|
| Test.kt:86:11:86:31 | After e [match] | 4 | Test.kt:87:3:87:10 | return ... |
|
||||||
|
| Test.kt:86:11:86:31 | After e [no-match] | 0 | Test.kt:86:11:86:31 | After e [no-match] |
|
||||||
|
| Test.kt:86:11:86:31 | After e [no-match] | 1 | Test.kt:86:4:88:2 | After catch (...) [no-match] |
|
||||||
|
| Test.kt:86:11:86:31 | After e [no-match] | 2 | Test.kt:82:1:89:1 | Exceptional Exit |
|
||||||
| Test.kt:91:1:98:1 | Entry | 0 | Test.kt:91:1:98:1 | Entry |
|
| Test.kt:91:1:98:1 | Entry | 0 | Test.kt:91:1:98:1 | Entry |
|
||||||
| Test.kt:91:1:98:1 | Entry | 1 | Test.kt:91:22:98:1 | { ... } |
|
| Test.kt:91:1:98:1 | Entry | 1 | Test.kt:91:22:98:1 | { ... } |
|
||||||
| Test.kt:91:1:98:1 | Entry | 2 | Test.kt:92:2:97:2 | try ... |
|
| Test.kt:91:1:98:1 | Entry | 2 | Test.kt:92:2:97:2 | try ... |
|
||||||
@@ -262,15 +263,16 @@
|
|||||||
| Test.kt:93:11:93:13 | After ...!! | 4 | Test.kt:94:3:94:10 | Before return ... |
|
| Test.kt:93:11:93:13 | After ...!! | 4 | Test.kt:94:3:94:10 | Before return ... |
|
||||||
| Test.kt:93:11:93:13 | After ...!! | 5 | Test.kt:94:10:94:10 | 1 |
|
| Test.kt:93:11:93:13 | After ...!! | 5 | Test.kt:94:10:94:10 | 1 |
|
||||||
| Test.kt:93:11:93:13 | After ...!! | 6 | Test.kt:94:3:94:10 | return ... |
|
| Test.kt:93:11:93:13 | After ...!! | 6 | Test.kt:94:3:94:10 | return ... |
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 0 | Test.kt:95:4:97:2 | After catch (...) [match] |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 1 | Test.kt:95:11:95:33 | e |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 2 | Test.kt:95:36:97:2 | { ... } |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 3 | Test.kt:96:3:96:10 | Before return ... |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 4 | Test.kt:96:10:96:10 | 2 |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [match] | 5 | Test.kt:96:3:96:10 | return ... |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [no-match] | 0 | Test.kt:95:4:97:2 | After catch (...) [no-match] |
|
|
||||||
| Test.kt:95:4:97:2 | After catch (...) [no-match] | 1 | Test.kt:91:1:98:1 | Exceptional Exit |
|
|
||||||
| Test.kt:95:4:97:2 | catch (...) | 0 | Test.kt:95:4:97:2 | catch (...) |
|
| Test.kt:95:4:97:2 | catch (...) | 0 | Test.kt:95:4:97:2 | catch (...) |
|
||||||
|
| Test.kt:95:4:97:2 | catch (...) | 1 | Test.kt:95:11:95:33 | e |
|
||||||
|
| Test.kt:95:11:95:33 | After e [match] | 0 | Test.kt:95:11:95:33 | After e [match] |
|
||||||
|
| Test.kt:95:11:95:33 | After e [match] | 1 | Test.kt:95:36:97:2 | { ... } |
|
||||||
|
| Test.kt:95:11:95:33 | After e [match] | 2 | Test.kt:96:3:96:10 | Before return ... |
|
||||||
|
| Test.kt:95:11:95:33 | After e [match] | 3 | Test.kt:96:10:96:10 | 2 |
|
||||||
|
| Test.kt:95:11:95:33 | After e [match] | 4 | Test.kt:96:3:96:10 | return ... |
|
||||||
|
| Test.kt:95:11:95:33 | After e [no-match] | 0 | Test.kt:95:11:95:33 | After e [no-match] |
|
||||||
|
| Test.kt:95:11:95:33 | After e [no-match] | 1 | Test.kt:95:4:97:2 | After catch (...) [no-match] |
|
||||||
|
| Test.kt:95:11:95:33 | After e [no-match] | 2 | Test.kt:91:1:98:1 | Exceptional Exit |
|
||||||
| Test.kt:100:1:110:1 | Entry | 0 | Test.kt:100:1:110:1 | Entry |
|
| Test.kt:100:1:110:1 | Entry | 0 | Test.kt:100:1:110:1 | Entry |
|
||||||
| Test.kt:100:1:110:1 | Entry | 1 | Test.kt:100:25:110:1 | { ... } |
|
| Test.kt:100:1:110:1 | Entry | 1 | Test.kt:100:25:110:1 | { ... } |
|
||||||
| Test.kt:100:1:110:1 | Entry | 2 | Test.kt:101:5:103:5 | <Expr>; |
|
| Test.kt:100:1:110:1 | Entry | 2 | Test.kt:101:5:103:5 | <Expr>; |
|
||||||
|
|||||||
@@ -32,17 +32,17 @@
|
|||||||
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Normal Exit |
|
| Test.kt:82:21:89:1 | { ... } | Test.kt:82:1:89:1 | Normal Exit |
|
||||||
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | x |
|
| Test.kt:82:21:89:1 | { ... } | Test.kt:84:3:84:18 | x |
|
||||||
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
|
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
|
||||||
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:11:86:31 | e |
|
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:34:88:2 | { ... } |
|
||||||
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
|
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
|
||||||
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:11:86:31 | e |
|
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:34:88:2 | { ... } |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exceptional Exit |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exceptional Exit |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exit |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Exit |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Normal Exit |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:91:1:98:1 | Normal Exit |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:11:95:33 | e |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:36:97:2 | { ... } |
|
||||||
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
|
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
|
||||||
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:11:95:33 | e |
|
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:36:97:2 | { ... } |
|
||||||
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Exit |
|
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Exit |
|
||||||
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Normal Exit |
|
| Test.kt:100:25:110:1 | { ... } | Test.kt:100:1:110:1 | Normal Exit |
|
||||||
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
|
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
|
||||||
|
|||||||
@@ -20,16 +20,16 @@
|
|||||||
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
|
| Test.kt:82:21:89:1 | { ... } | Test.kt:86:4:88:2 | catch (...) |
|
||||||
| Test.kt:84:3:84:18 | x | Test.kt:82:1:89:1 | Normal Exit |
|
| Test.kt:84:3:84:18 | x | Test.kt:82:1:89:1 | Normal Exit |
|
||||||
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
|
| Test.kt:86:4:88:2 | catch (...) | Test.kt:82:1:89:1 | Exceptional Exit |
|
||||||
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:11:86:31 | e |
|
| Test.kt:86:4:88:2 | catch (...) | Test.kt:86:34:88:2 | { ... } |
|
||||||
| Test.kt:86:11:86:31 | e | Test.kt:82:1:89:1 | Normal Exit |
|
| Test.kt:86:34:88:2 | { ... } | Test.kt:82:1:89:1 | Normal Exit |
|
||||||
| Test.kt:91:1:98:1 | Exceptional Exit | Test.kt:91:1:98:1 | Exit |
|
| Test.kt:91:1:98:1 | Exceptional Exit | Test.kt:91:1:98:1 | Exit |
|
||||||
| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit |
|
| Test.kt:91:1:98:1 | Normal Exit | Test.kt:91:1:98:1 | Exit |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:93:3:93:13 | x |
|
||||||
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
|
| Test.kt:91:22:98:1 | { ... } | Test.kt:95:4:97:2 | catch (...) |
|
||||||
| Test.kt:93:3:93:13 | x | Test.kt:91:1:98:1 | Normal Exit |
|
| Test.kt:93:3:93:13 | x | Test.kt:91:1:98:1 | Normal Exit |
|
||||||
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
|
| Test.kt:95:4:97:2 | catch (...) | Test.kt:91:1:98:1 | Exceptional Exit |
|
||||||
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:11:95:33 | e |
|
| Test.kt:95:4:97:2 | catch (...) | Test.kt:95:36:97:2 | { ... } |
|
||||||
| Test.kt:95:11:95:33 | e | Test.kt:91:1:98:1 | Normal Exit |
|
| Test.kt:95:36:97:2 | { ... } | Test.kt:91:1:98:1 | Normal Exit |
|
||||||
| Test.kt:100:1:110:1 | Normal Exit | Test.kt:100:1:110:1 | Exit |
|
| Test.kt:100:1:110:1 | Normal Exit | Test.kt:100:1:110:1 | Exit |
|
||||||
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:9:101:17 | After ... (value equals) ... [false] |
|
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:9:101:17 | After ... (value equals) ... [false] |
|
||||||
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
|
| Test.kt:100:25:110:1 | { ... } | Test.kt:101:22:101:22 | y |
|
||||||
|
|||||||
@@ -136,8 +136,8 @@
|
|||||||
| Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:86:4:88:2 | catch (...) | CatchClause |
|
| Test.kt:84:11:84:18 | (...)... | CastExpr | Test.kt:86:4:88:2 | catch (...) | CatchClause |
|
||||||
| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
|
| Test.kt:85:3:85:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
|
||||||
| Test.kt:85:10:85:10 | 1 | IntegerLiteral | Test.kt:85:3:85:10 | return ... | ReturnStmt |
|
| Test.kt:85:10:85:10 | 1 | IntegerLiteral | Test.kt:85:3:85:10 | return ... | ReturnStmt |
|
||||||
| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:82:1:89:1 | Exceptional Exit | Method |
|
|
||||||
| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr |
|
| Test.kt:86:4:88:2 | catch (...) | CatchClause | Test.kt:86:11:86:31 | e | LocalVariableDeclExpr |
|
||||||
|
| Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:82:1:89:1 | Exceptional Exit | Method |
|
||||||
| Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:86:34:88:2 | { ... } | BlockStmt |
|
| Test.kt:86:11:86:31 | e | LocalVariableDeclExpr | Test.kt:86:34:88:2 | { ... } | BlockStmt |
|
||||||
| Test.kt:86:34:88:2 | { ... } | BlockStmt | Test.kt:87:10:87:10 | 2 | IntegerLiteral |
|
| Test.kt:86:34:88:2 | { ... } | BlockStmt | Test.kt:87:10:87:10 | 2 | IntegerLiteral |
|
||||||
| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
|
| Test.kt:87:3:87:10 | return ... | ReturnStmt | Test.kt:82:1:89:1 | Normal Exit | Method |
|
||||||
@@ -155,8 +155,8 @@
|
|||||||
| Test.kt:93:11:93:13 | ...!! | NotNullExpr | Test.kt:95:4:97:2 | catch (...) | CatchClause |
|
| Test.kt:93:11:93:13 | ...!! | NotNullExpr | Test.kt:95:4:97:2 | catch (...) | CatchClause |
|
||||||
| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
|
| Test.kt:94:3:94:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
|
||||||
| Test.kt:94:10:94:10 | 1 | IntegerLiteral | Test.kt:94:3:94:10 | return ... | ReturnStmt |
|
| Test.kt:94:10:94:10 | 1 | IntegerLiteral | Test.kt:94:3:94:10 | return ... | ReturnStmt |
|
||||||
| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:91:1:98:1 | Exceptional Exit | Method |
|
|
||||||
| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr |
|
| Test.kt:95:4:97:2 | catch (...) | CatchClause | Test.kt:95:11:95:33 | e | LocalVariableDeclExpr |
|
||||||
|
| Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:91:1:98:1 | Exceptional Exit | Method |
|
||||||
| Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:95:36:97:2 | { ... } | BlockStmt |
|
| Test.kt:95:11:95:33 | e | LocalVariableDeclExpr | Test.kt:95:36:97:2 | { ... } | BlockStmt |
|
||||||
| Test.kt:95:36:97:2 | { ... } | BlockStmt | Test.kt:96:10:96:10 | 2 | IntegerLiteral |
|
| Test.kt:95:36:97:2 | { ... } | BlockStmt | Test.kt:96:10:96:10 | 2 | IntegerLiteral |
|
||||||
| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
|
| Test.kt:96:3:96:10 | return ... | ReturnStmt | Test.kt:91:1:98:1 | Normal Exit | Method |
|
||||||
|
|||||||
@@ -14,8 +14,8 @@
|
|||||||
| MultiCatch.java:12:11:12:27 | new IOException(...) | MultiCatch.java:12:5:12:28 | throw ... |
|
| MultiCatch.java:12:11:12:27 | new IOException(...) | MultiCatch.java:12:5:12:28 | throw ... |
|
||||||
| MultiCatch.java:14:5:14:29 | throw ... | MultiCatch.java:15:5:15:37 | catch (...) |
|
| MultiCatch.java:14:5:14:29 | throw ... | MultiCatch.java:15:5:15:37 | catch (...) |
|
||||||
| MultiCatch.java:14:11:14:28 | new SQLException(...) | MultiCatch.java:14:5:14:29 | throw ... |
|
| MultiCatch.java:14:11:14:28 | new SQLException(...) | MultiCatch.java:14:5:14:29 | throw ... |
|
||||||
| MultiCatch.java:15:5:15:37 | catch (...) | MultiCatch.java:7:14:7:23 | Exceptional Exit |
|
|
||||||
| MultiCatch.java:15:5:15:37 | catch (...) | MultiCatch.java:15:36:15:36 | e |
|
| MultiCatch.java:15:5:15:37 | catch (...) | MultiCatch.java:15:36:15:36 | e |
|
||||||
|
| MultiCatch.java:15:36:15:36 | e | MultiCatch.java:7:14:7:23 | Exceptional Exit |
|
||||||
| MultiCatch.java:15:36:15:36 | e | MultiCatch.java:16:3:19:3 | { ... } |
|
| MultiCatch.java:15:36:15:36 | e | MultiCatch.java:16:3:19:3 | { ... } |
|
||||||
| MultiCatch.java:16:3:19:3 | { ... } | MultiCatch.java:17:4:17:23 | <Expr>; |
|
| MultiCatch.java:16:3:19:3 | { ... } | MultiCatch.java:17:4:17:23 | <Expr>; |
|
||||||
| MultiCatch.java:17:4:17:4 | e | MultiCatch.java:17:4:17:22 | printStackTrace(...) |
|
| MultiCatch.java:17:4:17:4 | e | MultiCatch.java:17:4:17:22 | printStackTrace(...) |
|
||||||
@@ -41,8 +41,8 @@
|
|||||||
| MultiCatch.java:29:11:29:28 | new SQLException(...) | MultiCatch.java:29:5:29:29 | throw ... |
|
| MultiCatch.java:29:11:29:28 | new SQLException(...) | MultiCatch.java:29:5:29:29 | throw ... |
|
||||||
| MultiCatch.java:30:4:30:25 | throw ... | MultiCatch.java:31:5:31:37 | catch (...) |
|
| MultiCatch.java:30:4:30:25 | throw ... | MultiCatch.java:31:5:31:37 | catch (...) |
|
||||||
| MultiCatch.java:30:10:30:24 | new Exception(...) | MultiCatch.java:30:4:30:25 | throw ... |
|
| MultiCatch.java:30:10:30:24 | new Exception(...) | MultiCatch.java:30:4:30:25 | throw ... |
|
||||||
| MultiCatch.java:31:5:31:37 | catch (...) | MultiCatch.java:22:14:22:24 | Exceptional Exit |
|
|
||||||
| MultiCatch.java:31:5:31:37 | catch (...) | MultiCatch.java:31:36:31:36 | e |
|
| MultiCatch.java:31:5:31:37 | catch (...) | MultiCatch.java:31:36:31:36 | e |
|
||||||
|
| MultiCatch.java:31:36:31:36 | e | MultiCatch.java:22:14:22:24 | Exceptional Exit |
|
||||||
| MultiCatch.java:31:36:31:36 | e | MultiCatch.java:32:3:32:4 | { ... } |
|
| MultiCatch.java:31:36:31:36 | e | MultiCatch.java:32:3:32:4 | { ... } |
|
||||||
| MultiCatch.java:32:3:32:4 | { ... } | MultiCatch.java:22:14:22:24 | Normal Exit |
|
| MultiCatch.java:32:3:32:4 | { ... } | MultiCatch.java:22:14:22:24 | Normal Exit |
|
||||||
| MultiCatch.java:35:14:35:26 | Entry | MultiCatch.java:36:2:42:2 | { ... } |
|
| MultiCatch.java:35:14:35:26 | Entry | MultiCatch.java:36:2:42:2 | { ... } |
|
||||||
|
|||||||
@@ -28,8 +28,8 @@
|
|||||||
| CloseReaderTest.java:19:11:19:15 | stdin | CloseReaderTest.java:19:11:19:26 | readLine(...) |
|
| CloseReaderTest.java:19:11:19:15 | stdin | CloseReaderTest.java:19:11:19:26 | readLine(...) |
|
||||||
| CloseReaderTest.java:19:11:19:26 | readLine(...) | CloseReaderTest.java:19:4:19:27 | return ... |
|
| CloseReaderTest.java:19:11:19:26 | readLine(...) | CloseReaderTest.java:19:4:19:27 | return ... |
|
||||||
| CloseReaderTest.java:19:11:19:26 | readLine(...) | CloseReaderTest.java:20:5:20:26 | catch (...) |
|
| CloseReaderTest.java:19:11:19:26 | readLine(...) | CloseReaderTest.java:20:5:20:26 | catch (...) |
|
||||||
| CloseReaderTest.java:20:5:20:26 | catch (...) | CloseReaderTest.java:9:23:9:34 | Exceptional Exit |
|
|
||||||
| CloseReaderTest.java:20:5:20:26 | catch (...) | CloseReaderTest.java:20:24:20:25 | ex |
|
| CloseReaderTest.java:20:5:20:26 | catch (...) | CloseReaderTest.java:20:24:20:25 | ex |
|
||||||
|
| CloseReaderTest.java:20:24:20:25 | ex | CloseReaderTest.java:9:23:9:34 | Exceptional Exit |
|
||||||
| CloseReaderTest.java:20:24:20:25 | ex | CloseReaderTest.java:21:3:23:3 | { ... } |
|
| CloseReaderTest.java:20:24:20:25 | ex | CloseReaderTest.java:21:3:23:3 | { ... } |
|
||||||
| CloseReaderTest.java:21:3:23:3 | { ... } | CloseReaderTest.java:22:11:22:14 | null |
|
| CloseReaderTest.java:21:3:23:3 | { ... } | CloseReaderTest.java:22:11:22:14 | null |
|
||||||
| CloseReaderTest.java:22:4:22:15 | return ... | CloseReaderTest.java:9:23:9:34 | Normal Exit |
|
| CloseReaderTest.java:22:4:22:15 | return ... | CloseReaderTest.java:9:23:9:34 | Normal Exit |
|
||||||
|
|||||||
@@ -50,16 +50,16 @@
|
|||||||
| SchackTest.java:16:4:16:41 | <Expr>; | SchackTest.java:16:4:16:13 | System.out |
|
| SchackTest.java:16:4:16:41 | <Expr>; | SchackTest.java:16:4:16:13 | System.out |
|
||||||
| SchackTest.java:16:23:16:39 | "false successor" | SchackTest.java:16:4:16:40 | println(...) |
|
| SchackTest.java:16:23:16:39 | "false successor" | SchackTest.java:16:4:16:40 | println(...) |
|
||||||
| SchackTest.java:17:5:17:17 | catch (...) | SchackTest.java:17:16:17:16 | e |
|
| SchackTest.java:17:5:17:17 | catch (...) | SchackTest.java:17:16:17:16 | e |
|
||||||
| SchackTest.java:17:5:17:17 | catch (...) | SchackTest.java:19:5:19:17 | catch (...) |
|
|
||||||
| SchackTest.java:17:16:17:16 | e | SchackTest.java:17:19:19:3 | { ... } |
|
| SchackTest.java:17:16:17:16 | e | SchackTest.java:17:19:19:3 | { ... } |
|
||||||
|
| SchackTest.java:17:16:17:16 | e | SchackTest.java:19:5:19:17 | catch (...) |
|
||||||
| SchackTest.java:17:19:19:3 | { ... } | SchackTest.java:18:4:18:41 | <Expr>; |
|
| SchackTest.java:17:19:19:3 | { ... } | SchackTest.java:18:4:18:41 | <Expr>; |
|
||||||
| SchackTest.java:18:4:18:13 | System.out | SchackTest.java:18:23:18:39 | "false successor" |
|
| SchackTest.java:18:4:18:13 | System.out | SchackTest.java:18:23:18:39 | "false successor" |
|
||||||
| SchackTest.java:18:4:18:40 | println(...) | SchackTest.java:21:13:23:3 | { ... } |
|
| SchackTest.java:18:4:18:40 | println(...) | SchackTest.java:21:13:23:3 | { ... } |
|
||||||
| SchackTest.java:18:4:18:41 | <Expr>; | SchackTest.java:18:4:18:13 | System.out |
|
| SchackTest.java:18:4:18:41 | <Expr>; | SchackTest.java:18:4:18:13 | System.out |
|
||||||
| SchackTest.java:18:23:18:39 | "false successor" | SchackTest.java:18:4:18:40 | println(...) |
|
| SchackTest.java:18:23:18:39 | "false successor" | SchackTest.java:18:4:18:40 | println(...) |
|
||||||
| SchackTest.java:19:5:19:17 | catch (...) | SchackTest.java:19:16:19:16 | e |
|
| SchackTest.java:19:5:19:17 | catch (...) | SchackTest.java:19:16:19:16 | e |
|
||||||
| SchackTest.java:19:5:19:17 | catch (...) | SchackTest.java:21:13:23:3 | { ... } |
|
|
||||||
| SchackTest.java:19:16:19:16 | e | SchackTest.java:19:19:21:3 | { ... } |
|
| SchackTest.java:19:16:19:16 | e | SchackTest.java:19:19:21:3 | { ... } |
|
||||||
|
| SchackTest.java:19:16:19:16 | e | SchackTest.java:21:13:23:3 | { ... } |
|
||||||
| SchackTest.java:19:19:21:3 | { ... } | SchackTest.java:20:4:20:74 | <Expr>; |
|
| SchackTest.java:19:19:21:3 | { ... } | SchackTest.java:20:4:20:74 | <Expr>; |
|
||||||
| SchackTest.java:20:4:20:13 | System.out | SchackTest.java:20:23:20:72 | "successor (but neither true nor false successor)" |
|
| SchackTest.java:20:4:20:13 | System.out | SchackTest.java:20:23:20:72 | "successor (but neither true nor false successor)" |
|
||||||
| SchackTest.java:20:4:20:73 | println(...) | SchackTest.java:21:13:23:3 | { ... } |
|
| SchackTest.java:20:4:20:73 | println(...) | SchackTest.java:21:13:23:3 | { ... } |
|
||||||
|
|||||||
@@ -18,8 +18,8 @@
|
|||||||
| TestThrow.java:20:10:20:31 | new RuntimeException(...) | TestThrow.java:20:4:20:32 | throw ... |
|
| TestThrow.java:20:10:20:31 | new RuntimeException(...) | TestThrow.java:20:4:20:32 | throw ... |
|
||||||
| TestThrow.java:20:10:20:31 | new RuntimeException(...) | TestThrow.java:21:5:21:30 | catch (...) |
|
| TestThrow.java:20:10:20:31 | new RuntimeException(...) | TestThrow.java:21:5:21:30 | catch (...) |
|
||||||
| TestThrow.java:21:5:21:30 | catch (...) | TestThrow.java:21:29:21:29 | e |
|
| TestThrow.java:21:5:21:30 | catch (...) | TestThrow.java:21:29:21:29 | e |
|
||||||
| TestThrow.java:21:5:21:30 | catch (...) | TestThrow.java:24:5:24:23 | catch (...) |
|
|
||||||
| TestThrow.java:21:29:21:29 | e | TestThrow.java:22:3:24:3 | { ... } |
|
| TestThrow.java:21:29:21:29 | e | TestThrow.java:22:3:24:3 | { ... } |
|
||||||
|
| TestThrow.java:21:29:21:29 | e | TestThrow.java:24:5:24:23 | catch (...) |
|
||||||
| TestThrow.java:22:3:24:3 | { ... } | TestThrow.java:23:4:23:9 | <Expr>; |
|
| TestThrow.java:22:3:24:3 | { ... } | TestThrow.java:23:4:23:9 | <Expr>; |
|
||||||
| TestThrow.java:23:4:23:4 | z | TestThrow.java:23:8:23:8 | 1 |
|
| TestThrow.java:23:4:23:4 | z | TestThrow.java:23:8:23:8 | 1 |
|
||||||
| TestThrow.java:23:4:23:8 | ...=... | TestThrow.java:29:3:29:9 | <Expr>; |
|
| TestThrow.java:23:4:23:8 | ...=... | TestThrow.java:29:3:29:9 | <Expr>; |
|
||||||
@@ -71,8 +71,8 @@
|
|||||||
| TestThrow.java:44:5:44:13 | thrower(...) | TestThrow.java:50:3:52:3 | { ... } |
|
| TestThrow.java:44:5:44:13 | thrower(...) | TestThrow.java:50:3:52:3 | { ... } |
|
||||||
| TestThrow.java:44:5:44:14 | <Expr>; | TestThrow.java:44:5:44:13 | thrower(...) |
|
| TestThrow.java:44:5:44:14 | <Expr>; | TestThrow.java:44:5:44:13 | thrower(...) |
|
||||||
| TestThrow.java:46:5:46:30 | catch (...) | TestThrow.java:46:29:46:29 | e |
|
| TestThrow.java:46:5:46:30 | catch (...) | TestThrow.java:46:29:46:29 | e |
|
||||||
| TestThrow.java:46:5:46:30 | catch (...) | TestThrow.java:50:3:52:3 | { ... } |
|
|
||||||
| TestThrow.java:46:29:46:29 | e | TestThrow.java:47:3:49:3 | { ... } |
|
| TestThrow.java:46:29:46:29 | e | TestThrow.java:47:3:49:3 | { ... } |
|
||||||
|
| TestThrow.java:46:29:46:29 | e | TestThrow.java:50:3:52:3 | { ... } |
|
||||||
| TestThrow.java:47:3:49:3 | { ... } | TestThrow.java:48:4:48:9 | <Expr>; |
|
| TestThrow.java:47:3:49:3 | { ... } | TestThrow.java:48:4:48:9 | <Expr>; |
|
||||||
| TestThrow.java:48:4:48:4 | z | TestThrow.java:48:8:48:8 | 1 |
|
| TestThrow.java:48:4:48:4 | z | TestThrow.java:48:8:48:8 | 1 |
|
||||||
| TestThrow.java:48:4:48:8 | ...=... | TestThrow.java:50:3:52:3 | { ... } |
|
| TestThrow.java:48:4:48:8 | ...=... | TestThrow.java:50:3:52:3 | { ... } |
|
||||||
@@ -113,8 +113,8 @@
|
|||||||
| TestThrow.java:67:5:67:13 | thrower(...) | TestThrow.java:69:5:69:30 | catch (...) |
|
| TestThrow.java:67:5:67:13 | thrower(...) | TestThrow.java:69:5:69:30 | catch (...) |
|
||||||
| TestThrow.java:67:5:67:13 | thrower(...) | TestThrow.java:74:3:74:9 | <Expr>; |
|
| TestThrow.java:67:5:67:13 | thrower(...) | TestThrow.java:74:3:74:9 | <Expr>; |
|
||||||
| TestThrow.java:67:5:67:14 | <Expr>; | TestThrow.java:67:5:67:13 | thrower(...) |
|
| TestThrow.java:67:5:67:14 | <Expr>; | TestThrow.java:67:5:67:13 | thrower(...) |
|
||||||
| TestThrow.java:69:5:69:30 | catch (...) | TestThrow.java:15:14:15:14 | Exceptional Exit |
|
|
||||||
| TestThrow.java:69:5:69:30 | catch (...) | TestThrow.java:69:29:69:29 | e |
|
| TestThrow.java:69:5:69:30 | catch (...) | TestThrow.java:69:29:69:29 | e |
|
||||||
|
| TestThrow.java:69:29:69:29 | e | TestThrow.java:15:14:15:14 | Exceptional Exit |
|
||||||
| TestThrow.java:69:29:69:29 | e | TestThrow.java:70:3:72:3 | { ... } |
|
| TestThrow.java:69:29:69:29 | e | TestThrow.java:70:3:72:3 | { ... } |
|
||||||
| TestThrow.java:70:3:72:3 | { ... } | TestThrow.java:71:4:71:9 | <Expr>; |
|
| TestThrow.java:70:3:72:3 | { ... } | TestThrow.java:71:4:71:9 | <Expr>; |
|
||||||
| TestThrow.java:71:4:71:4 | z | TestThrow.java:71:8:71:8 | 1 |
|
| TestThrow.java:71:4:71:4 | z | TestThrow.java:71:8:71:8 | 1 |
|
||||||
@@ -171,8 +171,8 @@
|
|||||||
| TestThrow.java:97:28:97:36 | "Foo bar" | TestThrow.java:97:39:97:42 | null |
|
| TestThrow.java:97:28:97:36 | "Foo bar" | TestThrow.java:97:39:97:42 | null |
|
||||||
| TestThrow.java:97:39:97:42 | null | TestThrow.java:97:12:97:43 | new IOException(...) |
|
| TestThrow.java:97:39:97:42 | null | TestThrow.java:97:12:97:43 | new IOException(...) |
|
||||||
| TestThrow.java:99:6:99:31 | catch (...) | TestThrow.java:99:30:99:30 | e |
|
| TestThrow.java:99:6:99:31 | catch (...) | TestThrow.java:99:30:99:30 | e |
|
||||||
| TestThrow.java:99:6:99:31 | catch (...) | TestThrow.java:119:5:119:25 | catch (...) |
|
|
||||||
| TestThrow.java:99:30:99:30 | e | TestThrow.java:100:4:102:4 | { ... } |
|
| TestThrow.java:99:30:99:30 | e | TestThrow.java:100:4:102:4 | { ... } |
|
||||||
|
| TestThrow.java:99:30:99:30 | e | TestThrow.java:119:5:119:25 | catch (...) |
|
||||||
| TestThrow.java:100:4:102:4 | { ... } | TestThrow.java:101:5:101:10 | <Expr>; |
|
| TestThrow.java:100:4:102:4 | { ... } | TestThrow.java:101:5:101:10 | <Expr>; |
|
||||||
| TestThrow.java:101:5:101:5 | z | TestThrow.java:101:9:101:9 | 1 |
|
| TestThrow.java:101:5:101:5 | z | TestThrow.java:101:9:101:9 | 1 |
|
||||||
| TestThrow.java:101:5:101:9 | ...=... | TestThrow.java:103:4:118:4 | try ... |
|
| TestThrow.java:101:5:101:9 | ...=... | TestThrow.java:103:4:118:4 | try ... |
|
||||||
@@ -216,8 +216,8 @@
|
|||||||
| TestThrow.java:116:28:116:36 | "Foo bar" | TestThrow.java:116:39:116:42 | null |
|
| TestThrow.java:116:28:116:36 | "Foo bar" | TestThrow.java:116:39:116:42 | null |
|
||||||
| TestThrow.java:116:39:116:42 | null | TestThrow.java:116:12:116:43 | new IOException(...) |
|
| TestThrow.java:116:39:116:42 | null | TestThrow.java:116:12:116:43 | new IOException(...) |
|
||||||
| TestThrow.java:119:5:119:25 | catch (...) | TestThrow.java:119:24:119:24 | e |
|
| TestThrow.java:119:5:119:25 | catch (...) | TestThrow.java:119:24:119:24 | e |
|
||||||
| TestThrow.java:119:5:119:25 | catch (...) | TestThrow.java:124:3:126:3 | { ... } |
|
|
||||||
| TestThrow.java:119:24:119:24 | e | TestThrow.java:120:3:122:3 | { ... } |
|
| TestThrow.java:119:24:119:24 | e | TestThrow.java:120:3:122:3 | { ... } |
|
||||||
|
| TestThrow.java:119:24:119:24 | e | TestThrow.java:124:3:126:3 | { ... } |
|
||||||
| TestThrow.java:120:3:122:3 | { ... } | TestThrow.java:121:4:121:9 | <Expr>; |
|
| TestThrow.java:120:3:122:3 | { ... } | TestThrow.java:121:4:121:9 | <Expr>; |
|
||||||
| TestThrow.java:121:4:121:4 | z | TestThrow.java:121:8:121:8 | 2 |
|
| TestThrow.java:121:4:121:4 | z | TestThrow.java:121:8:121:8 | 2 |
|
||||||
| TestThrow.java:121:4:121:8 | ...=... | TestThrow.java:124:3:126:3 | { ... } |
|
| TestThrow.java:121:4:121:8 | ...=... | TestThrow.java:124:3:126:3 | { ... } |
|
||||||
|
|||||||
@@ -105,8 +105,8 @@
|
|||||||
| TestTryCatch.java:34:9:34:9 | y | TestTryCatch.java:34:13:34:13 | 1 |
|
| TestTryCatch.java:34:9:34:9 | y | TestTryCatch.java:34:13:34:13 | 1 |
|
||||||
| TestTryCatch.java:34:9:34:13 | ... + ... | TestTryCatch.java:34:5:34:13 | ...=... |
|
| TestTryCatch.java:34:9:34:13 | ... + ... | TestTryCatch.java:34:5:34:13 | ...=... |
|
||||||
| TestTryCatch.java:34:13:34:13 | 1 | TestTryCatch.java:34:9:34:13 | ... + ... |
|
| TestTryCatch.java:34:13:34:13 | 1 | TestTryCatch.java:34:9:34:13 | ... + ... |
|
||||||
| TestTryCatch.java:35:6:35:31 | catch (...) | TestTryCatch.java:4:14:4:14 | Exceptional Exit |
|
|
||||||
| TestTryCatch.java:35:6:35:31 | catch (...) | TestTryCatch.java:35:30:35:30 | e |
|
| TestTryCatch.java:35:6:35:31 | catch (...) | TestTryCatch.java:35:30:35:30 | e |
|
||||||
|
| TestTryCatch.java:35:30:35:30 | e | TestTryCatch.java:4:14:4:14 | Exceptional Exit |
|
||||||
| TestTryCatch.java:35:30:35:30 | e | TestTryCatch.java:36:4:40:4 | { ... } |
|
| TestTryCatch.java:35:30:35:30 | e | TestTryCatch.java:36:4:40:4 | { ... } |
|
||||||
| TestTryCatch.java:36:4:40:4 | { ... } | TestTryCatch.java:37:5:37:14 | var ...; |
|
| TestTryCatch.java:36:4:40:4 | { ... } | TestTryCatch.java:37:5:37:14 | var ...; |
|
||||||
| TestTryCatch.java:37:5:37:14 | var ...; | TestTryCatch.java:37:13:37:13 | 1 |
|
| TestTryCatch.java:37:5:37:14 | var ...; | TestTryCatch.java:37:13:37:13 | 1 |
|
||||||
|
|||||||
@@ -28,8 +28,8 @@
|
|||||||
| TestTryWithResources.java:10:4:10:32 | <Expr>; | TestTryWithResources.java:10:4:10:13 | System.out |
|
| TestTryWithResources.java:10:4:10:32 | <Expr>; | TestTryWithResources.java:10:4:10:13 | System.out |
|
||||||
| TestTryWithResources.java:10:23:10:30 | "worked" | TestTryWithResources.java:10:4:10:31 | println(...) |
|
| TestTryWithResources.java:10:23:10:30 | "worked" | TestTryWithResources.java:10:4:10:31 | println(...) |
|
||||||
| TestTryWithResources.java:11:5:11:35 | catch (...) | TestTryWithResources.java:11:34:11:34 | e |
|
| TestTryWithResources.java:11:5:11:35 | catch (...) | TestTryWithResources.java:11:34:11:34 | e |
|
||||||
| TestTryWithResources.java:11:5:11:35 | catch (...) | TestTryWithResources.java:13:13:15:3 | { ... } |
|
|
||||||
| TestTryWithResources.java:11:34:11:34 | e | TestTryWithResources.java:11:37:13:3 | { ... } |
|
| TestTryWithResources.java:11:34:11:34 | e | TestTryWithResources.java:11:37:13:3 | { ... } |
|
||||||
|
| TestTryWithResources.java:11:34:11:34 | e | TestTryWithResources.java:13:13:15:3 | { ... } |
|
||||||
| TestTryWithResources.java:11:37:13:3 | { ... } | TestTryWithResources.java:12:4:12:40 | <Expr>; |
|
| TestTryWithResources.java:11:37:13:3 | { ... } | TestTryWithResources.java:12:4:12:40 | <Expr>; |
|
||||||
| TestTryWithResources.java:12:4:12:13 | System.out | TestTryWithResources.java:12:23:12:38 | "file not found" |
|
| TestTryWithResources.java:12:4:12:13 | System.out | TestTryWithResources.java:12:23:12:38 | "file not found" |
|
||||||
| TestTryWithResources.java:12:4:12:39 | println(...) | TestTryWithResources.java:13:13:15:3 | { ... } |
|
| TestTryWithResources.java:12:4:12:39 | println(...) | TestTryWithResources.java:13:13:15:3 | { ... } |
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
import semmle.python.controlflow.internal.AstNodeImpl
|
|
||||||
import ControlFlow::Consistency
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
category: minorAnalysis
|
|
||||||
---
|
|
||||||
* A new Python control flow graph implementation has been added under `semmle.python.controlflow.internal.Cfg` (backed by `AstNodeImpl.qll`), built on the shared `codeql.controlflow.ControlFlowGraph` library. It is not yet used by the dataflow library or any production query; the legacy CFG in `semmle/python/Flow.qll` remains the default. The new library is exposed for tests and for upcoming migrations.
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
category: minorAnalysis
|
|
||||||
---
|
|
||||||
* A new SSA adapter has been added under `semmle.python.dataflow.new.internal.SsaImpl`, built on the shared `codeql.ssa.Ssa` library and the new shared CFG (`semmle.python.controlflow.internal.Cfg`). It is not yet used by the dataflow library or any production query; the legacy ESSA SSA in `semmle/python/essa/*` remains the default. The new SSA adapter is exposed for tests and for the upcoming dataflow migration.
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
/**
|
|
||||||
* @name Print CFG (New)
|
|
||||||
* @description Produces a representation of a file's Control Flow Graph
|
|
||||||
* using the new shared control flow library.
|
|
||||||
* This query is used by the VS Code extension.
|
|
||||||
* @id python/print-cfg
|
|
||||||
* @kind graph
|
|
||||||
* @tags ide-contextual-queries/print-cfg
|
|
||||||
*/
|
|
||||||
|
|
||||||
private import python as Py
|
|
||||||
import semmle.python.controlflow.internal.AstNodeImpl
|
|
||||||
|
|
||||||
external string selectedSourceFile();
|
|
||||||
|
|
||||||
private predicate selectedSourceFileAlias = selectedSourceFile/0;
|
|
||||||
|
|
||||||
external int selectedSourceLine();
|
|
||||||
|
|
||||||
private predicate selectedSourceLineAlias = selectedSourceLine/0;
|
|
||||||
|
|
||||||
external int selectedSourceColumn();
|
|
||||||
|
|
||||||
private predicate selectedSourceColumnAlias = selectedSourceColumn/0;
|
|
||||||
|
|
||||||
module ViewCfgQueryInput implements ControlFlow::ViewCfgQueryInputSig<Py::File> {
|
|
||||||
predicate selectedSourceFile = selectedSourceFileAlias/0;
|
|
||||||
|
|
||||||
predicate selectedSourceLine = selectedSourceLineAlias/0;
|
|
||||||
|
|
||||||
predicate selectedSourceColumn = selectedSourceColumnAlias/0;
|
|
||||||
|
|
||||||
predicate cfgScopeSpan(
|
|
||||||
Ast::Callable callable, Py::File file, int startLine, int startColumn, int endLine,
|
|
||||||
int endColumn
|
|
||||||
) {
|
|
||||||
exists(Py::Scope scope |
|
|
||||||
scope = callable.asScope() and
|
|
||||||
file = scope.getLocation().getFile() and
|
|
||||||
scope.getLocation().hasLocationInfo(_, startLine, startColumn, endLine, endColumn)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
import ControlFlow::ViewCfgQuery<Py::File, ViewCfgQueryInput>
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,547 +0,0 @@
|
|||||||
/**
|
|
||||||
* Provides the Python SSA implementation built on the new (shared) CFG.
|
|
||||||
*
|
|
||||||
* Mirrors the Java SSA adapter at
|
|
||||||
* `java/ql/lib/semmle/code/java/dataflow/internal/SsaImpl.qll`:
|
|
||||||
* an `InputSig` is defined in terms of positional `(BasicBlock, int)`
|
|
||||||
* variable references, and the shared
|
|
||||||
* `codeql.ssa.Ssa::Make<Location, Cfg, Input>` module is then
|
|
||||||
* instantiated.
|
|
||||||
*
|
|
||||||
* `SourceVariable` is the AST-level `Py::Variable`. Variable references
|
|
||||||
* are looked up via the CFG facade's `NameNode.defines`/`uses`/`deletes`
|
|
||||||
* predicates, which themselves are one-line bridges to AST-level
|
|
||||||
* `Name.defines`/`uses`/`deletes`.
|
|
||||||
*
|
|
||||||
* Implicit-entry definitions are inserted for:
|
|
||||||
* - non-local / global / builtin variables that are read in the scope
|
|
||||||
* but never assigned (no enclosing CFG node defines them),
|
|
||||||
* - captured variables (variables defined in an enclosing scope that
|
|
||||||
* are read inside the scope), and
|
|
||||||
* - parameters, but only if the corresponding parameter name is *not*
|
|
||||||
* itself a CFG node. With the C#-style parameter wiring already
|
|
||||||
* installed in `AstNodeImpl.qll`, parameter names *are* CFG nodes,
|
|
||||||
* so the regular `variableWrite` path handles them — no `i = -1`
|
|
||||||
* entry is needed for ordinary parameters.
|
|
||||||
*/
|
|
||||||
overlay[local?]
|
|
||||||
module;
|
|
||||||
|
|
||||||
private import python as Py
|
|
||||||
private import semmle.python.controlflow.internal.AstNodeImpl as CfgImpl
|
|
||||||
private import semmle.python.controlflow.internal.Cfg as Cfg
|
|
||||||
private import codeql.ssa.Ssa as SsaImplCommon
|
|
||||||
private import codeql.controlflow.BasicBlock as BB
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adapts the Python `Cfg` facade to the shared SSA library's `CfgSig`.
|
|
||||||
* All members are inherited from `Cfg::ControlFlowNode` and
|
|
||||||
* `Cfg::BasicBlock`.
|
|
||||||
*/
|
|
||||||
private module CfgForSsa implements BB::CfgSig<Py::Location> {
|
|
||||||
class ControlFlowNode = CfgImpl::ControlFlowNode;
|
|
||||||
|
|
||||||
class BasicBlock = CfgImpl::BasicBlock;
|
|
||||||
|
|
||||||
class EntryBasicBlock = CfgImpl::Cfg::EntryBasicBlock;
|
|
||||||
|
|
||||||
predicate dominatingEdge = CfgImpl::Cfg::dominatingEdge/2;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A source variable for SSA, wrapping a Python AST `Variable`.
|
|
||||||
*
|
|
||||||
* We only track variables that are read at least once in their scope —
|
|
||||||
* tracking write-only variables would be unnecessary work — *except*
|
|
||||||
* for module-scope globals, where the "read" can be external (e.g.
|
|
||||||
* `import mymodule; mymodule.x`). Such globals are tracked
|
|
||||||
* unconditionally so that import-resolution can find their defining
|
|
||||||
* write.
|
|
||||||
*/
|
|
||||||
private newtype TSsaSourceVariable =
|
|
||||||
TPyVar(Py::Variable v) {
|
|
||||||
// Has a use somewhere — read-relevant for SSA.
|
|
||||||
exists(Cfg::NameNode n | n.uses(v))
|
|
||||||
or
|
|
||||||
// Or has a deletion (treated as a write that destroys the value).
|
|
||||||
exists(Cfg::NameNode n | n.deletes(v))
|
|
||||||
or
|
|
||||||
// Or is a module-scope global written in this module — must be
|
|
||||||
// tracked even if never read locally, because importers may read
|
|
||||||
// it as an attribute on the module object.
|
|
||||||
v.getScope() instanceof Py::Module and
|
|
||||||
exists(Cfg::NameNode n | n.defines(v))
|
|
||||||
or
|
|
||||||
// Or is a parameter — parameters must always have a
|
|
||||||
// `ParameterDefinition` for dataflow argument-routing to work,
|
|
||||||
// even if the parameter is never read in its scope. Mirrors
|
|
||||||
// legacy ESSA's `ParameterDefinition` (which fired for every
|
|
||||||
// parameter binding regardless of liveness).
|
|
||||||
exists(Py::Parameter p | p.asName() = v.getAStore())
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A source variable for SSA, wrapping a Python AST `Variable`.
|
|
||||||
*/
|
|
||||||
class SsaSourceVariable extends TSsaSourceVariable {
|
|
||||||
/** Gets the underlying Python AST variable. */
|
|
||||||
Py::Variable getVariable() { this = TPyVar(result) }
|
|
||||||
|
|
||||||
/** Gets the (textual) name of this variable. */
|
|
||||||
string getName() { result = this.getVariable().getId() }
|
|
||||||
|
|
||||||
/** Gets a textual representation of this source variable. */
|
|
||||||
string toString() { result = this.getVariable().toString() }
|
|
||||||
|
|
||||||
/** Gets the location of this source variable. */
|
|
||||||
Py::Location getLocation() { result = this.getVariable().getScope().getLocation() }
|
|
||||||
|
|
||||||
/** Gets the scope in which this variable lives. */
|
|
||||||
Py::Scope getScope() { result = this.getVariable().getScope() }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a use of this variable as it appears in the source — a `NameNode`
|
|
||||||
* that loads or deletes the variable. Mirrors legacy
|
|
||||||
* `SsaSourceVariable.getASourceUse()`.
|
|
||||||
*/
|
|
||||||
Cfg::ControlFlowNode getASourceUse() {
|
|
||||||
exists(Cfg::NameNode n | result = n |
|
|
||||||
n.uses(this.getVariable()) or n.deletes(this.getVariable())
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets an implicit use of this variable. The new SSA does not have
|
|
||||||
* implicit-use refinements, but we keep this for API parity — every
|
|
||||||
* normal-exit of the variable's scope counts as a sink, ensuring
|
|
||||||
* variables stay live to scope exit for taint-tracking.
|
|
||||||
*/
|
|
||||||
Cfg::ControlFlowNode getAnImplicitUse() {
|
|
||||||
result.isNormalExit() and result.getScope() = this.getScope()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a use of this variable — either an explicit source use or an
|
|
||||||
* implicit use at scope exit. Mirrors legacy `SsaSourceVariable.getAUse()`.
|
|
||||||
*/
|
|
||||||
Cfg::ControlFlowNode getAUse() {
|
|
||||||
result = this.getASourceUse() or result = this.getAnImplicitUse()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds if `v` is a non-local read in scope `s`, in the sense that `s`
|
|
||||||
* uses `v` but does not write it within `s`. This includes globals,
|
|
||||||
* builtins, and variables captured from an enclosing function scope.
|
|
||||||
*
|
|
||||||
* The `Py::Variable` `v` lives in some defining scope (the module for
|
|
||||||
* globals, an outer function for closures, etc.); the reading scope
|
|
||||||
* `s` is the scope where the use of `v` occurs.
|
|
||||||
*/
|
|
||||||
private predicate nonLocalReadIn(Py::Variable v, Py::Scope s) {
|
|
||||||
exists(Cfg::NameNode n |
|
|
||||||
n.uses(v) and
|
|
||||||
n.getScope() = s and
|
|
||||||
not exists(Cfg::NameNode def | def.defines(v) and def.getScope() = s)
|
|
||||||
) and
|
|
||||||
// Match legacy ESSA: only create entry defs for variables that have
|
|
||||||
// at least one defining store somewhere — otherwise the entry def
|
|
||||||
// represents "nothing reaches here", which is the default anyway and
|
|
||||||
// introduces no useful flow. (Legacy's `ModuleVariable` required a
|
|
||||||
// store; this is the closure-aware generalisation.)
|
|
||||||
exists(Cfg::NameNode store | store.defines(v))
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds if `bb` is the entry basic block of a scope where `v` should
|
|
||||||
* have an implicit entry definition. This covers:
|
|
||||||
* - non-local / global / builtin variables read in `s`, and
|
|
||||||
* - captured variables (defined in an enclosing scope but read in `s`).
|
|
||||||
*
|
|
||||||
* Each reading scope gets its own entry def, so a closure variable can
|
|
||||||
* have multiple entry defs across all functions/methods that read it.
|
|
||||||
*
|
|
||||||
* Parameters are *not* included: their bound `Name` is itself a CFG
|
|
||||||
* node (per the C#-style parameter wiring), so `variableWrite` fires at
|
|
||||||
* the parameter's natural CFG index.
|
|
||||||
*/
|
|
||||||
private predicate hasEntryDefIn(SsaSourceVariable v, CfgImpl::BasicBlock bb) {
|
|
||||||
exists(Py::Scope s |
|
|
||||||
nonLocalReadIn(v.getVariable(), s) and
|
|
||||||
bb = entryBlock(s)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the entry basic block of scope `s`, where implicit entry
|
|
||||||
* definitions are placed (at synthetic index `-1`).
|
|
||||||
*/
|
|
||||||
private CfgImpl::BasicBlock entryBlock(Py::Scope s) {
|
|
||||||
exists(CfgImpl::ControlFlowNode entry |
|
|
||||||
entry instanceof CfgImpl::ControlFlow::EntryNode and
|
|
||||||
entry.getEnclosingCallable().asScope() = s and
|
|
||||||
result = entry.getBasicBlock()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The SSA `InputSig` for Python. References are positional
|
|
||||||
* `(BasicBlock, int)` pairs into the new CFG.
|
|
||||||
*/
|
|
||||||
private module SsaImplInput implements SsaImplCommon::InputSig<Py::Location, CfgImpl::BasicBlock> {
|
|
||||||
class SourceVariable = SsaSourceVariable;
|
|
||||||
|
|
||||||
predicate variableWrite(CfgImpl::BasicBlock bb, int i, SourceVariable v, boolean certain) {
|
|
||||||
// Explicit binding at a CFG node — includes assignments,
|
|
||||||
// parameter Names (wired in via the C# pattern), exception-handler
|
|
||||||
// `as`-bindings, import aliases, and match-pattern captures.
|
|
||||||
exists(Cfg::NameNode n |
|
|
||||||
bb.getNode(i) = n and
|
|
||||||
n.defines(v.getVariable()) and
|
|
||||||
certain = true
|
|
||||||
)
|
|
||||||
or
|
|
||||||
// `del x` — removes the binding. Modelled as a certain write that
|
|
||||||
// makes any subsequent read invalid.
|
|
||||||
exists(Cfg::NameNode n |
|
|
||||||
bb.getNode(i) = n and
|
|
||||||
n.deletes(v.getVariable()) and
|
|
||||||
certain = true
|
|
||||||
)
|
|
||||||
or
|
|
||||||
// Implicit entry definition for non-local / captured / global /
|
|
||||||
// builtin variables read in some scope. Each reading scope's entry
|
|
||||||
// block gets one such write, allowing closures: e.g. when `x` is a
|
|
||||||
// parameter of an outer function and read inside a nested
|
|
||||||
// function, both scopes get entry defs for `x`.
|
|
||||||
hasEntryDefIn(v, bb) and
|
|
||||||
i = -1 and
|
|
||||||
certain = true
|
|
||||||
or
|
|
||||||
// `from X import *` — possibly rebinds every name in the importing
|
|
||||||
// scope. Modelled as an uncertain write at the import-star's CFG
|
|
||||||
// position for every variable that lives in (or is referenced
|
|
||||||
// from) the same scope as the import-star. Mirrors legacy ESSA's
|
|
||||||
// `ImportStarRefinement` (see `essa/SsaDefinitions.qll`'s
|
|
||||||
// `import_star_refinement` predicate). The write is uncertain so
|
|
||||||
// that prior definitions of the variable remain available — the
|
|
||||||
// shared-SSA `SsaUncertainWrite` merges the new value with the
|
|
||||||
// immediately preceding definition.
|
|
||||||
exists(Cfg::ImportStarNode imp |
|
|
||||||
bb.getNode(i) = imp and
|
|
||||||
certain = false and
|
|
||||||
(
|
|
||||||
v.getVariable().getScope() = imp.getScope()
|
|
||||||
or
|
|
||||||
// Variable is defined in some other scope but referenced in
|
|
||||||
// the same scope as the import-star (matches legacy clause 2:
|
|
||||||
// `other.uses(v) and def.getScope() = other.getScope()`).
|
|
||||||
exists(Cfg::NameNode other |
|
|
||||||
other.uses(v.getVariable()) and
|
|
||||||
imp.getScope() = other.getScope()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
predicate variableRead(CfgImpl::BasicBlock bb, int i, SourceVariable v, boolean certain) {
|
|
||||||
// Explicit source use — a `Name` load or a `del x` of the variable.
|
|
||||||
exists(Cfg::NameNode n |
|
|
||||||
bb.getNode(i) = n and
|
|
||||||
n.uses(v.getVariable()) and
|
|
||||||
certain = true
|
|
||||||
)
|
|
||||||
or
|
|
||||||
// Synthetic use at the normal exit of the variable's defining scope.
|
|
||||||
// This keeps every variable live to scope exit so that callers (e.g.
|
|
||||||
// `module_export` in ImportResolution.qll, or taint-tracking pass-through
|
|
||||||
// through unread locals) can ask "which definition reaches end of
|
|
||||||
// scope?". Mirrors legacy ESSA's `SsaSourceVariable.getAUse()` which
|
|
||||||
// included `getScope().getANormalExit()`.
|
|
||||||
exists(Cfg::ControlFlowNode exit |
|
|
||||||
exit.isNormalExit() and
|
|
||||||
exit.getScope() = v.getVariable().getScope() and
|
|
||||||
bb.getNode(i) = exit and
|
|
||||||
certain = true
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The shared SSA instantiation for Python.
|
|
||||||
*
|
|
||||||
* Members:
|
|
||||||
* - `Definition` — the union of explicit, uncertain, and phi definitions
|
|
||||||
* - `WriteDefinition`, `UncertainWriteDefinition`, `PhiNode`
|
|
||||||
* - the standard SSA predicates (`getAUse`, `getAnUltimateDefinition`, ...).
|
|
||||||
*/
|
|
||||||
module Ssa = SsaImplCommon::Make<Py::Location, CfgForSsa, SsaImplInput>;
|
|
||||||
|
|
||||||
final class Definition = Ssa::Definition;
|
|
||||||
|
|
||||||
final class WriteDefinition = Ssa::WriteDefinition;
|
|
||||||
|
|
||||||
final class UncertainWriteDefinition = Ssa::UncertainWriteDefinition;
|
|
||||||
|
|
||||||
final class PhiNode = Ssa::PhiNode;
|
|
||||||
|
|
||||||
// ===========================================================================
|
|
||||||
// ESSA-shaped adapter layer
|
|
||||||
//
|
|
||||||
// The dataflow library (`python/ql/lib/semmle/python/dataflow/new/`) and
|
|
||||||
// related modules (`ApiGraphs.qll`, etc.) consume the legacy ESSA API
|
|
||||||
// (`EssaVariable`, `EssaDefinition`, `AssignmentDefinition`,
|
|
||||||
// `ScopeEntryDefinition`, `ParameterDefinition`, `WithDefinition`,
|
|
||||||
// `PhiFunction`, plus the `AdjacentUses` module). To migrate them off
|
|
||||||
// the legacy CFG, we expose the same API surface on top of the
|
|
||||||
// shared SSA built above.
|
|
||||||
//
|
|
||||||
// This adapter is intentionally narrow: it covers only the predicates
|
|
||||||
// that new dataflow consumes. The richer legacy ESSA — refinement
|
|
||||||
// nodes, attribute refinements, edge refinements — stays available
|
|
||||||
// via `semmle.python.essa.Essa` for points-to / legacy code.
|
|
||||||
// ===========================================================================
|
|
||||||
/**
|
|
||||||
* Gets the CFG node at which a write definition's binding takes place.
|
|
||||||
*
|
|
||||||
* For ordinary writes (assignment, deletion, parameter) this is the
|
|
||||||
* canonical CFG node of the bound Name. For implicit entry definitions
|
|
||||||
* (synthesised at position `-1` of a scope's entry BB) this is the
|
|
||||||
* scope's entry node.
|
|
||||||
*/
|
|
||||||
private Cfg::ControlFlowNode writeDefNode(Ssa::WriteDefinition def) {
|
|
||||||
exists(CfgImpl::BasicBlock bb, int i | def.definesAt(_, bb, i) |
|
|
||||||
i >= 0 and result = bb.getNode(i)
|
|
||||||
or
|
|
||||||
i = -1 and result = bb.getNode(0)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A write definition whose binding has a corresponding CFG node — i.e.
|
|
||||||
* everything that's not a phi node. Mirrors legacy ESSA's
|
|
||||||
* `EssaNodeDefinition`.
|
|
||||||
*/
|
|
||||||
class EssaNodeDefinition extends Ssa::WriteDefinition {
|
|
||||||
/** Gets the CFG node where this definition's binding takes place. */
|
|
||||||
Cfg::ControlFlowNode getDefiningNode() { result = writeDefNode(this) }
|
|
||||||
|
|
||||||
/** Gets the variable defined here (legacy name). */
|
|
||||||
SsaSourceVariable getVariable() { result = this.getSourceVariable() }
|
|
||||||
|
|
||||||
/** Gets the enclosing scope. */
|
|
||||||
Py::Scope getScope() {
|
|
||||||
exists(Cfg::ControlFlowNode n | n = this.getDefiningNode() | result = n.getScope())
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds if this definition defines source variable `v` at CFG node
|
|
||||||
* `defNode`. Flatter form of `getSourceVariable()` +
|
|
||||||
* `getDefiningNode()`, matching legacy ESSA's `definedBy`.
|
|
||||||
*/
|
|
||||||
predicate definedBy(SsaSourceVariable v, Cfg::ControlFlowNode defNode) {
|
|
||||||
v = this.getSourceVariable() and defNode = this.getDefiningNode()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An assignment definition: any binding where the value being assigned
|
|
||||||
* is statically known via `Cfg::DefinitionNode.getValue()`. Includes
|
|
||||||
* plain assignments, walrus, annotated assignments, augmented
|
|
||||||
* assignments, import aliases (`import x` / `from m import x [as y]`),
|
|
||||||
* `with ... as x`, and for-target bindings (where `getValue()` returns
|
|
||||||
* the iter expression's CFG node). Excludes parameter bindings —
|
|
||||||
* those are modelled by `ParameterDefinition`.
|
|
||||||
*/
|
|
||||||
class AssignmentDefinition extends EssaNodeDefinition {
|
|
||||||
AssignmentDefinition() {
|
|
||||||
exists(Cfg::NameNode n | n = this.getDefiningNode() |
|
|
||||||
exists(n.(Cfg::DefinitionNode).getValue()) and
|
|
||||||
not n.(Cfg::ControlFlowNode).isParameter()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Gets the CFG node for the value being assigned, if statically known. */
|
|
||||||
Cfg::ControlFlowNode getValue() {
|
|
||||||
result = this.getDefiningNode().(Cfg::DefinitionNode).getValue()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A parameter definition — the binding of a parameter name in a
|
|
||||||
* function's scope.
|
|
||||||
*/
|
|
||||||
class ParameterDefinition extends EssaNodeDefinition {
|
|
||||||
ParameterDefinition() { this.getDefiningNode().isParameter() }
|
|
||||||
|
|
||||||
/** Gets the AST `Parameter` (a `Py::Name` in param context). */
|
|
||||||
Py::Name getParameter() { result = this.getDefiningNode().getNode() }
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A definition introduced by a `with ... as x:` clause.
|
|
||||||
*/
|
|
||||||
class WithDefinition extends EssaNodeDefinition {
|
|
||||||
WithDefinition() {
|
|
||||||
exists(Cfg::NameNode n, Py::With w |
|
|
||||||
n = this.getDefiningNode() and
|
|
||||||
w.getOptionalVars() = n.getNode()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An assignment where the LHS is a tuple/list and the RHS is unpacked:
|
|
||||||
* `a, b = (1, 2)` or `a, *rest = xs`. The SSA def lives at the inner
|
|
||||||
* `Name` CFG node, but for IterableUnpacking integration we expose
|
|
||||||
* the enclosing `StarredNode` as the `getDefiningNode()` for `*rest`
|
|
||||||
* patterns — mirroring legacy ESSA's `multi_assignment_definition`,
|
|
||||||
* which placed the def at the StarredNode CFG node.
|
|
||||||
*/
|
|
||||||
class MultiAssignmentDefinition extends EssaNodeDefinition {
|
|
||||||
MultiAssignmentDefinition() {
|
|
||||||
exists(Cfg::NameNode n | n = super.getDefiningNode() |
|
|
||||||
exists(Py::Assign a, Py::Expr lhs |
|
|
||||||
a.getATarget() = lhs and
|
|
||||||
(lhs instanceof Py::Tuple or lhs instanceof Py::List) and
|
|
||||||
lhs.getASubExpression+() = n.getNode()
|
|
||||||
)
|
|
||||||
or
|
|
||||||
// For-loop with tuple/list target: `for a, b in xs:` —
|
|
||||||
// tuple-unpacking semantics applies to the for-target.
|
|
||||||
exists(Py::For f, Py::Expr lhs |
|
|
||||||
f.getTarget() = lhs and
|
|
||||||
(lhs instanceof Py::Tuple or lhs instanceof Py::List) and
|
|
||||||
lhs.getASubExpression+() = n.getNode()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override Cfg::ControlFlowNode getDefiningNode() {
|
|
||||||
// Default: the underlying `Name` CFG node (where the SSA def lives).
|
|
||||||
not exists(Cfg::StarredNode s |
|
|
||||||
s.getNode().(Py::Starred).getValue() = super.getDefiningNode().getNode()
|
|
||||||
) and
|
|
||||||
result = super.getDefiningNode()
|
|
||||||
or
|
|
||||||
// Exception: for `*rest`, expose the enclosing `Starred` CFG node
|
|
||||||
// so that `IterableUnpacking::iterableUnpackingStarredElementStoreStep`
|
|
||||||
// can attach the rest-list to it.
|
|
||||||
exists(Cfg::StarredNode s |
|
|
||||||
s.getNode().(Py::Starred).getValue() = super.getDefiningNode().getNode()
|
|
||||||
|
|
|
||||||
result = s
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An implicit entry definition for a non-local / captured / global /
|
|
||||||
* builtin variable read in a scope but not defined there.
|
|
||||||
*
|
|
||||||
* Inherits from `EssaNodeDefinition` and exposes the scope's entry node
|
|
||||||
* as its defining node (matching legacy ESSA semantics).
|
|
||||||
*/
|
|
||||||
class ScopeEntryDefinition extends EssaNodeDefinition {
|
|
||||||
ScopeEntryDefinition() {
|
|
||||||
exists(CfgImpl::BasicBlock bb |
|
|
||||||
this.definesAt(_, bb, -1) and
|
|
||||||
bb instanceof CfgImpl::Cfg::EntryBasicBlock
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Gets the enclosing scope (the scope whose entry block this def is in). */
|
|
||||||
override Py::Scope getScope() {
|
|
||||||
exists(CfgImpl::BasicBlock bb |
|
|
||||||
this.definesAt(_, bb, -1) and
|
|
||||||
result = bb.getNode(0).(Cfg::ControlFlowNode).getScope()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** A phi node (alias matching legacy naming). */
|
|
||||||
class PhiFunction extends PhiNode {
|
|
||||||
/**
|
|
||||||
* Gets an input to this phi function (a definition that flows into
|
|
||||||
* the phi from one of its predecessor blocks). Mirrors legacy
|
|
||||||
* ESSA's `PhiFunction.getAnInput()`.
|
|
||||||
*/
|
|
||||||
Ssa::Definition getAnInput() { Ssa::phiHasInputFromBlock(this, result, _) }
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Base class for all ESSA definitions (legacy-shaped). */
|
|
||||||
class EssaDefinition = Ssa::Definition;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* An adapter representing a single SSA-defined "variable" — wrapping
|
|
||||||
* one `Ssa::Definition`. Mirrors legacy `EssaVariable` API.
|
|
||||||
*/
|
|
||||||
class EssaVariable extends Ssa::Definition {
|
|
||||||
/** Gets the underlying SSA definition (legacy name). */
|
|
||||||
Ssa::Definition getDefinition() { result = this }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets a CFG node where this definition is used. Includes regular
|
|
||||||
* `Name` reads as well as the synthetic scope-exit "use" registered
|
|
||||||
* via `SsaImplInput::variableRead` — mirrors legacy ESSA's
|
|
||||||
* `EssaVariable.getAUse()` which inherited the synthetic exit-use
|
|
||||||
* from `SsaSourceVariable`.
|
|
||||||
*/
|
|
||||||
Cfg::ControlFlowNode getAUse() {
|
|
||||||
exists(CfgImpl::BasicBlock bb, int i |
|
|
||||||
Ssa::ssaDefReachesRead(this.getSourceVariable(), this, bb, i) and
|
|
||||||
bb.getNode(i) = result
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Gets the (textual) name of the underlying variable. */
|
|
||||||
string getName() { result = this.getSourceVariable().getVariable().getId() }
|
|
||||||
|
|
||||||
/** Gets the scope in which this variable lives. */
|
|
||||||
Py::Scope getScope() { result = this.getSourceVariable().getVariable().getScope() }
|
|
||||||
|
|
||||||
/** Gets an ultimate non-phi ancestor of this definition. */
|
|
||||||
EssaVariable getAnUltimateDefinition() {
|
|
||||||
if this instanceof PhiNode
|
|
||||||
then
|
|
||||||
exists(Ssa::Definition input |
|
|
||||||
Ssa::phiHasInputFromBlock(this, input, _) and
|
|
||||||
result = input.(EssaVariable).getAnUltimateDefinition()
|
|
||||||
)
|
|
||||||
else result = this
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adjacent use-use and def-use relations exposed by the shared SSA
|
|
||||||
* library. Provides the same interface as legacy
|
|
||||||
* `semmle.python.essa.SsaCompute::AdjacentUses`.
|
|
||||||
*/
|
|
||||||
module AdjacentUses {
|
|
||||||
/** Holds if `nodeFrom` and `nodeTo` are adjacent uses of the same SSA variable. */
|
|
||||||
predicate adjacentUseUse(Cfg::NameNode nodeFrom, Cfg::NameNode nodeTo) {
|
|
||||||
exists(SsaSourceVariable v, CfgImpl::BasicBlock bb1, int i1, CfgImpl::BasicBlock bb2, int i2 |
|
|
||||||
Ssa::adjacentUseUse(bb1, i1, bb2, i2, v, _) and
|
|
||||||
nodeFrom = bb1.getNode(i1) and
|
|
||||||
nodeTo = bb2.getNode(i2)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Holds if `use` is a first use of definition `def`. */
|
|
||||||
predicate firstUse(Ssa::Definition def, Cfg::NameNode use) {
|
|
||||||
exists(CfgImpl::BasicBlock bb, int i |
|
|
||||||
Ssa::firstUse(def, bb, i, _) and
|
|
||||||
use = bb.getNode(i)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds if `use` is any reachable use of definition `def`. Combines
|
|
||||||
* `firstUse` with transitive use-use adjacency.
|
|
||||||
*/
|
|
||||||
predicate useOfDef(Ssa::Definition def, Cfg::NameNode use) {
|
|
||||||
firstUse(def, use)
|
|
||||||
or
|
|
||||||
exists(Cfg::NameNode mid | useOfDef(def, mid) and adjacentUseUse(mid, use))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
consistencyOverview
|
|
||||||
| deadEnd | 1 |
|
|
||||||
deadEnd
|
|
||||||
| without_loop.py:7:5:7:9 | Break |
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
/**
|
|
||||||
* Phase -1 of the dataflow CFG migration: verifies that every variable
|
|
||||||
* binding visible to the AST (`Name.defines(v)`) corresponds to a CFG node
|
|
||||||
* in the new CFG (`semmle.python.controlflow.internal.AstNodeImpl`).
|
|
||||||
*
|
|
||||||
* The expected tag is `cfgdefines=<name>`. Each binding annotation in the
|
|
||||||
* test sources looks like `# $ cfgdefines=x` for a binding currently
|
|
||||||
* covered by the new CFG, or `# $ MISSING: cfgdefines=x` for a binding
|
|
||||||
* that is known to be uncovered (a "red" test case that should be
|
|
||||||
* green-flipped once the corresponding `cfg-ext-*` extension lands).
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import semmle.python.controlflow.internal.AstNodeImpl as CfgImpl
|
|
||||||
import utils.test.InlineExpectationsTest
|
|
||||||
|
|
||||||
module CfgBindingsTest implements TestSig {
|
|
||||||
string getARelevantTag() { result = "cfgdefines" }
|
|
||||||
|
|
||||||
predicate hasActualResult(Location location, string element, string tag, string value) {
|
|
||||||
exists(Name n, Variable v, CfgImpl::ControlFlowNode cfg |
|
|
||||||
n.defines(v) and
|
|
||||||
cfg.getAstNode().asExpr() = n and
|
|
||||||
location = n.getLocation() and
|
|
||||||
element = n.toString() and
|
|
||||||
tag = "cfgdefines" and
|
|
||||||
value = v.getId()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
import MakeTest<CfgBindingsTest>
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
# Annotated assignment (PEP 526). Both with and without an initializer.
|
|
||||||
|
|
||||||
a: int = 1 # $ cfgdefines=a
|
|
||||||
b: str = "hi" # $ cfgdefines=b
|
|
||||||
|
|
||||||
# Annotation without value: the AST records `c` as defined,
|
|
||||||
# and the new CFG now visits it via the AnnAssignStmt wrapper.
|
|
||||||
c: int # $ cfgdefines=c
|
|
||||||
|
|
||||||
class K: # $ cfgdefines=K
|
|
||||||
field: int = 0 # $ cfgdefines=field
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# Compound (tuple/list) assignment targets — actually wired in the new CFG.
|
|
||||||
|
|
||||||
a, b = (1, 2) # $ cfgdefines=a cfgdefines=b
|
|
||||||
[c, d] = [3, 4] # $ cfgdefines=c cfgdefines=d
|
|
||||||
|
|
||||||
# Nested unpacking.
|
|
||||||
(e, (f, g)) = (1, (2, 3)) # $ cfgdefines=e cfgdefines=f cfgdefines=g
|
|
||||||
|
|
||||||
# Star unpacking.
|
|
||||||
h, *i = [1, 2, 3] # $ cfgdefines=h cfgdefines=i
|
|
||||||
|
|
||||||
# Chained assignment with compound target.
|
|
||||||
j = k, l = (5, 6) # $ cfgdefines=j cfgdefines=k cfgdefines=l
|
|
||||||
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# Comprehension and `for` loop targets — wired in the new CFG.
|
|
||||||
# Comprehensions are nested function scopes with a synthetic `.0` parameter
|
|
||||||
# bound to the iterable.
|
|
||||||
|
|
||||||
# Bare-name `for` target.
|
|
||||||
for i in range(3): # $ cfgdefines=i
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Compound `for` target.
|
|
||||||
for k, v in [(1, 2)]: # $ cfgdefines=k cfgdefines=v
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Comprehension targets.
|
|
||||||
_ = [x for x in range(3)] # $ cfgdefines=_ cfgdefines=x cfgdefines=.0
|
|
||||||
_ = {y: z for y, z in []} # $ cfgdefines=_ cfgdefines=y cfgdefines=z cfgdefines=.0
|
|
||||||
_ = (a for a in []) # $ cfgdefines=_ cfgdefines=a cfgdefines=.0
|
|
||||||
|
|
||||||
# Nested comprehensions.
|
|
||||||
_ = [b for c in [] for b in c] # $ cfgdefines=_ cfgdefines=c cfgdefines=b cfgdefines=.0
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
# Reachability of code following a try whose body always returns.
|
|
||||||
#
|
|
||||||
# The new CFG models exception edges for raise-prone expressions when
|
|
||||||
# they appear inside a `try` (or `with`) statement, mirroring Java's
|
|
||||||
# `mayThrow`. This means the body of a `try` has both a normal
|
|
||||||
# completion edge and an exception edge to its handlers, so code
|
|
||||||
# following the try-statement is reachable via the except-handler path
|
|
||||||
# even when the try-body would otherwise always return.
|
|
||||||
#
|
|
||||||
# Code that is not reachable under either normal or exception flow
|
|
||||||
# (for example, the `else` clause of a try whose body unconditionally
|
|
||||||
# raises) remains correctly classified as dead.
|
|
||||||
|
|
||||||
|
|
||||||
def f(obj): # $ cfgdefines=f cfgdefines=obj
|
|
||||||
try:
|
|
||||||
return len(obj)
|
|
||||||
except TypeError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# The try-body always returns, but `len(obj)` can raise (it is
|
|
||||||
# inside the try, so we model its exception edge). The
|
|
||||||
# `except TypeError: pass` handler falls through to here, making
|
|
||||||
# the code below reachable.
|
|
||||||
try:
|
|
||||||
hint = type(obj).__length_hint__ # $ cfgdefines=hint
|
|
||||||
except AttributeError:
|
|
||||||
return None
|
|
||||||
return hint
|
|
||||||
|
|
||||||
|
|
||||||
def g(): # $ cfgdefines=g
|
|
||||||
try:
|
|
||||||
raise Exception("inner")
|
|
||||||
except:
|
|
||||||
raise Exception("outer")
|
|
||||||
else:
|
|
||||||
# Unreachable: the inner try body always raises (via an explicit
|
|
||||||
# `raise`, which is modelled unconditionally), so the `else:`
|
|
||||||
# clause never runs.
|
|
||||||
hit_inner_else = True
|
|
||||||
|
|
||||||
|
|
||||||
def h(cache, key): # $ cfgdefines=h cfgdefines=cache cfgdefines=key
|
|
||||||
try:
|
|
||||||
return cache[key]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Same pattern as `f`: reachable via the except-handler fall-through.
|
|
||||||
value = compute(key) # $ cfgdefines=value
|
|
||||||
cache[key] = value
|
|
||||||
return value
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
# Decorated `def`/`class` — wired in the new CFG.
|
|
||||||
|
|
||||||
|
|
||||||
def deco(f): # $ cfgdefines=deco cfgdefines=f
|
|
||||||
return f
|
|
||||||
|
|
||||||
|
|
||||||
@deco
|
|
||||||
def decorated_func(): # $ cfgdefines=decorated_func
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
@deco
|
|
||||||
class DecoratedClass: # $ cfgdefines=DecoratedClass
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# Stacked decorators.
|
|
||||||
@deco
|
|
||||||
@deco
|
|
||||||
def doubly(): # $ cfgdefines=doubly
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# Inside a class body.
|
|
||||||
class Outer: # $ cfgdefines=Outer
|
|
||||||
@staticmethod
|
|
||||||
def inner(): # $ cfgdefines=inner
|
|
||||||
pass
|
|
||||||
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# Exception-handler name bindings. These are already wired in the new
|
|
||||||
# CFG provided the try body can raise; `raise` statements are reliably
|
|
||||||
# treated as exception sources.
|
|
||||||
|
|
||||||
try:
|
|
||||||
raise ValueError("oops")
|
|
||||||
except ValueError as e: # $ cfgdefines=e
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
raise TypeError("oops")
|
|
||||||
except (TypeError, KeyError) as err: # $ cfgdefines=err
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Exception groups (Python 3.11+).
|
|
||||||
try:
|
|
||||||
raise ValueError("oops")
|
|
||||||
except* ValueError as eg: # $ cfgdefines=eg
|
|
||||||
pass
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# Import aliases — all bound names below are now reachable via the new
|
|
||||||
# CFG's `ImportStmt` wrapper.
|
|
||||||
|
|
||||||
import os # $ cfgdefines=os
|
|
||||||
import os.path # $ cfgdefines=os
|
|
||||||
import os as o # $ cfgdefines=o
|
|
||||||
from os import path # $ cfgdefines=path
|
|
||||||
from os import path as p # $ cfgdefines=p
|
|
||||||
from os import sep, linesep # $ cfgdefines=sep cfgdefines=linesep
|
|
||||||
from os import (
|
|
||||||
getcwd, # $ cfgdefines=getcwd
|
|
||||||
getcwdb, # $ cfgdefines=getcwdb
|
|
||||||
)
|
|
||||||
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# Match-statement pattern bindings — wired in the new CFG.
|
|
||||||
|
|
||||||
def f(subject): # $ cfgdefines=f cfgdefines=subject
|
|
||||||
match subject:
|
|
||||||
case x: # $ cfgdefines=x
|
|
||||||
pass
|
|
||||||
case [a, b]: # $ cfgdefines=a cfgdefines=b
|
|
||||||
pass
|
|
||||||
case {"k": v}: # $ cfgdefines=v
|
|
||||||
pass
|
|
||||||
case Point(p, q): # $ cfgdefines=p cfgdefines=q
|
|
||||||
pass
|
|
||||||
case [_, *rest]: # $ cfgdefines=rest
|
|
||||||
pass
|
|
||||||
case (1 | 2) as n: # $ cfgdefines=n
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
class Point: # $ cfgdefines=Point
|
|
||||||
__match_args__ = ("x", "y") # $ cfgdefines=__match_args__
|
|
||||||
x: int # $ cfgdefines=x
|
|
||||||
y: int # $ cfgdefines=y
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
# Function parameters.
|
|
||||||
|
|
||||||
def positional(a, b): # $ cfgdefines=positional cfgdefines=a cfgdefines=b
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def with_default(x=1, y=2): # $ cfgdefines=with_default cfgdefines=x cfgdefines=y
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def with_vararg(*args): # $ cfgdefines=with_vararg cfgdefines=args
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def with_kwarg(**kwargs): # $ cfgdefines=with_kwarg cfgdefines=kwargs
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def with_kwonly(*, k1, k2=5): # $ cfgdefines=with_kwonly cfgdefines=k1 cfgdefines=k2
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def kitchen_sink(a, b=2, *args, k1, k2=5, **kw): # $ cfgdefines=kitchen_sink cfgdefines=a cfgdefines=b cfgdefines=args cfgdefines=k1 cfgdefines=k2 cfgdefines=kw
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# Methods get `self` / `cls`.
|
|
||||||
class C: # $ cfgdefines=C
|
|
||||||
def method(self, x): # $ cfgdefines=method cfgdefines=self cfgdefines=x
|
|
||||||
pass
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def cmethod(cls, x): # $ cfgdefines=cmethod cfgdefines=cls cfgdefines=x
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
# Lambda parameter.
|
|
||||||
_ = lambda p: p + 1 # $ cfgdefines=_ cfgdefines=p
|
|
||||||
|
|
||||||
# PEP 570 positional-only.
|
|
||||||
def pos_only(a, b, /, c): # $ cfgdefines=pos_only cfgdefines=a cfgdefines=b cfgdefines=c
|
|
||||||
pass
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# Simple bindings that should already work in the new CFG.
|
|
||||||
# No MISSING annotations expected.
|
|
||||||
|
|
||||||
x = 1 # $ cfgdefines=x
|
|
||||||
y = x + 1 # $ cfgdefines=y
|
|
||||||
|
|
||||||
def f(): # $ cfgdefines=f
|
|
||||||
pass
|
|
||||||
|
|
||||||
class C: # $ cfgdefines=C
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Re-assignment.
|
|
||||||
x = 2 # $ cfgdefines=x
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# PEP 695 type parameters (Python 3.12+).
|
|
||||||
|
|
||||||
# PEP 695 type-param names on `def`/`class` bind in an annotation scope
|
|
||||||
# that nests the function/class body — they have no CFG node in the
|
|
||||||
# enclosing scope (matching the legacy CFG).
|
|
||||||
def func[T](x: T) -> T: # $ cfgdefines=func cfgdefines=x
|
|
||||||
return x
|
|
||||||
|
|
||||||
|
|
||||||
class Box[T]: # $ cfgdefines=Box
|
|
||||||
item: T # $ cfgdefines=item
|
|
||||||
|
|
||||||
|
|
||||||
# Multi-parameter, with bound and variadics.
|
|
||||||
def multi[T: int, *Ts, **P](x: T, *args: *Ts, **kwargs: P.kwargs) -> T: # $ cfgdefines=multi cfgdefines=x cfgdefines=args cfgdefines=kwargs
|
|
||||||
return x
|
|
||||||
|
|
||||||
|
|
||||||
# `type` statement (PEP 695).
|
|
||||||
type Alias[T] = list[T] # $ cfgdefines=Alias cfgdefines=T
|
|
||||||
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# Walrus and starred-target edge cases — wired in the new CFG.
|
|
||||||
|
|
||||||
# Walrus in expression context.
|
|
||||||
if (y := 5) > 0: # $ cfgdefines=y
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Walrus in a comprehension. The comprehension introduces a synthetic
|
|
||||||
# `.0` parameter bound to the iterable.
|
|
||||||
_ = [w for _ in range(3) if (w := 1)] # $ cfgdefines=_ cfgdefines=w cfgdefines=.0
|
|
||||||
|
|
||||||
# Starred target in a Tuple LHS.
|
|
||||||
*head, tail = [1, 2, 3] # $ cfgdefines=head cfgdefines=tail
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# `with cm() as x:` bindings — wired in the new CFG.
|
|
||||||
|
|
||||||
class CM: # $ cfgdefines=CM
|
|
||||||
def __enter__(self): return self # $ cfgdefines=__enter__ cfgdefines=self
|
|
||||||
def __exit__(self, *a): pass # $ cfgdefines=__exit__ cfgdefines=self cfgdefines=a
|
|
||||||
|
|
||||||
with CM() as x: # $ cfgdefines=x
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Multiple items.
|
|
||||||
with CM() as a, CM() as b: # $ cfgdefines=a cfgdefines=b
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Parenthesised form (Python 3.10+).
|
|
||||||
with (CM() as p, CM() as q): # $ cfgdefines=p cfgdefines=q
|
|
||||||
pass
|
|
||||||
|
|
||||||
# Compound target in `with`.
|
|
||||||
with CM() as (m, n): # $ cfgdefines=m cfgdefines=n
|
|
||||||
pass
|
|
||||||
|
|
||||||
@@ -5,8 +5,6 @@
|
|||||||
* have separate CFGs and are excluded from this check.
|
* have separate CFGs and are excluded from this check.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import OldCfgImpl
|
import OldCfgImpl
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
* Checks that every timer annotation has a corresponding CFG node.
|
* Checks that every timer annotation has a corresponding CFG node.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import OldCfgImpl
|
import OldCfgImpl
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
* edge leaves the basic block and the normal successor may be dead.
|
* edge leaves the basic block and the normal successor may be dead.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import OldCfgImpl
|
import OldCfgImpl
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
| test_boolean.py:9:10:9:43 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:9:59:9:59 | IntegerLiteral | timestamp 2 | test_boolean.py:9:19:9:19 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:9:10:9:43 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:9:59:9:59 | IntegerLiteral | timestamp 2 | test_boolean.py:9:19:9:19 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:15:10:15:43 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:15:50:15:50 | IntegerLiteral | timestamp 1 | test_boolean.py:15:20:15:20 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:15:10:15:43 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:15:50:15:50 | IntegerLiteral | timestamp 1 | test_boolean.py:15:20:15:20 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:21:10:21:42 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:21:49:21:49 | IntegerLiteral | timestamp 1 | test_boolean.py:21:19:21:19 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:21:10:21:42 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:21:49:21:49 | IntegerLiteral | timestamp 1 | test_boolean.py:21:19:21:19 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:27:10:27:43 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:27:59:27:59 | IntegerLiteral | timestamp 2 | test_boolean.py:27:20:27:20 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:27:10:27:34 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:27:50:27:50 | IntegerLiteral | timestamp 2 | test_boolean.py:27:20:27:20 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:40:10:40:61 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:40:86:40:86 | IntegerLiteral | timestamp 3 | test_boolean.py:40:16:40:16 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:40:10:40:61 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:40:86:40:86 | IntegerLiteral | timestamp 3 | test_boolean.py:40:16:40:16 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:46:10:46:61 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:46:86:46:86 | IntegerLiteral | timestamp 3 | test_boolean.py:46:16:46:16 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:46:10:46:61 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:46:86:46:86 | IntegerLiteral | timestamp 3 | test_boolean.py:46:16:46:16 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:52:10:52:95 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:52:120:52:120 | IntegerLiteral | timestamp 4 | test_boolean.py:52:20:52:20 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:52:10:52:95 | ControlFlowNode for BoolExpr | Basic block ordering: $@ appears before $@ | test_boolean.py:52:120:52:120 | IntegerLiteral | timestamp 4 | test_boolean.py:52:20:52:20 | IntegerLiteral | timestamp 0 |
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
* increasing minimum-timestamp order.
|
* increasing minimum-timestamp order.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import OldCfgImpl
|
import OldCfgImpl
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
||||||
|
|||||||
@@ -11,8 +11,6 @@
|
|||||||
* lambdas that have annotations in nested scopes).
|
* lambdas that have annotations in nested scopes).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import OldCfgImpl
|
import OldCfgImpl
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
||||||
|
|||||||
@@ -4,7 +4,6 @@
|
|||||||
* in at least one annotation (live or dead).
|
* in at least one annotation (live or dead).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
import TimerUtils
|
||||||
|
|
||||||
from TestFunction f, int missing, int maxTs, TimerAnnotation maxAnn
|
from TestFunction f, int missing, int maxTs, TimerAnnotation maxAnn
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
* entry (including within the same basic block).
|
* entry (including within the same basic block).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import OldCfgImpl
|
import OldCfgImpl
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
/** New-CFG version of AllLiveReachable. */
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from TimerCfgNode a, TestFunction f
|
|
||||||
where allLiveReachable(a, f)
|
|
||||||
select a, "Unreachable live annotation; entry of $@ does not reach this node", f, f.getName()
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of AnnotationHasCfgNode.
|
|
||||||
*
|
|
||||||
* Checks that every timer annotation has a corresponding CFG node.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from TimerAnnotation ann
|
|
||||||
where annotationWithoutCfgNode(ann)
|
|
||||||
select ann, "Annotation in $@ has no CFG node", ann.getTestFunction(),
|
|
||||||
ann.getTestFunction().getName()
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of BasicBlockAnnotationGap.
|
|
||||||
*
|
|
||||||
* Original:
|
|
||||||
* Checks that within a basic block, if a node is annotated then its
|
|
||||||
* successor is also annotated (or excluded). A gap in annotations
|
|
||||||
* within a basic block indicates a missing annotation, since there
|
|
||||||
* are no branches to justify the gap.
|
|
||||||
*
|
|
||||||
* Nodes with exceptional successors are excluded, as the exception
|
|
||||||
* edge leaves the basic block and the normal successor may be dead.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from TimerCfgNode a, CfgNode succ
|
|
||||||
where basicBlockAnnotationGap(a, succ)
|
|
||||||
select a, "Annotated node followed by unannotated $@ in the same basic block", succ,
|
|
||||||
succ.getNode().toString()
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of BasicBlockOrdering.
|
|
||||||
*
|
|
||||||
* Original:
|
|
||||||
* Checks that within a single basic block, annotations appear in
|
|
||||||
* increasing minimum-timestamp order.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from TimerCfgNode a, TimerCfgNode b, int minA, int minB
|
|
||||||
where basicBlockOrdering(a, b, minA, minB)
|
|
||||||
select a, "Basic block ordering: $@ appears before $@", a.getTimestampExpr(minA),
|
|
||||||
"timestamp " + minA, b.getTimestampExpr(minB), "timestamp " + minB
|
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of BranchTimestamps.
|
|
||||||
*
|
|
||||||
* Checks that when a node has both a true and false successor, the
|
|
||||||
* live timestamps on one branch are marked as dead on the other.
|
|
||||||
* This ensures that boolean branches are fully annotated with dead()
|
|
||||||
* markers for the paths not taken.
|
|
||||||
*
|
|
||||||
* Limitation: the `@ t[ts, ...]` / `dead(ts)` annotation scheme can only
|
|
||||||
* model branch-dead-ness for plain boolean control flow that reconverges
|
|
||||||
* linearly after the split — i.e. `if`-with-else and `if`-expression.
|
|
||||||
* It cannot model:
|
|
||||||
*
|
|
||||||
* * loops (`while` / `for`): body timestamps repeat across iterations,
|
|
||||||
* so the loop-exit annotation can't list them as dead;
|
|
||||||
* * `match` statements: each `case` body is a syntactically distinct
|
|
||||||
* sub-tree, and the branches don't reconverge through a common
|
|
||||||
* annotation point in the timeline;
|
|
||||||
* * `try` / `with` and `raise` / `assert`: exception edges are modelled
|
|
||||||
* as true/false but flow to syntactically distinct handlers, with no
|
|
||||||
* reconvergence in the linear annotation order;
|
|
||||||
* * short-circuit `and` / `or` (`BoolExpr`): the branches reconverge at
|
|
||||||
* the BoolExpr's after-node, so timestamps on one branch are live
|
|
||||||
* downstream of the other rather than dead;
|
|
||||||
* * `if` without an `else` clause, and `if`/`elif` chains: the false
|
|
||||||
* branch reconverges with the true branch at the post-if statement
|
|
||||||
* (no-else) or fans out across multiple elif-test annotations,
|
|
||||||
* neither of which fit the binary annotation scheme.
|
|
||||||
*
|
|
||||||
* Branch nodes inside those constructs are therefore whitelisted out
|
|
||||||
* below. The check still fires (and is useful) for plain `if`/`else`
|
|
||||||
* and conditional-expression branching.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds if `f` contains a construct whose branches the linear-timestamp
|
|
||||||
* annotation scheme cannot describe (see file-level comment).
|
|
||||||
*/
|
|
||||||
private predicate hasUnmodellableBranching(Function f) {
|
|
||||||
exists(AstNode bad |
|
|
||||||
bad.getScope() = f and
|
|
||||||
(
|
|
||||||
bad instanceof While
|
|
||||||
or
|
|
||||||
bad instanceof For
|
|
||||||
or
|
|
||||||
bad instanceof MatchStmt
|
|
||||||
or
|
|
||||||
bad instanceof Try
|
|
||||||
or
|
|
||||||
bad instanceof With
|
|
||||||
or
|
|
||||||
bad instanceof Raise
|
|
||||||
or
|
|
||||||
bad instanceof Assert
|
|
||||||
or
|
|
||||||
bad instanceof BoolExpr
|
|
||||||
or
|
|
||||||
bad instanceof If and
|
|
||||||
(not exists(bad.(If).getAnOrelse()) or bad.(If).isElif())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
from TimerCfgNode node, int ts, string branch
|
|
||||||
where
|
|
||||||
missingBranchTimestamp(node, ts, branch) and
|
|
||||||
not hasUnmodellableBranching(node.getTestFunction())
|
|
||||||
select node,
|
|
||||||
"Timestamp " + ts + " on true/false branch is missing a dead() annotation on the " + branch +
|
|
||||||
" successor in $@", node.getTestFunction(), node.getTestFunction().getName()
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of ConsecutivePredecessorTimestamps.
|
|
||||||
*
|
|
||||||
* Checks that each annotated node (except the minimum timestamp) has
|
|
||||||
* a predecessor annotation with timestamp `a - 1`. This is the reverse
|
|
||||||
* of ConsecutiveTimestamps: it catches nodes that are reachable but
|
|
||||||
* arrived at from the wrong place (skipping an intermediate node).
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from TimerAnnotation ann, int a
|
|
||||||
where consecutivePredecessorTimestamps(ann, a)
|
|
||||||
select ann, "$@ in $@ has no consecutive predecessor (expected " + (a - 1) + ")",
|
|
||||||
ann.getTimestampExpr(a), "Timestamp " + a, ann.getTestFunction(), ann.getTestFunction().getName()
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of ConsecutiveTimestamps.
|
|
||||||
*
|
|
||||||
* Original:
|
|
||||||
* Checks that consecutive annotated nodes have consecutive timestamps:
|
|
||||||
* for each annotation with timestamp `a`, some CFG node for that annotation
|
|
||||||
* must have a next annotation containing `a + 1`.
|
|
||||||
*
|
|
||||||
* Handles CFG splitting (e.g., finally blocks duplicated for normal/exceptional
|
|
||||||
* flow) by checking that at least one split has the required successor.
|
|
||||||
*
|
|
||||||
* Only applies to functions where all annotations are in the function's
|
|
||||||
* own scope (excludes tests with generators, async, comprehensions, or
|
|
||||||
* lambdas that have annotations in nested scopes).
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from TimerAnnotation ann, int a
|
|
||||||
where consecutiveTimestamps(ann, a)
|
|
||||||
select ann, "$@ in $@ has no consecutive successor (expected " + (a + 1) + ")",
|
|
||||||
ann.getTimestampExpr(a), "Timestamp " + a, ann.getTestFunction(), ann.getTestFunction().getName()
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
/**
|
|
||||||
* Implementation of the evaluation-order CFG signature using the new
|
|
||||||
* shared control flow graph from AstNodeImpl.
|
|
||||||
*/
|
|
||||||
|
|
||||||
private import python as Py
|
|
||||||
import TimerUtils
|
|
||||||
private import semmle.python.controlflow.internal.AstNodeImpl as CfgImpl
|
|
||||||
private import codeql.controlflow.SuccessorType
|
|
||||||
|
|
||||||
private class NewControlFlowNode = CfgImpl::ControlFlowNode;
|
|
||||||
|
|
||||||
private class NewBasicBlock = CfgImpl::BasicBlock;
|
|
||||||
|
|
||||||
/** New (shared) CFG implementation of the evaluation-order signature. */
|
|
||||||
module NewCfg implements EvalOrderCfgSig {
|
|
||||||
class CfgNode instanceof NewControlFlowNode {
|
|
||||||
// Use the post-order representative for each AST node: the "after" node.
|
|
||||||
// For simple leaf nodes this is the merged before/after node. For
|
|
||||||
// post-order expressions this is the TAstNode. For pre-order expressions
|
|
||||||
// (and/or/not/ternary) this uses an AfterValueNode, which places the
|
|
||||||
// expression after its operands — matching the timer test expectations.
|
|
||||||
CfgNode() { NewControlFlowNode.super.isAfter(_) }
|
|
||||||
|
|
||||||
string toString() { result = NewControlFlowNode.super.toString() }
|
|
||||||
|
|
||||||
Py::Location getLocation() { result = NewControlFlowNode.super.getLocation() }
|
|
||||||
|
|
||||||
Py::AstNode getNode() {
|
|
||||||
result = CfgImpl::astNodeToPyNode(NewControlFlowNode.super.getAstNode())
|
|
||||||
}
|
|
||||||
|
|
||||||
CfgNode getASuccessor() { nextCfgNode(this, result) }
|
|
||||||
|
|
||||||
CfgNode getATrueSuccessor() {
|
|
||||||
NewControlFlowNode.super.isAfterTrue(_) and
|
|
||||||
// Only where there's also a false branch (true boolean split)
|
|
||||||
exists(NewControlFlowNode other | other.isAfterFalse(NewControlFlowNode.super.getAstNode())) and
|
|
||||||
nextCfgNodeFrom(this, result)
|
|
||||||
}
|
|
||||||
|
|
||||||
CfgNode getAFalseSuccessor() {
|
|
||||||
NewControlFlowNode.super.isAfterFalse(_) and
|
|
||||||
// Only where there's also a true branch (true boolean split)
|
|
||||||
exists(NewControlFlowNode other | other.isAfterTrue(NewControlFlowNode.super.getAstNode())) and
|
|
||||||
nextCfgNodeFrom(this, result)
|
|
||||||
}
|
|
||||||
|
|
||||||
CfgNode getAnExceptionalSuccessor() {
|
|
||||||
exists(NewControlFlowNode mid |
|
|
||||||
mid = NewControlFlowNode.super.getAnExceptionSuccessor() and
|
|
||||||
nextCfgNodeFrom(mid, result)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
Py::Scope getScope() { result = NewControlFlowNode.super.getEnclosingCallable().asScope() }
|
|
||||||
|
|
||||||
BasicBlock getBasicBlock() {
|
|
||||||
exists(NewBasicBlock bb, int i | bb.getNode(i) = this and result = bb)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds if `next` is the nearest CfgNode reachable from `n` via
|
|
||||||
* one or more raw CFG successor edges, skipping non-CfgNode intermediaries.
|
|
||||||
*/
|
|
||||||
private predicate nextCfgNodeFrom(NewControlFlowNode n, CfgNode next) {
|
|
||||||
next = n.getASuccessor()
|
|
||||||
or
|
|
||||||
exists(NewControlFlowNode mid |
|
|
||||||
mid = n.getASuccessor() and
|
|
||||||
not mid instanceof CfgNode and
|
|
||||||
nextCfgNodeFrom(mid, next)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Holds if `next` is the nearest CfgNode successor of `n`,
|
|
||||||
* skipping synthetic intermediate nodes.
|
|
||||||
*/
|
|
||||||
private predicate nextCfgNode(CfgNode n, CfgNode next) { nextCfgNodeFrom(n, next) }
|
|
||||||
|
|
||||||
class BasicBlock instanceof NewBasicBlock {
|
|
||||||
string toString() { result = NewBasicBlock.super.toString() }
|
|
||||||
|
|
||||||
CfgNode getNode(int n) { result = NewBasicBlock.super.getNode(n) }
|
|
||||||
|
|
||||||
predicate reaches(BasicBlock bb) { this = bb or this.strictlyReaches(bb) }
|
|
||||||
|
|
||||||
predicate strictlyReaches(BasicBlock bb) { NewBasicBlock.super.getASuccessor+() = bb }
|
|
||||||
|
|
||||||
predicate strictlyDominates(BasicBlock bb) { NewBasicBlock.super.strictlyDominates(bb) }
|
|
||||||
}
|
|
||||||
|
|
||||||
CfgNode scopeGetEntryNode(Py::Scope s) {
|
|
||||||
exists(CfgImpl::ControlFlow::EntryNode entry |
|
|
||||||
entry.getEnclosingCallable().asScope() = s and
|
|
||||||
nextCfgNodeFrom(entry, result)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of NeverReachable.
|
|
||||||
*
|
|
||||||
* Original:
|
|
||||||
* Checks that expressions annotated with `t.never` either have no CFG
|
|
||||||
* node, or if they do, that the node is not reachable from its scope's
|
|
||||||
* entry (including within the same basic block).
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from TimerAnnotation ann
|
|
||||||
where neverReachable(ann)
|
|
||||||
select ann, "Node annotated with t.never is reachable in $@", ann.getTestFunction(),
|
|
||||||
ann.getTestFunction().getName()
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of NoBackwardFlow.
|
|
||||||
*
|
|
||||||
* Original:
|
|
||||||
* Checks that time never flows backward between consecutive timer annotations
|
|
||||||
* in the CFG. For each pair of consecutive annotated nodes (A -> B), there must
|
|
||||||
* exist timestamps a in A and b in B with a < b.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from TimerCfgNode a, TimerCfgNode b, int minA, int maxB
|
|
||||||
where noBackwardFlow(a, b, minA, maxB)
|
|
||||||
select a, "Backward flow: $@ flows to $@ (max timestamp $@)", a.getTimestampExpr(minA),
|
|
||||||
minA.toString(), b, b.getNode().toString(), b.getTimestampExpr(maxB), maxB.toString()
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of NoBasicBlock.
|
|
||||||
*
|
|
||||||
* Checks that every annotated CFG node belongs to a basic block.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from CfgNode n, TestFunction f
|
|
||||||
where noBasicBlock(n, f)
|
|
||||||
select n, "CFG node in $@ does not belong to any basic block", f, f.getName()
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of NoSharedReachable.
|
|
||||||
*
|
|
||||||
* Original:
|
|
||||||
* Checks that two annotations sharing a timestamp value are on
|
|
||||||
* mutually exclusive CFG paths (neither can reach the other).
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from TimerCfgNode a, TimerCfgNode b, int ts
|
|
||||||
where noSharedReachable(a, b, ts)
|
|
||||||
select a, "Shared timestamp $@ but this node reaches $@", a.getTimestampExpr(ts), ts.toString(), b,
|
|
||||||
b.getNode().toString()
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
/**
|
|
||||||
* New-CFG version of StrictForward.
|
|
||||||
*
|
|
||||||
* Original:
|
|
||||||
* Stronger version of NoBackwardFlow: for consecutive annotated nodes
|
|
||||||
* A -> B that both have a single timestamp (non-loop code) and B does
|
|
||||||
* NOT dominate A (forward edge), requires max(A) < min(B).
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import NewCfgImpl
|
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<NewCfg>;
|
|
||||||
|
|
||||||
private import Utils
|
|
||||||
private import Utils::CfgTests
|
|
||||||
|
|
||||||
from TimerCfgNode a, TimerCfgNode b, int maxA, int minB
|
|
||||||
where strictForward(a, b, maxA, minB)
|
|
||||||
select a, "Strict forward violation: $@ flows to $@", a.getTimestampExpr(maxA), "timestamp " + maxA,
|
|
||||||
b.getTimestampExpr(minB), "timestamp " + minB
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
| test_boolean.py:9:10:9:43 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:9:59:9:59 | IntegerLiteral | 2 | test_boolean.py:9:10:9:13 | ControlFlowNode for True | True | test_boolean.py:9:19:9:19 | IntegerLiteral | 0 |
|
| test_boolean.py:9:10:9:43 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:9:59:9:59 | IntegerLiteral | 2 | test_boolean.py:9:10:9:13 | ControlFlowNode for True | True | test_boolean.py:9:19:9:19 | IntegerLiteral | 0 |
|
||||||
| test_boolean.py:15:10:15:43 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:15:50:15:50 | IntegerLiteral | 1 | test_boolean.py:15:10:15:14 | ControlFlowNode for False | False | test_boolean.py:15:20:15:20 | IntegerLiteral | 0 |
|
| test_boolean.py:15:10:15:43 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:15:50:15:50 | IntegerLiteral | 1 | test_boolean.py:15:10:15:14 | ControlFlowNode for False | False | test_boolean.py:15:20:15:20 | IntegerLiteral | 0 |
|
||||||
| test_boolean.py:21:10:21:42 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:21:49:21:49 | IntegerLiteral | 1 | test_boolean.py:21:10:21:13 | ControlFlowNode for True | True | test_boolean.py:21:19:21:19 | IntegerLiteral | 0 |
|
| test_boolean.py:21:10:21:42 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:21:49:21:49 | IntegerLiteral | 1 | test_boolean.py:21:10:21:13 | ControlFlowNode for True | True | test_boolean.py:21:19:21:19 | IntegerLiteral | 0 |
|
||||||
| test_boolean.py:27:10:27:43 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:27:59:27:59 | IntegerLiteral | 2 | test_boolean.py:27:10:27:14 | ControlFlowNode for False | False | test_boolean.py:27:20:27:20 | IntegerLiteral | 0 |
|
| test_boolean.py:27:10:27:34 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:27:50:27:50 | IntegerLiteral | 2 | test_boolean.py:27:10:27:14 | ControlFlowNode for False | False | test_boolean.py:27:20:27:20 | IntegerLiteral | 0 |
|
||||||
| test_boolean.py:40:10:40:61 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:40:86:40:86 | IntegerLiteral | 3 | test_boolean.py:40:10:40:10 | ControlFlowNode for IntegerLiteral | IntegerLiteral | test_boolean.py:40:16:40:16 | IntegerLiteral | 0 |
|
| test_boolean.py:40:10:40:61 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:40:86:40:86 | IntegerLiteral | 3 | test_boolean.py:40:10:40:10 | ControlFlowNode for IntegerLiteral | IntegerLiteral | test_boolean.py:40:16:40:16 | IntegerLiteral | 0 |
|
||||||
| test_boolean.py:46:10:46:61 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:46:86:46:86 | IntegerLiteral | 3 | test_boolean.py:46:10:46:10 | ControlFlowNode for IntegerLiteral | IntegerLiteral | test_boolean.py:46:16:46:16 | IntegerLiteral | 0 |
|
| test_boolean.py:46:10:46:61 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:46:86:46:86 | IntegerLiteral | 3 | test_boolean.py:46:10:46:10 | ControlFlowNode for IntegerLiteral | IntegerLiteral | test_boolean.py:46:16:46:16 | IntegerLiteral | 0 |
|
||||||
| test_boolean.py:52:10:52:95 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:52:120:52:120 | IntegerLiteral | 4 | test_boolean.py:52:11:52:47 | ControlFlowNode for BoolExpr | BoolExpr | test_boolean.py:52:63:52:63 | IntegerLiteral | 2 |
|
| test_boolean.py:52:10:52:95 | ControlFlowNode for BoolExpr | Backward flow: $@ flows to $@ (max timestamp $@) | test_boolean.py:52:120:52:120 | IntegerLiteral | 4 | test_boolean.py:52:11:52:47 | ControlFlowNode for BoolExpr | BoolExpr | test_boolean.py:52:63:52:63 | IntegerLiteral | 2 |
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
* exist timestamps a in A and b in B with a < b.
|
* exist timestamps a in A and b in B with a < b.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import OldCfgImpl
|
import OldCfgImpl
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
* Checks that every annotated CFG node belongs to a basic block.
|
* Checks that every annotated CFG node belongs to a basic block.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import OldCfgImpl
|
import OldCfgImpl
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
||||||
|
|||||||
@@ -3,8 +3,6 @@
|
|||||||
* mutually exclusive CFG paths (neither can reach the other).
|
* mutually exclusive CFG paths (neither can reach the other).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import OldCfgImpl
|
import OldCfgImpl
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
||||||
|
|||||||
@@ -3,14 +3,14 @@
|
|||||||
* Python control flow graph.
|
* Python control flow graph.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private import python as Py
|
private import python as PY
|
||||||
import TimerUtils
|
import TimerUtils
|
||||||
|
|
||||||
/** Existing Python CFG implementation of the evaluation-order signature. */
|
/** Existing Python CFG implementation of the evaluation-order signature. */
|
||||||
module OldCfg implements EvalOrderCfgSig {
|
module OldCfg implements EvalOrderCfgSig {
|
||||||
class CfgNode = Py::ControlFlowNode;
|
class CfgNode = PY::ControlFlowNode;
|
||||||
|
|
||||||
class BasicBlock = Py::BasicBlock;
|
class BasicBlock = PY::BasicBlock;
|
||||||
|
|
||||||
CfgNode scopeGetEntryNode(Py::Scope s) { result = s.getEntryNode() }
|
CfgNode scopeGetEntryNode(PY::Scope s) { result = s.getEntryNode() }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
| test_boolean.py:9:10:9:43 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:9:59:9:59 | IntegerLiteral | timestamp 2 | test_boolean.py:9:19:9:19 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:9:10:9:43 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:9:59:9:59 | IntegerLiteral | timestamp 2 | test_boolean.py:9:19:9:19 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:15:10:15:43 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:15:50:15:50 | IntegerLiteral | timestamp 1 | test_boolean.py:15:20:15:20 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:15:10:15:43 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:15:50:15:50 | IntegerLiteral | timestamp 1 | test_boolean.py:15:20:15:20 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:21:10:21:42 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:21:49:21:49 | IntegerLiteral | timestamp 1 | test_boolean.py:21:19:21:19 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:21:10:21:42 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:21:49:21:49 | IntegerLiteral | timestamp 1 | test_boolean.py:21:19:21:19 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:27:10:27:43 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:27:59:27:59 | IntegerLiteral | timestamp 2 | test_boolean.py:27:20:27:20 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:27:10:27:34 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:27:50:27:50 | IntegerLiteral | timestamp 2 | test_boolean.py:27:20:27:20 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:40:10:40:61 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:40:86:40:86 | IntegerLiteral | timestamp 3 | test_boolean.py:40:16:40:16 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:40:10:40:61 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:40:86:40:86 | IntegerLiteral | timestamp 3 | test_boolean.py:40:16:40:16 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:46:10:46:61 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:46:86:46:86 | IntegerLiteral | timestamp 3 | test_boolean.py:46:16:46:16 | IntegerLiteral | timestamp 0 |
|
| test_boolean.py:46:10:46:61 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:46:86:46:86 | IntegerLiteral | timestamp 3 | test_boolean.py:46:16:46:16 | IntegerLiteral | timestamp 0 |
|
||||||
| test_boolean.py:52:10:52:95 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:52:120:52:120 | IntegerLiteral | timestamp 4 | test_boolean.py:52:63:52:63 | IntegerLiteral | timestamp 2 |
|
| test_boolean.py:52:10:52:95 | ControlFlowNode for BoolExpr | Strict forward violation: $@ flows to $@ | test_boolean.py:52:120:52:120 | IntegerLiteral | timestamp 4 | test_boolean.py:52:63:52:63 | IntegerLiteral | timestamp 2 |
|
||||||
|
|||||||
@@ -4,8 +4,6 @@
|
|||||||
* NOT dominate A (forward edge), requires max(A) < min(B).
|
* NOT dominate A (forward edge), requires max(A) < min(B).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import python
|
|
||||||
import TimerUtils
|
|
||||||
import OldCfgImpl
|
import OldCfgImpl
|
||||||
|
|
||||||
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
private module Utils = EvalOrderCfgUtils<OldCfg>;
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ def test_or_short_circuit(t):
|
|||||||
@test
|
@test
|
||||||
def test_or_both_sides(t):
|
def test_or_both_sides(t):
|
||||||
# False or X — both operands evaluated, result is X
|
# False or X — both operands evaluated, result is X
|
||||||
x = (False @ t[0] or 42 @ t[1, dead(2)]) @ t[dead(1), 2]
|
x = (False @ t[0] or 42 @ t[1]) @ t[dead(1), 2]
|
||||||
|
|
||||||
|
|
||||||
@test
|
@test
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ def test_nested_if_else(t):
|
|||||||
else:
|
else:
|
||||||
z = 2 @ t[dead(4)]
|
z = 2 @ t[dead(4)]
|
||||||
else:
|
else:
|
||||||
z = 3 @ t[dead(3), dead(4)]
|
z = 3 @ t[dead(4)]
|
||||||
w = 0 @ t[5]
|
w = 0 @ t[5]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,41 +0,0 @@
|
|||||||
/**
|
|
||||||
* Inline-expectations test for the store/load/delete/parameter
|
|
||||||
* classification predicates on the new-CFG facade.
|
|
||||||
*
|
|
||||||
* Each tag fires when the corresponding predicate (`isLoad`,
|
|
||||||
* `isStore`, `isDelete`, `isParameter`, `isAugLoad`, `isAugStore`)
|
|
||||||
* holds on the canonical CFG node wrapping a `Py::Name` with the
|
|
||||||
* given identifier. Subscript and attribute stores are not covered
|
|
||||||
* by these tags — only the `Name`-typed targets/loads they involve.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import semmle.python.controlflow.internal.Cfg as Cfg
|
|
||||||
import utils.test.InlineExpectationsTest
|
|
||||||
|
|
||||||
module StoreLoadTest implements TestSig {
|
|
||||||
string getARelevantTag() { result = ["load", "store", "delete", "param", "augload", "augstore"] }
|
|
||||||
|
|
||||||
predicate hasActualResult(Location location, string element, string tag, string value) {
|
|
||||||
exists(Cfg::NameNode n |
|
|
||||||
location = n.getLocation() and
|
|
||||||
element = n.toString() and
|
|
||||||
value = n.getId() and
|
|
||||||
(
|
|
||||||
n.isLoad() and not n.isAugLoad() and tag = "load"
|
|
||||||
or
|
|
||||||
n.isStore() and not n.isAugStore() and tag = "store"
|
|
||||||
or
|
|
||||||
n.isDelete() and tag = "delete"
|
|
||||||
or
|
|
||||||
n.isParameter() and tag = "param"
|
|
||||||
or
|
|
||||||
n.isAugLoad() and tag = "augload"
|
|
||||||
or
|
|
||||||
n.isAugStore() and tag = "augstore"
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
import MakeTest<StoreLoadTest>
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
# Store/load/delete/parameter classification on the new-CFG facade.
|
|
||||||
#
|
|
||||||
# Each annotated location carries the (sorted, deduplicated) set of
|
|
||||||
# kinds the CFG facade reports there. Comparing against the legacy
|
|
||||||
# 'semmle.python.Flow' classification is done by the comparison query
|
|
||||||
# 'StoreLoadParity.ql' — annotations here are only the positive
|
|
||||||
# assertions for the new facade.
|
|
||||||
#
|
|
||||||
# Tags:
|
|
||||||
# load=<id> -- isLoad() fires on the Name
|
|
||||||
# store=<id> -- isStore() fires
|
|
||||||
# delete=<id> -- isDelete() fires
|
|
||||||
# param=<id> -- isParameter() fires
|
|
||||||
# augload=<id> -- isAugLoad() fires (the LHS of x += ... when read)
|
|
||||||
# augstore=<id> -- isAugStore() fires (the LHS of x += ... when written)
|
|
||||||
|
|
||||||
|
|
||||||
# --- plain load / store / delete ---
|
|
||||||
|
|
||||||
x = 1 # $ store=x
|
|
||||||
y = x + 1 # $ store=y load=x
|
|
||||||
print(y) # $ load=print load=y
|
|
||||||
del x # $ delete=x
|
|
||||||
|
|
||||||
|
|
||||||
# --- function definitions (parameters) ---
|
|
||||||
|
|
||||||
def f(a, b=2, *args, c, **kwargs): # $ store=f param=a param=b param=args param=c param=kwargs
|
|
||||||
return a + b + c # $ load=a load=b load=c
|
|
||||||
|
|
||||||
|
|
||||||
# --- augmented assignment splits one Name into load + store halves ---
|
|
||||||
|
|
||||||
def aug(): # $ store=aug
|
|
||||||
n = 0 # $ store=n
|
|
||||||
n += 1 # $ augload=n augstore=n
|
|
||||||
return n # $ load=n
|
|
||||||
|
|
||||||
|
|
||||||
# --- subscript / attribute stores ---
|
|
||||||
|
|
||||||
class C: # $ store=C
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def stores(obj, container, idx): # $ store=stores param=obj param=container param=idx
|
|
||||||
obj.attr = 1 # $ load=obj
|
|
||||||
container[idx] = 2 # $ load=container load=idx
|
|
||||||
return obj # $ load=obj
|
|
||||||
|
|
||||||
|
|
||||||
# --- tuple unpacking ---
|
|
||||||
|
|
||||||
def unpack(pair): # $ store=unpack param=pair
|
|
||||||
a, b = pair # $ store=a store=b load=pair
|
|
||||||
return a + b # $ load=a load=b
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
| def-only-old | $:0:0 |
|
|
||||||
| def-only-old | __name__:0:0 |
|
|
||||||
| def-only-old | __package__:0:0 |
|
|
||||||
| def-only-old | e:37:1 |
|
|
||||||
| def-only-old | e:40:25 |
|
|
||||||
| def-only-old | x:20:1 |
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
/**
|
|
||||||
* Compares the new-CFG SSA against the legacy ESSA on the same Python
|
|
||||||
* sources. Reports definitions present in one implementation but not
|
|
||||||
* the other, identified by variable name + source position.
|
|
||||||
*
|
|
||||||
* The `.expected` file records the current diff as a snapshot: as the
|
|
||||||
* new SSA matures (closing captured-variable gap, exception bindings,
|
|
||||||
* etc.) and tracks more variables, the snapshot should monotonically
|
|
||||||
* shrink.
|
|
||||||
*
|
|
||||||
* Known categories of `def-only-old` mismatches:
|
|
||||||
* - Function / class / global definitions with no in-scope read
|
|
||||||
* (intentional: SSA is liveness-pruned, write-only variables are
|
|
||||||
* not tracked).
|
|
||||||
* - Captured / closure variables (gap: new SSA does not yet model
|
|
||||||
* closure captures).
|
|
||||||
* - Module variables `__name__`, `__package__`, `$` (legacy ESSA
|
|
||||||
* adds implicit bindings the new SSA does not).
|
|
||||||
* - Exception-handler `as` bindings (depend on raise modelling).
|
|
||||||
*
|
|
||||||
* `def-only-new` mismatches would indicate the new SSA produces spurious
|
|
||||||
* definitions; currently none are expected.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import semmle.python.dataflow.new.internal.SsaImpl as NewSsa
|
|
||||||
import semmle.python.controlflow.internal.Cfg as Cfg
|
|
||||||
import semmle.python.essa.Essa
|
|
||||||
|
|
||||||
string newDefSig(NewSsa::EssaNodeDefinition def) {
|
|
||||||
exists(Cfg::ControlFlowNode n | n = def.getDefiningNode() |
|
|
||||||
result =
|
|
||||||
def.getVariable().getVariable().getId() + ":" + n.getLocation().getStartLine() + ":" +
|
|
||||||
n.getLocation().getStartColumn()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
string legacyDefSig(EssaNodeDefinition def) {
|
|
||||||
exists(ControlFlowNode n | n = def.getDefiningNode() |
|
|
||||||
result =
|
|
||||||
def.getSourceVariable().getName() + ":" + n.getLocation().getStartLine() + ":" +
|
|
||||||
n.getLocation().getStartColumn()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
from string kind, string sig
|
|
||||||
where
|
|
||||||
kind = "def-only-new" and
|
|
||||||
exists(NewSsa::EssaNodeDefinition def |
|
|
||||||
sig = newDefSig(def) and
|
|
||||||
not exists(EssaNodeDefinition legacyDef | sig = legacyDefSig(legacyDef))
|
|
||||||
)
|
|
||||||
or
|
|
||||||
kind = "def-only-old" and
|
|
||||||
exists(EssaNodeDefinition legacyDef |
|
|
||||||
sig = legacyDefSig(legacyDef) and
|
|
||||||
not exists(NewSsa::EssaNodeDefinition def | sig = newDefSig(def))
|
|
||||||
)
|
|
||||||
select kind, sig
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
def simple_assign():
|
|
||||||
x = 1
|
|
||||||
return x
|
|
||||||
|
|
||||||
|
|
||||||
def reassignment():
|
|
||||||
x = 1
|
|
||||||
x = 2
|
|
||||||
return x
|
|
||||||
|
|
||||||
|
|
||||||
def if_else_branch(cond):
|
|
||||||
if cond:
|
|
||||||
x = 1
|
|
||||||
else:
|
|
||||||
x = 2
|
|
||||||
return x
|
|
||||||
|
|
||||||
|
|
||||||
def loop(xs):
|
|
||||||
total = 0
|
|
||||||
for x in xs:
|
|
||||||
total = total + x
|
|
||||||
return total
|
|
||||||
|
|
||||||
|
|
||||||
def parameter(a, b=2, *args, **kwargs):
|
|
||||||
return a + b + sum(args)
|
|
||||||
|
|
||||||
|
|
||||||
def closure(x):
|
|
||||||
def inner():
|
|
||||||
return x
|
|
||||||
return inner
|
|
||||||
|
|
||||||
|
|
||||||
def exception_binding():
|
|
||||||
try:
|
|
||||||
compute()
|
|
||||||
except Exception as e:
|
|
||||||
return e
|
|
||||||
|
|
||||||
|
|
||||||
def with_binding():
|
|
||||||
with open("file") as f:
|
|
||||||
return f.read()
|
|
||||||
|
|
||||||
|
|
||||||
GLOBAL = 1
|
|
||||||
|
|
||||||
|
|
||||||
def read_global():
|
|
||||||
return GLOBAL
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
/**
|
|
||||||
* Inline-expectations test for the new-CFG SSA adapter
|
|
||||||
* (`semmle.python.dataflow.new.internal.SsaImpl`).
|
|
||||||
*
|
|
||||||
* Tags:
|
|
||||||
* - `def=<var>`: there is an SSA write definition of `<var>` at this
|
|
||||||
* line (parameter init, plain assignment, augmented assignment,
|
|
||||||
* exception-handler binding, deletion, etc.).
|
|
||||||
* - `use=<var>`: `<var>` is used at this line, and some SSA definition
|
|
||||||
* of `<var>` reaches the read.
|
|
||||||
* - `phi=<var>`: there is an SSA phi definition of `<var>` whose BB
|
|
||||||
* starts on this line.
|
|
||||||
*/
|
|
||||||
|
|
||||||
import python
|
|
||||||
import semmle.python.dataflow.new.internal.SsaImpl as SsaImpl
|
|
||||||
import semmle.python.controlflow.internal.AstNodeImpl as CfgImpl
|
|
||||||
import semmle.python.controlflow.internal.Cfg as Cfg
|
|
||||||
import utils.test.InlineExpectationsTest
|
|
||||||
|
|
||||||
module SsaTest implements TestSig {
|
|
||||||
string getARelevantTag() { result = ["def", "use", "phi"] }
|
|
||||||
|
|
||||||
predicate hasActualResult(Location location, string element, string tag, string value) {
|
|
||||||
// A `def=<id>` fires when an SSA WriteDefinition is at a CFG node
|
|
||||||
// on the given line.
|
|
||||||
exists(SsaImpl::Ssa::WriteDefinition def, CfgImpl::BasicBlock bb, int i, Cfg::NameNode n |
|
|
||||||
def.definesAt(_, bb, i) and
|
|
||||||
bb.getNode(i) = n and
|
|
||||||
tag = "def" and
|
|
||||||
location = n.getLocation() and
|
|
||||||
element = n.toString() and
|
|
||||||
value = n.getId()
|
|
||||||
)
|
|
||||||
or
|
|
||||||
// A `use=<id>` fires when an SSA Definition reaches a read at this
|
|
||||||
// CFG node.
|
|
||||||
exists(SsaImpl::Ssa::Definition def, CfgImpl::BasicBlock bb, int i, Cfg::NameNode n |
|
|
||||||
SsaImpl::Ssa::ssaDefReachesRead(_, def, bb, i) and
|
|
||||||
bb.getNode(i) = n and
|
|
||||||
tag = "use" and
|
|
||||||
location = n.getLocation() and
|
|
||||||
element = n.toString() and
|
|
||||||
value = n.getId()
|
|
||||||
)
|
|
||||||
or
|
|
||||||
// A `phi=<id>` fires when there is a phi node whose BB's first
|
|
||||||
// CFG node is on the given line.
|
|
||||||
exists(SsaImpl::Ssa::PhiNode phi, CfgImpl::BasicBlock bb |
|
|
||||||
phi.definesAt(_, bb, _) and
|
|
||||||
tag = "phi" and
|
|
||||||
location = bb.getNode(0).getLocation() and
|
|
||||||
element = bb.toString() and
|
|
||||||
value = phi.getSourceVariable().(SsaImpl::SsaSourceVariable).getVariable().getId()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
import MakeTest<SsaTest>
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
# Basic SSA tests for the new-CFG SSA adapter.
|
|
||||||
#
|
|
||||||
# The shared SSA implementation prunes its construction by liveness:
|
|
||||||
# definitions of variables that are not read are never materialised.
|
|
||||||
# This is by design — write-only variables would only bloat the SSA
|
|
||||||
# graph. Tests therefore must always include a read of each variable
|
|
||||||
# being verified.
|
|
||||||
#
|
|
||||||
# Annotations:
|
|
||||||
# def=<var>: there is an SSA write definition of <var> at this line
|
|
||||||
# use=<var>: <var> is used here and the read resolves to some def
|
|
||||||
#
|
|
||||||
# Note: a module-level `def name(...)` statement is itself a write
|
|
||||||
# definition of the module global `name`, which is live (it can be read
|
|
||||||
# externally), so every function below carries a `def=<name>` annotation
|
|
||||||
# on its `def` line.
|
|
||||||
|
|
||||||
|
|
||||||
def basic_param(x): # $ def=basic_param def=x
|
|
||||||
return x # $ use=x
|
|
||||||
|
|
||||||
|
|
||||||
def basic_assign(): # $ def=basic_assign
|
|
||||||
y = 1 # $ def=y
|
|
||||||
return y # $ use=y
|
|
||||||
|
|
||||||
|
|
||||||
def reassignment(): # $ def=reassignment
|
|
||||||
x = 1
|
|
||||||
x = 2 # $ def=x
|
|
||||||
return x # $ use=x
|
|
||||||
|
|
||||||
|
|
||||||
def if_else_phi(cond): # $ def=if_else_phi def=cond
|
|
||||||
if cond: # $ use=cond phi=x
|
|
||||||
x = 1 # $ def=x
|
|
||||||
else:
|
|
||||||
x = 2 # $ def=x
|
|
||||||
return x # $ use=x
|
|
||||||
|
|
||||||
|
|
||||||
# `some_undefined` is never assigned anywhere, so (matching legacy ESSA)
|
|
||||||
# the SSA library creates no entry definition for it: an undefined-name
|
|
||||||
# read resolves to no SSA def, hence there is no `use=` here.
|
|
||||||
def use_global(): # $ def=use_global
|
|
||||||
return some_undefined
|
|
||||||
|
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user