Skip to content

Commit 2689c13

Browse files
authored
Merge pull request github#6485 from Marcono1234/marcono1234/field-initializer-fix
Java: Fix Field.getInitializer() matching non-initializer assignments
2 parents 8f38ab0 + 5a2dfda commit 2689c13

File tree

8 files changed

+63
-4
lines changed

8 files changed

+63
-4
lines changed

java/ql/lib/semmle/code/java/Member.qll

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -600,12 +600,13 @@ class Field extends Member, ExprParent, @field, Variable {
600600

601601
/** Gets the initializer expression of this field, if any. */
602602
override Expr getInitializer() {
603-
exists(AssignExpr e, InitializerMethod im |
603+
exists(AssignExpr e, InitializerMethod im, ExprStmt exprStmt |
604604
e.getDest() = this.getAnAccess() and
605605
e.getSource() = result and
606-
pragma[only_bind_out](result).getEnclosingCallable() = im and
607-
// This rules out updates in explicit initializer blocks as they are nested inside the compiler generated initializer blocks.
608-
pragma[only_bind_out](e.getEnclosingStmt().getParent()) = pragma[only_bind_out](im.getBody())
606+
exprStmt.getExpr() = e and
607+
// This check also rules out assignments in explicit initializer blocks
608+
// (CodeQL models explicit initializer blocks as BlockStmt in initializer methods)
609+
exprStmt.getParent() = im.getBody()
609610
)
610611
}
611612

java/ql/test/library-tests/fields/FieldDecl.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@
55
| fields/FieldTest.java:5:9:5:39 | Object obj, ...; | 1/2 | fields/FieldTest.java:5:35:5:38 | obj2 |
66
| fields/FieldTest.java:6:9:6:58 | List<> l, ...; | 0/2 | fields/FieldTest.java:6:54:6:54 | l |
77
| fields/FieldTest.java:6:9:6:58 | List<> l, ...; | 1/2 | fields/FieldTest.java:6:57:6:57 | m |
8+
| fields/FieldTest.java:7:9:7:18 | int x, ...; | 0/1 | fields/FieldTest.java:7:13:7:13 | x |
9+
| fields/FieldTest.java:8:9:8:22 | int y, ...; | 0/1 | fields/FieldTest.java:8:13:8:13 | y |
10+
| fields/FieldTest.java:12:9:12:25 | int z, ...; | 0/1 | fields/FieldTest.java:12:20:12:20 | z |
11+
| fields/FieldTest.java:13:9:13:29 | int w, ...; | 0/1 | fields/FieldTest.java:13:20:13:20 | w |
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
| List<> l, ...; | 6 | 9 | 6 | 58 |
22
| Object obj, ...; | 5 | 9 | 5 | 39 |
33
| float ff, ...; | 4 | 9 | 4 | 32 |
4+
| int w, ...; | 13 | 9 | 13 | 29 |
5+
| int x, ...; | 7 | 9 | 7 | 18 |
6+
| int y, ...; | 8 | 9 | 8 | 22 |
7+
| int z, ...; | 12 | 9 | 12 | 25 |
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
| fields/FieldTest.java:4:19:4:19 | g | fields/FieldTest.java:4:23:4:26 | 2.3f |
2+
| fields/FieldTest.java:5:23:5:25 | obj | fields/FieldTest.java:5:29:5:32 | null |
3+
| fields/FieldTest.java:7:13:7:13 | x | fields/FieldTest.java:7:17:7:17 | 0 |
4+
| fields/FieldTest.java:8:13:8:13 | y | fields/FieldTest.java:8:17:8:21 | ...=... |
5+
| fields/FieldTest.java:12:20:12:20 | z | fields/FieldTest.java:12:24:12:24 | 0 |
6+
| fields/FieldTest.java:13:20:13:20 | w | fields/FieldTest.java:13:24:13:28 | ...=... |
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import java
2+
3+
from Field f
4+
select f, f.getInitializer()

java/ql/test/library-tests/fields/FieldLocation.expected

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,7 @@
55
| fields/FieldTest.java:5:35:5:38 | obj2 | 5 | 35 | 5 | 38 |
66
| fields/FieldTest.java:6:54:6:54 | l | 6 | 54 | 6 | 54 |
77
| fields/FieldTest.java:6:57:6:57 | m | 6 | 57 | 6 | 57 |
8+
| fields/FieldTest.java:7:13:7:13 | x | 7 | 13 | 7 | 13 |
9+
| fields/FieldTest.java:8:13:8:13 | y | 8 | 13 | 8 | 13 |
10+
| fields/FieldTest.java:12:20:12:20 | z | 12 | 20 | 12 | 20 |
11+
| fields/FieldTest.java:13:20:13:20 | w | 13 | 20 | 13 | 20 |

java/ql/test/library-tests/fields/PrintAst.expected

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,29 @@ fields/FieldTest.java:
1212
# 6| 1: [Annotation] SuppressWarnings
1313
# 6| 1: [StringLiteral] "rawtypes"
1414
# 6| -1: [TypeAccess] List<>
15+
# 7| 7: [FieldDeclaration] int x, ...;
16+
# 7| -1: [TypeAccess] int
17+
# 7| 0: [IntegerLiteral] 0
18+
# 8| 8: [FieldDeclaration] int y, ...;
19+
# 8| -1: [TypeAccess] int
20+
# 8| 0: [AssignExpr] ...=...
21+
# 8| 0: [VarAccess] x
22+
# 8| 1: [IntegerLiteral] 1
23+
# 9| 9: [BlockStmt] { ... }
24+
# 10| 0: [ExprStmt] <Expr>;
25+
# 10| 0: [AssignExpr] ...=...
26+
# 10| 0: [VarAccess] x
27+
# 10| 1: [IntegerLiteral] 2
28+
# 12| 10: [FieldDeclaration] int z, ...;
29+
# 12| -1: [TypeAccess] int
30+
# 12| 0: [IntegerLiteral] 0
31+
# 13| 11: [FieldDeclaration] int w, ...;
32+
# 13| -1: [TypeAccess] int
33+
# 13| 0: [AssignExpr] ...=...
34+
# 13| 0: [VarAccess] z
35+
# 13| 1: [IntegerLiteral] 1
36+
# 14| 12: [BlockStmt] { ... }
37+
# 15| 0: [ExprStmt] <Expr>;
38+
# 15| 0: [AssignExpr] ...=...
39+
# 15| 0: [VarAccess] z
40+
# 15| 1: [IntegerLiteral] 2

java/ql/test/library-tests/fields/fields/FieldTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,14 @@ public class FieldTest {
44
float ff, g = 2.3f, hhh;
55
static Object obj = null, obj2;
66
@SuppressWarnings("rawtypes") java.util.List l, m;
7+
int x = 0;
8+
int y = x = 1;
9+
{
10+
x = 2; // Shouldn't show up as an initializer
11+
}
12+
static int z = 0;
13+
static int w = z = 1;
14+
static {
15+
z = 2; // Shouldn't show up as an initializer
16+
}
717
}

0 commit comments

Comments
 (0)