Comments (35)
How can I get those list of deprecated APIs ? I mean, last time you showed me .
Is it same we got during running ./gradlew clean test
?
from jpf-core.
from jpf-core.
Here is the Complier Warnings (We will use this as an index) :
ekla@Eklas-MacBook-Air jpf-core % ./gradlew clean test
> Task :compileJava
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
> Task :compileClassesJava
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/lang/System.java:170: warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal
static SecurityManager securityManager;
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/lang/System.java:172: warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal
public static void setSecurityManager (SecurityManager newManager) {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/lang/System.java:176: warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal
public static SecurityManager getSecurityManager() {
^
3 warnings
> Task :compilePeersJava
/Users/ekla/GSOC/JPFjava17/jpf-core/src/peers/gov/nasa/jpf/vm/JPF_java_util_Random.java:110: warning: [removal] getObject(Object,long) in Unsafe has been deprecated and marked for removal
AtomicLong al = (AtomicLong) unsafe.getObject(rand, seedFieldOffset);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/peers/gov/nasa/jpf/vm/JPF_java_util_Random.java:115: warning: [removal] getObject(Object,long) in Unsafe has been deprecated and marked for removal
AtomicLong al = (AtomicLong) unsafe.getObject(rand, seedFieldOffset);
^
2 warnings
> Task :compileTestJava
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/java11/StringConcatenationTest.java:134: warning: [removal] Character(char) in Character has been deprecated and marked for removal
Character ch = new Character('@');
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:138: warning: [removal] Integer(int) in Integer has been deprecated and marked for removal
Integer i2 = new Integer(1);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:152: warning: [removal] Character(char) in Character has been deprecated and marked for removal
Character c2 = new Character('?');
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:166: warning: [removal] Byte(byte) in Byte has been deprecated and marked for removal
Byte b2 = new Byte((byte)1);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:180: warning: [removal] Short(short) in Short has been deprecated and marked for removal
Short s2 = new Short((short)1);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:194: warning: [removal] Long(long) in Long has been deprecated and marked for removal
Long l2 = new Long(1);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:208: warning: [removal] Boolean(boolean) in Boolean has been deprecated and marked for removal
Boolean b2 = new Boolean(true);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:55: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t1.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:76: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t1.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:82: warning: [removal] resume() in Thread has been deprecated and marked for removal
t1.resume();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:122: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t2.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:161: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t3.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:184: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t3.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:191: warning: [removal] resume() in Thread has been deprecated and marked for removal
t3.resume();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:242: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t4.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:267: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t4.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:272: warning: [removal] resume() in Thread has been deprecated and marked for removal
t4.resume();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/mc/basic/AttrsTest.java:371: warning: [removal] Integer(int) in Integer has been deprecated and marked for removal
Integer o = new Integer(v);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/util/SparseClusterArrayTest.java:185: warning: [removal] Integer(int) in Integer has been deprecated and marked for removal
return new Integer(other);
^
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
19 warnings
> Task :compileModules
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:25: warning: [removal] AccessControlException in java.security has been deprecated and marked for removal
public static void checkPermission (Permission p) throws AccessControlException {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:29: warning: [removal] AccessControlContext in java.security has been deprecated and marked for removal
AccessControlContext context) {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:38: warning: [removal] AccessControlContext in java.security has been deprecated and marked for removal
AccessControlContext context)
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:64: warning: [removal] AccessControlContext in java.security has been deprecated and marked for removal
public static AccessControlContext getContext() {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:69: warning: [removal] AccessControlContext in java.security has been deprecated and marked for removal
private static AccessControlContext getStackAccessControlContext() {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:73: warning: [removal] AccessControlContext in java.security has been deprecated and marked for removal
static AccessControlContext getInheritedAccessControlContext() {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/lang/System.java:170: warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal
static SecurityManager securityManager;
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/lang/System.java:172: warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal
public static void setSecurityManager (SecurityManager newManager) {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/lang/System.java:176: warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal
public static SecurityManager getSecurityManager() {
^
9 warnings
from jpf-core.
Our first set of warnings are :
> Task :compileClassesJava
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/lang/System.java:170: warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal
static SecurityManager securityManager;
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/lang/System.java:172: warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal
public static void setSecurityManager (SecurityManager newManager) {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/lang/System.java:176: warning: [removal] SecurityManager in java.lang has been deprecated and marked for removal
public static SecurityManager getSecurityManager() {
^
3 warnings
SecurityManager
has been marked for removal from Java-17.
"The security manager is a class that allows applications to implement a security policy. It allows an application to determine, before performing a possibly unsafe or sensitive operation, what the operation is and whether it is being attempted in a security context that allows the operation to be performed. The application can allow or disallow the operation."
The SecurityManager class contains many methods with names that begin with the word check. These methods are called by various methods in the Java libraries before those methods perform certain potentially sensitive operations.
Deprecated, for removal: This API element is subject to removal in a future version.
The Security Manager is deprecated and subject to removal in a future release. There is no replacement for the Security Manager. See JEP 411 for discussion and alternatives.
from jpf-core.
I guess the methods we support are still needed to make our tests work?
Please think of a strategy to gauge how to deal with such deprecations.
First, try removing the methods in question: If the code still compiles and all tests pass, then the code can be removed. If deprecated code is part of unit tests, check if the functionality has been removed in Java 21; in that case, we can remove it now.
In most cases, we still need to support the functionality.
Second, check if there is a replacement. If not (as is the case for SecurityManager
), we may have to keep the code as is and live the warnings for now.
from jpf-core.
"I guess the methods we support are still needed to make our tests work?" -----> Yes. We support these methods in System.java
and it is needed to pass the Tests.
//--- security manager
static SecurityManager securityManager;
public static void setSecurityManager (SecurityManager newManager) {
securityManager = newManager;
}
public static SecurityManager getSecurityManager() {
return securityManager;
}
If we remove these codes from System.java
, there is 765/1010 test failures.
"First, try removing the methods in question: If the code still compiles and all tests pass, then the code can be removed. If deprecated code is part of unit tests, check if the functionality has been removed in Java 21; in that case, we can remove it now." ----->
SecurityManager
has been used in System.java
and String.java
as per my finding. When we remove their usage, the code gets compiled but the unit tests fails (765/1010).
SecurityManager
is not the direct part of unit tests.
"Second, check if there is a replacement. If not (as is the case for SecurityManager), we may have to keep the code as is and live the warnings for now." ----->
SecurityManager
is not removed from Java 21 and also there is no alternatives suggested yet.
When we remove the SecurityManager
from System.java
and String.java
, we get 765/1010 failed tests. In most of them we get errors like :
====================================================== error 1
gov.nasa.jpf.vm.NoUncaughtExceptionsProperty
java.lang.NoSuchMethodException: java.lang.System.getSecurityManager()Ljava/lang/SecurityManager;
at sun.security.action.GetPropertyAction.privilegedGetProperties(GetPropertyAction.java:150)
at java.lang.invoke.MethodHandleStatics.<clinit>(MethodHandleStatics.java:66)
at java.lang.invoke.VarHandle.<clinit>(VarHandle.java:2194)
====================================================== snapshot #1
thread java.lang.Thread:{id:0,name:main,status:RUNNING,priority:5,isDaemon:false,lockCount:0,suspendCount:0}
owned locks:java.lang.Class@b2,java.lang.Class@1d3
call stack:
at java.lang.invoke.MethodHandleStatics.<clinit>(MethodHandleStatics.java:66)
at java.lang.invoke.VarHandle.<clinit>(VarHandle.java:2194)
====================================================== results
error #1: gov.nasa.jpf.vm.NoUncaughtExceptionsProperty "java.lang.NoSuchMethodException: java.lang.System...."
====================================================== search finished: 23/07/24, 2:06 pm
running jpf with args: +vm.class=InvalidVMClass +pass_exceptions
[SEVERE] JPF configuration error: class not found InvalidVMClass by classloader: gov.nasa.jpf.JPFClassLoader@609e8838
at java.lang.invoke.MethodHandleStatics.<clinit>(MethodHandleStatics.java:66)
:
![Screenshot 2024-07-23 at 3 03 07 PM](https://private-user-images.githubusercontent.com/78310039/351271215-ea4f868e-7213-4ee6-a10f-cf3973e35725.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQ5NzA2MDgsIm5iZiI6MTcyNDk3MDMwOCwicGF0aCI6Ii83ODMxMDAzOS8zNTEyNzEyMTUtZWE0Zjg2OGUtNzIxMy00ZWU2LWExMGYtY2YzOTczZTM1NzI1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA4MjklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwODI5VDIyMjUwOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTYwMmQ5Y2Q2OWJjYWYwMzEzZDM0ZmY3OGUyYjI2MGMwZTE1NDUxOWFkNTYzOGMzZjM5YTI5OThlMGJiNTgwMzcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.mlrpx1Di3SjIy_n_jRdXdCHyDh7BjxUDEIrlmnD592Q)
at GetPropertyAction.java
:
/**
* Convenience method to call <code>System.getProperties</code> without
* having to go through doPrivileged if no security manager is present.
* This is unsafe for inclusion in a public API but allowable here since
* this class is now encapsulated.
*
* Note that this method performs a privileged action, and callers of
* this method should take care to ensure that the returned properties
* are not made accessible to untrusted code since it may contain
* sensitive information.
*/
@SuppressWarnings("removal")
public static Properties privilegedGetProperties() {
if (System.getSecurityManager() == null) {
return System.getProperties();
} else {
return AccessController.doPrivileged(
new PrivilegedAction<Properties>() {
public Properties run() {
return System.getProperties();
}
}
);
}
}
From here, we can see
It might be helpful to remove SecurityManager
by just returning the properties
. But the call to SecurityManager
is from OpenJDK classes.
from jpf-core.
Whenever there are dependencies from OpenJDK library classes, we have to keep a compatible API.
In our own code, where it is possible, please add @SuppressWarnings("removal") // SecurityManager
in front of the methods in question to squelch the warnings.
from jpf-core.
Next set of Compiler Warnings :
> Task :compilePeersJava
/Users/ekla/GSOC/JPFjava17/jpf-core/src/peers/gov/nasa/jpf/vm/JPF_java_util_Random.java:110: warning: [removal] getObject(Object,long) in Unsafe has been deprecated and marked for removal
AtomicLong al = (AtomicLong) unsafe.getObject(rand, seedFieldOffset);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/peers/gov/nasa/jpf/vm/JPF_java_util_Random.java:115: warning: [removal] getObject(Object,long) in Unsafe has been deprecated and marked for removal
AtomicLong al = (AtomicLong) unsafe.getObject(rand, seedFieldOffset);
^
2 warnings
at jpf-core/src/peers/gov/nasa/jpf/vm/JPF_java_util_Random.java:115
:
private static void setNativeSeed (Random rand, long seed) {
AtomicLong al = (AtomicLong) unsafe.getObject(rand, seedFieldOffset);
al.set(seed);
}
private static long getNativeSeed (Random rand){
AtomicLong al = (AtomicLong) unsafe.getObject(rand, seedFieldOffset);
return al.longValue();
}
in Unsafe.java
(It is a model class in JPF) :
public native Object getObject(Object obj, long l);
In OpenJDK 17 :
// The following deprecated methods are used by JSR 166.
@Deprecated(since="12", forRemoval=true)
public final Object getObject(Object o, long offset) {
return getReference(o, offset);
}
Please let me know the purpose of the message "The following deprecated methods are used by JSR 166".
Below source suggest to use VarHandle#get(Obj...)
[https://github.com/openjdk/jdk/blob/master/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java#L224] I found it from Google Search :
/**
* Fetches a reference value from a given Java variable.
*
* @deprecated Use {@link VarHandle#get(Object...)} instead.
*/
@Deprecated(since="23", forRemoval=true)
@ForceInline
public Object getObject(Object o, long offset) {
beforeMemoryAccess();
return theInternalUnsafe.getReference(o, offset);
}
But the problem is that `VarHandle is an abstract class and get(Obj...) is non-static method so it is difficult to find the implementing class.
But, from the OpenJDK source code and also other sources, looks like we should replace it with getReference(o, offset);
@deprecated(since="12", forRemoval=true)
public final Object getObject(Object o, long offset) {
return getReference(o, offset);
}
But we have to write implementation of native method getReference(o, offset)
in our model class Unsafe.java
.
One thing I have noticed in OpenJDK
Unsafe.java
class that every method like getObject(...)
, setObject(...)
, setObjectVolatile(...)
etc. calls corresponding titled getReference(...)
, setReference(....)
, etc .
So do you think we should copy the code of native peer implementation of getObject(...)
to getReference(...)
and then we can remove getObject(....)
[Should I explain this part in more detail ?]
from jpf-core.
Please try this (removing getObject
etc. in favor of getReference
etc.), and let's see what happens with the tests.
from jpf-core.
Yes, removing and implementing the above changes works. All tests passed. Also, Compiler Warnings disappeared for getObject(...)
. I removed all those getObject..(...)
which were marked deprecated
in OpenJDK 17.
Should I share you an update over this using my forked repo ? I do not want to break it for future Tests .
from jpf-core.
Please make a PR. We can always find the PR again and revert the changes if needed, although I doubt that this is necessary.
from jpf-core.
FIX for SecurityManager
(temporary)
FIX for Unsafe#getObject(...)
from jpf-core.
Next set of Compiler Warnings are :
> Task :compileTestJava
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/java11/StringConcatenationTest.java:134: warning: [removal] Character(char) in Character has been deprecated and marked for removal
Character ch = new Character('@');
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:138: warning: [removal] Integer(int) in Integer has been deprecated and marked for removal
Integer i2 = new Integer(1);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:152: warning: [removal] Character(char) in Character has been deprecated and marked for removal
Character c2 = new Character('?');
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:166: warning: [removal] Byte(byte) in Byte has been deprecated and marked for removal
Byte b2 = new Byte((byte)1);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:180: warning: [removal] Short(short) in Short has been deprecated and marked for removal
Short s2 = new Short((short)1);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:194: warning: [removal] Long(long) in Long has been deprecated and marked for removal
Long l2 = new Long(1);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/java/lang/BoxObjectCacheTest.java:208: warning: [removal] Boolean(boolean) in Boolean has been deprecated and marked for removal
Boolean b2 = new Boolean(true);
^
.................
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/mc/basic/AttrsTest.java:371: warning: [removal] Integer(int) in Integer has been deprecated and marked for removal
Integer o = new Integer(v);
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/util/SparseClusterArrayTest.java:185: warning: [removal] Integer(int) in Integer has been deprecated and marked for removal
return new Integer(other);
^
As you guided, changed with recommended WrapperClass.valueOf(...)
code. All the above Warnings disappeared.
But one Test Failed :
@Test public void testInteger() {
if (verifyNoPropertyViolation()) {
int v = 42;
Verify.setLocalAttribute("v", 4200);
// explicit
// Integer o = new Integer(v);
Integer o = Integer.valueOf(v);
int j = o.intValue();
int attr = Verify.getLocalAttribute("j");
assert attr == 4200;
// semi autoboxed
j = o;
boolean b = Verify.getBoolean(); // just cause some backtracking damage
attr = Verify.getLocalAttribute("j");
assert attr == 4200;
/** this does not work because of cached, preallocated Integer objects)
// fully autoboxed
Integer a = v;
j = a;
attr = Verify.getLocalAttribute("j");
assert attr == 4200;
**/
}
}
from jpf-core.
Thanks for replacing the constructors, which was the right way to handle these warnings.
Which assertion fails here, and what is the unexpected value?
from jpf-core.
Here is the output :
====================================================== system under test
gov.nasa.jpf.test.mc.basic.AttrsTest.runTestMethod()
====================================================== search started: 24/07/24, 10:21 pm
[WARNING] orphan NativePeer method: jdk.internal.misc.Unsafe.getUnsafe()Lsun/misc/Unsafe;
====================================================== error 1
gov.nasa.jpf.vm.NoUncaughtExceptionsProperty
java.lang.AssertionError
at gov.nasa.jpf.test.mc.basic.AttrsTest.testInteger(AttrsTest.java:375)
at java.lang.reflect.Method.invoke(gov.nasa.jpf.vm.JPF_java_lang_reflect_Method)
at gov.nasa.jpf.util.test.TestJPF.runTestMethod(TestJPF.java:648)
First one assert attr == 4200;
fails. (There is two, but here first one fails. But second one also fails).
from jpf-core.
What is the value of attr
in that place? You can rewrite the assertion slightly to include a diagnostic message with the value of attr
.
from jpf-core.
Here I tried to debug this :
Case 1 : When we use the old constructor type
@Test public void testInteger() {
if (verifyNoPropertyViolation()) {
int v = 42;
System.out.println("int v = " + v);
Verify.setLocalAttribute("v", 4200);
// explicit
Integer o = new Integer(v);
// Integer o = Integer.valueOf(v);
int j = o.intValue();
System.out.println("int j = " + j);
int attr = Verify.getLocalAttribute("j");
System.out.println("int attr = " + attr);
assert attr == 4200;
// semi autoboxed
j = o;
boolean b = Verify.getBoolean(); // just cause some backtracking damage
attr = Verify.getLocalAttribute("j");
assert attr == 4200;
/** this does not work because of cached, preallocated Integer objects)
// fully autoboxed
Integer a = v;
j = a;
attr = Verify.getLocalAttribute("j");
assert attr == 4200;
**/
}
}
Result
int v = 42
int j = 42
int attr = 4200
And Test Passes
Case 2 : When we use the new recommended method WrapperClass.valueOf(...)
@Test public void testInteger() {
if (verifyNoPropertyViolation()) {
int v = 42;
System.out.println("int v = " + v);
Verify.setLocalAttribute("v", 4200);
// explicit
// Integer o = new Integer(v);
Integer o = Integer.valueOf(v);
int j = o.intValue();
System.out.println("int j = " + j);
int attr = Verify.getLocalAttribute("j");
System.out.println("int attr = " + attr);
assert attr == 4200;
// semi autoboxed
j = o;
boolean b = Verify.getBoolean(); // just cause some backtracking damage
attr = Verify.getLocalAttribute("j");
assert attr == 4200;
/** this does not work because of cached, preallocated Integer objects)
// fully autoboxed
Integer a = v;
j = a;
attr = Verify.getLocalAttribute("j");
assert attr == 4200;
**/
}
}
Result
int v = 42
int j = 42
int attr = 0
And the test fails
from jpf-core.
Verify.setLocalAttribute("v", 4200);
and Verify.getLocalAttribute("j");
are native
methods. I am unable to locate their peer implementation.
Here one thing strange to me in case of Old Constructor Case, how can Verify.getLocalAttribute("j");
yield 4200 ?
from jpf-core.
The native peer of Verify
is in src/main/gov/nasa/jpf/vm/JPF_gov_nasa_jpf_vm_Verify.java
. The value of j
is set by setting v first with Verify.setLocalAttribute("v", 4200);
, and that value is then assigned to o
and then to j
.
Use the assertion message to see the actual value of j
where the assertion fails.
from jpf-core.
Wrote assertFalse(....)
to get the message when Test passes.
Case [Integer o = new Integer(v);
]
@Test public void testInteger() {
if (verifyNoPropertyViolation()) {
int v = 42;
Verify.setLocalAttribute("v", 4200);
System.out.println("Verify.setLocalAttribute(\"v\", 4200)\n" +
"int v = " + v);
// explicit
Integer o = new Integer(v);
int j = o.intValue();
System.out.println("Integer o = new Integer(v);\nint j = o.intValue();\n" +
"j = " + j);
int attr = Verify.getLocalAttribute("j");
assertTrue(("FAILED : assertTrue : Message [ j = " + j + " attr = " + attr + " ]"), (attr == 4200));
assertFalse(("FAILED : assertFalse : Message [ j = " + j + " attr = " + attr + " ]"), (attr == 4200));
// semi autoboxed
j = o;
boolean b = Verify.getBoolean(); // just cause some backtracking damage
attr = Verify.getLocalAttribute("j");
assert attr == 4200;
/** this does not work because of cached, preallocated Integer objects)
// fully autoboxed
Integer a = v;
j = a;
attr = Verify.getLocalAttribute("j");
assert attr == 4200;
**/
}
}
Output :
Verify.setLocalAttribute("v", 4200)
int v = 42
Integer o = new Integer(v);
int j = o.intValue();
j = 42
====================================================== error 1
gov.nasa.jpf.vm.NoUncaughtExceptionsProperty
java.lang.AssertionError: FAILED : assertFalse : Message [ j = 42 attr = 4200 ]
at gov.nasa.jpf.util.test.TestJPF.fail(TestJPF.java:164)
at gov.nasa.jpf.util.test.TestJPF.assertFalse(TestJPF.java:1247)
at gov.nasa.jpf.test.mc.basic.AttrsTest.testInteger(AttrsTest.java:379)
at java.lang.reflect.Method.invoke(gov.nasa.jpf.vm.JPF_java_lang_reflect_Method)
at gov.nasa.jpf.util.test.TestJPF.runTestMethod(TestJPF.java:648)
Case [Integer o = Integer.valueOf(v);
]
@Test public void testInteger() {
if (verifyNoPropertyViolation()) {
int v = 42;
Verify.setLocalAttribute("v", 4200);
System.out.println("Verify.setLocalAttribute(\"v\", 4200)\n" +
"int v = " + v);
// explicit
Integer o = Integer.valueOf(v);
int j = o.intValue();
System.out.println("Integer o = Integer.valueOf(v);\nint j = o.intValue();\n" +
"j = " + j);
int attr = Verify.getLocalAttribute("j");
assertTrue(("FAILED : assertTrue : Message [ j = " + j + " attr = " + attr + " ]"), (attr == 4200));
assertFalse(("FAILED : assertFalse : Message [ j = " + j + " attr = " + attr + " ]"), (attr == 4200));
// semi autoboxed
j = o;
boolean b = Verify.getBoolean(); // just cause some backtracking damage
attr = Verify.getLocalAttribute("j");
assert attr == 4200;
/** this does not work because of cached, preallocated Integer objects)
// fully autoboxed
Integer a = v;
j = a;
attr = Verify.getLocalAttribute("j");
assert attr == 4200;
**/
}
}
Output :
Verify.setLocalAttribute("v", 4200)
int v = 42
Integer o = Integer.valueOf(v);
int j = o.intValue();
j = 42
====================================================== error 1
gov.nasa.jpf.vm.NoUncaughtExceptionsProperty
java.lang.AssertionError: FAILED : assertTrue : Message [ j = 42 attr = 0 ]
at gov.nasa.jpf.util.test.TestJPF.fail(TestJPF.java:164)
at gov.nasa.jpf.util.test.TestJPF.assertTrue(TestJPF.java:1257)
at gov.nasa.jpf.test.mc.basic.AttrsTest.testInteger(AttrsTest.java:378)
at java.lang.reflect.Method.invoke(gov.nasa.jpf.vm.JPF_java_lang_reflect_Method)
at gov.nasa.jpf.util.test.TestJPF.runTestMethod(TestJPF.java:648)
Some questions :
- "The value of
j
is set by settingv
first withVerify.setLocalAttribute("v", 4200);
" -----> Then why the value ofj
orv
does not reflect as 4200 ?
from jpf-core.
My guess is that attributes are not propagated when handling the method call Integer.valueOf(v), contrary to the constructor where it seems to work properly.
There is a native peer for valueOf in the class JPF_java_lang_Integer, which seemingly does not propagate the local attributes. We can try to fix it there, but I would have to look up the exact code and put it here (if it would be possible at all).
from jpf-core.
The values and local attributes are two different entities. A variable has its value, 42 in the case of variables v and j here, and then it can have some attributes in addition to the value. But the attributes do not have direct influence on the value.
See https://github.com/javapathfinder/jpf-core/wiki/Slot-and-field-attributes for the general overview.
from jpf-core.
You could try something like this
int v = env.valueOfInteger(val);
env.setReturnAttribute(new Integer(v))
return v;
in the native peer for Integer.valueOf, that means in the method valueOf__I__Ljava_lang_Integer_2 of the class JPF_java_lang_Integer.
But right now I have not found a way how to get attributes for method call arguments in the native peer. The needed API is likely missing in the MJIEnv class. I also checked the implementation of bytecode instructions for native calls, but there I could not find anything related to passing of attributes for arguments to native calls.
We can discuss that with Cyrille next week. Maybe we could think about some workaround.
from jpf-core.
Compiler Warning : WrapperClass.valueOf(...) :
Tried below code but the error is still same.
int v = env.valueOfInteger(val);
env.setReturnAttribute(new Integer(v))
return v;
Compiler Warning : AccessController :
Next set of Compiler Warnings are :
> Task :compileModules
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:25: warning: [removal] AccessControlException in java.security has been deprecated and marked for removal
public static void checkPermission (Permission p) throws AccessControlException {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:29: warning: [removal] AccessControlContext in java.security has been deprecated and marked for removal
AccessControlContext context) {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:38: warning: [removal] AccessControlContext in java.security has been deprecated and marked for removal
AccessControlContext context)
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:64: warning: [removal] AccessControlContext in java.security has been deprecated and marked for removal
public static AccessControlContext getContext() {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:69: warning: [removal] AccessControlContext in java.security has been deprecated and marked for removal
private static AccessControlContext getStackAccessControlContext() {
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/classes/modules/java.base/java/security/AccessController.java:73: warning: [removal] AccessControlContext in java.security has been deprecated and marked for removal
static AccessControlContext getInheritedAccessControlContext() {
^
AccessControl
is a class where AccessControlException
, AccessControlContext
has been used.
All these are used in conjunction with SecurityManager
. Because SecurityManager
has been deprecated , all these too.
(Code from OpenJDK-17)
* @deprecated This class is only useful in conjunction with
* {@linkplain SecurityManager the Security Manager}, which is deprecated
* and subject to removal in a future release. Consequently, this class
* is also deprecated and subject to removal. There is no replacement for
* the Security Manager or this class.
*/
@Deprecated(since="17", forRemoval=true)
public final class AccessController {
One more thing, this methods are being called from OpenJDK. We cannot easily remove them I think.
If we remove those deprecated
methods to look their usage we found below :
gov.nasa.jpf.vm.NoUncaughtExceptionsProperty
java.lang.ExceptionInInitializerError
at java.util.concurrent.atomic.Striped64.<clinit>(Striped64.java:402)
at java.util.concurrent.ConcurrentSkipListMap.addCount(ConcurrentSkipListMap.java:439)
at java.util.concurrent.ConcurrentSkipListMap.doPut(ConcurrentSkipListMap.java:683)
at java.util.concurrent.ConcurrentSkipListMap.put(ConcurrentSkipListMap.java:1347)
at gov.nasa.jpf.test.java.concurrent.ConcurrentSkipListMapTest.testFunctionality(ConcurrentSkipListMapTest.java:37)
at java.lang.reflect.Method.invoke(gov.nasa.jpf.vm.JPF_java_lang_reflect_Method)
at gov.nasa.jpf.util.test.TestJPF.runTestMethod(TestJPF.java:648)
Caused by: java.lang.NoSuchMethodException: java.security.AccessController.doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;
at java.util.concurrent.atomic.Striped64.<clinit>(Striped64.java:390)
at java.util.concurrent.ConcurrentSkipListMap.addCount(ConcurrentSkipListMap.java:439)
at java.util.concurrent.ConcurrentSkipListMap.doPut(ConcurrentSkipListMap.java:683)
at java.util.concurrent.ConcurrentSkipListMap.put(ConcurrentSkipListMap.java:1347)
at gov.nasa.jpf.test.java.concurrent.ConcurrentSkipListMapTest.testFunctionality(ConcurrentSkipListMapTest.java:37)
at java.lang.reflect.Method.invoke(gov.nasa.jpf.vm.JPF_java_lang_reflect_Method)
at gov.nasa.jpf.util.test.TestJPF.runTestMethod(TestJPF.java:648)
from jpf-core.
@cyrille-artho Please review
from jpf-core.
Our tests do (AFAIK) not use access control features, so we might provide a stub for doPrivileged
that simply executes the privileged action by calling its run
method.
from jpf-core.
Compiler Warning : AccessController :
Commented out some of the methods including doPrivileged
and then all those related Compiler Warning
disappeared.
package java.security;
/*
* MJI model class for java.security.AccessController library abstraction
*/
public class AccessController {
// public static void checkPermission (Permission p) throws AccessControlException {
// }
// public static <T> T doPrivileged (PrivilegedAction<T> action,
// AccessControlContext context) {
// return action.run();
// }
public static <T> T doPrivileged (PrivilegedAction<T> action) {
return action.run();
}
// public static <T> T doPrivileged (PrivilegedExceptionAction<T> action,
// AccessControlContext context)
// throws PrivilegedActionException {
//
// try {
// return action.run();
//
// } catch (RuntimeException rx){
// throw rx; // we have to let unchecked exceptions pass
// } catch (Exception x) {
// throw new PrivilegedActionException(x);
// }
// }
public static <T> T doPrivileged (PrivilegedExceptionAction<T> action)
throws PrivilegedActionException {
try {
return action.run();
} catch (RuntimeException rx){
throw rx; // we have to let unchecked exceptions pass
} catch (Exception x) {
throw new PrivilegedActionException(x);
}
}
// public static AccessControlContext getContext() {
// return null;
// }
// @SuppressWarnings("unused")
// private static AccessControlContext getStackAccessControlContext() {
// return null;
// }
// static AccessControlContext getInheritedAccessControlContext() {
// return null;
// }
}
As you confirm them, I will clean up them.
Compiler Warning : WrapperClass.valueOf(...) :
We still have to discuss with you
Next set of Compiler Warning :
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:55: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t1.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:76: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t1.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:82: warning: [removal] resume() in Thread has been deprecated and marked for removal
t1.resume();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:122: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t2.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:161: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t3.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:184: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t3.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:191: warning: [removal] resume() in Thread has been deprecated and marked for removal
t3.resume();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:242: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t4.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:267: warning: [removal] suspend() in Thread has been deprecated and marked for removal
t4.suspend();
^
/Users/ekla/GSOC/JPFjava17/jpf-core/src/tests/gov/nasa/jpf/test/vm/threads/SuspendResumeTest.java:272: warning: [removal] resume() in Thread has been deprecated and marked for removal
t4.resume();
^
from jpf-core.
The thread-related warnings are OK. These are tests covering an API that is deprecated, but we still have to support it as there is no replacement. So adding annotations to suppress the warnings is enough there.
from jpf-core.
Now we have only to see Compiler Warning : WrapperClass.valueOf(...)
.
At this point should we create a PR ?
from jpf-core.
Yes, if possible, make a separate PR for different groups of warnings. For example, the suppression of warnings in tests related to threads should be separate from code changes regarding constructors of classes representing primitive types.
from jpf-core.
PR #487
For AccessControl
Compiler Warnings
from jpf-core.
PR #488
For WrapperClasses
Also, please review the commented Test
. That Test
was deprecated although.
from jpf-core.
PR #489
from jpf-core.
Also close the Issue
from jpf-core.
Thanks!
from jpf-core.
Related Issues (20)
- java.lang.NoSuchMethodError: java.lang.String.getBytes([BIIBI) HOT 13
- cannot find native jdk.internal.misc.CDS.isDumpingClassList0 HOT 43
- StringIndexOutOfBoundsException HOT 5
- `java.net.URI.toURI` broken
- Java 17: BufferMismatch now depends on native code: JPF crashes (missing native peer) if byte buffers differ
- `BufferTest.testCharBufferConstructor` uses random bytes HOT 96
- Test "gov.nasa.jpf.test.java.io.ObjectStreamTest and gov.nasa.jpf.test.java.io.testSimpleReadbackOk" Fails on Java 17 HOT 18
- Test "gov.nasa.jpf.test.java.concurrent.SemaphoreTest" fails on OpenJDK-17 HOT 16
- Assistance Needed with Deadlock Detection in JPF HOT 5
- "gov.nasa.jpf.test.java.concurrent.CountDownLatchTest" and "gov.nasa.jpf.test.java.concurrent.ExecutorServiceTest" fails on Java-17 HOT 16
- "gov.nasa.jpf.test.java.concurrent.ConcurrentSkipListMapTest" fails on Java-17 HOT 6
- Add support for package metadata in `JarClassFileContainer`
- Investigate `java.lang.invoke.MethodHandles$Lookup.findVarHandle` HOT 19
- NullPointerException in `java.util.jar.JarFile.getEntry0` method HOT 5
- java.lang.NoSuchMethodException: SharedSecrets.setJavaNetInetAddressAccess HOT 4
- Need Implementation of `JarFile`
- "record" feature in jpf-core/java-17 HOT 39
- "Sealed Class and Interface" feature of "OpenJDK-17" on JPF/java-17 HOT 9
- NumericValueChecker incorrectly reports out-of-range error
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from jpf-core.