Skip to content

Commit 9f22173

Browse files
committed
wip
1 parent e1afff1 commit 9f22173

2 files changed

Lines changed: 34 additions & 32 deletions

File tree

csharp/ql/lib/semmle/code/csharp/Assignable.qll

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ private class RefArg extends AssignableAccess {
204204
AssignableDefinition getAnAnalyzableRefDef(Parameter p) {
205205
this.isAnalyzable(p) and
206206
result.getTarget() = p and
207-
not result = TImplicitParameterDefinition(_, _)
207+
not result = TImplicitParameterDefinition(_)
208208
}
209209

210210
/**
@@ -272,10 +272,7 @@ module AssignableInternal {
272272
or
273273
def = TAssignOperationDefinition(result)
274274
or
275-
exists(Parameter p |
276-
def = TImplicitParameterDefinition(p, true) and
277-
result = p.getDefaultValue()
278-
)
275+
def = TParameterDefaultDefinition(_, result)
279276
}
280277

281278
/** A local variable declaration at the top-level of a pattern. */
@@ -309,20 +306,21 @@ module AssignableInternal {
309306
not lvde instanceof TopLevelPatternDecl and
310307
not lvde.isOutArgument()
311308
} or
312-
TImplicitParameterDefinition(Parameter p, boolean isDefault) {
309+
TImplicitParameterDefinition(Parameter p) {
313310
exists(Callable c | p = c.getAParameter() |
314311
c.hasBody()
315312
or
316-
// Same as `c.(Constructor).hasInitializer()`, but avoids negative recursion warning
317-
c.getAChildExpr() instanceof @constructor_init_expr
318-
) and
319-
(
320-
isDefault = false
321-
or
322-
p.hasDefaultValue() and
323-
isDefault = true
313+
c.(Constructor).hasInitializer()
324314
)
325315
} or
316+
TParameterDefaultDefinition(Parameter p, Expr default) {
317+
exists(Callable c | p = c.getAParameter() |
318+
c.hasBody()
319+
or
320+
c.(Constructor).hasInitializer()
321+
) and
322+
default = p.getDefaultValue()
323+
} or
326324
TAddressOfDefinition(AddressOfExpr aoe) or
327325
TPatternDefinition(TopLevelPatternDecl tlpd) or
328326
TAssignOperationDefinition(AssignOperation ao) {
@@ -361,7 +359,7 @@ module AssignableInternal {
361359
or
362360
def = any(AssignableDefinitions::InitializerDefinition init | result = init.getAssignable())
363361
or
364-
def = TImplicitParameterDefinition(result, _)
362+
def = TParameterDefaultDefinition(result, _)
365363
}
366364

367365
// Not defined by dispatch in order to avoid too conservative negative recursion error
@@ -681,7 +679,7 @@ module AssignableDefinitions {
681679
class ImplicitParameterDefinition extends AssignableDefinition, TImplicitParameterDefinition {
682680
Parameter p;
683681

684-
ImplicitParameterDefinition() { this = TImplicitParameterDefinition(p, false) }
682+
ImplicitParameterDefinition() { this = TImplicitParameterDefinition(p) }
685683

686684
/** Gets the underlying parameter. */
687685
Parameter getParameter() { result = p }
@@ -702,26 +700,27 @@ module AssignableDefinitions {
702700
/**
703701
* A default value assigned to a parameter.
704702
*/
705-
class ParameterDefaultDefinition extends AssignableDefinition, TImplicitParameterDefinition {
703+
class ParameterDefaultDefinition extends AssignableDefinition, TParameterDefaultDefinition {
706704
Parameter p;
705+
Expr default;
707706

708-
ParameterDefaultDefinition() { this = TImplicitParameterDefinition(p, true) }
707+
ParameterDefaultDefinition() { this = TParameterDefaultDefinition(p, default) }
709708

710709
/** Gets the underlying parameter. */
711710
Parameter getParameter() { result = p }
712711

713712
/** Gets the default value expression for the parameter. */
714-
Expr getDefaultValue() { result = p.getDefaultValue() }
713+
Expr getDefaultValue() { result = default }
715714

716-
override Expr getSource() { result = p.getDefaultValue() }
715+
override Expr getSource() { result = default }
717716

718-
override Expr getElement() { result = p.getDefaultValue() }
717+
override Expr getElement() { result = default }
719718

720719
override Callable getEnclosingCallable() { result = p.getCallable() }
721720

722721
override string toString() { result = p.toString() + " = ..." }
723722

724-
override Location getLocation() { result = p.getDefaultValue().getLocation() }
723+
override Location getLocation() { result = default.getLocation() }
725724
}
726725

727726
/**

csharp/ql/lib/semmle/code/csharp/controlflow/ControlFlowGraph.qll

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,19 @@ private module Ast implements AstSig<Location> {
7373
private AstNode getParent(AstNode n) { n = getChild(result, _) }
7474

7575
Callable getEnclosingCallable(AstNode node) {
76-
result = node.(ControlFlowElement).getEnclosingCallable()
77-
or
78-
result.(ObjectInitMethod).initializes(getParent*(node))
79-
or
80-
Initializers::staticMemberInitializer(result, getParent*(node))
81-
or
82-
result = node.(Parameter).getCallable()
83-
or
84-
not skipControlFlow(node) and
85-
getParent*(node) = any(Parameter p | result = p.getCallable()).getDefaultValue()
76+
result.isUnboundDeclaration() and
77+
(
78+
result = node.(ControlFlowElement).getEnclosingCallable()
79+
or
80+
result.(ObjectInitMethod).initializes(getParent*(node))
81+
or
82+
Initializers::staticMemberInitializer(result, getParent*(node))
83+
or
84+
result = node.(Parameter).getCallable()
85+
or
86+
not skipControlFlow(node) and
87+
getParent*(node) = any(Parameter p | result = p.getCallable()).getDefaultValue()
88+
)
8689
}
8790

8891
class Callable = CS::Callable;

0 commit comments

Comments
 (0)