Skip to content

Commit

Permalink
MSCPP and IAR #55 #56
Browse files Browse the repository at this point in the history
  • Loading branch information
tomasbjerre committed Jan 29, 2019
1 parent 69e26e5 commit 91a9b89
Show file tree
Hide file tree
Showing 12 changed files with 295 additions and 2 deletions.
25 changes: 25 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,31 @@

Changelog of Violations lib.

## Unreleased
### GitHub [#55](https://github.com/tomasbjerre/violations-lib/issues/55) Support for IAR compiler warnings *enhancement*

**MSCPP and IAR**


[f19c95c8d7ddb89](https://github.com/tomasbjerre/violations-lib/commit/f19c95c8d7ddb89) Tomas Bjerre *2019-01-29 16:56:01*


### GitHub [#56](https://github.com/tomasbjerre/violations-lib/issues/56) Support for Microsoft Visual C++ compiler via msys2 makefile *enhancement*

**MSCPP and IAR**


[f19c95c8d7ddb89](https://github.com/tomasbjerre/violations-lib/commit/f19c95c8d7ddb89) Tomas Bjerre *2019-01-29 16:56:01*


### No issue

**Including info in CppCheck**


[69e26e53cdcbf77](https://github.com/tomasbjerre/violations-lib/commit/69e26e53cdcbf77) Tomas Bjerre *2019-01-23 07:22:24*


## 1.78
### GitHub [#53](https://github.com/tomasbjerre/violations-lib/issues/53) Shouldn't CodeNarc-Parsing respect SourceDirectory-Element *bug*

Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ A number of **parsers** have been implemented. Some **parsers** can parse output
| [_GoVet_](https://golang.org/cmd/vet/) | `GOLINT` | Same format as GoLint.
| [_GoogleErrorProne_](https://github.com/google/error-prone) | `GOOGLEERRORPRONE` |
| [_Infer_](http://fbinfer.com/) | `PMD` | Facebook Infer. With `--pmd-xml`.
| [_IAR_](https://www.iar.com/iar-embedded-workbench/) | `IAR` |
| [_JCReport_](https://github.com/jCoderZ/fawkez/wiki/JcReport) | `JCREPORT` |
| [_JSHint_](http://jshint.com/) | `JSHINT` |
| [_KTLint_](https://github.com/shyiko/ktlint) | `CHECKSTYLE` |
Expand All @@ -41,6 +42,7 @@ A number of **parsers** have been implemented. Some **parsers** can parse output
| [_Lint_]() | `LINT` | A common XML format, used by different linters.
| [_Mccabe_](https://pypi.python.org/pypi/mccabe) | `FLAKE8` |
| [_MyPy_](https://pypi.python.org/pypi/mypy-lang) | `MYPY` |
| [_MSCpp_](https://visualstudio.microsoft.com/vs/features/cplusplus/) | `MSCPP` |
| [_NullAway_](https://github.com/uber/NullAway) | `GOOGLEERRORPRONE` | Same format as Google Error Prone.
| [_PCLint_](http://www.gimpel.com/html/pcl.htm) | `PCLINT` | PC-Lint using the same output format as the Jenkins warnings plugin, [_details here_](https://wiki.jenkins.io/display/JENKINS/PcLint+options)
| [_PHPCS_](https://github.com/squizlabs/PHP_CodeSniffer) | `CHECKSTYLE` | With `phpcs api.php --report=checkstyle`.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
import static se.bjurr.violations.lib.model.SEVERITY.WARN;
import static se.bjurr.violations.lib.model.Violation.violationBuilder;
import static se.bjurr.violations.lib.reports.Parser.CPPCHECK;
import static se.bjurr.violations.lib.util.ViolationParserUtils.*;
import static se.bjurr.violations.lib.util.ViolationParserUtils.findAttribute;
import static se.bjurr.violations.lib.util.ViolationParserUtils.getAttribute;
import static se.bjurr.violations.lib.util.ViolationParserUtils.getChunks;
import static se.bjurr.violations.lib.util.ViolationParserUtils.getIntegerAttribute;

import java.util.ArrayList;
import java.util.List;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public List<Violation> parseReportOutput(String string) throws Exception {
message = ruleName;
}
String fileString = null;
if (sourceDirectory == null || sourceDirectory.isEmpty()) {
if (sourceDirectory.isEmpty()) {
fileString = path + "/" + name;
} else {
fileString = sourceDirectory + "/" + path + "/" + name;
Expand Down
58 changes: 58 additions & 0 deletions src/main/java/se/bjurr/violations/lib/parsers/IARParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package se.bjurr.violations.lib.parsers;

import static java.lang.Integer.parseInt;
import static se.bjurr.violations.lib.model.SEVERITY.ERROR;
import static se.bjurr.violations.lib.model.SEVERITY.INFO;
import static se.bjurr.violations.lib.model.SEVERITY.WARN;
import static se.bjurr.violations.lib.model.Violation.violationBuilder;
import static se.bjurr.violations.lib.reports.Parser.IAR;
import static se.bjurr.violations.lib.util.Utils.isNullOrEmpty;
import static se.bjurr.violations.lib.util.ViolationParserUtils.getLines;

import java.util.ArrayList;
import java.util.List;
import se.bjurr.violations.lib.model.SEVERITY;
import se.bjurr.violations.lib.model.Violation;

public class IARParser implements ViolationsParser {

@Override
public List<Violation> parseReportOutput(final String reportContent) throws Exception {
final List<Violation> violations = new ArrayList<>();
final List<List<String>> partsPerLine =
getLines(reportContent, "\"([^\"]+)\",(\\d+)([^\\[]*)\\[([^\\]]*)\\]:(.*)");
for (final List<String> parts : partsPerLine) {
final String fileName = parts.get(1).trim();
final Integer lineNumber = parseInt(parts.get(2));
final Integer columnNumber = 0;
final String severity = parts.get(3).toLowerCase().trim();
final String rule = parts.get(4).trim();
final String message = parts.get(5).trim();
violations.add( //
violationBuilder() //
.setParser(IAR) //
.setStartLine(lineNumber) //
.setColumn(columnNumber) //
.setFile(fileName) //
.setSeverity(toSeverity(severity)) //
.setRule(rule) //
.setMessage(message) //
.build() //
);
}
return violations;
}

public SEVERITY toSeverity(final String severity) {
if (isNullOrEmpty(severity) || severity.contains("info")) {
return INFO;
}
if (severity.contains("error")) {
return ERROR;
}
if (severity.contains("warning")) {
return WARN;
}
return INFO;
}
}
58 changes: 58 additions & 0 deletions src/main/java/se/bjurr/violations/lib/parsers/MSCPPParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package se.bjurr.violations.lib.parsers;

import static java.lang.Integer.parseInt;
import static se.bjurr.violations.lib.model.SEVERITY.ERROR;
import static se.bjurr.violations.lib.model.SEVERITY.INFO;
import static se.bjurr.violations.lib.model.SEVERITY.WARN;
import static se.bjurr.violations.lib.model.Violation.violationBuilder;
import static se.bjurr.violations.lib.reports.Parser.MSCPP;
import static se.bjurr.violations.lib.util.Utils.isNullOrEmpty;
import static se.bjurr.violations.lib.util.ViolationParserUtils.getLines;

import java.util.ArrayList;
import java.util.List;
import se.bjurr.violations.lib.model.SEVERITY;
import se.bjurr.violations.lib.model.Violation;

public class MSCPPParser implements ViolationsParser {

@Override
public List<Violation> parseReportOutput(final String reportContent) throws Exception {
final List<Violation> violations = new ArrayList<>();
final List<List<String>> partsPerLine =
getLines(reportContent, "(.*)\\((\\d+)\\):\\s*([a-zA-Z]+)([^:]*):(.*)");
for (final List<String> parts : partsPerLine) {
final String fileName = parts.get(1).trim();
final Integer lineNumber = parseInt(parts.get(2));
final Integer columnNumber = 0;
final String severity = parts.get(3).toLowerCase().trim();
final String rule = parts.get(4).trim();
final String message = parts.get(5).trim();
violations.add( //
violationBuilder() //
.setParser(MSCPP) //
.setStartLine(lineNumber) //
.setColumn(columnNumber) //
.setFile(fileName) //
.setSeverity(toSeverity(severity)) //
.setRule(rule) //
.setMessage(message) //
.build() //
);
}
return violations;
}

public SEVERITY toSeverity(final String severity) {
if (isNullOrEmpty(severity) || severity.contains("info")) {
return INFO;
}
if (severity.contains("error")) {
return ERROR;
}
if (severity.contains("warning")) {
return WARN;
}
return INFO;
}
}
4 changes: 4 additions & 0 deletions src/main/java/se/bjurr/violations/lib/reports/Parser.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,14 @@
import se.bjurr.violations.lib.parsers.GendarmeParser;
import se.bjurr.violations.lib.parsers.GoLintParser;
import se.bjurr.violations.lib.parsers.GoogleErrorProneParser;
import se.bjurr.violations.lib.parsers.IARParser;
import se.bjurr.violations.lib.parsers.JCReportParser;
import se.bjurr.violations.lib.parsers.JSHintParser;
import se.bjurr.violations.lib.parsers.KlocworkParser;
import se.bjurr.violations.lib.parsers.KotlinGradleParser;
import se.bjurr.violations.lib.parsers.KotlinMavenParser;
import se.bjurr.violations.lib.parsers.LintParser;
import se.bjurr.violations.lib.parsers.MSCPPParser;
import se.bjurr.violations.lib.parsers.MyPyParser;
import se.bjurr.violations.lib.parsers.PCLintParser;
import se.bjurr.violations.lib.parsers.PMDParser;
Expand Down Expand Up @@ -59,12 +61,14 @@ public enum Parser {
FLAKE8(new Flake8Parser()), //
FXCOP(new FxCopParser()), //
GENDARME(new GendarmeParser()), //
IAR(new IARParser()), //
JCREPORT(new JCReportParser()), //
JSHINT(new JSHintParser()), //
LINT(new LintParser()), //
KLOCWORK(new KlocworkParser()), //
KOTLINMAVEN(new KotlinMavenParser()), //
KOTLINGRADLE(new KotlinGradleParser()), //
MSCPP(new MSCPPParser()), //
MYPY(new MyPyParser()), //
GOLINT(new GoLintParser()), //
GOOGLEERRORPRONE(new GoogleErrorProneParser()), //
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/se/bjurr/violations/lib/reports/Reporter.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public enum Reporter {
GOOGLEERRORPRONE(
"GoogleErrorProne", Parser.GOOGLEERRORPRONE, "https://github.com/google/error-prone", ""),
INFER("Infer", Parser.PMD, "http://fbinfer.com/", "Facebook Infer. With `--pmd-xml`."),
IAR("IAR", Parser.IAR, "https://www.iar.com/iar-embedded-workbench/", ""),
JCREPORT("JCReport", Parser.JCREPORT, "https://github.com/jCoderZ/fawkez/wiki/JcReport", ""),
JSHINT("JSHint", Parser.JSHINT, "http://jshint.com/", ""),
KTLINT("KTLint", Parser.CHECKSTYLE, "https://github.com/shyiko/ktlint", ""),
Expand All @@ -65,6 +66,7 @@ public enum Reporter {
LINT("Lint", Parser.LINT, "", "A common XML format, used by different linters."),
MCCABE("Mccabe", Parser.FLAKE8, "https://pypi.python.org/pypi/mccabe", ""),
MYPY("MyPy", Parser.MYPY, "https://pypi.python.org/pypi/mypy-lang", ""),
MSCPP("MSCpp", Parser.MSCPP, "https://visualstudio.microsoft.com/vs/features/cplusplus/", ""),
NULLAWAY(
"NullAway",
Parser.GOOGLEERRORPRONE,
Expand Down
62 changes: 62 additions & 0 deletions src/test/java/se/bjurr/violations/lib/IARTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package se.bjurr.violations.lib;

import static org.assertj.core.api.Assertions.assertThat;
import static se.bjurr.violations.lib.TestUtils.getRootFolder;
import static se.bjurr.violations.lib.ViolationsApi.violationsApi;
import static se.bjurr.violations.lib.reports.Parser.IAR;

import java.util.List;
import org.junit.Test;
import se.bjurr.violations.lib.model.SEVERITY;
import se.bjurr.violations.lib.model.Violation;

public class IARTest {

@Test
public void testThatViolationsCanBeParsed() {
final String rootFolder = getRootFolder();

final List<Violation> actual =
violationsApi() //
.withPattern(".*/iar/example\\.txt$") //
.inFolder(rootFolder) //
.findAll(IAR) //
.violations();

assertThat(actual) //
.hasSize(7);

final Violation violation0 = actual.get(0);
assertThat(violation0.getFile()) //
.isEqualTo(
"c:/jenkins/workspace/24-Test-Jenkins-WinTen-Extension/external/specific/cpp/iar_cxxabi.cpp");
assertThat(violation0.getMessage()) //
.isEqualTo("expression must be a pointer to a complete object type");
assertThat(violation0.getStartLine()) //
.isEqualTo(432);
assertThat(violation0.getSeverity()) //
.isEqualTo(SEVERITY.WARN);
assertThat(violation0.getRule()) //
.isEqualTo("Pe852");

final Violation violation3 = actual.get(3);
assertThat(violation3.getFile()) //
.isEqualTo("C:/Repositories/source/dal/InterMcu/InterMcuTransport.cpp");
assertThat(violation3.getMessage()) //
.isEqualTo("expected a \")\"");
assertThat(violation3.getSeverity()) //
.isEqualTo(SEVERITY.ERROR);
assertThat(violation3.getRule()) //
.isEqualTo("Pe018");

final Violation violation6 = actual.get(6);
assertThat(violation6.getFile()) //
.isEqualTo("source/dal/InterMcu/InterMcuTransport.cpp");
assertThat(violation6.getMessage()) //
.isEqualTo("expected a \")\"");
assertThat(violation3.getSeverity()) //
.isEqualTo(SEVERITY.ERROR);
assertThat(violation3.getRule()) //
.isEqualTo("Pe018");
}
}
66 changes: 66 additions & 0 deletions src/test/java/se/bjurr/violations/lib/MSCPPTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package se.bjurr.violations.lib;

import static org.assertj.core.api.Assertions.assertThat;
import static se.bjurr.violations.lib.TestUtils.getRootFolder;
import static se.bjurr.violations.lib.ViolationsApi.violationsApi;
import static se.bjurr.violations.lib.reports.Parser.MSCPP;

import java.util.List;
import org.junit.Test;
import se.bjurr.violations.lib.model.SEVERITY;
import se.bjurr.violations.lib.model.Violation;

public class MSCPPTest {

@Test
public void testThatViolationsCanBeParsed() {
final String rootFolder = getRootFolder();

final List<Violation> actual =
violationsApi() //
.withPattern(".*/mscpp/example\\.txt$") //
.inFolder(rootFolder) //
.findAll(MSCPP) //
.violations();

assertThat(actual) //
.hasSize(5);

final Violation violation0 = actual.get(0);
assertThat(violation0.getFile()) //
.isEqualTo("../../source/gui/controls/DebugPrint.cpp");
assertThat(violation0.getMessage()) //
.isEqualTo("\"Typumwandlung\": Zeigerverkrzung von \"void *\" zu \"long\"");
assertThat(violation0.getStartLine()) //
.isEqualTo(30);
assertThat(violation0.getSeverity()) //
.isEqualTo(SEVERITY.WARN);
assertThat(violation0.getRule()) //
.isEqualTo("C4311");

final Violation violation1 = actual.get(1);
assertThat(violation1.getFile()) //
.isEqualTo("../dummies/osal/own_os/threading/Mutex.cpp");
assertThat(violation1.getMessage()) //
.isEqualTo("\"foobar\": nichtdeklarierter Bezeichner");
assertThat(violation1.getStartLine()) //
.isEqualTo(14);
assertThat(violation1.getSeverity()) //
.isEqualTo(SEVERITY.ERROR);
assertThat(violation1.getRule()) //
.isEqualTo("C2065");

final Violation violation4 = actual.get(4);
assertThat(violation4.getFile()) //
.isEqualTo("C:/Repositories/P2/source/gui/controls/Keyboard/GridKeyboard.h");
assertThat(violation4.getMessage()) //
.isEqualTo(
"Bei der Kompilierung von Klasse Vorlage der pfm::GridKeyboard<3,4>::GridKeyboard(PEGUINT,PEGUINT)-Memberfunktion");
assertThat(violation4.getStartLine()) //
.isEqualTo(38);
assertThat(violation4.getSeverity()) //
.isEqualTo(SEVERITY.INFO);
assertThat(violation4.getRule()) //
.isEqualTo("");
}
}
9 changes: 9 additions & 0 deletions src/test/resources/iar/example.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
"c:\jenkins\workspace\24-Test-Jenkins-WinTen-Extension\external\specific\cpp\iar_cxxabi.cpp",432 Warning[Pe852]: expression must be a pointer to a complete object type

"C:\Repositories\external\specific\wiced\WICED\security\BESL\host\WICED\wiced_p2p.c",81 Warning[Pe549]: variable "result" is used before its value is set
"C:\Repositories\external\specific\wiced\WICED\platform\MCU\RTOS_STM32F4xx\platform_dct_external.c",412 Warning[Pe223]: function "memcpy" declared implicitly
"C:\Repositories\source\dal\InterMcu\InterMcuTransport.cpp",633 Error[Pe018]: expected a ")"

"external/specific/wiced/WICED/security/BESL/host/WICED/wiced_p2p.c",81 Warning[Pe549]: variable "result" is used before its value is set
"external/specific/wiced/WICED/platform/MCU/RTOS_STM32F4xx/platform_dct_external.c",412 Warning[Pe223]: function "memcpy" declared implicitly
"source/dal/InterMcu/InterMcuTransport.cpp",633 Error[Pe018]: expected a ")"
6 changes: 6 additions & 0 deletions src/test/resources/mscpp/example.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
../../source/gui/controls/DebugPrint.cpp(30): warning C4311: "Typumwandlung": Zeigerverkrzung von "void *" zu "long"

../dummies/osal/own_os/threading/Mutex.cpp(14): error C2065: "foobar": nichtdeklarierter Bezeichner
../dummies/osal/own_os/threading/Mutex.cpp(15): error C2143: Syntaxfehler: Es fehlt ";" vor "}"
../../source/gui/controls/Keyboard/AlphabetKeyboard.cpp(157): warning C4267: "=": Konvertierung von "size_t" nach "PEGSHORT", Datenverlust m”glich
C:\Repositories\P2\source\gui/controls/Keyboard/GridKeyboard.h(38): note: Bei der Kompilierung von Klasse Vorlage der pfm::GridKeyboard<3,4>::GridKeyboard(PEGUINT,PEGUINT)-Memberfunktion

0 comments on commit 91a9b89

Please sign in to comment.