Skip to content

terminal APIs not supported: can't call foreign function ioctl on OS linux #3719

Open
@CramBL

Description

@CramBL

I just learned about miri, and I'm trying to use it in a project and I cannot get it to run basically anything, I get errors in very basic "tests". e.g. this one.

#[cfg(test)]
mod tests {
    use crate::evaluate_compression::compression_result::color_grade_0_to_100_green_blue_white_yellow_red;
    use comfy_table::*;

    #[test]
    fn tune_color_grade_0_to_100_green_blue_white_yellow_red() {
        let mut table = Table::new();
        let mut cells = vec![];
        for x in 0..=100 {
            let c =
                comfy_table::Cell::new(x).fg(color_grade_0_to_100_green_blue_white_yellow_red(x));
            cells.push(c);

            if cells.len() == 26 {
                table.add_row(cells);
                cells = vec![];
            }
        }
        table.add_row(cells);
        println!("{table}");
    }
}

The color_grade_0_to_100_green_blue_white_yellow_red function looks like below (bad code 🤡 )

pub fn color_grade_0_to_100_green_blue_white_yellow_red(val: u8) -> comfy_table::Color {
    debug_assert!(val <= 100);

    if val <= 50 {
        // Transition from green to cyan to blue to white at 50%
        let (r, g, b) = match val {
            0..=34 => {
                // Green to Cyan
                let r = 0;
                let g = 255;
                let b = (val as f32 * 6.2) as u8; // 0 to 255
                (r, g, b)
            }
            35..=50 => {
                // Cyan to Blue to White
                let r = ((val - 25) as f32 * 10.2) as u8; // 0 to 255
                let g = 255;
                let b = 255;
                (r, g, b)
            }
            _ => unreachable!(),
        };
        comfy_table::Color::Rgb { r, g, b }
    } else if val <= 80 {
        // Transition from white at 50% to yellow at 80%
        let r = 255;
        let g = 255;
        let b = 255 - ((val - 50) as f32 * 8.5) as u8; // 255 to 0
        comfy_table::Color::Rgb { r, g, b }
    } else {
        // Transition from yellow at 80% to red at 100%
        let r = 255;
        let g = 255 - ((val - 80) as f32 * 12.75) as u8; // 255 to 0
        let b = 0;
        comfy_table::Color::Rgb { r, g, b }
    }
}

And I get this result from MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-backtrace=full" cargo +nightly miri test tune_color_grade.

MIRIFLAGS="-Zmiri-disable-isolation -Zmiri-backtrace=full" cargo +nightly miri test tune_color_grade
    Finished `test` profile [unoptimized + debuginfo] target(s) in 0.06s
     Running unittests src/main.rs (target/miri/x86_64-unknown-linux-gnu/debug/deps/qft-e789802002b6f8c2)

running 1 test
test evaluate_compression::compression_result::tests::tune_color_grade_0_to_100_green_blue_white_yellow_red ... error: unsupported operation: can't call foreign function `ioctl` on OS `linux`
   --> /home/marcbk/.cargo/registry/src/index.crates.io-6f17d22bba15001f/crossterm-0.27.0/src/terminal/sys/unix.rs:55:34
    |
