C ++ std :: map std :: bitset segfault

时间:2014-04-22 16:12:36

标签: c++ stdmap bitset expat-parser std-bitset

我有这段代码:

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位长的bitset,当访问该页面的字节时为1。

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

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

但它在运行的早期就是这样做的,因此很难想象这是数据大小的乘积。无论如何,我在使用一些非常相似的代码分析这个更大的数据集时没有任何问题(在https://github.com/mcmenaminadrian检查我的github repo - 这个项目是memsize,但是pagestat使用非常siumilar的代码)。这个代码唯一的区别因素似乎是bitset的使用。

有人可以发现到目前为止我没有找到的错误吗?

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

1 个答案:

答案 0 :(得分:1)

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