这次双重比较中的安全漏洞在哪里

时间:2012-09-06 16:55:48

标签: 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 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 );
    }
}

我写道,在任何地方都没有任何错误,我的意思是代码有效。回到家里,尝试过,确实有效。但是虽然我确实得到了这份工作,但这个问题是我唯一的不好的问题,而且我无法理解它(直接接缝很简单)。我相信我甚至不明白安全漏洞是什么,我的问题是:

什么是安全漏洞?这段代码确实有一个吗?

更新

在回复后我提出了一些相关资源:

Eric LippertWhy does JScript have rounding errors?

3 个答案:

答案 0 :(得分:3)

从来源的评论来看:

  

假设args始终是正确的(双重)输入,哪里是安全漏洞?

有一种情况,程序会传递错误的输出,除了表达式本身之外似乎没有可疑:

  

(0

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

还存在确定有效的输入,这可能违反用户的逻辑期望,因为数字以双精度表示的精度有限(例如x = 1E-400大于0,但解析为0,所以尽管用户期望真实,但表达式仍然是假的。

答案 1 :(得分:0)

如果输入有点不合适,我会选择类型安全和未捕获的异常。然后代码抛出异常。

答案 2 :(得分:0)

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

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