Java: add test for modulus analysis

This commit is contained in:
Tamas Vajk
2020-09-28 10:00:49 +02:00
parent 77abff7c90
commit 5688210249
3 changed files with 168 additions and 0 deletions

View File

@@ -0,0 +1,106 @@
| ModulusAnalysis.java:3:5:3:22 | ...=... | 0 | 42 | 0 |
| ModulusAnalysis.java:3:5:3:22 | c1 | 0 | 42 | 0 |
| ModulusAnalysis.java:3:20:3:21 | 42 | 0 | 42 | 0 |
| ModulusAnalysis.java:4:5:4:22 | ...=... | 0 | 43 | 0 |
| ModulusAnalysis.java:4:5:4:22 | c2 | 0 | 43 | 0 |
| ModulusAnalysis.java:4:20:4:21 | 43 | 0 | 43 | 0 |
| ModulusAnalysis.java:7:18:7:18 | i | SSA init(i) | 0 | 0 |
| ModulusAnalysis.java:7:18:7:22 | ... + ... | SSA init(i) | 3 | 0 |
| ModulusAnalysis.java:7:22:7:22 | 3 | 0 | 3 | 0 |
| ModulusAnalysis.java:9:19:9:20 | eq | SSA def(eq) | 0 | 0 |
| ModulusAnalysis.java:9:19:9:20 | eq | SSA init(i) | 3 | 0 |
| ModulusAnalysis.java:9:19:9:25 | ... * ... | 0 | 0 | 42 |
| ModulusAnalysis.java:9:19:9:29 | ... + ... | 0 | 3 | 42 |
| ModulusAnalysis.java:9:24:9:25 | c1 | 0 | 42 | 0 |
| ModulusAnalysis.java:9:24:9:25 | c1 | SSA init(this.c1) | 0 | 0 |
| ModulusAnalysis.java:9:29:9:29 | 3 | 0 | 3 | 0 |
| ModulusAnalysis.java:11:21:11:21 | 7 | 0 | 7 | 0 |
| ModulusAnalysis.java:12:13:12:15 | mul | 0 | 3 | 42 |
| ModulusAnalysis.java:12:13:12:15 | mul | SSA def(mul) | 0 | 0 |
| ModulusAnalysis.java:12:19:12:20 | c2 | 0 | 43 | 0 |
| ModulusAnalysis.java:12:19:12:20 | c2 | SSA impl upd[untracked](this.c2) | 0 | 0 |
| ModulusAnalysis.java:12:25:12:29 | seven | 0 | 7 | 0 |
| ModulusAnalysis.java:12:25:12:29 | seven | SSA def(seven) | 0 | 0 |
| ModulusAnalysis.java:13:32:13:34 | mul | 0 | 3 | 42 |
| ModulusAnalysis.java:13:32:13:34 | mul | SSA def(mul) | 0 | 0 |
| ModulusAnalysis.java:16:17:18:23 | ...?...:... | 0 | 3 | 4 |
| ModulusAnalysis.java:17:15:17:15 | i | SSA init(i) | 0 | 0 |
| ModulusAnalysis.java:17:15:17:19 | ... * ... | 0 | 0 | 4 |
| ModulusAnalysis.java:17:15:17:23 | ... + ... | 0 | 3 | 4 |
| ModulusAnalysis.java:17:19:17:19 | 4 | 0 | 4 | 0 |
| ModulusAnalysis.java:17:23:17:23 | 3 | 0 | 3 | 0 |
| ModulusAnalysis.java:18:15:18:15 | i | SSA init(i) | 0 | 0 |
| ModulusAnalysis.java:18:15:18:19 | ... * ... | 0 | 0 | 8 |
| ModulusAnalysis.java:18:15:18:23 | ... + ... | 0 | 7 | 8 |
| ModulusAnalysis.java:18:19:18:19 | 8 | 0 | 8 | 0 |
| ModulusAnalysis.java:18:23:18:23 | 7 | 0 | 7 | 0 |
| ModulusAnalysis.java:19:28:19:28 | j | 0 | 3 | 4 |
| ModulusAnalysis.java:19:28:19:28 | j | SSA def(j) | 0 | 0 |
| ModulusAnalysis.java:21:13:21:13 | x | SSA init(x) | 0 | 0 |
| ModulusAnalysis.java:21:17:21:18 | c1 | 0 | 42 | 0 |
| ModulusAnalysis.java:21:17:21:18 | c1 | SSA init(this.c1) | 0 | 0 |
| ModulusAnalysis.java:21:23:21:23 | 3 | 0 | 3 | 0 |
| ModulusAnalysis.java:21:28:21:28 | y | SSA init(y) | 0 | 0 |
| ModulusAnalysis.java:21:32:21:33 | c1 | 0 | 42 | 0 |
| ModulusAnalysis.java:21:32:21:33 | c1 | SSA init(this.c1) | 0 | 0 |
| ModulusAnalysis.java:21:38:21:38 | 7 | 0 | 7 | 0 |
| ModulusAnalysis.java:22:32:22:32 | x | 0 | 3 | 42 |
| ModulusAnalysis.java:22:32:22:32 | x | SSA init(x) | 0 | 0 |
| ModulusAnalysis.java:22:32:22:36 | ... + ... | 0 | 10 | 42 |
| ModulusAnalysis.java:22:32:22:36 | ... + ... | SSA init(x) | 7 | 42 |
| ModulusAnalysis.java:22:32:22:36 | ... + ... | SSA init(y) | 3 | 42 |
| ModulusAnalysis.java:22:36:22:36 | y | 0 | 7 | 42 |
| ModulusAnalysis.java:22:36:22:36 | y | SSA init(y) | 0 | 0 |
| ModulusAnalysis.java:25:13:25:13 | x | SSA init(x) | 0 | 0 |
| ModulusAnalysis.java:25:17:25:18 | c1 | 0 | 42 | 0 |
| ModulusAnalysis.java:25:17:25:18 | c1 | SSA init(this.c1) | 0 | 0 |
| ModulusAnalysis.java:25:23:25:23 | 3 | 0 | 3 | 0 |
| ModulusAnalysis.java:25:28:25:28 | y | SSA init(y) | 0 | 0 |
| ModulusAnalysis.java:25:32:25:33 | c1 | 0 | 42 | 0 |
| ModulusAnalysis.java:25:32:25:33 | c1 | SSA init(this.c1) | 0 | 0 |
| ModulusAnalysis.java:25:38:25:38 | 7 | 0 | 7 | 0 |
| ModulusAnalysis.java:26:32:26:32 | x | 0 | 3 | 42 |
| ModulusAnalysis.java:26:32:26:32 | x | SSA init(x) | 0 | 0 |
| ModulusAnalysis.java:26:32:26:36 | ... - ... | 0 | 38 | 42 |
| ModulusAnalysis.java:26:32:26:36 | ... - ... | SSA init(x) | 35 | 42 |
| ModulusAnalysis.java:26:36:26:36 | y | 0 | 7 | 42 |
| ModulusAnalysis.java:26:36:26:36 | y | SSA init(y) | 0 | 0 |
| ModulusAnalysis.java:29:17:29:26 | arr.length | SSA impl upd[untracked](arr.length) | 0 | 0 |
| ModulusAnalysis.java:29:17:29:30 | ... * ... | 0 | 0 | 4 |
| ModulusAnalysis.java:29:17:29:35 | ... - ... | 0 | 1 | 4 |
| ModulusAnalysis.java:29:30:29:30 | 4 | 0 | 4 | 0 |
| ModulusAnalysis.java:29:34:29:35 | 11 | 0 | 11 | 0 |
| ModulusAnalysis.java:30:28:30:28 | l | 0 | 1 | 4 |
| ModulusAnalysis.java:30:28:30:28 | l | SSA def(l) | 0 | 0 |
| ModulusAnalysis.java:32:9:32:38 | ...=... | 0 | 1 | 4 |
| ModulusAnalysis.java:32:13:32:29 | getArray(...).length | getArray(...).length | 0 | 0 |
| ModulusAnalysis.java:32:13:32:33 | ... * ... | 0 | 0 | 4 |
| ModulusAnalysis.java:32:13:32:38 | ... - ... | 0 | 1 | 4 |
| ModulusAnalysis.java:32:33:32:33 | 4 | 0 | 4 | 0 |
| ModulusAnalysis.java:32:37:32:38 | 11 | 0 | 11 | 0 |
| ModulusAnalysis.java:33:28:33:28 | l | 0 | 1 | 4 |
| ModulusAnalysis.java:33:28:33:28 | l | SSA def(l) | 0 | 0 |
| ModulusAnalysis.java:36:13:36:25 | ...=... | 0 | 3 | 4 |
| ModulusAnalysis.java:36:17:36:17 | i | SSA init(i) | 0 | 0 |
| ModulusAnalysis.java:36:17:36:21 | ... * ... | 0 | 0 | 4 |
| ModulusAnalysis.java:36:17:36:25 | ... + ... | 0 | 3 | 4 |
| ModulusAnalysis.java:36:21:36:21 | 4 | 0 | 4 | 0 |
| ModulusAnalysis.java:36:25:36:25 | 3 | 0 | 3 | 0 |
| ModulusAnalysis.java:39:13:39:25 | ...=... | 0 | 7 | 8 |
| ModulusAnalysis.java:39:17:39:17 | i | SSA init(i) | 0 | 0 |
| ModulusAnalysis.java:39:17:39:21 | ... * ... | 0 | 0 | 8 |
| ModulusAnalysis.java:39:17:39:25 | ... + ... | 0 | 7 | 8 |
| ModulusAnalysis.java:39:21:39:21 | 8 | 0 | 8 | 0 |
| ModulusAnalysis.java:39:25:39:25 | 7 | 0 | 7 | 0 |
| ModulusAnalysis.java:41:28:41:28 | j | 0 | 3 | 4 |
| ModulusAnalysis.java:41:28:41:28 | j | SSA phi(j) | 0 | 0 |
| ModulusAnalysis.java:44:32:44:32 | j | 0 | 3 | 4 |
| ModulusAnalysis.java:44:32:44:32 | j | SSA phi(j) | 0 | 0 |
| ModulusAnalysis.java:46:32:46:32 | j | 0 | 3 | 4 |
| ModulusAnalysis.java:46:32:46:32 | j | SSA phi(j) | 0 | 0 |
| ModulusAnalysis.java:49:14:49:14 | x | SSA init(x) | 0 | 0 |
| ModulusAnalysis.java:49:18:49:19 | 15 | 0 | 15 | 0 |
| ModulusAnalysis.java:49:25:49:25 | 3 | 0 | 3 | 0 |
| ModulusAnalysis.java:50:32:50:32 | x | 0 | 3 | 16 |
| ModulusAnalysis.java:50:32:50:32 | x | SSA init(x) | 0 | 0 |
| ModulusAnalysis.java:54:38:54:39 | 42 | 0 | 42 | 0 |

