Reviewed By: ngorogiannis Differential Revision: D5512595 fbshipit-source-id: b47cc08master
parent
854b8f30bd
commit
c6ee53de50
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2017 - present Facebook, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the BSD style license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||||||
|
*/
|
||||||
|
import javax.annotation.concurrent.ThreadSafe;
|
||||||
|
|
||||||
|
// Test may_alias treatment of arrays
|
||||||
|
// two arrays of types in a subtype relation may alias, and race
|
||||||
|
|
||||||
|
@ThreadSafe
|
||||||
|
class Parent {}
|
||||||
|
|
||||||
|
@ThreadSafe
|
||||||
|
class Child extends Parent {}
|
||||||
|
|
||||||
|
@ThreadSafe
|
||||||
|
class Arrays {
|
||||||
|
Child[] childArr = new Child[5];
|
||||||
|
Parent[] parentArr = childArr; // actual aliasing not required, but for documentation
|
||||||
|
final String[] strArr1 = new String[5];
|
||||||
|
final String[] strArr2 = new String[5];
|
||||||
|
|
||||||
|
void arrayParameterWriteBad(int[] name1) {
|
||||||
|
name1[2] = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we'll report this because name1 and name2 may alias
|
||||||
|
int arrayParameterReadBad(int[] name2) {
|
||||||
|
return name2[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
int arrayParameterLiteralReadOk() {
|
||||||
|
return (new int[] { 2, 3})[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
public void writeWriteRaceBad(String s) {
|
||||||
|
strArr1[2] = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
// same array
|
||||||
|
public String readWriteRaceBad(String s) {
|
||||||
|
synchronized (this) {
|
||||||
|
strArr1[2] = s;
|
||||||
|
}
|
||||||
|
return strArr1[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
// arrays are same type, but can't alias
|
||||||
|
public String notReadWriteRace1Ok(String s) {
|
||||||
|
synchronized (this) {
|
||||||
|
strArr1[0] = s;
|
||||||
|
}
|
||||||
|
return strArr2[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
// arrays are compatible types and can alias
|
||||||
|
public Child FN_readWriteAliasRaceBad() {
|
||||||
|
synchronized(this) {
|
||||||
|
parentArr[3] = null;
|
||||||
|
}
|
||||||
|
return childArr[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
String[] type1Arr[];
|
||||||
|
Parent[] type2Arr;
|
||||||
|
|
||||||
|
// arrays are different types and thus cannot alias
|
||||||
|
public Parent noRaceOk() {
|
||||||
|
synchronized(this) {
|
||||||
|
type1Arr[3] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return type2Arr[3];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,42 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2017 - present Facebook, Inc.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* This source code is licensed under the BSD style license found in the
|
|
||||||
* LICENSE file in the root directory of this source tree. An additional grant
|
|
||||||
* of patent rights can be found in the PATENTS file in the same directory.
|
|
||||||
*/
|
|
||||||
import javax.annotation.concurrent.ThreadSafe;
|
|
||||||
|
|
||||||
// Test may_alias treatment of arrays
|
|
||||||
// two arrays of types in a subtype relation may alias, and race
|
|
||||||
|
|
||||||
@ThreadSafe
|
|
||||||
class Parent {}
|
|
||||||
|
|
||||||
@ThreadSafe
|
|
||||||
class Child extends Parent {}
|
|
||||||
|
|
||||||
@ThreadSafe
|
|
||||||
class SubArr {
|
|
||||||
Child[] childArr = new Child[5];
|
|
||||||
Parent[] parentArr = childArr; // actual aliasing not required, but for documentation
|
|
||||||
String[] strArr = new String[5];
|
|
||||||
|
|
||||||
public Child RWrace() {
|
|
||||||
synchronized(this) {
|
|
||||||
parentArr[3] = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return childArr[4];
|
|
||||||
}
|
|
||||||
|
|
||||||
public String NOrace() {
|
|
||||||
synchronized(this) {
|
|
||||||
parentArr[3] = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return strArr[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in new issue