【静态分析】静态分析笔记01 - Introduction

参考:

BV1zE411s77Z

 [南京大学]-[软件分析]课程学习笔记(一)-introduction_南京大学软件分析笔记-CSDN博客

------------------------------------------------------------------------------------------------------

1. program language and static analysis

背景:在过去的十年中,语言的核心基本没有变化,但是程序变得显著的更大和更复杂。

挑战:如何确保大规模复杂程序的可靠性、安全性和其他承诺。

2. why we learn static analysis

2.1 程序的可靠性 reliability:

  • null pointer dereference 空指针引用
    • 去引用的时候没有 define,就会带来很多 bug
  • memory leak 内存泄漏
    • malloc 没有 free,内存占用过多会导致 crash

2.2 程序的安全性 security:

  • private information leak 私有信息的泄露
  • injection attack 注入攻击

2.3 编译器优化

  • dead code elimination 死代码消除
  • code motion 代码移动

2.4 程序理解

  • IDE call hierarchy 调用层次
  • type indication 类型指示

3. what is static analysis

静态分析通过分析程序 P 来推理其行为,并在运行 P 之前确定其是否满足某些属性。

Does P contain any private information leaks?
Does P dereference any null potinters?
Are all the cast operations in P safe? 类型转换操作符
Can v1 and v2 in P point to the same memory location?
Will certain assert statements in P fail?
Is this piece of code in P dead(so that it could be eliminated)?

一个 perfect static analysis 是不存在的。

从学术的角度来看,一个 perfect 的 static analysis 需要满足以下两个条件:

  • sound: over approximate
  • complete: under approximate

所以并不追求完美的静态分析,而是追求 useful static analysis:

  • Compromise soundness (false negatives)
  • Compromise completeness (false positives)

绝大多数静态分析追求的都是追求Soundness,会造成误报;在确保soundness的同时,在分析精度和分析速度之间做好权衡。

4. static analysis features and examples

Abstraction + Over-approximation(抽象和过近似)

  • abstraction
  • over-approximation
    • transfer function
    • control flows

Example:

判断给定的程序中所有变量的符号:正、负或者是0.

  • T(Top):unknow 可正可负(over-approximation 过近似)
  • bottom:undefined,除零操作,抛出异常操作

transfer function 定义了如何在抽象值上评估不同的程序状态,并且应该根据分析问题和不同程序状态的语义去定义。

图:Transfer functions

  • 1问题是除零、抛出异常,则应该为 undefined;
  • 2问题是下标为负,抛出异常,也应该为 undefined
  • 3问题则是 over-approximated,也即是误报,在实际的程序中 a=x+y=9,所以并不会报错,而在抽象化为符号的过程中会模糊这个界限,导致产生误报

图:Control Flows

控制流分析,y 的两个值是两个branch,执行分支不同会使 z 的值产生变化。并且在实际中枚举所有路径是不可能的,空间特别庞大,因此 flow merging 则被很多静态分析采用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/532031.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【JavaWeb】Jsp基本教程

目录 JSP概述作用一个简单的案例:使用JSP页面输出当前日期 JSP处理过程JSP 生命周期编译阶段初始化阶段执行阶段销毁阶段案例 JSP页面的元素JSP指令JSP中的page指令Include指令示例 taglib指令 JSP中的小脚本与表达式JSP中的声明JSP中的注释HTML的注释JSP注释 JSP行…

llinux进程控制

学习进程创建,fork/vfork 学习到进程等待 学习到进程程序替换, 微型shell,重新认识shell运行原理 学习到进程终止,认识$? fork函数 在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程…

PostgreSQL入门到实战-第十五弹

PostgreSQL入门到实战 PostgreSQL数据过滤(八)官网地址PostgreSQL概述PostgreSQL中LIKE命令理论PostgreSQL中LIKE命令实战更新计划 PostgreSQL数据过滤(八) 如何使用PostgreSQL LIKE运算符基于模式查询数据。 官网地址 声明: 由于操作系统, 版本更新等原因, 文章所列内容不一…

Commitizen:规范化你的 Git 提交信息

简介 在团队协作开发过程中,规范化的 Git 提交信息可以提高代码维护的效率,便于追踪和定位问题。Commitizen 是一个帮助我们规范化 Git 提交信息的工具,它提供了一种交互式的方式来生成符合约定格式的提交信息。 原理 Commitizen 的核心原…

人工智能分类算法概述

文章目录 人工智能主要分类算法决策树随机森林逻辑回归K-均值 总结 人工智能主要分类算法 人工智能分类算法是用于将数据划分为不同类别的算法。这些算法通过学习数据的特征和模式,将输入数据映射到相应的类别。分类算法在人工智能中具有广泛的应用,如图…

每日一题(leetcode2529):正整数和负整数的最大计数--二分法

因为需要O(logn)的复杂度,所以考虑使用二分法,先找到负数里面的最大下标(初始值定为-1),再找到第一个正数的下标(初始值定为数组长度值)。最后求出个数并进行比较即可。 …

操作系统的基础知识:操作系统的特征:并发,共享,虚拟,异步

