| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -111,6 +111,7 @@ class AssignableRead extends AssignableAccess { | |||
| 111 | 111 | * - The reads of `i` on lines 7 and 8 are next to the read on line 6. | |
| 112 | 112 | * - The read of `this.Field` on line 11 is next to the read on line 10. | |
| 113 | 113 | */ | |
| 114 | + pragma[nomagic] | ||
| 114 | 115 | AssignableRead getANextRead() { | |
| 115 | 116 | forex(ControlFlow::Node cfn | cfn = result.getAControlFlowNode() | | |
| 116 | 117 | cfn = this.getAnAdjacentReadSameVar() | |
@@ -124,7 +125,7 @@ class AssignableRead extends AssignableAccess { | |||
| 124 | 125 | * | |
| 125 | 126 | * This is the transitive closure of `getANextRead()`. | |
| 126 | 127 | */ | |
| 127 | - AssignableRead getAReachableRead() { result = this.getANextRead+() } | ||
| 128 | + deprecated AssignableRead getAReachableRead() { result = this.getANextRead+() } | ||
| 128 | 129 | } | |
| 129 | 130 | ||
| 130 | 131 | /** | |
@@ -479,6 +480,7 @@ class AssignableDefinition extends TAssignableDefinition { | |||
| 479 | 480 | * Subsequent reads can be found by following the steps defined by | |
| 480 | 481 | * `AssignableRead.getANextRead()`. | |
| 481 | 482 | */ | |
| 483 | + pragma[nomagic] | ||
| 482 | 484 | AssignableRead getAFirstRead() { | |
| 483 | 485 | forex(ControlFlow::Node cfn | cfn = result.getAControlFlowNode() | | |
| 484 | 486 | exists(Ssa::ExplicitDefinition def | result = def.getAFirstReadAtNode(cfn) | | |
@@ -494,7 +496,7 @@ class AssignableDefinition extends TAssignableDefinition { | |||
| 494 | 496 | * | |
| 495 | 497 | * This is the equivalent with `getAFirstRead().getANextRead*()`. | |
| 496 | 498 | */ | |
| 497 | - AssignableRead getAReachableRead() { result = this.getAFirstRead().getANextRead*() } | ||
| 499 | + deprecated AssignableRead getAReachableRead() { result = this.getAFirstRead().getANextRead*() } | ||
| 498 | 500 | ||
| 499 | 501 | /** Gets a textual representation of this assignable definition. */ | |
| 500 | 502 | string toString() { none() } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -174,7 +174,9 @@ class VariableAccess extends AssignableAccess, @variable_access_expr { | |||
| 174 | 174 | class VariableRead extends VariableAccess, AssignableRead { | |
| 175 | 175 | override VariableRead getANextRead() { result = AssignableRead.super.getANextRead() } | |
| 176 | 176 | ||
| 177 | - override VariableRead getAReachableRead() { result = AssignableRead.super.getAReachableRead() } | ||
| 177 | + deprecated override VariableRead getAReachableRead() { | ||
| 178 | + result = AssignableRead.super.getAReachableRead() | ||
| 179 | + } | ||
| 178 | 180 | } | |
| 179 | 181 | ||
| 180 | 182 | /** | |
@@ -200,7 +202,7 @@ class LocalScopeVariableAccess extends VariableAccess, @local_scope_variable_acc | |||
| 200 | 202 | class LocalScopeVariableRead extends LocalScopeVariableAccess, VariableRead { | |
| 201 | 203 | override LocalScopeVariableRead getANextRead() { result = VariableRead.super.getANextRead() } | |
| 202 | 204 | ||
| 203 | - override LocalScopeVariableRead getAReachableRead() { | ||
| 205 | + deprecated override LocalScopeVariableRead getAReachableRead() { | ||
| 204 | 206 | result = VariableRead.super.getAReachableRead() | |
| 205 | 207 | } | |
| 206 | 208 | } | |
@@ -242,7 +244,7 @@ class ParameterAccess extends LocalScopeVariableAccess, @parameter_access_expr { | |||
| 242 | 244 | class ParameterRead extends ParameterAccess, LocalScopeVariableRead { | |
| 243 | 245 | override ParameterRead getANextRead() { result = LocalScopeVariableRead.super.getANextRead() } | |
| 244 | 246 | ||
| 245 | - override ParameterRead getAReachableRead() { | ||
| 247 | + deprecated override ParameterRead getAReachableRead() { | ||
| 246 | 248 | result = LocalScopeVariableRead.super.getAReachableRead() | |
| 247 | 249 | } | |
| 248 | 250 | } | |
@@ -297,7 +299,7 @@ class LocalVariableAccess extends LocalScopeVariableAccess, @local_variable_acce | |||
| 297 | 299 | class LocalVariableRead extends LocalVariableAccess, LocalScopeVariableRead { | |
| 298 | 300 | override LocalVariableRead getANextRead() { result = LocalScopeVariableRead.super.getANextRead() } | |
| 299 | 301 | ||
| 300 | - override LocalVariableRead getAReachableRead() { | ||
| 302 | + deprecated override LocalVariableRead getAReachableRead() { | ||
| 301 | 303 | result = LocalScopeVariableRead.super.getAReachableRead() | |
| 302 | 304 | } | |
| 303 | 305 | } | |
@@ -442,7 +444,9 @@ class PropertyAccess extends AssignableMemberAccess, PropertyAccessExpr { | |||
| 442 | 444 | class PropertyRead extends PropertyAccess, AssignableRead { | |
| 443 | 445 | override PropertyRead getANextRead() { result = AssignableRead.super.getANextRead() } | |
| 444 | 446 | ||
| 445 | - override PropertyRead getAReachableRead() { result = AssignableRead.super.getAReachableRead() } | ||
| 447 | + deprecated override PropertyRead getAReachableRead() { | ||
| 448 | + result = AssignableRead.super.getAReachableRead() | ||
| 449 | + } | ||
| 446 | 450 | } | |
| 447 | 451 | ||
| 448 | 452 | /** | |
@@ -581,7 +585,9 @@ class IndexerAccess extends AssignableMemberAccess, ElementAccess, IndexerAccess | |||
| 581 | 585 | class IndexerRead extends IndexerAccess, ElementRead { | |
| 582 | 586 | override IndexerRead getANextRead() { result = ElementRead.super.getANextRead() } | |
| 583 | 587 | ||
| 584 | - override IndexerRead getAReachableRead() { result = ElementRead.super.getAReachableRead() } | ||
| 588 | + deprecated override IndexerRead getAReachableRead() { | ||
| 589 | + result = ElementRead.super.getAReachableRead() | ||
| 590 | + } | ||
| 585 | 591 | } | |
| 586 | 592 | ||
| 587 | 593 | /** | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -71,6 +71,20 @@ class FormatMethod extends Method { | |||
| 71 | 71 | } | |
| 72 | 72 | } | |
| 73 | 73 | ||
| 74 | + pragma[nomagic] | ||
| 75 | + private predicate parameterReadPostDominatesEntry(ParameterRead pr) { | ||
| 76 | + pr.getAControlFlowNode().postDominates(pr.getEnclosingCallable().getEntryPoint()) and | ||
| 77 | + getParameterType(pr.getTarget()) instanceof ObjectType | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + pragma[nomagic] | ||
| 81 | + private predicate alwaysPassedToFormatItemParameter(ParameterRead pr) { | ||
| 82 | + pr = any(StringFormatItemParameter other).getAnAssignedArgument() and | ||
| 83 | + parameterReadPostDominatesEntry(pr) | ||
| 84 | + or | ||
| 85 | + alwaysPassedToFormatItemParameter(pr.getANextRead()) | ||
| 86 | + } | ||
| 87 | + | ||
| 74 | 88 | /** | |
| 75 | 89 | * A parameter that is used as a format item for `string.Format()`. Either a | |
| 76 | 90 | * format item parameter of `string.Format()`, or a parameter of a method that | |
@@ -85,15 +99,9 @@ class StringFormatItemParameter extends Parameter { | |||
| 85 | 99 | ) | |
| 86 | 100 | or | |
| 87 | 101 | // Parameter of a source method that forwards to `string.Format()` | |
| 88 | - exists( | ||
| 89 | - AssignableDefinitions::ImplicitParameterDefinition def, ParameterRead pr, | ||
| 90 | - StringFormatItemParameter other | ||
| 91 | - | | ||
| 102 | + exists(AssignableDefinitions::ImplicitParameterDefinition def | | ||
| 92 | 103 | def.getParameter() = this and | |
| 93 | - pr = def.getAReachableRead() and | ||
| 94 | - pr.getAControlFlowNode().postDominates(this.getCallable().getEntryPoint()) and | ||
| 95 | - other.getAnAssignedArgument() = pr and | ||
| 96 | - getParameterType(this) instanceof ObjectType | ||
| 104 | + alwaysPassedToFormatItemParameter(def.getAFirstRead()) | ||
| 97 | 105 | ) | |
| 98 | 106 | } | |
| 99 | 107 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -22,12 +22,22 @@ private class DisposeCall extends MethodCall { | |||
| 22 | 22 | DisposeCall() { this.getTarget() instanceof DisposeMethod } | |
| 23 | 23 | } | |
| 24 | 24 | ||
| 25 | - private predicate localFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { | ||
| 26 | - DataFlow::localFlowStep(nodeFrom, nodeTo) and | ||
| 27 | - not exists(AssignableDefinition def, UsingStmt us | | ||
| 28 | - nodeTo.asExpr() = def.getAReachableRead() and | ||
| 25 | + pragma[nomagic] | ||
| 26 | + private predicate isDisposedAccess(AssignableRead ar) { | ||
| 27 | + exists(AssignableDefinition def, UsingStmt us | | ||
| 28 | + ar = def.getAFirstRead() and | ||
| 29 | 29 | def.getTargetAccess() = us.getAVariableDeclExpr().getAccess() | |
| 30 | 30 | ) | |
| 31 | + or | ||
| 32 | + exists(AssignableRead mid | | ||
| 33 | + isDisposedAccess(mid) and | ||
| 34 | + ar = mid.getANextRead() | ||
| 35 | + ) | ||
| 36 | + } | ||
| 37 | + | ||
| 38 | + private predicate localFlowStep(DataFlow::Node nodeFrom, DataFlow::Node nodeTo) { | ||
| 39 | + DataFlow::localFlowStep(nodeFrom, nodeTo) and | ||
| 40 | + not isDisposedAccess(nodeTo.asExpr()) | ||
| 31 | 41 | } | |
| 32 | 42 | ||
| 33 | 43 | private predicate reachesDisposeCall(DisposeCall disposeCall, DataFlow::Node node) { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -6,6 +6,7 @@ import semmle.code.csharp.frameworks.System | |||
| 6 | 6 | * Holds if expression `e`, of type `t`, invokes `ToString()` either explicitly | |
| 7 | 7 | * or implicitly. | |
| 8 | 8 | */ | |
| 9 | + pragma[nomagic] | ||
| 9 | 10 | predicate invokesToString(Expr e, ValueOrRefType t) { | |
| 10 | 11 | // Explicit invocation | |
| 11 | 12 | exists(MethodCall mc | mc.getQualifier() = e | | |
@@ -20,20 +21,24 @@ predicate invokesToString(Expr e, ValueOrRefType t) { | |||
| 20 | 21 | // Implicit invocation via forwarder method | |
| 21 | 22 | t = e.stripCasts().getType() and | |
| 22 | 23 | not t instanceof StringType and | |
| 23 | - exists(Parameter p | | ||
| 24 | - alwaysInvokesToStringOnParameter(p) and | ||
| 24 | + exists(AssignableDefinitions::ImplicitParameterDefinition def, Parameter p | | ||
| 25 | + def.getParameter() = p and | ||
| 26 | + alwaysInvokesToString(def.getAFirstRead()) and | ||
| 25 | 27 | e = p.getAnAssignedArgument() | |
| 26 | 28 | ) | |
| 27 | 29 | } | |
| 28 | 30 | ||
| 29 | - pragma[noinline] | ||
| 30 | - private predicate alwaysInvokesToStringOnParameter(Parameter p) { | ||
| 31 | - exists(AssignableDefinitions::ImplicitParameterDefinition def, ParameterRead pr | | ||
| 32 | - def.getParameter() = p and | ||
| 33 | - pr = def.getAReachableRead() and | ||
| 34 | - pr.getAControlFlowNode().postDominates(p.getCallable().getEntryPoint()) and | ||
| 35 | - invokesToString(pr, _) | ||
| 36 | - ) | ||
| 31 | + pragma[nomagic] | ||
| 32 | + private predicate parameterReadPostDominatesEntry(ParameterRead pr) { | ||
| 33 | + pr.getAControlFlowNode().postDominates(pr.getEnclosingCallable().getEntryPoint()) | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | + pragma[nomagic] | ||
| 37 | + private predicate alwaysInvokesToString(ParameterRead pr) { | ||
| 38 | + parameterReadPostDominatesEntry(pr) and | ||
| 39 | + invokesToString(pr, _) | ||
| 40 | + or | ||
| 41 | + alwaysInvokesToString(pr.getANextRead()) | ||
| 37 | 42 | } | |
| 38 | 43 | ||
| 39 | 44 | /** | |
| Back | FazBrowse Home | New Git URL |
0 commit comments