Arithmetic operations choose arch-dependant type and overflow in 32bit
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Empieza ejecutando la reproducción de 32bit_test.go contra expr en un contenedor i386/golang y rastrea cómo la expresión val64 + 0 selecciona los tipos de operandos. Se considera terminado cuando la prueba informa de 2147483648 en lugar de -2147483648 en arquitecturas de 32 bits, sin romper otras operaciones aritméticas con enteros.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Hi, thank you for your work and for reading. I found that arithmetic operations choose architecture-dependant types in some circumstances and can cause overflows in 32bit architectures.
Example
Given a value a of type int64 and a value b of any integer type, if we run the expression a+b then we will get int(a)+int(b), which can overflow in 32bit architectures.
Reproduction steps
First, save the following file as 32bit_test.go:
package main
import (
"fmt"
"math"
"testing"
"github.com/expr-lang/expr"
)
func TestOverflows32bit(t *testing.T) {
p, err := expr.Compile("val64 + 0")
if err != nil {
t.Fatalf("compile error: %v", err)
}
val, err := expr.Run(p, map[string]any{
"val64": int64(math.MaxInt32 + 1),
})
if err != nil {
t.Fatalf("run error: %v", err)
}
str := fmt.Sprint(val)
if str != "2147483648" {
t.Fatalf("expected %v, got %v", "2147483648", val)
}
}
Second, run it in a 32bit architecture docker container:
docker run --name go32 --rm -dit --platform linux/386 i386/golang:latest bash
docker exec go32 mkdir -p /go/src/test
docker cp 32bit_test.go go32:/go/src/test/main_test.go
docker exec -it go32 bash
> cd /go/src/test/
> go mod init
> go get github.com/expr-lang/expr
> go test
--- FAIL: TestOverflows32bit (0.01s)
main_test.go:24: expected 2147483648, got -2147483648
FAIL
exit status 1
FAIL test 0.043s
- Lenguaje dominante
- Go
- Estrellas
- 8k
- Forks
- 529
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Guía de contribución
No hay ninguna guía de contribución indexada para este repositorio
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 expr-lang/expr
-
docs needed
Dificultad 1/5 1-3 horas Aptitud para principiantes 62/100
-
Dificultad 3/5 1-2 días Aptitud para principiantes 65/100
-
`find`, `findIndex`, `first` and `get` are type-checked as the element type where they return nil Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 65/100
-
Release latest master branch Abierto
Dificultad 4/5 3-5 días Aptitud para principiantes 35/100
-
Dificultad 5/5 Más de una semana Aptitud para principiantes 35/100
Todos los issues de expr-lang/expr
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 76/100
bazel-contrib/rules_go#4726 · 1 comentario ·
-
area/auto-scaling area/monitoring area/ops-productivity kind/enhancement
Dificultad 2/5 1-3 horas Aptitud para principiantes 74/100
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
-
Type/Improvement
Dificultad 1/5 1-3 horas Aptitud para principiantes 90/100
OpenNSW/nsw-srilanka#522 ·
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 92/100