MarcoFalke dce6f3b29b
Merge #18383: refactor: Check for overflow when calculating sum of tx outputs
f65c9ad40f2f5cdc581bdaf72e7dc68e9d7f7a80 Check for overflow when calculating sum of outputs (Elichai Turkel)

Pull request description:

  This was reported by practicalswift here #18046
  The exact order of the if, is important, we first do `!MoneyRange(tx_out.nValue)` to make sure the amount is non-negative. and then `std::numeric_limits<CAmount>::max() - tx_out.nValue < nValueOut` checks that the addition cannot overflow (if we won't check that the amount is positive this check can also overflow! (by doing something like `max - -max`))
  and only then we make sure that the some is also valid `!MoneyRange(nValueOut + tx_out.nValue)`
  if any of these conditions fail we throw.

  the overflowing logic:
  ```
  a + b > max // we want to fail if a+b is more than the maximum -> will overflow
  b > max - a
  max - a < b
  ```

  Closes: #18046

ACKs for top commit:
  MarcoFalke:
    ACK f65c9ad40f2f5cdc581bdaf72e7dc68e9d7f7a80, checked that clang with O2 produces identical binaries 💕
  practicalswift:
    ACK f65c9ad40f2f5cdc581bdaf72e7dc68e9d7f7a80
  instagibbs:
    utACK f65c9ad40f
  vasild:
    ACK f65c9ad40f2f5cdc581bdaf72e7dc68e9d7f7a80 modulo `s/assert.h/cassert/`

Tree-SHA512: 512d6cf4762f24c41cf9a38da486b17b19c634fa3f4efbdebfe6608779e96fc3014d5d2d29adb8001e113152c0217bbd5b3900ac4edc7b8abe77f82f36209e33
2020-04-03 06:50:29 +08:00
..
2020-03-27 15:17:35 +00:00
2020-03-18 10:34:53 -07:00
2020-03-31 17:11:47 -04:00
2020-02-09 07:44:29 -08:00
2020-02-10 12:00:10 -08:00
2020-02-10 12:00:10 -08:00
2020-01-31 12:36:13 +00:00
2020-01-31 12:36:13 +00:00
2019-12-23 06:12:10 +07:00
2020-01-16 18:25:11 -08:00
2020-02-28 14:56:49 -08:00
2020-03-27 08:59:06 -04:00
2020-03-15 22:43:39 +00:00
2020-02-10 12:00:10 -08:00