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