databend icon indicating copy to clipboard operation
databend copied to clipboard

bug: error: Undefined Behavior: out-of-bounds pointer arithmetic: alloc83513 has size 2, so pointer to 8 bytes starting at offset 1 is out-of-bounds

Open bohutang opened this issue 3 years ago • 1 comments

Summary

MIRI test:

MIRIFLAGS="-Zmiri-disable-isolation" cargo miri test
running 8 tests
test parser::test_expr ...
error: Undefined Behavior: out-of-bounds pointer arithmetic: alloc83513 has size 2, so pointer to 8 bytes starting at offset 1 is out-of-bounds
    --> /root/.cargo/registry/src/github.com-1ecc6299db9ec823/fast-float-0.2.0/src/common.rs:78:18
     |
78   |         unsafe { self.ptr.add(n) <= self.end }
     |                  ^^^^^^^^^^^^^^^ out-of-bounds pointer arithmetic: alloc83513 has size 2, so pointer to 8 bytes starting at offset 1 is out-of-bounds
     |
     = help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
     = help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
     = note: BACKTRACE:
     = note: inside `fast_float::common::AsciiStr::<'_>::check_len` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/fast-float-0.2.0/src/common.rs:78:18
     = note: inside `fast_float::common::AsciiStr::<'_>::try_read_u64` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/fast-float-0.2.0/src/common.rs:83:12
     = note: inside `fast_float::number::try_parse_8digits_le` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/fast-float-0.2.0/src/number.rs:74:26
     = note: inside `fast_float::number::parse_number` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/fast-float-0.2.0/src/number.rs:153:9
     = note: inside `fast_float::parse::parse_float::<f64>` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/fast-float-0.2.0/src/parse.rs:14:29
     = note: inside `<f64 as fast_float::FastFloat>::parse_float_partial::<&[u8]>` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/fast-float-0.2.0/src/lib.rs:106:9
     = note: inside `<f64 as fast_float::FastFloat>::parse_float::<&str>` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/fast-float-0.2.0/src/lib.rs:89:15
     = note: inside `fast_float::parse::<f64, &str>` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/fast-float-0.2.0/src/lib.rs:121:5
note: inside closure at /root/github/databend/src/query/ast/src/parser/expr.rs:1021:20
    --> /root/github/databend/src/query/ast/src/parser/expr.rs:1021:20
     |
1021 |         |token| Ok(fast_float::parse(token.text())?),
     |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
note: inside closure at /root/github/databend/src/query/ast/src/util.rs:348:15
    --> /root/github/databend/src/query/ast/src/util.rs:348:15
     |
