我想问你的问题很广泛但同时它非常具体.首先,我必须说,我最感兴趣的是适用于.net环境的答案.
好吧,我想提高我生成的代码级别.现在我主要使用TDD和静态代码分析来确保我的代码是正确的.最近我听了Dino Esposito关于代码合同的演讲,现在我想将它与其他技术结合使用.在听Dino的同时我也回忆起了Debug.Assert()和Trace.Assert().
具体来说,我会问几个问题:
Debug.Assert()吗?什么时候可以使用它们?(例如,请注意.net中的不变量仅在公共方法/属性出口处进行检查.那么,通过简单方法在方法中间进行一些检查是否可以Assert()?)我和我的同事就这段代码进行了辩论:
var y = null;
if (x.parent != null)
y = x.parent.somefield;
Run Code Online (Sandbox Code Playgroud)
我的观点是,在代码所在的位置,x.parent不应该是null.当它为空时,我们有一个严重的问题,我想知道它!因此,不应该存在空检查,并且发生下游异常.
我的同事说这是防御性编程.并且null检查确保代码不会破坏应用程序.
我的问题是,这是防御性编程吗?还是一个不好的做法?
注意:重点不在于谁.我试图从这个例子中学习.
看着SO上网对我来说是一种教育.我想制作一份针对网站使用的各种vunerabilities和漏洞利用的清单,以及可以用什么编程技术来防御它们.
从std :: fstreams以可移植的方式获取有意义的文件访问错误消息的最佳方法是什么?原始性badbits并且failbits变得有点烦人.我之前已经针对win32和POSIX编写了自己的异常层次结构,这比STL的方式灵活得多.
我将"basic :: ios_clear"作为一个错误消息从一个 已启用异常what的downcasted catch(std::exception)方法中获取fstream.这对我来说意义不大,虽然我知道问题是什么,但我希望我的程序能够提供更多信息,这样当我几个月后开始部署时,我的生活会更容易.
Boost中有什么东西可以从fstream实现跨平台中提取有意义的消息并跨越STL实现吗?
我通常使用以下代码遍历文件中的行:
open my $fh, '<', $file or die "Could not open file $file for reading: $!\n";
while ( my $line = <$fh> ) {
...
}
Run Code Online (Sandbox Code Playgroud)
然而,在回答另一个问题时,Evan Carroll编辑了我的答案,将我的while陈述改为:
while ( defined( my $line = <$fh> ) ) {
...
}
Run Code Online (Sandbox Code Playgroud)
他的理由是,如果你有一条线0(它必须是最后一条线,否则它将有一个回车)然后while如果你使用我的声明你将会过早退出($line将被设置为"0",并且返回值来自因此,赋值也将"0"被评估为错误).如果检查已定义,则不会遇到此问题.这很有道理.
所以我试了一下.我创建了一个文本文件,其最后一行0没有回车符.我在循环中运行它并且循环没有过早退出.
然后我想,"啊哈,也许这个价值实际上并不0存在,也许那里还有别的事情搞砸了!" 所以我使用Dump()了Devel::Peek,这就是它给了我的东西:
SV = PV(0x635088) at 0x92f0e8
REFCNT = 1
FLAGS = (PADMY,POK,pPOK)
PV …Run Code Online (Sandbox Code Playgroud) 这个问题的代码让我思考
assert(value>0); //Precondition
if (value>0)
{
//Doit
}
Run Code Online (Sandbox Code Playgroud)
我从不写if语句.断言就足够/你可以做的一切."早点崩溃,经常崩溃"
CodeComplete说明:
我不认为您通过更正无效输入值或跳过代码使应用程序更加健壮:
assert(value >= 0 ); //Precondition
assert(value <= 90); //Precondition
if(value < 0) //Just in case
value = 0;
if (value > 90) //Just in case
value = 90;
//Doit
Run Code Online (Sandbox Code Playgroud)
这些更正是基于您对外部世界的假设.只有调用者知道你的函数的"有效输入值"是什么,并且他必须在调用你的函数之前检查它的有效性.
用CodeComplete来解释:" 当我们不依赖于断言时,真实世界的程序会变得太乱."
问题:我错了,顽固,愚蠢,太不防守......
我和我的一位同事正在讨论你的代码应该是多么具有防御性.我都是职业防守编程,但你必须知道在哪里停止.我们正在开发一个由其他人维护的项目,但这并不意味着我们必须检查开发人员可以做的所有疯狂事情.当然,你可以这样做,但这会给你的代码增加很大的开销.
你怎么知道在哪里划线?
在编写代码时,您是否有意识地进行防御性编程以确保高程序质量并避免代码被恶意利用的可能性,例如通过缓冲区溢出漏洞或代码注入?
您将始终对代码应用的"最低"质量水平是多少?
我有两种不同的字符串,我在我的代码中传递和使用,两者密切相关,但不应相互混淆.我认为我可以通过让两个只是字符串的类来帮助自己避免错误,但是使用不同的名称以便方法签名(以及通常的类型不兼容)将强制执行两种不同类型字符串的语义含义.与此同时,我不想不得不从重构something = "foo";到something.Value = "foo";中百地方.
首先想到:
private class FirstKind : string { }
private class SecondKind : string { }
Run Code Online (Sandbox Code Playgroud)
我的想法是,如果我有
void MyMethod(FirstKind varOne, SecondKind varTwo) {...}
Run Code Online (Sandbox Code Playgroud)
,然后尝试调用它MyMethod(secondKindVar, firstKindVar);,我得到编译器错误.
我打的墙: string是密封的.
第二个想法:创建泛型KindOf<T>类,除了接受并使用隐式转换运算符吐出值之外什么也不做.像这样:
private class KindOf<T>
{
public T Value { get; set; }
public KindOf() { Value = default(T); }
public KindOf(T val) { Value = val; }
public static implicit operator T(KindOf<T> kindOf) { return kindOf.Value; }
public static implicit …Run Code Online (Sandbox Code Playgroud) c# ×3
security ×2
.net ×1
assert ×1
c++ ×1
exception ×1
fail-fast ×1
generics ×1
inheritance ×1
java ×1
perl ×1
portability ×1
stl ×1
while-loop ×1