我昨天接受了采访,这个问题出现了:
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 );
}
}
我写道,在任何地方都没有任何错误,我的意思是代码有效。回到家里,尝试过,确实有效。但是虽然我确实得到了这份工作,但这个问题是我唯一的不好的问题,而且我无法理解它(直接接缝很简单)。我相信我甚至不明白安全漏洞是什么,我的问题是:
什么是安全漏洞?这段代码确实有一个吗?
更新
在回复后我提出了一些相关资源:
答案 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。