Skip to content

Commit 5ad8336

Browse files
author
Esben Sparre Andreasen
committed
JS: move default parameter values to the DefUse graph
1 parent 65530c5 commit 5ad8336

File tree

6 files changed

+12
-6
lines changed

6 files changed

+12
-6
lines changed

javascript/ql/src/semmle/javascript/DefUse.qll

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import javascript
1212
* <tr><td><code>x = y</code><td><code>x = y</code><td><code>x</code><td><code>y</code></tr>
1313
* <tr><td><code>var a = b</code><td><code>var a = b</code><td><code>a</code><td><code>b</code></tr>
1414
* <tr><td><code>function f { ... }</code><td><code>f</code><td><code>f</code><td><code>function f { ... }</code></tr>
15+
* <tr><td><code>function f ( x = y ){ ... }</code><td><code>x</code><td><code>x</code><td><code>y</code></tr>
1516
* <tr><td><code>class C { ... }</code><td><code>C</code><td><code>C</code><td><code>class C { ... }</code></tr>
1617
* <tr><td><code>namespace N { ... }</code><td><code>N</code><td><code>N</code><td><code>namespace N { ... }</code></tr>
1718
* <tr><td><code>enum E { ... }</code><td><code>E</code><td><code>E</code><td><code>enum E { ... }</code></tr>
@@ -42,6 +43,8 @@ private predicate defn(ControlFlowNode def, Expr lhs, AST::ValueNode rhs) {
4243
exists(EnumMember member | def = member.getIdentifier() |
4344
lhs = def and rhs = member.getInitializer()
4445
)
46+
or
47+
lhs = def and def.(Parameter).getDefault() = rhs
4548
}
4649

4750
/**

javascript/ql/src/semmle/javascript/RangeAnalysis.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,12 @@ module RangeAnalysis {
104104
pragma[noinline]
105105
private predicate hasUniquePredecessor(DataFlow::Node node) {
106106
isRelevant(node) and
107-
strictcount(node.getAPredecessor()) = 1
107+
strictcount(node.getAPredecessor()) = 1 and
108+
// exclude parameters with default values
109+
not exists (Parameter p |
110+
DataFlow::parameterNode(p) = node and
111+
exists(p.getDefault())
112+
)
108113
}
109114

110115
/**

javascript/ql/src/semmle/javascript/dataflow/internal/VariableTypeInference.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ private class AnalyzedParameter extends AnalyzedVarDef, @vardecl {
143143

144144
override DataFlow::AnalyzedNode getRhs() {
145145
getFunction().argumentPassing(this, result.asExpr()) or
146-
result = this.(Parameter).getDefault().analyze()
146+
result = AnalyzedVarDef.super.getRhs()
147147
}
148148

149149
override AbstractValue getAnRhsValue() {

javascript/ql/test/library-tests/DefUse/VarDefSource.expected

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@
2929
| tst.js:11:11:11:11 | g | tst.js:11:2:15:1 | functio ... rn x;\\n} |
3030
| tst.js:12:2:12:7 | x = 42 | tst.js:12:6:12:7 | 42 |
3131
| tst.js:19:11:19:11 | x | tst.js:19:2:19:16 | function x() {} |
32-
| tst.js:23:6:23:23 | {a = b, c = d} = e | tst.js:23:23:23:23 | e |
32+
| tst.js:26:11:26:11 | a | tst.js:26:15:26:15 | b |
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
| constant.js:2:7:2:11 | 1 > 2 | The condition '1 > 2' is always false. |
22
| constant.js:3:7:3:11 | 1 > 0 | The condition '1 > 0' is always true. |
33
| example.js:8:7:8:13 | i < end | The condition 'i < end' is always false. |
4-
| tst.js:8:23:8:33 | i == 100000 | The condition 'i == 100000' is always false. |
4+
| tst.js:8:22:8:32 | i == 100000 | The condition 'i == 100000' is always false. |
55
| tst.js:9:23:9:33 | i == 100000 | The condition 'i == 100000' is always false. |

javascript/ql/test/query-tests/Statements/UselessConditional/UselessConditional.expected

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,3 @@
3333
| UselessConditionalGood.js:69:12:69:13 | xy | This use of variable 'xy' always evaluates to false. |
3434
| UselessConditionalGood.js:85:12:85:13 | xy | This use of variable 'xy' always evaluates to false. |
3535
| UselessConditionalGood.js:97:12:97:13 | xy | This use of variable 'xy' always evaluates to false. |
36-
| UselessConditionalGood.js:114:8:114:8 | p | This use of variable 'p' always evaluates to false. |
37-
| UselessConditionalGood.js:122:8:122:8 | p | This use of variable 'p' always evaluates to false. |

0 commit comments

Comments
 (0)