当前位置: 首页 > news >正文

【软件分析/静态分析】chapter8 课程11/12 指针分析—上下文敏感(Pointer Analysis - Context Sensitivity)

🔗 课程链接:李樾老师和谭天老师的:

南京大学《软件分析》课程11(Pointer Analysis - Context Sensitivity I)_哔哩哔哩_bilibili

南京大学《软件分析》课程12(Pointer Analysis - Context Sensitivity II)_哔哩哔哩_bilibili

目录

第八章 上下文敏感的指针分析

8.1 上下文敏感技术的介绍

8.1.1 为什么需要上下文敏感技术

 8.1.2 基本概念

1. 定义

2. 策略——call-site sensitivity(call-string)

3. 实现——基于克隆的上下文敏感(Cloning-Based Context Sensitivity)

4. Context-Sensitive Heap

8.1.3 Context-Sensitive Heap的例子

8.2 规则 Rule

8.2.1 Domains and Notions 域与符号

8.2.2 Rules 规则

1. 处理4种基本语句的规则

2. 处理Call语句的规则

8.3 算法实现

8.3.1 Pointer Flow Graph with C.S.

 8.3.2 算法总体

 8.3.3 ProcessCall的不同——Select上下文⭐

8.4 上下文敏感的变种

8.4.1 从上下文敏感的视角,看上下文不敏感技术

8.4.2 调用点敏感(Call-Site Sensitivity)

8.4.3 对象敏感(Object Sensitivity)

8.4.4 类型敏感(Type Sensitivity)

8.4.5 总结


第八章 上下文敏感的指针分析

        在第六章中介绍了上下文敏感的一些知识,这是提升指针分析精度最有效的技术,特别是对java。只要是跨函数涉及过程间的,基本都很有用。本章内容可能需要第六章和第七章的内容,再次贴一个之前的笔记连接:
 

8.1 上下文敏感技术的介绍

8.1.1 为什么需要上下文敏感技术

        如下图所示的程序,如果进行上下文不敏感的常量传播分析,id被调用了两次,一次传入的是n1 一次是n2,就会导致 id 方法的参数 n 在不同上下文里的对象混在一起,指针域为{o1, o2},再顺着指针分析传播的时候,通过返回值给x和y,会传递虚假的值,再分析 i 值的时候,会导致i = NAC
        

        所以,上下文不敏感的技术(Imprecision of Context Insensitivity, C.I.),再处理一个方法的多个不同上下文的调用的时候,会混在一起传播,会引入假的数据流,丢失精度

        如果是上下文敏感的技术,如下,在不同的调用的时候,会进行标记,从而不会将所有参数的传递混在一起,这样分析出来的i 就是正确的值 1。
        

 8.1.2 基本概念

1. 定义

        上下文敏感(Context Sensitivity, C.S.)模型通过区分不同上下文的不同数据流来调用上下文以提高精度。

2. 策略——call-site sensitivity(call-string)

        使用call-site sensitivity(call-string) 策略,将方法的每个上下文表示为一系列调用点a chain of call sites),也就是对方法、caller、caller的caller的call site,通过一系列调用可以到达这个方法的call site 链,把这一系列call sites 当作上下文(是动态执行的调用栈的一个抽象)。

        如下图所示,id(Number)的上下文,就是[1] 和 [2]
        

3. 实现——基于克隆的上下文敏感(Cloning-Based Context Sensitivity)

        在基于克隆的上下文敏感指针分析中,会给每个方法加一个或多个上下文进行修饰。给方法加上下文,实际上就是给变量加上下文(变量在某方法中声明),可以当作对一个变量的标记,标记从哪个call-site过来。基本上,每个方法及其变量都是克隆的,每个上下文对应一个克隆

        如下图所示,对上述程序中的id 方法 中的变量加上各自的上下文,以免混淆:
        

4. Context-Sensitive Heap

        对于像Java这种OO语言,会频繁对对象进行操作,又因为这些对象经常分配在堆区,所以把这种频繁修改对象的行为称为heap-intensive。

        对于heap-intensive,在实际中,为了提升精度,我们不仅要给变量加上下文,还要给对象加上下文heap contexts),给对象的上下文来自于所在的方法。

        加上堆抽象的上下文敏感技术提供了更精细的粒度堆模型。
        

