From aedc4db1b0e93df7b131b671b8282fd7815b5bde Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:23:31 -0700 Subject: [PATCH 01/24] Forbid unsafe code in bevy_winit --- crates/bevy_winit/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_winit/src/lib.rs b/crates/bevy_winit/src/lib.rs index e5356826fa54d..84866d72c1ee8 100644 --- a/crates/bevy_winit/src/lib.rs +++ b/crates/bevy_winit/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! `bevy_winit` provides utilities to handle window creation and the eventloop through [`winit`] //! From 0791934a9bb38813422d2f1347b5a94071d3687c Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:26:52 -0700 Subject: [PATCH 02/24] Deny unsafe in most of bevy_ui --- crates/bevy_ui/src/lib.rs | 1 + crates/bevy_ui/src/ui_node.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/crates/bevy_ui/src/lib.rs b/crates/bevy_ui/src/lib.rs index b9fffe39e63c7..1e9e7a075ef94 100644 --- a/crates/bevy_ui/src/lib.rs +++ b/crates/bevy_ui/src/lib.rs @@ -1,6 +1,7 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![deny(unsafe_code)] //! This crate contains Bevy's UI system, which can be used to create UI for both 2D and 3D games //! # Basic usage diff --git a/crates/bevy_ui/src/ui_node.rs b/crates/bevy_ui/src/ui_node.rs index 272220f3d52ae..41be40d3be37f 100644 --- a/crates/bevy_ui/src/ui_node.rs +++ b/crates/bevy_ui/src/ui_node.rs @@ -1424,6 +1424,7 @@ pub struct GridPlacement { } impl GridPlacement { + #[allow(unsafe_code)] pub const DEFAULT: Self = Self { start: None, // SAFETY: This is trivially safe as 1 is non-zero. From 3894b26be195a2d1f112004fae444f42e900f44b Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:28:19 -0700 Subject: [PATCH 03/24] Deny unsafe code in (most of) bevy_transform --- crates/bevy_transform/src/lib.rs | 1 + crates/bevy_transform/src/systems.rs | 2 ++ 2 files changed, 3 insertions(+) diff --git a/crates/bevy_transform/src/lib.rs b/crates/bevy_transform/src/lib.rs index f38ca1726b1b6..69c39d15526f5 100755 --- a/crates/bevy_transform/src/lib.rs +++ b/crates/bevy_transform/src/lib.rs @@ -1,5 +1,6 @@ #![doc = include_str!("../README.md")] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![deny(unsafe_code)] pub mod commands; /// The basic components of the transform crate diff --git a/crates/bevy_transform/src/systems.rs b/crates/bevy_transform/src/systems.rs index bdbce91e941bb..4e0a2efe8fa2e 100644 --- a/crates/bevy_transform/src/systems.rs +++ b/crates/bevy_transform/src/systems.rs @@ -79,6 +79,7 @@ pub fn propagate_transforms( // - Since each root entity is unique and the hierarchy is consistent and forest-like, // other root entities' `propagate_recursive` calls will not conflict with this one. // - Since this is the only place where `transform_query` gets used, there will be no conflicting fetches elsewhere. + #[allow(unsafe_code)] unsafe { propagate_recursive( &global_transform, @@ -106,6 +107,7 @@ pub fn propagate_transforms( /// nor any of its descendants. /// - The caller must ensure that the hierarchy leading to `entity` /// is well-formed and must remain as a tree or a forest. Each entity must have at most one parent. +#[allow(unsafe_code)] unsafe fn propagate_recursive( parent: &GlobalTransform, transform_query: &Query< From 59116d5936c920747add1f73c5c6416c96c901cb Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:29:28 -0700 Subject: [PATCH 04/24] Forbid unsafe code in bevy_time --- crates/bevy_time/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_time/src/lib.rs b/crates/bevy_time/src/lib.rs index 23ec1669632e9..3f225eb30b134 100755 --- a/crates/bevy_time/src/lib.rs +++ b/crates/bevy_time/src/lib.rs @@ -1,5 +1,6 @@ #![doc = include_str!("../README.md")] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] /// Common run conditions pub mod common_conditions; From 1d35985a5c53c3b5611bdc6ab372a0e0bef285f3 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:32:49 -0700 Subject: [PATCH 05/24] Forbid unsafe code in bevy_text --- crates/bevy_text/src/lib.rs | 1 + crates/bevy_text/src/pipeline.rs | 33 +++++++++++++------------------- 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/crates/bevy_text/src/lib.rs b/crates/bevy_text/src/lib.rs index 6df96c14a2d46..79df062f9abc5 100644 --- a/crates/bevy_text/src/lib.rs +++ b/crates/bevy_text/src/lib.rs @@ -1,6 +1,7 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] mod error; mod font; diff --git a/crates/bevy_text/src/pipeline.rs b/crates/bevy_text/src/pipeline.rs index edd76a2de9ec0..a891c2d8e9509 100644 --- a/crates/bevy_text/src/pipeline.rs +++ b/crates/bevy_text/src/pipeline.rs @@ -129,32 +129,25 @@ impl TextMeasureInfo { scale_factor: f32, ) -> Result { let sections = &text.sections; - for section in sections { - if !fonts.contains(§ion.style.font) { - return Err(TextError::NoSuchFont); - } - } - let (auto_fonts, sections) = sections - .iter() - .enumerate() - .map(|(i, section)| { - // SAFETY: we exited early earlier in this function if - // one of the fonts was missing. - let font = unsafe { fonts.get(§ion.style.font).unwrap_unchecked() }; - ( - font.font.clone(), - TextMeasureSection { + let mut auto_fonts = Vec::with_capacity(sections.len()); + let mut out_sections = Vec::with_capacity(sections.len()); + for (i, section) in sections.iter().enumerate() { + match fonts.get(§ion.style.font) { + Some(font) => { + auto_fonts.push(font.font.clone()); + out_sections.push(TextMeasureSection { font_id: FontId(i), scale: scale_value(section.style.font_size, scale_factor), text: section.value.clone().into_boxed_str(), - }, - ) - }) - .unzip(); + }); + } + None => return Err(TextError::NoSuchFont), + } + } Ok(Self::new( auto_fonts, - sections, + out_sections, text.justify, text.linebreak_behavior.into(), )) From d1ef180151750138a35fc9d444345f994656eb14 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:34:01 -0700 Subject: [PATCH 06/24] Forbid unsafe code in bevy_sprite --- crates/bevy_sprite/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_sprite/src/lib.rs b/crates/bevy_sprite/src/lib.rs index f7ccd2d8a187d..9b88e9dabbb9f 100644 --- a/crates/bevy_sprite/src/lib.rs +++ b/crates/bevy_sprite/src/lib.rs @@ -1,6 +1,7 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! Provides 2D sprite rendering functionality. mod bundle; From aa46aff5366ef4a963673f50833337c45d63cd07 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:39:38 -0700 Subject: [PATCH 07/24] Forbid unsafe code in bevy_scene --- crates/bevy_scene/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_scene/src/lib.rs b/crates/bevy_scene/src/lib.rs index bcb554c3f59b5..6417a0e433383 100644 --- a/crates/bevy_scene/src/lib.rs +++ b/crates/bevy_scene/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! Provides scene definition, instantiation and serialization/deserialization. //! From ae426341129b350670c51910237313995432c4e3 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:39:58 -0700 Subject: [PATCH 08/24] Deny workspace wide --- Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/Cargo.toml b/Cargo.toml index d3d23267ba1ba..e9d42fd62ce62 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -47,6 +47,7 @@ ptr_cast_constness = "warn" [workspace.lints.rust] unsafe_op_in_unsafe_fn = "warn" missing_docs = "warn" +unsafe_code = "deny" [lints] workspace = true From b5e2a7d42e95fd1d3cb3cfd2c2db170b48a7279d Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:43:27 -0700 Subject: [PATCH 09/24] Allow annotations for bevy_reflect, bevy_ptr, bevy_tasks, and bevy_utils --- crates/bevy_ptr/src/lib.rs | 1 + crates/bevy_reflect/src/path/parse.rs | 1 + crates/bevy_reflect/src/type_registry.rs | 2 ++ crates/bevy_tasks/src/task_pool.rs | 1 + crates/bevy_utils/src/lib.rs | 1 + 5 files changed, 6 insertions(+) diff --git a/crates/bevy_ptr/src/lib.rs b/crates/bevy_ptr/src/lib.rs index 19a34b412d251..70f7f1e46f6d1 100644 --- a/crates/bevy_ptr/src/lib.rs +++ b/crates/bevy_ptr/src/lib.rs @@ -1,6 +1,7 @@ #![doc = include_str!("../README.md")] #![no_std] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![allow(unsafe_code)] use core::fmt::{self, Formatter, Pointer}; use core::{ diff --git a/crates/bevy_reflect/src/path/parse.rs b/crates/bevy_reflect/src/path/parse.rs index 1a90586859ec9..8195a23a31cb4 100644 --- a/crates/bevy_reflect/src/path/parse.rs +++ b/crates/bevy_reflect/src/path/parse.rs @@ -65,6 +65,7 @@ impl<'a> PathParser<'a> { // the last byte before an ASCII utf-8 character (ie: it is a char // boundary). // - The slice always starts after a symbol ie: an ASCII character's boundary. + #[allow(unsafe_code)] let ident = unsafe { from_utf8_unchecked(ident) }; self.remaining = remaining; diff --git a/crates/bevy_reflect/src/type_registry.rs b/crates/bevy_reflect/src/type_registry.rs index 2846781f47792..406b1f29b8b73 100644 --- a/crates/bevy_reflect/src/type_registry.rs +++ b/crates/bevy_reflect/src/type_registry.rs @@ -663,6 +663,7 @@ pub struct ReflectFromPtr { from_ptr_mut: unsafe fn(PtrMut) -> &mut dyn Reflect, } +#[allow(unsafe_code)] impl ReflectFromPtr { /// Returns the [`TypeId`] that the [`ReflectFromPtr`] was constructed for. pub fn type_id(&self) -> TypeId { @@ -714,6 +715,7 @@ impl ReflectFromPtr { } } +#[allow(unsafe_code)] impl FromType for ReflectFromPtr { fn from_type() -> Self { ReflectFromPtr { diff --git a/crates/bevy_tasks/src/task_pool.rs b/crates/bevy_tasks/src/task_pool.rs index 551bb06311fd2..300373031ad42 100644 --- a/crates/bevy_tasks/src/task_pool.rs +++ b/crates/bevy_tasks/src/task_pool.rs @@ -334,6 +334,7 @@ impl TaskPool { }) } + #[allow(unsafe_code)] fn scope_with_executor_inner<'env, F, T>( &self, tick_task_pool_executor: bool, diff --git a/crates/bevy_utils/src/lib.rs b/crates/bevy_utils/src/lib.rs index 0f89cf9682b6d..98edfa2d2a6a8 100644 --- a/crates/bevy_utils/src/lib.rs +++ b/crates/bevy_utils/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![allow(unsafe_code)] //! General utilities for first-party [Bevy] engine crates. //! From d4a8eb65a18beab0279b3c7078b82f536191de74 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:46:08 -0700 Subject: [PATCH 10/24] Allow annotations for bevy_mikktspace --- crates/bevy_mikktspace/src/generated.rs | 3 ++- crates/bevy_mikktspace/src/lib.rs | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/bevy_mikktspace/src/generated.rs b/crates/bevy_mikktspace/src/generated.rs index a69b1e8a27281..91c697b3299d9 100644 --- a/crates/bevy_mikktspace/src/generated.rs +++ b/crates/bevy_mikktspace/src/generated.rs @@ -41,7 +41,8 @@ non_upper_case_globals, unused_mut, unused_assignments, - unused_variables + unused_variables, + unsafe_code )] use std::ptr::null_mut; diff --git a/crates/bevy_mikktspace/src/lib.rs b/crates/bevy_mikktspace/src/lib.rs index 5f37ab2effb8a..6643515fefcc4 100644 --- a/crates/bevy_mikktspace/src/lib.rs +++ b/crates/bevy_mikktspace/src/lib.rs @@ -63,6 +63,7 @@ pub trait Geometry { /// /// Returns `false` if the geometry is unsuitable for tangent generation including, /// but not limited to, lack of vertices. +#[allow(unsafe_code)] pub fn generate_tangents(geometry: &mut I) -> bool { unsafe { generated::genTangSpace(geometry, 180.0) } } From 48ff84fd97f600fc93c58ce4857461c6e0bfddb8 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:48:49 -0700 Subject: [PATCH 11/24] Blanket allow on bevy_ecs --- crates/bevy_ecs/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_ecs/src/lib.rs b/crates/bevy_ecs/src/lib.rs index 245e2bcd64786..56bcf692ba612 100644 --- a/crates/bevy_ecs/src/lib.rs +++ b/crates/bevy_ecs/src/lib.rs @@ -2,6 +2,7 @@ #![allow(unsafe_op_in_unsafe_fn)] #![doc = include_str!("../README.md")] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![allow(unsafe_code)] #[cfg(target_pointer_width = "16")] compile_error!("bevy_ecs cannot safely compile for a 16-bit platform."); From e3a67be43790ed694df386bd9c1b614996989bd2 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:54:45 -0700 Subject: [PATCH 12/24] Add the rest of the missing allow annotations --- crates/bevy_asset/src/reflect.rs | 3 +++ crates/bevy_color/src/linear_rgba.rs | 2 ++ crates/bevy_gizmos/src/gizmos.rs | 4 ++++ crates/bevy_render/src/lib.rs | 1 + crates/bevy_window/src/raw_handle.rs | 2 ++ 5 files changed, 12 insertions(+) diff --git a/crates/bevy_asset/src/reflect.rs b/crates/bevy_asset/src/reflect.rs index 41d8911270026..02e8cd85278b1 100644 --- a/crates/bevy_asset/src/reflect.rs +++ b/crates/bevy_asset/src/reflect.rs @@ -46,6 +46,7 @@ impl ReflectAsset { } /// Equivalent of [`Assets::get_mut`] + #[allow(unsafe_code)] pub fn get_mut<'w>( &self, world: &'w mut World, @@ -82,6 +83,7 @@ impl ReflectAsset { /// violating Rust's aliasing rules. To avoid this: /// * Only call this method if you know that the [`UnsafeWorldCell`] may be used to access the corresponding `Assets` /// * Don't call this method more than once in the same scope. + #[allow(unsafe_code)] pub unsafe fn get_unchecked_mut<'w>( &self, world: UnsafeWorldCell<'w>, @@ -135,6 +137,7 @@ impl FromType for ReflectAsset { get_unchecked_mut: |world, handle| { // SAFETY: `get_unchecked_mut` must be called with `UnsafeWorldCell` having access to `Assets`, // and must ensure to only have at most one reference to it live at all times. + #[allow(unsafe_code)] let assets = unsafe { world.get_resource_mut::>().unwrap().into_inner() }; let asset = assets.get_mut(&handle.typed_debug_checked()); asset.map(|asset| asset as &mut dyn Reflect) diff --git a/crates/bevy_color/src/linear_rgba.rs b/crates/bevy_color/src/linear_rgba.rs index 5e450af72f31c..6b504ce2b2b23 100644 --- a/crates/bevy_color/src/linear_rgba.rs +++ b/crates/bevy_color/src/linear_rgba.rs @@ -373,6 +373,7 @@ impl encase::private::CreateFrom for LinearRgba { /// /// SAFETY: [`LinearRgba`] is inhabited /// SAFETY: [`LinearRgba`]'s all-zero bit pattern is a valid value +#[allow(unsafe_code)] unsafe impl Zeroable for LinearRgba { fn zeroed() -> Self { LinearRgba { @@ -394,6 +395,7 @@ unsafe impl Zeroable for LinearRgba { /// SAFETY: all of the fields of [`LinearRgba`] are [`Pod`], as f32 is [`Pod`]. /// SAFETY: [`LinearRgba`] is `repr(C)` /// SAFETY: [`LinearRgba`] does not permit interior mutability. +#[allow(unsafe_code)] unsafe impl Pod for LinearRgba {} impl encase::ShaderSize for LinearRgba {} diff --git a/crates/bevy_gizmos/src/gizmos.rs b/crates/bevy_gizmos/src/gizmos.rs index 5bf72159516f9..2842d516e0a88 100644 --- a/crates/bevy_gizmos/src/gizmos.rs +++ b/crates/bevy_gizmos/src/gizmos.rs @@ -49,7 +49,9 @@ type GizmosState = ( pub struct GizmosFetchState { state: as SystemParam>::State, } + // SAFETY: All methods are delegated to existing `SystemParam` implementations +#[allow(unsafe_code)] unsafe impl SystemParam for Gizmos<'_, '_, T> { type State = GizmosFetchState; type Item<'w, 's> = Gizmos<'w, 's, T>; @@ -90,7 +92,9 @@ unsafe impl SystemParam for Gizmos<'_, '_, T> { } } } + // Safety: Each field is `ReadOnlySystemParam`, and Gizmos SystemParam does not mutate world +#[allow(unsafe_code)] unsafe impl<'w, 's, T: GizmoConfigGroup> ReadOnlySystemParam for Gizmos<'w, 's, T> where Deferred<'s, GizmoBuffer>: ReadOnlySystemParam, diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 290b2cabcea73..6b85fcf341977 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -1,5 +1,6 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] +#![allow(unsafe_code)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] #[cfg(target_pointer_width = "16")] diff --git a/crates/bevy_window/src/raw_handle.rs b/crates/bevy_window/src/raw_handle.rs index f9b6336149c61..eb9382590c883 100644 --- a/crates/bevy_window/src/raw_handle.rs +++ b/crates/bevy_window/src/raw_handle.rs @@ -1,3 +1,5 @@ +#![allow(unsafe_code)] + use bevy_ecs::prelude::Component; use raw_window_handle::{ DisplayHandle, HandleError, HasDisplayHandle, HasWindowHandle, RawDisplayHandle, From c3d6d1ed696c95bf91a98a133ab1aca3f646ec58 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 02:59:01 -0700 Subject: [PATCH 13/24] Forbid unsafe code in most of the remaining crates --- crates/bevy_animation/src/lib.rs | 1 + crates/bevy_app/src/lib.rs | 1 + crates/bevy_core/src/lib.rs | 1 + crates/bevy_core_pipeline/src/lib.rs | 1 + crates/bevy_derive/src/lib.rs | 1 + crates/bevy_dev_tools/src/lib.rs | 1 + crates/bevy_diagnostic/src/lib.rs | 1 + crates/bevy_dynamic_plugin/src/loader.rs | 2 ++ crates/bevy_encase_derive/src/lib.rs | 1 + crates/bevy_gilrs/src/lib.rs | 1 + crates/bevy_gltf/src/lib.rs | 1 + crates/bevy_hierarchy/src/lib.rs | 1 + crates/bevy_input/src/lib.rs | 1 + crates/bevy_internal/src/lib.rs | 1 + crates/bevy_log/src/lib.rs | 1 + crates/bevy_math/src/lib.rs | 1 + crates/bevy_pbr/src/lib.rs | 1 + 17 files changed, 18 insertions(+) diff --git a/crates/bevy_animation/src/lib.rs b/crates/bevy_animation/src/lib.rs index 398463fd05a4e..6bea14044b30f 100644 --- a/crates/bevy_animation/src/lib.rs +++ b/crates/bevy_animation/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! Animation for the game engine Bevy diff --git a/crates/bevy_app/src/lib.rs b/crates/bevy_app/src/lib.rs index 8cd087c8dedbb..97a7e8f5359cf 100644 --- a/crates/bevy_app/src/lib.rs +++ b/crates/bevy_app/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! This crate is about everything concerning the highest-level, application layer of a Bevy app. diff --git a/crates/bevy_core/src/lib.rs b/crates/bevy_core/src/lib.rs index 610f9e7a24c92..c4d4992b9b196 100644 --- a/crates/bevy_core/src/lib.rs +++ b/crates/bevy_core/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! This crate provides core functionality for Bevy Engine. diff --git a/crates/bevy_core_pipeline/src/lib.rs b/crates/bevy_core_pipeline/src/lib.rs index d6ce9af95dab8..44a222e3acf57 100644 --- a/crates/bevy_core_pipeline/src/lib.rs +++ b/crates/bevy_core_pipeline/src/lib.rs @@ -1,5 +1,6 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] +#![forbid(unsafe_code)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] pub mod blit; diff --git a/crates/bevy_derive/src/lib.rs b/crates/bevy_derive/src/lib.rs index 591bd9f7a84a1..6b82b6b5c609f 100644 --- a/crates/bevy_derive/src/lib.rs +++ b/crates/bevy_derive/src/lib.rs @@ -1,5 +1,6 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] +#![forbid(unsafe_code)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] extern crate proc_macro; diff --git a/crates/bevy_dev_tools/src/lib.rs b/crates/bevy_dev_tools/src/lib.rs index 031f627293485..166c2faac94bb 100644 --- a/crates/bevy_dev_tools/src/lib.rs +++ b/crates/bevy_dev_tools/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! This crate provides additional utilities for the [Bevy game engine](https://bevyengine.org), //! focused on improving developer experience. diff --git a/crates/bevy_diagnostic/src/lib.rs b/crates/bevy_diagnostic/src/lib.rs index c3ad6427fc638..54119928adcb1 100644 --- a/crates/bevy_diagnostic/src/lib.rs +++ b/crates/bevy_diagnostic/src/lib.rs @@ -1,6 +1,7 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! This crate provides a straightforward solution for integrating diagnostics in the [Bevy game engine](https://bevyengine.org/). //! It allows users to easily add diagnostic functionality to their Bevy applications, enhancing diff --git a/crates/bevy_dynamic_plugin/src/loader.rs b/crates/bevy_dynamic_plugin/src/loader.rs index 94c283a886e78..8b6517b237244 100644 --- a/crates/bevy_dynamic_plugin/src/loader.rs +++ b/crates/bevy_dynamic_plugin/src/loader.rs @@ -1,3 +1,5 @@ +#![allow(unsafe_code)] + use libloading::{Library, Symbol}; use std::ffi::OsStr; use thiserror::Error; diff --git a/crates/bevy_encase_derive/src/lib.rs b/crates/bevy_encase_derive/src/lib.rs index 1fc888a61c8ae..960900d6b855e 100644 --- a/crates/bevy_encase_derive/src/lib.rs +++ b/crates/bevy_encase_derive/src/lib.rs @@ -1,5 +1,6 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] +#![forbid(unsafe_code)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] use bevy_macro_utils::BevyManifest; diff --git a/crates/bevy_gilrs/src/lib.rs b/crates/bevy_gilrs/src/lib.rs index bd1ec09a2ae95..d64258bee97c4 100644 --- a/crates/bevy_gilrs/src/lib.rs +++ b/crates/bevy_gilrs/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! Systems and type definitions for gamepad handling in Bevy. //! diff --git a/crates/bevy_gltf/src/lib.rs b/crates/bevy_gltf/src/lib.rs index a2fce065df8a9..bbfd461505b21 100644 --- a/crates/bevy_gltf/src/lib.rs +++ b/crates/bevy_gltf/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! Plugin providing an [`AssetLoader`](bevy_asset::AssetLoader) and type definitions //! for loading glTF 2.0 (a standard 3D scene definition format) files in Bevy. diff --git a/crates/bevy_hierarchy/src/lib.rs b/crates/bevy_hierarchy/src/lib.rs index 9ef22a7ab5547..91b1e362d1223 100644 --- a/crates/bevy_hierarchy/src/lib.rs +++ b/crates/bevy_hierarchy/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! Parent-child relationships for Bevy entities. //! diff --git a/crates/bevy_input/src/lib.rs b/crates/bevy_input/src/lib.rs index f2bd0d5f1e6c2..c221f35985d87 100644 --- a/crates/bevy_input/src/lib.rs +++ b/crates/bevy_input/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! Input functionality for the [Bevy game engine](https://bevyengine.org/). //! diff --git a/crates/bevy_internal/src/lib.rs b/crates/bevy_internal/src/lib.rs index 434755f9c124f..1e130a350396c 100644 --- a/crates/bevy_internal/src/lib.rs +++ b/crates/bevy_internal/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! This module is separated into its own crate to enable simple dynamic linking for Bevy, and should not be used directly diff --git a/crates/bevy_log/src/lib.rs b/crates/bevy_log/src/lib.rs index b4c9a34f6765e..fd881827b4846 100644 --- a/crates/bevy_log/src/lib.rs +++ b/crates/bevy_log/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! This crate provides logging functions and configuration for [Bevy](https://bevyengine.org) //! apps, and automatically configures platform specific log handlers (i.e. WASM or Android). diff --git a/crates/bevy_math/src/lib.rs b/crates/bevy_math/src/lib.rs index 4698604c8cf34..9d51c96703727 100644 --- a/crates/bevy_math/src/lib.rs +++ b/crates/bevy_math/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! Provides math types and functionality for the Bevy game engine. //! diff --git a/crates/bevy_pbr/src/lib.rs b/crates/bevy_pbr/src/lib.rs index 429aa85135e01..f1b2a1dd157a6 100644 --- a/crates/bevy_pbr/src/lib.rs +++ b/crates/bevy_pbr/src/lib.rs @@ -1,6 +1,7 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] pub mod wireframe; From 2a8f1f56e2d59191ba42aafb27e2b20ca435caee Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 03:10:03 -0700 Subject: [PATCH 14/24] Use the derive macros and forbid unsafe in bevy_color --- crates/bevy_color/src/lib.rs | 1 + crates/bevy_color/src/linear_rgba.rs | 31 +--------------------------- 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/crates/bevy_color/src/lib.rs b/crates/bevy_color/src/lib.rs index 103bf0f4194dc..0496de2ba20cd 100644 --- a/crates/bevy_color/src/lib.rs +++ b/crates/bevy_color/src/lib.rs @@ -1,4 +1,5 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] +#![forbid(unsafe_code)] //! Representations of colors in various color spaces. //! diff --git a/crates/bevy_color/src/linear_rgba.rs b/crates/bevy_color/src/linear_rgba.rs index 6b504ce2b2b23..ec5071b4677cb 100644 --- a/crates/bevy_color/src/linear_rgba.rs +++ b/crates/bevy_color/src/linear_rgba.rs @@ -12,7 +12,7 @@ use serde::{Deserialize, Serialize}; ///
#[doc = include_str!("../docs/diagrams/model_graph.svg")] ///
-#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Reflect)] +#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize, Reflect, Pod, Zeroable)] #[reflect(PartialEq, Serialize, Deserialize, Default)] #[repr(C)] pub struct LinearRgba { @@ -369,35 +369,6 @@ impl encase::private::CreateFrom for LinearRgba { } } -/// A [`Zeroable`] type is one whose bytes can be filled with zeroes while remaining valid. -/// -/// SAFETY: [`LinearRgba`] is inhabited -/// SAFETY: [`LinearRgba`]'s all-zero bit pattern is a valid value -#[allow(unsafe_code)] -unsafe impl Zeroable for LinearRgba { - fn zeroed() -> Self { - LinearRgba { - red: 0.0, - green: 0.0, - blue: 0.0, - alpha: 0.0, - } - } -} - -/// The [`Pod`] trait is [`bytemuck`]'s marker for types that can be safely transmuted from a byte array. -/// -/// It is intended to only be implemented for types which are "Plain Old Data". -/// -/// SAFETY: [`LinearRgba`] is inhabited. -/// SAFETY: [`LinearRgba`] permits any bit value. -/// SAFETY: [`LinearRgba`] does not have padding bytes. -/// SAFETY: all of the fields of [`LinearRgba`] are [`Pod`], as f32 is [`Pod`]. -/// SAFETY: [`LinearRgba`] is `repr(C)` -/// SAFETY: [`LinearRgba`] does not permit interior mutability. -#[allow(unsafe_code)] -unsafe impl Pod for LinearRgba {} - impl encase::ShaderSize for LinearRgba {} #[cfg(test)] From 2cd1ab780cac3000cc6ddb06b8d569674a1c1c75 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 03:15:06 -0700 Subject: [PATCH 15/24] Formatting --- crates/bevy_text/src/pipeline.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_text/src/pipeline.rs b/crates/bevy_text/src/pipeline.rs index a891c2d8e9509..26c547466e05f 100644 --- a/crates/bevy_text/src/pipeline.rs +++ b/crates/bevy_text/src/pipeline.rs @@ -133,7 +133,7 @@ impl TextMeasureInfo { let mut out_sections = Vec::with_capacity(sections.len()); for (i, section) in sections.iter().enumerate() { match fonts.get(§ion.style.font) { - Some(font) => { + Some(font) => { auto_fonts.push(font.font.clone()); out_sections.push(TextMeasureSection { font_id: FontId(i), From 50cc793fd5a328fa6184568d14796220da5ac88c Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 03:19:09 -0700 Subject: [PATCH 16/24] Allow unsafe in single threaded task pool --- crates/bevy_tasks/src/single_threaded_task_pool.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_tasks/src/single_threaded_task_pool.rs b/crates/bevy_tasks/src/single_threaded_task_pool.rs index f3837c4766fae..3a32c9e286211 100644 --- a/crates/bevy_tasks/src/single_threaded_task_pool.rs +++ b/crates/bevy_tasks/src/single_threaded_task_pool.rs @@ -94,6 +94,7 @@ impl TaskPool { /// to spawn tasks. This function will await the completion of all tasks before returning. /// /// This is similar to `rayon::scope` and `crossbeam::scope` + #[allow(unsafe_code)] pub fn scope_with_executor<'env, F, T>( &self, _tick_task_pool_executor: bool, From 0904dfee0b1f47c69097434727f1468509c2a809 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 03:23:26 -0700 Subject: [PATCH 17/24] Allow unsafe in tests --- crates/bevy_reflect/src/type_registry.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/bevy_reflect/src/type_registry.rs b/crates/bevy_reflect/src/type_registry.rs index 406b1f29b8b73..2090094fea70a 100644 --- a/crates/bevy_reflect/src/type_registry.rs +++ b/crates/bevy_reflect/src/type_registry.rs @@ -735,6 +735,7 @@ impl FromType for ReflectFromPtr { } #[cfg(test)] +#[allow(unsafe_code)] mod test { use crate::{GetTypeRegistration, ReflectFromPtr}; use bevy_ptr::{Ptr, PtrMut}; From 61e6d4a7ec63baa517d6989b45654234ef4d1eb7 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 03:28:27 -0700 Subject: [PATCH 18/24] Shift comment locations --- crates/bevy_gizmos/src/gizmos.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_gizmos/src/gizmos.rs b/crates/bevy_gizmos/src/gizmos.rs index 2842d516e0a88..f161792bcaf2f 100644 --- a/crates/bevy_gizmos/src/gizmos.rs +++ b/crates/bevy_gizmos/src/gizmos.rs @@ -50,8 +50,8 @@ pub struct GizmosFetchState { state: as SystemParam>::State, } -// SAFETY: All methods are delegated to existing `SystemParam` implementations #[allow(unsafe_code)] +// SAFETY: All methods are delegated to existing `SystemParam` implementations unsafe impl SystemParam for Gizmos<'_, '_, T> { type State = GizmosFetchState; type Item<'w, 's> = Gizmos<'w, 's, T>; @@ -93,8 +93,8 @@ unsafe impl SystemParam for Gizmos<'_, '_, T> { } } -// Safety: Each field is `ReadOnlySystemParam`, and Gizmos SystemParam does not mutate world #[allow(unsafe_code)] +// Safety: Each field is `ReadOnlySystemParam`, and Gizmos SystemParam does not mutate world unsafe impl<'w, 's, T: GizmoConfigGroup> ReadOnlySystemParam for Gizmos<'w, 's, T> where Deferred<'s, GizmoBuffer>: ReadOnlySystemParam, From 19437d5aff7b7681ba0688d5e29bf43d4c418d70 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 03:37:39 -0700 Subject: [PATCH 19/24] Allow unsafe in the dynamic ECS example --- examples/ecs/dynamic.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/ecs/dynamic.rs b/examples/ecs/dynamic.rs index 9b0c41ef04f6b..d5f18e059c313 100644 --- a/examples/ecs/dynamic.rs +++ b/examples/ecs/dynamic.rs @@ -1,3 +1,5 @@ +#![allow(unsafe_code)] + //! This example show how you can create components dynamically, spawn entities with those components //! as well as query for entities with those components. From ff25cd566687979e35db0d31e8b1a05bf97f1603 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 15:38:00 -0700 Subject: [PATCH 20/24] Covert existing denies to forbids --- crates/bevy_macro_utils/src/lib.rs | 2 +- crates/bevy_transform/src/lib.rs | 2 +- crates/bevy_ui/src/lib.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bevy_macro_utils/src/lib.rs b/crates/bevy_macro_utils/src/lib.rs index 535d61a09fc57..f231ec0422931 100644 --- a/crates/bevy_macro_utils/src/lib.rs +++ b/crates/bevy_macro_utils/src/lib.rs @@ -1,4 +1,4 @@ -#![deny(unsafe_code)] +#![forbid(unsafe_code)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] //! A collection of helper types and functions for working on macros within the Bevy ecosystem. diff --git a/crates/bevy_transform/src/lib.rs b/crates/bevy_transform/src/lib.rs index 69c39d15526f5..22976e25ecafa 100755 --- a/crates/bevy_transform/src/lib.rs +++ b/crates/bevy_transform/src/lib.rs @@ -1,6 +1,6 @@ #![doc = include_str!("../README.md")] #![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![deny(unsafe_code)] +#![forbid(unsafe_code)] pub mod commands; /// The basic components of the transform crate diff --git a/crates/bevy_ui/src/lib.rs b/crates/bevy_ui/src/lib.rs index 1e9e7a075ef94..3b27eed44a1d5 100644 --- a/crates/bevy_ui/src/lib.rs +++ b/crates/bevy_ui/src/lib.rs @@ -1,7 +1,7 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![deny(unsafe_code)] +#![forbid(unsafe_code)] //! This crate contains Bevy's UI system, which can be used to create UI for both 2D and 3D games //! # Basic usage From 5e77a38f120793ed9f3919ed4f2b69a1e7962a80 Mon Sep 17 00:00:00 2001 From: james7132 Date: Sun, 24 Mar 2024 15:52:12 -0700 Subject: [PATCH 21/24] Remove the improper forbids --- crates/bevy_transform/src/lib.rs | 1 - crates/bevy_ui/src/lib.rs | 1 - 2 files changed, 2 deletions(-) diff --git a/crates/bevy_transform/src/lib.rs b/crates/bevy_transform/src/lib.rs index 22976e25ecafa..f38ca1726b1b6 100755 --- a/crates/bevy_transform/src/lib.rs +++ b/crates/bevy_transform/src/lib.rs @@ -1,6 +1,5 @@ #![doc = include_str!("../README.md")] #![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![forbid(unsafe_code)] pub mod commands; /// The basic components of the transform crate diff --git a/crates/bevy_ui/src/lib.rs b/crates/bevy_ui/src/lib.rs index 3b27eed44a1d5..b9fffe39e63c7 100644 --- a/crates/bevy_ui/src/lib.rs +++ b/crates/bevy_ui/src/lib.rs @@ -1,7 +1,6 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![forbid(unsafe_code)] //! This crate contains Bevy's UI system, which can be used to create UI for both 2D and 3D games //! # Basic usage From 8b99a2a850690264110a6b8786505b7bfdf683f0 Mon Sep 17 00:00:00 2001 From: james7132 Date: Mon, 25 Mar 2024 13:11:06 -0700 Subject: [PATCH 22/24] Allow unsafe code in bevy_pbr --- crates/bevy_pbr/src/lib.rs | 1 - crates/bevy_pbr/src/meshlet/persistent_buffer.rs | 2 ++ crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/bevy_pbr/src/lib.rs b/crates/bevy_pbr/src/lib.rs index 327b48e249e07..1f90e1a21a439 100644 --- a/crates/bevy_pbr/src/lib.rs +++ b/crates/bevy_pbr/src/lib.rs @@ -1,7 +1,6 @@ // FIXME(3492): remove once docs are ready #![allow(missing_docs)] #![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![forbid(unsafe_code)] #![doc( html_logo_url = "https://bevyengine.org/assets/icon.png", html_favicon_url = "https://bevyengine.org/assets/icon.png" diff --git a/crates/bevy_pbr/src/meshlet/persistent_buffer.rs b/crates/bevy_pbr/src/meshlet/persistent_buffer.rs index eccce560dca55..8f8fe5d1d7f30 100644 --- a/crates/bevy_pbr/src/meshlet/persistent_buffer.rs +++ b/crates/bevy_pbr/src/meshlet/persistent_buffer.rs @@ -1,3 +1,4 @@ + use bevy_render::{ render_resource::{ BindingResource, Buffer, BufferAddress, BufferDescriptor, BufferUsages, @@ -112,6 +113,7 @@ impl PersistentGpuBuffer { /// # Safety /// * All data must be a multiple of `wgpu::COPY_BUFFER_ALIGNMENT` bytes. /// * The amount of bytes written to `buffer` in `write_bytes_le()` must match `size_in_bytes()`. +#![allow(unsafe_code)] pub unsafe trait PersistentGpuBufferable { /// Additional metadata associated with each item, made available during `write_bytes_le`. type Metadata; diff --git a/crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs b/crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs index 0567246b3543f..b3e882dc43143 100644 --- a/crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs +++ b/crates/bevy_pbr/src/meshlet/persistent_buffer_impls.rs @@ -1,3 +1,4 @@ +#![allow(unsafe_code)] #![allow(clippy::undocumented_unsafe_blocks)] use super::{persistent_buffer::PersistentGpuBufferable, Meshlet, MeshletBoundingSphere}; From e23ba463a1b0912966cd1d47f8bf26223e822d4f Mon Sep 17 00:00:00 2001 From: james7132 Date: Mon, 25 Mar 2024 18:53:32 -0700 Subject: [PATCH 23/24] Module level allow --- crates/bevy_pbr/src/meshlet/persistent_buffer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_pbr/src/meshlet/persistent_buffer.rs b/crates/bevy_pbr/src/meshlet/persistent_buffer.rs index 8f8fe5d1d7f30..fe67b1841658b 100644 --- a/crates/bevy_pbr/src/meshlet/persistent_buffer.rs +++ b/crates/bevy_pbr/src/meshlet/persistent_buffer.rs @@ -1,3 +1,4 @@ +#![allow(unsafe_code)] use bevy_render::{ render_resource::{ @@ -113,7 +114,6 @@ impl PersistentGpuBuffer { /// # Safety /// * All data must be a multiple of `wgpu::COPY_BUFFER_ALIGNMENT` bytes. /// * The amount of bytes written to `buffer` in `write_bytes_le()` must match `size_in_bytes()`. -#![allow(unsafe_code)] pub unsafe trait PersistentGpuBufferable { /// Additional metadata associated with each item, made available during `write_bytes_le`. type Metadata; From 08cf890c3b63f4b871e4acaab88b35b0dbd3ba93 Mon Sep 17 00:00:00 2001 From: james7132 Date: Tue, 26 Mar 2024 19:55:15 -0700 Subject: [PATCH 24/24] Allow unsafe for android logging --- crates/bevy_log/src/android_tracing.rs | 1 + crates/bevy_log/src/lib.rs | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_log/src/android_tracing.rs b/crates/bevy_log/src/android_tracing.rs index a5e7bc8626b2e..80a9b63c538a8 100644 --- a/crates/bevy_log/src/android_tracing.rs +++ b/crates/bevy_log/src/android_tracing.rs @@ -73,6 +73,7 @@ impl LookupSpan<'a>> Layer for AndroidLayer { } } + #[allow(unsafe_code)] fn on_event(&self, event: &Event<'_>, _ctx: Context<'_, S>) { let mut recorder = StringRecorder::new(); event.record(&mut recorder); diff --git a/crates/bevy_log/src/lib.rs b/crates/bevy_log/src/lib.rs index 5d32da8e0841f..7391ffe039123 100644 --- a/crates/bevy_log/src/lib.rs +++ b/crates/bevy_log/src/lib.rs @@ -1,5 +1,4 @@ #![cfg_attr(docsrs, feature(doc_auto_cfg))] -#![forbid(unsafe_code)] #![doc( html_logo_url = "https://bevyengine.org/assets/icon.png", html_favicon_url = "https://bevyengine.org/assets/icon.png"