JavaSE 6确定赋值规则下编译时常量自赋值的异常行为问询
Java SE 6编译时常量自赋值的异常行为
这确实是Java SE 6里一个挺有意思的边缘案例,涉及到确定赋值规则的漏洞,会触发完全不符合直觉的运行结果。
问题重现与分析
我们先看这个极简的示例代码,直观感受下这个问题:
示例代码(Main.java)
public class Main{ public static final boolean CONST_TEST = Main.CONST_TEST; public static void main(String[] args) { System.out.println("CONST_TEST="+ Main.CONST_TEST); } }
编译与运行步骤
- 编译命令:
$ javac Main.java - 运行命令:
$ java Main
实际输出结果
CONST_TEST=false
按常理来说,这种自引用的常量定义应该触发编译错误,但Java SE 6的编译器居然允许了这种写法,最终返回了布尔类型的默认值false——这就是确定赋值规则的漏洞导致的:编译器错误地判定这个自引用的常量已经完成赋值,实际上它根本没有被初始化,只能返回对应数据类型的默认值。
不同数据类型的表现差异
这个漏洞在不同数据类型上的表现也不一样:
- 整数类型(int、long等)会返回
0 - 浮点类型(float、double)会返回
0.0 - 引用类型(比如String)会返回
null
内容的提问来源于stack exchange,提问作者Andrei Mărcuţ
相关产品推荐
相关产品推荐

