Concordium / concordium-base

Core Rust and Haskell libraries used by various components of the Concordium blockchain, as well as some tools used for testing and development.
Mozilla Public License 2.0
22 stars 24 forks source link

Improve error message for using floats in contracts #198

Open Bargsteen opened 2 years ago

Bargsteen commented 2 years ago

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

abizjak commented 2 years ago

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