Skip to content

Commit f96a984

Browse files
authored
Merge pull request #135 from microsoft/api-graphs-qualified-calls
PS: Allow `Instance` on explicit module uses
2 parents 8550178 + 2255fda commit f96a984

File tree

13 files changed

+409
-386
lines changed

13 files changed

+409
-386
lines changed

powershell/ql/lib/semmle/code/powershell/ApiGraphs.qll

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -475,7 +475,9 @@ module API {
475475
MkModule(string qualifiedModule) {
476476
any(UsingStmt using).getName() = qualifiedModule
477477
or
478-
any(Cmd cmd).getQualifiedCommandName() = qualifiedModule
478+
any(Cmd cmd).getNamespaceQualifier() = qualifiedModule
479+
or
480+
any(TypeNameExpr tn).getName() = qualifiedModule
479481
or
480482
any(ModuleManifest manifest).getModuleName() = qualifiedModule
481483
} or
@@ -645,6 +647,7 @@ module API {
645647

646648
cached
647649
predicate instanceEdge(Node pred, Node succ) {
650+
// An instance of a type
648651
exists(string qualifiedType | pred = MkType(qualifiedType) |
649652
exists(DataFlow::ObjectCreationNode objCreation |
650653
objCreation.getConstructedTypeName() = qualifiedType and
@@ -656,6 +659,15 @@ module API {
656659
succ = getForwardStartNode(p)
657660
)
658661
)
662+
or
663+
// A use of a module (or static type?)
664+
// TODO: Consider implicit module qualiifers and use instance on all of them
665+
exists(string qualifiedType, DataFlow::TypeNameNode typeName |
666+
pred = MkModule(qualifiedType) and
667+
typeName.getTypeName() = qualifiedType
668+
|
669+
succ = getForwardStartNode(typeName)
670+
)
659671
}
660672

661673
cached

powershell/ql/lib/semmle/code/powershell/Command.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ private predicate parseCommandName(Cmd cmd, string namespace, string name) {
1212
}
1313

1414
class Cmd extends @command, CmdBase {
15-
override string toString() { result = this.getQualifiedCommandName() }
15+
override string toString() { result = "call to " + this.getQualifiedCommandName() }
1616

1717
override SourceLocation getLocation() { command_location(this, result) }
1818

powershell/ql/lib/semmle/code/powershell/dataflow/internal/DataFlowPublic.qll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -450,3 +450,12 @@ class CallNode extends AstNode {
450450

451451
int getNumberOfArguments() { result = call.getNumberOfArguments() }
452452
}
453+
454+
/** A use of a type name, viewed as a node in a data flow graph. */
455+
class TypeNameNode extends ExprNode {
456+
override CfgNodes::ExprNodes::TypeNameCfgNode n;
457+
458+
final override CfgNodes::ExprNodes::TypeNameCfgNode getExprNode() { result = n }
459+
460+
string getTypeName() { result = n.getTypeName() }
461+
}

powershell/ql/lib/semmle/code/powershell/frameworks/data/internal/ApiGraphModelsSpecific.qll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,12 @@ API::Node getExtraNodeFromType(string qualifiedType) {
7070
qualifiedType = "" and
7171
result = API::root()
7272
or
73-
// TODO: How to distinguish between these two cases? And do we need to?
73+
// TODO: How to distinguish between these cases? And do we need to?
7474
exists(string mod, string type | parseRelevantType(qualifiedType, mod, type) |
7575
result = API::mod(qualifiedType)
7676
or
77+
result = API::mod(qualifiedType).getInstance()
78+
or
7779
result = API::mod(mod).getType(type)
7880
)
7981
}

powershell/ql/test/library-tests/ast/Statements/statements.expected

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99
| TrapStatement.ps1:1:1:4:2 | TrapTest |
1010
| TrapStatement.ps1:2:5:2:26 | TrapStatement at: TrapStatement.ps1:2:5:2:26 |
1111
| TrapStatement.ps1:2:11:2:25 | Error found. |
12-
| TrapStatement.ps1:3:5:3:19 | nonsenseString |
13-
| TrapStatement.ps1:6:1:6:9 | TrapTest |
12+
| TrapStatement.ps1:3:5:3:19 | call to nonsenseString |
13+
| TrapStatement.ps1:6:1:6:9 | call to TrapTest |
1414
| Try.ps1:1:1:13:2 | try {...} |
1515
| Try.ps1:2:4:2:95 | ...=... |
16-
| Try.ps1:2:17:2:95 | New-Object |
16+
| Try.ps1:2:17:2:95 | call to New-Object |
1717
| Try.ps1:2:69:2:94 | ...,... |
1818
| Try.ps1:3:5:3:21 | throw ... |
1919
| Try.ps1:3:11:3:21 | Exception |

powershell/ql/test/library-tests/ast/parent.expected

Lines changed: 57 additions & 57 deletions
Large diffs are not rendered by default.

powershell/ql/test/library-tests/controlflow/graph/Cfg.expected

Lines changed: 44 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -225,8 +225,8 @@
225225
| conditionals.ps1:116:9:116:17 | default: | conditionals.ps1:116:18:119:10 | {...} | true |
226226
| conditionals.ps1:116:18:119:10 | {...} | conditionals.ps1:117:13:117:25 | Write-Output | |
227227
| conditionals.ps1:117:13:117:25 | Write-Output | conditionals.ps1:117:26:117:34 | Error! | |
228-
| conditionals.ps1:117:13:117:34 | Write-Output | conditionals.ps1:118:13:118:21 | return ... | |
229-
| conditionals.ps1:117:26:117:34 | Error! | conditionals.ps1:117:13:117:34 | Write-Output | |
228+
| conditionals.ps1:117:13:117:34 | call to Write-Output | conditionals.ps1:118:13:118:21 | return ... | |
229+
| conditionals.ps1:117:26:117:34 | Error! | conditionals.ps1:117:13:117:34 | call to Write-Output | |
230230
| conditionals.ps1:118:13:118:21 | return ... | conditionals.ps1:118:20:118:21 | 3 | |
231231
| conditionals.ps1:118:20:118:21 | 3 | conditionals.ps1:110:34:121:2 | exit {...} (normal) | |
232232
| conditionals.ps1:118:20:118:21 | 3 | conditionals.ps1:118:20:118:21 | 3 | |
@@ -549,8 +549,8 @@
549549
| try.ps1:2:5:7:13 | {...} | try.ps1:2:5:6:6 | try {...} | |
550550
| try.ps1:2:9:4:6 | {...} | try.ps1:3:9:3:21 | Write-Output | |
551551
| try.ps1:3:9:3:21 | Write-Output | try.ps1:3:22:3:30 | Hello! | |
552-
| try.ps1:3:9:3:30 | Write-Output | try.ps1:7:5:7:13 | return ... | |
553-
| try.ps1:3:22:3:30 | Hello! | try.ps1:3:9:3:30 | Write-Output | |
552+
| try.ps1:3:9:3:30 | call to Write-Output | try.ps1:7:5:7:13 | return ... | |
553+
| try.ps1:3:22:3:30 | Hello! | try.ps1:3:9:3:30 | call to Write-Output | |
554554
| try.ps1:7:5:7:13 | return ... | try.ps1:7:12:7:13 | 1 | |
555555
| try.ps1:7:12:7:13 | 1 | try.ps1:1:25:8:2 | exit {...} (normal) | |
556556
| try.ps1:7:12:7:13 | 1 | try.ps1:7:12:7:13 | 1 | |
@@ -613,8 +613,8 @@
613613
| try.ps1:44:5:49:13 | {...} | try.ps1:44:5:48:6 | try {...} | |
614614
| try.ps1:44:9:46:6 | {...} | try.ps1:45:9:45:21 | Write-Output | |
615615
| try.ps1:45:9:45:21 | Write-Output | try.ps1:45:22:45:30 | Hello! | |
616-
| try.ps1:45:9:45:30 | Write-Output | try.ps1:49:5:49:13 | return ... | |
617-
| try.ps1:45:22:45:30 | Hello! | try.ps1:45:9:45:30 | Write-Output | |
616+
| try.ps1:45:9:45:30 | call to Write-Output | try.ps1:49:5:49:13 | return ... | |
617+
| try.ps1:45:22:45:30 | Hello! | try.ps1:45:9:45:30 | call to Write-Output | |
618618
| try.ps1:49:5:49:13 | return ... | try.ps1:49:12:49:13 | 1 | |
619619
| try.ps1:49:12:49:13 | 1 | try.ps1:43:36:50:2 | exit {...} (normal) | |
620620
| try.ps1:49:12:49:13 | 1 | try.ps1:49:12:49:13 | 1 | |
@@ -626,8 +626,8 @@
626626
| try.ps1:53:5:58:13 | {...} | try.ps1:53:5:57:6 | try {...} | |
627627
| try.ps1:53:9:55:6 | {...} | try.ps1:54:9:54:21 | Write-Output | |
628628
| try.ps1:54:9:54:21 | Write-Output | try.ps1:54:22:54:30 | Hello! | |
629-
| try.ps1:54:9:54:30 | Write-Output | try.ps1:58:5:58:13 | return ... | |
630-
| try.ps1:54:22:54:30 | Hello! | try.ps1:54:9:54:30 | Write-Output | |
629+
| try.ps1:54:9:54:30 | call to Write-Output | try.ps1:58:5:58:13 | return ... | |
630+
| try.ps1:54:22:54:30 | Hello! | try.ps1:54:9:54:30 | call to Write-Output | |
631631
| try.ps1:58:5:58:13 | return ... | try.ps1:58:12:58:13 | 1 | |
632632
| try.ps1:58:12:58:13 | 1 | try.ps1:52:36:59:2 | exit {...} (normal) | |
633633
| try.ps1:58:12:58:13 | 1 | try.ps1:58:12:58:13 | 1 | |
@@ -639,8 +639,8 @@
639639
| try.ps1:62:5:69:13 | {...} | try.ps1:62:5:68:6 | try {...} | |
640640
| try.ps1:62:9:64:6 | {...} | try.ps1:63:9:63:21 | Write-Output | |
641641
| try.ps1:63:9:63:21 | Write-Output | try.ps1:63:22:63:30 | Hello! | |
642-
| try.ps1:63:9:63:30 | Write-Output | try.ps1:69:5:69:13 | return ... | |
643-
| try.ps1:63:22:63:30 | Hello! | try.ps1:63:9:63:30 | Write-Output | |
642+
| try.ps1:63:9:63:30 | call to Write-Output | try.ps1:69:5:69:13 | return ... | |
643+
| try.ps1:63:22:63:30 | Hello! | try.ps1:63:9:63:30 | call to Write-Output | |
644644
| try.ps1:69:5:69:13 | return ... | try.ps1:69:12:69:13 | 2 | |
645645
| try.ps1:69:12:69:13 | 2 | try.ps1:61:40:70:2 | exit {...} (normal) | |
646646
| try.ps1:69:12:69:13 | 2 | try.ps1:69:12:69:13 | 2 | |
@@ -652,8 +652,8 @@
652652
| try.ps1:73:5:78:13 | {...} | try.ps1:73:5:77:6 | try {...} | |
653653
| try.ps1:73:9:75:6 | {...} | try.ps1:74:9:74:21 | Write-Output | |
654654
| try.ps1:74:9:74:21 | Write-Output | try.ps1:74:22:74:30 | Hello! | |
655-
| try.ps1:74:9:74:30 | Write-Output | try.ps1:78:5:78:13 | return ... | |
656-
| try.ps1:74:22:74:30 | Hello! | try.ps1:74:9:74:30 | Write-Output | |
655+
| try.ps1:74:9:74:30 | call to Write-Output | try.ps1:78:5:78:13 | return ... | |
656+
| try.ps1:74:22:74:30 | Hello! | try.ps1:74:9:74:30 | call to Write-Output | |
657657
| try.ps1:78:5:78:13 | return ... | try.ps1:78:12:78:13 | 1 | |
658658
| try.ps1:78:12:78:13 | 1 | try.ps1:72:36:79:2 | exit {...} (normal) | |
659659
| try.ps1:78:12:78:13 | 1 | try.ps1:78:12:78:13 | 1 | |
@@ -665,8 +665,8 @@
665665
| try.ps1:82:5:89:13 | {...} | try.ps1:82:5:88:6 | try {...} | |
666666
| try.ps1:82:9:84:6 | {...} | try.ps1:83:9:83:21 | Write-Output | |
667667
| try.ps1:83:9:83:21 | Write-Output | try.ps1:83:22:83:30 | Hello! | |
668-
| try.ps1:83:9:83:30 | Write-Output | try.ps1:89:5:89:13 | return ... | |
669-
| try.ps1:83:22:83:30 | Hello! | try.ps1:83:9:83:30 | Write-Output | |
668+
| try.ps1:83:9:83:30 | call to Write-Output | try.ps1:89:5:89:13 | return ... | |
669+
| try.ps1:83:22:83:30 | Hello! | try.ps1:83:9:83:30 | call to Write-Output | |
670670
| try.ps1:89:5:89:13 | return ... | try.ps1:89:12:89:13 | 2 | |
671671
| try.ps1:89:12:89:13 | 2 | try.ps1:81:40:90:2 | exit {...} (normal) | |
672672
| try.ps1:89:12:89:13 | 2 | try.ps1:89:12:89:13 | 2 | |
@@ -678,8 +678,8 @@
678678
| try.ps1:93:5:102:13 | {...} | try.ps1:93:5:101:6 | try {...} | |
679679
| try.ps1:93:9:95:6 | {...} | try.ps1:94:9:94:21 | Write-Output | |
680680
| try.ps1:94:9:94:21 | Write-Output | try.ps1:94:22:94:30 | Hello! | |
681-
| try.ps1:94:9:94:30 | Write-Output | try.ps1:102:5:102:13 | return ... | |
682-
| try.ps1:94:22:94:30 | Hello! | try.ps1:94:9:94:30 | Write-Output | |
681+
| try.ps1:94:9:94:30 | call to Write-Output | try.ps1:102:5:102:13 | return ... | |
682+
| try.ps1:94:22:94:30 | Hello! | try.ps1:94:9:94:30 | call to Write-Output | |
683683
| try.ps1:102:5:102:13 | return ... | try.ps1:102:12:102:13 | 3 | |
684684
| try.ps1:102:12:102:13 | 3 | try.ps1:92:42:103:2 | exit {...} (normal) | |
685685
| try.ps1:102:12:102:13 | 3 | try.ps1:102:12:102:13 | 3 | |
@@ -691,12 +691,12 @@
691691
| try.ps1:106:5:113:13 | {...} | try.ps1:106:5:112:6 | try {...} | |
692692
| try.ps1:106:9:108:6 | {...} | try.ps1:107:9:107:21 | Write-Output | |
693693
| try.ps1:107:9:107:21 | Write-Output | try.ps1:107:22:107:30 | Hello! | |
694-
| try.ps1:107:9:107:30 | Write-Output | try.ps1:110:15:112:6 | {...} | |
695-
| try.ps1:107:22:107:30 | Hello! | try.ps1:107:9:107:30 | Write-Output | |
694+
| try.ps1:107:9:107:30 | call to Write-Output | try.ps1:110:15:112:6 | {...} | |
695+
| try.ps1:107:22:107:30 | Hello! | try.ps1:107:9:107:30 | call to Write-Output | |
696696
| try.ps1:110:15:112:6 | {...} | try.ps1:111:9:111:21 | Write-Output | |
697697
| try.ps1:111:9:111:21 | Write-Output | try.ps1:111:22:111:32 | Finally! | |
698-
| try.ps1:111:9:111:32 | Write-Output | try.ps1:113:5:113:13 | return ... | |
699-
| try.ps1:111:22:111:32 | Finally! | try.ps1:111:9:111:32 | Write-Output | |
698+
| try.ps1:111:9:111:32 | call to Write-Output | try.ps1:113:5:113:13 | return ... | |
699+
| try.ps1:111:22:111:32 | Finally! | try.ps1:111:9:111:32 | call to Write-Output | |
700700
| try.ps1:113:5:113:13 | return ... | try.ps1:113:12:113:13 | 1 | |
701701
| try.ps1:113:12:113:13 | 1 | try.ps1:105:33:114:2 | exit {...} (normal) | |
702702
| try.ps1:113:12:113:13 | 1 | try.ps1:113:12:113:13 | 1 | |
@@ -708,12 +708,12 @@
708708
| try.ps1:117:5:122:13 | {...} | try.ps1:117:5:121:6 | try {...} | |
709709
| try.ps1:117:9:119:6 | {...} | try.ps1:118:9:118:21 | Write-Output | |
710710
| try.ps1:118:9:118:21 | Write-Output | try.ps1:118:22:118:30 | Hello! | |
711-
| try.ps1:118:9:118:30 | Write-Output | try.ps1:119:15:121:6 | {...} | |
712-
| try.ps1:118:22:118:30 | Hello! | try.ps1:118:9:118:30 | Write-Output | |
711+
| try.ps1:118:9:118:30 | call to Write-Output | try.ps1:119:15:121:6 | {...} | |
712+
| try.ps1:118:22:118:30 | Hello! | try.ps1:118:9:118:30 | call to Write-Output | |
713713
| try.ps1:119:15:121:6 | {...} | try.ps1:120:9:120:21 | Write-Output | |
714714
| try.ps1:120:9:120:21 | Write-Output | try.ps1:120:22:120:32 | Finally! | |
715-
| try.ps1:120:9:120:32 | Write-Output | try.ps1:122:5:122:13 | return ... | |
716-
| try.ps1:120:22:120:32 | Finally! | try.ps1:120:9:120:32 | Write-Output | |
715+
| try.ps1:120:9:120:32 | call to Write-Output | try.ps1:122:5:122:13 | return ... | |
716+
| try.ps1:120:22:120:32 | Finally! | try.ps1:120:9:120:32 | call to Write-Output | |
717717
| try.ps1:122:5:122:13 | return ... | try.ps1:122:12:122:13 | 1 | |
718718
| try.ps1:122:12:122:13 | 1 | try.ps1:116:27:123:2 | exit {...} (normal) | |
719719
| try.ps1:122:12:122:13 | 1 | try.ps1:122:12:122:13 | 1 | |
@@ -725,12 +725,12 @@
725725
| try.ps1:126:5:133:13 | {...} | try.ps1:126:5:132:6 | try {...} | |
726726
| try.ps1:126:9:128:6 | {...} | try.ps1:127:9:127:21 | Write-Output | |
727727
| try.ps1:127:9:127:21 | Write-Output | try.ps1:127:22:127:30 | Hello! | |
728-
| try.ps1:127:9:127:30 | Write-Output | try.ps1:130:15:132:6 | {...} | |
729-
| try.ps1:127:22:127:30 | Hello! | try.ps1:127:9:127:30 | Write-Output | |
728+
| try.ps1:127:9:127:30 | call to Write-Output | try.ps1:130:15:132:6 | {...} | |
729+
| try.ps1:127:22:127:30 | Hello! | try.ps1:127:9:127:30 | call to Write-Output | |
730730
| try.ps1:130:15:132:6 | {...} | try.ps1:131:9:131:21 | Write-Output | |
731731
| try.ps1:131:9:131:21 | Write-Output | try.ps1:131:22:131:32 | Finally! | |
732-
| try.ps1:131:9:131:32 | Write-Output | try.ps1:133:5:133:13 | return ... | |
733-
| try.ps1:131:22:131:32 | Finally! | try.ps1:131:9:131:32 | Write-Output | |
732+
| try.ps1:131:9:131:32 | call to Write-Output | try.ps1:133:5:133:13 | return ... | |
733+
| try.ps1:131:22:131:32 | Finally! | try.ps1:131:9:131:32 | call to Write-Output | |
734734
| try.ps1:133:5:133:13 | return ... | try.ps1:133:12:133:13 | 1 | |
735735
| try.ps1:133:12:133:13 | 1 | try.ps1:125:44:134:2 | exit {...} (normal) | |
736736
| try.ps1:133:12:133:13 | 1 | try.ps1:133:12:133:13 | 1 | |
@@ -744,8 +744,8 @@
744744
| try.ps1:138:9:142:10 | try {...} | try.ps1:138:13:140:10 | {...} | |
745745
| try.ps1:138:13:140:10 | {...} | try.ps1:139:13:139:25 | Write-Output | |
746746
| try.ps1:139:13:139:25 | Write-Output | try.ps1:139:26:139:34 | Hello! | |
747-
| try.ps1:139:13:139:34 | Write-Output | try.ps1:146:5:146:13 | return ... | |
748-
| try.ps1:139:26:139:34 | Hello! | try.ps1:139:13:139:34 | Write-Output | |
747+
| try.ps1:139:13:139:34 | call to Write-Output | try.ps1:146:5:146:13 | return ... | |
748+
| try.ps1:139:26:139:34 | Hello! | try.ps1:139:13:139:34 | call to Write-Output | |
749749
| try.ps1:146:5:146:13 | return ... | try.ps1:146:12:146:13 | 1 | |
750750
| try.ps1:146:12:146:13 | 1 | try.ps1:136:40:147:2 | exit {...} (normal) | |
751751
| try.ps1:146:12:146:13 | 1 | try.ps1:146:12:146:13 | 1 | |
@@ -759,12 +759,12 @@
759759
| try.ps1:151:9:157:10 | try {...} | try.ps1:151:13:153:10 | {...} | |
760760
| try.ps1:151:13:153:10 | {...} | try.ps1:152:13:152:25 | Write-Output | |
761761
| try.ps1:152:13:152:25 | Write-Output | try.ps1:152:26:152:34 | Hello! | |
762-
| try.ps1:152:13:152:34 | Write-Output | try.ps1:155:19:157:10 | {...} | |
763-
| try.ps1:152:26:152:34 | Hello! | try.ps1:152:13:152:34 | Write-Output | |
762+
| try.ps1:152:13:152:34 | call to Write-Output | try.ps1:155:19:157:10 | {...} | |
763+
| try.ps1:152:26:152:34 | Hello! | try.ps1:152:13:152:34 | call to Write-Output | |
764764
| try.ps1:155:19:157:10 | {...} | try.ps1:156:13:156:25 | Write-Output | |
765765
| try.ps1:156:13:156:25 | Write-Output | try.ps1:156:26:156:36 | Finally! | |
766-
| try.ps1:156:13:156:36 | Write-Output | try.ps1:161:5:161:13 | return ... | |
767-
| try.ps1:156:26:156:36 | Finally! | try.ps1:156:13:156:36 | Write-Output | |
766+
| try.ps1:156:13:156:36 | call to Write-Output | try.ps1:161:5:161:13 | return ... | |
767+
| try.ps1:156:26:156:36 | Finally! | try.ps1:156:13:156:36 | call to Write-Output | |
768768
| try.ps1:161:5:161:13 | return ... | try.ps1:161:12:161:13 | 1 | |
769769
| try.ps1:161:12:161:13 | 1 | try.ps1:149:40:162:2 | exit {...} (normal) | |
770770
| try.ps1:161:12:161:13 | 1 | try.ps1:161:12:161:13 | 1 | |
@@ -778,12 +778,12 @@
778778
| try.ps1:166:9:170:10 | try {...} | try.ps1:166:13:168:10 | {...} | |
779779
| try.ps1:166:13:168:10 | {...} | try.ps1:167:13:167:25 | Write-Output | |
780780
| try.ps1:167:13:167:25 | Write-Output | try.ps1:167:26:167:34 | Hello! | |
781-
| try.ps1:167:13:167:34 | Write-Output | try.ps1:173:15:175:6 | {...} | |
782-
| try.ps1:167:26:167:34 | Hello! | try.ps1:167:13:167:34 | Write-Output | |
781+
| try.ps1:167:13:167:34 | call to Write-Output | try.ps1:173:15:175:6 | {...} | |
782+
| try.ps1:167:26:167:34 | Hello! | try.ps1:167:13:167:34 | call to Write-Output | |
783783
| try.ps1:173:15:175:6 | {...} | try.ps1:174:9:174:21 | Write-Output | |
784784
| try.ps1:174:9:174:21 | Write-Output | try.ps1:174:22:174:32 | Finally! | |
785-
| try.ps1:174:9:174:32 | Write-Output | try.ps1:176:5:176:13 | return ... | |
786-
| try.ps1:174:22:174:32 | Finally! | try.ps1:174:9:174:32 | Write-Output | |
785+
| try.ps1:174:9:174:32 | call to Write-Output | try.ps1:176:5:176:13 | return ... | |
786+
| try.ps1:174:22:174:32 | Finally! | try.ps1:174:9:174:32 | call to Write-Output | |
787787
| try.ps1:176:5:176:13 | return ... | try.ps1:176:12:176:13 | 1 | |
788788
| try.ps1:176:12:176:13 | 1 | try.ps1:164:40:177:2 | exit {...} (normal) | |
789789
| try.ps1:176:12:176:13 | 1 | try.ps1:176:12:176:13 | 1 | |
@@ -797,16 +797,16 @@
797797
| try.ps1:181:9:187:10 | try {...} | try.ps1:181:13:183:10 | {...} | |
798798
| try.ps1:181:13:183:10 | {...} | try.ps1:182:13:182:25 | Write-Output | |
799799
| try.ps1:182:13:182:25 | Write-Output | try.ps1:182:26:182:34 | Hello! | |
800-
| try.ps1:182:13:182:34 | Write-Output | try.ps1:185:19:187:10 | {...} | |
801-
| try.ps1:182:26:182:34 | Hello! | try.ps1:182:13:182:34 | Write-Output | |
800+
| try.ps1:182:13:182:34 | call to Write-Output | try.ps1:185:19:187:10 | {...} | |
801+
| try.ps1:182:26:182:34 | Hello! | try.ps1:182:13:182:34 | call to Write-Output | |
802802
| try.ps1:185:19:187:10 | {...} | try.ps1:186:13:186:25 | Write-Output | |
803803
| try.ps1:186:13:186:25 | Write-Output | try.ps1:186:26:186:36 | Finally! | |
804-
| try.ps1:186:13:186:36 | Write-Output | try.ps1:190:15:192:6 | {...} | |
805-
| try.ps1:186:26:186:36 | Finally! | try.ps1:186:13:186:36 | Write-Output | |
804+
| try.ps1:186:13:186:36 | call to Write-Output | try.ps1:190:15:192:6 | {...} | |
805+
| try.ps1:186:26:186:36 | Finally! | try.ps1:186:13:186:36 | call to Write-Output | |
806806
| try.ps1:190:15:192:6 | {...} | try.ps1:191:9:191:21 | Write-Output | |
807807
| try.ps1:191:9:191:21 | Write-Output | try.ps1:191:22:191:32 | Finally! | |
808-
| try.ps1:191:9:191:32 | Write-Output | try.ps1:193:5:193:13 | return ... | |
809-
| try.ps1:191:22:191:32 | Finally! | try.ps1:191:9:191:32 | Write-Output | |
808+
| try.ps1:191:9:191:32 | call to Write-Output | try.ps1:193:5:193:13 | return ... | |
809+
| try.ps1:191:22:191:32 | Finally! | try.ps1:191:9:191:32 | call to Write-Output | |
810810
| try.ps1:193:5:193:13 | return ... | try.ps1:193:12:193:13 | 1 | |
811811
| try.ps1:193:12:193:13 | 1 | try.ps1:179:46:194:2 | exit {...} (normal) | |
812812
| try.ps1:193:12:193:13 | 1 | try.ps1:193:12:193:13 | 1 | |

0 commit comments

Comments
 (0)