55  |     if wrap_with_result(unsafe { ioctl(fd, TIOCGWINSZ.into(), &mut size) }).is_ok() {
    |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't call foreign function `ioctl` on OS `linux`
    |
    = help: if this is a basic API commonly used on this target, please report an issue with Miri
    = help: however, note that Miri does not aim to support every FFI function out there; for instance, we will not support APIs for things such as GUIs, scripting languages, or databases
    = note: BACKTRACE on thread `evaluate_compre`:
    = note: inside `crossterm::terminal::sys::unix::window_size` at /home/marcbk/.cargo/registry/src/index.crates.io-6f17d22bba15001f/crossterm-0.27.0/src/terminal/sys/unix.rs:55:34: 55:73
    = note: inside `crossterm::terminal::sys::unix::size` at /home/marcbk/.cargo/registry/src/index.crates.io-6f17d22bba15001f/crossterm-0.27.0/src/terminal/sys/unix.rs:64:30: 64:43
    = note: inside `crossterm::terminal::size` at /home/marcbk/.cargo/registry/src/index.crates.io-6f17d22bba15001f/crossterm-0.27.0/src/terminal.rs:137:5: 137:16
    = note: inside `comfy_table::Table::width` at /home/marcbk/.cargo/registry/src/index.crates.io-6f17d22bba15001f/comfy-table-7.1.1/src/table.rs:274:37: 274:53
    = note: inside `comfy_table::utils::arrangement::arrange_content` at /home/marcbk/.cargo/registry/src/index.crates.io-6f17d22bba15001f/comfy-table-7.1.1/src/utils/arrangement/mod.rs:17:23: 17:36
    = note: inside `comfy_table::utils::build_table` at /home/marcbk/.cargo/registry/src/index.crates.io-6f17d22bba15001f/comfy-table-7.1.1/src/utils/mod.rs:51:24: 51:46
    = note: inside `comfy_table::Table::lines` at /home/marcbk/.cargo/registry/src/index.crates.io-6f17d22bba15001f/comfy-table-7.1.1/src/table.rs:95:9: 95:26
    = note: inside `<comfy_table::Table as std::fmt::Display>::fmt` at /home/marcbk/.cargo/registry/src/index.crates.io-6f17d22bba15001f/comfy-table-7.1.1/src/table.rs:47:25: 47:37
    = note: inside `core::fmt::rt::Argument::<'_>::fmt` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/rt.rs:165:63: 165:82
    = note: inside `std::fmt::write` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/fmt/mod.rs:1168:21: 1168:44
    = note: inside `<std::vec::Vec<u8> as std::io::Write>::write_fmt` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/io/mod.rs:1835:15: 1835:43
    = note: inside closure at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/io/stdio.rs:1129:25: 1129:84
    = note: inside `std::option::Option::<std::sync::Arc<std::sync::Mutex<std::vec::Vec<u8>>>>::map::<(), {closure@std::io::stdio::print_to_buffer_if_capture_used::{closure#0}::{closure#0}}>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs:1103:29: 1103:33
    = note: inside closure at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/io/stdio.rs:1128:13: 1131:15
    = note: inside `std::thread::LocalKey::<std::cell::Cell<std::option::Option<std::sync::Arc<std::sync::Mutex<std::vec::Vec<u8>>>>>>::try_with::<{closure@std::io::stdio::print_to_buffer_if_capture_used::{closure#0}}, std::option::Option<()>>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/thread/local.rs:283:12: 283:27
    = note: inside `std::io::stdio::print_to_buffer_if_capture_used` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/io/stdio.rs:1124:12: 1132:11
    = note: inside `std::io::stdio::print_to::<std::io::Stdout>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/io/stdio.rs:1112:8: 1112:45
    = note: inside `std::io::_print` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/io/stdio.rs:1227:5: 1227:37
note: inside `evaluate_compression::compression_result::tests::tune_color_grade_0_to_100_green_blue_white_yellow_red`
   --> src/evaluate_compression/compression_result.rs:432:9
    |
432 |         println!("{table}");
    |         ^^^^^^^^^^^^^^^^^^^
note: inside closure
   --> src/evaluate_compression/compression_result.rs:418:63
    |
417 |     #[test]
    |     ------- in this procedural macro expansion
418 |     fn tune_color_grade_0_to_100_green_blue_white_yellow_red() {
    |                                                               ^
    = note: inside `<{closure@src/evaluate_compression/compression_result.rs:418:5: 433:6} as std::ops::FnOnce<()>>::call_once - shim` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5: 250:71
    = note: inside `<fn() -> std::result::Result<(), std::string::String> as std::ops::FnOnce<()>>::call_once - shim(fn() -> std::result::Result<(), std::string::String>)` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5: 250:71
    = note: inside `test::__rust_begin_short_backtrace::<std::result::Result<(), std::string::String>, fn() -> std::result::Result<(), std::string::String>>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:625:18: 625:21
    = note: inside `test::types::RunnableTest::run` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/types.rs:146:40: 146:71
    = note: inside closure at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:648:60: 648:79
    = note: inside `<std::panic::AssertUnwindSafe<{closure@test::run_test_in_process::{closure#0}}> as std::ops::FnOnce<()>>::call_once` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/panic/unwind_safe.rs:272:9: 272:19
    = note: inside `std::panicking::r#try::do_call::<std::panic::AssertUnwindSafe<{closure@test::run_test_in_process::{closure#0}}>, std::result::Result<(), std::string::String>>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:553:40: 553:43
    = note: inside `std::panicking::r#try::<std::result::Result<(), std::string::String>, std::panic::AssertUnwindSafe<{closure@test::run_test_in_process::{closure#0}}>>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:517:19: 517:88
    = note: inside `std::panic::catch_unwind::<std::panic::AssertUnwindSafe<{closure@test::run_test_in_process::{closure#0}}>, std::result::Result<(), std::string::String>>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:350:14: 350:33
    = note: inside `test::run_test_in_process` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:648:27: 648:81
    = note: inside closure at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:569:43: 577:18
    = note: inside closure at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/test/src/lib.rs:599:41: 599:83
    = note: inside `std::sys::backtrace::__rust_begin_short_backtrace::<{closure@test::run_test::{closure#1}}, ()>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys/backtrace.rs:155:18: 155:21
    = note: inside closure at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/thread/mod.rs:542:17: 542:71
    = note: inside `<std::panic::AssertUnwindSafe<{closure@std::thread::Builder::spawn_unchecked_<'_, '_, {closure@test::run_test::{closure#1}}, ()>::{closure#2}::{closure#0}}> as std::ops::FnOnce<()>>::call_once` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/panic/unwind_safe.rs:272:9: 272:19
    = note: inside `std::panicking::r#try::do_call::<std::panic::AssertUnwindSafe<{closure@std::thread::Builder::spawn_unchecked_<'_, '_, {closure@test::run_test::{closure#1}}, ()>::{closure#2}::{closure#0}}>, ()>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:553:40: 553:43
    = note: inside `std::panicking::r#try::<(), std::panic::AssertUnwindSafe<{closure@std::thread::Builder::spawn_unchecked_<'_, '_, {closure@test::run_test::{closure#1}}, ()>::{closure#2}::{closure#0}}>>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:517:19: 517:88
    = note: inside `std::panic::catch_unwind::<std::panic::AssertUnwindSafe<{closure@std::thread::Builder::spawn_unchecked_<'_, '_, {closure@test::run_test::{closure#1}}, ()>::{closure#2}::{closure#0}}>, ()>` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:350:14: 350:33
    = note: inside closure at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/thread/mod.rs:541:30: 543:16
    = note: inside `<{closure@std::thread::Builder::spawn_unchecked_<'_, '_, {closure@test::run_test::{closure#1}}, ()>::{closure#2}} as std::ops::FnOnce<()>>::call_once - shim(vtable)` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5: 250:71
    = note: inside `<std::boxed::Box<dyn std::ops::FnOnce()> as std::ops::FnOnce<()>>::call_once` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/boxed.rs:2064:9: 2064:52
    = note: inside `<std::boxed::Box<std::boxed::Box<dyn std::ops::FnOnce()>> as std::ops::FnOnce<()>>::call_once` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/boxed.rs:2064:9: 2064:52
    = note: inside `std::sys::pal::unix::thread::Thread::new::thread_start` at /home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys/pal/unix/thread.rs:108:17: 108:64
    = note: this error originates in the macro `println` which comes from the expansion of the attribute macro `test` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to 1 previous error

error: test failed, to rerun pass `--bin qft`

Caused by:
  process didn't exit successfully: `/home/marcbk/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/bin/cargo-miri runner /home/marcbk/repos/quick-file-transfer/target/miri/x86_64-unknown-linux-gnu/debug/deps/qft-e789802002b6f8c2 tune_color_grade` (exit status: 1)
note: test exited abnormally; to see the full output pass --nocapture to the harness.

I was not expect all these issues since I run this project with cargo hack test --feature-powerset on linux/windows/macos with no issues.

I must be doing something wrong?

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-shimsArea: This affects the external function shimsC-enhancementCategory: a PR with an enhancement or an issue tracking an accepted enhancement

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions