Skip to content

Commit 19c58d5

Browse files
Fix S1854 FP: Throw should visit finally (#9530)
1 parent 527abcb commit 19c58d5

5 files changed

Lines changed: 506 additions & 63 deletions

File tree

analyzers/src/SonarAnalyzer.CFG/CfgSerializer/CfgSerializer.RoslynLvaWalker.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ protected override void WriteEdges(BasicBlock block)
3838
{
3939
foreach (var predecessor in lva.BlockPredecessors[block.Ordinal].Where(x => !block.Predecessors.Any(y => y.Source == x)))
4040
{
41-
writer.WriteEdge(BlockId(predecessor), BlockId(block), "LVA");
41+
writer.WriteEdge(BlockId(predecessor), BlockId(block), "LVA\" fontcolor=\"blue\" penwidth=\"2\" color=\"blue");
4242
}
4343
base.WriteEdges(block);
4444
}

analyzers/src/SonarAnalyzer.CFG/LiveVariableAnalysis/RoslynLiveVariableAnalysis.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,9 +141,9 @@ private void BuildBranches(BasicBlock block)
141141
AddPredecessorsOutsideRegion(finallyBlock);
142142
}
143143
}
144-
if (block.IsEnclosedIn(ControlFlowRegionKind.Catch) && block.Successors.Any(x => x.Semantics == ControlFlowBranchSemantics.Rethrow))
144+
if (block.IsEnclosedIn(ControlFlowRegionKind.Catch) && block.Successors.Any(x => x.Semantics is ControlFlowBranchSemantics.Rethrow or ControlFlowBranchSemantics.Throw))
145145
{
146-
BuildBranchesNestedCatchRethrow(block);
146+
BuildBranchesRethrow(block);
147147
}
148148

149149
void AddPredecessorsOutsideRegion(BasicBlock destination)
@@ -168,13 +168,18 @@ private void BuildBranchesFinally(BasicBlock source, ControlFlowRegion finallyRe
168168
}
169169
}
170170

171-
private void BuildBranchesNestedCatchRethrow(BasicBlock block)
171+
private void BuildBranchesRethrow(BasicBlock block)
172172
{
173-
var reachableHandlers = block.EnclosingRegion(ControlFlowRegionKind.TryAndCatch).NestedRegion(ControlFlowRegionKind.Try).ReachableHandlers();
174-
foreach (var catchBlock in reachableHandlers.Where(x => x.Kind == ControlFlowRegionKind.Catch && x.FirstBlockOrdinal > block.Ordinal).SelectMany(x => x.Blocks(Cfg)))
173+
var reachableHandlerRegions = block.EnclosingRegion(ControlFlowRegionKind.TryAndCatch).NestedRegion(ControlFlowRegionKind.Try).ReachableHandlers();
174+
var reachableCatchAndFinallyBlocks = reachableHandlerRegions.Where(x => x.FirstBlockOrdinal > block.Ordinal).SelectMany(x => x.Blocks(Cfg));
175+
foreach (var catchBlock in reachableCatchAndFinallyBlocks.Where(x => x.EnclosingRegion.Kind is ControlFlowRegionKind.Catch))
175176
{
176177
AddBranch(block, catchBlock);
177178
}
179+
if (reachableCatchAndFinallyBlocks.FirstOrDefault() is { EnclosingRegion.Kind: ControlFlowRegionKind.Finally } finallyBlock)
180+
{
181+
AddBranch(block, finallyBlock);
182+
}
178183
}
179184

180185
private void AddBranch(BasicBlock source, BasicBlock destination)

