[java] DEADLOCK: False Negative in Infer analysis results after converting anonymous classes to lambda expressions
- Dominant language
- OCaml
- Stars
- 15.7k
- Forks
- 2.1k
- Avg merge
- 19h 36m
- Merged PRs (30d)
- 13
Description
## Environment
**Infer Version:** v1.1.0-f93cb281ed
**Operating System:** Ubuntu 20.04.5 LTS
### Description:
We converted anonymous classes to lambda expressions in the file `infer/infer/tests/codetoanalyze/java/starvation-whole-program/MainMethod.java`. After making this change, we ran the following command: `sudo make direct_java_starvation-whole-program_test`. However, we noticed inconsistencies between the results in `issues.exp.test` and the expected results in `issues.exp`.
We expect Infer to detect certain converted codes to get results in `issues.exp.test` file similar to the ones mentioned in `issues.exp`. However, the result of `MainMethod.java` is different. The `DEADLOCK ` issue does not appear in `issues.exp.test`. So we consider it as a false negative.
### Steps to Reproduce:
1. Convert anonymous classes to lambda expressions in `MainMethod.java`.
2. Run the command: `sudo make direct_java_starvation-whole-program_test`.
3. Compare the analysis results in `issues.exp.test` with the expected results in `issues.exp`.
### Code Samples:
Original code in `MainMethod.java`:
```java
class MainMethod {
static Object monitorA, monitorB;
public static void main(String args[]) {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
synchronized (monitorA) {
synchronized (monitorB) {
}
}
}
});
t.start();
synchronized (monitorB) {
synchronized (monitorA) {
}
}
}
}
```
Converted code in MainMethod.java:
```java
class MainMethod {
static Object monitorA, monitorB;
public static void main(String[] args) {
Thread t = new Thread(() -> {
synchronized (monitorA) {
synchronized (monitorB) {
}
}
});
t.start();
synchronized (monitorB) {
synchronized (monitorA) {
}
}
}
}
```
Content in `issue.exp`:
```
codetoanalyze/java/starvation-whole-program/MainMethod.java, MainMethod.main(java.lang.String[]):void, 24, DEADLOCK, no_bucket, ERROR, [[Trace 1] `void MainMethod.main(String[])`,Method call: `void MainMethod$1.run()`, locks `MainMethod.monitorA` in `class MainMethod`, locks `MainMethod.monitorB` in `class MainMethod`,[Trace 2] `void MainMethod.main(String[])`, locks `MainMethod.monitorB` in `class MainMethod`, locks `MainMethod.monitorA` in `class MainMethod`]
codetoanalyze/java/starvation-whole-program/MainMethod.java, MainMethod.main(java.lang.String[]):void, 26, DEADLOCK, no_bucket, ERROR, [[Trace 1] `void MainMethod.main(String[])`, locks `MainMethod.monitorB` in `class MainMethod`, locks `MainMethod.monitorA` in `class MainMethod`,[Trace 2] `void MainMethod.main(String[])`,Method call: `void MainMethod$1.run()`, locks `MainMethod.monitorA` in `class MainMethod`, locks `MainMethod.monitorB` in `class MainMethod`]
```
Contributor guide
Assessment
This issue has not been assessed yet.