docs: Add warning about dangling references with lazy reducers (fixes #2871) by ssam18 · Pull Request #2882 · xtensor-stack/xtensor
…tensor-stack#2871) This commit addresses GitHub issue xtensor-stack#2871 where using 'auto' with xtensor reducer functions (like amax, sum with keep_dims) in functions causes crashes or incorrect results in optimized builds. The issue is that lazy expressions hold references to local variables. When intermediate results are stored with 'auto', these references become dangling when the function returns, leading to undefined behavior. Fixes xtensor-stack#2871
requested changes Apr 3, 2026
- Only force evaluation of the returned expression; intermediate lazy expressions are safe as long as they do not outlive the function - Use auto for shifted/expVals/sumExp in the doc example and tests - Remove misleading "Alternatively" sections (eval on intermediates is not required; evaluation_strategy::immediate does not fix the issue) - Fix logSoftmax_eval test variant to drop unnecessary xt::eval wrappers
A lazy reducer (e.g. xt::sum with keep_dims) cannot be safely used as an operand in a subsequent element-wise expression without first materializing it. Element-wise lazy expressions (shifted, expVals) are safe as auto, but the reducer result (sumExp) must be assigned to xt::xtensor or wrapped in xt::eval before use. This fixes the CI test failure in issue_2871_intermediate_result_handling.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters