Skip to content

Commit 4ff2eee

Browse files
author
Alexander Batashev
authored
[SYCL] Fix UB in memory manager (#2310)
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 <alexander.batashev@intel.com>
1 parent 731b6f4 commit 4ff2eee

File tree

1 file changed

+20
-18
lines changed

1 file changed

+20
-18
lines changed

sycl/source/detail/memory_manager.cpp

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ void copyH2D(SYCLMemObjI *SYCLMemObj, char *SrcMem, QueueImplPtr,
270270
Plugin.call<PiApiKind::piEnqueueMemBufferWrite>(
271271
Queue, DstMem,
272272
/*blocking_write=*/CL_FALSE, DstOffset[0], DstAccessRange[0],
273-
SrcMem + SrcOffset[0], DepEvents.size(), &DepEvents[0], &OutEvent);
273+
SrcMem + SrcOffset[0], DepEvents.size(), DepEvents.data(), &OutEvent);
274274
} else {
275275
size_t BufferRowPitch = (1 == DimDst) ? 0 : DstSize[0];
276276
size_t BufferSlicePitch = (3 == DimDst) ? DstSize[0] * DstSize[1] : 0;
@@ -280,16 +280,17 @@ void copyH2D(SYCLMemObjI *SYCLMemObj, char *SrcMem, QueueImplPtr,
280280
Queue, DstMem,
281281
/*blocking_write=*/CL_FALSE, &DstOffset[0], &SrcOffset[0],
282282
&DstAccessRange[0], BufferRowPitch, BufferSlicePitch, HostRowPitch,
283-
HostSlicePitch, SrcMem, DepEvents.size(), &DepEvents[0], &OutEvent);
283+
HostSlicePitch, SrcMem, DepEvents.size(), DepEvents.data(),
284+
&OutEvent);
284285
}
285286
} else {
286287
size_t InputRowPitch = (1 == DimDst) ? 0 : DstSize[0];
287288
size_t InputSlicePitch = (3 == DimDst) ? DstSize[0] * DstSize[1] : 0;
288289
Plugin.call<PiApiKind::piEnqueueMemImageWrite>(
289290
Queue, DstMem,
290291
/*blocking_write=*/CL_FALSE, &DstOffset[0], &DstAccessRange[0],
291-
InputRowPitch, InputSlicePitch, SrcMem, DepEvents.size(), &DepEvents[0],
292-
&OutEvent);
292+
InputRowPitch, InputSlicePitch, SrcMem, DepEvents.size(),
293+
DepEvents.data(), &OutEvent);
293294
}
294295
}
295296

@@ -318,7 +319,7 @@ void copyD2H(SYCLMemObjI *SYCLMemObj, RT::PiMem SrcMem, QueueImplPtr SrcQueue,
318319
Plugin.call<PiApiKind::piEnqueueMemBufferRead>(
319320
Queue, SrcMem,
320321
/*blocking_read=*/CL_FALSE, SrcOffset[0], SrcAccessRange[0],
321-
DstMem + DstOffset[0], DepEvents.size(), &DepEvents[0], &OutEvent);
322+
DstMem + DstOffset[0], DepEvents.size(), DepEvents.data(), &OutEvent);
322323
} else {
323324
size_t BufferRowPitch = (1 == DimSrc) ? 0 : SrcSize[0];
324325
size_t BufferSlicePitch = (3 == DimSrc) ? SrcSize[0] * SrcSize[1] : 0;
@@ -329,14 +330,15 @@ void copyD2H(SYCLMemObjI *SYCLMemObj, RT::PiMem SrcMem, QueueImplPtr SrcQueue,
329330
Queue, SrcMem,
330331
/*blocking_read=*/CL_FALSE, &SrcOffset[0], &DstOffset[0],
331332
&SrcAccessRange[0], BufferRowPitch, BufferSlicePitch, HostRowPitch,
332-
HostSlicePitch, DstMem, DepEvents.size(), &DepEvents[0], &OutEvent);
333+
HostSlicePitch, DstMem, DepEvents.size(), DepEvents.data(),
334+
&OutEvent);
333335
}
334336
} else {
335337
size_t RowPitch = (1 == DimSrc) ? 0 : SrcSize[0];
336338
size_t SlicePitch = (3 == DimSrc) ? SrcSize[0] * SrcSize[1] : 0;
337339
Plugin.call<PiApiKind::piEnqueueMemImageRead>(
338340
Queue, SrcMem, CL_FALSE, &SrcOffset[0], &SrcAccessRange[0], RowPitch,
339-
SlicePitch, DstMem, DepEvents.size(), &DepEvents[0], &OutEvent);
341+
SlicePitch, DstMem, DepEvents.size(), DepEvents.data(), &OutEvent);
340342
}
341343
}
342344

