问题标签 [defensive-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
security - 防御性编程
在编写代码时,您是否有意识地进行防御性编程以确保高程序质量并避免您的代码被恶意利用的可能性,例如通过缓冲区溢出利用或代码注入?
您将始终应用于代码的“最低”质量水平是多少?
c++ - 测试用例 VS ASSERTION 语句
在我最常使用的 C++ 项目中,我大量使用了 ASSERTION 语句,如下所示:
但是 TDD 社区似乎喜欢做这样的事情:
仅凭我的经验,第一种方法就让我消除了许多微妙的错误。但是 TDD 方法是处理遗留代码的非常聪明的想法。
“Google”——他们将“FIRST METHOD”比作“穿着救生衣走在岸边,在没有任何安全防护的情况下畅游大海”。
哪一个更好?哪一个使软件健壮?
ruby - 如何在 Ruby 中进行防御性编程?
这是该问题的一个完美示例:分类器 gem 破坏 Rails。
**原始问题:**
作为一名安全专家,我关心的一件事是 Ruby 没有与 Java 的包隐私类似的东西。也就是说,这不是有效的 Ruby:
能够防止 Foo::BarImpl 的猴子补丁真是太好了。这样一来,依赖图书馆的人就知道没有人弄乱它。想象一下,如果有人在你身上更改了 MD5 或 SHA1 的实现!我可以调用freeze
这些类,但我必须逐个类地进行,如果我对加载顺序不太小心,其他脚本可能会在我完成保护我的应用程序之前修改它们。
Java 为防御性编程提供了许多其他工具,其中许多在 Ruby 中是不可能的。(请参阅 Josh Bloch 的书以获得一个很好的列表。)这真的是一个问题吗?我是否应该停止抱怨并将 Ruby 用于轻量级的事情,而不是希望“企业就绪”的解决方案?
(不,核心类在 Ruby 中默认不被冻结。见下文:)
defensive-programming - 测试用例和断言语句
这个问题中的代码让我想到
我从不写 if 语句。断言就足够了/你能做的。“早崩溃,经常崩溃”
CodeComplete状态:
- 断言语句使应用程序正确
- if-test 使应用程序健壮
我不认为您通过更正无效的输入值或跳过代码使应用程序更健壮:
这些更正基于您对外部世界所做的假设。只有调用者知道你的函数的“有效输入值”是什么,他必须在调用你的函数之前检查它的有效性。
套用CodeComplete的话:“当我们不完全依赖断言时,现实世界的程序会变得过于混乱。”
问题:我是不是错了,固执,愚蠢,太不防备......
language-agnostic - 什么时候应该使用 Debug.Assert()?
我已经做了大约一年的专业软件工程师,毕业于 CS 学位。我知道 C++ 和 C 中的断言有一段时间了,但直到最近才知道它们存在于 C# 和 .NET 中。
我们的生产代码不包含任何断言,我的问题是......
我应该开始在我们的生产代码中使用断言吗?如果是这样,什么时候使用最合适?这样做会更有意义吗
或者
desktop-application - 当用户在运行时弄乱其文件时,如何防止我的桌面应用程序严重崩溃?
例如在运行期间删除输出文件,将 sw 的两个实例定向到同一个 IO 等?
exception-handling - 将所有内容包装在 try/catch 块中是否构成防御性编程?
在过去的 3 年里,我一直在编程。当我编程时,我习惯于处理所有已知的异常并优雅地提醒用户。我最近看到了一些代码,其中几乎所有方法都包含在 try/catch 块中。作者说它是防御性编程的一部分。我想知道,这真的是防御性编程吗?您是否建议将所有代码放在 try 块中?
language-agnostic - 您如何管理应用程序的外部依赖项?
有许多类型的外部依赖项。与外部应用程序、组件或服务(例如用于发送电子邮件的 Outlook、用于扫描的 TWAIN 或 WIA、用于各种目的的 ActiveX 对象和 Web 服务等)的接口。
你有什么策略来确保你的应用程序是健壮的,并且即使在这种外部依赖项(由于无数原因)不可用时也可以运行?
注意:您自己的源代码中包含的来自外部源的代码是另一种类型的外部依赖,但这并不是我在这里主要关心的。
java - 防御性编程的编辑器模板
最近我处理了关于暴露内部状态的 FindBugs 警告,即当返回对数组的引用而不是返回数组的副本时。我创建了一些模板以使转换该代码更容易。
您创建了哪一个来支持防御性编程并希望与 SO 人群分享?
到目前为止我创建的模板(作为示例):
创建数组的副本以从方法返回:
克隆一个对象: