代码大全学习-11-防御式编程(Defensive Programming)

防御编程 第八章 防御编程    防御编程并不是说让你在编程时持“防备批评或攻击”的态度——“它就是这么工作!”这一概念来自防御驾驶。防御编程的主要思想是:子程序应该不因传入错误数据而被破坏,哪怕是由其它子程序产生的错误数据。更一般地说,其核心想法是要承认程序都会有问题,都需要被修改,聪明的程序员应该根据这一点来编程序。 8.1 保护程序免遭非法数据的破坏     检查所有来源与外部的数据的值 阅读详情

概念

防御式编程,顾名思义,就是保护自己不受其他人错误的影响,防御那些意料之外的错误。比如对一个函数来说,即使它被传递了一个错误的数据,它还是可以继续正常工作,哪怕这个错误数据是其它函数的错,好的程序永远不会输出垃圾信息。防御式编程帮助我们更容易发现错误,改正错误,当然,最好是一开始就不要引入错误,也就是可以利用一些方法,规则尽可能减少错误的产生。好了,下面说方法。

方法

首先,要抵御外来的侵略,也就是来自外部的错误的输入。第一步自然是要把错误检查出来,第二步决定怎么办。怎么办取决于程序的需求,是更看重健壮性还是更看重正确性。这两者通常是矛盾的。像消费类产品往往更看重健壮性,有结果总比关机好。所以可以在程序里尽量做点啥来让它能继续运行。比如超限的输入可以改到限制内,或者用前一个正确的输入,或者等后一个正确的输入;返回一个中性的值,或者返回前一个正确的值等等。而对安全性要求高的应用则更看重正确性,宁愿没有结果也不能有错误的结果。这个时候遇到错误可能就写一下log然后直接关机了。

防御式编程里常用的方法有断言(assertion),异常(exception),建立防护栏(barricade),还有一些debug的辅助手段等。

断言

断言用来检查那些应该永远也不会出现的情形。若是一个断言发生,就意味着一个应该永远不会发生的情形发生了,也就是发现了一个bug。断言是用来发现bug的非常有用的方法,只有发现了bug才能去修改,所以可以在可疑的地方都放一个。通常来说,一些先决条件(precondition)和后置条件(postcondition)都是要断言一下的。对于高要求的代码来说,这样还不算完。断言完了,修改好了,最好也要加上错误处理,因为我们不可能找到所有的错误。

说到错误处理,这是程序设计中不可或缺的一部分。我们要决定哪些错误是就地解决,哪些错误是要上报,上报到哪一级,这些级别要划分清楚,如同公司的管理一样,职责权限分明,搞不定没权限就要上报。还有一种方式是集中式错误处理,所有的错误都给到一个全局的错误处理模块,如同在公司里设立了一个专门处理错误的机构,当然,它的触手会伸到公司的每一个角落,所以,要权衡利弊。

异常

异常机制很多程序语言都提供了,也可以算是错误处理的一种方法,处理原则可以参考错误处理。还有些要注意的点比如不要在构造和析构函数里抛出异常;不要破坏抽象层次,把很底层的异常扔到上层;要注意引用的库的异常;不要有空的捕捉块等等。

防护栏

防护栏的功能如同防火墙,事实上它以前就叫防火墙,是后来防火墙这个词被广泛用于网络攻击后才改名的。防护栏的功能就是栏外的数据随便来,过了防护栏里面的数据就都是安全可靠的,如同安检,违禁物品带不过去的。这里重要的一点就是要确定哪些要放在栏外,哪些放在栏内。通常核心代码会放在栏内,而用户输入等会放在栏外。这个概念还可以用到类上,类的公有方法就是一道栏,私有方法被保护在栏内。有了防护栏之后,栏外的数据都需要错误处理,而栏内的只要断言就好了。

辅助手段

debug的一些辅助手段包括不要用发布版来限制开发版,开发版的程序要想办法尽可能多的去主动发现问题,当然,也要做一些准备方便在发布的时候移除这些辅助的代码,比如用预编译宏,用调试桩等。

代码留存

