use of de.fraunhofer.aisec.cpg.graph.statements.expressions.Literal in project cpg by Fraunhofer-AISEC.
the class VariableResolverJavaTest method initTests.
@BeforeAll
void initTests() throws ExecutionException, InterruptedException {
final String topLevelPath = "src/test/resources/variables_extended/java/";
List<String> fileNames = Arrays.asList("ScopeVariables.java", "ExternalClass.java");
List<File> fileLocations = fileNames.stream().map(fileName -> new File(topLevelPath + fileName)).collect(Collectors.toList());
TranslationConfiguration config = TranslationConfiguration.builder().sourceLocations(fileLocations.toArray(new File[fileNames.size()])).topLevel(new File(topLevelPath)).defaultPasses().defaultLanguages().debugParser(true).failOnError(true).build();
TranslationManager analyzer = TranslationManager.builder().config(config).build();
List<TranslationUnitDeclaration> tu = analyzer.analyze().get().getTranslationUnits();
List<Node> nodes = tu.stream().flatMap(tUnit -> SubgraphWalker.flattenAST(tUnit).stream()).collect(Collectors.toList());
List<CallExpression> calls = TestUtils.findByName(Util.filterCast(nodes, CallExpression.class), "printLog");
calls.sort(new NodeComparator());
List<RecordDeclaration> records = Util.filterCast(nodes, RecordDeclaration.class);
// Extract all Variable declarations and field declarations for matching
externalClass = TestUtils.getOfTypeWithName(nodes, RecordDeclaration.class, "variables_extended.ExternalClass");
externVarName = TestUtils.getSubnodeOfTypeWithName(externalClass, FieldDeclaration.class, "varName");
externStaticVarName = TestUtils.getSubnodeOfTypeWithName(externalClass, FieldDeclaration.class, "staticVarName");
outerClass = TestUtils.getOfTypeWithName(nodes, RecordDeclaration.class, "variables_extended.ScopeVariables");
outerVarName = outerClass.getFields().stream().filter(n -> n.getName().equals("varName")).findFirst().get();
outerStaticVarName = outerClass.getFields().stream().filter(n -> n.getName().equals("staticVarName")).findFirst().get();
outerImpThis = outerClass.getFields().stream().filter(n -> n.getName().equals("this")).findFirst().get();
// Inner class and its fields
innerClass = TestUtils.getOfTypeWithName(nodes, RecordDeclaration.class, "variables_extended.ScopeVariables.InnerClass");
innerVarName = innerClass.getFields().stream().filter(n -> n.getName().equals("varName")).findFirst().get();
innerStaticVarName = TestUtils.getSubnodeOfTypeWithName(innerClass, FieldDeclaration.class, "staticVarName");
innerImpThis = TestUtils.getSubnodeOfTypeWithName(innerClass, FieldDeclaration.class, "this");
innerImpOuter = TestUtils.getSubnodeOfTypeWithName(innerClass, FieldDeclaration.class, "ScopeVariables.this");
main = TestUtils.getSubnodeOfTypeWithName(outerClass, MethodDeclaration.class, "main");
outerFunction1 = outerClass.getMethods().stream().filter(method -> method.getName().equals("function1")).collect(Collectors.toList()).get(0);
forStatements = Util.filterCast(SubgraphWalker.flattenAST(outerFunction1), ForStatement.class);
// Functions i nthe outer and inner object
outerFunction2 = outerClass.getMethods().stream().filter(method -> method.getName().equals("function2")).collect(Collectors.toList()).get(0);
outerFunction3 = outerClass.getMethods().stream().filter(method -> method.getName().equals("function3")).collect(Collectors.toList()).get(0);
outerFunction4 = outerClass.getMethods().stream().filter(method -> method.getName().equals("function4")).collect(Collectors.toList()).get(0);
innerFunction1 = innerClass.getMethods().stream().filter(method -> method.getName().equals("function1")).collect(Collectors.toList()).get(0);
innerFunction2 = innerClass.getMethods().stream().filter(method -> method.getName().equals("function2")).collect(Collectors.toList()).get(0);
innerFunction3 = innerClass.getMethods().stream().filter(method -> method.getName().equals("function3")).collect(Collectors.toList()).get(0);
for (CallExpression call : calls) {
Expression first = call.getArguments().get(0);
String logId = ((Literal) first).getValue().toString();
Expression second = call.getArguments().get(1);
callParamMap.put(logId, second);
}
}
use of de.fraunhofer.aisec.cpg.graph.statements.expressions.Literal in project cpg by Fraunhofer-AISEC.
the class CallResolverTest method testScopedFunctionResolutionAfterRedeclaration.
void testScopedFunctionResolutionAfterRedeclaration(List<TranslationUnitDeclaration> result, List<CallExpression> calls) {
CallExpression fn = TestUtils.findByUniquePredicate(calls, c -> c.getLocation().getRegion().getStartLine() == 13);
Literal<?> literal7 = TestUtils.findByUniquePredicate(TestUtils.subnodesOfType(result, Literal.class), l -> l.getValue().equals(7));
assertEquals(1, fn.getInvokes().size());
assertFalse(fn.getInvokes().get(0).isImplicit());
assertEquals(2, fn.getInvokes().get(0).getLocation().getRegion().getStartLine());
assertEquals(1, fn.getArguments().size());
assertEquals(6, ((Literal) fn.getArguments().get(0)).getValue());
assertTrue(fn.getInvokes().get(0).getNextEOG().contains(literal7));
for (Node node : fn.getInvokes().get(0).getNextEOG()) {
assertTrue(node.equals(literal7) || literal7.getNextEOG().contains(node));
}
}
use of de.fraunhofer.aisec.cpg.graph.statements.expressions.Literal in project cpg by Fraunhofer-AISEC.
the class CallResolverTest method testDefaultArgumentsInDefinition.
@Test
void testDefaultArgumentsInDefinition() throws Exception {
List<TranslationUnitDeclaration> result = TestUtils.analyze(List.of(Path.of(topLevel.toString(), "defaultargs", "defaultInDefinition.cpp").toFile()), topLevel, true);
List<CallExpression> calls = TestUtils.subnodesOfType(result, CallExpression.class);
List<FunctionDeclaration> functionDeclarations = TestUtils.subnodesOfType(result, FunctionDeclaration.class);
FunctionDeclaration displayFunction = TestUtils.findByUniquePredicate(functionDeclarations, f -> f.getName().equals("display") && !f.isImplicit());
Literal<?> literalStar = TestUtils.findByUniquePredicate(TestUtils.subnodesOfType(result, Literal.class), l -> l.getValue().equals('*'));
Literal<?> literal3 = TestUtils.findByUniquePredicate(TestUtils.subnodesOfType(result, Literal.class), l -> l.getValue().equals(3));
// Check defaults edge of ParamVariableDeclaration
assertTrue(displayFunction.getDefaultParameters().get(0) instanceof Literal);
assertTrue(displayFunction.getDefaultParameters().get(1) instanceof Literal);
assertEquals('*', ((Literal) displayFunction.getDefaultParameters().get(0)).getValue());
assertEquals(3, ((Literal) displayFunction.getDefaultParameters().get(1)).getValue());
// Check call display();
CallExpression display = TestUtils.findByUniquePredicate(calls, c -> {
assert c.getCode() != null;
return c.getCode().equals("display();");
});
assertEquals(1, display.getInvokes().size());
assertEquals(displayFunction, display.getInvokes().get(0));
assertEquals(0, display.getArguments().size());
assertTrue(displayFunction.getNextEOG().contains(literalStar));
assertTrue(displayFunction.getNextEOG().contains(literal3));
assertTrue(literalStar.getNextEOG().contains(literal3));
for (Node node : displayFunction.getNextEOG()) {
assertTrue(node.equals(literal3) || node.equals(literalStar) || literal3.getNextEOG().contains(node));
}
// Check call display('#');
CallExpression displayHash = TestUtils.findByUniquePredicate(calls, c -> {
assert c.getCode() != null;
return c.getCode().equals("display('#');");
});
assertEquals(1, displayHash.getInvokes().size());
assertEquals(displayFunction, displayHash.getInvokes().get(0));
assertEquals(1, displayHash.getArguments().size());
assertTrue(displayHash.getArguments().get(0) instanceof Literal);
assertEquals('#', ((Literal) displayHash.getArguments().get(0)).getValue());
// Check call display('#');
CallExpression display$Count = TestUtils.findByUniquePredicate(calls, c -> {
assert c.getCode() != null;
return c.getCode().equals("display('$', count);");
});
assertEquals(1, display$Count.getInvokes().size());
assertEquals(displayFunction, display$Count.getInvokes().get(0));
assertTrue(display$Count.getArguments().get(0) instanceof Literal);
assertEquals('$', ((Literal) display$Count.getArguments().get(0)).getValue());
assertEquals("count", display$Count.getArguments().get(1).getName());
}
use of de.fraunhofer.aisec.cpg.graph.statements.expressions.Literal in project cpg by Fraunhofer-AISEC.
the class CallResolverTest method testScopedFunctionResolutionRedeclaration.
void testScopedFunctionResolutionRedeclaration(List<TranslationUnitDeclaration> result, List<CallExpression> calls) {
CallExpression fm1 = TestUtils.findByUniquePredicate(calls, c -> c.getLocation().getRegion().getStartLine() == 8);
assertEquals(1, fm1.getInvokes().size());
assertEquals(1, fm1.getArguments().size());
assertEquals(8, ((Literal) fm1.getArguments().get(0)).getValue());
CallExpression fm2 = TestUtils.findByUniquePredicate(calls, c -> c.getLocation().getRegion().getStartLine() == 10);
Literal<?> literal5 = TestUtils.findByUniquePredicate(TestUtils.subnodesOfType(result, Literal.class), l -> l.getValue().equals(5));
assertEquals(1, fm2.getInvokes().size());
assertEquals(9, fm2.getInvokes().get(0).getLocation().getRegion().getStartLine());
assertEquals(1, fm2.getArguments().size());
assertEquals(4, ((Literal) fm2.getArguments().get(0)).getValue());
assertTrue(fm2.getInvokes().get(0).getNextEOG().contains(literal5));
for (Node node : fm2.getInvokes().get(0).getNextEOG()) {
assertTrue(node.equals(literal5) || literal5.getNextEOG().contains(node));
}
}
use of de.fraunhofer.aisec.cpg.graph.statements.expressions.Literal in project cpg by Fraunhofer-AISEC.
the class VariableResolverCppTest method initTests.
@BeforeAll
void initTests() throws ExecutionException, InterruptedException {
final String topLevelPath = "src/test/resources/variables_extended/cpp/";
List<String> fileNames = Arrays.asList("scope_variables.cpp", "external_class.cpp");
List<File> fileLocations = fileNames.stream().map(fileName -> new File(topLevelPath + fileName)).collect(Collectors.toList());
TranslationConfiguration config = TranslationConfiguration.builder().sourceLocations(fileLocations.toArray(new File[fileNames.size()])).topLevel(new File(topLevelPath)).defaultPasses().debugParser(true).defaultLanguages().failOnError(true).loadIncludes(true).build();
TranslationManager analyzer = TranslationManager.builder().config(config).build();
List<TranslationUnitDeclaration> tu = analyzer.analyze().get().getTranslationUnits();
List<Node> nodes = tu.stream().flatMap(tUnit -> SubgraphWalker.flattenAST(tUnit).stream()).collect(Collectors.toList());
List<CallExpression> calls = TestUtils.findByName(Util.filterCast(nodes, CallExpression.class), "printLog");
calls.sort(new NodeComparator());
List<RecordDeclaration> records = Util.filterCast(nodes, RecordDeclaration.class);
// Extract all Variable declarations and field declarations for matching
externalClass = TestUtils.getOfTypeWithName(nodes, RecordDeclaration.class, "ExternalClass");
externVarName = TestUtils.getSubnodeOfTypeWithName(externalClass, FieldDeclaration.class, "varName");
externStaticVarName = TestUtils.getSubnodeOfTypeWithName(externalClass, FieldDeclaration.class, "staticVarName");
outerClass = TestUtils.getOfTypeWithName(nodes, RecordDeclaration.class, "ScopeVariables");
outerVarName = outerClass.getFields().stream().filter(n -> n.getName().equals("varName")).findFirst().get();
outerStaticVarName = outerClass.getFields().stream().filter(n -> n.getName().equals("staticVarName")).findFirst().get();
outerImpThis = outerClass.getFields().stream().filter(n -> n.getName().equals("this")).findFirst().get();
List<RecordDeclaration> classes = Util.filterCast(nodes, RecordDeclaration.class);
// Inner class and its fields
innerClass = TestUtils.getOfTypeWithName(nodes, RecordDeclaration.class, "ScopeVariables::InnerClass");
innerVarName = innerClass.getFields().stream().filter(n -> n.getName().equals("varName")).findFirst().get();
innerStaticVarName = innerClass.getFields().stream().filter(n -> n.getName().equals("staticVarName")).findFirst().get();
innerImpThis = innerClass.getFields().stream().filter(n -> n.getName().equals("this")).findFirst().get();
main = TestUtils.getOfTypeWithName(nodes, FunctionDeclaration.class, "main");
// Functions in the outer and inner object
outerFunction1 = outerClass.getMethods().stream().filter(method -> method.getName().equals("function1")).collect(Collectors.toList()).get(0);
forStatements = Util.filterCast(SubgraphWalker.flattenAST(outerFunction1), ForStatement.class);
outerFunction2 = outerClass.getMethods().stream().filter(method -> method.getName().equals("function2")).collect(Collectors.toList()).get(0);
outerFunction3 = outerClass.getMethods().stream().filter(method -> method.getName().equals("function3")).collect(Collectors.toList()).get(0);
outerFunction4 = outerClass.getMethods().stream().filter(method -> method.getName().equals("function4")).collect(Collectors.toList()).get(0);
outerFunction5 = outerClass.getMethods().stream().filter(method -> method.getName().equals("function5")).collect(Collectors.toList()).get(0);
innerFunction1 = innerClass.getMethods().stream().filter(method -> method.getName().equals("function1")).collect(Collectors.toList()).get(0);
innerFunction2 = innerClass.getMethods().stream().filter(method -> method.getName().equals("function2")).collect(Collectors.toList()).get(0);
for (CallExpression call : calls) {
Expression first = call.getArguments().get(0);
String logId = ((Literal) first).getValue().toString();
Expression second = call.getArguments().get(1);
callParamMap.put(logId, second);
}
}
Aggregations