From 958fb4e7db34f9dc2494612e39e7060254156145 Mon Sep 17 00:00:00 2001 From: Andrei Ovcharenko Date: Fri, 31 Jul 2026 17:45:08 +0300 Subject: [PATCH] Validate deque capacity before allocation --- src/main/java/algorithms/sprint2/Deque.java | 34 +++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/src/main/java/algorithms/sprint2/Deque.java b/src/main/java/algorithms/sprint2/Deque.java index c3f3141..2ff7dc2 100644 --- a/src/main/java/algorithms/sprint2/Deque.java +++ b/src/main/java/algorithms/sprint2/Deque.java @@ -55,6 +55,8 @@ public class Deque { // -------------------- RING BUFFER DEQUE -------------------- + private static final int MAX_CAPACITY = 100_000; + static final class RingDeque { private final int[] a; private final int cap; @@ -63,8 +65,8 @@ static final class RingDeque { private int size = 0; RingDeque(int cap) { - this.cap = cap; - this.a = new int[cap]; + this.cap = safeCapacity(cap); + this.a = new int[this.cap]; } private int next(int i) { @@ -110,6 +112,13 @@ int popBack() { } } + private static int safeCapacity(int cap) { + if (cap < 0) { + return 0; + } + return Math.min(cap, MAX_CAPACITY); + } + private static void process(FastIn in, FastOut out) throws Exception { int n = in.nextInt(); int m = in.nextInt(); @@ -233,6 +242,27 @@ private static void test() throws Exception { ) ); + // Некорректная емкость из ввода не должна приводить к аварийному завершению + assertEq( + "error\nerror\n", + solveIO( + "2\n" + + "-1\n" + + "push_back 1\n" + + "pop_front\n" + ) + ); + + // Слишком большая емкость ограничивается безопасным максимумом до выделения массива + assertEq( + "error\n", + solveIO( + "1\n" + + "1000000000\n" + + "pop_front\n" + ) + ); + // Wrap-around: head/tail должны корректно "перепрыгивать" границу массива assertEq( "1\n4\n2\n3\n",