对于调查,我需要知道存储硬编码值的位置。
问题:在其中包含硬编码值的函数,并且此函数同时由多个线程调用,是否有可能损坏该硬编码值。
例如: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;
}
答案 0 :(得分:4)
不,字符串文字在这种情况下不会被破坏,因为它们没有被写入。
但是:如果您没有锁定/同步该输出流的使用,您可能会看到混合类似于损坏的输出。
答案 1 :(得分:3)
字符串文字通常存储在进程内存的只读部分中,而在代码中,您不是(也不应该)写入它们。它们被用于构造一个新的字符串,并将这些文字的内容复制到其中。
如果你正在写这些文字的内存地址,你就会知道:)(即它通常会使程序崩溃)
答案 2 :(得分:3)
文字字符串在编译时存储在程序图像的.data部分中。 .data部分通常映射到只读内存,因此它不会像.code部分那样被破坏。您可以使用visual studio附带的dumpbin.exe查看Windows exe / dll的.data部分。
没有简单的方法来破坏这个文字,如果你修改它所存储的内存页面的权限就可以完成,但是你必须通过使用OS api而不是c ++ api来明确地做到这一点。在编译时硬编码到机器代码中的地址是相对偏移量(如果内存为我提供数据部分基础)。此偏移量将添加到操作系统加载程序提供的基址中。
如果您的堆栈已损坏,您可能会遇到基址无效的情况,因此当添加偏移时,文字看起来已损坏。