Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CFI: Repair vtables without altering types #122573

Closed
wants to merge 13 commits into from
Closed

Commits on Mar 14, 2024

  1. Introduce trait_obj_ty query

    This query computes the trait object, complete with associated type
    projections for its supertraits, from a trait ref.
    
    This is intended for use by CFI shimming.
    maurer committed Mar 14, 2024
    Configuration menu
    Copy the full SHA
    7578cc5 View commit details
    Browse the repository at this point in the history
  2. Refactor visiting instance_def

    In preparation to add recursive instance_defs, move this logic to its
    own convenience method.
    maurer committed Mar 14, 2024
    Configuration menu
    Copy the full SHA
    f50baef View commit details
    Browse the repository at this point in the history
  3. Refactor fmt_instance

    Factored out to minimize the amount of noise in the main CfiShim
    defining patch.
    maurer committed Mar 14, 2024
    Configuration menu
    Copy the full SHA
    0b49e3c View commit details
    Browse the repository at this point in the history

Commits on Mar 15, 2024

  1. CFI: Use Instance at callsites

    We already use `Instance` at declaration sites when available to glean
    additional information about possible abstractions of the type in use.
    This does the same when possible at callsites as well.
    
    The primary purpose of this change is to allow CFI to alter how it
    generates type information for indirect calls through `Virtual`
    instances.
    maurer committed Mar 15, 2024
    Configuration menu
    Copy the full SHA
    8aaa391 View commit details
    Browse the repository at this point in the history
  2. CFI: Introduce CFI shims

    Indirect calls through vtables (trait objects or drop_in_place) expect
    to have an alias set based on `dyn Trait` at the call-site. The actual
    implementations have aslias sets based on `MyImplType`. These shims create a
    separate `InstanceDef`, allowing a different type to be assigned. These
    function for both CFI and KCFI, as they have a single principal type.
    maurer committed Mar 15, 2024
    Configuration menu
    Copy the full SHA
    c9ff274 View commit details
    Browse the repository at this point in the history
  3. CFI: Apply CFI shims to drops

    Fixes: 118761
    maurer committed Mar 15, 2024
    Configuration menu
    Copy the full SHA
    7fd0f60 View commit details
    Browse the repository at this point in the history
  4. CFI: Enable vtable shimming

    maurer committed Mar 15, 2024
    Configuration menu
    Copy the full SHA
    1d81d8e View commit details
    Browse the repository at this point in the history
  5. Configuration menu
    Copy the full SHA
    6538cdb View commit details
    Browse the repository at this point in the history
  6. CFI: Skip non-passed arguments

    Rust will occasionally rely on fn((), X) -> Y being compatible with
    fn(X) -> Y, since () is a non-passed argument. Relax CFI by choosing not
    to encode non-passed arguments.
    maurer committed Mar 15, 2024
    Configuration menu
    Copy the full SHA
    614f30c View commit details
    Browse the repository at this point in the history
  7. CFI: Support self_cell-like recursion

    Current `transform_ty` attempts to avoid cycles when normalizing
    `#[repr(transparent)]` types to their interior, but runs afoul of this
    pattern used in `self_cell`:
    
    ```
    struct X<T> {
      x: u8,
      p: PhantomData<T>,
    }
    
     #[repr(transparent)]
    struct Y(X<Y>);
    ```
    
    When attempting to normalize Y, it will still cycle indefinitely. By
    using a types-visited list, this will instead get expanded exactly
    one layer deep to X<Y>, and then stop, not attempting to normalize `Y`
    any further.
    maurer committed Mar 15, 2024
    Configuration menu
    Copy the full SHA
    54cf2dc View commit details
    Browse the repository at this point in the history
  8. CFI: Generate super vtables explicitly

    CFI shimming means they're not gauranteed to be pre-generated.
    Traditionally, the base vtable has all the elements of the supertrait
    vtable, and so visiting the base vtable implies you don't need to visit
    the supertrait vtable. However, with CFI the base vtable entries will
    have invocation type `dyn Child`, and the parent vtable will have
    invocation type `dyn Parent`, so they aren't actually the same instance,
    and both must be visited.
    maurer committed Mar 15, 2024
    Configuration menu
    Copy the full SHA
    c74b018 View commit details
    Browse the repository at this point in the history
  9. CFI: Strip auto traits off Self for virtual calls

    Additional trait bounds beyond the principal trait and its implications
    are not possible in the vtable. This means that if a receiver is
    `&dyn Foo + Send`, the function will only be expecting `&dyn Foo`.
    
    This strips those auto traits off before CFI encoding.
    maurer committed Mar 15, 2024
    Configuration menu
    Copy the full SHA
    54b15b0 View commit details
    Browse the repository at this point in the history
  10. CFI: Handle dyn with no principal

    In user-facing Rust, `dyn` always has at least one predicate following
    it. Unfortunately, because we filter out marker traits and `dyn Sync`
    is, for example, legal, this results in us having `dyn` types with no
    predicates on occasion. This patch handles cases where there are no
    predicates in a `dyn` type.
    maurer committed Mar 15, 2024
    Configuration menu
    Copy the full SHA
    a93f25b View commit details
    Browse the repository at this point in the history