Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中按位and运算的随机错误结果_Java_Jvm_Jit - Fatal编程技术网

Java中按位and运算的随机错误结果

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

对于随机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);
                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错误-正是屏蔽字节值的问题。