From 95f966e3868896e06e0d89cd5ef05efcd9ac9cc4 Mon Sep 17 00:00:00 2001 From: Hans Johnson Date: Thu, 2 May 2024 15:34:45 -0500 Subject: [PATCH] COMP: Fix gcc 13.2 compiler warning of large allocation size MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ITK/Modules/Segmentation/LevelSets/include/itkParallelSparseFieldLevelSetImageFilter.hxx: In member function ‘ThreadedAllocateData’: ITK/Modules/Segmentation/LevelSets/include/itkParallelSparseFieldLevelSetImageFilter.hxx:789:49: warning: argument 1 value ‘18446744073709551615’ exceeds maximum object size 9223372036854775807 [-Walloc-size-larger-than=] 789 | m_Data[ThreadId].m_LoadTransferBufferLayers = new LayerListType[2 * m_NumberOfLayers + 1]; | ^ /usr/include/c++/13/new:128:26: note: in a call to allocation function ‘operator new []’ declared here 128 | _GLIBCXX_NODISCARD void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc) | ^ ITK/Modules/Segmentation/LevelSets/include/itkParallelSparseFieldLevelSetImageFilter.hxx: In member function ‘ThreadedAllocateData’: ITK/Modules/Segmentation/LevelSets/include/itkParallelSparseFieldLevelSetImageFilter.hxx:789:49: warning: argument 1 value ‘18446744073709551615’ exceeds maximum object size 9223372036854775807 [-Walloc-size-larger-than=] 789 | m_Data[ThreadId].m_LoadTransferBufferLayers = new LayerListType[2 * m_NumberOfLayers + 1]; | ^ /usr/include/c++/13/new:128:26: note: in a call to allocation function ‘operator new []’ declared here 128 | _GLIBCXX_NODISCARD void* operator new[](std::size_t) _GLIBCXX_THROW (std::bad_alloc) | --- .../itkParallelSparseFieldLevelSetImageFilter.hxx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Modules/Segmentation/LevelSets/include/itkParallelSparseFieldLevelSetImageFilter.hxx b/Modules/Segmentation/LevelSets/include/itkParallelSparseFieldLevelSetImageFilter.hxx index 28e77d0e7d99..ead0b9c43a28 100644 --- a/Modules/Segmentation/LevelSets/include/itkParallelSparseFieldLevelSetImageFilter.hxx +++ b/Modules/Segmentation/LevelSets/include/itkParallelSparseFieldLevelSetImageFilter.hxx @@ -772,8 +772,9 @@ ParallelSparseFieldLevelSetImageFilter::ThreadedAlloc m_Data[ThreadId].m_Semaphore[0] = 0; m_Data[ThreadId].m_Semaphore[1] = 0; + const std::size_t bufferLayerSize = 2 * m_NumberOfLayers + 1; // Allocate the layers for the sparse field. - m_Data[ThreadId].m_Layers.reserve(2 * m_NumberOfLayers + 1); + m_Data[ThreadId].m_Layers.reserve(bufferLayerSize); for (unsigned int i = 0; i < 2 * static_cast(m_NumberOfLayers) + 1; ++i) { m_Data[ThreadId].m_Layers.push_back(LayerType::New()); @@ -785,7 +786,8 @@ ParallelSparseFieldLevelSetImageFilter::ThreadedAlloc } // Layers used as buffers for transferring pixels during load balancing - m_Data[ThreadId].m_LoadTransferBufferLayers = new LayerListType[2 * m_NumberOfLayers + 1]; + + m_Data[ThreadId].m_LoadTransferBufferLayers = new LayerListType[bufferLayerSize]; for (unsigned int i = 0; i < 2 * static_cast(m_NumberOfLayers) + 1; ++i) { m_Data[ThreadId].m_LoadTransferBufferLayers[i].reserve(m_NumOfWorkUnits); @@ -802,8 +804,7 @@ ParallelSparseFieldLevelSetImageFilter::ThreadedAlloc // The SAFETY_FACTOR simple ensures that the number of nodes created // is larger than those required to start with for each thread. - auto nodeNum = - static_cast(SAFETY_FACTOR * m_Layers[0]->Size() * (2 * m_NumberOfLayers + 1) / m_NumOfWorkUnits); + auto nodeNum = static_cast(SAFETY_FACTOR * m_Layers[0]->Size() * (bufferLayerSize) / m_NumOfWorkUnits); m_Data[ThreadId].m_LayerNodeStore->Reserve(nodeNum); m_Data[ThreadId].m_RMSChange = m_ValueZero;