{"record":{"id":"69f7cb42fd58fcbe","repo":"rayon-rs/rayon","slug":"overflow-69f7cb","errorCode":null,"errorMessage":"overflow","messagePattern":"overflow","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/iter/intersperse.rs","lineNumber":67,"sourceCode":"    }\n}\n\nimpl<I> IndexedParallelIterator for Intersperse<I>\nwhere\n    I: IndexedParallelIterator<Item: Clone>,\n{\n    fn drive<C>(self, consumer: C) -> C::Result\n    where\n        C: Consumer<Self::Item>,\n    {\n        let consumer1 = IntersperseConsumer::new(consumer, self.item);\n        self.base.drive(consumer1)\n    }\n\n    fn len(&self) -> usize {\n        let len = self.base.len();\n        if len > 0 {\n            len.checked_add(len - 1).expect(\"overflow\")\n        } else {\n            0\n        }\n    }\n\n    fn with_producer<CB>(self, callback: CB) -> CB::Output\n    where\n        CB: ProducerCallback<Self::Item>,\n    {\n        let len = self.len();\n        return self.base.with_producer(Callback {\n            callback,\n            item: self.item,\n            len,\n        });\n\n        struct Callback<CB, T> {\n            callback: CB,","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/rayon-rs/rayon/blob/ee0a00bdb1ab039e178a215ad5712fb7fa58e58f/src/iter/intersperse.rs#L49-L85","documentation":"Arithmetic overflow panic raised by Intersperse::len when computing the total length of the interspersed parallel iterator. For a base iterator of length len > 0 the output length is len + (len - 1) (one separator between each pair of items); on 64-bit targets this overflows usize only for astronomically large len, but on 32-bit or smaller targets a base length above roughly 2^31 items triggers checked_add to return None and expect panics with \"overflow\". It is a size-limit guard: the input at fault is an IndexedParallelIterator whose len plus len-1 exceeds usize::MAX.","triggerScenarios":"`intersperse(iter, sep)` where the base iterator's exact length `n` satisfies `2n - 1 > usize::MAX` (roughly n > usize::MAX/2), then running indexed parallel operations.","commonSituations":"Interspersing a separator into iterators over near-max-size ranges (e.g. `(0..usize::MAX).step_by(2)`) in synthetic workloads.","solutions":["Don't intersperse into iterators with length near usize::MAX/2","Bound the base iterator length before interspersing","Insert the separator with an unindexed approach (map+enumerate+flat_map) to avoid the exact-len path"],"exampleFix":"// before\n(0..usize::MAX).step_by(2).intersperse(0).par_bridge();\n// after\n(0..usize::MAX / 4).step_by(2).intersperse(0).collect::<Vec<_>>();","handlingStrategy":"validation","validationCode":"fn intersperse_fits(n: usize) -> bool {\n    n == 0 || n.checked_add(n - 1).is_some()\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep base length below usize::MAX/2","Bound ranges before intersperse","Prefer unindexed separator insertion for huge streams"],"tags":["rayon","panic","overflow","iterator"],"backgroundTag":"integer-overflow","analyzedSha":"ee0a00bdb1ab039e178a215ad5712fb7fa58e58f","analyzedAt":"2026-09-07T23:28:47.588Z","contentChangedAt":"2026-09-07T23:28:47.588Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}