stdmap — C ++ std :: map std :: bitset segfault

У меня есть этот код:

static void XMLCALL
hackHandler(void *data, const XML_Char *name, const XML_Char **attr)
{
SetPointers* sets = static_cast<SetPointers*>(data);
if (strcmp(name, "instruction") == 0 || strcmp(name, "load") == 0 ||
strcmp(name, "modify") == 0||strcmp(name, "store") == 0) {
long address(0);
long page(0);
int offset(0);
long size(0);
int i(0);
for (i = 0; attr[i]; i += 2) {
if (strcmp(attr[i], "address") == 0) {
address = strtol(attr[i+1], NULL, 16);
page = address >> 12;
offset = address & 0xFFF;
continue;
}
if (strcmp(attr[i], "size") == 0) {
size = strtol(attr[i + 1], NULL, 16);
}
}
map<long, bitset<4096> >::iterator itLocal;

itLocal = sets->lCount->find(page);
if (itLocal == sets->lCount->end()) {
sets->lCount->insert(pair<long, bitset<4096> >
(page, bitset<4096>()));
itLocal = sets->lCount->find(page);
}
//now mark the bitmap
for (i = 0; i < size; i++) {
(itLocal->second)[i + offset] = 1;
}

if (strcmp(name, "instruction") == 0) {
itLocal = sets->lCode->find(page);
if (itLocal == sets->lCode->end()) {
sets->lCode->insert(pair<long, bitset<4096> >
(page, bitset<4096>()));
itLocal = sets->lCode->find(page);
}
for (i = 0; i < size; i++) {
(itLocal->second)[i + offset] = 1;
}
} else {
itLocal = sets->lMemory->find(page);
if (itLocal == sets->lMemory->end()) {
sets->lMemory->insert(pair<long, bitset<4096> >
(page, bitset<4096>()));
itLocal = sets->lMemory->find(page);
}
for (i = 0; i < size; i++) {
(itLocal->second)[i + offset] = 1;
}
}
}
}

Это делается для того, чтобы пометить битовый набор длиной 4096 бит с 1 при обращении к этому байту страницы.

Этот код хорошо работает на моей тестовой машине, когда я использую для тестирования около 1 ГБ XML. Но когда я запускаю его на полную версию (220 ГБ XML), это дает ошибку сегментации:

 sets->lCode->insert(pair<long, bitset<4096> >
(page, bitset<4096>()));

Но он делает это очень рано, поэтому трудно думать, что это результат размера данных. В любом случае у меня не было проблем с анализом этого большого набора данных с использованием очень похожего кода (см. Мой репозиторий на github в https://github.com/mcmenaminadrian — этот проект memsize, но PageSatts использует очень siumilar код). Единственный отличительный фактор в этом коде — использование битов.

Может кто-то определить ошибку, которая до сих пор ускользала от меня?

(Код многопоточный — безопасен ли поток битов? Может ли это быть проблемой библиотеки — моя тестовая система — Mac OSX, но «производственная» система — Linux — Ubuntu 12.04 LTS?)

1

Решение

Там нет никаких проверок, чтобы убедиться, что i + offset меньше чем 4096, Это может быть источником проблемы.

1

Другие решения


По вопросам рекламы [email protected]