From 5ffa241f53a0909ca42a33f2f1701ddb77d27e18 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Tue, 5 May 2026 21:52:23 +0200 Subject: [PATCH 1/3] fix: suppress use-after-free warning in disabled test Wraps the intentional use-after-free in DISABLED_PackageFileDataShallReturnsNulloptIfItWorkedOnAlreadyClosedFile with GCC diagnostic pragmas to suppress -Wuse-after-free warning. This test is already disabled and intentionally passes a closed FILE* to test error handling in PackageFileData. The pragmas allow compilation with -Werror=use-after-free while preserving the test's intent. Fixes compilation error: error: pointer 'file' may be used after 'int fclose(FILE*)' [-Werror=use-after-free] Co-Authored-By: Claude Sonnet 4.5 --- score/datarouter/test/ut/ut_logging/test_dltprotocol.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/score/datarouter/test/ut/ut_logging/test_dltprotocol.cpp b/score/datarouter/test/ut/ut_logging/test_dltprotocol.cpp index 98f5b38e..500fe099 100644 --- a/score/datarouter/test/ut/ut_logging/test_dltprotocol.cpp +++ b/score/datarouter/test/ut/ut_logging/test_dltprotocol.cpp @@ -90,7 +90,10 @@ TEST(DltProtocolTest, DISABLED_PackageFileDataShallReturnsNulloptIfItWorkedOnAlr ASSERT_TRUE(file != nullptr) << "The file used in the unit test is missed! The file: " << kFileName; fclose(file); // Close the file immediately. +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wuse-after-free" auto result = PackageFileData(data_span, file, serial_number, pkg_number); +#pragma GCC diagnostic pop EXPECT_EQ(result, std::nullopt); } From ef8e487650a0a9889107e2728acc5b9c11a589b0 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Tue, 5 May 2026 21:52:42 +0200 Subject: [PATCH 2/3] fix: avoid ignored-attributes warning in unique_ptr deleter Replaces decltype(&fclose) with a lambda deleter to avoid GCC warning about function attributes being ignored in template argument. Using decltype(&fclose) as a template argument for std::unique_ptr triggers -Werror=ignored-attributes because GCC cannot preserve all function attributes through decltype in this context. The lambda wrapper provides identical functionality without triggering the warning. Fixes compilation error: error: ignoring attributes on template argument 'int (*)(FILE*)' [-Werror=ignored-attributes] Co-Authored-By: Claude Sonnet 4.5 --- score/datarouter/src/daemon/persistentlogging_config.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/score/datarouter/src/daemon/persistentlogging_config.cpp b/score/datarouter/src/daemon/persistentlogging_config.cpp index 397656e3..b991a7aa 100644 --- a/score/datarouter/src/daemon/persistentlogging_config.cpp +++ b/score/datarouter/src/daemon/persistentlogging_config.cpp @@ -41,8 +41,9 @@ PersistentLoggingConfig ReadPersistentLoggingConfig(const std::string& file_path using ReadResult = PersistentLoggingConfig::ReadResult; PersistentLoggingConfig config; - using UniqueFileT = std::unique_ptr; - UniqueFileT fp(std::fopen(file_path.c_str(), "r"), &fclose); + auto file_deleter = [](std::FILE* f) { if (f) fclose(f); }; + using UniqueFileT = std::unique_ptr; + UniqueFileT fp(std::fopen(file_path.c_str(), "r"), file_deleter); if (nullptr == fp) { config.read_result = ReadResult::kErrorOpen; From 276e999fc1f0470c85f4ed0f4c8b1c135da2acc8 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Wed, 6 May 2026 10:44:19 +0200 Subject: [PATCH 3/3] fix: add aarch64-linux support to Rust FFI bridge Add configuration and feature flags to support aarch64-linux builds for the score_log_bridge Rust/C++ FFI interface. Changes: - Add aarch64-linux config_setting to BUILD file - Include aarch64_linux in preprocessor checks (adapter.cpp, ffi.rs) - Replace unstable Rust features with stable equivalents: * Use explicit array sizes instead of `[T; _]` placeholder * Use `core::str::from_utf8_unchecked` instead of inherent method These changes enable the Rust bridge to compile on aarch64 platforms using stable Ferrocene toolchain without nightly features. Co-Authored-By: Claude Sonnet 4.5 --- score/mw/log/rust/score_log_bridge/BUILD | 11 ++++++++++ .../log/rust/score_log_bridge/src/adapter.cpp | 2 +- score/mw/log/rust/score_log_bridge/src/ffi.rs | 20 ++++++++++++++----- .../log/rust/score_log_bridge_cpp_init/ffi.rs | 2 +- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/score/mw/log/rust/score_log_bridge/BUILD b/score/mw/log/rust/score_log_bridge/BUILD index fc6087c1..9434185e 100644 --- a/score/mw/log/rust/score_log_bridge/BUILD +++ b/score/mw/log/rust/score_log_bridge/BUILD @@ -38,12 +38,21 @@ config_setting( ], ) +config_setting( + name = "aarch64-linux", + constraint_values = [ + "@platforms//cpu:aarch64", + "@platforms//os:linux", + ], +) + cc_library( name = "adapter", srcs = ["src/adapter.cpp"], # C++/Rust interface objects must share layout. defines = select({ ":x86_64-linux": ["x86_64_linux"], + ":aarch64-linux": ["aarch64_linux"], ":arm64-qnx": ["arm64_qnx"], ":x86_64-qnx": ["x86_64_qnx"], "//conditions:default": [], @@ -65,6 +74,7 @@ rust_library( # C++/Rust interface objects must share layout. crate_features = select({ ":x86_64-linux": ["x86_64_linux"], + ":aarch64-linux": ["aarch64_linux"], ":arm64-qnx": ["arm64_qnx"], ":x86_64-qnx": ["x86_64_qnx"], "//conditions:default": [], @@ -94,6 +104,7 @@ rust_test( crate = "score_log_bridge", crate_features = select({ ":x86_64-linux": ["x86_64_linux"], + ":aarch64-linux": ["aarch64_linux"], ":arm64-qnx": ["arm64_qnx"], ":x86_64-qnx": ["x86_64_qnx"], "//conditions:default": [], diff --git a/score/mw/log/rust/score_log_bridge/src/adapter.cpp b/score/mw/log/rust/score_log_bridge/src/adapter.cpp index f46e4a07..278e2d57 100644 --- a/score/mw/log/rust/score_log_bridge/src/adapter.cpp +++ b/score/mw/log/rust/score_log_bridge/src/adapter.cpp @@ -23,7 +23,7 @@ using namespace score::mw::log::detail; // Those parameters must be: // - managed by build system (using defines and features) // - cross-checked between `ffi.rs` and `adapter.cpp` -#if defined(x86_64_linux) || defined(arm64_qnx) || defined(x86_64_qnx) +#if defined(x86_64_linux) || defined(aarch64_linux) || defined(arm64_qnx) || defined(x86_64_qnx) // Expected size and alignment of `SlotHandle`. static_assert(sizeof(SlotHandle) == 24); static_assert(alignof(SlotHandle) == 8); diff --git a/score/mw/log/rust/score_log_bridge/src/ffi.rs b/score/mw/log/rust/score_log_bridge/src/ffi.rs index 3d712ec7..b8e2ad94 100644 --- a/score/mw/log/rust/score_log_bridge/src/ffi.rs +++ b/score/mw/log/rust/score_log_bridge/src/ffi.rs @@ -98,7 +98,7 @@ impl From<&str> for Context { let size = min(value.len(), 4); // Copy data into array. - let mut data = [0; _]; + let mut data = [0; 4]; // SAFETY: // Copying is safe: // - source is a `&str`. @@ -127,7 +127,7 @@ impl From<&Context> for &str { // Create a slice from pointer and size. let slice = from_raw_parts(data, size); // Create a UTF-8 string from a slice. - str::from_utf8_unchecked(slice) + core::str::from_utf8_unchecked(slice) } } } @@ -180,13 +180,23 @@ unsafe impl Sync for Recorder {} /// Those parameters must be: /// - managed by build system (using defines and features) /// - cross-checked between `ffi.rs` and `adapter.cpp` -#[cfg(any(feature = "x86_64_linux", feature = "arm64_qnx", feature = "x86_64_qnx"))] +#[cfg(any( + feature = "x86_64_linux", + feature = "aarch64_linux", + feature = "arm64_qnx", + feature = "x86_64_qnx" +))] #[repr(C, align(8))] pub struct SlotHandleStorage { _private: [u8; 24], } -#[cfg(not(any(feature = "x86_64_linux", feature = "arm64_qnx", feature = "x86_64_qnx")))] +#[cfg(not(any( + feature = "x86_64_linux", + feature = "aarch64_linux", + feature = "arm64_qnx", + feature = "x86_64_qnx" +)))] compile_error!("Unknown configuration, unable to check layout"); impl SlotHandleStorage { @@ -212,7 +222,7 @@ impl SlotHandleStorage { impl Default for SlotHandleStorage { /// Create storage for `SlotHandle`. fn default() -> Self { - Self { _private: [0; _] } + Self { _private: [0; 24] } } } diff --git a/score/mw/log/rust/score_log_bridge_cpp_init/ffi.rs b/score/mw/log/rust/score_log_bridge_cpp_init/ffi.rs index 822698ad..587116b2 100644 --- a/score/mw/log/rust/score_log_bridge_cpp_init/ffi.rs +++ b/score/mw/log/rust/score_log_bridge_cpp_init/ffi.rs @@ -28,7 +28,7 @@ extern "C" fn set_default_logger( if !context_ptr.is_null() { let context = unsafe { let slice = from_raw_parts(context_ptr.cast(), context_size); - str::from_utf8(slice).expect("provided context is not a valid UTF-8 string") + core::str::from_utf8(slice).expect("provided context is not a valid UTF-8 string") }; builder = builder.context(context); }