代码之家  ›  专栏  ›  技术社区  ›  Satbir

存储硬编码值的位置?

  •  1
  • Satbir  · 技术社区  · 15 年前

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

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

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

    功能剂量测量如下:

    bool doSomething(EXCEPTION_RECORD &ExceptRec)
      {
        __try
        {
           // some code here
    
        }
        __except (ExceptRec = *(GetExceptionInformation())->ExceptionRecord,  
            EXCEPTION_EXECUTE_HANDLER)
        {       
            return false;
        }
    
        return true;
      }
    
    3 回复  |  直到 15 年前
        1
  •  3
  •   nichow    15 年前

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

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

    如果堆栈损坏,则可能导致基址无效,因此添加偏移量时,文字看起来已损坏。

        2
  •  4
  •   nobody    15 年前

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

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

        3
  •  3
  •   Nick Bedford    15 年前

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

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