From c9308a51d1fa4700191b28534263119656c36ef2 Mon Sep 17 00:00:00 2001 From: Maxim Stefanov Date: Wed, 29 Apr 2020 15:07:48 +0300 Subject: [PATCH 1/2] added static analyzer - PVS-Studio --- .gitignore | 4 + README.md | 10 +++ build.gradle | 2 +- gradle/pvsstudio.gradle | 26 +++++++ results/pvsstudioReport.png | Bin 0 -> 17162 bytes .../entity/RandomShapeFactory.java | 73 ++++++++++++++++++ src/main/resources/shapeFactoryValues | 1 + 7 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 gradle/pvsstudio.gradle create mode 100644 results/pvsstudioReport.png create mode 100644 src/main/java/com/qualitychecks/entity/RandomShapeFactory.java create mode 100644 src/main/resources/shapeFactoryValues diff --git a/.gitignore b/.gitignore index 8ca894c..a4be9d1 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,7 @@ out/ logs/ .java-version + + +### PVS-Studio ### +.PVS-Studio diff --git a/README.md b/README.md index 05c5815..8ce35db 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,16 @@ Gradle configuration for spotbugs is located in [gradle/spotbugs.gradle](gradle/ Command: `gradle spotBugsMain` +### PVS-Studio +[PVS-Studio](https://www.viva64.com/en/pvs-studio/) is a promising static code analyzer. It can detect such problems as potential null object dereference, conditional expressions that are always true or false, unreachable code, infinite recursion, comparison of objects with incompatible types, and much more. In addition, the analyzer's strength is the search for copy-paste errors that are difficult to find during code review, for example, equivalent implementation of branches in an if-then-else statement or two completely different methods, comparing a variable with itself, etc. + +Gradle configuration for PVS-Studio is located in [gradle/pvsstudio.gradle](gradle/pvsstudio.gradle). + +Command: +`gradle pvsAnalyze` + +Output: +![PVS-Studio Report](results/pvsstudioReport.png) ## Practices diff --git a/build.gradle b/build.gradle index 2ef2a12..f90f999 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,6 @@ repositories { dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.6.0' testImplementation 'org.hamcrest:hamcrest-core:2.2' - } sourceSets { @@ -54,6 +53,7 @@ apply from: 'gradle/checkstyle.gradle' apply from: 'gradle/jacoco.gradle' apply from: 'gradle/pmd.gradle' apply from: 'gradle/spotbugs.gradle' +apply from: 'gradle/pvsstudio.gradle' integrationTest.dependsOn test jacocoTestCoverageVerification.dependsOn jacocoTestReport diff --git a/gradle/pvsstudio.gradle b/gradle/pvsstudio.gradle new file mode 100644 index 0000000..bb76efe --- /dev/null +++ b/gradle/pvsstudio.gradle @@ -0,0 +1,26 @@ +buildscript { + repositories { + mavenCentral() + maven { + url uri('http://files.viva64.com/java/pvsstudio-maven-repository/') + } + } + dependencies { + classpath group: 'com.pvsstudio', + name: 'pvsstudio-gradle-plugin', + version: '7.07.38241' + } +} + +apply plugin: com.pvsstudio.PvsStudioGradlePlugin +pvsstudio { + projectPath = "$projectDir" + + outputType = 'html' + outputFile = "${project.reportsDir}/pvsstudio/report.html" + + analyzeOnly = ["./src/main/java/com/qualitychecks/entity/RandomShapeFactory.java"] + + username = "PVS-Studio Free" + serialNumber ="FREE-FREE-FREE-FREE" +} \ No newline at end of file diff --git a/results/pvsstudioReport.png b/results/pvsstudioReport.png new file mode 100644 index 0000000000000000000000000000000000000000..413d8d60aa3b419035e9c0896bd228ec61bee554 GIT binary patch literal 17162 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 literal 0 HcmV?d00001 diff --git a/src/main/java/com/qualitychecks/entity/RandomShapeFactory.java b/src/main/java/com/qualitychecks/entity/RandomShapeFactory.java new file mode 100644 index 0000000..0281667 --- /dev/null +++ b/src/main/java/com/qualitychecks/entity/RandomShapeFactory.java @@ -0,0 +1,73 @@ +// This is an open source non-commercial project. Dear PVS-Studio, please check it. +// PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com + +package com.qualitychecks.entity; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.math.BigDecimal; +import java.util.*; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.Logger; + +public final class RandomShapeFactory { + public enum ShapeType { + Circle, Rectangle + } + + private static RandomShapeFactory factory = new RandomShapeFactory(); + private static Logger logger = LogManager.getLogManager().getLogger(RandomShapeFactory.class.getName()); + + private static final Map COLORS = new HashMap<>(); + + static { + COLORS.put("black", 0); + COLORS.put("red", 16711680); + COLORS.put("green", 65280); + COLORS.put("blue", 255); + COLORS.put("magenta", 16711935); + COLORS.put("blue", 16776960); + COLORS.put("cyan", 65535); + } + + private List values; + + private RandomShapeFactory() { + Function isNumeric = str -> str != null && str.matches("[-+]?\\d*\\.?\\d+"); + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("shapeFactoryValues"))); + for (String value : reader.readLine().split(" ")) { + if (isNumeric.apply(value)) { + values.add(value); + } else { + logger.warning(String.format("'%s' - invalid value", value)); + } + } + reader.close(); + } catch (IOException ex) { + // default values + values = Arrays.asList("1", "2", "3"); + logger.log(Level.SEVERE, ex.getMessage(), ex); + } + } + + public static RandomShapeFactory getInstance() { + return factory; + } + + public Shape getShapeRandomSize(final ShapeType type) { + switch (type) { + case Circle: + return new Circle(new BigDecimal(values.get(new Random().nextInt(values.size())))); + case Rectangle: + return new Rectangle(new BigDecimal(new Random().nextInt(values.size())), + new BigDecimal(new Random().nextInt(values.size()))); + /* other shapes*/ + default: + throw new IllegalArgumentException("Wrong shape type:" + type); + } + } +} diff --git a/src/main/resources/shapeFactoryValues b/src/main/resources/shapeFactoryValues new file mode 100644 index 0000000..ac5eb86 --- /dev/null +++ b/src/main/resources/shapeFactoryValues @@ -0,0 +1 @@ +1 3.2 5.7 9.6 4.5 9 \ No newline at end of file From ada2daea2ca845d171f828cfd2d2101468da0826 Mon Sep 17 00:00:00 2001 From: Maxim Stefanov Date: Wed, 29 Apr 2020 15:18:32 +0300 Subject: [PATCH 2/2] minor fix --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8ce35db..3fe5028 100644 --- a/README.md +++ b/README.md @@ -75,8 +75,8 @@ Command: Gradle configuration for PVS-Studio is located in [gradle/pvsstudio.gradle](gradle/pvsstudio.gradle). -Command: -`gradle pvsAnalyze` +Command: +`gradle pvsAnalyze` Output: ![PVS-Studio Report](results/pvsstudioReport.png)