8.1.3 Context-Sensitive Heap的例子

        对下图代码,在采用上下文敏感的技术时,如果只考虑变量的上下文,不考虑Heap的上下文,对代码进行分析的结果如中间的表格所示,如果考虑heap、也考虑变量的上下文时候,分析结果如最右边:
        

        对于第一种不考虑heap上下文的方法,实际上,在动态运行的时候,n是不会指向o2的。之所以会产生假的数据流,是因为这里的heap,在动态运行时,其实创建了两个o8,分别指向不同上下文中创建的两个对象x1 和 x2,然后又在o8处汇合了,一起传出去给n,导致了假的数据流。

          在我们给对象加了上下文的时候,就可以有效地区分开,从而提升精度。对于变量heap都是需要加上上下文来分析的。

8.2 规则 Rule

8.2.1 Domains and Notions 域与符号

上下文c, c', c'' ∈ CC表示程序中所有的上下文,具体的上下文用c, c',c'' 表示
C里具体的内容为一系列call sites 形成的串(列表)
上下文敏感的方法c: m ∈ C × M在具体的方法前,加上具体的上下文,表示上下文c之下的方法m
上下文敏感的变量c: x, c': y ∈ C × V
上下文敏感的对象c: oi, c': oj ∈ C × O
Fieldsf, g ∈ FField 本身不需要加上下文,因为field挂靠在某个object上
Instance fieldsc: oi.f, c': oj.g ∈ C × O × F具体某个对象的field,需要加上具体的上下文的对象
上下文敏感的指针CSPointer = (C×V)∪(C×O×F)指针有两种,变量和field
指向关系pt : CSPointer → 𝒫(C × O)即把上下文敏感的指针,映射到 带有上下文的对象的幂集中。

8.2.2 Rules 规则

1. 处理4种基本语句的规则

        如下图所示,就是上下文敏感下的指针分析处理4种语句的的规则,对比7.1.2中没有上下文敏感的规则,其实只多了红色的部分:上下文。(横线上的公式表示条件,横线下为结论)

感觉和7.1.2中的规则区别不大,这里就不再一条一条详细写了,可以对比下第七章的笔记:

【软件分析/静态分析】chapter7 课程09/10 指针分析基础(Pointer Analysis Foundations)_HiLittleBoat的博客-CSDN博客

2. 处理Call语句的规则

        call 语句是很重要的,因为它决定你的上下文是如何产生的。具体的规则如下:

        在7.4.2中处理没有上下文敏感的调用语句是,主要一般负责如下4件事情:

  •  dispatch  →  传递receive objects  →  传参数  →  传返回值

        加上上下文之后,主要区别有两点,
        ① 在dispatch找到目标方法m之后,要进行很关键的一步:Select选择目标方法t的上下文c^{t}
        ② 找到上下文之后,带着上下文信息,传receive object、参数、返回值,例如对于变量x 需要将 c': x,传到找到的目标方法的上下文c^{t}里的m_this。

        所以,在处理上下文敏感的调用语句的时候,主要负责如下5件事情:

  •  dispatch  →  select  →  传递特定上下文的receive objects  →  传特定上下文的参数  →  传特定上下文的返回值

        对于Select方法,主要是根据传入一系列参数(如下)来求目标方法的上下文c^{t},参数如下:

  • c:这个语句所在方法的上下文
  • l : 调用点,可以是这条语句的标签label,
  • c': oi   :receive object
  • m: 目标方法

        ①先看一个例子:

        这里,c为这些调用语句所在的方法/上下文,给Select传入一系列参数,选出第2行语句的目标方法 id(Number n) 的上下文是2,第3行的目标方法的上下文是3,然后跟目标函数组合在一起。

        之后会对该方法进行克隆,有一个上下文就克隆一次,将针对特定上下文,传receive object(处理this语句)、传参、传返回值。

        要注意,这里的例子中是可以用call site,也就是这个语句的label来进行表示上下文的,上下文也有其他的表示方法,具体怎么选,上下文用什么表示,会在8.3 算法实现部分介绍。

8.3 算法实现

