硬编码值存储在哪里?

问题描述 投票:1回答:3

为了进行调查,我需要知道硬编码值存储在哪里。

问题:内部具有硬编码值的函数,并且许多线程同时调用此函数,硬编码值是否有可能被破坏。

例如: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;
  }
c++ memory-management function
3个回答
4
投票

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

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


3
投票

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

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


3
投票

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

没有简单的方法来破坏此文字,如果您修改存储在其上的内存页面的权限,可以做到这一点,但是您必须使用OS api(而不是c ++ api)来显式地做到这一点。 在编译时硬编码到机器代码中的地址是一个相对偏移量(如果内存为我服务,则是到数据段的基础)。 此偏移量将添加到操作系统加载程序提供的基址中。

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

© www.soinside.com 2019 - 2024. All rights reserved.