写了这么多防御式的代码后,最后遗留的一个问题就是发布的时候哪些代码可以留下,哪些要移除。几条指导性的方针是检查重要错误的留下,检查小错误的可以不要;导致数据丢失的不要,能让程序“优雅的”退出的留下;记录错误的log要留;用户会看到的错误信息要改的友好。所谓优雅的退出就是发现严重的错误后能记录错误信息,保留重要数据,安全的退出。

防御式编程不是万能药,防御的种种方法都会增加系统的复杂性,而且谁也不能保证防御的代码就不会有bug,所以哪些地方需要防御,做到什么程度都是设计者要考虑的问题。还记得吗,最好的防御是从一开始就不要引入错误。

同样,最后附上Checklist:

Checklist: Defensive Programming

General

  • Does the routine protect itself from bad input data? 
  • Have you used assertions to document assumptions, including preconditions and postconditions? 
  • Have assertions been used only to document conditions that should never occur? 
  • Does the architecture or high-level design specify a specific set of error handling techniques? 
  • Does the architecture or high-level design specify whether error handling should favor robustness or correctness? 
  • Have barricades been created to contain the damaging effect of errors and reduce the amount of code that has to be concerned about error processing? 
  • Have debugging aids been used in the code? 
  • Has information hiding been used to contain the effects of changes so that they won't affect code outside the routine or class that is changed? 
  • Have debugging aids been installed in such a way that they can be activated or deactivated without a great deal of fuss? 
  • Is the amount of defensive programming code appropriate--neither too much nor too little? 
  • Have you used offensive programming techniques to make errors difficult to overlook during development? 

 Exceptions

  • Has your project defined a standardized approach to exception handling? 
  • Have you considered alternatives to using an exception? 
  • Is the error handled locally rather than throwing a non-local exception if possible? 
  • Does the code avoid throwing exceptions in constructors and destructors? 
  • Are all exceptions at the appropriate levels of abstraction for the routines that throw them? 
  • Does each exception include all relevant exception background information? 
  • Is the code free of empty catch blocks? (Or if an empty catch block truly is appropriate, is it documented?) 

 Security Issues

  • Does the code that checks for bad input data check for attempted buffer overflows, SQL injection, html injection, integer overflows, and other malicious inputs? 
  • Are all error-return codes checked? 
  • Are all exceptions caught? 
  • Do error messages avoid providing information that would help an attacker break into the system?
AI安全---对抗攻击防御措施 目前,在对抗攻击防御上存在三个主要方向: 1)在学习过程中修改训练过程或者修改的输入样本。 2)修改网络,比如:添加更多层/子网络、改变损失/激活函数等。 3)当分类未见过的样本时,用外部模型作为附加网络。 1.改训练过程/ 输入数据 1 蛮力对抗训练 通过不断输入新类型的对抗样本并执行对抗训练,从而不断提升网络的鲁棒性。为了保证有效性,该方法需要使用高强度的对抗样本,并且网络架构要有充足的... 阅读详情

相关推荐

拜读大牛Ulrich Drepper大作之Defensive Programming for Red Hat Enterprise Linux

读大牛Ulrich Drepper 关于写安全的代码的心得及记录。 关键点 Section 2 Safe Programming C/C++的安全问题主要爆发在memory的管理上, 本节主要讲解如何避免这些经常被提及的内存问题 1.1 关于处理C语言中对memory管理的问题 memory的边界     提供了一个宏,来更好的防止调用malloc的指针错误 #defin

为了工作而工作是悲哀的!工作是实现自我价值的地方! 3187

防御编程 Defensive Programming.PPT完整版(精品课件)

防御编程 Defensive Programming.PPT完整版(精品课件) 大纲: 保护程序免遭非法输入数据的破坏 断言 错误处理技术 异常 隔离程序 辅助调试代码

Claude的防御编程能力:从代码生成到工程化落地

防御编程是一种以预防错误为核心、强调边界处理与系统鲁棒性的工程实践,其本质在于将运行时风险前置为设计约束。随着大模型深入代码理解层,具备上下文建模、PR评论学习与推理阶段校验机制的模型(如Claude),正将防御编程从人工经验升维为可自动化注入的代码基因。它不仅能识别空指针、超时、异常输入等常见缺陷,还能结合部署环境、框架规范与行业合规要求(如金融精度、医疗隐私)动态激活防护规则。这种能力使模型不再止步于‘能写代码’,而是支撑真实场景下的CR辅助、ETL原型验证、遗留系统重构等高价值工程任务,成为开发者