analyzers/tests/SonarAnalyzer.Test/CFG/Roslyn/RoslynLvaSerializerTest.cs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,14 @@ void Use(int v) {}
8585
cfg0_block0 [shape=record label="{ENTRY #0}"]
8686
cfg0_block5 [shape=record label="{EXIT #5}"]
8787
cfg0_block1 -> cfg0_block2
88-
cfg0_block2 -> cfg0_block3 [label="LVA"]
89-
cfg0_block1 -> cfg0_block3 [label="LVA"]
90-
cfg0_block2 -> cfg0_block4 [label="LVA"]
91-
cfg0_block3 -> cfg0_block4 [label="LVA"]
88+
cfg0_block2 -> cfg0_block3 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
89+
cfg0_block1 -> cfg0_block3 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
90+
cfg0_block2 -> cfg0_block4 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
91+
cfg0_block3 -> cfg0_block4 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
9292
cfg0_block4 -> NoDestination_cfg0_block4 [label="StructuredExceptionHandling"]
9393
cfg0_block0 -> cfg0_block1
94-
cfg0_block4 -> cfg0_block5 [label="LVA"]
95-
cfg0_block4 -> cfg0_block5 [label="LVA"]
94+
cfg0_block4 -> cfg0_block5 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
95+
cfg0_block4 -> cfg0_block5 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
9696
cfg0_block2 -> cfg0_block5
9797
cfg0_block3 -> cfg0_block5
9898
}
@@ -160,13 +160,14 @@ void Use(int v) {}
160160
cfg0_block0 [shape=record label="{ENTRY #0}"]
161161
cfg0_block5 [shape=record label="{EXIT #5}"]
162162
cfg0_block1 -> cfg0_block2
163-
cfg0_block2 -> cfg0_block3 [label="LVA"]
164-
cfg0_block1 -> cfg0_block3 [label="LVA"]
163+
cfg0_block2 -> cfg0_block3 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
164+
cfg0_block1 -> cfg0_block3 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
165165
cfg0_block3 -> NoDestination_cfg0_block3 [label="Rethrow"]
166-
cfg0_block2 -> cfg0_block4 [label="LVA"]
166+
cfg0_block2 -> cfg0_block4 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
167+
cfg0_block3 -> cfg0_block4 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
167168
cfg0_block4 -> NoDestination_cfg0_block4 [label="StructuredExceptionHandling"]
168169
cfg0_block0 -> cfg0_block1
169-
cfg0_block4 -> cfg0_block5 [label="LVA"]
170+
cfg0_block4 -> cfg0_block5 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
170171
cfg0_block2 -> cfg0_block5
171172
}
172173
@@ -265,17 +266,17 @@ void Use(int v) {}
265266
cfg0_block3 -> cfg0_block4 [label="Else"]
266267
cfg0_block2 -> cfg0_block3
267268
cfg0_block4 -> cfg0_block3
268-
cfg0_block3 -> cfg0_block5 [label="LVA"]
269-
cfg0_block3 -> cfg0_block5 [label="LVA"]
270-
cfg0_block2 -> cfg0_block5 [label="LVA"]
271-
cfg0_block4 -> cfg0_block5 [label="LVA"]
269+
cfg0_block3 -> cfg0_block5 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
270+
cfg0_block3 -> cfg0_block5 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
271+
cfg0_block2 -> cfg0_block5 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
272+
cfg0_block4 -> cfg0_block5 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
272273
cfg0_block5 -> cfg0_block6 [label="Else"]
273274
cfg0_block5 -> cfg0_block7 [label="WhenTrue"]
274275
cfg0_block6 -> cfg0_block7
275276
cfg0_block7 -> NoDestination_cfg0_block7 [label="StructuredExceptionHandling"]
276277
cfg0_block1 -> cfg0_block2
277278
cfg0_block0 -> cfg0_block1
278-
cfg0_block7 -> cfg0_block8 [label="LVA"]
279+
cfg0_block7 -> cfg0_block8 [label="LVA" fontcolor="blue" penwidth="2" color="blue"]
279280
cfg0_block3 -> cfg0_block8 [label="WhenFalse"]
280281
}
281282

0 commit comments

Comments
 (0)