Я получаю:
предупреждение: при условии, что подписанное переполнение не происходит, если предположить, что (X + c) < X всегда false [-Wstrict-overflow]
в этой строке:
if ( this->m_PositionIndex[in] < this->m_EndIndex[in] )
m_PositionIndex
и m_EndIndex
типа itk::Index
(http://www.itk.org/Doxygen/html/classitk_1_1Index.html), а их operator[]
возвращает signed long
.
(здесь строка 37: https://github.com/Kitware/ITK/blob/master/Modules/Core/Common/include/itkImageRegionConstIteratorWithIndex.hxx для контекста)
Может кто-нибудь объяснить, что может вызвать это предупреждение здесь? Я не вижу шаблон (x+c) < x
в любом месте, так как это просто сравнение signed long
.
Я попытался воспроизвести его в отдельном примере:
#include <iostream>
namespace itk
{
struct Index
{
signed long data[2];
Index()
{
data[0] = 0;
data[1] = 0;
}
signed long& operator[](unsigned int i)
{
return data[i];
}
};
}
int main (int argc, char *argv[])
{
itk::Index positionIndex;
itk::Index endIndex;
for(unsigned int i = 0; i < 2; i++)
{
positionIndex[i]++;
if ( positionIndex[i] < endIndex[i] )
{
std::cout << "something" << std::endl;
}
}
return 0;
}
но я не получаю предупреждение. Любые мысли о том, что отличает мое демо и реальный код, или что может вызвать предупреждение в реальном коде? Я получаю предупреждение с gcc 4.7.0 и 4.7.2 с флагом -Wall.