存储硬编码值的位置?

时间:2009-10-06 05:22:20

标签: c++ memory-management function

对于调查,我需要知道存储硬编码值的位置。

问题:在其中包含硬编码值的函数,并且此函数同时由多个线程调用,是否有可能损坏该硬编码值。

例如: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;
  }

3 个答案:

答案 0 :(得分:4)

不,字符串文字在这种情况下不会被破坏,因为它们没有被写入。

但是:如果您没有锁定/同步该输出流的使用,您可能会看到混合类似于损坏的输出。

答案 1 :(得分:3)

字符串文字通常存储在进程内存的只读部分中,而在代码中,您不是(也不应该)写入它们。它们被用于构造一个新的字符串,并将这些文字的内容复制到其中。

如果你正在写这些文字的内存地址,你就会知道:)(即它通常会使程序崩溃)

答案 2 :(得分:3)

文字字符串在编译时存储在程序图像的.data部分中。 .data部分通常映射到只读内存,因此它不会像.code部分那样被破坏。您可以使用visual studio附带的dumpbin.exe查看Windows exe / dll的.data部分。

没有简单的方法来破坏这个文字,如果你修改它所存储的内存页面的权限就可以完成,但是你必须通过使用OS api而不是c ++ api来明确地做到这一点。在编译时硬编码到机器代码中的地址是相对偏移量(如果内存为我提供数据部分基础)。此偏移量将添加到操作系统加载程序提供的基址中。

如果您的堆栈已损坏,您可能会遇到基址无效的情况,因此当添加偏移时,文字看起来已损坏。