CWE-500:声明为public static的域没有标记final缺陷简介
在一个类中,非静态成员变量对每一个对象都会有一个特定的值,在初始化非静态变量的时候是不分配内存的,只有创立对象后才会分配,而且不同对象之间的同名非静态变量是可以不同的;当用static修饰变量,一个类的所有对象都共享这个属性,若不加final,当一个对象对static变量修改的时候,这个类的所有对象的这个属性都会改变。
一、什么是public static的域没有标记final缺陷?
对象包含未标记为final的公共静态字段,这可能允许以意外方式对其进行修改。
二、public static的域没有标记final缺陷构成条件有哪些?
例如:
public class SomeAppClass {
public static String appPropertiesFile = "app/Application.properties";
...
}
具有未标记为final的public static可能会允许该变量以应用程序不希望的方式更改。在此示例中,可以修改String变量以指示不存在的属性文件上的其他内容,这可能导致应用程序崩溃或导致意外行为。
三、public static的域没有标记final缺陷的后果有哪些?
应用程序中的任何类都可以在没有访问器的情况下读取公共静态变量,并在没有变量器的情况下对其进行更改。
四、public static的域没有标记final缺陷样例:
package Static_Field_Not_Final;
public class Static_Field_Not_Final
{
/* FLAW: public static fields should be marked final */
public static String defaultError = "The value you entered was not understood. Please try again."; // bad 非final的public static字段
public static final String defaultRight = "GOOD"; // good 非final的public static字段
public void bad() { }
}
使用悟空软件源代码静态检测工具进行代码检测,检测结果如下:
“声明为public static的域没有标记final缺陷”在CWE中编号为:CWE-500: Public Static Field Not Marked Final