Skip to content

Commit bca1bc7

Browse files
committed
JS: Enhance isDomProperty to check for getAPropertyRead on DOM nodes
1 parent 9b2ef8b commit bca1bc7

File tree

3 files changed

+20
-12
lines changed

3 files changed

+20
-12
lines changed

javascript/ql/lib/Expressions/ExprHasNoEffect.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,20 @@ predicate noSideEffects(Expr e) {
129129
)
130130
}
131131

132+
/**
133+
* Holds if `e` is a compound expression that may contain sub-expressions with side effects.
134+
* We should not flag these directly as useless since we want to flag only the innermost
135+
* expressions that actually have no effect.
136+
*/
137+
predicate isCompoundExpression(Expr e) {
138+
e instanceof LogicalBinaryExpr
139+
or
140+
e instanceof SeqExpr
141+
or
142+
e instanceof ParExpr and
143+
not e.stripParens() instanceof FunctionExpr
144+
}
145+
132146
/**
133147
* Holds if the expression `e` should be reported as having no effect.
134148
*/
@@ -145,6 +159,7 @@ predicate hasNoEffect(Expr e) {
145159
not isDeclaration(e) and
146160
// exclude DOM properties, which sometimes have magical auto-update properties
147161
not isDomProperty(e.(PropAccess).getPropertyName()) and
162+
not isCompoundExpression(e) and
148163
// exclude xUnit.js annotations
149164
not e instanceof XUnitAnnotation and
150165
// exclude common patterns that are most likely intentional

javascript/ql/test/query-tests/Expressions/ExprHasNoEffect/ExprHasNoEffect.expected

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
| dom.js:2:5:2:30 | a.clien ... ientTop | This expression has no effect. |
2-
| dom.js:2:5:2:50 | a.clien ... === !0 | This expression has no effect. |
31
| dom.js:2:33:2:50 | a.clientTop === !0 | This expression has no effect. |
4-
| dom.js:3:5:3:20 | a && a.clientTop | This expression has no effect. |
5-
| dom.js:4:5:4:28 | a.clien ... ientTop | This expression has no effect. |
6-
| dom.js:5:18:5:43 | a.clien ... ientTop | This expression has no effect. |
7-
| dom.js:6:18:6:63 | b && (b ... entTop) | This expression has no effect. |
8-
| dom.js:6:23:6:63 | (b.clie ... entTop) | This expression has no effect. |
92
| try.js:22:9:22:26 | x.ordinaryProperty | This expression has no effect. |
103
| tst2.js:2:4:2:4 | 0 | This expression has no effect. |
114
| tst.js:3:1:3:2 | 23 | This expression has no effect. |
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
function f(){
2-
a.clientTop && a.clientTop, a.clientTop === !0; // $Alert
3-
a && a.clientTop; // $SPURIOUS:Alert
4-
a.clientTop, a.clientTop; // $SPURIOUS:Alert
5-
if(a) return a.clientTop && a.clientTop, a.clientTop === !0 // $SPURIOUS:Alert
6-
if(b) return b && (b.clientTop, b.clientTop && b.clientTop), null // $SPURIOUS:Alert
2+
a.clientTop && a.clientTop, a.clientTop === !0; //$Alert
3+
a && a.clientTop;
4+
a.clientTop, a.clientTop;
5+
if(a) return a.clientTop && a.clientTop, a.clientTop === !0;
6+
if(b) return b && (b.clientTop, b.clientTop && b.clientTop), null;
77
}

0 commit comments

Comments
 (0)