weixin_30660027的博客 344

难得的经典——《Defensive Programming for RedHat Enterprise Linux》

免责声明:此资源来源于网络,其著作权属于与本书相关的单位或个人。在此仅供学习和交流使用,请在下载后24小时内删除。如果因此而引起相关法律问题,本人概不负责,谢谢合作。

恶意代码防范技术原理

恶意代码:指违背目标安全策略的程序代码,会造成目标系统信息泄露、资源滥用,破坏系统的完整性及可用性。传播途径:经过存储介质或网络进行传播,在计算机系统之间传播,未经授权认证访问或破坏计算机系统。

weixin_49171105的博客 1037

安全防御之恶意代码与防护技术

恶意代码是指没有作用却会带来危险的代码。通常把未经授权便干扰或破坏计算机系统、网络功能的程序或代码(一组指令)称之为恶意程序。恶意程序包括计算机病毒、木马、蠕虫等。详见恶意代码的防范,不是单靠一种或几种技术就能解决的,而要靠技术、管理以及用户安全意识的共同防范,只有三者相结合才能最大程度地防止恶意代码对系统和用户信息的破坏。目前,恶意代码防范方法主要分为两方面:基于主机的恶意代码防范方法和基于网络的恶意代码防范方法。

baimao__Ch的博客 1447

第八章 防御编程

一、保护程序免遭非法数据的破坏 检查所有来源于外部的数据的值 当从文件、用户、网络或其他外部接口中获取数据时,应检查所获得的数据值,以确保它在允许的范围内 1.1 数值在可接受的取值范围内 1.2 字符串不超长,确保其值合乎用途(比如交易ID) 检查子程序所有输入参数的值 和检查来源于外部数据的数值一样,只不过数据是来源于其他子程序而非外部接口 决定如何处理错误的输入数据 详见...

448

防御编程Defensive Programming

garbage in ,garbage out (GIGO),作为一条计算机界的“俗语”,一条相对“学院派”的设计理念,我们或多或少都有听过。但在实际的工程环境下,GIGO已然成为了一种“不作为”、“缺乏安全性”的标志。所以我们要的是:不论进来什么,好的程序都不会生成“垃圾”。

weixin_42137269的博客 3235

代码大全2》阅读笔记03--Chapter 8 Defensive Programming

Chapter 8 Defensive Programming 防御编程 这一概念来自 防御驾驶,在防御驾驶中要建立这样一种思维,那就是你永远也不能确定另一位司机将要做什么。这样才能保证 在其他人做出危险动作时你也不会受到伤害。 防御编程主要思想:子程序应该不因传入错误数据而被破坏,哪怕是有其他子程序产生的错误数据。 8.1 Protecting Your Program fro...

weixin_30879833的博客 162

defensive-bash-programming

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34007291的博客 114

7个生产级Pandas技巧:构建AI数据管道的防御编程

Pandas不仅是数据清洗工具,更是AI工程中保障数据完整性与运行时安全的核心基础设施。其底层原理涉及索引契约、类型推断、表达编译与内存管理四大机制;技术价值在于将隐错误(如静默数据污染、类型漂移)转化为显异常,显著提升模型可复现性与CI/CD稳定性;典型应用场景覆盖金融风控特征对齐、电商用户行为聚合、工业时序诊断等高可靠性要求领域;本文聚焦`validate`参数校验、`.assign()`链赋值、`pd.eval()`向量化计算等7个经产线验证的硬核技巧,直击AI工作流中最易被忽视却代价最高的数

606

C#11——不可变对象和防御性副本

这是关于不可变对象模的文章的延续。我们讨论了与创建“防御副本”相关的一些问题。

寒冰屋的专栏 265

功能安全视角下的C语言编程:从编码标准到防御编程实践

