2

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

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 Lippert为什么 JScript 有舍入错误?

4

3 回答 3

3

从源中的评论来看:

假设 args 总是正确的(双)输入,那么安全漏洞在哪里?

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

(0 < x && x < 1) && (0 < y && y < 1)

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

也存在明确有效的输入,这可能违反用户的逻辑期望,因为数字以双精度表示的精度有限(例如 x = 1E-400 大于 0,但解析为 0,因此表达式提供 false尽管用户期望是真的)。

于 2012-09-06T17:48:21.873 回答
0

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

于 2012-09-06T17:27:27.633 回答
0

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

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

于 2012-09-06T17:36:18.650 回答