8.3.1 Pointer Flow Graph with C.S.

        我们用Pointer Flow Graph with C.S.(上下文敏感的指针流图)来表示对象在程序中指针之间的流动。他的组成如下:

  • Nodes:CSPointer = (C×V)∪(C×O×F)
            一个节点可能表示一个特定上下文变量,或一个特定上下文抽象对象的一个field
            于PFG相比,在上下文敏感的PFG中,每个节点都会带有上下文
  • Edges:CSPointer × CSPointer
             一条边x→y,表示指针x所指向的对象可能流向y,并会被y所指向

        针对每条规则,形成的PFG边,具体可以比较7.2.2的PFG来看,如下:

 8.3.2 算法总体

        如下图所示为整个算法

        实际上,如果没有加上那些上下文c、c',就是一个上下文不敏感的指针分析。主体框架、思想和流程跟之前都是完全一致的,都是建立pfg,然后在pfg上传播指针的指向关系。其中AddEdge(s, t)和Propagate(n, pts)函数跟之前上下文不敏感的指针分析是完全一样的,代码就不在赘述。

        主要区别有两点,即黄色高亮的地方:
        ① 给每个变量、函数、调用点等都加上了所在的上下文。
        ② 在处理调用的函数ProcessCall()函数中,增加了调用Select函数的部分。

        这里主要阐述第二点不同,其他的地方就不再赘述了,可以参考上一篇chapter7 指针分析的笔记。

 8.3.3 ProcessCall的不同——Select上下文⭐

        上下文敏感的指针分析在处理调用语句的时候,会先根据流入的新对象oi,dispatch到真正的目标函数m,然后用select选出这个目标函数的上下文c^t。

        主要根据以下信息来选择上下文(Select函数需要的参数):

  • 调用者x所在的上下文 c
  • 调用点本身 l
  • 流入调用者的新对象 c': oi
  • 目标函数 m

       不同的select定义的方式,取决于不同的上下文敏感的策略,在8.4中会介绍3种最常用的上下文敏感的策略,然后再详细介绍各自的select方法。

8.4 上下文敏感的变种

        上下文的选取主要有:

  • call-site sensitivity
  • object sensitivity
  • Type sensitivity
  • ……

8.4.1 从上下文敏感的视角,看上下文不敏感技术

        上下文不敏感可以看作时上下文敏感的一个特殊情况,对于C.I.来说,Select函数在任何情况下都返回一个空的上下文,也就是在任何情况下都是一样的上下文

8.4.2 调用点敏感(Call-Site Sensitivity)

1. Call-Site Sensitivity原理

        每个上下文由一系列调用链组成,在方法调用的时候,将调用点(call site)加入到caller的上下文中。实际上就是调用栈的抽象。

        call-site sensitivity 也可以叫做call-string sensitivity,或k-CFA*

*论文出处:

Olin Shivers,1991. "Control-Flow Analysis of Higher-Order Languages".Ph.D. Dissertation. Carnegie Mellon University.

2. 例子

        如下图所示,对于左边的程序,上下文如右边所示,每增加一次调用,就会加入一个新的上下文,但是对于15行有递归调用的情况,就可能会一直调用下去,导致context无限了。

        

        所以,我们需要保证算法能够终止。再分析真实程序的时候,程序可能很复杂,调用链非常长,现在的静态分析没法解决这样的上下文。由此引入,k-Limiting Context Abstraction,来限制调用链的长度。

3. k-Limiting Context Abstraction

  • 目的:
    • 确保指针分析的终止
    • 在现实世界的程序中,太多的上下文(长调用链)破坏了指针分析
  • 方法:为上下文长度设置一个上限,用k表示
    • 对于调用点敏感方法,每个上下文都由调用链的最后一个k call sites 组成
    • 在实际应用中,k是一个小数目(通常是≤3)
    • 方法上下文和堆上下文可以使用不同的k
      • 例如:k=2用于方法上下文,k=1用于堆上下文

