From f5d308a28c05fce7e2b973fca00fa5ddc5b37658 Mon Sep 17 00:00:00 2001 From: Aleksey Pivovarov Date: Mon, 17 Apr 2017 18:48:54 +0300 Subject: [PATCH] take absolute value of a remainder, not a remainder of an absolute value `Math.abs(INT_MIN) == INT_MIN` as a result, `Math.abs(x) % 10` might return negative value. --- .../codeInsight/daemon/LightRainbowHighlightingTest.java | 5 +++++ .../src/com/intellij/codeInsight/daemon/UsedColors.java | 2 +- .../intellij/psi/statistics/impl/StatisticsManagerImpl.java | 2 +- .../com/intellij/statistics/StatisticsManagerTest.java | 3 +++ platform/util/src/com/intellij/util/BloomFilterBase.java | 4 ++-- .../com/intellij/vcs/log/graph/DefaultColorGenerator.java | 2 +- 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightRainbowHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightRainbowHighlightingTest.java index 008ad6b0b02a..795ab0810be0 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightRainbowHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightRainbowHighlightingTest.java @@ -15,6 +15,7 @@ */ package com.intellij.codeInsight.daemon; +import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import org.jetbrains.annotations.NotNull; @@ -76,6 +77,10 @@ public class LightRainbowHighlightingTest extends LightCodeInsightFixtureTestCas "}", true, true); } + public void testBadStringHashValue() { + int color = UsedColors.getOrAddColorIndex(new UserDataHolderBase(), "JHZaWC", 5); + assertEquals(3, color); + } void checkRainbow(@NotNull String code, boolean isRainbowOn, boolean withColor) throws Exception { myFixture.testRainbow( diff --git a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java index a8a708d4c6b4..5094a0b943ee 100644 --- a/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java +++ b/platform/analysis-impl/src/com/intellij/codeInsight/daemon/UsedColors.java @@ -97,7 +97,7 @@ public class UsedColors { } private static int hashColor(@NotNull String name, int colorsCount) { - return Math.abs(StringHash.murmur(name, 0x55AA)) % colorsCount; + return Math.abs(StringHash.murmur(name, 0x55AA) % colorsCount); } @Contract(pure = true) diff --git a/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsManagerImpl.java b/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsManagerImpl.java index 76453a4f7828..c08c612fb6ba 100644 --- a/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/psi/statistics/impl/StatisticsManagerImpl.java @@ -180,7 +180,7 @@ public class StatisticsManagerImpl extends StatisticsManager { } private static int getUnitNumber(String key1) { - return Math.abs(key1.hashCode()) % UNIT_COUNT; + return Math.abs(key1.hashCode() % UNIT_COUNT); } private static boolean createStoreFolder(){ diff --git a/platform/platform-tests/testSrc/com/intellij/statistics/StatisticsManagerTest.java b/platform/platform-tests/testSrc/com/intellij/statistics/StatisticsManagerTest.java index 3c80b44769e7..6f03aeabc323 100644 --- a/platform/platform-tests/testSrc/com/intellij/statistics/StatisticsManagerTest.java +++ b/platform/platform-tests/testSrc/com/intellij/statistics/StatisticsManagerTest.java @@ -69,4 +69,7 @@ public class StatisticsManagerTest extends LightPlatformTestCase { assertEquals(Integer.MAX_VALUE, new StatisticsInfo("anotherContext", "value0").getLastUseRecency()); } + public void testBadHashValue() { + StatisticsManager.getInstance().getUseCount(new StatisticsInfo("MVFOFVB", "")); + } } diff --git a/platform/util/src/com/intellij/util/BloomFilterBase.java b/platform/util/src/com/intellij/util/BloomFilterBase.java index 6779ae273d2b..ec2cc50022af 100644 --- a/platform/util/src/com/intellij/util/BloomFilterBase.java +++ b/platform/util/src/com/intellij/util/BloomFilterBase.java @@ -44,14 +44,14 @@ public class BloomFilterBase { protected final void addIt(int prime, int prime2) { for(int i = 0; i < myHashFunctionCount; ++i) { - int abs = Math.abs(i * prime + prime2 * (myHashFunctionCount - i)) % myBitsCount; + int abs = Math.abs((i * prime + prime2 * (myHashFunctionCount - i)) % myBitsCount); myElementsSet[abs >> BITS_PER_ELEMENT] |= (1L << abs); } } protected final boolean maybeContains(int prime, int prime2) { for(int i = 0; i < myHashFunctionCount; ++i) { - int abs = Math.abs(i * prime + prime2 * (myHashFunctionCount - i)) % myBitsCount; + int abs = Math.abs((i * prime + prime2 * (myHashFunctionCount - i)) % myBitsCount); if ((myElementsSet[abs >> BITS_PER_ELEMENT] & (1L << abs)) == 0) return false; } diff --git a/platform/vcs-log/impl/src/com/intellij/vcs/log/graph/DefaultColorGenerator.java b/platform/vcs-log/impl/src/com/intellij/vcs/log/graph/DefaultColorGenerator.java index a92692ede6ba..3048c739a8ac 100644 --- a/platform/vcs-log/impl/src/com/intellij/vcs/log/graph/DefaultColorGenerator.java +++ b/platform/vcs-log/impl/src/com/intellij/vcs/log/graph/DefaultColorGenerator.java @@ -31,7 +31,7 @@ public class DefaultColorGenerator implements ColorGenerator { } private static int rangeFix(int n) { - return Math.abs(n) % 100 + 70; + return Math.abs(n % 100) + 70; } @NotNull