@@ -361,7 +363,7 @@ void copyD2D(SYCLMemObjI *SYCLMemObj, RT::PiMem SrcMem, QueueImplPtr SrcQueue,
361363
if (1 == DimDst && 1 == DimSrc) {
362364
Plugin.call<PiApiKind::piEnqueueMemBufferCopy>(
363365
Queue, SrcMem, DstMem, SrcOffset[0], DstOffset[0], SrcAccessRange[0],
364-
DepEvents.size(), &DepEvents[0], &OutEvent);
366+
DepEvents.size(), DepEvents.data(), &OutEvent);
365367
} else {
366368
size_t SrcRowPitch = (1 == DimSrc) ? 0 : SrcSize[0];
367369
size_t SrcSlicePitch =
@@ -374,12 +376,12 @@ void copyD2D(SYCLMemObjI *SYCLMemObj, RT::PiMem SrcMem, QueueImplPtr SrcQueue,
374376
Plugin.call<PiApiKind::piEnqueueMemBufferCopyRect>(
375377
Queue, SrcMem, DstMem, &SrcOffset[0], &DstOffset[0],
376378
&SrcAccessRange[0], SrcRowPitch, SrcSlicePitch, DstRowPitch,
377-
DstSlicePitch, DepEvents.size(), &DepEvents[0], &OutEvent);
379+
DstSlicePitch, DepEvents.size(), DepEvents.data(), &OutEvent);
378380
}
379381
} else {
380382
Plugin.call<PiApiKind::piEnqueueMemImageCopy>(
381383
Queue, SrcMem, DstMem, &SrcOffset[0], &DstOffset[0], &SrcAccessRange[0],
382-
DepEvents.size(), &DepEvents[0], &OutEvent);
384+
DepEvents.size(), DepEvents.data(), &OutEvent);
383385
}
384386
}
385387

@@ -465,15 +467,15 @@ void MemoryManager::fill(SYCLMemObjI *SYCLMemObj, void *Mem, QueueImplPtr Queue,
465467
Plugin.call<PiApiKind::piEnqueueMemBufferFill>(
466468
Queue->getHandleRef(), pi::cast<RT::PiMem>(Mem), Pattern, PatternSize,
467469
Offset[0] * ElementSize, Range[0] * ElementSize, DepEvents.size(),
468-
&DepEvents[0], &OutEvent);
470+
DepEvents.data(), &OutEvent);
469471
return;
470472
}
471473
throw runtime_error("Not supported configuration of fill requested",
472474
PI_INVALID_OPERATION);
473475
} else {
474476
Plugin.call<PiApiKind::piEnqueueMemImageFill>(
475477
Queue->getHandleRef(), pi::cast<RT::PiMem>(Mem), Pattern, &Offset[0],
476-
&Range[0], DepEvents.size(), &DepEvents[0], &OutEvent);
478+
&Range[0], DepEvents.size(), DepEvents.data(), &OutEvent);
477479
}
478480
}
479481

@@ -518,8 +520,8 @@ void *MemoryManager::map(SYCLMemObjI *, void *Mem, QueueImplPtr Queue,
518520
const detail::plugin &Plugin = Queue->getPlugin();
519521
Plugin.call<PiApiKind::piEnqueueMemBufferMap>(
520522
Queue->getHandleRef(), pi::cast<RT::PiMem>(Mem), CL_FALSE, Flags,
521-
AccessOffset[0], BytesToMap, DepEvents.size(),
522-
DepEvents.empty() ? nullptr : &DepEvents[0], &OutEvent, &MappedPtr);
523+
AccessOffset[0], BytesToMap, DepEvents.size(), DepEvents.data(),
524+
&OutEvent, &MappedPtr);
523525
return MappedPtr;
524526
}
525527

@@ -534,7 +536,7 @@ void MemoryManager::unmap(SYCLMemObjI *, void *Mem, QueueImplPtr Queue,
534536
const detail::plugin &Plugin = Queue->getPlugin();
535537
Plugin.call<PiApiKind::piEnqueueMemUnmap>(
536538
Queue->getHandleRef(), pi::cast<RT::PiMem>(Mem), MappedPtr,
537-
DepEvents.size(), DepEvents.empty() ? nullptr : &DepEvents[0], &OutEvent);
539+
DepEvents.size(), DepEvents.data(), &OutEvent);
538540
}
539541

540542
void MemoryManager::copy_usm(const void *SrcMem, QueueImplPtr SrcQueue,
@@ -556,7 +558,7 @@ void MemoryManager::copy_usm(const void *SrcMem, QueueImplPtr SrcQueue,
556558
Plugin.call<PiApiKind::piextUSMEnqueueMemcpy>(SrcQueue->getHandleRef(),
557559
/* blocking */ false, DstMem,
558560
SrcMem, Len, DepEvents.size(),
559-
&DepEvents[0], &OutEvent);
561+
DepEvents.data(), &OutEvent);
560562
}
561563
}
562564

@@ -577,7 +579,7 @@ void MemoryManager::fill_usm(void *Mem, QueueImplPtr Queue, size_t Length,
577579
const detail::plugin &Plugin = Queue->getPlugin();
578580
Plugin.call<PiApiKind::piextUSMEnqueueMemset>(
579581
Queue->getHandleRef(), Mem, Pattern, Length, DepEvents.size(),
580-
&DepEvents[0], &OutEvent);
582+
DepEvents.data(), &OutEvent);
581583
}
582584
}
583585

@@ -592,7 +594,7 @@ void MemoryManager::prefetch_usm(void *Mem, QueueImplPtr Queue, size_t Length,
592594
const detail::plugin &Plugin = Queue->getPlugin();
593595
Plugin.call<PiApiKind::piextUSMEnqueuePrefetch>(
594596
Queue->getHandleRef(), Mem, Length, PI_USM_MIGRATION_TBD0,
595-
DepEvents.size(), &DepEvents[0], &OutEvent);
597+
DepEvents.size(), DepEvents.data(), &OutEvent);
596598
}
597599
}
598600

0 commit comments

Comments
 (0)