Skip to content

Commit d4d73b2

Browse files
committed
make it more simpler, remove generic for xml, update tests
1 parent 9e7b493 commit d4d73b2

3 files changed

Lines changed: 32 additions & 61 deletions

File tree

lib/errorlogger.cpp

Lines changed: 23 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -225,39 +225,32 @@ static std::string makeGeneric(const std::string &message)
225225
{
226226
std::string result = message;
227227

228-
// Handle format string patterns first (these are complex and specific)
229-
result = std::regex_replace(
230-
result,
231-
std::regex(
232-
R"(%[a-zA-Z0-9]+ in format string \(no\. \d+\) requires '[^']*' but the argument type is '[^']*'\.)"),
233-
"Format specifier in format string requires different argument type than provided.");
234-
result = std::regex_replace(
235-
result,
236-
std::regex(R"(%[a-zA-Z0-9]+ in format string \(no\. N\) requires '[^']*' but the argument type is '[^']*'\.)"),
237-
"Format specifier in format string requires different argument type than provided.");
228+
// Handle format string patterns first (before general single-quoted replacement)
229+
result = std::regex_replace(result, std::regex(R"(%[a-zA-Z0-9]+)"), "format specifier");
238230

239-
// Handle specific pointer casting patterns
240-
// Handle multi-word types like "unsigned char", "const float", etc.
231+
// Handle specific casting patterns
241232
result = std::regex_replace(
242233
result,
243234
std::regex(
244-
R"(Casting between (?:(?:const|unsigned|signed)\s+)*[a-zA-Z_][a-zA-Z0-9_]*\s*\*\s*and (?:(?:const|unsigned|signed)\s+)*[a-zA-Z_][a-zA-Z0-9_]*\s*\*\s*which have)"),
235+
R"(Casting between (?:(?:const\s+|unsigned\s+|signed\s+)*[a-zA-Z_][a-zA-Z0-9_]*\s*\*+\s*and\s*(?:const\s+|unsigned\s+|signed\s+)*[a-zA-Z_][a-zA-Z0-9_]*\s*\*+) which have)"),
245236
"Casting between incompatible pointer types which have");
246237

247-
// Handle iterator condition patterns - be specific about the pattern
238+
// Handle specific pointer type patterns (after casting patterns)
248239
result = std::regex_replace(
249-
result,
250-
std::regex(
251-
R"(Either the condition '[^']*' is redundant or there is possible dereference of an invalid iterator: [^\.]*\.)"),
252-
"Either the condition is redundant or there is possible dereference of an invalid iterator.");
240+
result, std::regex(R"(\b(?:const\s+|unsigned\s+|signed\s+)*[a-zA-Z_][a-zA-Z0-9_]*\s*\*+)"), "pointer type");
241+
242+
// Handle specific patterns that need special treatment
243+
// Iterator condition patterns
253244
result = std::regex_replace(
254245
result,
255246
std::regex(
256-
R"(Either the condition '[^']*' is redundant or there is possible dereference of an invalid iterator\.)"),
247+
R"(Either the condition '[^']*' is redundant or there is possible dereference of an invalid iterator[^.]*\.)"),
257248
"Either the condition is redundant or there is possible dereference of an invalid iterator.");
258249

259-
// Handle patterns that can result in empty quotes first
260-
// Replace "Variable 'name'" -> "Variable" (avoiding empty quotes)
250+
// Access moved variable patterns
251+
result = std::regex_replace(result, std::regex(R"(Access of moved variable '[^']*')"), "Access of moved variable");
252+
253+
// Variable/function/parameter patterns (before general replacement)
261254
result = std::regex_replace(result, std::regex(R"(Variable '[^']*')"), "Variable");
262255
result = std::regex_replace(result, std::regex(R"(variable '[^']*')"), "variable");
263256
result = std::regex_replace(result, std::regex(R"(Function '[^']*')"), "Function");
@@ -267,54 +260,25 @@ static std::string makeGeneric(const std::string &message)
267260
result = std::regex_replace(result, std::regex(R"(Member variable '[^']*')"), "Member variable");
268261
result = std::regex_replace(result, std::regex(R"(member variable '[^']*')"), "member variable");
269262

