【问题标题】:Where hardcoded values are stored?硬编码值存储在哪里?
【发布时间】:2009-10-06 05:22:19
【问题描述】:

为了进行调查,我需要知道硬编码值的存储位置。

问题:一个函数里面有硬编码的值,并且这个函数被多个线程同时调用,这个硬编码的值是否有可能被破坏。 p>

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢安德鲁,“如果你不锁定/同步”我的日志记录是线程安全的,但是字符串文字如何被破坏导致崩溃:(
    • @Soni:真的。我不信。否则你不会得到错误。但是没有log(x)的定义就很难说
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-05
        • 2018-09-22
        • 2013-09-17
        • 2018-11-09
        相关资源
        最近更新 更多