View File

@@ -0,0 +1,55 @@
class ModulusAnalysis
{
final int c1 = 42;
final int c2 = 43;
void m(int i, boolean cond, int x, int y, int[] arr) {
int eq = i + 3;
int mul = eq * c1 + 3; // congruent 3 mod 42
int seven = 7;
if (mul % c2 == seven) {
System.out.println(mul); // congruent 3 mod 42
}
int j = cond
? i * 4 + 3
: i * 8 + 7;
System.out.println(j); // congruent 3 mod 4
if (x % c1 == 3 && y % c1 == 7) {
System.out.println(x + y); // congruent 10 mod 42
}
if (x % c1 == 3 && y % c1 == 7) {
System.out.println(x - y); // congruent 38 mod 42
}
int l = arr.length * 4 - 11;
System.out.println(l); // congruent 1 mod 4
l = getArray().length * 4 - 11;
System.out.println(l); // congruent 1 mod 4
if (cond) {
j = i * 4 + 3;
}
else {
j = i * 8 + 7;
}
System.out.println(j); // congruent 3 mod 4
if (cond) {
System.out.println(j); // congruent 3 mod 4
} else {
System.out.println(j); // congruent 3 mod 4
}
if ((x & 15) == 3) {
System.out.println(x); // congruent 3 mod 16
}
}
int[] getArray(){ return new int[42]; }
}

View File

@@ -0,0 +1,7 @@
import java
import semmle.code.java.dataflow.ModulusAnalysis
import semmle.code.java.dataflow.Bound
from Expr e, Bound b, int delta, int mod
where exprModulus(e, b, delta, mod)
select e, b.toString(), delta, mod