From 7a0ee92e7388c31e8982a40b555ffc326ba5fd79 Mon Sep 17 00:00:00 2001 From: Thomas Kroissenbrunner Date: Wed, 17 Dec 2025 16:27:49 +0100 Subject: [PATCH 01/13] create constexpr_strlen.h and write function --- include/common/mir/constexpr_strlen.h | 23 +++++++++++++++++++++++ src/common/CMakeLists.txt | 1 + 2 files changed, 24 insertions(+) create mode 100644 include/common/mir/constexpr_strlen.h diff --git a/include/common/mir/constexpr_strlen.h b/include/common/mir/constexpr_strlen.h new file mode 100644 index 00000000000..50fad224223 --- /dev/null +++ b/include/common/mir/constexpr_strlen.h @@ -0,0 +1,23 @@ +/* + * Copyright © Canonical Ltd. + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 or 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include + +using namespace std; + +// replaces strlen() across codebase +inline constexpr size_t constexpr_strlen(string_view str) { return str.size(); } diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 60938ea6c6b..16f9ff08663 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -51,6 +51,7 @@ add_library(mircommon SHARED ${PROJECT_SOURCE_DIR}/include/common/mir/input/mir_touchscreen_config.h ${PROJECT_SOURCE_DIR}/include/common/mir/input/mir_keyboard_config.h ${PROJECT_SOURCE_DIR}/include/common/mir/input/keyboard_leds.h + ${PROJECT_SOURCE_DIR}/include/common/mir/constexpr_strlen.h ${MIR_COMMON_SOURCES} ) From ef3cb2799a05fe95a2b16e7b34dac5aa01dd3826 Mon Sep 17 00:00:00 2001 From: Thomas Kroissenbrunner Date: Wed, 17 Dec 2025 16:48:02 +0100 Subject: [PATCH 02/13] replace strlen() with constexpr_strlen() --- include/common/mir/constexpr_strlen.h | 1 - src/miral/display_configuration_option.cpp | 7 ++++--- src/platform/graphics/egl_extensions.cpp | 3 ++- src/platform/options/default_configuration.cpp | 3 ++- src/platforms/evdev/platform.cpp | 3 ++- src/platforms/gbm-kms/server/kms/platform_symbols.cpp | 3 ++- src/server/console/linux_virtual_terminal.cpp | 5 +++-- src/server/console/logind_console_services.cpp | 5 +++-- src/server/console/minimal_console_services.cpp | 5 +++-- .../frontend_wayland/foreign_toplevel_manager_v1.cpp | 3 ++- src/server/frontend_wayland/keyboard_helper.cpp | 3 ++- src/server/run_mir.cpp | 3 ++- tests/mir_test_doubles/mock_drm.cpp | 9 +++++---- tests/miral/wayland_extensions.cpp | 3 ++- tests/performance-tests/test_compositor.cpp | 6 ++++-- .../console/test_linux_virtual_terminal.cpp | 11 ++++++----- .../console/test_minimal_console_services.cpp | 9 +++++---- 17 files changed, 49 insertions(+), 33 deletions(-) diff --git a/include/common/mir/constexpr_strlen.h b/include/common/mir/constexpr_strlen.h index 50fad224223..4465371d0ff 100644 --- a/include/common/mir/constexpr_strlen.h +++ b/include/common/mir/constexpr_strlen.h @@ -14,7 +14,6 @@ * along with this program. If not, see . */ -#include #include using namespace std; diff --git a/src/miral/display_configuration_option.cpp b/src/miral/display_configuration_option.cpp index d835a73360f..9349cf8569f 100644 --- a/src/miral/display_configuration_option.cpp +++ b/src/miral/display_configuration_option.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include #include @@ -226,13 +227,13 @@ void miral::display_configuration_options(mir::Server& server) { layout_selector = std::make_shared(); } - else if (display_layout.compare(0, strlen(static_opt_val), static_opt_val) == 0) + else if (display_layout.compare(0, constexpr_strlen(static_opt_val), static_opt_val) == 0) { if (scale != 1.0) { mir::fatal_error("Display scale option can't be used with static display configuration"); } - auto sdc = std::make_shared(display_layout.substr(strlen(static_opt_val))); + auto sdc = std::make_shared(display_layout.substr(constexpr_strlen(static_opt_val))); server.add_init_callback([sdc, &server]{ sdc->init_auto_reload(server); }); layout_selector = std::move(sdc); } @@ -249,7 +250,7 @@ void miral::display_configuration_options(mir::Server& server) mir::fatal_error("Display scale option can't be used with autoscale"); } - if (display_layout.compare(0, strlen(static_opt_val), static_opt_val) == 0) + if (display_layout.compare(0, constexpr_strlen(static_opt_val), static_opt_val) == 0) { mir::fatal_error("Display autoscale option can't be used with static display configuration"); } diff --git a/src/platform/graphics/egl_extensions.cpp b/src/platform/graphics/egl_extensions.cpp index cd2b4c8edda..0c062ec6281 100644 --- a/src/platform/graphics/egl_extensions.cpp +++ b/src/platform/graphics/egl_extensions.cpp @@ -15,6 +15,7 @@ */ #include +#include #include #include #include @@ -34,7 +35,7 @@ auto mg::has_egl_extension(EGLDisplay dpy, char const* extension) -> bool while (found_substring) { // Check that we haven't found a prefix of our extension name - auto end_of_match = found_substring + strlen(extension); + auto end_of_match = found_substring + constexpr_strlen(extension); // It's a match if it terminates with the end of the extension string, or with a space if (*end_of_match == '\0' || *end_of_match == ' ') { diff --git a/src/platform/options/default_configuration.cpp b/src/platform/options/default_configuration.cpp index 5899b2bf98c..3d8d5d84881 100644 --- a/src/platform/options/default_configuration.cpp +++ b/src/platform/options/default_configuration.cpp @@ -22,6 +22,7 @@ #include #include #include +#include #include #include @@ -573,7 +574,7 @@ void mo::DefaultConfiguration::parse_environment( [=, this](std::string const& from) -> std::string { auto const prefix = "MIR_SERVER_"; - auto const sizeof_prefix = strlen(prefix); + auto const sizeof_prefix = constexpr_strlen(prefix); if (!from.starts_with(prefix)) { diff --git a/src/platforms/evdev/platform.cpp b/src/platforms/evdev/platform.cpp index 0d4f9123f0c..5a65da6b8cb 100644 --- a/src/platforms/evdev/platform.cpp +++ b/src/platforms/evdev/platform.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -310,7 +311,7 @@ void mie::Platform::start() std::string devnode{workaround_device->devnode()}; // Libinput filters out anything without “event” as its name - if (strncmp(workaround_device->sysname(), "event", strlen("event")) != 0) + if (strncmp(workaround_device->sysname(), "event", constexpr_strlen("event")) != 0) { return; } diff --git a/src/platforms/gbm-kms/server/kms/platform_symbols.cpp b/src/platforms/gbm-kms/server/kms/platform_symbols.cpp index 51e40f8bae3..d77e434da68 100644 --- a/src/platforms/gbm-kms/server/kms/platform_symbols.cpp +++ b/src/platforms/gbm-kms/server/kms/platform_symbols.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #include "quirk_common.h" #include @@ -452,7 +453,7 @@ auto probe_rendering_platform( if (strncmp( "llvmpipe", renderer_string, - strlen("llvmpipe")) == 0) + constexpr_strlen("llvmpipe")) == 0) { mir::log_info("Detected software renderer: %s", renderer_string); // Leave the priority at ::unsupported; if we've got a software renderer then diff --git a/src/server/console/linux_virtual_terminal.cpp b/src/server/console/linux_virtual_terminal.cpp index 3eebcfb3963..910e64480b1 100644 --- a/src/server/console/linux_virtual_terminal.cpp +++ b/src/server/console/linux_virtual_terminal.cpp @@ -22,6 +22,7 @@ #include "ioctl_vt_switcher.h" #include #include +#include #define MIR_LOG_COMPONTENT "VT-handler" #include @@ -658,9 +659,9 @@ std::future> mir::LinuxVirtualTerminal::acquire_dev while (uevent.getline(line_buffer, sizeof(line_buffer))) { - if (strncmp(line_buffer, "DEVNAME=", strlen("DEVNAME=")) == 0) + if (strncmp(line_buffer, "DEVNAME=", constexpr_strlen("DEVNAME=")) == 0) { - return std::string{"/dev/"} + std::string{line_buffer + strlen("DEVNAME=")}; + return std::string{"/dev/"} + std::string{line_buffer + constexpr_strlen("DEVNAME=")}; } } BOOST_THROW_EXCEPTION((std::runtime_error{"Failed to read DEVNAME"})); diff --git a/src/server/console/logind_console_services.cpp b/src/server/console/logind_console_services.cpp index 1054f491410..cbf531a339e 100644 --- a/src/server/console/logind_console_services.cpp +++ b/src/server/console/logind_console_services.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #define MIR_LOG_COMPONTENT "logind" #include @@ -265,7 +266,7 @@ mir::LogindConsoleServices::LogindConsoleServices( session_path.c_str())}, switch_away{[](){ return true; }}, switch_to{[](){ return true; }}, - active{strncmp("active", logind_session_get_state(session_proxy.get()), strlen("active")) == 0} + active{strncmp("active", logind_session_get_state(session_proxy.get()), constexpr_strlen("active")) == 0} { GErrorPtr error; @@ -789,7 +790,7 @@ GDBusMessage* mir::LogindConsoleServices::resume_device_dbus_filter( return message; // …if it's a signal, but it's not ResumeDevice, we don't need to process it. - if (strncmp(g_dbus_message_get_member(message), "ResumeDevice", strlen("ResumeDevice")) != 0) + if (strncmp(g_dbus_message_get_member(message), "ResumeDevice", constexpr_strlen("ResumeDevice")) != 0) return message; // We've definitely got a ResumeDevice signal! Now to extract the parameters, and diff --git a/src/server/console/minimal_console_services.cpp b/src/server/console/minimal_console_services.cpp index e8a99660448..724558a57b4 100644 --- a/src/server/console/minimal_console_services.cpp +++ b/src/server/console/minimal_console_services.cpp @@ -17,6 +17,7 @@ #include "minimal_console_services.h" #include +#include #include #include @@ -104,9 +105,9 @@ std::future> mir::MinimalConsoleServices::acquire_d while (uevent.getline(line_buffer, sizeof(line_buffer))) { - if (strncmp(line_buffer, "DEVNAME=", strlen("DEVNAME=")) == 0) + if (strncmp(line_buffer, "DEVNAME=", constexpr_strlen("DEVNAME=")) == 0) { - return std::string{"/dev/"} + std::string{line_buffer + strlen("DEVNAME=")}; + return std::string{"/dev/"} + std::string{line_buffer + constexpr_strlen("DEVNAME=")}; } } BOOST_THROW_EXCEPTION((std::runtime_error{"Failed to read DEVNAME"})); diff --git a/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp b/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp index 153b19d933a..0e89dbe3999 100644 --- a/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp +++ b/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -581,7 +582,7 @@ void mf::GDesktopFileCache::refresh_app_cache() // it out since that isn't useful in this context. const char* const DESKTOP_PREFIX = ".desktop"; if (id.ends_with(DESKTOP_PREFIX)) - id.erase(id.length() - strlen(DESKTOP_PREFIX)); + id.erase(id.length() - constexpr_strlen(DESKTOP_PREFIX)); std::shared_ptr file = std::make_shared(id.c_str(), wm_class, exec); if (g_app_info_should_show(app_info)) diff --git a/src/server/frontend_wayland/keyboard_helper.cpp b/src/server/frontend_wayland/keyboard_helper.cpp index 53ef22a8b52..5463daf0dd8 100644 --- a/src/server/frontend_wayland/keyboard_helper.cpp +++ b/src/server/frontend_wayland/keyboard_helper.cpp @@ -21,6 +21,7 @@ #include #include #include +#include #include // memcpy #include @@ -144,7 +145,7 @@ void mf::KeyboardHelper::set_keymap(std::shared_ptr const& new_keyma XKB_KEYMAP_FORMAT_TEXT_V1), free}; // so the null terminator is included - auto length = strlen(buffer.get()) + 1; + auto length = constexpr_strlen(buffer.get()) + 1; mir::AnonymousShmFile shm_buffer{length}; memcpy(shm_buffer.base_ptr(), buffer.get(), length); diff --git a/src/server/run_mir.cpp b/src/server/run_mir.cpp index 95968ccdc0a..8d09da91167 100644 --- a/src/server/run_mir.cpp +++ b/src/server/run_mir.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -174,7 +175,7 @@ extern "C" [[noreturn]] void fatal_signal_cleanup(int sig, siginfo_t* info, void n = write(STDERR_FILENO, security_mid, sizeof(security_mid) - 1); if (program_invocation_short_name) { - n = write(STDERR_FILENO, program_invocation_short_name, std::strlen(program_invocation_short_name)); + n = write(STDERR_FILENO, program_invocation_short_name, constexpr_strlen(program_invocation_short_name)); } else { diff --git a/tests/mir_test_doubles/mock_drm.cpp b/tests/mir_test_doubles/mock_drm.cpp index 9fe006d2460..d31f769f5db 100644 --- a/tests/mir_test_doubles/mock_drm.cpp +++ b/tests/mir_test_doubles/mock_drm.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -235,7 +236,7 @@ mtd::MockDRM::MockDRM() [this](char const* path, int flags, std::optional) -> std::optional { char const* const drm_prefix = "/dev/dri/"; - if (!strncmp(path, drm_prefix, strlen(drm_prefix))) + if (!strncmp(path, drm_prefix, constexpr_strlen(drm_prefix))) { // I don't think we need to be able to distinguish based on mode. ppc64el (at least) *does* // call the 3-parameter open() @@ -373,11 +374,11 @@ mtd::MockDRM::MockDRM() 1, 2, 3, - static_cast(strlen("mock_driver")), + static_cast(constexpr_strlen("mock_driver")), const_cast("mock_driver"), - static_cast(strlen("1 Jan 1970")), + static_cast(constexpr_strlen("1 Jan 1970")), const_cast("1 Jan 1970"), - static_cast(strlen("Not really a driver")), + static_cast(constexpr_strlen("Not really a driver")), const_cast("Not really a driver") }; ON_CALL(*this, drmGetVersion(_)) diff --git a/tests/miral/wayland_extensions.cpp b/tests/miral/wayland_extensions.cpp index 34780f043e5..cd5c56627ad 100644 --- a/tests/miral/wayland_extensions.cpp +++ b/tests/miral/wayland_extensions.cpp @@ -31,6 +31,7 @@ #include #include #include +#include using namespace testing; @@ -189,7 +190,7 @@ std::vector run_client_enumerator(mir::Server& server) char line[256]; while (fgets(line, sizeof(line), stream)) { - size_t const len = strlen(line); + size_t const len = constexpr_strlen(line); interfaces.emplace_back(line, line + len - 1); } fclose(stream); diff --git a/tests/performance-tests/test_compositor.cpp b/tests/performance-tests/test_compositor.cpp index 30e06eac158..9676c79cb02 100644 --- a/tests/performance-tests/test_compositor.cpp +++ b/tests/performance-tests/test_compositor.cpp @@ -16,6 +16,8 @@ #include "system_performance_test.h" +#include + #include #include @@ -73,11 +75,11 @@ struct CompositorPerformance : SystemPerformanceTest } if (char const* renderer = strstr(line, "GL renderer: ")) { - server_renderer.assign(renderer + 13, strlen(renderer) - 14); + server_renderer.assign(renderer + 13, constexpr_strlen(renderer) - 14); } if (char const* mode = strstr(line, "Current mode")) { - server_mode.assign(mode + 13, strlen(mode) - 14); + server_mode.assign(mode + 13, constexpr_strlen(mode) - 14); } } } diff --git a/tests/unit-tests/console/test_linux_virtual_terminal.cpp b/tests/unit-tests/console/test_linux_virtual_terminal.cpp index 206c2ec6af7..7bbbd1514cf 100644 --- a/tests/unit-tests/console/test_linux_virtual_terminal.cpp +++ b/tests/unit-tests/console/test_linux_virtual_terminal.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -777,8 +778,8 @@ void set_expectations_for_uevent_probe( std::stringstream expected_filename; expected_filename << "/sys/dev/char/" << major << ":" << minor << "/uevent"; - auto uevent = std::make_shared(strlen(content)); - ::memcpy(uevent->base_ptr(), content, strlen(content)); + auto uevent = std::make_shared(constexpr_strlen(content)); + ::memcpy(uevent->base_ptr(), content, constexpr_strlen(content)); EXPECT_CALL(fops, open(StrEq(expected_filename.str()), FlagsSet(O_RDONLY, O_CLOEXEC))) .WillRepeatedly(InvokeWithoutArgs( @@ -791,7 +792,7 @@ std::string uevent_content_for_device( { std::stringstream content; - if (strncmp(device_name, "/dev/", strlen("/dev/")) != 0) + if (strncmp(device_name, "/dev/", constexpr_strlen("/dev/")) != 0) { throw std::logic_error{"device_name is expected to be the fully-qualified /dev/foo path"}; } @@ -931,8 +932,8 @@ TEST_F(LinuxVirtualTerminalTest, throws_error_when_parsing_fails) "MINOR=61\n" "I_AINT_NO_DEVNAME=fb0"; - mir::AnonymousShmFile uevent{strlen(uevent_content)}; - ::memcpy(uevent.base_ptr(), uevent_content, strlen(uevent_content)); + mir::AnonymousShmFile uevent{constexpr_strlen(uevent_content)}; + ::memcpy(uevent.base_ptr(), uevent_content, constexpr_strlen(uevent_content)); EXPECT_CALL(*fops, open(StrEq(expected_filename), FlagsSet(O_RDONLY, O_CLOEXEC))) .WillOnce(Return(uevent.fd())); diff --git a/tests/unit-tests/console/test_minimal_console_services.cpp b/tests/unit-tests/console/test_minimal_console_services.cpp index 52aae6511a4..665384431ce 100644 --- a/tests/unit-tests/console/test_minimal_console_services.cpp +++ b/tests/unit-tests/console/test_minimal_console_services.cpp @@ -17,6 +17,7 @@ #include "src/server/console/minimal_console_services.h" #include #include +#include #include #include @@ -42,7 +43,7 @@ std::string uevent_content_for_device( { std::stringstream content; - if (strncmp(device_name, "/dev/", strlen("/dev/")) != 0) + if (strncmp(device_name, "/dev/", constexpr_strlen("/dev/")) != 0) { throw std::logic_error{"device_name is expected to be the fully-qualified /dev/foo path"}; } @@ -107,8 +108,8 @@ class MinimalConsoleServicesTest : public testing::Test std::stringstream expected_filename; expected_filename << "/sys/dev/char/" << major << ":" << minor << "/uevent"; - auto uevent = std::make_shared(strlen(sysfile_content)); - ::memcpy(uevent->base_ptr(), sysfile_content, strlen(sysfile_content)); + auto uevent = std::make_shared(constexpr_strlen(sysfile_content)); + ::memcpy(uevent->base_ptr(), sysfile_content, constexpr_strlen(sysfile_content)); expectations.emplace_back( mtf::add_open_handler( @@ -276,7 +277,7 @@ TEST_F(MinimalConsoleServicesTest, failure_to_open_sys_file_results_in_immediate auto error_on_device_open = mtf::add_open_handler( [](char const* path, int, std::optional) -> std::optional { - if (!strncmp("/sys", path, strlen("/sys"))) + if (!strncmp("/sys", path, constexpr_strlen("/sys"))) { errno = EINVAL; return {-1}; From 26df02335654bb671de5d8c63a4840d952f10f9c Mon Sep 17 00:00:00 2001 From: thomaskroi1996 <131807984+thomaskroi1996@users.noreply.github.com> Date: Wed, 17 Dec 2025 18:01:13 +0100 Subject: [PATCH 03/13] Update include/common/mir/constexpr_strlen.h MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Sawicz --- include/common/mir/constexpr_strlen.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/common/mir/constexpr_strlen.h b/include/common/mir/constexpr_strlen.h index 4465371d0ff..f1ba5a2b863 100644 --- a/include/common/mir/constexpr_strlen.h +++ b/include/common/mir/constexpr_strlen.h @@ -18,5 +18,4 @@ using namespace std; -// replaces strlen() across codebase inline constexpr size_t constexpr_strlen(string_view str) { return str.size(); } From 6d136ca8111fdbc3500250a29a224b24161d1acd Mon Sep 17 00:00:00 2001 From: Thomas Kroissenbrunner Date: Wed, 17 Dec 2025 18:39:48 +0100 Subject: [PATCH 04/13] change file name, and references to it, from constexpr_strlen.h to constexpr_utils.h --- include/common/mir/{constexpr_strlen.h => constexpr_utils.h} | 0 src/common/CMakeLists.txt | 2 +- src/miral/display_configuration_option.cpp | 2 +- src/platform/graphics/egl_extensions.cpp | 2 +- src/platform/options/default_configuration.cpp | 2 +- src/platforms/evdev/platform.cpp | 2 +- src/platforms/gbm-kms/server/kms/platform_symbols.cpp | 2 +- src/server/console/linux_virtual_terminal.cpp | 2 +- src/server/console/logind_console_services.cpp | 2 +- src/server/console/minimal_console_services.cpp | 2 +- src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp | 2 +- src/server/frontend_wayland/keyboard_helper.cpp | 2 +- src/server/run_mir.cpp | 2 +- tests/mir_test_doubles/mock_drm.cpp | 2 +- tests/miral/wayland_extensions.cpp | 2 +- tests/performance-tests/test_compositor.cpp | 2 +- tests/unit-tests/console/test_linux_virtual_terminal.cpp | 2 +- tests/unit-tests/console/test_minimal_console_services.cpp | 2 +- 18 files changed, 17 insertions(+), 17 deletions(-) rename include/common/mir/{constexpr_strlen.h => constexpr_utils.h} (100%) diff --git a/include/common/mir/constexpr_strlen.h b/include/common/mir/constexpr_utils.h similarity index 100% rename from include/common/mir/constexpr_strlen.h rename to include/common/mir/constexpr_utils.h diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt index 16f9ff08663..ef28b249078 100644 --- a/src/common/CMakeLists.txt +++ b/src/common/CMakeLists.txt @@ -51,7 +51,7 @@ add_library(mircommon SHARED ${PROJECT_SOURCE_DIR}/include/common/mir/input/mir_touchscreen_config.h ${PROJECT_SOURCE_DIR}/include/common/mir/input/mir_keyboard_config.h ${PROJECT_SOURCE_DIR}/include/common/mir/input/keyboard_leds.h - ${PROJECT_SOURCE_DIR}/include/common/mir/constexpr_strlen.h + ${PROJECT_SOURCE_DIR}/include/common/mir/constexpr_utils.h ${MIR_COMMON_SOURCES} ) diff --git a/src/miral/display_configuration_option.cpp b/src/miral/display_configuration_option.cpp index 9349cf8569f..734696a918d 100644 --- a/src/miral/display_configuration_option.cpp +++ b/src/miral/display_configuration_option.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/platform/graphics/egl_extensions.cpp b/src/platform/graphics/egl_extensions.cpp index 0c062ec6281..2208a935455 100644 --- a/src/platform/graphics/egl_extensions.cpp +++ b/src/platform/graphics/egl_extensions.cpp @@ -15,7 +15,7 @@ */ #include -#include +#include #include #include #include diff --git a/src/platform/options/default_configuration.cpp b/src/platform/options/default_configuration.cpp index 3d8d5d84881..ebfc7c179e3 100644 --- a/src/platform/options/default_configuration.cpp +++ b/src/platform/options/default_configuration.cpp @@ -22,7 +22,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/platforms/evdev/platform.cpp b/src/platforms/evdev/platform.cpp index 5a65da6b8cb..0b5fcf9bdd6 100644 --- a/src/platforms/evdev/platform.cpp +++ b/src/platforms/evdev/platform.cpp @@ -25,7 +25,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/platforms/gbm-kms/server/kms/platform_symbols.cpp b/src/platforms/gbm-kms/server/kms/platform_symbols.cpp index d77e434da68..b5df4a1d7e7 100644 --- a/src/platforms/gbm-kms/server/kms/platform_symbols.cpp +++ b/src/platforms/gbm-kms/server/kms/platform_symbols.cpp @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include "quirk_common.h" #include diff --git a/src/server/console/linux_virtual_terminal.cpp b/src/server/console/linux_virtual_terminal.cpp index 910e64480b1..d247ccad63f 100644 --- a/src/server/console/linux_virtual_terminal.cpp +++ b/src/server/console/linux_virtual_terminal.cpp @@ -22,7 +22,7 @@ #include "ioctl_vt_switcher.h" #include #include -#include +#include #define MIR_LOG_COMPONTENT "VT-handler" #include diff --git a/src/server/console/logind_console_services.cpp b/src/server/console/logind_console_services.cpp index cbf531a339e..6aa6ae650d8 100644 --- a/src/server/console/logind_console_services.cpp +++ b/src/server/console/logind_console_services.cpp @@ -30,7 +30,7 @@ #include #include #include -#include +#include #define MIR_LOG_COMPONTENT "logind" #include diff --git a/src/server/console/minimal_console_services.cpp b/src/server/console/minimal_console_services.cpp index 724558a57b4..e08fd66cee9 100644 --- a/src/server/console/minimal_console_services.cpp +++ b/src/server/console/minimal_console_services.cpp @@ -17,7 +17,7 @@ #include "minimal_console_services.h" #include -#include +#include #include #include diff --git a/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp b/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp index 0e89dbe3999..c56b8a5feb5 100644 --- a/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp +++ b/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp @@ -29,7 +29,7 @@ #include #include #include -#include +#include #include #include diff --git a/src/server/frontend_wayland/keyboard_helper.cpp b/src/server/frontend_wayland/keyboard_helper.cpp index 5463daf0dd8..0001c29849c 100644 --- a/src/server/frontend_wayland/keyboard_helper.cpp +++ b/src/server/frontend_wayland/keyboard_helper.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include // memcpy #include diff --git a/src/server/run_mir.cpp b/src/server/run_mir.cpp index 8d09da91167..cf2d829a04d 100644 --- a/src/server/run_mir.cpp +++ b/src/server/run_mir.cpp @@ -24,7 +24,7 @@ #include #include #include -#include +#include #include #include diff --git a/tests/mir_test_doubles/mock_drm.cpp b/tests/mir_test_doubles/mock_drm.cpp index d31f769f5db..95555c8c98f 100644 --- a/tests/mir_test_doubles/mock_drm.cpp +++ b/tests/mir_test_doubles/mock_drm.cpp @@ -18,7 +18,7 @@ #include #include #include -#include +#include #include #include diff --git a/tests/miral/wayland_extensions.cpp b/tests/miral/wayland_extensions.cpp index cd5c56627ad..b61d980332b 100644 --- a/tests/miral/wayland_extensions.cpp +++ b/tests/miral/wayland_extensions.cpp @@ -31,7 +31,7 @@ #include #include #include -#include +#include using namespace testing; diff --git a/tests/performance-tests/test_compositor.cpp b/tests/performance-tests/test_compositor.cpp index 9676c79cb02..6c078ca4d87 100644 --- a/tests/performance-tests/test_compositor.cpp +++ b/tests/performance-tests/test_compositor.cpp @@ -16,7 +16,7 @@ #include "system_performance_test.h" -#include +#include #include #include diff --git a/tests/unit-tests/console/test_linux_virtual_terminal.cpp b/tests/unit-tests/console/test_linux_virtual_terminal.cpp index 7bbbd1514cf..3188a844fa6 100644 --- a/tests/unit-tests/console/test_linux_virtual_terminal.cpp +++ b/tests/unit-tests/console/test_linux_virtual_terminal.cpp @@ -27,7 +27,7 @@ #include #include #include -#include +#include #include #include diff --git a/tests/unit-tests/console/test_minimal_console_services.cpp b/tests/unit-tests/console/test_minimal_console_services.cpp index 665384431ce..42e074c1132 100644 --- a/tests/unit-tests/console/test_minimal_console_services.cpp +++ b/tests/unit-tests/console/test_minimal_console_services.cpp @@ -17,7 +17,7 @@ #include "src/server/console/minimal_console_services.h" #include #include -#include +#include #include #include From d99e3e62293fe965e5308302878d22ee1a33fefd Mon Sep 17 00:00:00 2001 From: Thomas Kroissenbrunner Date: Thu, 18 Dec 2025 14:23:36 +0100 Subject: [PATCH 05/13] wrap strlen_c into mir namespace --- include/common/mir/constexpr_utils.h | 12 ++++++++++-- src/miral/display_configuration_option.cpp | 8 ++++---- src/platform/graphics/egl_extensions.cpp | 4 ++-- src/platform/options/default_configuration.cpp | 10 +++++----- src/platforms/evdev/platform.cpp | 8 ++++---- .../gbm-kms/server/kms/platform_symbols.cpp | 4 ++-- src/server/console/linux_virtual_terminal.cpp | 4 ++-- src/server/console/logind_console_services.cpp | 4 ++-- src/server/console/minimal_console_services.cpp | 4 ++-- .../frontend_wayland/foreign_toplevel_manager_v1.cpp | 2 +- src/server/frontend_wayland/keyboard_helper.cpp | 2 +- src/server/run_mir.cpp | 2 +- tests/mir_test_doubles/mock_drm.cpp | 8 ++++---- tests/miral/wayland_extensions.cpp | 2 +- tests/performance-tests/test_compositor.cpp | 4 ++-- .../console/test_linux_virtual_terminal.cpp | 10 +++++----- .../console/test_minimal_console_services.cpp | 10 +++++----- 17 files changed, 53 insertions(+), 45 deletions(-) diff --git a/include/common/mir/constexpr_utils.h b/include/common/mir/constexpr_utils.h index f1ba5a2b863..5782102afdf 100644 --- a/include/common/mir/constexpr_utils.h +++ b/include/common/mir/constexpr_utils.h @@ -14,8 +14,16 @@ * along with this program. If not, see . */ + #ifndef CONSTEXPR_UTILS_H + #define CONSTEXPR_UTILS_H + #include -using namespace std; +namespace mir +{ + +inline constexpr std::size_t strlen_c(std::string_view str) { return str.size(); } + +} -inline constexpr size_t constexpr_strlen(string_view str) { return str.size(); } +#endif \ No newline at end of file diff --git a/src/miral/display_configuration_option.cpp b/src/miral/display_configuration_option.cpp index 734696a918d..f6cadd06898 100644 --- a/src/miral/display_configuration_option.cpp +++ b/src/miral/display_configuration_option.cpp @@ -17,11 +17,11 @@ #include #include "static_display_config.h" +#include #include #include #include #include -#include #include #include @@ -227,13 +227,13 @@ void miral::display_configuration_options(mir::Server& server) { layout_selector = std::make_shared(); } - else if (display_layout.compare(0, constexpr_strlen(static_opt_val), static_opt_val) == 0) + else if (display_layout.compare(0, mir::strlen_c(static_opt_val), static_opt_val) == 0) { if (scale != 1.0) { mir::fatal_error("Display scale option can't be used with static display configuration"); } - auto sdc = std::make_shared(display_layout.substr(constexpr_strlen(static_opt_val))); + auto sdc = std::make_shared(display_layout.substr(mir::strlen_c(static_opt_val))); server.add_init_callback([sdc, &server]{ sdc->init_auto_reload(server); }); layout_selector = std::move(sdc); } @@ -250,7 +250,7 @@ void miral::display_configuration_options(mir::Server& server) mir::fatal_error("Display scale option can't be used with autoscale"); } - if (display_layout.compare(0, constexpr_strlen(static_opt_val), static_opt_val) == 0) + if (display_layout.compare(0, mir::strlen_c(static_opt_val), static_opt_val) == 0) { mir::fatal_error("Display autoscale option can't be used with static display configuration"); } diff --git a/src/platform/graphics/egl_extensions.cpp b/src/platform/graphics/egl_extensions.cpp index 2208a935455..137b01f59bf 100644 --- a/src/platform/graphics/egl_extensions.cpp +++ b/src/platform/graphics/egl_extensions.cpp @@ -14,8 +14,8 @@ * along with this program. If not, see . */ -#include #include +#include #include #include #include @@ -35,7 +35,7 @@ auto mg::has_egl_extension(EGLDisplay dpy, char const* extension) -> bool while (found_substring) { // Check that we haven't found a prefix of our extension name - auto end_of_match = found_substring + constexpr_strlen(extension); + auto end_of_match = found_substring + strlen_c(extension); // It's a match if it terminates with the end of the extension string, or with a space if (*end_of_match == '\0' || *end_of_match == ' ') { diff --git a/src/platform/options/default_configuration.cpp b/src/platform/options/default_configuration.cpp index ebfc7c179e3..6d2e9fe9ed2 100644 --- a/src/platform/options/default_configuration.cpp +++ b/src/platform/options/default_configuration.cpp @@ -16,13 +16,13 @@ #include +#include +#include +#include +#include #include #include -#include -#include #include -#include -#include #include #include @@ -574,7 +574,7 @@ void mo::DefaultConfiguration::parse_environment( [=, this](std::string const& from) -> std::string { auto const prefix = "MIR_SERVER_"; - auto const sizeof_prefix = constexpr_strlen(prefix); + auto const sizeof_prefix = strlen_c(prefix); if (!from.starts_with(prefix)) { diff --git a/src/platforms/evdev/platform.cpp b/src/platforms/evdev/platform.cpp index 0b5fcf9bdd6..816b99eb019 100644 --- a/src/platforms/evdev/platform.cpp +++ b/src/platforms/evdev/platform.cpp @@ -19,13 +19,13 @@ #include "libinput_ptr.h" #include "fd_store.h" -#include +#include +#include #include #include #include #include -#include -#include +#include #include #include @@ -311,7 +311,7 @@ void mie::Platform::start() std::string devnode{workaround_device->devnode()}; // Libinput filters out anything without “event” as its name - if (strncmp(workaround_device->sysname(), "event", constexpr_strlen("event")) != 0) + if (strncmp(workaround_device->sysname(), "event", strlen_c("event")) != 0) { return; } diff --git a/src/platforms/gbm-kms/server/kms/platform_symbols.cpp b/src/platforms/gbm-kms/server/kms/platform_symbols.cpp index b5df4a1d7e7..3ad666c0677 100644 --- a/src/platforms/gbm-kms/server/kms/platform_symbols.cpp +++ b/src/platforms/gbm-kms/server/kms/platform_symbols.cpp @@ -30,11 +30,11 @@ #include #include #include +#include #include "one_shot_device_observer.h" #include #include #include -#include #include "quirk_common.h" #include @@ -453,7 +453,7 @@ auto probe_rendering_platform( if (strncmp( "llvmpipe", renderer_string, - constexpr_strlen("llvmpipe")) == 0) + mir::strlen_c("llvmpipe")) == 0) { mir::log_info("Detected software renderer: %s", renderer_string); // Leave the priority at ::unsupported; if we've got a software renderer then diff --git a/src/server/console/linux_virtual_terminal.cpp b/src/server/console/linux_virtual_terminal.cpp index d247ccad63f..fc823629268 100644 --- a/src/server/console/linux_virtual_terminal.cpp +++ b/src/server/console/linux_virtual_terminal.cpp @@ -659,9 +659,9 @@ std::future> mir::LinuxVirtualTerminal::acquire_dev while (uevent.getline(line_buffer, sizeof(line_buffer))) { - if (strncmp(line_buffer, "DEVNAME=", constexpr_strlen("DEVNAME=")) == 0) + if (strncmp(line_buffer, "DEVNAME=", strlen_c("DEVNAME=")) == 0) { - return std::string{"/dev/"} + std::string{line_buffer + constexpr_strlen("DEVNAME=")}; + return std::string{"/dev/"} + std::string{line_buffer + strlen_c("DEVNAME=")}; } } BOOST_THROW_EXCEPTION((std::runtime_error{"Failed to read DEVNAME"})); diff --git a/src/server/console/logind_console_services.cpp b/src/server/console/logind_console_services.cpp index 6aa6ae650d8..6c0696dd8ce 100644 --- a/src/server/console/logind_console_services.cpp +++ b/src/server/console/logind_console_services.cpp @@ -266,7 +266,7 @@ mir::LogindConsoleServices::LogindConsoleServices( session_path.c_str())}, switch_away{[](){ return true; }}, switch_to{[](){ return true; }}, - active{strncmp("active", logind_session_get_state(session_proxy.get()), constexpr_strlen("active")) == 0} + active{strncmp("active", logind_session_get_state(session_proxy.get()), strlen_c("active")) == 0} { GErrorPtr error; @@ -790,7 +790,7 @@ GDBusMessage* mir::LogindConsoleServices::resume_device_dbus_filter( return message; // …if it's a signal, but it's not ResumeDevice, we don't need to process it. - if (strncmp(g_dbus_message_get_member(message), "ResumeDevice", constexpr_strlen("ResumeDevice")) != 0) + if (strncmp(g_dbus_message_get_member(message), "ResumeDevice", strlen_c("ResumeDevice")) != 0) return message; // We've definitely got a ResumeDevice signal! Now to extract the parameters, and diff --git a/src/server/console/minimal_console_services.cpp b/src/server/console/minimal_console_services.cpp index e08fd66cee9..87f9ffc477a 100644 --- a/src/server/console/minimal_console_services.cpp +++ b/src/server/console/minimal_console_services.cpp @@ -105,9 +105,9 @@ std::future> mir::MinimalConsoleServices::acquire_d while (uevent.getline(line_buffer, sizeof(line_buffer))) { - if (strncmp(line_buffer, "DEVNAME=", constexpr_strlen("DEVNAME=")) == 0) + if (strncmp(line_buffer, "DEVNAME=", strlen_c("DEVNAME=")) == 0) { - return std::string{"/dev/"} + std::string{line_buffer + constexpr_strlen("DEVNAME=")}; + return std::string{"/dev/"} + std::string{line_buffer + strlen_c("DEVNAME=")}; } } BOOST_THROW_EXCEPTION((std::runtime_error{"Failed to read DEVNAME"})); diff --git a/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp b/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp index c56b8a5feb5..1667679af44 100644 --- a/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp +++ b/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp @@ -582,7 +582,7 @@ void mf::GDesktopFileCache::refresh_app_cache() // it out since that isn't useful in this context. const char* const DESKTOP_PREFIX = ".desktop"; if (id.ends_with(DESKTOP_PREFIX)) - id.erase(id.length() - constexpr_strlen(DESKTOP_PREFIX)); + id.erase(id.length() - strlen_c(DESKTOP_PREFIX)); std::shared_ptr file = std::make_shared(id.c_str(), wm_class, exec); if (g_app_info_should_show(app_info)) diff --git a/src/server/frontend_wayland/keyboard_helper.cpp b/src/server/frontend_wayland/keyboard_helper.cpp index 0001c29849c..e57ef3261dc 100644 --- a/src/server/frontend_wayland/keyboard_helper.cpp +++ b/src/server/frontend_wayland/keyboard_helper.cpp @@ -145,7 +145,7 @@ void mf::KeyboardHelper::set_keymap(std::shared_ptr const& new_keyma XKB_KEYMAP_FORMAT_TEXT_V1), free}; // so the null terminator is included - auto length = constexpr_strlen(buffer.get()) + 1; + auto length = strlen_c(buffer.get()) + 1; mir::AnonymousShmFile shm_buffer{length}; memcpy(shm_buffer.base_ptr(), buffer.get(), length); diff --git a/src/server/run_mir.cpp b/src/server/run_mir.cpp index cf2d829a04d..539def96f0b 100644 --- a/src/server/run_mir.cpp +++ b/src/server/run_mir.cpp @@ -175,7 +175,7 @@ extern "C" [[noreturn]] void fatal_signal_cleanup(int sig, siginfo_t* info, void n = write(STDERR_FILENO, security_mid, sizeof(security_mid) - 1); if (program_invocation_short_name) { - n = write(STDERR_FILENO, program_invocation_short_name, constexpr_strlen(program_invocation_short_name)); + n = write(STDERR_FILENO, program_invocation_short_name, mir::strlen_c(program_invocation_short_name)); } else { diff --git a/tests/mir_test_doubles/mock_drm.cpp b/tests/mir_test_doubles/mock_drm.cpp index 95555c8c98f..a23f96fbe9e 100644 --- a/tests/mir_test_doubles/mock_drm.cpp +++ b/tests/mir_test_doubles/mock_drm.cpp @@ -236,7 +236,7 @@ mtd::MockDRM::MockDRM() [this](char const* path, int flags, std::optional) -> std::optional { char const* const drm_prefix = "/dev/dri/"; - if (!strncmp(path, drm_prefix, constexpr_strlen(drm_prefix))) + if (!strncmp(path, drm_prefix, strlen_c(drm_prefix))) { // I don't think we need to be able to distinguish based on mode. ppc64el (at least) *does* // call the 3-parameter open() @@ -374,11 +374,11 @@ mtd::MockDRM::MockDRM() 1, 2, 3, - static_cast(constexpr_strlen("mock_driver")), + static_cast(strlen_c("mock_driver")), const_cast("mock_driver"), - static_cast(constexpr_strlen("1 Jan 1970")), + static_cast(strlen_c("1 Jan 1970")), const_cast("1 Jan 1970"), - static_cast(constexpr_strlen("Not really a driver")), + static_cast(strlen_c("Not really a driver")), const_cast("Not really a driver") }; ON_CALL(*this, drmGetVersion(_)) diff --git a/tests/miral/wayland_extensions.cpp b/tests/miral/wayland_extensions.cpp index b61d980332b..b6bffdef2e3 100644 --- a/tests/miral/wayland_extensions.cpp +++ b/tests/miral/wayland_extensions.cpp @@ -190,7 +190,7 @@ std::vector run_client_enumerator(mir::Server& server) char line[256]; while (fgets(line, sizeof(line), stream)) { - size_t const len = constexpr_strlen(line); + size_t const len = mir::strlen_c(line); interfaces.emplace_back(line, line + len - 1); } fclose(stream); diff --git a/tests/performance-tests/test_compositor.cpp b/tests/performance-tests/test_compositor.cpp index 6c078ca4d87..99c197e9e87 100644 --- a/tests/performance-tests/test_compositor.cpp +++ b/tests/performance-tests/test_compositor.cpp @@ -75,11 +75,11 @@ struct CompositorPerformance : SystemPerformanceTest } if (char const* renderer = strstr(line, "GL renderer: ")) { - server_renderer.assign(renderer + 13, constexpr_strlen(renderer) - 14); + server_renderer.assign(renderer + 13, mir::strlen_c(renderer) - 14); } if (char const* mode = strstr(line, "Current mode")) { - server_mode.assign(mode + 13, constexpr_strlen(mode) - 14); + server_mode.assign(mode + 13, mir::strlen_c(mode) - 14); } } } diff --git a/tests/unit-tests/console/test_linux_virtual_terminal.cpp b/tests/unit-tests/console/test_linux_virtual_terminal.cpp index 3188a844fa6..1d98bb90e4a 100644 --- a/tests/unit-tests/console/test_linux_virtual_terminal.cpp +++ b/tests/unit-tests/console/test_linux_virtual_terminal.cpp @@ -778,8 +778,8 @@ void set_expectations_for_uevent_probe( std::stringstream expected_filename; expected_filename << "/sys/dev/char/" << major << ":" << minor << "/uevent"; - auto uevent = std::make_shared(constexpr_strlen(content)); - ::memcpy(uevent->base_ptr(), content, constexpr_strlen(content)); + auto uevent = std::make_shared(mir::strlen_c(content)); + ::memcpy(uevent->base_ptr(), content, mir::strlen_c(content)); EXPECT_CALL(fops, open(StrEq(expected_filename.str()), FlagsSet(O_RDONLY, O_CLOEXEC))) .WillRepeatedly(InvokeWithoutArgs( @@ -792,7 +792,7 @@ std::string uevent_content_for_device( { std::stringstream content; - if (strncmp(device_name, "/dev/", constexpr_strlen("/dev/")) != 0) + if (strncmp(device_name, "/dev/", mir::strlen_c("/dev/")) != 0) { throw std::logic_error{"device_name is expected to be the fully-qualified /dev/foo path"}; } @@ -932,8 +932,8 @@ TEST_F(LinuxVirtualTerminalTest, throws_error_when_parsing_fails) "MINOR=61\n" "I_AINT_NO_DEVNAME=fb0"; - mir::AnonymousShmFile uevent{constexpr_strlen(uevent_content)}; - ::memcpy(uevent.base_ptr(), uevent_content, constexpr_strlen(uevent_content)); + mir::AnonymousShmFile uevent{mir::strlen_c(uevent_content)}; + ::memcpy(uevent.base_ptr(), uevent_content, mir::strlen_c(uevent_content)); EXPECT_CALL(*fops, open(StrEq(expected_filename), FlagsSet(O_RDONLY, O_CLOEXEC))) .WillOnce(Return(uevent.fd())); diff --git a/tests/unit-tests/console/test_minimal_console_services.cpp b/tests/unit-tests/console/test_minimal_console_services.cpp index 42e074c1132..f4c35d136af 100644 --- a/tests/unit-tests/console/test_minimal_console_services.cpp +++ b/tests/unit-tests/console/test_minimal_console_services.cpp @@ -43,7 +43,7 @@ std::string uevent_content_for_device( { std::stringstream content; - if (strncmp(device_name, "/dev/", constexpr_strlen("/dev/")) != 0) + if (strncmp(device_name, "/dev/", mir::strlen_c("/dev/")) != 0) { throw std::logic_error{"device_name is expected to be the fully-qualified /dev/foo path"}; } @@ -51,7 +51,7 @@ std::string uevent_content_for_device( content << "MAJOR=" << major << "\n" << "MINOR=" << minor << "\n" - << "DEVNAME=" << device_name + strlen ("/dev/") << "\n"; + << "DEVNAME=" << device_name + mir::strlen_c("/dev/") << "\n"; return content.str(); } @@ -108,8 +108,8 @@ class MinimalConsoleServicesTest : public testing::Test std::stringstream expected_filename; expected_filename << "/sys/dev/char/" << major << ":" << minor << "/uevent"; - auto uevent = std::make_shared(constexpr_strlen(sysfile_content)); - ::memcpy(uevent->base_ptr(), sysfile_content, constexpr_strlen(sysfile_content)); + auto uevent = std::make_shared(mir::strlen_c(sysfile_content)); + ::memcpy(uevent->base_ptr(), sysfile_content, mir::strlen_c(sysfile_content)); expectations.emplace_back( mtf::add_open_handler( @@ -277,7 +277,7 @@ TEST_F(MinimalConsoleServicesTest, failure_to_open_sys_file_results_in_immediate auto error_on_device_open = mtf::add_open_handler( [](char const* path, int, std::optional) -> std::optional { - if (!strncmp("/sys", path, constexpr_strlen("/sys"))) + if (!strncmp("/sys", path, mir::strlen_c("/sys"))) { errno = EINVAL; return {-1}; From d098bf5e81aeeb3beb8f04bbe9646cabdea4727b Mon Sep 17 00:00:00 2001 From: Thomas Kroissenbrunner Date: Thu, 18 Dec 2025 14:28:37 +0100 Subject: [PATCH 06/13] sort includes --- src/server/console/linux_virtual_terminal.cpp | 9 +++++---- src/server/console/logind_console_services.cpp | 4 ++-- src/server/console/minimal_console_services.cpp | 2 +- .../foreign_toplevel_manager_v1.cpp | 15 ++++++++------- src/server/frontend_wayland/keyboard_helper.cpp | 6 +++--- src/server/run_mir.cpp | 14 +++++++------- tests/mir_test_doubles/mock_drm.cpp | 2 +- .../console/test_linux_virtual_terminal.cpp | 4 ++-- .../console/test_minimal_console_services.cpp | 2 +- 9 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/server/console/linux_virtual_terminal.cpp b/src/server/console/linux_virtual_terminal.cpp index fc823629268..4efe26f5c36 100644 --- a/src/server/console/linux_virtual_terminal.cpp +++ b/src/server/console/linux_virtual_terminal.cpp @@ -15,14 +15,15 @@ */ #include "linux_virtual_terminal.h" +#include "ioctl_vt_switcher.h" + +#include +#include +#include #include #include -#include -#include -#include "ioctl_vt_switcher.h" #include #include -#include #define MIR_LOG_COMPONTENT "VT-handler" #include diff --git a/src/server/console/logind_console_services.cpp b/src/server/console/logind_console_services.cpp index 6c0696dd8ce..f5d5aff953c 100644 --- a/src/server/console/logind_console_services.cpp +++ b/src/server/console/logind_console_services.cpp @@ -27,10 +27,10 @@ #include "logind-session.h" +#include #include -#include #include -#include +#include #define MIR_LOG_COMPONTENT "logind" #include diff --git a/src/server/console/minimal_console_services.cpp b/src/server/console/minimal_console_services.cpp index 87f9ffc477a..a3c4e2211c7 100644 --- a/src/server/console/minimal_console_services.cpp +++ b/src/server/console/minimal_console_services.cpp @@ -16,8 +16,8 @@ #include "minimal_console_services.h" -#include #include +#include #include #include diff --git a/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp b/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp index 1667679af44..4b5cc4f4669 100644 --- a/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp +++ b/src/server/frontend_wayland/foreign_toplevel_manager_v1.cpp @@ -18,18 +18,19 @@ #include "wayland_utils.h" #include "desktop_file_manager.h" -#include + +#include +#include #include -#include -#include +#include +#include #include #include #include #include -#include -#include -#include -#include +#include +#include +#include #include #include diff --git a/src/server/frontend_wayland/keyboard_helper.cpp b/src/server/frontend_wayland/keyboard_helper.cpp index e57ef3261dc..ea3a4139ceb 100644 --- a/src/server/frontend_wayland/keyboard_helper.cpp +++ b/src/server/frontend_wayland/keyboard_helper.cpp @@ -17,11 +17,11 @@ #include "keyboard_helper.h" #include -#include +#include #include -#include #include -#include +#include +#include #include // memcpy #include diff --git a/src/server/run_mir.cpp b/src/server/run_mir.cpp index 539def96f0b..7dafae6cd55 100644 --- a/src/server/run_mir.cpp +++ b/src/server/run_mir.cpp @@ -14,17 +14,17 @@ * along with this program. If not, see . */ -#include -#include +#include #include +#include +#include #include -#include -#include #include +#include #include -#include -#include -#include +#include +#include +#include #include #include diff --git a/tests/mir_test_doubles/mock_drm.cpp b/tests/mir_test_doubles/mock_drm.cpp index a23f96fbe9e..ae852b5111b 100644 --- a/tests/mir_test_doubles/mock_drm.cpp +++ b/tests/mir_test_doubles/mock_drm.cpp @@ -17,8 +17,8 @@ #include #include #include -#include #include +#include #include #include diff --git a/tests/unit-tests/console/test_linux_virtual_terminal.cpp b/tests/unit-tests/console/test_linux_virtual_terminal.cpp index 1d98bb90e4a..a1696612bbe 100644 --- a/tests/unit-tests/console/test_linux_virtual_terminal.cpp +++ b/tests/unit-tests/console/test_linux_virtual_terminal.cpp @@ -16,9 +16,10 @@ #include "src/server/console/linux_virtual_terminal.h" #include "src/server/report/null_report_factory.h" -#include #include +#include #include +#include #include #include @@ -27,7 +28,6 @@ #include #include #include -#include #include #include diff --git a/tests/unit-tests/console/test_minimal_console_services.cpp b/tests/unit-tests/console/test_minimal_console_services.cpp index f4c35d136af..c095b0b7d63 100644 --- a/tests/unit-tests/console/test_minimal_console_services.cpp +++ b/tests/unit-tests/console/test_minimal_console_services.cpp @@ -17,8 +17,8 @@ #include "src/server/console/minimal_console_services.h" #include #include -#include #include +#include #include From cba8835f4049925076744b130b2d28af4992e544 Mon Sep 17 00:00:00 2001 From: thomaskroi1996 <131807984+thomaskroi1996@users.noreply.github.com> Date: Sat, 20 Dec 2025 13:38:44 +0100 Subject: [PATCH 07/13] Update src/platform/graphics/egl_extensions.cpp Co-authored-by: Alan Griffiths --- src/platform/graphics/egl_extensions.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform/graphics/egl_extensions.cpp b/src/platform/graphics/egl_extensions.cpp index 137b01f59bf..dd9267c0e38 100644 --- a/src/platform/graphics/egl_extensions.cpp +++ b/src/platform/graphics/egl_extensions.cpp @@ -14,8 +14,8 @@ * along with this program. If not, see . */ -#include #include +#include #include #include #include From 2242f1b464b0bcfca86622758f72d111e993594d Mon Sep 17 00:00:00 2001 From: thomaskroi1996 <131807984+thomaskroi1996@users.noreply.github.com> Date: Sat, 20 Dec 2025 13:39:12 +0100 Subject: [PATCH 08/13] MIR_ prefix for preprocessor macros Co-authored-by: Alan Griffiths --- include/common/mir/constexpr_utils.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/common/mir/constexpr_utils.h b/include/common/mir/constexpr_utils.h index 5782102afdf..76b13ef1bde 100644 --- a/include/common/mir/constexpr_utils.h +++ b/include/common/mir/constexpr_utils.h @@ -14,8 +14,8 @@ * along with this program. If not, see . */ - #ifndef CONSTEXPR_UTILS_H - #define CONSTEXPR_UTILS_H + #ifndef MIR_CONSTEXPR_UTILS_H_ + #define MIR_CONSTEXPR_UTILS_H_ #include From a6e2cdaaa590c21a6f020cc0e9f4aecf9147c17c Mon Sep 17 00:00:00 2001 From: Thomas Kroissenbrunner Date: Sat, 20 Dec 2025 13:50:04 +0100 Subject: [PATCH 09/13] latest review changes --- include/common/mir/constexpr_utils.h | 14 ++++++++------ src/platform/graphics/egl_extensions.cpp | 2 +- src/server/run_mir.cpp | 4 ++-- .../console/test_linux_virtual_terminal.cpp | 6 +++--- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/include/common/mir/constexpr_utils.h b/include/common/mir/constexpr_utils.h index 76b13ef1bde..ea4ef2dfa70 100644 --- a/include/common/mir/constexpr_utils.h +++ b/include/common/mir/constexpr_utils.h @@ -14,16 +14,18 @@ * along with this program. If not, see . */ - #ifndef MIR_CONSTEXPR_UTILS_H_ - #define MIR_CONSTEXPR_UTILS_H_ + +#ifndef MIR_CONSTEXPR_UTILS_H_ +#define MIR_CONSTEXPR_UTILS_H_ #include -namespace mir -{ +namespace mir { -inline constexpr std::size_t strlen_c(std::string_view str) { return str.size(); } +inline constexpr std::size_t strlen_c(std::string_view str) { + return str.size(); +} } -#endif \ No newline at end of file +#endif diff --git a/src/platform/graphics/egl_extensions.cpp b/src/platform/graphics/egl_extensions.cpp index dd9267c0e38..1f031647b2e 100644 --- a/src/platform/graphics/egl_extensions.cpp +++ b/src/platform/graphics/egl_extensions.cpp @@ -35,7 +35,7 @@ auto mg::has_egl_extension(EGLDisplay dpy, char const* extension) -> bool while (found_substring) { // Check that we haven't found a prefix of our extension name - auto end_of_match = found_substring + strlen_c(extension); + auto end_of_match = found_substring + strlen(extension); // It's a match if it terminates with the end of the extension string, or with a space if (*end_of_match == '\0' || *end_of_match == ' ') { diff --git a/src/server/run_mir.cpp b/src/server/run_mir.cpp index 7dafae6cd55..32f8eaefca3 100644 --- a/src/server/run_mir.cpp +++ b/src/server/run_mir.cpp @@ -14,6 +14,8 @@ * along with this program. If not, see . */ +#include +#include #include #include #include @@ -22,9 +24,7 @@ #include #include #include -#include #include -#include #include #include diff --git a/tests/unit-tests/console/test_linux_virtual_terminal.cpp b/tests/unit-tests/console/test_linux_virtual_terminal.cpp index a1696612bbe..4739f012e5c 100644 --- a/tests/unit-tests/console/test_linux_virtual_terminal.cpp +++ b/tests/unit-tests/console/test_linux_virtual_terminal.cpp @@ -778,8 +778,8 @@ void set_expectations_for_uevent_probe( std::stringstream expected_filename; expected_filename << "/sys/dev/char/" << major << ":" << minor << "/uevent"; - auto uevent = std::make_shared(mir::strlen_c(content)); - ::memcpy(uevent->base_ptr(), content, mir::strlen_c(content)); + auto uevent = std::make_shared(strlen(content)); + ::memcpy(uevent->base_ptr(), content, strlen(content)); EXPECT_CALL(fops, open(StrEq(expected_filename.str()), FlagsSet(O_RDONLY, O_CLOEXEC))) .WillRepeatedly(InvokeWithoutArgs( @@ -800,7 +800,7 @@ std::string uevent_content_for_device( content << "MAJOR=" << major << "\n" << "MINOR=" << minor << "\n" - << "DEVNAME=" << device_name + strlen ("/dev/") << "\n"; + << "DEVNAME=" << device_name + mir::strlen_c("/dev/") << "\n"; return content.str(); } From 20ab5324f44e8f4c058bfa6fe97ae45b5f10e980 Mon Sep 17 00:00:00 2001 From: Thomas Kroissenbrunner Date: Mon, 22 Dec 2025 17:51:26 +0100 Subject: [PATCH 10/13] latest review changes --- .gitignore | 4 ++++ include/common/mir/constexpr_utils.h | 8 ++++---- src/platform/graphics/egl_extensions.cpp | 1 - src/server/frontend_wayland/keyboard_helper.cpp | 3 +-- src/server/run_mir.cpp | 3 +-- tests/miral/wayland_extensions.cpp | 3 +-- tests/performance-tests/test_compositor.cpp | 6 ++---- .../unit-tests/console/test_minimal_console_services.cpp | 4 ++-- 8 files changed, 15 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index 08d4780b805..de742708ad2 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,7 @@ __pycache__/ tools/bot-data.tar.xz _codeql_detected_source_root target/ + + +#Ignore vscode AI rules +.github/instructions/codacy.instructions.md diff --git a/include/common/mir/constexpr_utils.h b/include/common/mir/constexpr_utils.h index ea4ef2dfa70..d2d075a06a3 100644 --- a/include/common/mir/constexpr_utils.h +++ b/include/common/mir/constexpr_utils.h @@ -20,12 +20,12 @@ #include -namespace mir { - -inline constexpr std::size_t strlen_c(std::string_view str) { +namespace mir +{ +inline constexpr std::size_t strlen_c(std::string_view str) +{ return str.size(); } - } #endif diff --git a/src/platform/graphics/egl_extensions.cpp b/src/platform/graphics/egl_extensions.cpp index 1f031647b2e..cd2b4c8edda 100644 --- a/src/platform/graphics/egl_extensions.cpp +++ b/src/platform/graphics/egl_extensions.cpp @@ -15,7 +15,6 @@ */ #include -#include #include #include #include diff --git a/src/server/frontend_wayland/keyboard_helper.cpp b/src/server/frontend_wayland/keyboard_helper.cpp index ea3a4139ceb..65f61ddbbe4 100644 --- a/src/server/frontend_wayland/keyboard_helper.cpp +++ b/src/server/frontend_wayland/keyboard_helper.cpp @@ -17,7 +17,6 @@ #include "keyboard_helper.h" #include -#include #include #include #include @@ -145,7 +144,7 @@ void mf::KeyboardHelper::set_keymap(std::shared_ptr const& new_keyma XKB_KEYMAP_FORMAT_TEXT_V1), free}; // so the null terminator is included - auto length = strlen_c(buffer.get()) + 1; + auto length = strlen(buffer.get()) + 1; mir::AnonymousShmFile shm_buffer{length}; memcpy(shm_buffer.base_ptr(), buffer.get(), length); diff --git a/src/server/run_mir.cpp b/src/server/run_mir.cpp index 32f8eaefca3..5c3f5c7103d 100644 --- a/src/server/run_mir.cpp +++ b/src/server/run_mir.cpp @@ -16,7 +16,6 @@ #include #include -#include #include #include #include @@ -175,7 +174,7 @@ extern "C" [[noreturn]] void fatal_signal_cleanup(int sig, siginfo_t* info, void n = write(STDERR_FILENO, security_mid, sizeof(security_mid) - 1); if (program_invocation_short_name) { - n = write(STDERR_FILENO, program_invocation_short_name, mir::strlen_c(program_invocation_short_name)); + n = write(STDERR_FILENO, program_invocation_short_name, strlen(program_invocation_short_name)); } else { diff --git a/tests/miral/wayland_extensions.cpp b/tests/miral/wayland_extensions.cpp index b6bffdef2e3..34780f043e5 100644 --- a/tests/miral/wayland_extensions.cpp +++ b/tests/miral/wayland_extensions.cpp @@ -31,7 +31,6 @@ #include #include #include -#include using namespace testing; @@ -190,7 +189,7 @@ std::vector run_client_enumerator(mir::Server& server) char line[256]; while (fgets(line, sizeof(line), stream)) { - size_t const len = mir::strlen_c(line); + size_t const len = strlen(line); interfaces.emplace_back(line, line + len - 1); } fclose(stream); diff --git a/tests/performance-tests/test_compositor.cpp b/tests/performance-tests/test_compositor.cpp index 99c197e9e87..30e06eac158 100644 --- a/tests/performance-tests/test_compositor.cpp +++ b/tests/performance-tests/test_compositor.cpp @@ -16,8 +16,6 @@ #include "system_performance_test.h" -#include - #include #include @@ -75,11 +73,11 @@ struct CompositorPerformance : SystemPerformanceTest } if (char const* renderer = strstr(line, "GL renderer: ")) { - server_renderer.assign(renderer + 13, mir::strlen_c(renderer) - 14); + server_renderer.assign(renderer + 13, strlen(renderer) - 14); } if (char const* mode = strstr(line, "Current mode")) { - server_mode.assign(mode + 13, mir::strlen_c(mode) - 14); + server_mode.assign(mode + 13, strlen(mode) - 14); } } } diff --git a/tests/unit-tests/console/test_minimal_console_services.cpp b/tests/unit-tests/console/test_minimal_console_services.cpp index c095b0b7d63..bd7e7501351 100644 --- a/tests/unit-tests/console/test_minimal_console_services.cpp +++ b/tests/unit-tests/console/test_minimal_console_services.cpp @@ -108,8 +108,8 @@ class MinimalConsoleServicesTest : public testing::Test std::stringstream expected_filename; expected_filename << "/sys/dev/char/" << major << ":" << minor << "/uevent"; - auto uevent = std::make_shared(mir::strlen_c(sysfile_content)); - ::memcpy(uevent->base_ptr(), sysfile_content, mir::strlen_c(sysfile_content)); + auto uevent = std::make_shared(strlen(sysfile_content)); + ::memcpy(uevent->base_ptr(), sysfile_content, strlen(sysfile_content)); expectations.emplace_back( mtf::add_open_handler( From 588b39eda4982b4ee5b05e62fb378900fb1626a2 Mon Sep 17 00:00:00 2001 From: Thomas Kroissenbrunner Date: Tue, 23 Dec 2025 06:46:13 +0100 Subject: [PATCH 11/13] undo changes to run_mir.cpp & keyboard_helper.cpp --- src/server/frontend_wayland/keyboard_helper.cpp | 4 ++-- src/server/run_mir.cpp | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/server/frontend_wayland/keyboard_helper.cpp b/src/server/frontend_wayland/keyboard_helper.cpp index 65f61ddbbe4..53ef22a8b52 100644 --- a/src/server/frontend_wayland/keyboard_helper.cpp +++ b/src/server/frontend_wayland/keyboard_helper.cpp @@ -17,10 +17,10 @@ #include "keyboard_helper.h" #include -#include -#include #include +#include #include +#include #include // memcpy #include diff --git a/src/server/run_mir.cpp b/src/server/run_mir.cpp index 5c3f5c7103d..95968ccdc0a 100644 --- a/src/server/run_mir.cpp +++ b/src/server/run_mir.cpp @@ -17,13 +17,13 @@ #include #include #include -#include -#include #include -#include #include -#include #include +#include +#include +#include +#include #include #include @@ -174,7 +174,7 @@ extern "C" [[noreturn]] void fatal_signal_cleanup(int sig, siginfo_t* info, void n = write(STDERR_FILENO, security_mid, sizeof(security_mid) - 1); if (program_invocation_short_name) { - n = write(STDERR_FILENO, program_invocation_short_name, strlen(program_invocation_short_name)); + n = write(STDERR_FILENO, program_invocation_short_name, std::strlen(program_invocation_short_name)); } else { From 6df4bef57a7a09aeba51144095993212d1ae51f6 Mon Sep 17 00:00:00 2001 From: thomaskroi1996 <131807984+thomaskroi1996@users.noreply.github.com> Date: Tue, 23 Dec 2025 06:49:51 +0100 Subject: [PATCH 12/13] remove accidental codacy commit in .gitignore --- .gitignore | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.gitignore b/.gitignore index de742708ad2..08d4780b805 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,3 @@ __pycache__/ tools/bot-data.tar.xz _codeql_detected_source_root target/ - - -#Ignore vscode AI rules -.github/instructions/codacy.instructions.md From 9180f1f55e7fc2336265d062dd3cca914fa760c6 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Wed, 24 Dec 2025 00:33:06 +0000 Subject: [PATCH 13/13] pre-commit: apply automatic fixes --- include/common/mir/constexpr_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/common/mir/constexpr_utils.h b/include/common/mir/constexpr_utils.h index d2d075a06a3..65020772d5f 100644 --- a/include/common/mir/constexpr_utils.h +++ b/include/common/mir/constexpr_utils.h @@ -20,7 +20,7 @@ #include -namespace mir +namespace mir { inline constexpr std::size_t strlen_c(std::string_view str) {