Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查先决条件应由谁负责?_C++_C_Architecture_Paradigms - Fatal编程技术网

C++ 检查先决条件应由谁负责?

C++ 检查先决条件应由谁负责?,c++,c,architecture,paradigms,C++,C,Architecture,Paradigms,在函数扮演关键角色的过程语言中,契约式设计范式基本上表示接受参数的函数与调用方之间存在一致性 协议类似于如果调用方确保满足函数的前提条件,那么函数将以预期的方式运行和/或返回预期值 如果我们严格按照这种方式编写代码,那么只有调用方负责确保函数的正确输入。但在防御编程的名义下,似乎明智的做法是包括内部安全措施,以防调用方做了愚蠢的事情 说到软件架构和设计,什么是最好的方法?这是调用方的责任。例如,如果传递空指针,strlen的实现可以做什么?它唯一能做的就是中止程序——这是一个可行的,如果是激烈的

在函数扮演关键角色的过程语言中,契约式设计范式基本上表示接受参数的函数与调用方之间存在一致性

协议类似于如果调用方确保满足函数的前提条件,那么函数将以预期的方式运行和/或返回预期值

如果我们严格按照这种方式编写代码,那么只有调用方负责确保函数的正确输入。但在防御编程的名义下,似乎明智的做法是包括内部安全措施,以防调用方做了愚蠢的事情


说到软件架构和设计,什么是最好的方法?

这是调用方的责任。例如,如果传递空指针,strlen的实现可以做什么?它唯一能做的就是中止程序——这是一个可行的,如果是激烈的,在C++中C.,它可以抛出异常,但如果它坚持C++标准,则不例外,但是处理异常会非常困难。因此,让程序保持在已知状态下运行的唯一明智的解决方案是,不要使用空指针作为参数调用strlen,将检查这一点的责任放在调用代码上。

正如Neil所说,检查是调用方的责任。你说

如果打电话的人做了傻事,那么加入内部安全措施似乎是明智的

为了说明为什么这不是理想的aproach,我将扩展Neil的示例,该示例使用检查传递给strlen的空指针,想象两种场景:

调用strlen的函数预先检查输入。 strlen在对其进行操作之前会对其参数进行内部检查。
如果只调用strlen,这两种方法的效率没有差别。但是,想象一下,您不是只调用strlen,而是连续多次调用strlen、strstrstr和其他字符串函数。在场景1中,无论是1、2、10还是100次调用字符串库中的函数,都只需检查一次错误输入。在场景2中,每个调用都被强制检查输入,从而使过程慢得多

这取决于您希望代码运行的速度。C的本质是让你射中自己的脚,一些保护来自编译器。@Ron:a的一个例子是在C 2018 7.4 1中,关于:在所有情况下,参数都是int,其值应表示为无符号字符或等于宏EOF的值。如果参数有任何其他值,则行为未定义签名本身并没有指定调用函数的要求;必须满足其他条件。如果被调用的例程测试了一个声称的前提条件并进行了适当的处理,那么该条件实际上不是一个前提条件,而只是调用函数的一个有效子集。因此,这里的问题是,一个设计规范应该如何设计?这是一个目标问题,例如性能与安全,答案可能会受到意见的很大影响。我几乎会投票以主要基于意见为基础来结束这一点,但我认为这是重要的,但不是主要基于意见。检查与不检查有基于事实的原因。对于性能原因ons时,调用方应进行检查。出于安全原因,函数可能必须进行检查。在调试生成中,如果不满足条件,函数可能会导致断言失败。如果一切顺利,C++20将添加。这将有助于使这些内容在代码中而不是在注释或部落知识中更加明显。@X.code strlen可能在t中返回-1他的情况是,如果不是因为size_t是无符号的。但是C是按照语言设计者想要的方式实现的,并经过后续标准的修改。如果你想要一种安全的语言,那么C就不适合你。@如果需要,调用strlen的每一段代码都必须进行测试。最好说用空指针调用strlen是未定义的。这告诉程序员不应该以这种方式调用它。这就像被零除-您真的希望每次执行除法操作时都有一个特殊的返回码吗?…在调用strlen之前检查NULL,而不是调用之后我假设的-1,可以更快地截获它。@Weather这可能会通过在调用strlen之前检查NULL,我更快地被截获了-这正是我的答案所说的。我没有反驳它。我的评论是针对OP的,OP询问函数是否将错误传递回调用方,而你的答案没有涵盖这一点。segfault使恢复变得困难。