来自 安全 2021-12-14 06:21 的文章

cc攻击防御_DHCP服务器防御_如何解决

cc攻击防御_DHCP服务器防御_如何解决

伟大的物理学家开尔文勋爵曾说过"测量就是知道"——这是一个被许多学科的科学家牢记在心的原则。不可忽视的是,计算机科学家们,从我们学科的最早时期起,就试图想出有用的方法来测量软件。圈复杂度就是这样一种度量,最初的目的是度量子程序的可测试性、可维护性或可理解性。什么是圈复杂度?圈复杂度(有时写成v(G))是一种通用的图论概念,在软件中,它可以应用于子程序的控制流图(CFG)。定义非常简单,如下所示,其中E是CFG中的边数,N是节点数:v(G)=E–N+2在下面的例子中,我们有E=6和N=6,所以v(G)=2。使用圈复杂度实现可理解性圈复杂度已经被应用到各种编码标准中,在这些标准中,通常可以看到将值保持在或低于10的建议。它用于可理解性背后的直觉是,使用大量分支的函数比不使用分支的函数更难理解,并且v(G)很好地捕捉了分支的数量。(有很多很好的理由来解释为什么这种推理并不总是适用的,但我在这里就不谈了。)相反,我想指出的是,尽管这是一个非常简单的度量标准,但是有大量的工具无法正确计算它,而那些应该更清楚地知道的组织正在漫不经心地传播一个完全错误的不同定义。为什么这值得你我花时间?因为在许多重要的应用中,不正确的圈复杂度值是有风险的。近距离击球当然,我们的静态分析工具CodeSonar计算度量,因此当我收到一封来自潜在客户的电子邮件时,我很担心我们报告的圈复杂度值是错误的。CodeSonar为每个子程序使用的程序模型本质上是一个控制流图,因此,如果我们得到的v(G)是错误的,那么在某些情况下,我们可能有错误的CFG,这也可能意味着无法检测到一些bug实例。所以我问了一个例子,我们的潜在客户大致发送了以下信息:他们告诉我CodeSonar报告v(G)=3,但"正确"的值应该是2。乍一看,这段代码看起来非常像上面的第一个示例(只有一个运算符不同),因此可以预期它具有相同的圈复杂度。但是,如果像我在下面所做的那样,你可以很容易地看出误解在哪里:区别在于逻辑与运算符的语义。在C语言中,这个运算符被称为短路运算符;如果第一个操作数为false,则它不计算第二个操作数,因为整个表达式的结果将为false。这并不是什么神秘的事情,每一个有能力的C程序员都知道这一点。所以我确认CodeSonar创建了正确的CFG,并且计算了正确的值3。但为什么我的潜在客户认为我们弄错了?事实证明,他们的组织多年来一直在使用一种不同的工具来计算指标,作为对CodeSonar的评估的一部分,他们希望将其值与其他工具产生的值进行比较。结果发现,问题的根源在于他们的旧工具只是把它弄错了。我将在这里保持透明:另一个工具是Programming Research Ltd.(又名PRQA)的QA/C。我对此有点惊讶,因为这个工具已经被许多不同的组织广泛地用于计算代码度量。这么简单的概念怎么会弄错呢?为什么他们弄错了?我决定深入研究,找到了他们手册的链接。圈复杂度的文档(他们使用助记符STCYC)声明值是函数中的决策数加上一。最后一段继续说"……一些度量(sic)工具包括使用三元运算符?:…"(没有说明他们是否计算在内)然后"也可以认为应该包括&&和| |运算符的使用。"这就是他们得到错误值的原因-短路运算符被忽略了。不幸的是,无论在理论上还是实践中,都没有理由忽视这些运算符。诚然,它们比if或switch分支不那么明显,但它们仍然是明确的分支。如果重写该代码以使用第二个If语句,那么CFG将完全同构,微信ddos防御算法,但根据它们的定义,值将不同。为什么仅仅为已有的术语重新定义就可以了?电气工程师不需要重新定义伏特是什么。航空工程师不使用他们自己的推力或升力的定义。这样做就像刘易斯·卡罗尔(Lewis Carroll)的《透过镜子》(Through the Looking Glass)中著名的蛋蛋角色:"当我用一个词的时候,"汉普蒂·邓普蒂用一种相当轻蔑的语气说,"它的意思正是我选择它的意思——不多也不少。"汉普蒂·邓普蒂的观点也许适合文学,ddos攻击防御设备,阿里防御ddos,但对科学或工程学肯定不行。我开始想知道其他组织的工具计算圈复杂度。事实证明,PRQA并不是这艘船上唯一的人。根据他们的手册,Klocwork也使用了一个错误的定义。一篇来自微软的博客文章指出,visualstudio的某些版本也计算不正确,他甚至指出可能的最低值是2,尽管这似乎是因为它计算隐式catch块。但让我不要只报道坏消息。我还发现Gmetrics和scitols都是正确的。但这真的重要吗?很容易暗示这并不重要。作为一种预测性度量,圈复杂度不是很好,因此对于许多软件度量的用户来说,错误的值可能并不重要,因为近似值足够好,或者一致性比精度更重要。然而,至少有一个非常有说服力的原因,为什么v(G)值太低可能是危险的。圈复杂度产生一个数,它是通过一个函数的线性独立路径数的计数,因此它提供了命中所有决策点组合所需的最小测试用例数。对于使用这个度量来告诉他们要编写多少个测试用例的组织来说,一个较低的值可能意味着他们的用例太少,高防亚洲cdn,这可能意味着在代码中遗漏了一个严重的问题。最后,在安全关键的嵌入式开发中,大型组织(例如汽车制造商)有时会将编码标准强加给他们的供应商,而这些标准包含对单个功能的圈复杂度的限制是非常常见的。如果供应商无意中违反了这些标准,那么他们可能会违反这些标准。所以我会说是的,阿里云ddos攻击防御方案,这很重要。