348  |         match f(o1) {
     |               ^^^^^
note: inside `common_ast::parser::expr::literal_f64` at /root/github/databend/src/query/ast/src/parser/expr.rs:1017:5
    --> /root/github/databend/src/query/ast/src/parser/expr.rs:1017:5
     |
1017 | /     map_res(
1018 | |         rule! {
1019 | |             LiteralFloat
1020 | |         },
1021 | |         |token| Ok(fast_float::parse(token.text())?),
1022 | |     )(i)
     | |________^
     = note: inside `<for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, f64), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::literal_f64} as std::ops::FnMut<(common_ast::Input<'_>,)>>::call_mut - shim(for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, f64), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::literal_f64})` at /root/.rustup/toolchains/nightly-2022-11-14-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:339:5
     = note: inside `<for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, f64), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::literal_f64} as nom::Parser<common_ast::Input<'_>, f64, common_ast::Error<'_>>>::parse` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/internal.rs:325:5
     = note: inside closure at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/combinator/mod.rs:79:23
     = note: inside `<[closure@nom::combinator::map<common_ast::Input<'_>, f64, common_ast::ast::Literal, common_ast::Error<'_>, for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, f64), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::literal_f64}, fn(f64) -> common_ast::ast::Literal {common_ast::ast::Literal::Float}>::{closure#0}] as nom::Parser<common_ast::Input<'_>, common_ast::ast::Literal, common_ast::Error<'_>>>::parse` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/internal.rs:325:5
     = note: inside `<([closure@nom::combinator::map<common_ast::Input<'_>, std::string::String, common_ast::ast::Literal, common_ast::Error<'_>, for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, std::string::String), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::literal_string}, fn(std::string::String) -> common_ast::ast::Literal {common_ast::ast::Literal::String}>::{closure#0}], [closure@nom::combinator::map<common_ast::Input<'_>, u64, common_ast::ast::Literal, common_ast::Error<'_>, for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, u64), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::literal_u64}, fn(u64) -> common_ast::ast::Literal {common_ast::ast::Literal::Integer}>::{closure#0}], [closure@nom::combinator::map<common_ast::Input<'_>, f64, common_ast::ast::Literal, common_ast::Error<'_>, for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, f64), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::literal_f64}, fn(f64) -> common_ast::ast::Literal {common_ast::ast::Literal::Float}>::{closure#0}], [closure@nom::combinator::map<common_ast::Input<'_>, &common_ast::parser::token::Token<'_>, common_ast::ast::Literal, common_ast::Error<'_>, [closure@common_ast::match_token::{closure#0}], [closure@common_ast::parser::expr::literal::{closure#0}]>::{closure#0}], [closure@nom::combinator::map<common_ast::Input<'_>, &str, common_ast::ast::Literal, common_ast::Error<'_>, for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, &'a str), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::literal_hex_str}, [closure@common_ast::parser::expr::literal::{closure#1}]>::{closure#0}], [closure@nom::branch::alt<common_ast::Input<'_>, common_ast::ast::Literal, common_ast::Error<'_>, ([closure@nom::combinator::value<common_ast::Input<'_>, common_ast::ast::Literal, &common_ast::parser::token::Token<'_>, common_ast::Error<'_>, [closure@common_ast::match_token::{closure#0}]>::{closure#0}], [closure@nom::combinator::value<common_ast::Input<'_>, common_ast::ast::Literal, &common_ast::parser::token::Token<'_>, common_ast::Error<'_>, [closure@common_ast::match_token::{closure#0}]>::{closure#0}])>::{closure#0}], [closure@nom::combinator::value<common_ast::Input<'_>, common_ast::ast::Literal, &common_ast::parser::token::Token<'_>, common_ast::Error<'_>, [closure@common_ast::match_token::{closure#0}]>::{closure#0}], [closure@nom::combinator::value<common_ast::Input<'_>, common_ast::ast::Literal, &common_ast::parser::token::Token<'_>, common_ast::Error<'_>, [closure@common_ast::match_token::{closure#0}]>::{closure#0}]) as nom::branch::Alt<common_ast::Input<'_>, common_ast::ast::Literal, common_ast::Error<'_>>>::choice` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/branch/mod.rs:170:11
     = note: inside closure at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/branch/mod.rs:74:15
note: inside `common_ast::parser::expr::literal` at /root/github/databend/src/query/ast/src/parser/expr.rs:966:5
    --> /root/github/databend/src/query/ast/src/parser/expr.rs:966:5
     |
966  | /     rule!(
967  | |         #string
968  | |         | #integer
969  | |         | #float
...    |
974  | |         | #null
975  | |     )(i)
     | |________^
note: inside closure at /root/github/databend/src/query/ast/src/parser/expr.rs:129:34
    --> /root/github/databend/src/query/ast/src/parser/expr.rs:129:34
     |
129  | ...                   lit: literal(span)?.1,
     |                            ^^^^^^^^^^^^^
     = note: inside `<[closure@common_ast::parser::expr::subexpr::{closure#0}] as nom::Parser<common_ast::Input<'_>, common_ast::ast::Expr<'_>, common_ast::Error<'_>>>::parse` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/internal.rs:325:5
     = note: inside closure at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/error.rs:240:21
note: inside `common_ast::parser::expr::expr` at /root/github/databend/src/query/ast/src/parser/expr.rs:42:5
    --> /root/github/databend/src/query/ast/src/parser/expr.rs:42:5
     |
42   |     context("expression", subexpr(0))(i)
     |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
     = note: inside `<for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, common_ast::ast::Expr<'a>), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::expr} as std::ops::FnMut<(common_ast::Input<'_>,)>>::call_mut - shim(for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, common_ast::ast::Expr<'a>), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::expr})` at /root/.rustup/toolchains/nightly-2022-11-14-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:339:5
     = note: inside `<for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, common_ast::ast::Expr<'a>), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::expr} as nom::Parser<common_ast::Input<'_>, common_ast::ast::Expr<'_>, common_ast::Error<'_>>>::parse` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/internal.rs:325:5
     = note: inside `<(for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, common_ast::ast::Expr<'a>), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::expr}, [closure@nom::combinator::peek<common_ast::Input<'_>, &common_ast::parser::token::Token<'_>, common_ast::Error<'_>, [closure@common_ast::match_token::{closure#0}]>::{closure#0}]) as nom::sequence::Tuple<common_ast::Input<'_>, (common_ast::ast::Expr<'_>, &common_ast::parser::token::Token<'_>), common_ast::Error<'_>>>::parse` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/sequence/mod.rs:236:18
     = note: inside closure at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/sequence/mod.rs:269:15
     = note: inside `<[closure@nom::sequence::tuple<common_ast::Input<'_>, (common_ast::ast::Expr<'_>, &common_ast::parser::token::Token<'_>), common_ast::Error<'_>, (for<'a> fn(common_ast::Input<'a>) -> std::result::Result<(common_ast::Input<'a>, common_ast::ast::Expr<'a>), nom::Err<common_ast::Error<'a>>> {common_ast::parser::expr::expr}, [closure@nom::combinator::peek<common_ast::Input<'_>, &common_ast::parser::token::Token<'_>, common_ast::Error<'_>, [closure@common_ast::match_token::{closure#0}]>::{closure#0}])>::{closure#0}] as nom::Parser<common_ast::Input<'_>, (common_ast::ast::Expr<'_>, &common_ast::parser::token::Token<'_>), common_ast::Error<'_>>>::parse` at /root/.cargo/registry/src/github.com-1ecc6299db9ec823/nom-7.1.1/src/internal.rs:325:5
note: inside `parser::test_expr` at src/query/ast/tests/it/parser.rs:37:15
    --> src/query/ast/tests/it/parser.rs:37:15
     |
37   |         match parser.parse(Input(&tokens, Dialect::PostgreSQL, &backtrace)) {
     |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
557  |         run_parser!(file, expr, case);
     |         ----------------------------- in this macro invocation
note: inside closure at src/query/ast/tests/it/parser.rs:485:16
    --> src/query/ast/tests/it/parser.rs:485:16

bohutang avatar Dec 16 '22 01:12 bohutang

cc @andylokandy

bohutang avatar Dec 16 '22 01:12 bohutang