У меня есть вопрос кодирования 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
Какой GCC, версия GDB вы используете? Как вы компилируете, звоните в GDB? – alk
Вы можете воспроизвести это с помощью минимального кода, который вы нам показываете? То есть, удалив все «...»? – alk
Извините, ребята, моя программа довольно большая. Я намеренно хотел опубликовать версию скелета, чтобы просто получить основную идею. Теперь я вижу, что это не хороший пост. – Pete