270-
// Handle patterns like "Memory pointed to by 'var'" -> "Memory pointed to by variable"
271-
result = std::regex_replace(result, std::regex(R"(Memory pointed to by '[^']*')"), "Memory pointed to by variable");
272-
result = std::regex_replace(result, std::regex(R"(Dereferencing '[^']*')"), "Dereferencing variable");
273-
result = std::regex_replace(
274-
result, std::regex(R"(assignment of '[^']*' to itself)"), "assignment of variable to itself");
275-
result = std::regex_replace(result,
276-
std::regex(R"(Redundant assignment of '[^']*' to itself)"),
277-
"Redundant assignment of variable to itself");
278-
279-
// Handle function return patterns
280-
result = std::regex_replace(
281-
result, std::regex(R"(Function '[^']*' should return member '[^']*' by)"), "Function should return member by");
282-
result = std::regex_replace(
283-
result, std::regex(R"(Function should return member '[^']*' by)"), "Function should return member by");
284-
285-
// Handle class::member patterns
286-
result = std::regex_replace(result, std::regex(R"('[^:]*::[^']*')"), "'ClassName::member'");
263+
// Replace double-quoted strings with generic placeholder
264+
result = std::regex_replace(result, std::regex(R"("(?:[^"\\]|\\.)*")"), "\"string\"");
287265

288-
// Handle array patterns - be more specific to avoid overly generic results
289-
result = std::regex_replace(result, std::regex(R"(Array '[^']*\[.*?\]')"), "Array 'array[index]'");
290-
result = std::regex_replace(result, std::regex(R"('[a-zA-Z_][a-zA-Z0-9_]*\[.*?\]')"), "'array[index]'");
266+
// Replace all remaining single-quoted identifiers with generic placeholder
267+
result = std::regex_replace(result, std::regex(R"('[^']*')"), "'identifier'");
291268

292-
// Replace specific numbers with generic terms
269+
// Replace all numbers with generic placeholder
293270
result = std::regex_replace(result, std::regex(R"(\b\d+\b)"), "N");
294271

295272
// Replace array access patterns
296273
result = std::regex_replace(result, std::regex(R"(\[[^\]]+\])"), "[index]");
297274

298-
// Replace remaining single-quoted identifiers, but be careful about empty results
299-
result = std::regex_replace(result, std::regex(R"('[a-zA-Z_][a-zA-Z0-9_]*')"), "'identifier'");
300-
301-
// Clean up redundant patterns
275+
// Clean up patterns that may have resulted in redundant text
302276
result = std::regex_replace(result, std::regex(R"(Variable 'identifier')"), "Variable");
303277
result = std::regex_replace(result, std::regex(R"(Function 'identifier')"), "Function");
304278
result = std::regex_replace(result, std::regex(R"(Parameter 'identifier')"), "Parameter");
305279
result = std::regex_replace(result, std::regex(R"(Member variable 'identifier')"), "Member variable");
306280

307-
// Clean up empty quotes that may have been created by replacements
308-
result = std::regex_replace(result, std::regex(R"(\s*''\s*)"), " ");
309-
result = std::regex_replace(result, std::regex(R"(^''\s*)"), "");
310-
result = std::regex_replace(result, std::regex(R"(\s*''$)"), "");
311-
result = std::regex_replace(result, std::regex(R"(\s+'')"), "");
312-
result = std::regex_replace(result, std::regex(R"(''\s+)"), "");
313-
result = std::regex_replace(result, std::regex(R"('')"), "");
314-
315281
// Clean up trailing colons that don't reference anything
316-
// Examples: "Null pointer dereference:" -> "Null pointer dereference"
317-
// "Memory leak:" -> "Memory leak"
318282
result = std::regex_replace(result, std::regex(R"(:\s*$)"), "");
319283

320284
// Clean up multiple spaces
@@ -616,8 +580,9 @@ std::string ErrorMessage::toXML() const
616580
printer.PushAttribute("classification", classification.c_str());
617581
printer.PushAttribute("msg", fixInvalidChars(mShortMessage).c_str());
618582
printer.PushAttribute("verbose", fixInvalidChars(mVerboseMessage).c_str());
619-
if (!mGenericMessage.empty())
620-
printer.PushAttribute("generic", fixInvalidChars(mGenericMessage).c_str());
583+
// TODO: Generic message was added for SARIF output format, consider whether to include in XML
584+
// if (!mGenericMessage.empty())
585+
// printer.PushAttribute("generic", fixInvalidChars(mGenericMessage).c_str());
621586
if (cwe.id)
622587
printer.PushAttribute("cwe", cwe.id);
623588
if (hash)

test/testerrorlogger.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,7 @@ class TestErrorLogger : public TestFixture {
508508
"17 Programming error"
509509
"17 Programming error"
510510
"0 "
511+
"17 Programming error"
511512
"0 ", msg_str);
512513

513514
ErrorMessage msg2;
@@ -550,9 +551,11 @@ class TestErrorLogger : public TestFixture {
550551
"1 0"
551552
"0 "
552553
"8 test.cpp"
554+
"1 0"
553555
"17 Programming error"
554556
"17 Programming error"
555557
"0 "
558+
"17 Programming error"
556559
"0 ";
557560
ErrorMessage msg;
558561
ASSERT_THROW_INTERNAL_EQUALS(msg.deserialize(str), INTERNAL, "Internal Error: Deserialization of error message failed - invalid CWE ID - not an integer");
@@ -563,12 +566,13 @@ class TestErrorLogger : public TestFixture {
563566
"5 error"
564567
"1 0"
565568
"7 invalid" // hash
566-
"1 0"
567569
"0 "
568570
"8 test.cpp"
571+
"1 0"
569572
"17 Programming error"
570573
"17 Programming error"
571574
"0 "
575+
"17 Programming error"
572576
"0 ";
573577
ErrorMessage msg;
574578
ASSERT_THROW_INTERNAL_EQUALS(msg.deserialize(str), INTERNAL, "Internal Error: Deserialization of error message failed - invalid hash - not an integer");
@@ -606,6 +610,7 @@ class TestErrorLogger : public TestFixture {
606610
"33 Illegal character in \"foo\\001bar\""
607611
"33 Illegal character in \"foo\\001bar\""
608612
"0 "
613+
"29 Illegal character in \"string\""
609614
"0 ", msg_str);
610615

611616
ErrorMessage msg2;
@@ -634,6 +639,7 @@ class TestErrorLogger : public TestFixture {
634639
"17 Programming error"
635640
"17 Programming error"
636641
"0 "
642+
"17 Programming error"
637643
"1 "
638644
"27 654\t33\t[]:;,()\t:/,;\tabcd:/,", msg_str);
639645

test/testsarif.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ int main() {
249249
TEST_CASE(sarifCweTags);
250250
TEST_CASE(sarifRuleCoverage);
251251
TEST_CASE(sarifSeverityLevels);
252-
TEST_CASE(sarifNonSecurityRules);
252+
TEST_CASE(sarifSecurityRules);
253253
TEST_CASE(sarifInvalidScanfArgTypeGeneric);
254254
TEST_CASE(sarifPassedByValueGeneric);
255255
TEST_CASE(sarifUninitMemberVarGeneric);
@@ -895,7 +895,7 @@ int main() {
895895
}
896896
}
897897

898-
void sarifNonSecurityRules()
898+
void sarifSecurityRules()
899899
{
900900
const std::string sarif = runCppcheckSarif(testCode);
901901

0 commit comments

Comments
 (0)