Unsigned integer axis maps below-range values to overflow
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 76/100
Línea de trabajo
Lee include/boost/histogram/axis/integer.hpp alrededor de la línea 109 y el contrato de índices de Axis en doc/concepts/Axis.qbk. Empieza ejecutando repro.cpp con los headers fijados y los comandos de compilación de C++17 indicados; después, inspecciona la resta sin signo que produce el índice reportado. Se considera terminado cuando la entrada por debajo del rango devuelve -1 e incrementa underflow, mientras que los índices enumerados dentro y por encima del rango siguen siendo los esperados.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
axis::integer<unsigned>(1, 4) maps 0u to overflow. The Axis contract requires underflow for this below-range value.
Reproduced on x86-64 Ubuntu 24.04 with GCC 13.3.0 (Ubuntu 13.3.0-6ubuntu2~24.04.1) and Clang 18.1.3 (Ubuntu 1ubuntu1). The examples use C++17 Release builds with -O2, without fast-math. Supplemental verifier controls also used -DNDEBUG.
Tested Boost.Histogram commit: 22740e5082ca99d5717da8d9c31d684be9aaeecf. Dependency headers came from Boost superproject commit afa7af297165ad85978b364eb9df19e098109d9e, whose Histogram gitlink matches that pin.
Master still equals the tested commit as checked on 2026-10-12. Default develop at f9017f94684583eeef80eb230768c932a8a6e76c retains the cited expressions. Develop was read, not tested.
From a fresh directory, prepare the pinned sources:
git clone https://github.com/boostorg/histogram.git histogram
git -C histogram checkout --detach 22740e5082ca99d5717da8d9c31d684be9aaeecf
git clone --no-checkout https://github.com/boostorg/boost.git boost
git -C boost checkout --detach afa7af297165ad85978b364eb9df19e098109d9e
git -C boost submodule update --init --jobs 3 \
libs/config libs/core libs/mp11 libs/throw_exception libs/variant2 libs/assert
Save this example as repro.cpp:
#include <boost/histogram.hpp>
#include <iostream>
int main() {
namespace bh = boost::histogram;
auto h = bh::make_histogram(bh::axis::integer<unsigned>(1, 4));
h(0u);
const auto index = h.axis().index(0u);
std::cout << "index(0)=" << index << " underflow=" << h.at(-1)
<< " overflow=" << h.at(3) << '\n';
return index == -1 && h.at(-1) == 1 && h.at(3) == 0 ? 0 : 1;
}
Run these commands in Bash with g++ and clang++-18 on PATH:
includes=(-I"$PWD/histogram/include")
for module in config core mp11 throw_exception variant2 assert; do
includes+=(-I"$PWD/boost/libs/$module/include")
done
for cxx in g++ clang++-18; do
"$cxx" -std=c++17 -O2 -Wall -Wextra "${includes[@]}" \
repro.cpp -o "repro-$cxx"
"./repro-$cxx"
printf 'exit=%s\n' "$?"
done
Both compiler runs print the observed result below and exit 1 because the expected-value check fails.
The Axis index contract assigns -1 to values below the covered range and size() to values above it. The integer axis interface permits integral value types and defines the interval as [start, stop).
Expected for the single fill: index(0u) == -1, underflow 1, overflow 0, and all three ordinary bins 0. Observed:
index(0)=3 underflow=0 overflow=1
For inputs 0u, 1u, 2u, 3u, 4u, 5u, expected indices are -1,0,1,2,3,3. Observed indices are 3,0,1,2,3,3. The independent Python integer oracle also gives flow-inclusive counts 1,1,1,1,2, compared with observed 0,1,1,1,3.
At integer.hpp:109, x - min_ is evaluated in the unsigned value type before conversion to double. For 0u - 1u, the defined unsigned wrap produces a large positive value that selects overflow.
Issue 437, item 7, discusses extreme signed arithmetic at this same source line. The example here uses small unsigned values.
The verifier checked all values from 0 through 5 on the shifted unsigned axis. A signed axis on [1,4) and an unsigned axis on [0,4) give the required indices and counts. These checks cover the small programs and listed controls. The full library test suite, other compilers, other platforms, and C++14/C++20 builds were not run.
The reproduction example is provided under CC0.
Found by ChipLab's AI verification agents and independently reproduced.
ChipLab ref: CLAB-2026-929
- Lenguaje dominante
- C++
- Estrellas
- 334
- Forks
- 76
- Merge medio
- 18 h 2 min
- PR fusionados (30 d)
- 2
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de boostorg/histogram
-
Fable review of Boost.HistogramAbierto
Dificultad 5/5 Más de una semana Aptitud para principiantes 28/100
-
Mixed scalar/array `fill` zeroes the whole histogram when a non-inclusive axis drops the first entryQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 72/100
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
-
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
-
axes should provide strong exception guarantee for metadataPosiblemente ocupada Un pull request vinculado a esta issue está abierto o ya se fusionó. Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 42/100
Todos los issues de boostorg/histogram
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 Medio día Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 82/100
KhronosGroup/glslang#4469 ·
Los mantenedores suelen responder en 1 día
-
chore: update release scheduleAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
Los mantenedores suelen responder en 4 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
Sagiroth/TortoiseBots#917 ·
Los mantenedores suelen responder en 1 día