Skip to content

Fix Array index handling - #6878

Merged
gcanti merged 2 commits into
mainfrom
audit/repro-core-array-nan-index
Aug 2, 2026
Merged

Fix Array index handling#6878
gcanti merged 2 commits into
mainfrom
audit/repro-core-array-nan-index

Conversation

@fubhy

@fubhy fubhy commented Aug 1, 2026

Copy link
Copy Markdown
Member

Reproduction only

This PR adds reproduction tests only. No implementation fix is included. CI is expected to fail until the underlying issue is fixed.

Covered audit issues

1. core-a-f-array-nan-index-validation: NaN bypasses shared index validation

Module: Array

Expected contract: get safely returns None for an invalid index, getUnsafe throws for one, insertAt, replace, and modify report invalid indexes with None, and remove treats an invalid index as an out-of-bounds no-op. The documented valid insertion range is the integer indexes from 0 through length.

Observed result: All 6 focused assertions failed for the reported values and coercions.

Reproduction command:

pnpm test --run packages/effect/test/ArrayNaNIndex.test.ts

@github-project-automation github-project-automation Bot moved this to Discussion Ongoing in PR Backlog Aug 1, 2026
@changeset-bot

changeset-bot Bot commented Aug 1, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 878bc0e

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 30 packages
Name Type
effect Patch
@effect/opentelemetry Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/vitest Patch
@effect/ai-anthropic Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-libsql Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-pglite Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-do Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/openapi-generator Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@effect-slopcop effect-slopcop Bot added the 4.0 label Aug 1, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes

  • Array NaN index reproduction tests — 6 tests covering get, getUnsafe, insertAt, replace, modify, and remove with Number.NaN as the index argument, asserting that NaN is treated as an invalid/out-of-bounds index per the documented contract.

Each assertion correctly fails against the current implementation — the tests accurately reproduce the core-a-f-array-nan-index-validation bug. The root cause is that isOutOfBounds and insertAt's inline bounds check both rely on i < 0 || i >= N comparisons, which both return false for NaN.

The test file follows @effect/vitest conventions (assert.deepStrictEqual, synchronous it blocks) and imports match the style used throughout the existing test suite.

Pullfrog  | View workflow run | Using DeepSeek Pro (free via Pullfrog for OSS) (Kimi K2 not used — the program covers this model; add its provider key to run your pick) | 𝕏

@gcanti
gcanti force-pushed the audit/repro-core-array-nan-index branch from df93300 to 878bc0e Compare August 2, 2026 07:40
@effect-slopcop effect-slopcop Bot added the bug Something isn't working label Aug 2, 2026
@gcanti gcanti changed the title Add reproduction for Array issue Fix Array index handling Aug 2, 2026

@pullfrog pullfrog Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ No new issues found.

Reviewed changes — the new commit adds the implementation fix for the Array NaN index bug plus fractional-index flooring.

  • isOutOfBounds now rejects non-finite indexes — the NaN bypass is closed by prepending !Number.isFinite(i) || to the existing < 0 || >= length checks. This also covers Infinity and -Infinity.
  • insertAt, modify, and remove now floor the indexMath.floor(i) is applied before bounds checking and splice/array access, so fractional indexes (e.g. 1.5) resolve to integer positions consistently.
  • insertAt bounds check aligned with isOutOfBounds — the old inline i < 0 || i > out.length is replaced with index !== out.length && isOutOfBounds(index, out), which still permits end-of-array insertion.
  • get, getUnsafe, and replace — already floored or delegated to modify, so they benefit from the isOutOfBounds fix without additional changes.
  • Tests — the existing 6 NaN reproduction tests now pass, and 2 new fractional-index tests cover replace(1.5) and modify(1.5).

Pullfrog  | View workflow run | Using DeepSeek Pro (free via Pullfrog for OSS) (Kimi K2 not used — the program covers this model; add its provider key to run your pick) | 𝕏

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
basic.ts 6.63 KB 6.63 KB 0.00 KB (0.00%)
batching.ts 9.42 KB 9.42 KB 0.00 KB (0.00%)
brand.ts 6.31 KB 6.31 KB 0.00 KB (0.00%)
cache.ts 10.18 KB 10.18 KB 0.00 KB (0.00%)
config.ts 20.32 KB 20.32 KB 0.00 KB (0.00%)
differ.ts 19.93 KB 19.93 KB 0.00 KB (0.00%)
http-client.ts 21.02 KB 21.02 KB 0.00 KB (0.00%)
logger.ts 10.32 KB 10.32 KB 0.00 KB (0.00%)
metric.ts 8.55 KB 8.55 KB 0.00 KB (0.00%)
optic.ts 7.33 KB 7.33 KB 0.00 KB (0.00%)
pubsub.ts 14.47 KB 14.47 KB 0.00 KB (0.00%)
queue.ts 11.13 KB 11.13 KB 0.00 KB (0.00%)
schedule.ts 10.31 KB 10.31 KB 0.00 KB (0.00%)
schema-class.ts 18.86 KB 18.86 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 28.67 KB 28.67 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 24.99 KB 24.99 KB 0.00 KB (0.00%)
schema-string-transformation.ts 12.99 KB 12.99 KB 0.00 KB (0.00%)
schema-string.ts 10.65 KB 10.65 KB 0.00 KB (0.00%)
schema-template-literal.ts 14.85 KB 14.85 KB 0.00 KB (0.00%)
schema-toArbitraryLazy.ts 21.66 KB 21.66 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 24.08 KB 24.08 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 18.91 KB 18.91 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 18.73 KB 18.73 KB 0.00 KB (0.00%)
schema-toFormatter.ts 18.59 KB 18.59 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 22.33 KB 22.33 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 19.25 KB 19.25 KB 0.00 KB (0.00%)
schema.ts 18.12 KB 18.12 KB 0.00 KB (0.00%)
stm.ts 12.11 KB 12.11 KB 0.00 KB (0.00%)
stream.ts 9.37 KB 9.37 KB 0.00 KB (0.00%)

@gcanti
gcanti merged commit b4f1ee2 into main Aug 2, 2026
19 checks passed
@gcanti
gcanti deleted the audit/repro-core-array-nan-index branch August 2, 2026 07:48
@github-project-automation github-project-automation Bot moved this from Discussion Ongoing to Done in PR Backlog Aug 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

4.0 bug Something isn't working

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants