0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过高级静态分析进行特定于域的属性检查

星星科技指导员 来源:嵌入式计算设计 作者:PAUL ANDERSON 2022-11-10 15:29 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

众所周知,高级静态分析工具擅长发现程序中的一般缺陷。借助自定义的属性检查器,最终用户还可以扩展它们,以查找特定应用程序特有的特定于域的错误。

先进的静态分析工具使用复杂的全程序、路径敏感技术来发现深层语义问题,包括安全缺陷和安全漏洞。这些工具识别的几个缺陷可以在CWE/SANS前25个最危险的编程错误中找到,其中列出了为了降低安全风险而要避免的最重要的错误。

具体来说,开箱即用的高级静态分析工具可以找到通用编程缺陷。来自静态分析工具的典型通用报告可能会显示警告,例如未初始化的变量、缓冲区溢出、无法访问的条件和无法访问的调用等;但是,并非所有安全漏洞或安全错误都是由一般问题引起的。许多缺陷是特定应用所独有的。

这些工具的一个经常被低估的方面是它们是可扩展的,因此通常也可以对其进行配置或编程以查找违反特定于域的规则的情况。因此,如果开发团队有自己的内部规则来使用专有API,或者要求程序员使用特定的习惯用语,那么通常可以编写一个检查器来表示违反这些规则。因此,程序员通常只需很少的编程工作,就可以显着增加他们从工具中获得的价值。

一个常见的用例是当发生错误并触发漫长而痛苦的诊断和调试期时。找到缺陷后,明智的做法是首先在代码中查找重复错误的其他位置,然后采取措施检测错误是否再次发生。对现有代码和新代码运行自定义检查可能是实现此目的的有效、低成本方法。这些工具的工作原理以及如何自定义它们的检查器是使用 CodeSonar 中的代码片段描述的,尽管这些原则也可以与其他高级静态分析工具一起使用。

高级静态分析的工作原理

要了解扩展的不同编写方式,首先要了解什么是静态分析,以及静态分析工具如何在后台工作。

静态分析工具的工作方式与编译器非常相似。他们将源代码作为输入,然后对其进行解析并转换为中间表示 (IR)。高级静态分析工具架构的框图如图 1 所示。编译器将使用 IR 生成目标代码,而静态分析工具保留 IR,而检查器通常通过遍历或查询 IR 来实现,查找指示缺陷的特定属性或模式。

图1:高级静态分析工具的架构

poYBAGNsqHWASNl7AABJrDpWD9s224.jpg

高级工具从复杂的符号执行技术中获得强大功能,这些技术通过控制流图探索路径。这些算法跟踪程序的抽象状态,并知道如何使用该状态来排除对不可行路径的考虑。

特定于域的属性的检查器可以访问这些表示形式,并以各种方式利用分析算法。

自定义检查器

最终用户如何创作自定义属性检查器?这在很大程度上取决于属性的性质,因此有几种机制可用:

可以通过向配置文件添加指令来扩展现有检查器。

用户可以向其代码添加注释,以指示分析查找某些属性。如果用户不希望干扰源代码,则可以以面向方面的方式在侧面完成这些注释。

API 允许用户访问所有中间表示形式。通常,使用访问者模式,允许扩展利用分析已在执行的遍历。

让我们仔细看看这些机制。

配置文件

这些先进的静态分析工具实现了数十个检查器。通常,用户需要一个与内置检查器略有不同的检查器,并且其中许多检查器都设计为可扩展的。一类检查器查找禁止使用的函数。例如,众所周知,C 库函数 get 是不安全的。检查器由一个阶段实现,该阶段查找对函数名称的引用,然后将它们与一组正则表达式进行匹配。通过向配置文件添加行来向此集合添加其他正则表达式是一件简单的事情。

代码注释

编写检查器的第二种方法是向代码添加注释。

例如,假设有一个名为 foo 的内部函数采用单个整数参数,并且当此参数为 -1 时引入了潜在的安全漏洞。可以通过向foo主体添加一些代码来实现对这种情况的检查,如下所示:

void foo(int x)

{

#ifdef __CSURF__

csonar_trigger(x, “==”, -1,

“Dangerous call to foo()”);

#endif __CSURF__

}

#ifdef构造可确保常规编译器看不到此新代码。但是,当该工具分析此代码时,会看到对csonar_trigger的调用。因此,此调用从未实际执行,而是由工具解释为对基础分析引擎的指令。如果分析得出结论,可能满足触发条件,则它将发出带有给定消息的警告。

大多数程序员不喜欢用这样的注释来混淆他们的代码,所以有一种替代方法来实现这种检查,允许它写在单独的文件中。当 foo 的源代码不可用时,例如当它位于第三方库中时,此方法也适用。为此,检查器的作者将编写一个替换函数,如下所示:

void csonar_replace_foo(int x)

{

csonar_trigger(x, “==”, -1,

“Dangerous call to foo()”);

foo();

}

当分析看到csonar_replace_foo的定义时,它会将代码中的所有 foo 调用(csonar_replace_foo 内部的调用除外)视为对 csonar_replace_foo 的调用。

此触发器习惯用法适用于检查时态属性,尤其是函数调用序列。假设有一条规则说,在 foo 执行时,永远不应该调用 bar。可以按如下方式实施检查:

static int foo_is_executing = 0;

void csonar_replace_foo(int x) {

foo_is_executing = 1;

foo(x);

foo_is_executing = 0;

}

void csonar_replace_bar(void) {

csonar_trigger(foo_is_executing,

“==”, 1,

“Call to bar from foo”);

bar();

}

请注意,全局状态变量用于记录 foo 是否处于活动状态。在输入 foo 之前,它被设置为 1,然后在 foo 返回后重置为零。然后在 bar 中的触发器中检查此变量,如果设置为 1,将发出警告。

前面的示例演示如何检查全局属性。相同的机制可用于编写对单个对象的属性的检查。可以将属性附加到对象以跟踪其状态。

这种方法允许用户几乎像编写动态检查一样编写静态检查。这种检查的 API 很小,语言是 C,所以有一个温和的学习曲线。这种简单性具有欺骗性:该技术可用于实现相当复杂的检查。

用于中间表示的 API

实现自定义检查的最终方法是使用提供对基础表示形式 (IR) 的访问权限的 API。一家公司使用此 API 查找用于处理硬件错误的自定义习惯用法的冲突。

此 API 也可用于其他程序分析任务。例如,一家医疗设备公司主要使用一种工具,不仅识别其代码中的潜在任务问题,而且还发出允许他们交互式探索堆栈配置属性的信息。其他应用程序包括收集代码的自定义指标和生成程序可视化工具的输入。

可以使用访问者模式编写许多检查 - 该函数作为给定类型的每个 IR 元素的回调调用。可以为控制流图和语法树中的文件、标识符、子程序和节点定义访问者。访问者的接口允许与构造进行模式匹配。

CodeSonar具有一种特殊的访问者类型,在控制流图的路径探索期间调用该访问者。这允许检查器作者编写复杂的检查,以利用该工具的内置路径敏感程序分析功能。这种检查器的一个关键方面是它使用分析部分,消除了对不可行路径的探索,这会自动降低误报结果的概率。

提高软件质量

