gpt4 book ai didi

c++ - Visual C++ 2010 映射/设置迭代器不兼容

转载 作者:太空宇宙 更新时间:2023-11-04 13:50:53 26 4
gpt4 key购买 nike

这个错误让我很抓狂。它是在 8080 仿真器内的调试器的符号表中查找地址的函数。这个想法是这样的:我有一个包含地址和标签的符号表,这个函数接受一个地址,并尝试在给定距离(通常为 10)内找到最近的符号。然后它返回一个字符串,如“label”或“label+2”。如果找不到足够接近的匹配项,它将返回 NULL。

一切正常,直到模拟 CPU 执行跳转后,然后 Visual C++ 在带有 for 循环的行上断言“map/set iterators incompatible”。我已经看到与此有关的线程问题,它是一个多线程应用程序,但符号映射仅在一个线程内使用,并且在启动时填充后除了读取之外不会被触及。

我已经尝试过 while 循环、for 循环、for each 循环,所有这些都有或没有自动迭代器。我尝试取出循环内的返回值,通过设置符号和距离中断以返回循环外底部的精确匹配。它仍然在同一点窒息。 (地址为 1418,但该函数在返回完全匹配或 NULL 之前已被调用六次)。

#define _CRT_SECURE_NO_WARNINGS

#include <string>
#include <stdio.h>
#include <string>
#include <map>

using namespace std;

map <int, string> symbol_list;

/* -- function that fills the table -- */

const char * look_up_symbol(int address, int max_distance){

static char buffer[32];
auto symbol = symbol_list.end();
int distance; // distance to the current found symbol
int c_distance; // current distance

distance = 65536; // more than memory, bigger than big

for (auto p = symbol_list.begin(); p != symbol_list.end(); ++p){
if (address == p->first){
// found an exact match
strcpy(buffer, p->second.c_str());
return buffer;
}
c_distance = abs(address - p->first);
if (c_distance <= max_distance){
// we've found one close enough to consider
if (c_distance < distance){
// closer then the closest one considered yet.
symbol = p;
distance = c_distance;
}
}
}

if (symbol == symbol_list.end()){
// we didn't find one close enough
return NULL;
}

sprintf(buffer, "%s%+d", symbol->second.c_str(), distance);
return buffer;

return NULL;

}

这个真的让我难住了...我不确定 p 怎么会不匹配 symbol_list.end(),因为它是一个自动类型,并且没有代码可以在填充后实际更改 symbol_list 的内容.

最佳答案

事实证明,它来自使用原始字符串的危险。我通常很擅长控制它们,但是调用堆栈(在反汇编函数中)时,接受反汇编指令的 c 字符串太小了。最初创建时,它最多只需要容纳 9 个字节加上 null(以“SHLD 1F00”为例),当它遇到更长的指令时,就会出现问题。在这个函数中,32 个字节是可以的,因为从文件中读取它们的函数只获取 23 个字节,这超过了屏幕上允许显示的 21 个字节。

我会并且确实会使用 std::string,但对于某些事情,C 风格的字符串对我来说更舒服。再一次,我尽我最大的尊重对待他们。但是这个特定项目的开发周期很短,灰尘收集的时间很长,当混合危险的编码实践时,这并不好。生活和学习。

关于c++ - Visual C++ 2010 映射/设置迭代器不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23481794/

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