diff --git a/score/analysis/tracing/common/interface_types/shared_memory_location_helpers.h b/score/analysis/tracing/common/interface_types/shared_memory_location_helpers.h index 0cc7ca7e..e11b5d04 100644 --- a/score/analysis/tracing/common/interface_types/shared_memory_location_helpers.h +++ b/score/analysis/tracing/common/interface_types/shared_memory_location_helpers.h @@ -62,7 +62,7 @@ auto GetPointerFromLocation(SharedMemoryLocation memory_location, ResourcePointe // coverity[autosar_cpp14_m5_0_17_violation] // coverity[autosar_cpp14_a5_2_4_violation] // coverity[autosar_cpp14_m5_2_8_violation] - return reinterpret_cast(static_cast(resource_ptr->getBaseAddress()) + memory_location.offset_);// NOLINT(cppcoreguidelines-pro-type-reinterpret-cast, cppcoreguidelines-pro-bounds-pointer-arithmetic): Tolerated see above + return reinterpret_cast(const_cast(static_cast(resource_ptr->getBaseAddress())) + memory_location.offset_); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast, cppcoreguidelines-pro-bounds-pointer-arithmetic): Tolerated see above // clang-format on } @@ -84,7 +84,7 @@ score::Result GetOffsetFromPointer(T* pointer, ResourcePointer memo // coverity[autosar_cpp14_a5_2_4_violation] // coverity[autosar_cpp14_m5_2_8_violation] // coverity[autosar_cpp14_m5_0_9_violation] - return static_cast(reinterpret_cast(pointer) - static_cast(memory_resource->getBaseAddress()));// NOLINT(cppcoreguidelines-pro-type-reinterpret-cast): Tolerated + return static_cast(reinterpret_cast(pointer) - static_cast(memory_resource->getBaseAddress())); // NOLINT(cppcoreguidelines-pro-type-reinterpret-cast): Tolerated // clang-format on } diff --git a/score/memory/shared/fake/my_bounded_memory_resource.cpp b/score/memory/shared/fake/my_bounded_memory_resource.cpp index 54311f82..1ac2a118 100644 --- a/score/memory/shared/fake/my_bounded_memory_resource.cpp +++ b/score/memory/shared/fake/my_bounded_memory_resource.cpp @@ -82,7 +82,7 @@ MyBoundedMemoryResource::~MyBoundedMemoryResource() { if (should_free_memory_on_destruction_) { - std::free(baseAddress_); + std::free(const_cast(baseAddress_)); } MemoryResourceRegistry::getInstance().remove_resource(memoryResourceId_); } @@ -118,7 +118,7 @@ void MyBoundedMemoryResource::do_deallocate(void* /*memory*/, const std::size_t deallocatedMemory_ += bytes; } -MemoryResourceProxy* MyBoundedMemoryResource::AllocateMemoryResourceProxy(const std::uint64_t memory_resource_id) +const MemoryResourceProxy* MyBoundedMemoryResource::AllocateMemoryResourceProxy(const std::uint64_t memory_resource_id) { // We allocate the MemoryResourceProxy using worst case alignment so that any further allocations will start at an // aligned memory address. This is important so that GetUserAllocatedBytes() is never affected by the allocation of diff --git a/score/memory/shared/fake/my_bounded_memory_resource.h b/score/memory/shared/fake/my_bounded_memory_resource.h index 9e203410..27f80726 100644 --- a/score/memory/shared/fake/my_bounded_memory_resource.h +++ b/score/memory/shared/fake/my_bounded_memory_resource.h @@ -45,12 +45,12 @@ class MyBoundedMemoryResource final : public ManagedMemoryResource MyBoundedMemoryResource& operator=(const MyBoundedMemoryResource&) noexcept = default; MyBoundedMemoryResource& operator=(MyBoundedMemoryResource&&) noexcept = default; - MemoryResourceProxy* getMemoryResourceProxy() noexcept override + const MemoryResourceProxy* getMemoryResourceProxy() noexcept override { return manager_; } - void* getBaseAddress() const noexcept override + const void* getBaseAddress() const noexcept override { return baseAddress_; } @@ -105,18 +105,18 @@ class MyBoundedMemoryResource final : public ManagedMemoryResource return false; } - MemoryResourceProxy* AllocateMemoryResourceProxy(const std::uint64_t memory_resource_id); + const MemoryResourceProxy* AllocateMemoryResourceProxy(const std::uint64_t memory_resource_id); static std::uint64_t instanceId; static std::size_t memoryResourceProxyAllocationSize_; - void* baseAddress_; - void* endAddress_; + const void* baseAddress_; + const void* endAddress_; std::size_t virtual_address_space_to_reserve_; std::size_t already_allocated_bytes_; std::size_t deallocatedMemory_; std::uint64_t memoryResourceId_; - MemoryResourceProxy* manager_; + const MemoryResourceProxy* manager_; bool should_free_memory_on_destruction_; }; diff --git a/score/memory/shared/fake/my_bounded_shared_memory_resource.h b/score/memory/shared/fake/my_bounded_shared_memory_resource.h index 17bb4057..ac613c02 100644 --- a/score/memory/shared/fake/my_bounded_shared_memory_resource.h +++ b/score/memory/shared/fake/my_bounded_shared_memory_resource.h @@ -54,12 +54,12 @@ class MyBoundedSharedMemoryResource final : public ISharedMemoryResource return false; } - MemoryResourceProxy* getMemoryResourceProxy() noexcept override + const MemoryResourceProxy* getMemoryResourceProxy() noexcept override { return resource_.getMemoryResourceProxy(); } - void* getBaseAddress() const noexcept override + const void* getBaseAddress() const noexcept override { return resource_.getBaseAddress(); } diff --git a/score/memory/shared/fake/my_memory_resource.h b/score/memory/shared/fake/my_memory_resource.h index 658fb04d..8499e872 100644 --- a/score/memory/shared/fake/my_memory_resource.h +++ b/score/memory/shared/fake/my_memory_resource.h @@ -44,14 +44,15 @@ class MyMemoryResource : public ManagedMemoryResource { } - MemoryResourceProxy* getMemoryResourceProxy() noexcept override + const MemoryResourceProxy* getMemoryResourceProxy() noexcept override { MemoryResourceRegistry::getInstance().clear(); - score::cpp::ignore = MemoryResourceRegistry::getInstance().insert_resource({memoryResourceId_, this}); + score::cpp::ignore = MemoryResourceRegistry::getInstance().insert_resource( + {memoryResourceId_, const_cast(this)}); return &this->manager_; } - void* getBaseAddress() const noexcept override + const void* getBaseAddress() const noexcept override { return baseAddress_; } diff --git a/score/memory/shared/managed_memory_resource.h b/score/memory/shared/managed_memory_resource.h index 5c682c65..832ac939 100644 --- a/score/memory/shared/managed_memory_resource.h +++ b/score/memory/shared/managed_memory_resource.h @@ -64,6 +64,11 @@ class ManagedMemoryResource : public ::score::cpp::pmr::memory_resource ManagedMemoryResource() noexcept = default; ~ManagedMemoryResource() noexcept override = default; + /** + * We need to return a raw pointer, since we need to convert this + * pointer into an OffsetPtr if it shall be stored in shared memory. + * @return MemoryResourceProxy* that identifies _this_ memory_resource. + */ /** * @brief Construct T allocating underlying MemoryResource * @tparam T The type that shall be constructed @@ -96,7 +101,7 @@ class ManagedMemoryResource : public ::score::cpp::pmr::memory_resource * @brief Get the start address of the memory region that this memory resource is managing * @return void* start address of memory resource (e.g. mmap result) */ - virtual void* getBaseAddress() const noexcept = 0; + virtual const void* getBaseAddress() const noexcept = 0; /** * @brief Get the start address of the region available to a user of this memory resource. diff --git a/score/memory/shared/memory_resource_registry.cpp b/score/memory/shared/memory_resource_registry.cpp index ebd1b197..2cece0ee 100644 --- a/score/memory/shared/memory_resource_registry.cpp +++ b/score/memory/shared/memory_resource_registry.cpp @@ -66,7 +66,7 @@ auto score::memory::shared::MemoryResourceRegistry::insert_resource( // If we successfully inserted the ID into the registry, add the memory_range to known_regions. if (!input.second->IsOffsetPtrBoundsCheckBypassingEnabled() && result.second) { - void* const memory_range_start = resource->getBaseAddress(); + const void* const memory_range_start = resource->getBaseAddress(); const void* const memory_range_end = resource->getEndAddress(); if ((memory_range_start == nullptr) || (memory_range_end == nullptr)) diff --git a/score/memory/shared/memory_resource_registry_test.cpp b/score/memory/shared/memory_resource_registry_test.cpp index c4922776..d1fb916e 100644 --- a/score/memory/shared/memory_resource_registry_test.cpp +++ b/score/memory/shared/memory_resource_registry_test.cpp @@ -48,11 +48,11 @@ class BasicMemoryResource : public ManagedMemoryResource end_address_{reinterpret_cast(memory_range.second)} { } - MemoryResourceProxy* getMemoryResourceProxy() noexcept override + const MemoryResourceProxy* getMemoryResourceProxy() noexcept override { return nullptr; } - void* getBaseAddress() const noexcept override + const void* getBaseAddress() const noexcept override { return base_address_; } @@ -97,11 +97,11 @@ class BoundsCheckBypassingMemoryResource : public ManagedMemoryResource end_address_{reinterpret_cast(memory_range.second)} { } - MemoryResourceProxy* getMemoryResourceProxy() noexcept override + const MemoryResourceProxy* getMemoryResourceProxy() noexcept override { return nullptr; } - void* getBaseAddress() const noexcept override + const void* getBaseAddress() const noexcept override { return base_address_; } diff --git a/score/memory/shared/new_delete_delegate_resource.cpp b/score/memory/shared/new_delete_delegate_resource.cpp index d34d0d94..1ebe5aa9 100644 --- a/score/memory/shared/new_delete_delegate_resource.cpp +++ b/score/memory/shared/new_delete_delegate_resource.cpp @@ -61,7 +61,7 @@ NewDeleteDelegateMemoryResource::~NewDeleteDelegateMemoryResource() } } -void* NewDeleteDelegateMemoryResource::getBaseAddress() const noexcept +const void* NewDeleteDelegateMemoryResource::getBaseAddress() const noexcept { // Suppress "AUTOSAR C++14 A5-2-4" rule finding: "reinterpret_cast shall not be used.". // This class holds no real memory, it only has a made-up buffer. @@ -76,7 +76,7 @@ void* NewDeleteDelegateMemoryResource::getBaseAddress() const noexcept void* NewDeleteDelegateMemoryResource::getUsableBaseAddress() const noexcept { - return getBaseAddress(); + return const_cast(getBaseAddress()); } const void* NewDeleteDelegateMemoryResource::getEndAddress() const noexcept diff --git a/score/memory/shared/new_delete_delegate_resource.h b/score/memory/shared/new_delete_delegate_resource.h index 6179cdf9..73f3e75d 100644 --- a/score/memory/shared/new_delete_delegate_resource.h +++ b/score/memory/shared/new_delete_delegate_resource.h @@ -53,7 +53,7 @@ class NewDeleteDelegateMemoryResource : public score::memory::shared::ManagedMem ~NewDeleteDelegateMemoryResource() override; const MemoryResourceProxy* getMemoryResourceProxy() noexcept override; - void* getBaseAddress() const noexcept override; + const void* getBaseAddress() const noexcept override; void* getUsableBaseAddress() const noexcept override; std::size_t GetUserAllocatedBytes() const noexcept override; diff --git a/score/memory/shared/shared_memory_resource.cpp b/score/memory/shared/shared_memory_resource.cpp index c623e24b..11e395c0 100644 --- a/score/memory/shared/shared_memory_resource.cpp +++ b/score/memory/shared/shared_memory_resource.cpp @@ -731,7 +731,7 @@ auto SharedMemoryResource::do_allocate(const std::size_t bytes, const std::size_ return new_address_aligned; } -auto SharedMemoryResource::getBaseAddress() const noexcept -> void* +auto SharedMemoryResource::getBaseAddress() const noexcept -> const void* { // Suppress "AUTOSAR C++14 A9-3-1" rule finding: "Member functions shall not return non-const “raw” pointers or // references to private or protected data owned by the class.". diff --git a/score/memory/shared/shared_memory_resource.h b/score/memory/shared/shared_memory_resource.h index 3308bdbd..04afc705 100644 --- a/score/memory/shared/shared_memory_resource.h +++ b/score/memory/shared/shared_memory_resource.h @@ -60,14 +60,13 @@ class SharedMemoryResource : public ISharedMemoryResource, public std::enable_sh SharedMemoryResource(SharedMemoryResource&& other) = delete; SharedMemoryResource& operator=(SharedMemoryResource&&) = delete; - // coverity[autosar_cpp14_m7_3_1_violation] false-positive: class method (Ticket-234468) const MemoryResourceProxy* getMemoryResourceProxy() noexcept override; /** * @brief Get the start address of the memory region that this memory resource is managing * @return void* start address of memory resource (e.g. mmap result) */ - void* getBaseAddress() const noexcept override; + const void* getBaseAddress() const noexcept override; /** * @brief Get the start address of the region available to a user of this SharedMemoryResource. diff --git a/score/memory/shared/shared_memory_resource_heap_allocator_mock.h b/score/memory/shared/shared_memory_resource_heap_allocator_mock.h index 43e0fb11..6b4b5f01 100644 --- a/score/memory/shared/shared_memory_resource_heap_allocator_mock.h +++ b/score/memory/shared/shared_memory_resource_heap_allocator_mock.h @@ -28,7 +28,7 @@ class SharedMemoryResourceHeapAllocatorMock : public ISharedMemoryResource public: explicit SharedMemoryResourceHeapAllocatorMock(const std::uint64_t mem_res_id) : resource_{mem_res_id} {} - MOCK_METHOD(void*, getBaseAddress, (), (const, noexcept, override)); + MOCK_METHOD(const void*, getBaseAddress, (), (const, noexcept, override)); MOCK_METHOD(void*, getUsableBaseAddress, (), (const, noexcept, override)); diff --git a/score/memory/shared/shared_memory_resource_mock.h b/score/memory/shared/shared_memory_resource_mock.h index e1281a6d..45cc649d 100644 --- a/score/memory/shared/shared_memory_resource_mock.h +++ b/score/memory/shared/shared_memory_resource_mock.h @@ -25,9 +25,9 @@ namespace score::memory::shared class SharedMemoryResourceMock : public ISharedMemoryResource { public: - MOCK_METHOD(MemoryResourceProxy*, getMemoryResourceProxy, (), (noexcept, override)); + MOCK_METHOD(const MemoryResourceProxy*, getMemoryResourceProxy, (), (noexcept, override)); - MOCK_METHOD(void*, getBaseAddress, (), (const, noexcept, override)); + MOCK_METHOD(const void*, getBaseAddress, (), (const, noexcept, override)); MOCK_METHOD(void*, getUsableBaseAddress, (), (const, noexcept, override));