From a6bc771fc5a401646e9d8c0fe456716c3fe6a5b5 Mon Sep 17 00:00:00 2001 From: lzray-universe Date: Tue, 19 May 2026 23:14:13 +0800 Subject: [PATCH] Fix OOB read in samplePerlinBeta17Terrain and add Beta 1.7 regression tests --- noise.c | 12 +++---- tests.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 6 deletions(-) diff --git a/noise.c b/noise.c index 4de0ac86..50607b17 100644 --- a/noise.c +++ b/noise.c @@ -258,13 +258,13 @@ void samplePerlinBeta17Terrain(const PerlinNoise *noise, double *v, if (yi == 0 || i2 != genFlag) { genFlag = i2; - int a1 = idx[i1] + i2; - int b1 = idx[i1+1] + i2; + int a1 = (idx[i1] + i2) & 0xff; + int b1 = (idx[i1+1] + i2) & 0xff; - int a2 = idx[a1] + i3; - int a3 = idx[a1+1] + i3; - int b2 = idx[b1] + i3; - int b3 = idx[b1+1] + i3; + int a2 = (idx[a1] + i3) & 0xff; + int a3 = (idx[a1+1] + i3) & 0xff; + int b2 = (idx[b1] + i3) & 0xff; + int b3 = (idx[b1+1] + i3) & 0xff; double m1 = indexedLerp(idx[a2], d1, d2, d3); double l2 = indexedLerp(idx[b2], d1-1, d2, d3); diff --git a/tests.c b/tests.c index 35c99ed5..6ab5b188 100644 --- a/tests.c +++ b/tests.c @@ -490,6 +490,108 @@ int getStructureConfig_override(int stype, int mc, StructureConfig *sconf) } +static int testBeta17BiomeDeterminism() +{ + Generator g; + setupGenerator(&g, MC_B1_7, 0); + + const uint64_t seed = 262; + int i, run; + + int areas[3][2] = {{0,0}, {4,4}, {16,16}}; + + for (i = 0; i < 3; i++) + { + int scale = areas[i][0]; + int expect = 0; + int ok = 1; + + for (run = 0; run < 10; run++) + { + applySeed(&g, 0, seed); + SurfaceNoiseBeta snb; + initSurfaceNoiseBeta(&snb, seed); + Range r = {scale ? scale : 4, 0, 0, 1, 1}; + int id; + genBiomeNoiseBetaScaled(&g.bnb, &snb, &id, r); + if (run == 0) + expect = id; + else if (id != expect) + ok = 0; + } + printf(" B1.7 scale=%d seed=%llu: biome=%d %s\n", + scale, (unsigned long long)seed, expect, ok ? "\033[1;92mOK\033[0m" : "\033[1;91mUNSTABLE\033[0m"); + if (!ok) return -1; + } + return 0; +} + +static int testBeta17BiomeRegression() +{ + Generator g; + setupGenerator(&g, MC_B1_7, 0); + + const uint64_t seeds[] = {0, 1, 2, 10, 100, 262, 1000}; + int ns = sizeof(seeds) / sizeof(seeds[0]); + + uint32_t hash = 0; + int sx, sz; + for (sx = 0; sx < ns; sx++) + { + uint64_t seed = seeds[sx]; + applySeed(&g, 0, seed); + SurfaceNoiseBeta snb; + initSurfaceNoiseBeta(&snb, seed); + int x, z; + for (x = -16; x <= 16; x += 4) + { + for (z = -16; z <= 16; z += 4) + { + Range r = {4, x, z, 1, 1}; + int id; + genBiomeNoiseBetaScaled(&g.bnb, &snb, &id, r); + hash = hash32(hash ^ hash32(id + ((uint32_t)(x+128) << 8) + ((uint32_t)(z+128) << 16))); + } + } + } + printf(" B1.7 regression hash: %08x\n", hash); + + static volatile uint32_t vhash; + vhash = hash; + return 0; +} + +static int testBeta17BiomeValidity() +{ + Generator g; + setupGenerator(&g, MC_B1_7, 0); + + uint64_t seed; + for (seed = 0; seed < 500; seed++) + { + applySeed(&g, 0, seed); + SurfaceNoiseBeta snb; + initSurfaceNoiseBeta(&snb, seed); + int x, z; + for (x = -200; x <= 200; x += 50) + { + for (z = -200; z <= 200; z += 50) + { + Range r = {4, x, z, 1, 1}; + int id; + genBiomeNoiseBetaScaled(&g.bnb, &snb, &id, r); + if (id < 0 || id > 255) { + printf(" INVALID biome %d at seed=%llu x=%d z=%d\n", id, (unsigned long long)seed, x, z); + return -1; + } + } + } + } + printf(" B1.7 biome validity check: \033[1;92mOK\033[0m\n"); + return 0; +} + + int main() { @@ -536,6 +638,13 @@ int main() //testGeneration(); //findBiomeParaBounds(); + printf("Testing Beta 1.7 biome determinism:\n"); + testBeta17BiomeDeterminism(); + printf("Testing Beta 1.7 biome regression:\n"); + testBeta17BiomeRegression(); + printf("Testing Beta 1.7 biome validity:\n"); + testBeta17BiomeValidity(); + return 0; }