硬编码值存储在哪里?
问题描述:
为了进行调查,我需要知道硬编码值的存储位置。硬编码值存储在哪里?
问题:一个函数里面有硬编码的值,这个函数被许多线程同时调用,这个硬编码值是否有可能被破坏。
例如:myFunc被多个线程同时调用。 可以字面“未处理的异常:”被破坏
void myFunc()
{
EXCEPTION_RECORD ExceptRec
bool retValue=doSomething(ExceptRec);
if(!retValue)
{
log ("Unhandled exception:"<< " code = " << hex << ExceptRec.ExceptionCode
<< " flags = " << ExceptRec.ExceptionFlags
<< " address = " << ExceptRec.ExceptionAddress)
// log is macro which will insert content into ostrstream
}
}
功能DoSomething的样子:
bool doSomething(EXCEPTION_RECORD &ExceptRec)
{
__try
{
// some code here
}
__except (ExceptRec = *(GetExceptionInformation())->ExceptionRecord,
EXCEPTION_EXECUTE_HANDLER)
{
return false;
}
return true;
}
答
文字字符串存储在您的节目图像时的.data节他们被编译。 .data部分通常映射到只读存储器,因此它不会像.code部分那样被损坏。您可以通过使用visual studio附带的dumpbin.exe来查看Windows EXE/DLL的.data部分。
有没有简单的方法来破坏这个文字,它可以完成,如果你修改它存储在内存页的权限,但你必须明确做到这一点通过使用OS API,而不是一个C++ API 。在编译时硬编码到机器代码中的地址是一个相对偏移量(如果内存服务于它,则是数据段基地)。该偏移量被添加到由操作系统加载程序提供的基址中。
如果你的堆栈损坏了,你最终会遇到基地址无效的情况,所以当添加偏移量时,文字看起来会损坏。
答
没有,字符串文字不会在这种情况下损坏,因为他们不正在写入。
但是:如果您不锁定/同步使用该输出流,则可能会看到类似于损坏的输出混合。
答
字符串文字通常存储在进程内存的只读部分,并且在您的代码中,您没有(也不应该)写入它们。它们被用来构造一个新的字符串,并将这些文字的内容复制到它中。
如果你正在写这些文字的内存地址,你会知道它:)(即它通常会引起程序崩溃)
谢谢安德鲁,“如果你不锁定/同步”我的日志记录的东西是线程安全的,但任何如何字符串文字被损坏导致崩溃:( – Satbir 2009-10-06 05:29:34
@Soni:真的,我怀疑,否则你会不会得到错误,但是如果没有log(x)的定义很难说, – 2009-10-06 08:06:36