操作系统的特性: 1.并发 并发:指两个或多个事件在同一时间间隔内发生。这些事件宏观上是同时发生的,但微观上是交替注意:并行:指两个或多个事件在同一时刻同时发生。 操作系统的并发性指计算机系统中“同时”运行着多个程序,这…

【Entity Framework】聊聊EF中键

【Entity Framework】聊聊EF中键 文章目录 【Entity Framework】聊聊EF中键一、概述二、配置主键2.1 约定配置主键2.2 单个属性配置为实体主键2.3 组合主键 三、主键名称四、键类型和值五、备用键 一、概述 键用作每个实体实例的唯一标识符。EF中的大多数实体都有一个键&#…

langchain-chatchat加载Azure Open AI

1.找到knowledge_base_chat.py文件中的get_ChatOpenAI函数 2.按crtl进入get_ChatOpenAI函数位置 3.注释原先的get_ChatOpenAI函数,修改成以下内容: def get_ChatOpenAI(model_name: str,temperature: float,streaming: bool True,callbacks: List[Ca…

5款最值得推荐的电脑监控软件丨高人气甄选

在企业和学校等场所,电脑监控软件被广泛应用于员工或学生的行为管理。 通过监控软件,管理者可以了解员工或学生的学习和工作情况,及时发现并纠正不当行为,提高工作效率和学习效果。同时,这类软件还可以用于保护企业机…

13 指针(上)

指针是 C 语言最重要的概念之一,也是最难理解的概念之一。 指针是C语言的精髓,要想掌握C语言就需要深入地了解指针。 指针类型在考研中用得最多的地方,就是和结构体结合起来构造结点(如链表的结点、二叉树的结点等)。 本章专题脉络 1、指针…

SQL注入的其他攻击思路方法与Python脚本设计思路

SQL注入的其他攻击思路方法与Python脚本设计思路 也是很早就写了,也备个份吧 注意:在接下来的攻击方式中,由于实现的条件较为苛刻,并且需要较高权限,有的师傅又称之为高权限攻击 利用文件读取进行SQL注入 上一篇文章提…

mysql8主从复杂原理分析

MySQL 复制(Replication) 是官方提供的主从复制(源到副本的复制)方案,用于将一个 MySQL 的实例同步到另一个实例中。 这是使用最广泛的容灾方案(重点掌握)。 复制(Replication&…

编译器如何理解C++的指针和引用?

初学引用时&#xff0c;往往很难真正理解引用&#xff0c;它与指针究竟有什么区别和联系。下面我们不妨看看编译器如何理解引用和指针的。 一.函数通过指针传参 1.1 示例代码 #include <iostream>using namespace std;void swap(int *x,int *y)//指针传参 {int tmp;t…

【机器学习300问】66、ReLU激活函数相对于Sigmoid和Tanh激活函数的优点是什么?ReLU它有局限性吗?如何改进?

一、ReLU相对于Sigmoid和Tanh的优点 &#xff08;1&#xff09;计算效率高 ReLU函数数学形式简单&#xff0c;仅需要对输入进行阈值操作&#xff0c;大于0则保留&#xff0c;小于0则置为0。Sigmoid和Tanh需要指数运算但ReLU不需要。所以相比之下它会更快&#xff0c;降低了神经…

agi入门-大模型开发基础

AGI(Artifical General Inteligence)的到来还有多久&#xff1f; 乐观预测&#xff1a;明年主流预测&#xff1a;3-5年悲观预测&#xff1a;10年 AGI时代&#xff0c;AI无处不在&#xff0c;相关从来者将如何分&#xff1f; AI使用者&#xff1a;使用别人开发的AI产品AI产品…

让链接直接唤起应用,Xinstall助力提升用户体验

在移动互联网时代&#xff0c;应用程序已成为我们日常生活的重要组成部分。然而&#xff0c;有时候我们在浏览器或其他应用中看到一个有趣的链接&#xff0c;想要打开对应的应用查看更多内容&#xff0c;却需要手动复制链接&#xff0c;再打开应用粘贴查看。这样的操作繁琐且不…

Backtrader 量化回测实践(6)——量化回测评价工具Quantstats

Backtrader 量化回测实践&#xff08;6&#xff09;——量化回测评价工具Quantstats 1.概述 Quantstats是用于量化金融分析和投资组合优化的Python库。该库提供了各种工具&#xff0c;可从不同来源获得金融数据&#xff0c;进行技术和基本分析&#xff0c;并创建和测试投资策…

VPP 负载均衡测试代码

1. 均衡的测试思想和流程说明。 先说一下理论&#xff0c; 然后后边才知道 代码逻辑。 调试了两天&#xff0c;这个代码终于通了。 由于时间关系&#xff0c; 画了一个粗略的图。另外这个代码只是流程通了&#xff0c;不过要帮助理解负载均衡我认为已经足够了。 下面是windo…

什么是企业邮箱?如何选择合适的企业邮箱?

企业邮箱和个人邮箱不同&#xff0c;它的邮箱后缀是企业自己的域名。企业邮箱供应商一般都提供手机app、桌面端、web浏览器访问等邮箱使用途径。那么什么是企业邮箱&#xff1f;如何选择合适的企业邮箱&#xff1f;好用的企业邮箱应具备无缝迁移、协作、多邮箱管理等功能。 企…