Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
naomod
Model Driven Engineering (MDE)
Source Code Analyzer
Commits
fc457e14
Commit
fc457e14
authored
Nov 21, 2019
by
Raphael PAGE
Committed by
Gerson SUNYE
Nov 21, 2019
Browse files
Avoid print stack trace
parent
5e189a60
Changes
5
Hide whitespace changes
Inline
Side-by-side
.gitignore
View file @
fc457e14
...
...
@@ -8,3 +8,4 @@ target/
*.versionsBackup
*.asm
/metrics.xmi
analysis.launch
View file @
fc457e14
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration
type=
"org.eclipse.m2m.atl.adt.launching.atlTransformation"
>
<stringAttribute
key=
"ATL File Name"
value=
"/
Source Code Analyzer
/src/main/atl/analysis.atl"
/>
<stringAttribute
key=
"ATL File Name"
value=
"/
projet-2019
/src/main/atl/analysis.atl"
/>
<stringAttribute
key=
"ATL VM"
value=
"EMF-specific VM"
/>
<stringAttribute
key=
"ATL_COMPILER"
value=
"atl2006"
/>
<booleanAttribute
key=
"IS_REFINING"
value=
"false"
/>
<mapAttribute
key=
"Input"
>
<mapEntry
key=
"IN"
value=
"java"
/>
</mapAttribute>
<mapAttribute
key=
"Libs"
>
<mapEntry
key=
"codestyle"
value=
"/Source Code Analyzer/src/main/atl/codestyle.asm"
/>
<mapEntry
key=
"design"
value=
"/Source Code Analyzer/src/main/atl/design.asm"
/>
<mapEntry
key=
"multithreading"
value=
"/Source Code Analyzer/src/main/atl/multithreading.asm"
/>
<mapEntry
key=
"performance"
value=
"/Source Code Analyzer/src/main/atl/performance.asm"
/>
<mapEntry
key=
"bestPractices"
value=
"/projet-2019/src/main/atl/bestPractices.asm"
/>
<mapEntry
key=
"codestyle"
value=
"/projet-2019/src/main/atl/codestyle.asm"
/>
<mapEntry
key=
"design"
value=
"/projet-2019/src/main/atl/design.asm"
/>
<mapEntry
key=
"multithreading"
value=
"/projet-2019/src/main/atl/multithreading.asm"
/>
<mapEntry
key=
"performance"
value=
"/projet-2019/src/main/atl/performance.asm"
/>
</mapAttribute>
<mapAttribute
key=
"Model Handler"
>
<mapEntry
key=
"java"
value=
"EMF"
/>
...
...
@@ -42,13 +42,13 @@
<mapEntry
key=
"OUT"
value=
"smm"
/>
</mapAttribute>
<mapAttribute
key=
"Path"
>
<mapEntry
key=
"IN"
value=
"/
Source Code Analyzer/input/too-many-methods
.xmi"
/>
<mapEntry
key=
"OUT"
value=
"/
Source Code Analyzer
/metrics.xmi"
/>
<mapEntry
key=
"IN"
value=
"/
projet-2019/input/avoid-print-stack-trace
.xmi"
/>
<mapEntry
key=
"OUT"
value=
"/
projet-2019
/metrics.xmi"
/>
<mapEntry
key=
"java"
value=
"uri:http://www.eclipse.org/MoDisco/Java/0.2.incubation/java"
/>
<mapEntry
key=
"smm"
value=
"uri:http://www.eclipse.org/MoDisco/SMM/1.0.Beta2/smm"
/>
</mapAttribute>
<listAttribute
key=
"Superimpose"
/>
<stringAttribute
key=
"bad_container_name"
value=
"/
Source Code Analyzer
/analysis.launch"
/>
<stringAttribute
key=
"bad_container_name"
value=
"/
projet-2019
/analysis.launch"
/>
<listAttribute
key=
"org.eclipse.debug.ui.favoriteGroups"
>
<listEntry
value=
"org.eclipse.debug.ui.launchGroup.run"
/>
</listAttribute>
...
...
input/avoid-print-stack-trace.xmi
0 → 100644
View file @
fc457e14
<?xml version="1.0" encoding="ASCII"?>
<java:Model
xmi:version=
"2.0"
xmlns:xmi=
"http://www.omg.org/XMI"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xmlns:java=
"http://www.eclipse.org/MoDisco/Java/0.2.incubation/java"
name=
"avoidPrintStackTrace"
>
<ownedElements
name=
"avoidPrintStackTrace"
>
<ownedElements
xsi:type=
"java:ClassDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"Main"
>
<modifier
visibility=
"public"
/>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"main"
>
<modifier
visibility=
"public"
static=
"true"
/>
<body
originalCompilationUnit=
"//@compilationUnits.0"
>
<statements
xsi:type=
"java:TryStatement"
originalCompilationUnit=
"//@compilationUnits.0"
>
<body
originalCompilationUnit=
"//@compilationUnits.0"
>
<comments
xsi:type=
"java:LineComment"
originalCompilationUnit=
"//@compilationUnits.0"
content=
"// do something"
enclosedByParent=
"true"
/>
</body>
<catchClauses
originalCompilationUnit=
"//@compilationUnits.0"
>
<exception
originalCompilationUnit=
"//@compilationUnits.0"
name=
"e"
usageInVariableAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.0/@catchClauses.0/@body/@statements.0/@expression/@expression"
>
<modifier/>
<type
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.3"
/>
</exception>
<body
originalCompilationUnit=
"//@compilationUnits.0"
>
<statements
xsi:type=
"java:ExpressionStatement"
originalCompilationUnit=
"//@compilationUnits.0"
>
<expression
xsi:type=
"java:MethodInvocation"
originalCompilationUnit=
"//@compilationUnits.0"
method=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.4/@bodyDeclarations.0"
>
<expression
xsi:type=
"java:SingleVariableAccess"
variable=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.0/@catchClauses.0/@exception"
/>
</expression>
</statements>
</body>
</catchClauses>
</statements>
</body>
<parameters
originalCompilationUnit=
"//@compilationUnits.0"
name=
"args"
>
<modifier/>
<type
type=
"//@orphanTypes.9"
/>
</parameters>
<returnType
type=
"//@orphanTypes.5"
/>
</bodyDeclarations>
</ownedElements>
</ownedElements>
<ownedElements
name=
"java"
proxy=
"true"
>
<ownedPackages
name=
"lang"
proxy=
"true"
>
<ownedElements
xsi:type=
"java:ClassDeclaration"
name=
"String"
proxy=
"true"
usagesInTypeAccess=
"//@orphanTypes.9/@elementType"
>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.0"
/>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.1"
/>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.2"
/>
</ownedElements>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"Comparable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0/@superInterfaces.1"
>
<typeParameters
name=
"T"
proxy=
"true"
/>
</ownedElements>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"CharSequence"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0/@superInterfaces.2"
/>
<ownedElements
xsi:type=
"java:ClassDeclaration"
name=
"Exception"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.0/@catchClauses.0/@exception/@type"
>
<superClass
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.4"
/>
</ownedElements>
<ownedElements
xsi:type=
"java:ClassDeclaration"
name=
"Throwable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.3/@superClass"
>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
name=
"printStackTrace"
proxy=
"true"
usages=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.0/@catchClauses.0/@body/@statements.0/@expression"
/>
<superInterfaces
type=
"//@ownedElements.1/@ownedPackages.1/@ownedElements.0"
/>
</ownedElements>
</ownedPackages>
<ownedPackages
name=
"io"
proxy=
"true"
>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"Serializable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0/@superInterfaces.0 //@ownedElements.1/@ownedPackages.0/@ownedElements.4/@superInterfaces.0"
/>
</ownedPackages>
</ownedElements>
<orphanTypes
xsi:type=
"java:PrimitiveTypeInt"
name=
"int"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeLong"
name=
"long"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeFloat"
name=
"float"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeDouble"
name=
"double"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeBoolean"
name=
"boolean"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeVoid"
name=
"void"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@returnType"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeChar"
name=
"char"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeShort"
name=
"short"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeByte"
name=
"byte"
/>
<orphanTypes
xsi:type=
"java:ArrayType"
name=
"java.lang.String[]"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@parameters.0/@type"
dimensions=
"1"
>
<elementType
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
</orphanTypes>
<compilationUnits
name=
"Main.java"
originalFilePath=
"/home/raphael/eclipse/workspaceGersonPhoton/avoidPrintStackTrace/src/avoidPrintStackTrace/Main.java"
commentList=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@body/@statements.0/@body/@comments.0"
package=
"//@ownedElements.0"
types=
"//@ownedElements.0/@ownedElements.0"
/>
</java:Model>
src/main/atl/analysis.atl
View file @
fc457e14
...
...
@@ -25,6 +25,7 @@ rule Java2SMM {
}
helper def: allMeasures(project : java!Model): Set(smm!Measure) =
Set{
-- Example rule
--
...
...
@@ -51,7 +52,8 @@ helper def: allMeasures(project : java!Model): Set(smm!Measure) =
--
thisModule.uselessStringValueOf(),
thisModule.tooFewBranchesForASwitchStatement(),
thisModule.useIndexOfChar()
thisModule.useIndexOfChar(),
thisModule.avoidPrintStackTrace()
};
...
...
@@ -269,7 +271,6 @@ rule MesureTooManyMethods(class : java!ClassDeclaration) {
}
}
rule MesureReturnFromFinallyBlock(method : java!MethodDeclaration) {
to
om: smm!ObservedMeasure (
...
...
@@ -288,6 +289,19 @@ rule MesureReturnFromFinallyBlock(method : java!MethodDeclaration) {
}
}
--------------------------------------------- TooManyStaticImports ---------------------------------------------
-- Rule for metrics TooManyStaticImports : return the set of class Measures that violates the rule.
helper def: tooManyStaticImports() : Set(smm!Measure) =
-- Browse through all class(CompilationUnit)
java!CompilationUnit.allInstances()->iterate(i; res : Set(smm!Measure) = Set{} |
-- Add a new measurement if there are more than 4 static imports in the class.
if thisModule.numberOfStaticImportInClass(i) > 4
then res->union(Set{thisModule.MesureTooManyStaticImports(i)})
else res
endif
);
-- Return the number of static imports in a specific ClassDeclaration.
helper def: numberOfStaticImportInClass(s:java!CompilationUnit) : Integer =
s.imports->select(i | i.static)->size();
...
...
@@ -311,6 +325,24 @@ rule MesureTooManyStaticImports(class : java!CompilationUnit) {
}
}
-- creates a new Measure when the method printStackTrace is used
rule MeasureAvoidPrintStackTrace(method : java!MethodInvocation) {
to
om: smm!ObservedMeasure (
measure <- noc,
measurements <- measurement
),
noc: smm!DimensionalMeasure (
name <- 'Avoid print stack trace',
shortDescription <- 'Avoid printStackTrace(); use a logger call instead.'
),
measurement: smm!DirectMeasurement (
error<- 'The class '+ method.originalCompilationUnit.name + ' violates the rule avoid print stack trace.'
)
do {
noc;
}
}
-- creates a new Measure when Thread.run() is used instead of Thread.start()
rule measureAvoidThreadGroup(variable : java!VariableDeclarationFragment) {
...
...
@@ -330,4 +362,4 @@ rule measureAvoidThreadGroup(variable : java!VariableDeclarationFragment) {
do {
noc;
}
}
\ No newline at end of file
}
src/main/atl/bestPractices.atl
0 → 100644
View file @
fc457e14
library bestPractices;
--------------------------------------------- AvoidPrintStackTrace ---------------------------------------------
--Goes through all the methods to check if the following rule is followed:
--Avoid printStackTrace()
helper def: avoidPrintStackTrace() : Set(smm!Measure) =
java!MethodInvocation.allInstances() -> iterate(i; res : Set(smm!Measure) = Set{} |
-- Add a new measurement if the argument of String.indexOf() is not of type char when checking for the index of a single character
if thisModule.isAvoidPrintStackTrace(i) then
res->union(Set{thisModule.MeasureAvoidPrintStackTrace(i)})
else
res
endif
);
--Detect a wrong usage of the method printStackTrace()
--return true if the method is called printStackTrace
helper def:isAvoidPrintStackTrace(s:java!MethodInvocation): Boolean =
if s.method.name = 'printStackTrace' then
true
else
false
endif;
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment