Attributes cannot (yet) be attached to blocks so this can't work atm, e.g.

    fn main() {
        #[whoops] { /* ... */ }
    }

gives

    <anon>:2:13: 2:14 error: expected item after attributes
    <anon>:2     #[whoops] { /* ... */ }
                         ^

It possibly makes sense to have a distinction between "functions that are unsafe to call" and "functions that can call unsafe functions internally", i.e. have `unsafe fn foo() { ... }` *not* be the same as `unsafe fn foo() { unsafe { ... } }`, although I imagine that this may make certain cases rather uglier.

Huon

On 01/01/15 22:46, Manish Goregaokar wrote:
It should be reasonably easy to write a lint as a compiler plugin such that the following function:

#[unsafe_specific]
unsafe fn foo () {
 #[allowed_unsafe] { // or just #[allow(unsafe_something_something)]
  // do unsafe things here
 }
 // no unsafe blocks or functions allowed here.
}

would not compile with any unsafe code in the latter half of the function.

Alternatively:

unsafe fn foo() {
 fn bar() {
  unsafe {
    // unsafe stuff here
  }
  // no unsafe stuff here
 }
 bar();
}

-Manish Goregaokar

On Thu, Jan 1, 2015 at 4:47 PM, Vladimir Pouzanov <farcal...@gmail.com <mailto:farcal...@gmail.com>> wrote:

    I had this idea for some time and I'd like to discuss it to see if
    it is something reasonable to be proposed for rust to implement or
    there are other ways around the problem.

    Let's say I have a low level function that manipulates the
    hardware clock using some platform-specific argument. Internally
    this function will do an unsafe volatile mem write to store value
    in the register, but this is the only part of the code that is
    unsafe compiler-wise, whatever else is in there in the function is
    safe and I want the compiler to warn me if any other unsafe
    operation happens.

    Now, given that this function is actually unsafe in terms of its
    realtime consequences (it does not do any validation of the input
    for speed) I want to mark it as unsafe fn and make a safer wrapper
    for end users, while keeping this for the little subset of users
    that will need the actual speed benefits.

    Unfortunately, marking it unsafe will now allow any other unsafe
    operation in the body of the function, when what I wanted is just
    to force users of it to be aware of unsafety via compiler validation.

    A safe {} block could have helped me in this case. But is it a
    good idea overall?

    Some pseudo-code to illustrate

    pub unsafe fn set_clock_mode(mode: uint32) {
      // ...
      // doing some required computations
      // this code must be 'safe' for the compiler
      unsafe {
        // ...
        // writing the value to mmaped register, this one is unsafe
    but validated by programmer
      }
    }

    pub fn set_clock_mode_safe(mode: uint32) -> bool {
      // ...
      // validate input
      unsafe {
        // I want this call to require unsafe block
        set_clock_mode(mode);
      }
    }

-- Sincerely,
    Vladimir "Farcaller" Pouzanov
    http://farcaller.net/

    _______________________________________________
    Rust-dev mailing list
    Rust-dev@mozilla.org <mailto:Rust-dev@mozilla.org>
    https://mail.mozilla.org/listinfo/rust-dev




_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

_______________________________________________
Rust-dev mailing list
Rust-dev@mozilla.org
https://mail.mozilla.org/listinfo/rust-dev

Reply via email to