You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ah...@apache.org on 2025/09/22 12:56:49 UTC

(commons-rng) 04/04: pmd fix: avoid assignment in operand

This is an automated email from the ASF dual-hosted git repository.

aherbert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-rng.git

commit 47225b50c565b5ed7b99a7c16b43b2c2e4d210a6
Author: Alex Herbert <ah...@apache.org>
AuthorDate: Mon Sep 22 13:23:19 2025 +0100

    pmd fix: avoid assignment in operand
---
 .../commons/rng/core/source32/JenkinsSmallFast32.java  |  4 +++-
 .../rng/core/source32/MiddleSquareWeylSequence.java    |  9 ++++++---
 .../rng/core/source32/MultiplyWithCarry256.java        |  3 ++-
 .../commons/rng/core/source64/JenkinsSmallFast64.java  |  4 +++-
 .../apache/commons/rng/core/source64/SplitMix64.java   |  3 ++-
 .../MarsagliaTsangWangDiscreteSampler.java             | 18 +++++++++++++++---
 .../commons/rng/simple/internal/SeedFactory.java       |  3 ++-
 src/conf/pmd/pmd-ruleset.xml                           |  6 ++++++
 8 files changed, 39 insertions(+), 11 deletions(-)

diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/JenkinsSmallFast32.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/JenkinsSmallFast32.java
index 4b533317..eb3cac12 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/JenkinsSmallFast32.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/JenkinsSmallFast32.java
@@ -53,7 +53,9 @@ public class JenkinsSmallFast32 extends IntProvider {
      */
     private void setSeedInternal(int seed) {
         a = 0xf1ea5eed;
-        b = c = d = seed;
+        b = seed;
+        c = seed;
+        d = seed;
         for (int i = 0; i < 20; i++) {
             next();
         }
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequence.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequence.java
index ce071081..3761b475 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequence.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MiddleSquareWeylSequence.java
@@ -125,7 +125,8 @@ public class MiddleSquareWeylSequence extends IntProvider {
     @Override
     public int next() {
         x *= x;
-        x += w += s;
+        w += s;
+        x += w;
         x = (x >>> 32) | (x << 32);
         return (int) x;
     }
@@ -135,11 +136,13 @@ public class MiddleSquareWeylSequence extends IntProvider {
     public long nextLong() {
         // Avoid round trip from long to int to long by performing two iterations inline
         x *= x;
-        x += w += s;
+        w += s;
+        x += w;
         final long i1 = x & 0xffffffff00000000L;
         x = (x >>> 32) | (x << 32);
         x *= x;
-        x += w += s;
+        w += s;
+        x += w;
         final long i2 = x >>> 32;
         x = i2 | x << 32;
         return i1 | i2;
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MultiplyWithCarry256.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MultiplyWithCarry256.java
index 32cb0178..8cd619a6 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MultiplyWithCarry256.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source32/MultiplyWithCarry256.java
@@ -113,6 +113,7 @@ public class MultiplyWithCarry256 extends IntProvider {
         index &= 0xff;
         final long t = A * (state[index] & 0xffffffffL) + carry;
         carry = (int) (t >> 32);
-        return state[index++] = (int) t;
+        state[index++] = (int) t;
+        return (int) t;
     }
 }
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/JenkinsSmallFast64.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/JenkinsSmallFast64.java
index 53c56af5..3e354ce4 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/JenkinsSmallFast64.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/JenkinsSmallFast64.java
@@ -52,7 +52,9 @@ public class JenkinsSmallFast64 extends LongProvider {
      */
     private void setSeedInternal(long seed) {
         a = 0xf1ea5eedL;
-        b = c = d = seed;
+        b = seed;
+        c = seed;
+        d = seed;
         for (int i = 0; i < 20; i++) {
             next();
         }
diff --git a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/SplitMix64.java b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/SplitMix64.java
index ffea0a15..a39d3e1a 100644
--- a/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/SplitMix64.java
+++ b/commons-rng-core/src/main/java/org/apache/commons/rng/core/source64/SplitMix64.java
@@ -56,7 +56,8 @@ public class SplitMix64 extends LongProvider {
     /** {@inheritDoc} */
     @Override
     public long next() {
-        long z = state += 0x9e3779b97f4a7c15L;
+        long z = state + 0x9e3779b97f4a7c15L;
+        state = z;
         z = (z ^ (z >>> 30)) * 0xbf58476d1ce4e5b9L;
         z = (z ^ (z >>> 27)) * 0x94d049bb133111ebL;
         return z ^ (z >>> 31);
diff --git a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSampler.java b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSampler.java
index 15d282b3..6ca89252 100644
--- a/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSampler.java
+++ b/commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/MarsagliaTsangWangDiscreteSampler.java
@@ -189,7 +189,11 @@ public final class MarsagliaTsangWangDiscreteSampler {
             t2 = t1 + (n2 << 18);
             t3 = t2 + (n3 << 12);
             t4 = t3 + (n4 << 6);
-            n1 = n2 = n3 = n4 = n5 = 0;
+            n1 = 0;
+            n2 = 0;
+            n3 = 0;
+            n4 = 0;
+            n5 = 0;
 
             // Fill tables
             for (int i = 0; i < prob.length; i++) {
@@ -331,7 +335,11 @@ public final class MarsagliaTsangWangDiscreteSampler {
             t2 = t1 + (n2 << 18);
             t3 = t2 + (n3 << 12);
             t4 = t3 + (n4 << 6);
-            n1 = n2 = n3 = n4 = n5 = 0;
+            n1 = 0;
+            n2 = 0;
+            n3 = 0;
+            n4 = 0;
+            n5 = 0;
 
             // Fill tables
             for (int i = 0; i < prob.length; i++) {
@@ -470,7 +478,11 @@ public final class MarsagliaTsangWangDiscreteSampler {
             t2 = t1 + (n2 << 18);
             t3 = t2 + (n3 << 12);
             t4 = t3 + (n4 << 6);
-            n1 = n2 = n3 = n4 = n5 = 0;
+            n1 = 0;
+            n2 = 0;
+            n3 = 0;
+            n4 = 0;
+            n5 = 0;
 
             // Fill tables
             for (int i = 0; i < prob.length; i++) {
diff --git a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/SeedFactory.java b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/SeedFactory.java
index 62627da1..740e42bf 100644
--- a/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/SeedFactory.java
+++ b/commons-rng-simple/src/main/java/org/apache/commons/rng/simple/internal/SeedFactory.java
@@ -374,7 +374,8 @@ public final class SeedFactory {
         final int end = from + len;
         int i = from;
         while (i < end) {
-            long v = MixFunctions.stafford13(x += MixFunctions.GOLDEN_RATIO_64);
+            x += MixFunctions.GOLDEN_RATIO_64;
+            long v = MixFunctions.stafford13(x);
             for (int j = 0; j < 8; j++) {
                 seed[i++] = (byte) v;
                 v >>>= 8;
diff --git a/src/conf/pmd/pmd-ruleset.xml b/src/conf/pmd/pmd-ruleset.xml
index 4f35486c..770b34e0 100644
--- a/src/conf/pmd/pmd-ruleset.xml
+++ b/src/conf/pmd/pmd-ruleset.xml
@@ -290,6 +290,12 @@
   <rule ref="category/java/errorprone.xml/AssignmentInOperand">
     <properties>
       <property name="allowIncrementDecrement" value="true" />
+      <!-- Reassignment of the constructor seed is allowed to extend the seed length. -->
+      <property name="violationSuppressXPath"
+        value="./ancestor-or-self::ClassDeclaration[@SimpleName='AbstractL64X128' or
+          @SimpleName='L128X1024Mix' or @SimpleName='L128X128Mix' or
+          @SimpleName='L128X256Mix' or @SimpleName='L64X1024Mix' or
+          @SimpleName='L64X256Mix']"/>
     </properties>
   </rule>