4. k-Call-Site Sensitivity/k-CFA

  • ① 1-call-site/1-CFA​​​​​​

        如下图所示,当限制为1 的时候,对于每个上下文的调用链的长度只会去最后一个,第13行在第一次被9调用到的时候,上下文是[9],之后第一次被15调用时,得到上下文[15],之后再被15重复调用,就会只截取15,就不会再分析一次。

  • ② 2-call-site/2-CFA

        在实际应用中,我们会更倾向于用2层上下文,用调用的最后两个元素,来表示一个上下文。

5. 例子

  • ① 1-call-site 例子

        接下来,会结合8.3部分的算法(如下图所示),来具体分析一下下边的程序,为了简便,分析的过程中省去了heap的上下文和C.id里的this 变量,主要左下角的代码,最终目标是,分析第16行代码x.get() 会调用哪些方法。

        首先,将一系列的数据结构(WL, PFG, S, RM, CG)初始化为空,

        然后,使用AddReachable()方法,将加了上下文表示的方法,[ ]:C.main() ,加入RM,表示该方法可达,

        然后,处理该main方法里的语句,这里有一个new语句,将其指针和对应heap对,<[ ]:c, {o3}>加入WL(这里的o3 先省略了上下文)

        然后从WL中取出<[ ]:c, {o3}>,处理过程跟c.i.是一样的,具体过程不再详细解释,这里把o3传到[ ]:c的指针集中,

        然后需要根据ProcessCall()方法处理第4行,c的方法调用语句:

        这里就涉及到了上下文敏感分析的关键一步:选取上下文。这里即为第4行调用了C.m方法,这里C.m的上下文即为[4],然后将<[4]:C.m_this, {o3}>传入WL中,然后连接CG,使用AddReachable()方法处理新可达的[4]:C.m方法,处理其new语句,再加入WL中,结果如下:

        接下来,从WL中取出来<[4]:C.m_this, {o3}>,进行处理,同样,处理其相关语句,涉及14、15行的两个调用:

        对于14,先选出来他的dispatch ,即7行的 C.id方法,接下来选择其上下文,即[14],然后加调用边 [4]:14 → [14]:C.id(Number),再往RM中添加方法 [14]:C.id(Number)。这个调用中涉及到了关键的传参和返回值[4]:n1→[14]:n,及[14]:n→[4]:x。

        对于15,同理,加调用边,加RM,处理传参和返回值,得到的结果如下图所示:

         接着继续从WL中取出来未处理的pair,进行处理,这里不在详细介绍步骤,主要是沿着PFG,传递指针域。

        对比c.i. ,上下文敏感的技术可以将不同上下文的节点区分开,最终结果如下图所示:

8.4.3 对象敏感(Object Sensitivity)

1. 原理

        每个上下文都包含一个抽象对象列表(由他们的allocation sites表示)。

  • 在方法调用时,使用接收对象及其heap context作为被调用上下文。
  • 区分数据流在不同对象上的操作。

论文出处:

Ana Milanova,Atanas Rountev, and Barbara G.Ryder. " Parameterized ObjectSensitivity for Points-to and Side-Effect Analyses for Java".lSSTA 2002.

2. C.S.(1-Object)    vs.    C.S.(1-Call-site)

① 在如下例子中,对比1-call-site,1-object可以拿到准确的结果,如下图所示:

        1-call-site方法会把doSet 混在一起

打个比方,就相当于,1-call-site 会一直记得从哪个屋子进来的,而1-object会一直记得记得这个人是谁。

② 但是对于以下的程序,1-Call-site会比1-object更准确:因为同一个receiver object 用不同参数多次调用了子函数,导致局部变量无法区分。
 

③ 总结:

        综上,在理论上,这两种方法的精度是没有办法直接比较的。但是在实际应用中,对于像java的这种OO语言来说,对象敏感表现优于调用点敏感。

8.4.4 类型敏感(Type Sensitivity)

1. 原理

        每个上下文都包含一个类型列表。在用方法调用时基于创建点所在的类型,作为被调用上下文。

      是对 object sensitivity 的抽象,精度要弱于 object。

论文出处:

Yannis Smaragdakis, Martin Bravenboer, and Ondrej Lhotwk." Pick YourContexts Well: Understanding Object-Sensitivity".POPL 2011.

8.4.5 总结

        精确度:object > type > call-site

        效率:type > object > call-site
 

参考:

https://wenku.baidu.com/view/5cadf582de3383c4bb4cf7ec4afe04a1b071b0ad.html?_wkts_=1692682599401&bdQuery=%E4%B8%8A%E4%B8%8B%E6%96%87%E6%95%8F%E6%84%9F%E7%9A%84%E6%8C%87%E9%92%88%E5%88%86%E6%9E%90%E6%8A%80%E6%9C%AF

相关文章:

【软件分析/静态分析】chapter8 课程11/12 指针分析—上下文敏感(Pointer Analysis - Context Sensitivity)

&#x1f517; 课程链接&#xff1a;李樾老师和谭天老师的&#xff1a; 南京大学《软件分析》课程11&#xff08;Pointer Analysis - Context Sensitivity I&#xff09;_哔哩哔哩_bilibili 南京大学《软件分析》课程12&#xff08;Pointer Analysis - Context Sensitivity II&…...

时间复杂度与空间复杂度详解

时间复杂度与空间复杂度详解&#x1f996; 一、算法效率1.1 如何衡量一个算法的好坏1.2 算法的复杂度 二、时间复杂度2.1 时间复杂度的定义2.2 大O的渐进表示法2.3 如何记录表示算法复杂度 三、空间复杂度3.1 空间复杂度的定义3.2 小试牛刀 一、算法效率 1.1 如何衡量一个算法…...

目录操作函数

mkdir函数 rmdir函数 删除空目录 rename函数 换名 chdir函数 修改当前的工作目录 getcwd函数 获取当前工作的路径...

PlantUML入门教程:画时序图

软件工程中会用到各种UML图&#xff0c;例如用例图、时序图等。那我们能不能像写代码一样去画图呢&#xff1f; 今天推荐一款软件工程师的作图利器--PlantUML&#xff0c;它能让你用写代码的方式快速画出UML图。 一、什么是PlantUML&#xff1f; PlantUML是一个允许你快速作出…...

C#范围运算符

C#8.0语法中&#xff0c;范围运算符是一种用于快速截取序列的运算符&#xff0c;其语法为 “start…end”&#xff0c;表示从序列的 “start” 索引处开始&#xff0c;一直截取到"end" 索引处为止&#xff08;包括 “end” 索引处的元素&#xff09;。范围运算符主要…...

云数据库知识学习——云数据库产品、云数据库系统架构

一、云数据库产品 1.1、云数据库厂商概述 云数据库供应商主要分为三类。 ① 传统的数据库厂商&#xff0c;如 Teradata、Oracle、IBM DB2 和 Microsoft SQL Server 等。 ② 涉足数据库市场的云供应商&#xff0c;如 Amazon、Google、Yahoo!、阿里、百度、腾讯…...

C++中引用详解!

前言&#xff1a; 本文旨在讲解C中引用的相关操作&#xff0c;以及引用的一些注意事项&#xff01;搬好小板凳&#xff0c;干货来了&#xff01; 引用的概念 何谓引用呢&#xff1f;引用其实很容易理解&#xff0c;比如李华这个同学&#xff0c;他因为很调皮&#xff0c;所以…...

VUE3+TS项目无法找到模块“../version/version.js”的声明文件

问题描述 在导入 ../version/version.js 文件时&#xff0c;提示无法找到模块 解决方法 将version.js改为version.ts可以正常导入 注意&#xff0c;因为version.js是我自己写的模块&#xff0c;我可以直接该没有关系&#xff0c;但是如果是引入的其他的第三方包&#xff0c…...

数据结构-堆的实现及应用(堆排序和TOP-K问题)

数据结构-堆的实现及应用[堆排序和TOP-K问题] 一.堆的基本知识点1.知识点 二.堆的实现1.堆的结构2.向上调整算法与堆的插入2.向下调整算法与堆的删除 三.整体代码四.利用回调函数避免对向上和向下调整算法的修改1.向上调整算法的修改2.向下调整算法的修改3.插入元素和删除元素函…...

Spring 条件注解没生效?咋回事

条件注解相信各位小伙伴都用过&#xff0c;Spring 中的多环境配置 profile 底层就是通过条件注解来实现的&#xff0c;松哥在之前的 Spring 视频中也有和大家详细介绍过条件注解的使用&#xff0c;感兴趣的小伙伴戳这里&#xff1a;Spring源码应该怎么学&#xff1f;。 从 Spr…...

