From 1375e0a5de0e6f24ec4613fdf5b49f58c20f833a Mon Sep 17 00:00:00 2001 From: Alexander Batashev Date: Thu, 13 Aug 2020 11:09:09 +0300 Subject: [PATCH 1/2] [SYCL] Fix UB in memory manager If vector is empty, accessing any of its elements is UB. Use `data()` method to get pointer to vector data. Signed-off-by: Alexander Batashev --- sycl/source/detail/memory_manager.cpp | 32 +++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/sycl/source/detail/memory_manager.cpp b/sycl/source/detail/memory_manager.cpp index dd6291e5c5b52..5c8e7317038ec 100644 --- a/sycl/source/detail/memory_manager.cpp +++ b/sycl/source/detail/memory_manager.cpp @@ -270,7 +270,7 @@ void copyH2D(SYCLMemObjI *SYCLMemObj, char *SrcMem, QueueImplPtr, Plugin.call( Queue, DstMem, /*blocking_write=*/CL_FALSE, DstOffset[0], DstAccessRange[0], - SrcMem + SrcOffset[0], DepEvents.size(), &DepEvents[0], &OutEvent); + SrcMem + SrcOffset[0], DepEvents.size(), DepEvents.data(), &OutEvent); } else { size_t BufferRowPitch = (1 == DimDst) ? 0 : DstSize[0]; size_t BufferSlicePitch = (3 == DimDst) ? DstSize[0] * DstSize[1] : 0; @@ -280,7 +280,7 @@ void copyH2D(SYCLMemObjI *SYCLMemObj, char *SrcMem, QueueImplPtr, Queue, DstMem, /*blocking_write=*/CL_FALSE, &DstOffset[0], &SrcOffset[0], &DstAccessRange[0], BufferRowPitch, BufferSlicePitch, HostRowPitch, - HostSlicePitch, SrcMem, DepEvents.size(), &DepEvents[0], &OutEvent); + HostSlicePitch, SrcMem, DepEvents.size(), DepEvents.data(), &OutEvent); } } else { size_t InputRowPitch = (1 == DimDst) ? 0 : DstSize[0]; @@ -288,7 +288,7 @@ void copyH2D(SYCLMemObjI *SYCLMemObj, char *SrcMem, QueueImplPtr, Plugin.call( Queue, DstMem, /*blocking_write=*/CL_FALSE, &DstOffset[0], &DstAccessRange[0], - InputRowPitch, InputSlicePitch, SrcMem, DepEvents.size(), &DepEvents[0], + InputRowPitch, InputSlicePitch, SrcMem, DepEvents.size(), DepEvents.data(), &OutEvent); } } @@ -318,7 +318,7 @@ void copyD2H(SYCLMemObjI *SYCLMemObj, RT::PiMem SrcMem, QueueImplPtr SrcQueue, Plugin.call( Queue, SrcMem, /*blocking_read=*/CL_FALSE, SrcOffset[0], SrcAccessRange[0], - DstMem + DstOffset[0], DepEvents.size(), &DepEvents[0], &OutEvent); + DstMem + DstOffset[0], DepEvents.size(), DepEvents.data(), &OutEvent); } else { size_t BufferRowPitch = (1 == DimSrc) ? 0 : SrcSize[0]; size_t BufferSlicePitch = (3 == DimSrc) ? SrcSize[0] * SrcSize[1] : 0; @@ -329,14 +329,14 @@ void copyD2H(SYCLMemObjI *SYCLMemObj, RT::PiMem SrcMem, QueueImplPtr SrcQueue, Queue, SrcMem, /*blocking_read=*/CL_FALSE, &SrcOffset[0], &DstOffset[0], &SrcAccessRange[0], BufferRowPitch, BufferSlicePitch, HostRowPitch, - HostSlicePitch, DstMem, DepEvents.size(), &DepEvents[0], &OutEvent); + HostSlicePitch, DstMem, DepEvents.size(), DepEvents.data(), &OutEvent); } } else { size_t RowPitch = (1 == DimSrc) ? 0 : SrcSize[0]; size_t SlicePitch = (3 == DimSrc) ? SrcSize[0] * SrcSize[1] : 0; Plugin.call( Queue, SrcMem, CL_FALSE, &SrcOffset[0], &SrcAccessRange[0], RowPitch, - SlicePitch, DstMem, DepEvents.size(), &DepEvents[0], &OutEvent); + SlicePitch, DstMem, DepEvents.size(), DepEvents.data(), &OutEvent); } } @@ -361,7 +361,7 @@ void copyD2D(SYCLMemObjI *SYCLMemObj, RT::PiMem SrcMem, QueueImplPtr SrcQueue, if (1 == DimDst && 1 == DimSrc) { Plugin.call( Queue, SrcMem, DstMem, SrcOffset[0], DstOffset[0], SrcAccessRange[0], - DepEvents.size(), &DepEvents[0], &OutEvent); + DepEvents.size(), DepEvents.data(), &OutEvent); } else { size_t SrcRowPitch = (1 == DimSrc) ? 0 : SrcSize[0]; size_t SrcSlicePitch = @@ -374,12 +374,12 @@ void copyD2D(SYCLMemObjI *SYCLMemObj, RT::PiMem SrcMem, QueueImplPtr SrcQueue, Plugin.call( Queue, SrcMem, DstMem, &SrcOffset[0], &DstOffset[0], &SrcAccessRange[0], SrcRowPitch, SrcSlicePitch, DstRowPitch, - DstSlicePitch, DepEvents.size(), &DepEvents[0], &OutEvent); + DstSlicePitch, DepEvents.size(), DepEvents.data(), &OutEvent); } } else { Plugin.call( Queue, SrcMem, DstMem, &SrcOffset[0], &DstOffset[0], &SrcAccessRange[0], - DepEvents.size(), &DepEvents[0], &OutEvent); + DepEvents.size(), DepEvents.data(), &OutEvent); } } @@ -465,7 +465,7 @@ void MemoryManager::fill(SYCLMemObjI *SYCLMemObj, void *Mem, QueueImplPtr Queue, Plugin.call( Queue->getHandleRef(), pi::cast(Mem), Pattern, PatternSize, Offset[0] * ElementSize, Range[0] * ElementSize, DepEvents.size(), - &DepEvents[0], &OutEvent); + DepEvents.data(), &OutEvent); return; } throw runtime_error("Not supported configuration of fill requested", @@ -473,7 +473,7 @@ void MemoryManager::fill(SYCLMemObjI *SYCLMemObj, void *Mem, QueueImplPtr Queue, } else { Plugin.call( Queue->getHandleRef(), pi::cast(Mem), Pattern, &Offset[0], - &Range[0], DepEvents.size(), &DepEvents[0], &OutEvent); + &Range[0], DepEvents.size(), DepEvents.data(), &OutEvent); } } @@ -519,7 +519,7 @@ void *MemoryManager::map(SYCLMemObjI *, void *Mem, QueueImplPtr Queue, Plugin.call( Queue->getHandleRef(), pi::cast(Mem), CL_FALSE, Flags, AccessOffset[0], BytesToMap, DepEvents.size(), - DepEvents.empty() ? nullptr : &DepEvents[0], &OutEvent, &MappedPtr); + DepEvents.data(), &OutEvent, &MappedPtr); return MappedPtr; } @@ -534,7 +534,7 @@ void MemoryManager::unmap(SYCLMemObjI *, void *Mem, QueueImplPtr Queue, const detail::plugin &Plugin = Queue->getPlugin(); Plugin.call( Queue->getHandleRef(), pi::cast(Mem), MappedPtr, - DepEvents.size(), DepEvents.empty() ? nullptr : &DepEvents[0], &OutEvent); + DepEvents.size(), DepEvents.data(), &OutEvent); } void MemoryManager::copy_usm(const void *SrcMem, QueueImplPtr SrcQueue, @@ -556,7 +556,7 @@ void MemoryManager::copy_usm(const void *SrcMem, QueueImplPtr SrcQueue, Plugin.call(SrcQueue->getHandleRef(), /* blocking */ false, DstMem, SrcMem, Len, DepEvents.size(), - &DepEvents[0], &OutEvent); + DepEvents.data(), &OutEvent); } } @@ -577,7 +577,7 @@ void MemoryManager::fill_usm(void *Mem, QueueImplPtr Queue, size_t Length, const detail::plugin &Plugin = Queue->getPlugin(); Plugin.call( Queue->getHandleRef(), Mem, Pattern, Length, DepEvents.size(), - &DepEvents[0], &OutEvent); + DepEvents.data(), &OutEvent); } } @@ -592,7 +592,7 @@ void MemoryManager::prefetch_usm(void *Mem, QueueImplPtr Queue, size_t Length, const detail::plugin &Plugin = Queue->getPlugin(); Plugin.call( Queue->getHandleRef(), Mem, Length, PI_USM_MIGRATION_TBD0, - DepEvents.size(), &DepEvents[0], &OutEvent); + DepEvents.size(), DepEvents.data(), &OutEvent); } } From 925dda430aaf4b09579824d86a8a1b354056e8ed Mon Sep 17 00:00:00 2001 From: Alexander Batashev Date: Thu, 13 Aug 2020 14:14:45 +0300 Subject: [PATCH 2/2] clang-format --- sycl/source/detail/memory_manager.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/sycl/source/detail/memory_manager.cpp b/sycl/source/detail/memory_manager.cpp index 5c8e7317038ec..22d8c00ec91b9 100644 --- a/sycl/source/detail/memory_manager.cpp +++ b/sycl/source/detail/memory_manager.cpp @@ -280,7 +280,8 @@ void copyH2D(SYCLMemObjI *SYCLMemObj, char *SrcMem, QueueImplPtr, Queue, DstMem, /*blocking_write=*/CL_FALSE, &DstOffset[0], &SrcOffset[0], &DstAccessRange[0], BufferRowPitch, BufferSlicePitch, HostRowPitch, - HostSlicePitch, SrcMem, DepEvents.size(), DepEvents.data(), &OutEvent); + HostSlicePitch, SrcMem, DepEvents.size(), DepEvents.data(), + &OutEvent); } } else { size_t InputRowPitch = (1 == DimDst) ? 0 : DstSize[0]; @@ -288,8 +289,8 @@ void copyH2D(SYCLMemObjI *SYCLMemObj, char *SrcMem, QueueImplPtr, Plugin.call( Queue, DstMem, /*blocking_write=*/CL_FALSE, &DstOffset[0], &DstAccessRange[0], - InputRowPitch, InputSlicePitch, SrcMem, DepEvents.size(), DepEvents.data(), - &OutEvent); + InputRowPitch, InputSlicePitch, SrcMem, DepEvents.size(), + DepEvents.data(), &OutEvent); } } @@ -329,7 +330,8 @@ void copyD2H(SYCLMemObjI *SYCLMemObj, RT::PiMem SrcMem, QueueImplPtr SrcQueue, Queue, SrcMem, /*blocking_read=*/CL_FALSE, &SrcOffset[0], &DstOffset[0], &SrcAccessRange[0], BufferRowPitch, BufferSlicePitch, HostRowPitch, - HostSlicePitch, DstMem, DepEvents.size(), DepEvents.data(), &OutEvent); + HostSlicePitch, DstMem, DepEvents.size(), DepEvents.data(), + &OutEvent); } } else { size_t RowPitch = (1 == DimSrc) ? 0 : SrcSize[0]; @@ -518,8 +520,8 @@ void *MemoryManager::map(SYCLMemObjI *, void *Mem, QueueImplPtr Queue, const detail::plugin &Plugin = Queue->getPlugin(); Plugin.call( Queue->getHandleRef(), pi::cast(Mem), CL_FALSE, Flags, - AccessOffset[0], BytesToMap, DepEvents.size(), - DepEvents.data(), &OutEvent, &MappedPtr); + AccessOffset[0], BytesToMap, DepEvents.size(), DepEvents.data(), + &OutEvent, &MappedPtr); return MappedPtr; }