Skip to content

Commit 10ef945

Browse files
author
Max Schaefer
committed
JavaScript: Restrict InstanceFieldAsPropWrite to fields with initializers.
1 parent 184e65d commit 10ef945

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

javascript/ql/src/semmle/javascript/dataflow/DataFlow.qll

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -555,14 +555,15 @@ module DataFlow {
555555
}
556556

557557
/**
558-
* An instance field, seen as a property write.
558+
* An instance field with an initializer, seen as a property write.
559559
*/
560560
private class InstanceFieldAsPropWrite extends PropWrite, PropNode {
561561
override FieldDefinition prop;
562562

563563
InstanceFieldAsPropWrite() {
564564
not prop.isStatic() and
565-
not prop instanceof ParameterField
565+
not prop instanceof ParameterField and
566+
exists(prop.getInit())
566567
}
567568

568569
override Node getBase() {

javascript/ql/test/query-tests/Declarations/DeadStoreOfProperty/DeadStoreOfProperty.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
| fieldInit.ts:10:3:10:8 | f = 4; | This write to property 'f' is useless, since $@ always overrides it. | fieldInit.ts:13:5:13:14 | this.f = 5 | another property write |
12
| real-world-examples.js:5:4:5:11 | o.p = 42 | This write to property 'p' is useless, since $@ always overrides it. | real-world-examples.js:10:2:10:9 | o.p = 42 | another property write |
23
| real-world-examples.js:15:9:15:18 | o.p1 += 42 | This write to property 'p1' is useless, since $@ always overrides it. | real-world-examples.js:15:2:15:18 | o.p1 = o.p1 += 42 | another property write |
34
| real-world-examples.js:16:11:16:20 | o.p2 *= 42 | This write to property 'p2' is useless, since $@ always overrides it. | real-world-examples.js:16:2:16:21 | o.p2 -= (o.p2 *= 42) | another property write |
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class C {
2+
f; // OK
3+
4+
constructor() {
5+
this.f = 5;
6+
}
7+
}
8+
9+
class D {
10+
f = 4; // NOT OK
11+
12+
constructor() {
13+
this.f = 5;
14+
}
15+
}

0 commit comments

Comments
 (0)