Search in sources :

Example 1 with UCFG

use of org.sonar.ucfg.UCFG in project sonar-java by SonarSource.

the class UCFGJavaVisitor method buildUCfg.

private UCFG buildUCfg(MethodTree methodTree, CFG cfg) {
    String signature = signatureFor(methodTree.symbol());
    IdentifierGenerator idGenerator = new IdentifierGenerator(methodTree);
    UCFGBuilder builder = UCFGBuilder.createUCFGForMethod(signature);
    methodTree.parameters().stream().map(p -> idGenerator.lookupIdFor(p.symbol())).map(UCFGBuilder::variableWithId).forEach(builder::addMethodParam);
    BlockBuilder entryBlockBuilder = buildBasicBlock(cfg.entry(), methodTree, idGenerator);
    if (getAnnotatedStringParameters(methodTree).count() > 0) {
        builder.addStartingBlock(buildParameterAnnotationsBlock(methodTree, idGenerator, cfg));
        builder.addBasicBlock(entryBlockBuilder);
    } else {
        builder.addStartingBlock(entryBlockBuilder);
    }
    cfg.blocks().stream().filter(b -> !b.equals(cfg.entry())).forEach(b -> builder.addBasicBlock(buildBasicBlock(b, methodTree, idGenerator)));
    return builder.build();
}
Also used : JavaSymbol(org.sonar.java.resolve.JavaSymbol) Label(org.sonar.ucfg.Label) BaseTreeVisitor(org.sonar.plugins.java.api.tree.BaseTreeVisitor) JavaFileScanner(org.sonar.plugins.java.api.JavaFileScanner) Loggers(org.sonar.api.utils.log.Loggers) MemberSelectExpressionTree(org.sonar.plugins.java.api.tree.MemberSelectExpressionTree) PLUS(org.sonar.plugins.java.api.tree.Tree.Kind.PLUS) Map(java.util.Map) SyntaxToken(org.sonar.plugins.java.api.tree.SyntaxToken) Set(java.util.Set) Collectors(java.util.stream.Collectors) JavaFileScannerContext(org.sonar.plugins.java.api.JavaFileScannerContext) Sets(com.google.common.collect.Sets) List(java.util.List) UCFGtoProtobuf(org.sonar.ucfg.UCFGtoProtobuf) Stream(java.util.stream.Stream) MEMBER_SELECT(org.sonar.plugins.java.api.tree.Tree.Kind.MEMBER_SELECT) UCFGBuilder.variableWithId(org.sonar.ucfg.UCFGBuilder.variableWithId) AssignmentExpressionTree(org.sonar.plugins.java.api.tree.AssignmentExpressionTree) IdentifierTree(org.sonar.plugins.java.api.tree.IdentifierTree) Symbol(org.sonar.plugins.java.api.semantic.Symbol) ASSIGNMENT(org.sonar.plugins.java.api.tree.Tree.Kind.ASSIGNMENT) PLUS_ASSIGNMENT(org.sonar.plugins.java.api.tree.Tree.Kind.PLUS_ASSIGNMENT) UCFG(org.sonar.ucfg.UCFG) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ExpressionTree(org.sonar.plugins.java.api.tree.ExpressionTree) HashSet(java.util.HashSet) BlockBuilder(org.sonar.ucfg.UCFGBuilder.BlockBuilder) VariableTree(org.sonar.plugins.java.api.tree.VariableTree) UCFGBuilder(org.sonar.ucfg.UCFGBuilder) LiteralUtils(org.sonar.java.model.LiteralUtils) Nullable(javax.annotation.Nullable) Logger(org.sonar.api.utils.log.Logger) AnnotationTree(org.sonar.plugins.java.api.tree.AnnotationTree) BinaryExpressionTree(org.sonar.plugins.java.api.tree.BinaryExpressionTree) ReturnStatementTree(org.sonar.plugins.java.api.tree.ReturnStatementTree) LiteralTree(org.sonar.plugins.java.api.tree.LiteralTree) UCFGBuilder.call(org.sonar.ucfg.UCFGBuilder.call) METHOD_INVOCATION(org.sonar.plugins.java.api.tree.Tree.Kind.METHOD_INVOCATION) Tree(org.sonar.plugins.java.api.tree.Tree) Type(org.sonar.plugins.java.api.semantic.Type) File(java.io.File) MethodInvocationTree(org.sonar.plugins.java.api.tree.MethodInvocationTree) LocationInFile(org.sonar.ucfg.LocationInFile) CFG(org.sonar.java.cfg.CFG) VariableReadExtractor(org.sonar.java.cfg.VariableReadExtractor) Preconditions(com.google.common.base.Preconditions) Expression(org.sonar.ucfg.Expression) UCFGBuilder.constant(org.sonar.ucfg.UCFGBuilder.constant) MethodTree(org.sonar.plugins.java.api.tree.MethodTree) UCFGBuilder(org.sonar.ucfg.UCFGBuilder) BlockBuilder(org.sonar.ucfg.UCFGBuilder.BlockBuilder)

Example 2 with UCFG

use of org.sonar.ucfg.UCFG in project sonar-java by SonarSource.

the class UCFGJavaVisitorTest method ignore_parameter_annotations_for_non_string.

