Commit ae3d1bc5 authored by Paff's avatar Paff
Browse files

workflows for filters

wrapper tool
TODO: Test tool
parent 3071f061
......@@ -104,6 +104,14 @@
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>secarc.WrapperMontiSecArcAnalysisTool</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>grammars</id>
......
......@@ -75,14 +75,14 @@ public final class MontiSecArcAnalysis extends MontiSecArc {
//Transformation-Workflow before coco checks (can be called by "preCheckTransformation" on the command line)
addExecutionUnit("preCheckTransformation", new PreCoCoCheckMontiSecArcTransformationWorkflow<MontiSecArcRoot>(LANGUAGE_ROOT));
//Workflow for analysis
this.addAnalysisWorkflow(analysisConfPath, analysisParameter);
//Workflow for analysis with trustlevel
this.addTrustlevelWhatIfWorkflow(analysisParameter, analysisConfPath);
this.addFilterTrustlevelWorkflow(analysisParameter, analysisConfPath);
//Workflow for analysis with critical ports
this.addCriticalPortWhatIfWorkflow(analysisConfPath);
this.addFilterCriticalPortWorkflow(analysisConfPath);
//Workflow for analysis
this.addAnalysisWorkflow(analysisConfPath, analysisParameter);
}
/**
......@@ -97,7 +97,11 @@ public final class MontiSecArcAnalysis extends MontiSecArc {
//AnalysisCreator
analysisWorkflow.setAnalysis(MontiSecArcAnalysisCreator.createAnalysis(analysisConfPath));
//AnalysisConfiguratin
analysisWorkflow.setAnalysisConfiguration(MontiSecArcAnalysisCreator.createConfig());
if(analysisConfPath != null && !analysisConfPath.isEmpty()) {
analysisWorkflow.setAnalysisConfiguration(MontiSecArcAnalysisCreator.createConfig());
} else {
analysisWorkflow.setAnalysisConfiguration(MontiSecArcAnalysisCreator.createConfig(analysisConfPath));
}
//AnalysisParaemter
analysisWorkflow.setAnalysisParameter(analysisParameter);
//Add Workflow for Analysis for advanced users
......@@ -115,15 +119,10 @@ public final class MontiSecArcAnalysis extends MontiSecArc {
*
* @param analysisConfPath Configuration file path
*/
private void addCriticalPortWhatIfWorkflow(String analysisConfPath) {
private void addFilterCriticalPortWorkflow(String analysisConfPath) {
AnalysisCriticalPortTransformationWorkflow<MontiSecArcRoot> criticalPortTransformationWorkflow = new AnalysisCriticalPortTransformationWorkflow<MontiSecArcRoot>(
MontiSecArcRoot.class);
criticalPortTransformationWorkflow.setAdvanced(false);
criticalPortTransformationWorkflow.setAnalysisConfPath(analysisConfPath);
addExecutionUnit(MontiSecArcConstants.ANALYSIS_WORKFLOW_BEGINNERS_WHAT_IF_CRITICAL_PORT, criticalPortTransformationWorkflow);
criticalPortTransformationWorkflow.setAdvanced(true);
addExecutionUnit(MontiSecArcConstants.ANALYSIS_WORKFLOW_BEGINNERS_WHAT_IF_CRITICAL_PORT, criticalPortTransformationWorkflow);
addExecutionUnit(MontiSecArcConstants.FILTER_CRITICAL_PORT, criticalPortTransformationWorkflow);
}
/**
......@@ -132,15 +131,10 @@ public final class MontiSecArcAnalysis extends MontiSecArc {
* @param analysisParameter Referenced components for what if analysis
* @param analysisConfPath Configuration file path
*/
private void addTrustlevelWhatIfWorkflow(List<String> analysisParameter, String analysisConfPath) {
private void addFilterTrustlevelWorkflow(List<String> analysisParameter, String analysisConfPath) {
AnalysisTrustlevelTransformationWorkflow<MontiSecArcRoot> trustlevelTransformationWorkflow = new AnalysisTrustlevelTransformationWorkflow<MontiSecArcRoot>(MontiSecArcRoot.class);
trustlevelTransformationWorkflow.setAnalysisParameter(analysisParameter);
trustlevelTransformationWorkflow.setAdvanced(false);
trustlevelTransformationWorkflow.setAnalysisConfPath(analysisConfPath);
addExecutionUnit(MontiSecArcConstants.ANALYSIS_WORKFLOW_BEGINNERS_WHAT_IF_TRUSTLEVEL, trustlevelTransformationWorkflow);
trustlevelTransformationWorkflow.setAdvanced(true);
addExecutionUnit(MontiSecArcConstants.ANALYSIS_WORKFLOW_ADVANCED_WHAT_IF_TRUSTLEVEL, trustlevelTransformationWorkflow);
addExecutionUnit(MontiSecArcConstants.FILTER_TRUSTLEVEL, trustlevelTransformationWorkflow);
}
/**
......
......@@ -101,11 +101,7 @@ public class MontiSecArcAnalysisTool extends ETSTool {
List<String> cleanedArguments = new ArrayList<String>();
boolean isAnalysisParameter = false;
boolean isAnalysisConfPath = false;
for(String argument : arguments) {
if(argument.equals(MontiSecArcConstants.ANALYSIS_CIRITICAL_PORTS)) {
continue;
}
for(String argument : arguments) {
if(argument.equals(MontiSecArcConstants.ANALYSIS_WORKFLOW_BEGINNERS) || argument.equals(MontiSecArcConstants.ANALYSIS_WORKFLOW_ADVANCED)) {
isAnalysisParameter = true;
cleanedArguments.add(argument);
......@@ -155,7 +151,12 @@ public class MontiSecArcAnalysisTool extends ETSTool {
// set default CoCos
Map<String, Type> cocoConfig = MontiSecArcContextConditionCreator.createConfig();
cocoConfig.putAll(MontiSecArcAnalysisCreator.createConfig());
if(analysisConfPath != null && !analysisConfPath.isEmpty()) {
cocoConfig.putAll(MontiSecArcAnalysisCreator.createConfig(analysisConfPath));
} else {
cocoConfig.putAll(MontiSecArcAnalysisCreator.createConfig());
}
setCocoConfiguration(cocoConfig);
}
......
......@@ -31,16 +31,6 @@ import mc.umlp.common._ast.UMLPNode;
*/
public class AnalysisCriticalPortTransformationWorkflow<T extends MontiSecArcRoot> extends DSLWorkflow<T> {
/**
* Output for beginner or advanced users
*/
boolean advanced = false;
/**
* Path of configuration file
*/
String analysisConfPath = "";
/**
* @param responsibleClass class of the dsl root
*/
......@@ -98,31 +88,7 @@ public class AnalysisCriticalPortTransformationWorkflow<T extends MontiSecArcRoo
node.delete();
}
}
//Analysis for transformed Entries
//Workflow for Analysis
MontiSecArcAnalysisWorkflow<MontiSecArcRoot> analysisTransformWorkflow = new MontiSecArcAnalysisWorkflow<MontiSecArcRoot>(MontiSecArcRoot.class);
//AnalysisCreator
analysisTransformWorkflow.setAnalysis(MontiSecArcAnalysisCreator.createAnalysis(analysisConfPath));
//AnalysisConfiguratin
analysisTransformWorkflow.setAnalysisConfiguration(MontiSecArcAnalysisCreator.createConfig());
//Visitor for Analysis
MontiSecArcAnalysisVisitor analysisTransfromVisitor = new MontiSecArcAnalysisVisitor();
analysisTransfromVisitor.setAdvanced(advanced);
analysisTransformWorkflow.run(dslroot);
//Set original AST
dslroot.setAst(astCopy);
}
public void setAdvanced(boolean advanced) {
this.advanced = advanced;
}
public void setAnalysisConfPath(String analysisConfPath) {
this.analysisConfPath = analysisConfPath;
}
}
......@@ -36,16 +36,6 @@ public class AnalysisTrustlevelTransformationWorkflow<T extends MontiSecArcRoot>
*/
private List<String> analysisParameter;
/**
* advanced or beginner output
*/
boolean advanced = false;
/**
* path to configuration file
*/
String analysisConfPath = "";
/**
* @param responsibleClass class of the dsl root
*/
......@@ -83,43 +73,17 @@ public class AnalysisTrustlevelTransformationWorkflow<T extends MontiSecArcRoot>
AnalysisTrustlevelTransformationVisitor visitor = new AnalysisTrustlevelTransformationVisitor();
visitor.setAnalysisParameter(analysisParameter);
visitor.setResolver(resolver);
visitor.setNodesToNameSpaces(nodesToNameSpaces);
visitor.setNodesToNameSpaces(nodesToNameSpaces);
visitor.isReverse(false);
InheritanceVisitor.run(visitor, dslroot.getAst());
Map<String, TrustlevelEntry> actualTrustlevels = visitor.getActualTrustlevel();
//Analysis for transformed Entries
//Workflow for Analysis
MontiSecArcAnalysisWorkflow<MontiSecArcRoot> analysisTransformWorkflow = new MontiSecArcAnalysisWorkflow<MontiSecArcRoot>(MontiSecArcRoot.class);
//AnalysisCreator
analysisTransformWorkflow.setAnalysis(MontiSecArcAnalysisCreator.createAnalysis(analysisConfPath));
//AnalysisConfiguratin
analysisTransformWorkflow.setAnalysisConfiguration(MontiSecArcAnalysisCreator.createConfig());
//Visitor for Analysis
MontiSecArcAnalysisVisitor analysisTransfromVisitor = new MontiSecArcAnalysisVisitor();
analysisTransfromVisitor.setAdvanced(advanced);
analysisTransfromVisitor.setAnalysisParameter(analysisParameter);
analysisTransformWorkflow.run(dslroot);
//Reverse
visitor.isReverse(true);
visitor.setActualTrustlevel(actualTrustlevels);
InheritanceVisitor.run(visitor, dslroot.getAst());
}
public void setAnalysisParameter(List<String> analysisParameter) {
this.analysisParameter = analysisParameter;
}
public void setAdvanced(boolean advanced) {
this.advanced = advanced;
}
public void setAnalysisConfPath(String analysisConfPath) {
this.analysisConfPath = analysisConfPath;
}
}
......@@ -35,7 +35,7 @@ public class MontiSecArcAnalysisTransformationCriticalPortTest extends TestWithS
assertTrue(toolTransformation.run());
MontiSecArcRoot rootTransformed = (MontiSecArcRoot) initSymtabForRoot(toolTransformation, "secarc.analysis.connector.EncryptedPathEndInLowTrustlevel");
if(root.getAst().deepEquals(rootTransformed.getAst())){
if(!root.getAst().deepEquals(rootTransformed.getAst())){
assertTrue(true);
} else {
assertTrue(false);
......@@ -62,7 +62,7 @@ public class MontiSecArcAnalysisTransformationCriticalPortTest extends TestWithS
assertTrue(toolTransformation.run());
MontiSecArcRoot rootTransformed = (MontiSecArcRoot) initSymtabForRoot(toolTransformation, "secarc.analysis.criticalport.CriticalPort");
if(root.getAst().deepEquals(rootTransformed.getAst())){
if(!root.getAst().deepEquals(rootTransformed.getAst())){
assertTrue(true);
} else {
assertTrue(false);
......
......@@ -61,7 +61,7 @@ public class MontiSecArcAnalysisTransformationTrustlevelTest extends TestWithSym
assertEquals(true, ((SecComponentEntry) entry).getTrustlevel().get().isPositive());
}
assertEquals(11, handler.getWarnings().size());
assertEquals(5, handler.getWarnings().size());
}
/**
......@@ -93,7 +93,7 @@ public class MontiSecArcAnalysisTransformationTrustlevelTest extends TestWithSym
assertEquals(false, ((SecComponentEntry) entry).getTrustlevel().isPresent());
}
assertEquals(4, handler.getWarnings().size());
assertEquals(2, handler.getWarnings().size());
}
/**
......@@ -213,7 +213,7 @@ public class MontiSecArcAnalysisTransformationTrustlevelTest extends TestWithSym
}
assertEquals(null, entry);
assertEquals(11, handler.getWarnings().size());
assertEquals(5, handler.getWarnings().size());
}
protected ComponentEntry existComponent(String parameter, NameSpace np) throws AmbigousException {
......
......@@ -38,7 +38,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
errorCodes.add(MontiSecArcAnalysisErrorCodes.ReasonDifferingTrustlevel);
errorCodes.add(MontiSecArcAnalysisErrorCodes.TaintTracking);
assertEquals(11, handler.getWarnings().size());
assertEquals(5, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -51,7 +51,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
tool.init();
assertTrue(tool.run());
assertEquals(7, handler.getWarnings().size());
assertEquals(3, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -64,7 +64,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
tool.init();
assertTrue(tool.run());
assertEquals(13, handler.getWarnings().size());
assertEquals(6, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -77,7 +77,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
tool.init();
assertTrue(tool.run());
assertEquals(7, handler.getWarnings().size());
assertEquals(3, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -100,7 +100,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
errorCodes.add(MontiSecArcAnalysisErrorCodes.UnencryptedConnectorThroughLowTrustlevel);
errorCodes.add(MontiSecArcAnalysisErrorCodes.FilterWithHigherTrust);
assertEquals(8, handler.getWarnings().size());
assertEquals(4, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -113,7 +113,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
tool.init();
assertTrue(tool.run());
assertEquals(5, handler.getWarnings().size());
assertEquals(2, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -135,7 +135,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
errorCodes.add(MontiSecArcAnalysisErrorCodes.ReviewedConfiguration);
errorCodes.add(MontiSecArcAnalysisErrorCodes.ListThirdPartyComponents);
assertEquals(6, handler.getWarnings().size());
assertEquals(3, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -150,7 +150,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
errorCodes.add(MontiSecArcAnalysisErrorCodes.ListThirdPartyComponents);
assertEquals(4, handler.getWarnings().size());
assertEquals(2, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -175,7 +175,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
errorCodes.add(MontiSecArcAnalysisErrorCodes.RoleAccess);
errorCodes.add(MontiSecArcAnalysisErrorCodes.ListThirdPartyComponents);
assertEquals(24, handler.getWarnings().size());
assertEquals(11, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -197,7 +197,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
errorCodes.add(MontiSecArcAnalysisErrorCodes.ListOutgoingPorts);
errorCodes.add(MontiSecArcAnalysisErrorCodes.ListAllCriticalPorts);
assertEquals(4, handler.getWarnings().size());
assertEquals(2, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -210,7 +210,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
tool.init();
assertTrue(tool.run());
assertEquals(4, handler.getWarnings().size());
assertEquals(2, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -223,7 +223,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
tool.init();
assertTrue(tool.run());
assertEquals(4, handler.getWarnings().size());
assertEquals(2, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -246,7 +246,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
errorCodes.add(MontiSecArcAnalysisErrorCodes.DerivedRolesPort);
errorCodes.add(MontiSecArcAnalysisErrorCodes.RoleAccess);
assertEquals(11, handler.getWarnings().size());
assertEquals(5, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -259,7 +259,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
tool.init();
assertTrue(tool.run());
assertEquals(12, handler.getWarnings().size());
assertEquals(6, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -272,7 +272,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
tool.init();
assertTrue(tool.run());
assertEquals(5, handler.getWarnings().size());
assertEquals(2, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -295,7 +295,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
errorCodes.add(MontiSecArcAnalysisErrorCodes.ReasonDifferingTrustlevel);
errorCodes.add(MontiSecArcAnalysisErrorCodes.DerivedTrustlevel);
assertEquals(4, handler.getWarnings().size());
assertEquals(2, handler.getWarnings().size());
for (ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -310,7 +310,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
tool.init();
assertTrue(tool.run());
assertEquals(4, handler.getWarnings().size());
assertEquals(2, handler.getWarnings().size());
for (ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......@@ -331,7 +331,7 @@ public class MontiSecArcAnalysisWhatIfTrustlevelTest extends TestWithSymtabAnaly
errorCodes.add(MontiSecArcAnalysisErrorCodes.TrustlevelForTrustlevelrelation);
errorCodes.add(MontiSecArcAnalysisErrorCodes.DerivedTrustlevel);
assertEquals(9, handler.getWarnings().size());
assertEquals(4, handler.getWarnings().size());
for(ProblemReport error : handler.getErrors()) {
assertTrue(errorCodes.contains(error.getErrorcode()));
}
......
......@@ -99,9 +99,9 @@ public class TestWithSymtabAnalysis<T extends ETSTool> extends
ARG_SYNTHESIS, "arcd", WF_PRE_CHECK_TRAFO,
ARG_SYNTHESIS, Parameters.ALL, WF_RUN_CHECK,
//Uses analysis workflow
ARG_SYNTHESIS, "secarc", MontiSecArcConstants.ANALYSIS_WORKFLOW_BEGINNERS, whatIfElement,
MontiSecArcConstants.ARG_ANALYSISCONFPATH, "/home/user/workspace/MA-Paff/03.Implementierung/montiSecArcAnalysis/src/main/conf/Analysis_Conf.txt",
ARG_SYNTHESIS, "secarc", MontiSecArcConstants.ANALYSIS_WORKFLOW_BEGINNERS_WHAT_IF_TRUSTLEVEL};
ARG_SYNTHESIS, "secarc", MontiSecArcConstants.FILTER_TRUSTLEVEL,
ARG_SYNTHESIS, "secarc", MontiSecArcConstants.ANALYSIS_WORKFLOW_BEGINNERS,};
List<String> argsAsList = new LinkedList<String>();
argsAsList.addAll(Arrays.asList(args));
for (String mp : additionalModelPath) {
......@@ -138,8 +138,8 @@ public class TestWithSymtabAnalysis<T extends ETSTool> extends
ARG_SYNTHESIS, "arcd", WF_PRE_CHECK_TRAFO,
ARG_SYNTHESIS, Parameters.ALL, WF_RUN_CHECK,
//Uses analysis workflow
ARG_SYNTHESIS, "secarc", MontiSecArcConstants.ANALYSIS_WORKFLOW_BEGINNERS,
ARG_SYNTHESIS, "secarc", MontiSecArcConstants.ANALYSIS_WORKFLOW_BEGINNERS_WHAT_IF_CRITICAL_PORT,};
ARG_SYNTHESIS, "secarc", MontiSecArcConstants.FILTER_CRITICAL_PORT,
ARG_SYNTHESIS, "secarc", MontiSecArcConstants.ANALYSIS_WORKFLOW_BEGINNERS,};
List<String> argsAsList = new LinkedList<String>();
argsAsList.addAll(Arrays.asList(args));
for (String mp : additionalModelPath) {
......
......@@ -87,35 +87,20 @@ public final class MontiSecArcConstants extends Interfaces2Constants {
public static final String ANALYSIS_WORKFLOW_BEGINNERS = "secAnalysisBeginners";
/**
* Workflow name for analysis as beginner What if trustevel
* Workflow name for trustevel filter
*/
public static final String ANALYSIS_WORKFLOW_BEGINNERS_WHAT_IF_TRUSTLEVEL = "secAnalysisBeginnersWhatIfTrustlevel";
public static final String FILTER_TRUSTLEVEL = "secFilterTrustlevel";
/**
* Workflow name for analysis as beginner What if critical port
* Workflow name for critical port filter
*/
public static final String ANALYSIS_WORKFLOW_BEGINNERS_WHAT_IF_CRITICAL_PORT = "secAnalysisBeginnersWhatIfCriticalPort";
public static final String FILTER_CRITICAL_PORT = "secFilterCriticalPort";
/**
* Workflow name for analysis as advanced user
*/
public static final String ANALYSIS_WORKFLOW_ADVANCED = "secAnalysisAdvanced";
/**
* Workflow name for analysis as advanced user What if trustlevel
*/
public static final String ANALYSIS_WORKFLOW_ADVANCED_WHAT_IF_TRUSTLEVEL = "secAnalysisAdvancedWhatIfTrustlevel";
/**
* Workflow name for analysis as advanced user What if trustlevel
*/
public static final String ANALYSIS_WORKFLOW_ADVANCED_WHAT_IF_CRITICAL_PORT = "secAnalysisAdvancedWhatIfCriticalPort";
/**
* Parameter, which activates analysis for critical ports
*/
public static final String ANALYSIS_CIRITICAL_PORTS = "-critical";
/**
* List of MontiSecArc AST nodes that have public visibility in the symbol table.
*/
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment