Rule for Request #707: AvoidRecreatingMessageDigests - MessageDigest.getInstance is expensive because of classloading - #710
Rule for Request #707: AvoidRecreatingMessageDigests - MessageDigest.getInstance is expensive because of classloading#710jborgers wants to merge 1 commit into
Conversation
…getInstance is expensive because of classloading
|
stokpop
left a comment
There was a problem hiding this comment.
Some questions and possible improvements.
| LocalVariableDeclaration[ClassType[pmd-java:typeIs('java.security.MessageDigest')]]/VariableDeclarator/MethodCall[@MethodName='getInstance'] | ||
| | MethodCall[starts-with(@MethodName,'digest')]/ConstructorCall[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] | ||
| | LocalVariableDeclaration[ClassType[pmd-java:typeIs('java.security.MessageDigest')]]//MethodCall/TypeExpression[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] | ||
| | MethodCall[starts-with(@MethodName,'sha') or starts-with(@MethodName,'md')]/TypeExpression[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] |
There was a problem hiding this comment.
Document why these two method prefixes sha and md are ok. Not too brittle? There are also shake prefixes in DigestUtils... oh those also start with sha.
There was a problem hiding this comment.
Pull request overview
Adds the AvoidRecreatingMessageDigests PMD rule requested in issue #707.
Changes:
- Detects repeated
MessageDigestandDigestUtilscreation. - Adds rule tests and documentation.
- Publishes the rule across distributed rulesets.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
src/main/resources/category/java/common.xml |
Defines the XPath rule. |
rulesets/java/jpinpoint-rules.xml |
Adds the distributed rule. |
rulesets/java/jpinpoint-java-rules.xml |
Adds the Java ruleset copy. |
src/test/java/.../AvoidRecreatingMessageDigestsTest.java |
Adds the PMD test harness. |
src/test/resources/.../AvoidRecreatingMessageDigests.xml |
Adds positive and negative cases. |
docs/JavaCodePerformance.md |
Documents the performance guidance. |
Suppressed comments (1)
src/test/resources/com/jpinpoint/perf/lang/java/ruleset/common/xml/AvoidRecreatingMessageDigests.xml:59
- This negative case returns
updateDigestdirectly, so it never exercises the XPath branch that matches aDigestUtilscall inside aMessageDigestlocal declaration. Assign the returned (same) digest to a local first; the current rule will then expose its false positive and the corrected signature-based selector will keep the case clean.
MessageDigest good3DigestUtils() {
MessageDigest mdLocal = mdField.clone();
return DigestUtils.updateDigest(mdLocal, dataToDigest);
}
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| LocalVariableDeclaration[ClassType[pmd-java:typeIs('java.security.MessageDigest')]]/VariableDeclarator/MethodCall[@MethodName='getInstance'] | ||
| | MethodCall[starts-with(@MethodName,'digest')]/ConstructorCall[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] | ||
| | LocalVariableDeclaration[ClassType[pmd-java:typeIs('java.security.MessageDigest')]]//MethodCall/TypeExpression[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] | ||
| | MethodCall[starts-with(@MethodName,'sha') or starts-with(@MethodName,'md')]/TypeExpression[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] |
| LocalVariableDeclaration[ClassType[pmd-java:typeIs('java.security.MessageDigest')]]/VariableDeclarator/MethodCall[@MethodName='getInstance'] | ||
| | MethodCall[starts-with(@MethodName,'digest')]/ConstructorCall[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] | ||
| | LocalVariableDeclaration[ClassType[pmd-java:typeIs('java.security.MessageDigest')]]//MethodCall/TypeExpression[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] | ||
| | MethodCall[starts-with(@MethodName,'sha') or starts-with(@MethodName,'md')]/TypeExpression[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] |
| LocalVariableDeclaration[ClassType[pmd-java:typeIs('java.security.MessageDigest')]]/VariableDeclarator/MethodCall[@MethodName='getInstance'] | ||
| | MethodCall[starts-with(@MethodName,'digest')]/ConstructorCall[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] | ||
| | LocalVariableDeclaration[ClassType[pmd-java:typeIs('java.security.MessageDigest')]]//MethodCall/TypeExpression[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] | ||
| | MethodCall[starts-with(@MethodName,'sha') or starts-with(@MethodName,'md')]/TypeExpression[pmd-java:typeIs('org.apache.commons.codec.digest.DigestUtils')] |



No description provided.