恶意代码漏洞 - 字段应受包保护

dum*_*per 4 java sonarqube

声纳给我的信息是:

恶意代码漏洞 - 字段应该是针对静态数组的包保护FORMATS.

为什么此代码被视为恶意代码?我有一个公共类来存储所有常量.

public class Constants
{
    /*
    all the public static final constants of primitive datatypes for which 
    there is no sonar warning.
    */
    public static final String[] FORMATS = new String[] {
        "yyyy-MM-dd HH:mm:ss.S z", 
        "yyyy-MM-dd HH:mm:ss.S"
}
Run Code Online (Sandbox Code Playgroud)

ass*_*ias 16

可能是因为另一段代码可以执行:

Constants.FORMATS[0] = "SOME GARBAGE";
Run Code Online (Sandbox Code Playgroud)

并打破你的其余代码.

换句话说,您的数组是常量但不是其内容.

替代方案的例子:

  • 您可以将每种格式存储为单独的String常量
  • 您可以使用不可变列表: public static final List<String> FORMATS = Collections.unmodifiableList(Arrays.asList("yyyy-MM-dd HH:mm:ss.S z", "yyyy-MM-dd HH:mm:ss.S"));
  • 使它成为一种方法:

    public static String[] formats() {
      return new String[] { "yyyy-MM-dd HH:mm:ss.S z", "yyyy-MM-dd HH:mm:ss.S" };
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果您确信(i)只有您自己的代码可以访问该类,并且(ii)您/您的同事甚至无法考虑重新分配其中一个值,请忽略该警告.