2016-11-25 10 views
1

У меня есть вопрос кодирования C/GDB, который сводит меня с ума. (Кодирование в ящике Linux с использованием GCC в качестве моего компилятора.)GDB: «предупреждение: диапазон для типа <error type> имеет недопустимые границы»

Я работаю над назначением, где мне нужно закодировать аппаратный кеш, что в основном означает, что мне нужно работать с 2D-массивом структур, у меня есть typedef 'ed as struct cacheLine. Вот как я думаю о массиве в коде:

[*] [*] [*] [*] ...so here... numSet = 4   (columns) 
[*] [*] [*] [*]     numLines = 12   (total) 
[*] [*] [*] [*]     numLinesPerSet = 3 (rows) 

Так «numLines» действительно общее количество cacheLine структур, а не количество строк в массиве. (Я не имею в виду, чтобы это было странно, что он должен делать с номенклатурой назначения.)

Вот как я думал, что я должен выделить и передать массив по ссылке:

void initCache(int numSets, int numLines, cacheLine* (*cache)[numLines], int numLinesPerSet){ 
    int i, j; 
    for(i=0; i<numSets; i++){ 
      for(j=0; j<numLinesPerSet; j++){ 
        // Now allocate each struct one-by-one 
        cache[i][j] = (cacheLine*) malloc(sizeof(cacheLine)); 
        if(cache[i][j] == NULL){ 
          printf("Error: not enough memory to malloc() cache.\n"); 
          exit(EXIT_FAILURE); 
        } 
      } 
    } 
} 

int main(){ 
    ... 
    cacheLine* myCache[numSets][numLines];     // declare 
    initCache(numSets, numLines, myCache, numLinesPerSet); // allocate 
    ... 
} 

(Да, в конце есть аналогичная функция freeCache(), которую я опускаю здесь.)

Пока все компилируется и работает нормально. Когда я вступаю в initCache() с GDB, это выглядит нормально:

Breakpoint 1, main (argc=2, argv=0x7fffffffe308) at c-sim.c:55 
56    initCache(numSets, numLines, myCache, numLinesPerSet); 
(gdb) step 
initCache (numSets=4, numLines=12, cache=0x7fffffffdf28, numLinesPerSet=3) at c-sim2.h:122 
122  void initCache(int numSets, int numLines, cacheLine* (*cache)[numLines], int numLinesPerSet){ 
(gdb) 

Пока что так хорошо. Вот где вещи идут на юг для меня. Намного позже в коде, я вызвать другую функцию, чья подпись очень похожа на мою initCache():

void cacheThisData(int numSets, int numLines, cacheLine* (*myCache)[numLines], int someData) { 
    // do stuff with someData 
} 

int main(){ 
    ... 
    cacheLine* myCache[numSets][numLines];     // from 
    initCache(numSets, numLines, myCache, numLinesPerSet); // before... 
    ... 
    int someData; // holds data to-be-cached 
    cacheThisData(numSets, numLines, myCache, someData); 
    ... 
} 

Вот что происходит, когда я ступаю в cacheThisData() Fuction с GDB:

Breakpoint 1, main (argc=2, argv=0x7fffffffe308) at c-sim.c:105 
105          cacheThisData(numSets, numLines, myCache, someData); 
(gdb) step 
cacheThisData(numSets=4, numLines=12, warning: Range for type <error type> has invalid bounds 0..-72057594037927936 
warning: Range for type <error type> has invalid bounds 0..-72057594037927936 
myCache=warning: Range for type <error type> has invalid bounds 0..-72057594037927936 
warning: Range for type <error type> has invalid bounds 0..-72057594037927936 
warning: Range for type <error type> has invalid bounds 0..-72057594037927936 
warning: Range for type <error type> has invalid bounds 0..-72057594037927936 
warning: Range for type <error type> has invalid bounds 0..-72057594037927936 
warning: Range for type <error type> has invalid bounds 0..-72057594037927936 
warning: Range for type <error type> has invalid bounds 0..-72057594037927936 
0x7fffffffdf28, data=1234) at c-sim3.h:145 
145  void cacheThisData(int numSets, int numLines, cacheLine* (*myCache)[numLines], int someData) { 
(gdb) 

Какого черта??? Код по-прежнему работает нормально, но я беспокоюсь, что любая проблема, с которой GDB пахнет, вернется, чтобы преследовать меня. Лучше исправить это сейчас.

Я заметил, что если я изменить функцию подписи cacheThisData() передать только массив, GDB не возражает:

void cacheThisData(int numSets, int numLines, cacheLine* (*myCache)[numLines]) {} 

int main(){ 
    cacheThisData(numSets, numLines, myCache); // GDB likes this 
} 

Но в тот момент я добавить один дополнительный аргумент в любом месте в cacheThisData() «s подпись , Я получаю вышеуказанное предупреждение GDB, всегда то же самое. Не имеет значения, добавляю ли я дополнительный аргумент в начале, в середине или в конце аргументов в cacheThisData() - GDB жалуется.

Я не знаю, что с этим делать. GDB, похоже, говорит, что я передаю массив myCache с неправильными размерами ??? Но numSets и numLines не меняются. Я также не realloc() и ничего подобного, чтобы изменить размер массива. Массив не меняет размер между функциями initCache() и cacheThisData(), по крайней мере, насколько я могу судить.

Любые советы? Кто-нибудь сталкивался с этим раньше?

Спасибо, -Pete

+0

Какой GCC, версия GDB вы используете? Как вы компилируете, звоните в GDB? – alk

+0

Вы можете воспроизвести это с помощью минимального кода, который вы нам показываете? То есть, удалив все «...»? – alk

+0

Извините, ребята, моя программа довольно большая. Я намеренно хотел опубликовать версию скелета, чтобы просто получить основную идею. Теперь я вижу, что это не хороший пост. – Pete

ответ

0

Я никогда не нашел источник этой проблемы. Тем не менее, мой код способен обрабатывать довольно большие наборы данных и еще не распакован, так что это что-то. Я собираюсь записать это до загадки жизни ... и двигаться дальше. Большое спасибо всем, кто сделал паузу, чтобы прочитать этот пост.