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

如何以指向0xcccc的指针结束

  •  5
  • gregseth  · 技术社区  · 15 年前

    我正在开发的程序有时试图读取地址上的数据时会崩溃 0xCCCCCCCC . Google(和StackOverflow)是我的朋友,我看到它是未初始化的stack变量的MSVC调试代码。为了理解问题的根源,我试图重现这种行为:问题是我没能做到。

    0xccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc ?

    4 回复  |  直到 15 年前
        1
  •  6
  •   Michael Stum    15 年前

    使用 /GZ compiler switch /RTCs switch . 确保 /Od switch 也用于禁用任何优化。

    s

    • 检测局部变量(如数组)的溢出和不足。/当访问由结构中的编译器填充导致的内存时,RTCs不会检测到溢出。填充可以通过使用AlgEng+C++、Zp(StultEngultRead)或PACK来实现,或者如果你需要用编译器来添加填充元素来排列结构元素。

    • 堆栈指针验证,用于检测堆栈指针损坏。调用约定不匹配可能导致堆栈指针损坏。例如,使用函数指针,调用DLL中导出为\uu stdcall的函数,但将指向该函数的指针声明为\uu cdecl。

        2
  •  10
  •   James McNellis    15 年前
    int main()
    {
        int* p;
    }
    

    如果使用VisualC++调试运行时生成,请在 main() ,然后跑,你会看到的 p 0xcccccccc

        3
  •  2
  •   Pascal Cuoq    15 年前

    我没有MSVC,但这段代码应该会产生问题,编译时没有任何警告。

    在文件f1.c中:

    void ignore(int **p) { }
    

    在文件f2.c中:

    void ignore(int **p);
    int main(int c, char **v)
    {
      int *a;
      ignore(&a);
      return *a;
    }
    

    呼叫 ignore 让它看起来像 a 可能已初始化。我怀疑编译器在这种情况下会发出警告,因为警告可能是误报。

        4
  •  0
  •   Chubsdad    15 年前

    struct A{
        int *p;
    };
    
    int main(){
        A a;
        cout << (void *)a.p;
    }