user-0 提问: 操作系统怎么检测栈溢出的呢？有什么保护机制吗？

回复:
user: user-1
content: 有的时候写出去了也未必会检测到的。

user: user-2
content: C/C++ COMPILER OPTIONS                                 -OPTIMIZATION-  /O1 minimize space                      /O2 maximize speed /Ob<n> inline expansion (default n=0)   /Od disable optimizations (default) /Og enable global optimization          /Oi[-] enable intrinsic functions /Os favor code space                    /Ot favor code speed /Ox maximum optimizations               /Oy[-] enable frame pointer omission                               -CODE GENERATION-  /GF enable read-only string pooling     /Gm[-] enable minimal rebuild /Gy[-] separate functions for linker    /GS[-] enable security checks /GR[-] enable C++ RTTI                  /GX[-] enable C++ EH (same as /EHsc) /EHs enable C++ EH (no SEH exceptions)  /EHa enable C++ EH (w/ SEH exceptions) /EHc extern "C" defaults to nothrow /fp:<except[-]|fast|precise|strict> choose floating-point model:     except[-] - consider floating-point exceptions when generating code     fast - "fast" floating-point model; results are less predictable     precise - "precise" floating-point model; results are predictable     strict - "strict" floating-point model (implies /fp:except) /GL[-] enable link-time code generation /GA optimize for Windows Application /Ge force stack checking for all funcs  /Gs[num] control stack checking calls /Gh enable _penter function call        /GH enable _pexit function call /GT generate fiber-safe TLS accesses    /RTC1 Enable fast checks (/RTCsu) /RTCc Convert to smaller type checks    /RTCs Stack Frame runtime checking /RTCu Uninitialized local usage checks /clr[:option] compile for common language runtime, where option is:     pure - produce IL-only output file (no native executable code)     safe - produce IL-only verifiable output file     oldSyntax - accept the Managed Extensions syntax from Visual C++ 2002/2003     initialAppDomain - enable initial AppDomain behavior of Visual C++ 2002     noAssembly - do not produce an assembly /Gd __cdecl calling convention          /Gr __fastcall calling convention /Gz __stdcall calling convention        /GZ Enable stack checks (/RTCs) /QIfist[-] use FIST instead of ftol() /hotpatch ensure function padding for hotpatchable images /arch:<SSE|SSE2> minimum CPU architecture requirements, one of:     SSE - enable use of instructions available with SSE enabled CPUs     SSE2 - enable use of instructions available with SSE2 enabled CPUs                                -OUTPUT FILES-  /Fa[file] name assembly listing file    /FA[scu] configure assembly listing /Fd[file] name .PDB file                /Fe<file> name executable file /Fm[file] name map file                 /Fo<file> name object file /Fp<file> name precompiled header file  /Fr[file] name source browser file /FR[file] name extended .SBR file /doc[file] process XML documentation comments and optionally name the .xdc file                                -PREPROCESSOR-  /AI<dir> add to assembly search path    /FU<file> forced using assembly/module /C don't strip comments                 /D<name>{=|#}<text> define macro /E preprocess to stdout                 /EP preprocess to stdout, no #line /P preprocess to file                   /Fx merge injected code to file /FI<file> name forced include file      /U<name> remove predefined macro /u remove all predefined macros         /I<dir> add to include search path /X ignore "standard places"                                  -LANGUAGE-  /Zi enable debugging information        /Z7 enable old-style debug info /Zp[n] pack structs on n-byte boundary  /Za disable extensions /Ze enable extensions (default)         /Zl omit default library name in .OBJ /Zg generate function prototypes        /Zs syntax check only /vd{0|1|2} disable/enable vtordisp      /vm<x> type of pointers to members /Zc:arg1[,arg2] C++ language conformance, where arguments can be:     forScope[-] - enforce Standard C++ for scoping rules     wchar_t[-] - wchar_t is the native type, not a typedef /ZI enable Edit and Continue debug info /openmp enable OpenMP 2.0 language extensions                                -MISCELLANEOUS-  @<file> options response file           /?, /help print this help message /bigobj generate extended object format /c compile only, no link /errorReport:option Report internal compiler errors to Microsoft     none - do not send report     prompt - prompt to immediately send report     queue - at next admin logon, prompt to send report (default)     send - send report automatically /FC use full pathnames in diagnostics   /H<num> max external name length /J default char type is unsigned        /nologo suppress copyright message /showIncludes show include file names   /Tc<source file> compile file as .c /Tp<source file> compile file as .cpp   /TC compile all files as .c /TP compile all files as .cpp           /V<string> set version string /w disable all warnings                 /wd<n> disable warning n /we<n> treat warning n as an error      /wo<n> issue warning n once /w<l><n> set warning level 1-4 for n    /W<n> set warning level (default n=1) /Wall enable all warnings               /WL enable one line diagnostics /WX treat warnings as errors            /Yc[file] create .PCH file /Yd put debug info in every .OBJ        /Yl[sym] inject .PCH ref for debug lib /Yu[file] use .PCH file                 /Y- disable all PCH options /Zm<n> max memory alloc (% of default)  /Wp64 enable 64 bit porting warnings                                  -LINKING-  /LD Create .DLL                         /LDd Create .DLL debug library /LN Create a .netmodule                 /F<num> set stack size /link [linker options and libraries]    /MD link with MSVCRT.LIB /MT link with LIBCMT.LIB                /MDd link with MSVCRTD.LIB debug lib /MTd link with LIBCMTD.LIB debug lib                           -CODE ANALYSIS-  /analyze[:WX-] enable code analysis     WX- - code analysis warnings should not be treated as errors even if /WX is invoked

user: user-2
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-3
content: 《windows核心编程》专门有就这一问题展开说

user: user-4
content: 由于用到了虚拟存储的技术，所以不会覆盖其他程序的，操作系统是按照页面给进程分配空间的，然后有两个指针指向栈区的开始和结束地址，这两个地址间的距离就是栈的大小，大概就是这个样子，要想彻底明白得去看看操作系统虚拟存储器这部分了

user: user-2
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。