From c8efd739b708964a4fc57fb72cd363360a8e0aff Mon Sep 17 00:00:00 2001 From: Davide Angelocola Date: Fri, 26 Jun 2026 22:54:01 +0200 Subject: [PATCH] fix(sonar): array-aware equals/hashCode/toString on ZstdEncodingEncoder records SonarCloud flagged the private FrameLayout (long[] components) and Frames (byte[] metadata) records as reliability bugs (java:S6218): a record with array components gets a default equals/hashCode that compares array identity, not content. Both are BUG-severity and fail the new-code reliability gate. Fix by overriding equals/hashCode/toString with Arrays.equals/hashCode/toString (and Objects for the List/scalar fields) so they consider array content, rather than suppressing the rule. Co-Authored-By: Claude Opus 4.8 --- .../writer/encode/ZstdEncodingEncoder.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/writer/src/main/java/io/github/dfa1/vortex/writer/encode/ZstdEncodingEncoder.java b/writer/src/main/java/io/github/dfa1/vortex/writer/encode/ZstdEncodingEncoder.java index b022ea8e..8307a8f2 100644 --- a/writer/src/main/java/io/github/dfa1/vortex/writer/encode/ZstdEncodingEncoder.java +++ b/writer/src/main/java/io/github/dfa1/vortex/writer/encode/ZstdEncodingEncoder.java @@ -14,7 +14,9 @@ import java.lang.foreign.ValueLayout; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.Objects; /// Write-only encoder for `vortex.zstd`. /// @@ -145,10 +147,41 @@ private EncodeResult buildNullableResult( /// Byte spans and value counts of each frame; spans sum to the payload size. private record FrameLayout(long[] byteLengths, long[] valueCounts) { + @Override + public boolean equals(Object o) { + return o instanceof FrameLayout(long[] bl, long[] vc) + && Arrays.equals(byteLengths, bl) && Arrays.equals(valueCounts, vc); + } + + @Override + public int hashCode() { + return 31 * Arrays.hashCode(byteLengths) + Arrays.hashCode(valueCounts); + } + + @Override + public String toString() { + return "FrameLayout[byteLengths=" + Arrays.toString(byteLengths) + + ", valueCounts=" + Arrays.toString(valueCounts) + "]"; + } } /// Compressed frame payloads paired with the encoded `ZstdMetadata` describing them. private record Frames(List compressed, byte[] metadata) { + @Override + public boolean equals(Object o) { + return o instanceof Frames(List c, byte[] m) + && Objects.equals(compressed, c) && Arrays.equals(metadata, m); + } + + @Override + public int hashCode() { + return 31 * Objects.hashCode(compressed) + Arrays.hashCode(metadata); + } + + @Override + public String toString() { + return "Frames[compressed=" + compressed + ", metadata=" + Arrays.toString(metadata) + "]"; + } } private static int[] frameBufferIndices(int frameCount, int base) {