Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Yannis LE BARS
Source Code Analyzer
Commits
e9d735fa
Commit
e9d735fa
authored
Dec 19, 2019
by
Khaled AMIRAT
Browse files
Merge branch 'master' into 'E19C506H'
# Conflicts: # src/main/atl/analysis.atl
parents
91e43740
90338725
Changes
3
Hide whitespace changes
Inline
Side-by-side
input/string-to-string.xmi
0 → 100644
View file @
e9d735fa
<?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=
"stringtostring"
>
<ownedElements
name=
"stringtostring"
>
<ownedElements
xsi:type=
"java:ClassDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"ToString"
>
<modifier
visibility=
"public"
/>
<bodyDeclarations
xsi:type=
"java:FieldDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
>
<modifier
visibility=
"public"
/>
<type
type=
"//@ownedElements.0/@ownedElements.1"
/>
<fragments
originalCompilationUnit=
"//@compilationUnits.0"
name=
"thing"
usageInVariableAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.2/@body/@statements.0/@expression/@expression"
>
<initializer
xsi:type=
"java:ClassInstanceCreation"
originalCompilationUnit=
"//@compilationUnits.0"
method=
"//@ownedElements.0/@ownedElements.1/@bodyDeclarations.1"
>
<type
type=
"//@ownedElements.0/@ownedElements.1"
/>
</initializer>
</fragments>
</bodyDeclarations>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"stringbar"
>
<modifier
visibility=
"private"
/>
<body
originalCompilationUnit=
"//@compilationUnits.0"
>
<statements
xsi:type=
"java:VariableDeclarationStatement"
originalCompilationUnit=
"//@compilationUnits.0"
>
<type
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
<fragments
originalCompilationUnit=
"//@compilationUnits.0"
name=
"bar"
usageInVariableAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@body/@statements.1/@fragments.0/@initializer/@expression"
>
<initializer
xsi:type=
"java:StringLiteral"
originalCompilationUnit=
"//@compilationUnits.0"
escapedValue=
""howdy""
/>
</fragments>
<modifier/>
</statements>
<statements
xsi:type=
"java:VariableDeclarationStatement"
originalCompilationUnit=
"//@compilationUnits.0"
>
<type
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
<fragments
originalCompilationUnit=
"//@compilationUnits.0"
name=
"b"
>
<initializer
xsi:type=
"java:MethodInvocation"
originalCompilationUnit=
"//@compilationUnits.0"
method=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0/@bodyDeclarations.0"
>
<expression
xsi:type=
"java:SingleVariableAccess"
variable=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@body/@statements.0/@fragments.0"
/>
</initializer>
</fragments>
<modifier/>
</statements>
</body>
<returnType
type=
"//@orphanTypes.5"
/>
</bodyDeclarations>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
originalCompilationUnit=
"//@compilationUnits.0"
name=
"something"
>
<modifier
visibility=
"private"
/>
<body
originalCompilationUnit=
"//@compilationUnits.0"
>
<statements
xsi:type=
"java:ReturnStatement"
originalCompilationUnit=
"//@compilationUnits.0"
>
<expression
xsi:type=
"java:MethodInvocation"
originalCompilationUnit=
"//@compilationUnits.0"
method=
"//@ownedElements.0/@ownedElements.1/@bodyDeclarations.0"
>
<expression
xsi:type=
"java:SingleVariableAccess"
variable=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@fragments.0"
/>
</expression>
</statements>
</body>
<returnType
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
</bodyDeclarations>
</ownedElements>
<ownedElements
xsi:type=
"java:ClassDeclaration"
originalCompilationUnit=
"//@compilationUnits.1"
name=
"Something"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@type //@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@fragments.0/@initializer/@type"
>
<modifier
visibility=
"public"
/>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
originalCompilationUnit=
"//@compilationUnits.1"
name=
"toString"
usages=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.2/@body/@statements.0/@expression"
>
<annotations
originalCompilationUnit=
"//@compilationUnits.1"
>
<type
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.3"
/>
</annotations>
<modifier
visibility=
"public"
/>
<body
originalCompilationUnit=
"//@compilationUnits.1"
>
<statements
xsi:type=
"java:ReturnStatement"
originalCompilationUnit=
"//@compilationUnits.1"
>
<expression
xsi:type=
"java:StringLiteral"
originalCompilationUnit=
"//@compilationUnits.1"
escapedValue=
""Something""
/>
</statements>
</body>
<returnType
type=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0"
/>
</bodyDeclarations>
<bodyDeclarations
xsi:type=
"java:ConstructorDeclaration"
name=
"Something"
proxy=
"true"
usages=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.0/@fragments.0/@initializer"
/>
</ownedElements>
</ownedElements>
<ownedElements
name=
"java"
proxy=
"true"
>
<ownedPackages
name=
"lang"
proxy=
"true"
>
<ownedElements
xsi:type=
"java:ClassDeclaration"
name=
"String"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@body/@statements.0/@type //@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@body/@statements.1/@type //@ownedElements.0/@ownedElements.0/@bodyDeclarations.2/@returnType //@ownedElements.0/@ownedElements.1/@bodyDeclarations.0/@returnType"
>
<bodyDeclarations
xsi:type=
"java:MethodDeclaration"
name=
"toString"
proxy=
"true"
usages=
"//@ownedElements.0/@ownedElements.0/@bodyDeclarations.1/@body/@statements.1/@fragments.0/@initializer"
/>
<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:AnnotationTypeDeclaration"
name=
"Override"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.0/@ownedElements.1/@bodyDeclarations.0/@annotations.0/@type"
/>
</ownedPackages>
<ownedPackages
name=
"io"
proxy=
"true"
>
<ownedElements
xsi:type=
"java:InterfaceDeclaration"
name=
"Serializable"
proxy=
"true"
usagesInTypeAccess=
"//@ownedElements.1/@ownedPackages.0/@ownedElements.0/@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.1/@returnType"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeChar"
name=
"char"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeShort"
name=
"short"
/>
<orphanTypes
xsi:type=
"java:PrimitiveTypeByte"
name=
"byte"
/>
<compilationUnits
name=
"ToString.java"
originalFilePath=
"C:\Users\Marion\_FACULTE\_M2\Model_photon\stringtostring\src\stringtostring\ToString.java"
package=
"//@ownedElements.0"
types=
"//@ownedElements.0/@ownedElements.0"
/>
<compilationUnits
name=
"Something.java"
originalFilePath=
"C:\Users\Marion\_FACULTE\_M2\Model_photon\stringtostring\src\stringtostring\Something.java"
package=
"//@ownedElements.0"
types=
"//@ownedElements.0/@ownedElements.1"
/>
</java:Model>
src/main/atl/analysis.atl
View file @
e9d735fa
...
...
@@ -72,6 +72,7 @@ helper def: allMeasures(project : java!Model): Set(smm!Measure) =
thisModule.emptyStatementBlock(),
thisModule.avoidRethrowingException(),
thisModule.integerInstantiation(),
thisModule.stringToString(),
-- Documentation rules
--
...
...
@@ -89,11 +90,6 @@ helper def: allMeasures(project : java!Model): Set(smm!Measure) =
thisModule.dontImportSun(),
thisModule.emptySwitchStatement(),
thisModule.emptySynchronizedBlock(),
thisModule.emptyFinallyBlock(),
--thisModule.emptyfinalizeMethod(),
--thisModule.doNotThrowExceptionInFinally(),
--thisModule.finalizeShouldBeProtected(),
thisModule.UnconditionalIfStatement(),
thisModule.EmptyInitializer(),
thisModule.CloneMethodMustBePublic(),
...
...
@@ -230,7 +226,24 @@ rule MesureShortVariableName(variable : java!VariableDeclaration) {
}
}
-- A Measure instance if the method violates the rule 'StringToString'.
rule MeasureStringToString(method : java!MethodInvocation) {
to
om: smm!ObservedMeasure (
measure <- noc,
measurements <- measurement
),
noc: smm!DimensionalMeasure (
name <- 'StringToString',
shortDescription <- 'Avoid calling toString() on objects already known to be string instances; this is unnecessary.'
),
measurement: smm!DirectMeasurement (
error <- 'The Object ' + method.expression.variable.name + ' is already a String in ' + method.originalCompilationUnit.name
)
do {
noc;
}
}
-- creates a new Measure when Thread.run() is used instead of Thread.start()
rule MeasureDontCallThreadRun(method : java!MethodInvocation) {
...
...
src/main/atl/performance.atl
View file @
e9d735fa
...
...
@@ -123,3 +123,12 @@ helper def: integerInstantiation() : Set(smm!Measure) =
->select(p|p.name='util')->collect(i|i.package)
->select(p|p.name='java')
->collect(i |thisModule.RuleUseArrayListInsteadOfVector(i));
--------------------------------------------- StringToString ---------------------------------------------
-- Rule for metrics stringToString : returns the set of class Measures that violates the rule.
helper def: stringToString() : Set(smm!Measure) =
java!MethodInvocation.allInstances()
-> select( i | i.method.name = 'toString' and i.expression.variable.variablesContainer.type.type.name = 'String')
-> collect ( i | thisModule.MeasureStringToString(i) )
;
Write
Preview
Supports
Markdown
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