gpt4 book ai didi

C++ std::map std::bitset 段错误

转载 作者:太空宇宙 更新时间:2023-11-04 11:35:19 29 4
gpt4 key购买 nike

我有这个代码:

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 标记。

当我使用大约 1GB 的 XML 进行测试时,这段代码在我的测试机器上运行良好。但是当我在完整的东西(220GB 的 XML)上运行它时,它给出了一个段错误:

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

但它在运行的早期就这样做了,所以很难认为这是数据大小的产物。在任何情况下,我都可以使用一些非常相似的代码来分析这个更大的数据集(查看我的 github 存储库 https://github.com/mcmenaminadrian - 这个项目是 memsize,但 pagestat 使用非常相似的代码)。此代码的唯一区别因素似乎是 bitset 的使用。

有人能找出我至今没有发现的错误吗?

(代码是多线程的 - bitset 线程安全吗?这可能是库问题 - 我的测试系统是 Mac OSX,但“生产”系统是 Linux - Ubuntu 12.04 LTS?)

最佳答案

没有检查来确保 i + offset 小于 4096。这可能是问题的根源。

关于C++ std::map std::bitset 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23224810/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com