Reviewed By: jvillard Differential Revision: D13180369 fbshipit-source-id: 5684ed318master
parent
f4e9975783
commit
2c6a705116
@ -1,91 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018-present, Facebook, Inc.
|
|
||||||
*
|
|
||||||
* This source code is licensed under the MIT license found in the
|
|
||||||
* LICENSE file in the root directory of this source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package codetoanalyze.java.checkers;
|
|
||||||
|
|
||||||
import com.facebook.infer.annotation.ThreadSafe;
|
|
||||||
|
|
||||||
class Interprocedural {
|
|
||||||
|
|
||||||
static class A {
|
|
||||||
B f = new B();
|
|
||||||
int h = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static class B {
|
|
||||||
int g = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ThreadSafe
|
|
||||||
static class Field {
|
|
||||||
private A a = new A();
|
|
||||||
|
|
||||||
private void destabilize() {
|
|
||||||
B b = a.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void unstable_ok() {
|
|
||||||
int x = 42;
|
|
||||||
destabilize();
|
|
||||||
synchronized (this) {
|
|
||||||
a.f.g = 101;
|
|
||||||
}
|
|
||||||
x = a.f.g;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stable_bad() {
|
|
||||||
int x = 42;
|
|
||||||
synchronized (this) {
|
|
||||||
a.f.g = 101;
|
|
||||||
}
|
|
||||||
x = a.f.g;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ThreadSafe
|
|
||||||
static class Param {
|
|
||||||
|
|
||||||
private void destabilize(A z) {
|
|
||||||
B b1 = z.f;
|
|
||||||
System.out.println(b1);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void unstable_ok(A a) {
|
|
||||||
int x = 42;
|
|
||||||
destabilize(a);
|
|
||||||
synchronized (this) {
|
|
||||||
a.f.g = 101;
|
|
||||||
}
|
|
||||||
x = a.f.g;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stable_bad(A a) {
|
|
||||||
int x = 42;
|
|
||||||
synchronized (this) {
|
|
||||||
a.f.g = 101;
|
|
||||||
}
|
|
||||||
x = a.f.g;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ThreadSafe
|
|
||||||
static class Param2 {
|
|
||||||
|
|
||||||
private void destabilize(A z) {
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stable_bad(A a) {
|
|
||||||
int x = 42;
|
|
||||||
destabilize(a); // a leaks, but shouldn't be de-stabilized because callee does nothing
|
|
||||||
synchronized (this) {
|
|
||||||
a.f.g = 101;
|
|
||||||
}
|
|
||||||
x = a.f.g;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,86 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2018-present, Facebook, Inc.
|
|
||||||
*
|
|
||||||
* This source code is licensed under the MIT license found in the
|
|
||||||
* LICENSE file in the root directory of this source tree.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package codetoanalyze.java.checkers;
|
|
||||||
|
|
||||||
import com.facebook.infer.annotation.ThreadSafe;
|
|
||||||
|
|
||||||
class Intraprocedural {
|
|
||||||
|
|
||||||
static class B {
|
|
||||||
int g = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static class A {
|
|
||||||
B f = new B();
|
|
||||||
int h = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@ThreadSafe
|
|
||||||
static class Field {
|
|
||||||
private A a = new A();
|
|
||||||
|
|
||||||
public void unstable_ok() {
|
|
||||||
int x = 42;
|
|
||||||
B b = a.f; // destabilizes
|
|
||||||
synchronized (this) {
|
|
||||||
a.f.g = 101;
|
|
||||||
}
|
|
||||||
x = a.f.g;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void FN_stable_bad() {
|
|
||||||
int x = 42;
|
|
||||||
synchronized (this) {
|
|
||||||
a.f.g = 101;
|
|
||||||
}
|
|
||||||
x = a.f.g;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static class Param {
|
|
||||||
|
|
||||||
public void unstable_ok(A a) {
|
|
||||||
int x = 42;
|
|
||||||
B b = a.f; // destabilizes
|
|
||||||
synchronized (this) {
|
|
||||||
a.f.g = 101;
|
|
||||||
}
|
|
||||||
x = a.f.g;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void stable_bad(A a) {
|
|
||||||
int x = 42;
|
|
||||||
synchronized (this) {
|
|
||||||
a.f.g = 101;
|
|
||||||
}
|
|
||||||
x = a.f.g;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@ThreadSafe
|
|
||||||
static class Global {
|
|
||||||
private static A a = new A();
|
|
||||||
|
|
||||||
public synchronized A getA() {
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized void setA(A newA) {
|
|
||||||
a = newA;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void unstable_ok() {
|
|
||||||
int x = 42;
|
|
||||||
A a = getA(); // destabilizes
|
|
||||||
synchronized (this) {
|
|
||||||
a.f.g = 101;
|
|
||||||
}
|
|
||||||
x = a.f.g;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
# Copyright (c) 2016-present, Facebook, Inc.
|
|
||||||
#
|
|
||||||
# This source code is licensed under the MIT license found in the
|
|
||||||
# LICENSE file in the root directory of this source tree.
|
|
||||||
|
|
||||||
TESTS_DIR = ../../..
|
|
||||||
|
|
||||||
INFER_OPTIONS = --racerd-only --debug-exceptions --racerd-use-path-stability
|
|
||||||
INFERPRINT_OPTIONS = --issues-tests
|
|
||||||
SOURCES = $(wildcard *.java)
|
|
||||||
|
|
||||||
include $(TESTS_DIR)/javac.make
|
|
@ -1,3 +0,0 @@
|
|||||||
codetoanalyze/java/stability/Interprocedural.java, codetoanalyze.java.checkers.Interprocedural$Param.stable_bad(codetoanalyze.java.checkers.Interprocedural$A):void, 71, THREAD_SAFETY_VIOLATION, no_bucket, ERROR, [<Read trace>,access to `a.codetoanalyze.java.checkers.Interprocedural$A.f.codetoanalyze.java.checkers.Interprocedural$B.g`,<Write trace>,access to `a.codetoanalyze.java.checkers.Interprocedural$A.f.codetoanalyze.java.checkers.Interprocedural$B.g`]
|
|
||||||
codetoanalyze/java/stability/Interprocedural.java, codetoanalyze.java.checkers.Interprocedural$Param2.stable_bad(codetoanalyze.java.checkers.Interprocedural$A):void, 88, THREAD_SAFETY_VIOLATION, no_bucket, ERROR, [<Read trace>,access to `a.codetoanalyze.java.checkers.Interprocedural$A.f.codetoanalyze.java.checkers.Interprocedural$B.g`,<Write trace>,access to `a.codetoanalyze.java.checkers.Interprocedural$A.f.codetoanalyze.java.checkers.Interprocedural$B.g`]
|
|
||||||
codetoanalyze/java/stability/Intraprocedural.java, codetoanalyze.java.checkers.Intraprocedural$Param.stable_bad(codetoanalyze.java.checkers.Intraprocedural$A):void, 61, THREAD_SAFETY_VIOLATION, no_bucket, ERROR, [<Read trace>,access to `a.codetoanalyze.java.checkers.Intraprocedural$A.f.codetoanalyze.java.checkers.Intraprocedural$B.g`,<Write trace>,access to `a.codetoanalyze.java.checkers.Intraprocedural$A.f.codetoanalyze.java.checkers.Intraprocedural$B.g`]
|
|
Loading…
Reference in new issue