| // run |
| |
| // Copyright 2026 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Same time-traveling prove bug as issue80517_2.go, but the victims are a |
| // signed division and a signed modulo. make([]byte, n) teaches prove that |
| // n >= 0 only after it runs; a buggy prove lets that fact travel back and |
| // rewrites the earlier n/4 and n%3 into unsigned operations, corrupting |
| // the result for negative n. |
| |
| package main |
| |
| var sink []byte |
| |
| //go:noinline |
| func trigger(n int) (q, r int) { |
| defer func() { recover() }() |
| if n < 100 { |
| q = n / 4 // signed division |
| r = n % 3 // signed modulo |
| sink = make([]byte, n) // only asserts n >= 0 after this point |
| } |
| return |
| } |
| |
| func main() { |
| if q, r := trigger(-8); q != -2 || r != -2 { |
| println("n/4 =", q, "want -2; n%3 =", r, "want -2") |
| panic("prove miscompiled a signed div/mod") |
| } |
| } |