{"record":{"id":"5a1089d16813a90f","repo":"rayon-rs/rayon","slug":"overflow-5a1089","errorCode":null,"errorMessage":"overflow","messagePattern":"overflow","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/iter/interleave.rs","lineNumber":55,"sourceCode":"    fn opt_len(&self) -> Option<usize> {\n        Some(self.len())\n    }\n}\n\nimpl<I, J> IndexedParallelIterator for Interleave<I, J>\nwhere\n    I: IndexedParallelIterator,\n    J: IndexedParallelIterator<Item = I::Item>,\n{\n    fn drive<C>(self, consumer: C) -> C::Result\n    where\n        C: Consumer<Self::Item>,\n    {\n        bridge(self, consumer)\n    }\n\n    fn len(&self) -> usize {\n        self.i.len().checked_add(self.j.len()).expect(\"overflow\")\n    }\n\n    fn with_producer<CB>(self, callback: CB) -> CB::Output\n    where\n        CB: ProducerCallback<Self::Item>,\n    {\n        let (i_len, j_len) = (self.i.len(), self.j.len());\n        return self.i.with_producer(CallbackI {\n            callback,\n            i_len,\n            j_len,\n            i_next: false,\n            j: self.j,\n        });\n\n        struct CallbackI<CB, J> {\n            callback: CB,\n            i_len: usize,","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/rayon-rs/rayon/blob/ee0a00bdb1ab039e178a215ad5712fb7fa58e58f/src/iter/interleave.rs#L37-L73","documentation":"`Interleave`'s `len()` adds the lengths of both inner iterators with `checked_add` and panics with \"overflow\" when the sum exceeds usize::MAX. The interleaved parallel iterator's exact length is unrepresentable.","triggerScenarios":"`interleave(a, b)` where `a.len() + b.len()` overflows usize, then calling indexed parallel ops that consult `len()` (directly or via `opt_len`).","commonSituations":"Interleaving two huge exact-size iterators (e.g. step_by over near-max ranges) in stress tests or adversarial inputs.","solutions":["Avoid interleaving iterators whose combined length approaches usize::MAX","Cap the source ranges before interleaving","Convert one side to a bounded collection to keep lengths small"],"exampleFix":"// before\nhuge_a.interleave(huge_b).collect::<Vec<_>>();\n// after\nlet n = huge_a.len();\nassert!(n <= usize::MAX - huge_b.len(), \"combined length overflows\");\nhuge_a.interleave(huge_b).collect::<Vec<_>>();","handlingStrategy":"validation","validationCode":"fn interleave_fits(a: usize, b: usize) -> bool { a.checked_add(b).is_some() }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Cap source iterator lengths before interleave","Avoid interleaving near-max ranges","Add length overflow asserts in tests"],"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-16T04:17:20.429Z"}