C++ GCC4.4, предупреждающий: нижний индекс массива выше границ массива

Я обнаружил, что имел дело со случаем, когда массивы могут быть нулевыми ...

private double[] concat  (double[]a,double[]b){
    if (a == null) return b;
    if (b == null) return a;
    double[] r = new double[a.length+b.length];
    System.arraycopy(a, 0, r, 0, a.length);
    System.arraycopy(b, 0, r, a.length, b.length);
    return r;

}
private double[] copyRest (double[]a, int start){
    if (a == null) return null;
    if (start > a.length)return null;
    double[]r = new double[a.length-start];
    System.arraycopy(a,start,r,0,a.length-start); 
    return r;
}
8
задан Rob Kam 13 November 2009 в 10:03
поделиться

3 ответа

Та же ошибка. В качестве обходного пути я заменил

is_any_of(" ")

на

is_from_range(' ', ' ')

, который также мог бы быть немного более эффективным.

3
ответ дан 5 December 2019 в 21:21
поделиться

Я заметил, что ваш цикл изменяет длину строки, но не обновляет условие завершения цикла. Может ли это быть источником вашей проблемы?

   sf::Uint32 stringSize = newLine.size();
   for( sf::Uint32 insertPos = MAX_LINE_LENGTH;
      insertPos < stringSize; insertPos += MAX_LINE_LENGTH ) 
   {
      newLine.insert( insertPos, "\n" );
      // You were probably wanting to put this here..
      insertPos++;
      stringSize++;
   }
1
ответ дан 5 December 2019 в 21:21
поделиться

Может иметь какое-то отношение к одной или нескольким из этих ошибок GCC:

Результаты поиска GCC bugzilla для «Предупреждение: индекс массива превышает границы массива»

Не все из них действительный, но есть и исправленные, если поискать вокруг:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37861

Так что я почти уверен, что что-то происходит там. Основываясь на комментариях, я бы попробовал скомпилировать без оптимизации и посмотреть, исчезнет ли она.

Я получил предупреждение о ложных границах, используя один из стандартных алгоритмов (std :: remove, я думаю) и передав параметры итератора:

myarray, 
myarray + sizeof(myarray)/sizeof(*myarray)

, которые, я уверен, находятся в определенных пределах. Однако это было только в коде игрушек, так что я просто искал его. Если GCC действительно выдает хитрые предупреждения, вам просто нужно очень внимательно изучить свой код, пока он не будет исправлен.

3
ответ дан 5 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: