在编写声纳规则(Java)时,我找不到一种方法来检测对类成员的访问.
例:
class SomeClass {
Object field;
}
class SomeOtherClass {
SomeClass instance = new SomeClass();
void method(){
Objects.requireNonNull(instance.field);
}
}
在此示例中,SomeOtherClass.method()访问SomeClass的受包保护的成员.
我找不到合适的org.sonar.plugins.java.api.tree.TreeVisitor方法来检测它.
我的第一个猜测是使用
BaseTreeVisitor.visitMemberSelectExpression(MemberSelectExpressionTree))
但它没有像我预期的那样奏效.
我将代码提交到https://github.com/arxes-tolina/sonar-plugins/
并且仅使用调试输出实现了UnexpectedAccessCheck.visitMemberSelectExpression(MemberSelectExpressionTree).运行测试利益到控制台上的某些行:
[main] DEBUG d.t.s.p.v.c.UnexpectedAccessCheck - visitMemberSelectExpression invoked. Name of the symbol of identifier: !unknownSymbol!
可能是,这个问题与此有关
Proper way for getting annotations of Java-Methods in custom Sonar rules?
我使用3.7.1的sonar-java-plugin和5.1的sonar-plugin-api.
你有什么暗示吗?
解决方法:
您应该为此使用语义API.在您要检查的标识符上(在您的案例字段中,您应该通过memberSelectExpression访问)使用IdentifierTree的symbol()方法获取关联的符号.
在返回的符号上,您可以使用isPackageVisibility()方法来确定此字段的可见性(您还有许多其他方法来处理符号).