Skip to main content

Property

Struct Property 

Source
pub struct Property {
    pub features: u32,
}
Expand description

What a file says it was built to have checked, which is what -fcf-protection= asks for.

Design: spec/11-asm-objects-debug.md section 11.3, and spec/04-driver-and-cli.md section 4.7 for the flag.

A machine’s control flow checks are turned on for a whole process or not at all, never for one function, so a program made of one object built with them and one built without has to be run one way or the other. What everybody settled on is that each object records what it was built for, the linker keeps only what every input agreed on, and the loader turns on what is left. So an object that records nothing turns the check off for every object it is linked with, which is why this is written even when the flag changed no instruction in the file.

One number rather than a pair of flags, because that is what the record holds: a word of bits whose meaning is the machine’s, and a linker that has never heard of a bit still knows to drop it when one input does not have it.

Fields§

§features: u32

The bits of the x86 feature word, which are Self::IBT and Self::SHSTK.

Implementations§

Source§

impl Property

Source

pub const X86_FEATURES: u32 = 0xc000_0002

Which property the feature word is, which is the key the record is written under.

Source

pub const IBT: u32 = 1

Indirect branch tracking: every indirect call and jump in the file arrives at a landing pad, so the machine may fault on one that does not.

Source

pub const SHSTK: u32 = 2

The shadow stack: every return in the file goes where a second copy of the return address says it should, so the machine may fault when the two disagree.

Source

pub const fn any(self) -> bool

Whether anything is recorded at all, which is whether the record is written.

Trait Implementations§

Source§

impl Clone for Property

Source§

fn clone(&self) -> Property

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Property

Source§

impl Debug for Property

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Property

Source§

fn default() -> Property

Returns the “default value” for a type. Read more
Source§

impl Eq for Property

Source§

impl PartialEq for Property

Source§

fn eq(&self, other: &Property) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Property

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.