Tag: 防御性编程

我应该如何防守?

我正在使用一个用于创build数据库连接的小例程: 之前 public DbConnection GetConnection(String connectionName) { ConnectionStringSettings cs= ConfigurationManager.ConnectionStrings[connectionName]; DbProviderFactory factory = DbProviderFactories.GetFactory(cs.ProviderName); DbConnection conn = factory.CreateConnection(); conn.ConnectionString = cs.ConnectionString; conn.Open(); return conn; } 然后我开始研究.NET框架文档,查看各种事情的logging行为,看看我能否处理它们。 例如: ConfigurationManager.ConnectionStrings… 该文件说,如果ConnectionStrings无法检索集合,则会调用ConfigurationErrorException 。 在这种情况下,我无法处理这个exception,所以我会放手。 下一部分是ConnectionStrings的实际索引来查找connectionName : …ConnectionStrings[connectionName]; 在这种情况下ConnectionStrings文档说,如果无法find连接名称,该属性将返回null 。 我可以检查发生这种情况,并抛出一个exception,让高人,他们给了一个无效的connectionName: ConnectionStringSettings cs= ConfigurationManager.ConnectionStrings[connectionName]; if (cs == null) throw new ArgumentException("Could not find connection string \""+connectionName+"\""); 我重复同样的练习: DbProviderFactory factory […]

0xDEADBEEF等同于64位开发?

对于32位系统(无论是Linux, Mac OS还是Windows, PowerPC或x86)的C ++开发,我已经初始化了指针,否则这些指针可能是未定义的(例如,它们不能立即得到适当的值) int *pInt = reinterpret_cast<int *>(0xDEADBEEF); (为了节省打字和DRY的右手边通常是一个常数,例如BAD_PTR。) 如果pInt在得到适当的值之前被解引用,那么它会在大多数系统上立即崩溃(而不是在一些内存被覆盖或进入很长的循环时崩溃太多)。 当然,行为依赖于底层硬件(从用户进程的奇数地址0xDEADBEEF获得一个4字节的整数可能是完全有效的),但是到目前为止我开发的所有系统的崩溃已经100%可靠Mac OS 68xxx ,Mac OS PowerPC,Linux Redhat Pentium,W​​indows GUI Pentium,W​​indows控制台Pentium)。 例如在PowerPC上,从一个奇数地址中取出一个4字节的整数是非法的(总线故障)。 这对于64位系统有什么价值?

Erlang的让它崩溃的哲学 – 适用于其他地方?

Erlang(或者Joe Armstrong的?)build议不要使用防御性编程 ,而是让进程崩溃(而不是用不必要的守卫来跟踪残骸,污染你的代码)对我来说非常有意义,现在我想知道为什么我浪费了这么多努力处理多年的error handling! 我想知道的是 – 这种方法只适用于像Erlang这样的平台吗? Erlang拥有一个虚拟机,对进程监督树进行简单的本机支持,重启进程非常快。 我应该把我的开发工作(不在Erlang世界)花在重build监督树上,而不是用顶层exception处理程序,错误代码,空结果等等让自己陷入困境。 你认为这种方法的改变在.NET或者Java的空间(比如说)中可以运行吗?

隐藏C ++敏感string的技巧

我需要在我的C ++应用程序中存储敏感信息(我想保密的对称encryption密钥)。 简单的方法是做到这一点: std::string myKey = "mysupersupersecretpasswordthatyouwillneverguess"; 但是,通过strings进程(或从二进制应用程序提取string的任何其他应用程序)运行应用程序将显示上述string。 应该使用什么技术来掩盖这种敏感数据? 编辑: 好吧,几乎所有人都说“你的可执行文件可以被反向devise” – 当然! 这是我的宠物,所以我要在这里咆哮一下: 为什么99%(好吧,也许我夸大了一点)这个网站上的所有与安全相关的问题都是用“没有办法创build一个完全安全的程序”的洪stream来回答的 – 这不是一个有用的回答! 安全性是一种完美的可用性和无安全性之间的滑动规模,完美的安全性,但另一方面没有可用性。 重点在于你根据自己想要做的事情以及软件运行的环境来select你的职位。 我不是在写军事装置的应用程序,而是在为家用电脑编写应用程序 。 我需要使用预先已知的encryption密钥对不可信networking上的数据进行encryption。 在这些情况下,“通过默默无闻的安全”可能已经足够了! 当然,有足够的时间,精力和技能的人可以对二进制文件进行逆向工程并find密码,但猜猜看是什么? 我不在乎: 实施一stream的安全系统需要花费的时间比由于破解版本造成的销售损失要贵(不是说我实际上是在出售这个,但是你明白了我的观点)。 这个蓝天“让绝对的最好的方式可能”在新程序员的编程趋势是愚蠢的,至less可以说。 感谢您花时间回答这个问题 – 他们是最有帮助的。 不幸的是,我只能接受一个答案,但我已经投了所有有用的答案。

什么时候应该使用Debug.Assert()?

大约一年以来,我一直是一个专业的软件工程师,gradle于CS学位。 我已经知道关于C ++和C一段时间的断言,但直到最近才知道它们存在于C#和.NET中。 我们的产品代码没有任何断言,我的问题是这个… 我应该在生产代码中使用Asserts吗? 如果是这样,它的用途何时最合适? 这样做会更有意义吗? Debug.Assert(val != null); 要么 if ( val == null ) throw new exception();

为单行if或循环使用大括号(即{})的目的是什么?

我正在阅读我的C ++讲师的讲稿,他写了以下内容: 使用缩进//确定 永远不要依赖运算符优先级 – 总是使用括号// OK 总是使用{}块 – 即使是单行// 不行 ,为什么? 比较左侧的Const对象// OK 使用无符号的variables是> = 0 //好的技巧 删除后将指针设置为NULL – 双重删除保护//不错 第三种技术对我来说是不清楚的:通过在{ … }放置一行可以获得什么? 例如,拿这个奇怪的代码: int j = 0; for (int i = 0 ; i < 100 ; ++i) { if (i % 2 == 0) { j++; } } 并将其replace为: int j = […]