анализ мертвого кода proguard дает ложное срабатывание для частного поля - PullRequest
0 голосов
/ 27 января 2020

Учитывая следующий класс

package com.example;

public class ProguardConstantFieldUsageDemo {

    private static final String CONSTANT_FIELD = "I'm not dead!";

    public String publicMethodUsingConstant() {
        return CONSTANT_FIELD + "I agree, you are not dead.";
    }

}

и конфигурацию, запрашивающую анализ мертвого кода

...
-dontoptimize
-dontobfuscate
-dontpreverify
-printusage result
... + keep statement to keep the public method

proguard (версия 6.2.2) утверждает, что константное поле является мертвым кодом:

com.example.ProguardConstantFieldUsageDemo:
    private static final java.lang.String CONSTANT_FIELD

Это ошибка в Proguard или функция (вызванная встраиванием javac или чем-то еще) или есть способ настроить Proguard, чтобы не выдавать этот ложный положительный результат?

1 Ответ

0 голосов
/ 27 января 2020

Это вызвано тем, что javac содержит постоянную:

javap -l -c -constants -cp THEJAR com.example.ProguardConstantFieldUsageDemo

выводит

...
0: ldc #3 // String I'm not dead!I agree
...

Таким образом, константа действительно не существует в байт-коде. Похоже, то же самое происходит и с нестатическими c и не финальными полями.

Решение состоит в том, чтобы сконфигурировать proguard для сохранения всех приватных полей:

-keepclassmembers class * {
  private <fields>;
}

Это также подавлять предупреждения о реальных мертвых полях, но это не большая проблема, потому что другие анализаторы состояния могут найти их, так как они являются частными.

...