我知道,在过去的C中,你可能会搞乱指针和内存分配,并有可能意外地破坏其他正在运行的程序或程序之外的操作系统本身,并使系统崩溃。这将需要重新启动以收拾残局,并继续程序开发。
系统安全改进是否阻止了这种情况的发生?
在过去的MSDOS和Windows3.1/95/98/Me,以及10版之前的MacOS中,(通常在抢占式多任务成为一切的标准之前),系统安全性通常是不存在的。程序拥有在任何时间随时随地写入数据的完全控制权。
但现在,随着更现代的系统设计和进程安全,程序通常被系统安全阻止,不能意外或故意破坏其他任何东西。
现代处理器的execute-disable特性也有助于防止意外跳转到随机内存位置并运行任何处理器机器代码。
那么,在不试图破坏操作系统安全性的情况下,你能在多大程度上搞砸现代C编程呢?
你还能设法意外地使整个系统崩溃吗?我想这已经不可能了。内核或其他系统安全性介入并停止该操作。
您是否会破坏您的登录环境,然后必须注销并重新登录?我假设这也是被阻止的,因为进程通常不应该访问其他进程的内存空间,即使在您自己的登录安全环境中也是如此。
总的来说,现在用C编程似乎比过去容易得多,因为这些系统保护现在到处都在使用,以防止你自己和系统受到攻击。
发布于 2017-06-12 22:02:01
在您可以意外完成的领域中,它肯定比MS-DOS时代变得更容易。我记得有一个bug破坏了内存中的磁盘缓存。我很幸运,在那一次之后我还剩下了任何东西。
现在,除非您正在编写在内核中运行的C代码,否则不可能再这样做了。通常情况下,操作系统崩溃也不是问题,除非你正在积极尝试利用一个缺陷。
各种各样的其他事情,像NX位和其他类似的在C程序周围建立安全围栏的尝试,它们确实会让你的程序崩溃得更快,而且离真正发生错误的地方更近。但它们远不能达到使用简单的分隔地址空间所能达到的水平。他们被设计为主动尝试利用更困难的东西,而且他们在这方面比在捕捉意外或错误方面要好得多。
并且通常在统计上也不太可能破坏与OS作为整体不同的登录环境。但是,如果您的程序正在进行复杂的文件操作,那么您可能会有一个bug,它会弄乱用户的文件。
而且,除非真正使操作系统崩溃,否则可能会意外地导致资源耗尽。虽然这通常是可以恢复的,但它在进行的过程中非常不舒服。您的系统会变得缓慢,甚至可能无法启动进程。Linux对此有一些保护措施。如果你把你的开发环境放在一个cgroup中,你可以完全防止它。
当然,一个活跃的漏洞可以做的任何事情,你都可以错误地做。但是,我说的是统计上偶然做这些事情的可能性。
可能是最大的改进,因为分离的地址空间是像Valgrind这样的工具,它可以动态地监视程序的越界访问或对释放的内存的访问,等等。
MS-DOS和早期的Windows是相当奇怪的,因为它们被用作具有高质量C开发环境的通用计算机,并且具有如此混杂的内存。Windows花了很长时间才摆脱了这一点,而且在这个平台上的编程实践仍然有点奇怪。
发布于 2017-06-12 22:16:08
简短的回答是:是的。
在使用虚拟内存并将数据和代码分开的计算机上,编写灾难性错误要困难得多,因为您将获得硬件异常(操作系统将其转换为更软的异常)。因此,您不能让bug跑出来覆盖您自己的可执行代码,或者让失控的代码从数据段开始执行随机的“操作码”。当然,bug仍然存在,需要修复。但它将变得不那么神秘,也不会那么灾难性。
没有这些安全功能的计算机需要程序员更多的关注和测试。
整个系统崩溃的可能性仍然很大,但这主要是因为操作系统和API中的错误。在Windows中偶尔出现的“蓝屏死亡”仍然是一件事。通过一些努力,您还可以通过使用100%的CPU或分配过多的堆内存,使整个计算机停滞,使其变得无用。
https://stackoverflow.com/questions/44501212
复制相似问题