Skip to content

Commit a2d46e9

Browse files
[JENKINS-73509] Add an additional Gcc parser to scan for CC1 messages
Fixes [JENKINS-73509](https://issues.jenkins.io/browse/JENKINS-73509)
1 parent 334bf0b commit a2d46e9

File tree

4 files changed

+149
-1
lines changed

4 files changed

+149
-1
lines changed
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package edu.hm.hafner.analysis.parser;
2+
3+
import java.io.Serial;
4+
import java.util.Optional;
5+
import java.util.regex.Matcher;
6+
7+
import org.apache.commons.lang3.StringUtils;
8+
import org.apache.commons.text.StringEscapeUtils;
9+
10+
import edu.hm.hafner.analysis.Issue;
11+
import edu.hm.hafner.analysis.IssueBuilder;
12+
import edu.hm.hafner.analysis.LookaheadParser;
13+
import edu.hm.hafner.analysis.Severity;
14+
import edu.hm.hafner.util.LookaheadStream;
15+
16+
/**
17+
* A parser for GCC cc1/cc1plus internal compiler warnings and errors.
18+
* These messages do not include file names or line numbers and are emitted by
19+
* the compiler's internal phases.
20+
*
21+
* @author Akash Manna
22+
* @see <a href="https://issues.jenkins.io/browse/JENKINS-73509">Issue 73509</a>
23+
*/
24+
public class Gcc4Cc1Parser extends LookaheadParser {
25+
@Serial
26+
private static final long serialVersionUID = 1L;
27+
28+
private static final String GCC_CC1_WARNING_PATTERN = "^(?:In .+?:\\s*)?"
29+
+ "(?<compiler>cc1(?:plus)?):\\s*"
30+
+ "(?<severity>warning|error|note):\\s*"
31+
+ "(?<message>.*)$";
32+
33+
/**
34+
* Creates a new instance of {@link Gcc4Cc1Parser}.
35+
*/
36+
public Gcc4Cc1Parser() {
37+
super(GCC_CC1_WARNING_PATTERN);
38+
}
39+
40+
@Override
41+
protected Optional<Issue> createIssue(final Matcher matcher, final LookaheadStream lookahead,
42+
final IssueBuilder builder) {
43+
String compilerName = matcher.group("compiler");
44+
String severityLevel = matcher.group("severity");
45+
String messageContent = matcher.group("message");
46+
47+
if (StringUtils.isBlank(compilerName) || StringUtils.isBlank(severityLevel)
48+
|| StringUtils.isBlank(messageContent)) {
49+
return Optional.empty();
50+
}
51+
52+
var completeMessage = new StringBuilder(messageContent);
53+
while (lookahead.hasNext() && Gcc4CompilerParser.isMessageContinuation(lookahead)) {
54+
completeMessage.append(' ');
55+
completeMessage.append(lookahead.next());
56+
}
57+
58+
String message = completeMessage.toString();
59+
String category = extractCategory(message);
60+
61+
return builder.setFileName("-")
62+
.setLineStart(0)
63+
.setCategory(category)
64+
.setMessage(StringEscapeUtils.escapeXml10(message))
65+
.setSeverity(Severity.guessFromString(severityLevel))
66+
.buildOptional();
67+
}
68+
69+
@Override
70+
protected boolean isLineInteresting(final String line) {
71+
return line.contains("warning") || line.contains("error") || line.contains("note");
72+
}
73+
74+
private String extractCategory(final String message) {
75+
int start = message.lastIndexOf("[-W");
76+
if (start == -1) {
77+
return "GCC warning";
78+
}
79+
80+
int end = message.indexOf(']', start);
81+
if (end == -1) {
82+
return "GCC warning";
83+
}
84+
85+
String category = message.substring(start + 3, end);
86+
int equalsPos = category.indexOf('=');
87+
if (equalsPos != -1) {
88+
return category.substring(0, equalsPos);
89+
}
90+
return category;
91+
}
92+
}

src/main/java/edu/hm/hafner/analysis/registry/Gcc4Descriptor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.util.Collection;
44

55
import edu.hm.hafner.analysis.IssueParser;
6+
import edu.hm.hafner.analysis.parser.Gcc4Cc1Parser;
67
import edu.hm.hafner.analysis.parser.Gcc4CompilerParser;
78
import edu.hm.hafner.analysis.parser.Gcc4LinkerParser;
89

@@ -21,6 +22,6 @@ class Gcc4Descriptor extends CompositeParserDescriptor {
2122

2223
@Override
2324
protected Collection<? extends IssueParser> createParsers() {
24-
return asList(new Gcc4CompilerParser(), new Gcc4LinkerParser());
25+
return asList(new Gcc4CompilerParser(), new Gcc4LinkerParser(), new Gcc4Cc1Parser());
2526
}
2627
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package edu.hm.hafner.analysis.parser;
2+
3+
import edu.hm.hafner.analysis.Report;
4+
import edu.hm.hafner.analysis.Severity;
5+
import edu.hm.hafner.analysis.assertions.SoftAssertions;
6+
import edu.hm.hafner.analysis.registry.AbstractParserTest;
7+
8+
/**
9+
* Tests the class {@link Gcc4Cc1Parser}.
10+
*
11+
* @author Akash Manna
12+
* @see <a href="https://issues.jenkins.io/browse/JENKINS-73509">Issue 73509</a>
13+
*/
14+
class Gcc4Cc1ParserTest extends AbstractParserTest {
15+
Gcc4Cc1ParserTest() {
16+
super("issue73509.txt");
17+
}
18+
19+
@Override
20+
protected Gcc4Cc1Parser createParser() {
21+
return new Gcc4Cc1Parser();
22+
}
23+
24+
@Override
25+
protected void assertThatIssuesArePresent(final Report report, final SoftAssertions softly) {
26+
softly.assertThat(report).hasSize(2);
27+
28+
softly.assertThat(report.get(0))
29+
.hasLineStart(0)
30+
.hasLineEnd(0)
31+
.hasMessage(
32+
"&apos;void* _builtin_memset(void*, int, long unsigned int)&apos;: specified size 18446744073709551612 exceeds maximum object size 9223372036854775807 [-Wstringop-overflow=]")
33+
.hasFileName("-")
34+
.hasCategory("stringop-overflow")
35+
.hasSeverity(Severity.WARNING_NORMAL);
36+
37+
softly.assertThat(report.get(1))
38+
.hasLineStart(0)
39+
.hasLineEnd(0)
40+
.hasMessage(
41+
"&apos;void* _builtin_memcpy(void*, const void*, long unsigned int)&apos;: specified size 18446744073709551612 exceeds maximum object size 9223372036854775807 [-Wstringop-overflow=]")
42+
.hasFileName("-")
43+
.hasCategory("stringop-overflow")
44+
.hasSeverity(Severity.WARNING_NORMAL);
45+
}
46+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
In member function 'void CInput::UpdateText(int, int, int)':
2+
cc1plus: warning: 'void* _builtin_memset(void*, int, long unsigned int)': specified size 18446744073709551612
3+
exceeds maximum object size 9223372036854775807 [-Wstringop-overflow=]
4+
5+
In member function 'void CInput::UpdateText(int, int, int)':
6+
cc1: warning: 'void* _builtin_memcpy(void*, const void*, long unsigned int)': specified size 18446744073709551612
7+
exceeds maximum object size 9223372036854775807 [-Wstringop-overflow=]
8+
9+
testhist.l:451: warning: `void yyunput(int, char*)' defined but not used

0 commit comments

Comments
 (0)