Java中按位and运算的随机错误结果
对于随机i,以下测试失败:Java中按位and运算的随机错误结果,java,jvm,jit,Java,Jvm,Jit,对于随机i,以下测试失败: @Test public void test() { for (int i = 0; i < 1_000_000; i++) { boolean isTrue = and128(new byte[] {-1}); if (!isTrue) { fail("broken: " + i + " " + isTrue
@Test
public void test() {
for (int i = 0; i < 1_000_000; i++) {
boolean isTrue = and128(new byte[] {-1});
if (!isTrue) {
fail("broken: " + i + " " + isTrue);
break;
}
clearCache();
}
}
private void clearCache() {
for (int i = 0; i < 100; i++) {
and128(new byte[] {(byte) i});
}
}
public static boolean and128(byte[] byteData) {
return ((byteData[0] & 128) > 0);
}
@测试
公开无效测试(){
对于(int i=0;i<1_000;i++){
布尔isTrue=and128(新字节[]{-1});
如果(!isTrue){
失败(“中断:+i+”+isTrue);
打破
}
clearCache();
}
}
私有void clearCache(){
对于(int i=0;i<100;i++){
和128(新字节[]{(字节)i});
}
}
公共静态布尔and128(字节[]字节数据){
返回((字节数据[0]&128)>0);
}
由于随机性,我会责怪Java运行时。如果我内联方法和128
,我就无法重现问题。另外,如果我只传递一个字节而不是字节数组,那么测试就通过了。
我正在使用OpenJDK14.0.2。这个问题似乎在15.0.2中得到了解决。它似乎仍然存在于15.0.1中,我找不到与此对应的bug
编辑:我添加了这个“clearCache”方法,它只在侧面运行,使bug更容易重现。我想这会阻止一些java优化。检查版本15.0.2-可能与它的更正相关或被它更正-至少如果我使用
-XX:TieredStopAtLevel=3
我无法复制error@user15358848似乎匹配,这个问题在JDK 15.0中是可以重现的,但在15.0.2中却不能重现。我想我们不能确定它是否就是那个bug?首先,它说它适用于x86体系结构。其次,有一些关于C2的bug,而-XX:TieredStopAtLevel=3
只是关闭C2。虽然这些听起来都与我的问题无关,但我可能遗漏了一些东西。无论如何,我觉得java随机产生错误的结果有点可怕。@user15358848这应该是一个答案。我可以确认这是C2错误-正是屏蔽字节值的问题。