Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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 其中';这是双重比较中的安全缺陷_Java_Bug Tracking - Fatal编程技术网

Java 其中';这是双重比较中的安全缺陷

Java 其中';这是双重比较中的安全缺陷,java,bug-tracking,Java,Bug Tracking,我昨天接受了采访,出现了这个问题: public class Main { public static void main(String[] args) { // Code fragment must prints true if the double variables x and y are both // strictly between 0 and 1 and false otherwise. // Assuming arg

我昨天接受了采访,出现了这个问题:

public class Main {

    public static void main(String[] args) {

        // Code fragment must prints true if the double variables x and y are both
        // strictly between 0 and 1 and false otherwise. 

        // Assuming args will be always correct (double) input, 
        // Where's the safety bug?

        double x,y;

        x = Double.parseDouble(args[0]);
        y = Double.parseDouble(args[1]);

        System.out.println( (0 < x && x < 1) && (0 < y && y < 1)? true : false );
    }
}
公共类主{
公共静态void main(字符串[]args){
//如果双变量x和y都为true,则代码片段必须打印为true
//严格介于0和1之间,否则为false。
//假设args始终是正确的(双)输入,
//安全漏洞在哪里?
双x,y;
x=Double.parseDouble(args[0]);
y=Double.parseDouble(args[1]);
System.out.println((0
我写了一篇没有bug的文章,我的意思是,代码可以正常工作。回到家里,我试过了,而且确实有效。但是,尽管我得到了这份工作,这个问题是我唯一不好的一个问题,我无法把它从我的脑海中抹去(它非常简单)。我相信我甚至不明白什么是安全缺陷,所以我的问题是:

什么是安全缺陷?此代码是否确实存在安全缺陷

更新:

回复后,我投入了一些相关资源:


如果输入恰好不是双精度的,我会选择类型安全和未捕获异常。然后代码只抛出一个异常。

您可以将x设置为0,并且可以为y输入0。但这些值必须介于两者之间

你最好使用strictfp。
您最好使用0d而不是0。

从源代码中的注释判断:

假设args总是正确(双重)输入,那么安全缺陷在哪里

存在这样一种情况:程序将提供错误的输出,除了表达式本身之外,似乎没有任何可疑之处:

(0 虽然我还没有测试过它,但是当这个表达式遇到x或y:NaN、+/-无穷大甚至-0.0的边缘情况时,可能会出现问题


此外,由于数字以双精度表示的精度有限(例如,x=1E-400大于0,但解析为0,因此表达式传递的值为false,尽管用户希望为true),因此存在可能违反用户逻辑预期的最终有效输入。

自从您得到该作业后,为什么你不能直接问你的面试官呢?问题的一部分在于这个问题的模糊性。我们在谈论什么样的安全?线程安全?类型安全?“安全?”马特波尔没有说。下午有人问其他候选人。@Jeremy我真的不知道。我不是这方面的专家,但seing Durandal的回答我想可能是类型安全!这很明显,但这更关乎稳定性而非安全性?(当然取决于实际使用)。+1我已经用0.1 0.99999999999999999进行了测试,结果是错误的。很奇怪(对我来说,我显然不是专家)。我开始相信,正如@Jeremy所建议的,这一切都是关于类型安全的。问题是,如何防止精度问题。只有通过裁剪或限制输入,或者还有其他方法?@RandolfRincón-Fadul浮点数只是数学中已知实数的近似值。人类习惯于处理数字的十进制近似,但由于我们使用的计算机结构,fp数字使用二进制近似,这并不总是与十进制匹配。此外,精度有限,因此0.9(20)的最近可表示值与1.0相同。将这种行为称为“安全缺陷”可能有点牵强,但确实可能令人困惑:n1在范围内,n2也在范围内(对于用户而言,而不是CPU而言),但“n1和n2都在范围内”是错误的。当然,如果0.9(20)完全被认为是问题所指的“正确(双重)输入”,那么问题就存在了。不过,它确实进行了解析——请参阅文档中关于.No的一些有趣的讨论。我不能。如果设置为0,则它将变为false,因此这不是问题所在。(我使用less、less或equal进行比较)。