首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的鲁棒性和指针安全性

问C++中的鲁棒性和指针安全性
EN

Software Engineering用户
提问于 2014-10-21 06:32:57
回答 1查看 2K关注 0票数 9

我目前正在构建一个服务器,负责存储和管理数百万条相当复杂和相互关联的数据记录。由于我无法控制的原因,这项工作必须用C++来完成。

我担心错误处理,尤其是指针安全。删除空指针会导致整个服务器崩溃,而在某些语言(也许更合适)中,您将得到一个空指针异常,然后您可以处理该异常。因此,基本上,在处理罕见操作的一些罕见的角落情况时,一个bug可以使整个服务崩溃,而不仅仅是发出一个特定的请求失败。Bug是无法避免的,所以我如何确保在这种环境中的可用性和健壮性?

EN

回答 1

Software Engineering用户

发布于 2014-10-21 09:14:08

有几个辅助注意事项(Basile得到了重要的东西):

  1. 指针错误总是编码错误的结果。其症状可能是一些不可预测的运行时崩溃,但原因是静态地包含在您的代码中。编写不包含这些错误的代码是完全可能的。Basile提到的指南和书籍将通过教授正确的成语和惯例,使这件事变得更容易。
    • 由于指针错误始终是编码错误的结果,使它们更容易生存的语言只会使编写不实际崩溃的错误代码变得容易。如果没有崩溃的话,这可能是你的野心的极限,但并不能使你的代码正确。对于需要健壮的程序,IMO的一种更好的方法是一种很难编写错误代码的语言。当然,C++也不是这样,但是空指针异常并不是朝着正确方向迈出的一步。

  2. 如果您需要健壮性,您应该在所有级别构建它。
    1. 您可以运行多个实例,这样一个失败就不会使其他实例崩溃?
    2. 您是否可以将任务划分为不同的阶段,这些阶段可以基于相同的原因跨进程进行分配?
    3. 您能记录/提交/回滚您的更改吗?基于RAII的提交/回滚在存在异常的情况下工作(请记住,NPE并不是您应该考虑的唯一意外事件),日志记录可以在崩溃/重新启动期间保留更改。
    4. 如果您需要处理散乱的宇宙射线或其他比特翻转事件(根据Vatine的评论),您需要ECC内存。NPEs在这里仍然帮不上您的忙:在您的代码、内核代码或某些文件系统元数据中,损坏的可能性也是一样的,而且即使指针遭受了很大的损失,它也更有可能成为另一个(也可能是有效的)非空指针。

作为参考,我不反对NPEs或提供NPEs的语言。在开发时间比正确性更重要的应用程序中,它们很好地增加了非关键代码的恢复能力,并允许应用程序有一定程度的松散性。

..。在某些语言中--也许更合适--您将得到一个空指针异常,然后您可以处理该异常。

这只是表示您希望编写草率的代码并生存下来。虽然在某些情况下,这是完全合理的,但这种草率的代码同样有可能默默地、成功地产生垃圾输出,就像处理得很好的NPE一样。

票数 4
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/260512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档