concordium-base icon indicating copy to clipboard operation
concordium-base copied to clipboard

Improve error message for using floats in contracts

Open Bargsteen opened this issue 2 years ago • 1 comments

Description

Floating-point numbers are not supported in smart contracts, but if you don't know that and you try to use them (or you use a library that uses floats), the error message when building with cargo concordium is very cryptic.

Steps to Reproduce

  1. Use floating-point numbers in your contract. Make sure that the compiler doesn't optimize the floats away. Something like this worked for me with 1.53.0:
    fn g() {
        if f(f(1.)) < 2. {
            println!("hello");
        }
    }
    
    #[inline(never)]
    fn f(x: f64) -> f64 {
        if x < 1. {
            x + 1.
        } else {
            x + 2.
        }
    }
    
  2. Compile the contract with cargo concordium build

Expected Result

An error message saying: Floating point numbers are not allowed.

Actual Result

Error: Could not build smart contract.

Caused by:
    0: Could not validate resulting smart contract module as a V1 contract.
    1: Unknown value type byte 0x7c

(0x7c is the encoding of the f64 type in https://webassembly.github.io/spec/core/binary/types.html#number-types.)

Versions

  • Software Version: cargo concordium v. 2.0.0
  • OS: macOS

Bargsteen avatar Apr 08 '22 14:04 Bargsteen

Indeed. Although this will be substantially easier to do after Concordium/concordium-base#203 since right now errors are not easy to match on.

abizjak avatar Apr 08 '22 14:04 abizjak