@Test
public void ignore_parameter_annotations_for_non_string() {
    Expression.Variable arg = UCFGBuilder.variableWithId("arg");
    UCFG expectedUCFG = UCFGBuilder.createUCFGForMethod("A#method(Ljava/lang/Integer;)Ljava/lang/String;").addMethodParam(arg).addBasicBlock(newBasicBlock("1").ret(constant("foo"), new LocationInFile(FILE_KEY, 1, 66, 1, 79))).build();
    assertCodeToUCfg("class A { String method(@javax.annotation.Nullable Integer arg) { return \"foo\";}}", expectedUCFG);
}
Also used : Expression(org.sonar.ucfg.Expression) UCFG(org.sonar.ucfg.UCFG) LocationInFile(org.sonar.ucfg.LocationInFile) Test(org.junit.Test)

Example 3 with UCFG

use of org.sonar.ucfg.UCFG in project sonar-java by SonarSource.

the class UCFGJavaVisitorTest method filter_invocation_unrelated_to_string.

@Test
public void filter_invocation_unrelated_to_string() {
    Expression.Variable arg = UCFGBuilder.variableWithId("arg");
    UCFG expectedUCFG = UCFGBuilder.createUCFGForMethod("A#method(Ljava/lang/String;)Ljava/lang/String;").addMethodParam(arg).addBasicBlock(newBasicBlock("1").ret(arg, new LocationInFile(FILE_KEY, 1, 61, 1, 72))).build();
    assertCodeToUCfg("class A { String method(String arg) {Object o; o.hashCode(); return arg;}}", expectedUCFG);
}
Also used : Expression(org.sonar.ucfg.Expression) UCFG(org.sonar.ucfg.UCFG) LocationInFile(org.sonar.ucfg.LocationInFile) Test(org.junit.Test)

Example 4 with UCFG

use of org.sonar.ucfg.UCFG in project sonar-java by SonarSource.

the class UCFGJavaVisitorTest method constructor_with_return.

@Test
public void constructor_with_return() {
    Expression.Variable arg = UCFGBuilder.variableWithId("arg");
    UCFG expectedUCFG = UCFGBuilder.createUCFGForMethod("A#<init>(Ljava/lang/String;)V").addMethodParam(arg).addBasicBlock(newBasicBlock("1").ret(constant("\"\""), new LocationInFile(FILE_KEY, 3, 4, 3, 11))).build();
    assertCodeToUCfg("class A { \n" + "  A(String arg) { \n" + "    return;\n" + "  }\n" + "}", expectedUCFG);
}
Also used : Expression(org.sonar.ucfg.Expression) UCFG(org.sonar.ucfg.UCFG) LocationInFile(org.sonar.ucfg.LocationInFile) Test(org.junit.Test)

Example 5 with UCFG

use of org.sonar.ucfg.UCFG in project sonar-java by SonarSource.

the class UCFGJavaVisitorTest method build_concatenate_elements.

@Test
public void build_concatenate_elements() {
    Expression.Variable arg = UCFGBuilder.variableWithId("arg");
    Expression.Variable var = UCFGBuilder.variableWithId("%0");
    UCFG expectedUCFG = UCFGBuilder.createUCFGForMethod("A#method(Ljava/lang/String;)Ljava/lang/String;").addMethodParam(arg).addBasicBlock(newBasicBlock("1").assignTo(var, call("__concat").withArgs(constant("Myconst"), arg), new LocationInFile(FILE_KEY, 1, 43, 1, 56)).ret(var, new LocationInFile(FILE_KEY, 1, 36, 1, 57))).build();
    assertCodeToUCfg("class A {String method(String arg) {return \"Myconst\"+arg;}}", expectedUCFG);
    expectedUCFG = UCFGBuilder.createUCFGForMethod("A#method(Ljava/lang/String;)Ljava/lang/String;").addMethodParam(arg).addBasicBlock(newBasicBlock("1").assignTo(arg, call("__concat").withArgs(arg, constant("someConst")), new LocationInFile(FILE_KEY, 1, 43, 1, 59)).ret(arg, new LocationInFile(FILE_KEY, 1, 36, 1, 60))).build();
    assertCodeToUCfg("class A {String method(String arg) {return arg+=\"someConst\";}}", expectedUCFG);
}
Also used : Expression(org.sonar.ucfg.Expression) UCFG(org.sonar.ucfg.UCFG) LocationInFile(org.sonar.ucfg.LocationInFile) Test(org.junit.Test)

Aggregations

UCFG (org.sonar.ucfg.UCFG)19 LocationInFile (org.sonar.ucfg.LocationInFile)18 Expression (org.sonar.ucfg.Expression)17 Test (org.junit.Test)16 File (java.io.File)2 CFG (org.sonar.java.cfg.CFG)2 Preconditions (com.google.common.base.Preconditions)1 Sets (com.google.common.collect.Sets)1 IOException (java.io.IOException)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 List (java.util.List)1 Map (java.util.Map)1 Set (java.util.Set)1 Collectors (java.util.stream.Collectors)1 Stream (java.util.stream.Stream)1 Nullable (javax.annotation.Nullable)1 Logger (org.sonar.api.utils.log.Logger)1 Loggers (org.sonar.api.utils.log.Loggers)1