From ec5180dd5a837cec24569369580022f721d94828 Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Sat, 4 Apr 2026 17:21:03 +0000 Subject: [PATCH] fix: resolve all 9 SonarCloud reliability bugs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - S2159: GitHubActionsDetector — equals() on unrelated types (Boolean.TRUE.equals(key) → "true".equals(String.valueOf(key))) - S5998: NestJSControllerDetector L44,48 — regex stack overflow (added possessive quantifiers *+ to nested groups) - S5850: CSharpStructuresDetector L214 — regex precedence ((^/+|/+$) → (^/+)|(/+$) with explicit grouping) - S5855: GrpcServiceDetector L36 — redundant regex alternative (removed void| since [\w<>\[\]]+ already matches it) - S5998: RawSqlDetector L30,35,37 — regex stack overflow (added possessive quantifiers *+ to nested groups) - S3655: JpaEntityDetector L201 — Optional accessed without isPresent (stored Optional in variable before isPresent + get) Co-Authored-By: Claude Sonnet 4.6 --- .../iq/detector/config/GitHubActionsDetector.java | 2 +- .../iq/detector/csharp/CSharpStructuresDetector.java | 2 +- .../iq/detector/java/GrpcServiceDetector.java | 2 +- .../randomcodespace/iq/detector/java/JpaEntityDetector.java | 5 +++-- .../randomcodespace/iq/detector/java/RawSqlDetector.java | 6 +++--- .../iq/detector/typescript/NestJSControllerDetector.java | 4 ++-- 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/github/randomcodespace/iq/detector/config/GitHubActionsDetector.java b/src/main/java/io/github/randomcodespace/iq/detector/config/GitHubActionsDetector.java index ce2cc684..63d228ef 100644 --- a/src/main/java/io/github/randomcodespace/iq/detector/config/GitHubActionsDetector.java +++ b/src/main/java/io/github/randomcodespace/iq/detector/config/GitHubActionsDetector.java @@ -80,7 +80,7 @@ public DetectorResult detect(DetectorContext ctx) { if (onTriggers == null) { // SnakeYAML may parse bare 'on' key as Boolean.TRUE — search by entry value onTriggers = data.entrySet().stream() - .filter(e -> Boolean.TRUE.equals(e.getKey())) + .filter(e -> "true".equals(String.valueOf(e.getKey()))) .map(java.util.Map.Entry::getValue) .findFirst() .orElse(null); diff --git a/src/main/java/io/github/randomcodespace/iq/detector/csharp/CSharpStructuresDetector.java b/src/main/java/io/github/randomcodespace/iq/detector/csharp/CSharpStructuresDetector.java index 7286bd5a..d72cc7c1 100644 --- a/src/main/java/io/github/randomcodespace/iq/detector/csharp/CSharpStructuresDetector.java +++ b/src/main/java/io/github/randomcodespace/iq/detector/csharp/CSharpStructuresDetector.java @@ -211,7 +211,7 @@ protected DetectorResult detectWithRegex(DetectorContext ctx) { String path = httpPath != null ? httpPath : ""; String fullPath; if (finalClassRoute != null) { - fullPath = "/" + finalClassRoute.replaceAll("(^/+|/+$)", ""); + fullPath = "/" + finalClassRoute.replaceAll("(^/+)|(/+$)", ""); if (!path.isEmpty()) fullPath = fullPath + "/" + path.replaceAll("^/+", ""); } else { fullPath = !path.isEmpty() ? "/" + path.replaceAll("^/+", "") : "/"; diff --git a/src/main/java/io/github/randomcodespace/iq/detector/java/GrpcServiceDetector.java b/src/main/java/io/github/randomcodespace/iq/detector/java/GrpcServiceDetector.java index d73ff670..2d430189 100644 --- a/src/main/java/io/github/randomcodespace/iq/detector/java/GrpcServiceDetector.java +++ b/src/main/java/io/github/randomcodespace/iq/detector/java/GrpcServiceDetector.java @@ -33,7 +33,7 @@ public class GrpcServiceDetector extends AbstractRegexDetector { private static final Pattern GRPC_IMPL_RE = Pattern.compile( "class\\s+(\\w+)\\s+extends\\s+(\\w+)Grpc\\.(\\w+)ImplBase"); private static final Pattern METHOD_RE = Pattern.compile( - "public\\s+(?:void|[\\w<>\\[\\]]+)\\s+(\\w+)\\s*\\(\\s*(\\w+)"); + "public\\s+[\\w<>\\[\\]]+\\s+(\\w+)\\s*\\(\\s*(\\w+)"); private static final Pattern GRPC_STUB_RE = Pattern.compile( "(\\w+)Grpc\\.new(?:Blocking|Future)?Stub\\s*\\("); diff --git a/src/main/java/io/github/randomcodespace/iq/detector/java/JpaEntityDetector.java b/src/main/java/io/github/randomcodespace/iq/detector/java/JpaEntityDetector.java index c6b2c8fa..e5c76da9 100644 --- a/src/main/java/io/github/randomcodespace/iq/detector/java/JpaEntityDetector.java +++ b/src/main/java/io/github/randomcodespace/iq/detector/java/JpaEntityDetector.java @@ -197,8 +197,9 @@ private String resolveTargetEntity(AnnotationExpr ann, FieldDeclaration field) { Type type = var.getType(); if (!type.isClassOrInterfaceType()) continue; ClassOrInterfaceType cit = type.asClassOrInterfaceType(); - if (cit.getTypeArguments().isPresent()) { - var typeArgs = cit.getTypeArguments().get(); + var typeArgsOpt = cit.getTypeArguments(); + if (typeArgsOpt.isPresent()) { + var typeArgs = typeArgsOpt.get(); if (!typeArgs.isEmpty()) return typeArgs.get(0).asString(); } else { return cit.getNameAsString(); diff --git a/src/main/java/io/github/randomcodespace/iq/detector/java/RawSqlDetector.java b/src/main/java/io/github/randomcodespace/iq/detector/java/RawSqlDetector.java index 1d4e48fd..4e19e79a 100644 --- a/src/main/java/io/github/randomcodespace/iq/detector/java/RawSqlDetector.java +++ b/src/main/java/io/github/randomcodespace/iq/detector/java/RawSqlDetector.java @@ -27,14 +27,14 @@ public class RawSqlDetector extends AbstractRegexDetector { private static final Pattern CLASS_RE = Pattern.compile("(?:public\\s+)?class\\s+(\\w+)"); private static final Pattern QUERY_ANNO_RE = Pattern.compile( - "@Query\\s*\\(\\s*(?:value\\s*=\\s*)?\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"", Pattern.DOTALL); + "@Query\\s*\\(\\s*(?:value\\s*=\\s*)?\"([^\"\\\\]*+(?:\\\\.[^\"\\\\]*+)*+)\"", Pattern.DOTALL); private static final Pattern NATIVE_QUERY_RE = Pattern.compile("nativeQuery\\s*=\\s*true"); private static final Pattern JDBC_TEMPLATE_RE = Pattern.compile( "(?:jdbcTemplate|namedParameterJdbcTemplate|JdbcTemplate)\\s*\\." + "(?:query|queryForObject|queryForList|queryForMap|update|execute|batchUpdate)" - + "\\s*\\(\\s*\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"", Pattern.DOTALL); + + "\\s*\\(\\s*\"([^\"\\\\]*+(?:\\\\.[^\"\\\\]*+)*+)\"", Pattern.DOTALL); private static final Pattern EM_QUERY_RE = Pattern.compile( - "(?:entityManager|em)\\s*\\.(?:createNativeQuery|createQuery)\\s*\\(\\s*\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"", + "(?:entityManager|em)\\s*\\.(?:createNativeQuery|createQuery)\\s*\\(\\s*\"([^\"\\\\]*+(?:\\\\.[^\"\\\\]*+)*+)\"", Pattern.DOTALL); private static final Pattern TABLE_REF_RE = Pattern.compile( "\\b(?:FROM|JOIN|INTO|UPDATE|TABLE)\\s+(\\w+)", Pattern.CASE_INSENSITIVE); diff --git a/src/main/java/io/github/randomcodespace/iq/detector/typescript/NestJSControllerDetector.java b/src/main/java/io/github/randomcodespace/iq/detector/typescript/NestJSControllerDetector.java index 155dc8cb..43f92c93 100644 --- a/src/main/java/io/github/randomcodespace/iq/detector/typescript/NestJSControllerDetector.java +++ b/src/main/java/io/github/randomcodespace/iq/detector/typescript/NestJSControllerDetector.java @@ -41,11 +41,11 @@ public class NestJSControllerDetector extends AbstractAntlrDetector { private static final Pattern NESTJS_IMPORT = Pattern.compile("from\\s+['\"]@nestjs/"); private static final Pattern CONTROLLER_PATTERN = Pattern.compile( - "@Controller\\(\\s*['\"`]?([^'\"`\\)\\s]*)['\"`]?\\s*\\)(?:\\s*@\\w+\\([^)]{0,200}\\))*\\s*\\n\\s*(?:export\\s+)?class\\s+(\\w+)" + "@Controller\\(\\s*['\"`]?([^'\"`\\)\\s]*)['\"`]?\\s*\\)(?:\\s*+@\\w+\\([^)]{0,200}\\))*+\\s*\\n\\s*(?:export\\s+)?class\\s+(\\w+)" ); private static final Pattern ROUTE_PATTERN = Pattern.compile( - "@(Get|Post|Put|Delete|Patch|Options|Head)\\(\\s*['\"`]?([^'\"`\\)\\s]*)['\"`]?\\s*\\)(?:\\s*@\\w+\\([^)]{0,200}\\))*\\s*\\n\\s*(?:async\\s+)?(\\w+)" + "@(Get|Post|Put|Delete|Patch|Options|Head)\\(\\s*['\"`]?([^'\"`\\)\\s]*)['\"`]?\\s*\\)(?:\\s*+@\\w+\\([^)]{0,200}\\))*+\\s*\\n\\s*(?:async\\s+)?(\\w+)" ); @Override