Я пишу пользовательский плагин Sonar Qube, и как часть этого плагина я должен заменить переменные фактическими значениями внутри метода, а затем продолжить анализ.
Если функция напрямую возвращает мне литерал, тогда все в порядке (см. Первый код), но если функция возвращает мне переменную-член, и эта переменная-член устанавливается каким-либо другим методом, то я не могуполучить это. (См. второй код)
То, что я могу сделать до сих пор, выглядит следующим образом:
class VariableReplacement {
void foo2(int value) {
Model model = new Model();
String tableName=model.getTableName();
k = method("something "+ tableName);// Noncompliant
}
class Model {
public Model() {
}
public String getTableName() {
return "sample";
}
}
В приведенном выше коде, k = метод ("что-то"+ tableName); , я могу заменить переменную tableName на sample , которая возвращается методом getTableName () .
Но теперь у меня есть следующая ситуация, когда переменная tableName в классе Model задается методом сеттера, и я пытаюсь получить переменную с помощью метода getTableName () и он не работает
class VariableReplacement1 {
void foo2(int value) {
Model model = new Model();
model.setTableName("sample");
String tableName=model.getTableName();
k = method("something"+ tableName);// Noncompliant
}
class Model {
private String tableName;
public Model() {
}
public String getTableName() {
return tableName;
}
public void setTableName(String tabName) {
this.tableName=tabName;
}
}
}
Хорошо, есть концепция SymbolicExecution и CFG (ControlFlowGraph), но не ясно, как решить эту проблему.