先进的静态分析工具已成为软件开发人员必不可少的工具,因为它们能够发现严重的安全和安全缺陷。创作自定义检查器是提高这些工具有效性的低成本方法。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • API
    API
    +关注

    关注

    2

    文章

    2181

    浏览量

    66305
  • 编译器
    +关注

    关注

    1

    文章

    1670

    浏览量

    51113
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    芯片制造检验工艺中的全数检查

    在IC芯片制造的检验工艺中,全数检查原则贯穿于关键工序的缺陷筛查,而老化测试作为可靠性验证的核心手段,通过高温高压环境加速潜在缺陷的暴露,确保芯片在生命周期内的稳定运行。以逻辑芯片与存储器芯片的测试
    的头像 发表于 12-03 16:55 514次阅读
    芯片制造检验工艺中的全数<b class='flag-5'>检查</b>

    程序运行慢,是否需检查算法时间复杂度过高

    程序运行慢,需检查算法时间复杂度是否过高
    发表于 11-17 08:08

    什么是CVE?如何通过SAST/静态分析工具Perforce QAC 和 Klocwork应对CVE?

    本文将为您详解什么是CVE、CVE标识符的作用,厘清CVE与CWE、CVSS的区别,介绍CVE清单内容,并说明如何借助合适的静态分析工具(如Perforce QAC/Klocwork),在软件开发早期发现并修复漏洞。
    的头像 发表于 10-31 14:24 297次阅读
    什么是CVE?如何<b class='flag-5'>通过</b>SAST/<b class='flag-5'>静态</b><b class='flag-5'>分析</b>工具Perforce QAC 和 Klocwork应对CVE?

    如何在Zephyr中进行静态代码分析

    在嵌入式软件开发中,“能编译通过”并不等于“可以放心交付”。安全性、可靠性和合规性是产品能否顺利量产的关键。进入量产的Bug会浪费宝贵的工程时间,也会削弱用户信任;安全漏洞可能暴露设备,带来严重后果;在受监管市场中,若未满足MISRA或CERT检查要求,甚至会直接导致产品
    的头像 发表于 10-17 10:28 581次阅读

    知识分享 | 使用MXAM进行AUTOSAR模型的静态分析:Embedded Coder与TargetLink模型

    知识分享在知识分享栏目中,我们会定期与读者分享来自MES模赛思的基于模型的软件开发相关Know-How干货,关注公众号,随时掌握基于模型的软件设计的技术知识。使用MXAM进行AUTOSAR模型的静态
    的头像 发表于 08-27 10:04 512次阅读
    知识分享 | 使用MXAM<b class='flag-5'>进行</b>AUTOSAR模型的<b class='flag-5'>静态</b><b class='flag-5'>分析</b>:Embedded Coder与TargetLink模型

    知识分享 | MXAM入门简介:使用MXAM进行静态测试

    在汽车和自动化行业中,从事基于模型的开发(MBD)的工程师致力于在保证模型质量的同时保证模型高效。在这一背景下,应用适当的建模工具十分关键。合适的工具不仅可以通过建模标准检查分析和测试模型质量
    的头像 发表于 07-23 17:09 1501次阅读
    知识分享 | MXAM入门简介:使用MXAM<b class='flag-5'>进行</b><b class='flag-5'>静态</b>测试

    协议分析仪支持哪些高级触发选项?

    协议分析仪支持多种高级触发选项,这些选项通过灵活组合协议字段、逻辑运算和时序控制,可实现复杂场景下的精准数据捕获,以下是具体分类与说明:一、基于协议字段的高级触发 精确匹配触发 功能
    发表于 07-23 14:21

    普源示波器高级触发功能案例分析

    一、引言 在电子测量领域,示波器的触发功能如同“信号捕手”,决定着波形捕获的精准度与效率。普源示波器(如DHO1204U、MSO5000系列等)不仅具备基础触发模式(边沿触发、脉冲触发等),更通过高级
    的头像 发表于 05-29 09:36 442次阅读

    VirtualLab Fusion应用:光波导k布局可视化(“神奇的圆环”)

    特定光波导布局的光导和耦合条件。 概念 方向转换器计算器 可以通过“开始”>“计算器”找到方向转换器计算器,这有助于演示指定角度的不同方式。 k可视化 k可视化:平面
    发表于 02-21 08:53

    集成电路设计中静态时序分析介绍

    Analysis,STA)是集成电路设计中的一项关键技术,它通过分析电路中的时序关系来验证电路是否满足设计的时序要求。与动态仿真不同,STA不需要模拟电路的实际运行过程,而是通过分析电路中的各个时钟路径、信号传播延迟等信息来评估设计是否符合时序要求。
    的头像 发表于 02-19 09:46 1342次阅读

    WEBENCH电源高级分析

    电子发烧友网站提供《WEBENCH电源高级分析.pdf》资料免费下载
    发表于 01-21 14:53 0次下载
    WEBENCH电源<b class='flag-5'>高级</b><b class='flag-5'>分析</b>

    VirtualLab Fusion案例:K和X域中的系统建模

    为了准确快速地模拟光在复杂光学系统中的传播,VirtualLab Fusion使用了一种“连接场解算器”方法,该方法包括在两个(空间和空间频率)中实现特定的电磁场解算器。在本周的时事通讯中,我们将
    发表于 01-15 08:56

    Chart FX-使用API传输数据 使用Value属性传输数据

    有时,向 Chart FX 传输数值数据最简单方便的方法就是使用 Value 属性通过 Value 属性,您可以为图表中特定series中的某一point设置数值。 Value
    的头像 发表于 01-09 16:30 653次阅读
    Chart FX-使用API传输数据 使用Value<b class='flag-5'>属性</b>传输数据

    混合示波器的原理和应用

    采样率的A/D转换器进行采集,以确保能够捕获到射频信号的细节。 存储与显示:混合示波器使用内部存储器对采样的数据进行存储,以便后续的分析和显示。用户可以
    发表于 12-27 15:54

    英诺达发布全新静态验证产品,提升芯片设计效率

    了重要一步,将为中国芯片产业的发展注入新的活力。 静态验证作为一种业界普遍使用的验证方法,通过对设计的源代码进行深入分析,能够发现设计中的潜在问题。与动态仿真验证和形式化验证相结合,
    的头像 发表于 12-24 16:53 1180次阅读