96. 不同的二叉搜索树

class Solution { public:int numTrees(int n) {if (n0) {return 1;}vector<int> dp(n1, 0);dp[0] 1;dp[1] 0;for (int i 1; i < n; i) {for (int j 0; j < i; j) {dp[i] dp[j] * dp[i - 1 - j];}}return dp[n];} };...

Android Jetpack 中Hilt的使用

Hilt 是 Android 的依赖项注入库&#xff0c;可减少在项目中执行手动依赖项注入的样板代码。执行 手动依赖项注入 要求您手动构造每个类及其依赖项&#xff0c;并借助容器重复使用和管理依赖项。 Hilt 通过为项目中的每个 Android 类提供容器并自动管理其生命周期&#xff0c;…...

批量采集的时间管理与优化

在进行大规模数据采集时&#xff0c;如何合理安排和管理爬取任务的时间成为了每个专业程序员需要面对的挑战。本文将分享一些关于批量采集中时间管理和优化方面的实用技巧&#xff0c;帮助你提升爬虫工作效率。 1. 制定明确目标并设置合适频率 首先要明确自己所需获取数据的范…...

uniApp监听左右滑动事件

监听左右滑动事件的步骤 1. 添加需要监听滑动事件的元素 在你的页面中&#xff0c;添加需要监听滑动事件的元素。这可以是一个 view、swiper 或其他组件&#xff0c;取决于你的需求。例如&#xff1a; <template><view class"body" touchstart"touc…...

十八、MySQL添加外键?

1、外键 外键是用来让两张表的数据之间建立联系&#xff0c;从而保证数据的一致性和完整性。 注意&#xff0c;父表被关联的字段类型&#xff0c;必须和子表被关联的字段类型一致。 2、实际操作 &#xff08;1&#xff09;初始化两张表格&#xff1a; 子表&#xff1a; 父…...

图像文件的操作MATLAB基础函数使用

简介 MATLAB中的图像处理工具箱体统了一套全方位的标准算法和图形工具&#xff0c;用于进行图像处理、分析、可视化和算法开发。这里仅仅对常用的基础函数做个使用介绍。 查询图像文件的信息 使用如下函数 imfinfo(filename,fmt) 函数imfinfo返回一个结构体的info&#xff…...

【k8s】Kubernetes版本v1.17.3 kubesphere 3.1.1 默认用户登录失败

1.发帖&#xff1a; Kubernetes版本v1.17.3 kubesphere 3.11 默认用户登录失败 - KubeSphere 开发者社区 2. 问题日志&#xff1a; 2.1问题排查方法 &#xff1a; 用户无法登录 http://192.168.56.100:30880/ 2.2查看用户状态 kubectl get users [rootk8s-node1 ~]# k…...

Mysql加密功能

Mysql加密功能 InnoDB加密功能查询条件问题开启整个数据库加密 InnoDB加密功能 InnoDB是MySQL数据库引擎的一种&#xff0c;它提供了加密存储的功能。具体来说&#xff0c;InnoDB引擎支持以下两种方式的加密存储&#xff1a; 表级加密&#xff1a;InnoDB支持表级加密&#xff…...

redis-win10安装和解决清缓存报错“Error: Protocol error, got “H“ as reply type byte”

win10安装 https://github.com/microsoftarchive/redis/releases 下载最新的zip&#xff0c;解压&#xff0c;把路径加到Path里&#xff0c;每次直接在cmd里 redis-server.exeError: Protocol error, got “H” as reply type byte 这个报错是因为我端口写错了。。无语 D:…...

【视觉检测】电源线圈上的导线弯直与否视觉检测系统软硬件方案

 检测内容 线圈上的导线弯直与否检测系统。  检测要求 检测线圈上的导线有无弯曲&#xff0c;弯曲度由客户自己设定。检测速度5K/8H625PCS/H。  视觉可行性分析 对样品进行了光学实验&#xff0c;并进行图像处理&#xff0c;原则上可以使用机器视觉进行测试测量…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...