在嵌入系统、汽车电子和工业控制等安全关键领域,C语言因其高效性和对硬件的直接控制能力而成为首选开发语言。然而,C语言的灵活性和底层特性也带来了内存管理、类型安全和并发控制等方面的风险,这些风险在功能安全(Functional Safety)场景下可能导致系统性失效。为了确保代码的确定性和可靠性,业界普遍采用MISRA C等编码标准来限制危险语言特性的使用,并通过静态分析工具进行自动化检查。防御编程Defensive Programming)是功能安全的核心实践,它要求开发者假设所有输入和外部条件都可能

aofan9566的博客 412

生产级机器学习系统四大支柱:契约、可观测、防御验证与可审计治理

机器学习模型部署不是终点,而是系统性风险的起点。在真实业务场景中,模型性能不仅取决于准确率,更依赖输入契约的稳定性、全链路可观测能力、防御性验证机制以及可追溯的治理框架。本文围绕‘契约化部署’与‘可观测性驱动监控’两大核心热词,解析如何将模型从Notebook中的数学对象,转化为具备鲁棒性、可解释性、可回滚性和可审计性的生产服务。内容覆盖特征漂移检测、Fallback工程化设计、影子测试与混沌压力测试实践,并延伸至金融、风控、营销等高可靠性要求场景下的落地路径。

weixin_33749131的博客 452

AI编程增效实战:开发者工作流三层重构与提示词工程

AI编程不是替代程序员,而是重构‘写代码’为‘指挥代码生成器’的工作流。其核心在于理解代码生成的统计本质与工程约束之间的张力——大模型基于海量代码学习概率,但真实开发需满足业务语义、安全合规与性能SLA等硬性条件。因此,高效落地依赖三层能力协同:L1智能补全解决‘怎么写’,L2意图理解解决‘写什么’,L3系统洞察解决‘为什么这么写’。关键突破点在于提示词工程的可量化设计(角色定义、约束显性化、格确定性、上下文锚点),以及本地RAG与公有模型的混合部署策略,从而在保障数据主权前提下实现私有代码库的语义级

weixin_30790841的博客 380

Java判空全攻略:从NPE防御到Optional与工具类实战

在Java开发中,空指针异常(NullPointerException)是最常见的运行时异常之一,它源于程序访问了未初始化或显赋值为null的对象引用。理解判空的原理是编写健壮代码的基础,其技术价值在于提升系统稳定性、保证数据一致性并明确业务逻辑边界。通过防御编程,开发者可以在方法参数校验、集合操作、链调用等高频场景中有效拦截风险。本文聚焦Java判空的核心方法,涵盖传统的if判断、JDK7引入的Objects.requireNonNull,以及Java8的Optional容器,并深入解析Apache

weixin_34357887的博客 395

Python IndexError 排查与防御:从原理到华为后端实战

编程中,索引是访问序列数据的基础操作,其核心原理是通过整数位置引用元素。当索引值超出序列的有效范围时,便会触发 IndexError 异常。这一机制确保了数据访问的准确性,但也对程序的健壮性提出了挑战。理解并妥善处理索引越界问题,对于构建稳定可靠的应用具有重要价值,尤其是在处理动态数据源,如用户输入、文件解析或网络API响应时。通过防御编程异常处理,开发者可以避免程序因意外数据而崩溃,提升用户体验和系统可用性。本文将以 Python 中的 `IndexError` 为切入点,结合**华为 Mate 系

weixin_30258901的博客 338

开源编程大模型实战评测:Kimi、GLM、MiniMax代码生成能力对比

编程大模型已从‘能否生成代码’迈入‘能否生成可用代码’的关键阶段。本文聚焦真实工程场景下的代码生成能力,围绕意图理解、异常处理、边界覆盖与安全防护四大核心维度,系统评估当前主流开源模型在Pandas数据处理、Requests网络交互、OS系统操作及算法实现等典型任务中的表现。特别关注模型对脏数据容忍、API状态码响应、路径沙箱约束及Corner Case覆盖等工程刚需的落地能力。基于120+次可复现实测,揭示Kimi K2.6的结构化建模优势、GLM 5.1的中文鲁棒性基因,以及MiniMax M2.7的创

567
上一篇: 代码大全学习-10-高质量的函数(High-Quality Routines)
下一篇: 代码大全学习-12-伪码编程(The Pseudocode Programming Process)
tyst08
博客等级 码龄19年 1822粉丝 97原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值