I'm also not sure that this check is sufficient. Addresses can be taken through autoborrowing (such as invoking methods) which don't involve taking an explicit mutable cast. For example, this code should be rejected:

```rust
struct Foo { a: int }
impl Foo { 
  fn foo(&mut self) {} 
  fn bar(&self) {}
}
static mut FOO: Foo = Foo { a: 3 };

FOO.a = 3; // should be rejected
FOO.foo(); // should be rejected
let a = &FOO.a; // should be allowed
FOO.bar(); // should be allowed