• calcopiritus@lemmy.world
    link
    fedilink
    arrow-up
    9
    ·
    18 hours ago

    Rust doesn’t have “safe” and “unsafe” modes in the sense your comment alludes to.

    You can just do the little unsafe thing in a function that guarantees its safety, and then the rest of the code is safe.

    For example, using C functions from rust is unsafe, but most of the time a simple wrapper can be made safe.

    Example C function:

    int arraysum(const int *array, int length) {
        int sum = 0;
        while (length > 0) {
            sum += *array;
            array++;
            length--;
       }
    }
    

    In rust, you can call that function safely by just wrapping it with a function that makes sure that length is always the size of array. Such as:

    fn rust_arraysum(array: Vec<i32>) -> i32 {
        unsafe{ arraysum(array.as_ptr(), array.len() as i32)}
    }
    

    Even though unsafe is used, it is perfectly safe to do so. And now we can call rust_arraysum without entering “unsafe mode”

    You could do similar wrappers if you want to write your embedded code. Where only a fraction of the code is potentially unsafe.

    And even in unsafe blocks, you don’t disable all of the rust checks.

    • NeatNit@discuss.tchncs.de
      link
      fedilink
      arrow-up
      3
      ·
      edit-2
      12 hours ago

      Thanks for this. I was paraphrasing (badly, it seems). The video actually says it better:

      To write code that lives in an embedded environment, it has to run in this mode in Rust called “no standard” (#![no_std]) and this mode called “no main” (#![no_main]). Basically you have no access to any of the core utilities in Rust, you have to write a lot of them yourself.

      He then explains how embedded code necessarily has global mutability which is “the antithesis” of Rust development.

      So yeah, you could make all of those wrappers, but at the end of the day you’ll end up with about the same amount of “unsafe” code as you would making the same thing in C++.

      Edit: but if what you said still applies, it does seem like Rust would watch your back somewhat better than C++ would in that it wouldn’t even compile unsafe operations outside of unsafe blocks, unlike C++ to the best of my knowledge where you kind of have to review the code yourself to make sure it only uses the appropriate wrappers.