论文学习_Understanding the AI-powered Binary Code Similarity Detection
摘要:近年来,AI驱动的二进制代码相似性检测(Binary Code Similarity Detection, 简称 BinSD)已广泛应用于程序分析领域。该技术通过神经网络将复杂的二进制代码比较问题转化为代码嵌入向量之间的距离度量。然而,由于现有研究在嵌入策略、评估方法、运行环境以及使用的基准数据集等方面存在较大差异,导致我们难以量化评估 BinSD 在现实应用中的解决程度。此外,当前对日益复杂的嵌入神经网络结构及多样化评估方法缺乏深入系统的研究,已成为制约 AI 驱动 BinSD 发展的关键因素。为弥补这一研究空白,本文对当前主流的 BinSD 方法进行了系统评估,围绕相似函数检测以及两个下游任务(漏洞搜索和许可证违规检测)进行了全面对比。在此基础上,我们首次对嵌入神经网络结构和评估方法展开深入分析。研究AI驱动的BinSD
实验结果带来了若干重要发现,为 BinSD 领域提供了有价值的洞察,包括:(1)尽管基于图神经网络(GNN)的 BinSD 系统在相似函数检测中表现最佳,但仍有显著提升空间;(2)AI 驱动的 BinSD 方法在不同下游任务中的表现差异较大,稳定性和泛化能力仍需加强;(3)现有的评估方法(如广泛采用的 ROC 曲线和 AUC 指标)在真实场景中往往难以准确反映模型性能,亟需进行调整优化。基于广泛的实验与分析,本文还提出了若干值得深入探索的未来研究方向。为推动该领域的发展,我们将开源全部数据集、基准测试和实现细节,以支持后续研究工作。图神经网络效果较好,但仍有提升空间
引言
BinSD(Binary Code Similarity Detection,二进制代码相似性检测)旨在在缺乏源代码的情况下,衡量两个二进制程序之间的相似度。目前,该技术已成为支撑多个应用场景的核心组件,包括漏洞检测、许可证违规识别、补丁分析以及恶意软件分析等。尤其是在应对供应链攻击所带来的严重后果时,BinSD 已被广泛视为默认采用的关键手段。过去几十年中,研究者提出了多种性能优异、特性各异的 BinSD 方法,用以解决不同背景下的相似性检测问题。然而,受编译配置、指令集架构(ISA)和工具链等因素所引入的大量二进制变化影响,BinSD 实际上远比表面看上去复杂。此外,随着软件工程的快速发展,现代软件通常规模庞大、代码量剧增且分布广泛,程序结构愈发复杂,从而进一步加大了 BinSD 的技术挑战。BinSD介绍
在自然语言处理(NLP)和图表示学习(GRL)等人工智能技术迅猛发展的推动下,越来越多研究开始尝试将图神经网络(GNN)、卷积神经网络(CNN)以及长短期记忆网络(LSTM)等广泛应用的神经网络模型引入到 BinSD(Binary Code Similarity Detection,二进制代码相似性检测)任务中。与传统 BinSD 方法相比——后者通常依赖符号执行、图匹配、哈希技术等策略——这些基于 AI 的方法已在多个维度上取得了显著成效。然而,尽管取得了一定进展,当前学术界对 BinSD 问题的解决程度仍难以形成清晰认知,背后原因涉及多个方面,亟待进一步厘清。AI驱动的BinSD引出
当前 AI 驱动的 BinSD 方法在发展过程中面临四大核心问题:嵌入策略与评估标准不统一、神经网络模型缺乏可解释性、评估指标选用不当,以及对下游应用支持研究不足。具体而言,(1)不同系统在特征提取方式、嵌入网络架构和评估数据集方面存在显著差异,导致无法实现公平、量化的性能对比;(2)随着模型结构日趋复杂,大多数神经网络仍被视为“黑箱”,缺乏透明度和解释性,从而削弱了用户信任;(3)尽管许多方法采用 ROC 或 AUC 等传统分类指标进行评估,但这类指标难以准确反映 BinSD 更偏向推荐检索任务的实际表现;(4)已有研究对下游应用场景的覆盖有限,尤其在漏洞检测之外的实际任务中,缺乏系统性的实证验证,难以全面体现其真实能力。AI驱动的BinSD现存问题
若不对上述关键问题展开深入研究,BinSD 领域将难以实现实质性和高效的发展。为弥补这一研究空白,研究人员首先在相同的基准和评估指标下,系统评估了现有 AI 驱动的 BinSD 方法在相似函数检测与下游任务中的表现,并选取了两个具有代表性的应用场景——漏洞搜索与许可证违规检测,作为评估对象,因为这两类任务是当前 BinSD 方法普遍声称可以支持的主要下游应用。在此基础上,研究进一步深入分析了各方法所采用的二进制嵌入神经网络及评估方法,以全面理解其优势与局限。总体而言,本研究聚焦于三个关键方向:(1)评估主流 BinSD 方法在相似函数检测及实际应用中的表现,(2)理解当前主流嵌入神经网络与评估机制的特点,(3)探索未来潜在的研究发展路径。研究内容引出
背景知识
尽管当前的 AI 驱动 BinSD 方法在具体实现上依赖于多种技术路径与复杂的神经网络结构,但整体流程通常遵循一套较为主流的三阶段框架:首先进行预处理,对原始二进制程序进行规范化处理;其次构建代码表示,将程序转换为适合神经网络处理的中间结构;最后进行代码嵌入,通过模型提取可用于相似性度量的嵌入向量。
- 代码预处理:在 BinSD 流程的预处理阶段,AI 驱动的工具通常会针对输入的两个二进制代码片段提取相关特征。具体而言,大多数方法会在反汇编后进行指令归一化处理,以避免类似自然语言处理(NLP)中常见的“词汇外”(OOV)问题。此外,为减少函数内联所带来的控制流图(CFG)结构变化,有些工具还会执行选择性被调用函数内联操作。另有一些方法则采用手工特征提取,或通过指令嵌入的方式,将低层次二进制信息转化为可用于后续模型处理的特征标签,从而为每个二进制片段赋予唯一表示。
- 代码中间表示:在完成预处理之后,接下来的关键步骤是将二进制代码转换为适合神经网络输入的结构化表示。根据已有的实证分析,AI 驱动的 BinSD 工具通常会将一个二进制代码片段表示为抽象语法树(AST)、控制流图(CFG)、数据流图(DFG)、基本块邻接矩阵、指令序列,或是上述多种形式的组合。不同表示方式能够从不同维度捕捉程序的结构与语义,为后续的嵌入建模提供基础。
- 代码嵌入:在流程的最后阶段,AI 驱动的 BinSD 方法通常会利用图神经网络(GNN)、卷积神经网络(CNN)以及循环神经网络(RNN)或长短期记忆网络(LSTM)等主流模型,将前述的代码表示转换为低维向量形式,即代码嵌入。随后,系统通过对这类嵌入向量进行相似度计算,从而判断输入的二进制代码对在语义层面上的相似程度。
方法评估
BinSD方法:在相似函数检测环节,研究者使用统一的数据集与多种评估指标,对不同 BinSD 方法的准确性与效率进行了公平且全面的对比分析。在准确性评估中,目标是观察在给定一个查询函数的情况下,现有 BinSD 方法能在大型函数库中识别出多少与之语义相似的函数(即由同一源代码编译而来的函数)。具体而言,在表 1 所列的 24 个 BinSD 方法中,共有 15 个具备函数级对比能力的代表性方法被纳入评估。部分方法则因客观原因被排除,例如 Oscar 由于对计算资源要求极高(需使用 8 张 V100 GPU),难以纳入统一测试;另外如 Codee 、XBA 和 VulHawk 虽部分开源,但由于论文描述不足,无法准确复现其方法,并且在尝试联系作者后未能获得有效回应或支持。
下游任务:在实际下游应用方面,许多研究者声称所提出的 BinSD 方法可广泛应用于物联网固件中的漏洞搜索与许可证违规检测。因此,相关评估聚焦于这两个具有现实意义的应用场景。考虑到前文已对各 BinSD 方法在相似函数检测中的表现进行了全面对比,同时漏洞与许可证问题的确认过程需投入大量人工精力,本次评估选取了部分具有代表性的 BinSD 方法,依据以下标准展开性能分析:(1)必须支持在 ARM 架构下运行 BinSD 分析,这是本次所选物联网设备的主要平台;(2)具备大规模分析能力,例如 Focus-skip 方法因生成所有固件函数嵌入所需时间超过六个月,故被排除;(3)覆盖主流的函数嵌入技术,包括基于 RNN/LSTM、GNN 和 CNN 的模型;(4)在相似函数检测任务中表现优异,例如在多个 Gemini 变体中,Gemini-skip 表现最佳,因此被纳入评估。最终,通过筛选,研究选取了五种 BinSD 方法,用于深入理解当前主流 BinSD 技术在真实应用场景中的实际能力。
实验设置
在实现方面,本研究主要涵盖以下三个方面的工作:(1)针对部分开源 BinSD 方法因逻辑错误或实现缺陷而无法复现的问题,进行了必要的修正;同时,针对部分闭源方法(如 BinaryAI-bert2),研究团队进行了重新实现,并使得模型在 AUC 指标上达到了与原论文相近的性能水平。(2)为实现可比性评估,所有方法均使用相同的数据集进行测试。考虑到 AI 驱动方法在更换数据集时,神经网络的超参数可能需要调整以保障性能,因此对各 BinSD 嵌入模型的超参数进行了优化,以确保其在对比中展现出最佳效果。(3)在执行相似函数检测任务的准确率、召回率和 MAP 等评估指标计算前,需先生成函数级的嵌入表示,但多数 BinSD 方法并未提供嵌入生成的具体实现。因此,研究团队为这部分方法补充实现了函数嵌入生成模块。关于方法修复与重实现、超参数选择策略以及嵌入生成的具体细节,均已在公开的实验材料中提供。实验训练过程中,数据集划分方式遵循各方法原始论文设定;此外,与现有 BinSD 方法一致,对于函数对(𝑓₁, 𝑓₂),若源自相同源代码,则相似度标记为 1,反之为 -1。所有实验在一台配置为 256GB 内存、两颗英特尔 Xeon E5-2680 CPU(共 56 核)和 4 张 GeForce GTX 2080 GPU 的服务器上完成。
数据集构成
以往研究所使用的评估数据集各不相同,导致不同 BinSD 方法之间难以直接对比。为避免这一问题,研究团队精心构建了两个具有代表性的数据集,并已对外公开。Basic-dataset 用于训练 AI 驱动的 BinSD 模型并执行相似函数检测,涵盖 25 个开源程序、共 33 个 ELF 文件与 1,351,104 个函数,程序类型覆盖常用工具类、数据处理类和操作系统辅助类,如 OpenSSL、Busybox、Findutils 等。所有程序均在三种主流体系结构(ARM、x86 和 x64)下,使用四个常见优化等级(O0 至 O3)进行编译,这些架构覆盖了表 1 中超过一半的 BinSD 方法支持范围。Application-dataset 主要用于真实场景评估,包含十个漏洞函数、对应查询库(OpenSSL 和 Busybox)以及十个 IoT 固件镜像。具体而言,选取的漏洞函数来自广泛使用的第三方库 OpenSSL,涵盖数值错误、资源管理漏洞及输入验证不当等典型安全问题;所选的十个 IoT 固件则覆盖交换机、路由器、网络摄像头和接入点等设备,随机采样自 DLink、TPLink、Tuya和 Trendnet 四家主流厂商。值得注意的是,本次评估并不旨在对大规模 IoT 固件执行漏洞或许可证违规检测以审视其整体安全状况,而是聚焦于评估 AI BinSD 方法在实际环境下的表现。因此,这十个固件样本(共包含 1,935 个 ELF 文件与 651,048 个函数)已足以支撑本次研究目标。
同源函数检测
精度评估:在跨优化等级与跨体系结构评估中,研究者借助表 2 所示结果,采用两种常见的机器学习评估指标与七种推荐系统中广泛使用的排序指标,对现有 AI 驱动的 BinSD 方法在“已见”与“未见”数据集上的表现进行了系统对比(其中“已见”数据集用于模型训练)。每项指标的取值基于 3,000 次随机函数查询的平均结果,且每次查询所使用的函数库由 100,000 个随机函数构成。值得注意的是,Asteria 的函数比较过程极为缓慢(每次查询需数小时),因此未能完成全部 3,000 次查询,故其排序指标未予报告。从这些实验结果中可得出以下结论:(1)没有任何一个 BinSD 方法能在所有指标上始终表现最佳,例如 BinaryAI-bert2 的 AUC 最高,而 Gemini-skip 在排序指标上更优,表明不同方法适用于不同场景;(2)GNN 方法在排名指标上的表现领先,验证了其作为代码嵌入模型的潜力;(3)在跨指令集架构(ISA)测试中,召回率显著下降,例如 Gemini-skip 在 mono-seen 设置下的 recall@5 为 62.3%,而在 cross-seen 设置下则降至 25.42%,说明当前模型更易识别相同架构下编译的函数,跨架构 BinSD 仍面临挑战;(4)大多数方法在 Rank-1、MAP、MRR 和 NDCG 等排名指标上表现良好,且各方法间指标值相近,意味着这些指标在某些情况下难以区分高性能方法;(5)AUC 值高并不一定代表相似函数检测能力强,例如 BinaryAI-bert2 虽获得 99.2% 的 AUC 和 94.9% 的准确率,但其精确率仅为 32.21%,比 Gemini-skip 低 12.3%,且多个方法的 AUC 值非常接近,说明仅依赖 AUC 难以全面反映性能;(6)采用 skip-gram 模型生成的指令嵌入作为基本块特征的 BinSD 方法,其表现优于使用人工提取特征的方法,例如 Focus-skip 与 VulSeeker-skip 的 AUC 与精确率均高于其原始版本。上述结果进一步表明,神经网络在提取具有代表性的二进制特征方面具有显著优势。
效率评估:在效率对比方面,研究聚焦于当前主流 AI 驱动 BinSD 工具的训练与函数嵌入阶段的性能表现。考虑到多数方法在预处理与代码表示阶段的流程较为一致,且已有研究对这两个阶段的效率进行了详细描述(例如 Focus 指出 CFG 提取时间每个函数仅为 0.05 秒),因此本部分主要评估受神经网络结构影响较大的训练与嵌入时间。该评估分别在单一平台与跨平台环境下,基于训练数据展开。如表 4 所示,不同 BinSD 方法的训练与嵌入耗时差异显著,主要源于各方法所采用的神经网络结构不同。例如,MGMN 在单架构下完成模型训练仅需 36 分钟,而 Asteria 完成同一过程则耗时达 23 小时 33 分钟。函数嵌入阶段的耗时差异更为显著,Focus-skip 在跨平台生成嵌入时耗时高达 336 小时,而 Gemini 则仅需 1 小时 31 分钟完成同样任务。鉴于模型训练通常只需进行一次,而嵌入生成直接影响 BinSD 工具在实际场景中的可用性,因此研究者在评估工具实用性时更应关注嵌入效率。
下游任务
漏洞搜索:研究者评估了所选 BinSD 方法在识别 IoT 固件镜像中已知漏洞方面的能力。为便于检测流程,十个漏洞函数被编译为 ARM 架构平台,与目标固件镜像保持一致。此外,考虑到大多数 IoT 固件使用 -O2 或 -O3 优化等级进行编译,为提升匹配精度,这些漏洞函数也分别以 -O2 和 -O3 级别进行编译,最终得到 20 个漏洞函数样本。随后,研究团队对这些样本进行漏洞搜索,获得 BinSD 系统识别出的潜在相似漏洞函数列表。为了验证搜索结果中前十项(Top-K,K 设为 10 以尽可能多地识别出漏洞函数)是否为真实漏洞,首先比对搜索结果中可执行文件的名称是否与查询函数一致;若匹配,则进一步分析被剥离符号信息后的二进制函数,借助 IDA Pro 工具,将查询函数与搜索结果对应的伪代码片段进行人工比对,以确认漏洞是否真实存在。比对过程主要聚焦于函数体结构的相似性,包括局部变量、程序循环、调用函数以及常量字符串等关键特征。
漏洞搜索结果可以看出:(1)Gemini-skip 表现最为出色,在十个 IoT 固件镜像中成功检测出 24 个漏洞。这一结果与其在相似函数检测中的优异表现相一致,进一步印证了 GNN 架构在 BinSD 任务中的适用性;(2)多个 BinSD 方法在误报率方面仍有待优化。例如,UFE-attention 所报告的所有搜索结果中,仅有四项为真实漏洞,这意味着用户需投入大量人工精力从大量候选中筛选出实际存在的问题;(3)通过设定固定阈值来判断搜索结果是否为真实漏洞并不可行。以 CVE-2014-0195 为例,Gemini-skip 报告的七个可疑漏洞的相似度分数从 0.93 至 0.8 不等,若希望全部覆盖,阈值需低于 0.8。但在处理 CVE-2014-3513 时,其 Top-10 搜索结果的相似度均高于 0.9,然而这些结果无一为真实漏洞。这说明仅凭相似度阈值难以准确判断函数语义是否匹配。总体而言,目前的 BinSD 方法在漏洞检测场景下仍存在明显的改进空间。
许可证违规检测:研究者评估了所选 BinSD 方法是否能够识别闭源 IoT 固件镜像中所包含的 GPL 许可第三方库,例如 OpenSSL。为此,选取了 OpenSSL-1.0.1f 和 Busybox-1.27.0 中的 4 个 ELF 文件作为查询库,这两者在 IoT 固件中具有广泛使用基础。考虑到一个库通常包含大量函数,且库之间的相似性高度依赖于函数层面的相似性,因此,研究以库中所有查询函数的相似度平均值作为查询库与目标库之间的整体相似度得分 𝑆𝑄𝑇。具体做法是:对查询库 𝑄 中的每一个函数 𝑓,在目标库 𝑇 中进行检索,记录其 Top-1 相似度得分 𝑠𝑓,随后对所有 𝑠𝑓 取平均,得出 𝑆𝑄𝑇。通过这种方式,研究团队将查询库与 IoT 固件中的所有目标库进行比对,并根据相似度得分对所有目标库进行排序,最终记录与查询库最相似的目标库在排序中的位置,以评估 BinSD 方法在识别潜在许可证违规行为中的效果。
实验结果可以看出:(1)AI 驱动的 BinSD 方法在许可证违规检测任务中整体表现较好。其中,BinaryAI-bert2、Gemini-skip、VulSeeker、SAFE 和 UFE-attention 分别在 Top-1 排名中识别出 15、11、6、2 和 0 个查询 ELF 文件;(2)在所有评估的 BinSD 方法中,BinaryAI-bert2 能识别出最多的 GPL 第三方库。其原因在于,与漏洞检测任务相比,许可证检测中每个函数的检索库规模更小(目标函数通常仅限于目标库内部,数量一般不超过几千),在这种情况下,控制流图(CFG)的邻接矩阵作为特征表现更具区分度,因为在较小的函数集合中,很少存在多个不同函数具备极其相似的邻接结构;(3)相较于漏洞检测,所评估的五种 BinSD 方法在许可证检测中展现出更高的匹配准确率。例如,BinaryAI-bert2 能将大多数与查询库相似的目标库排入前三名。根本原因在于,漏洞检测依赖于对单个函数对的高精度识别,而这一点对现有 BinSD 方法仍是挑战;而许可证检测则基于整个程序函数集合的统计性相似度评估,因而更容易取得良好效果。整体而言,目前的 BinSD 工具在许可证违规检测场景下展现出较强的应用潜力。
总结由预处理,中间表示,嵌入构成的三阶段框架,由于BinSD中神经网络仅作为工具,因此个人感觉研究的方向应该集中在预处理和中间表示。
相关文章:
论文学习_Understanding the AI-powered Binary Code Similarity Detection
摘要:近年来,AI驱动的二进制代码相似性检测(Binary Code Similarity Detection, 简称 BinSD)已广泛应用于程序分析领域。该技术通过神经网络将复杂的二进制代码比较问题转化为代码嵌入向量之间的距离度量。然而,由于现…...
使用PHP对接日本股票市场数据
本文将介绍如何通过StockTV提供的API接口,使用PHP语言来获取并处理日本股票市场的数据。我们将以查询公司信息、查看涨跌排行榜和实时接收数据为例,展示具体的操作流程。 准备工作 首先,请确保您已经从StockTV获得了API密钥,并且…...
(vue)el-steps从别的页面跳转进来怎么实现和点击同样效果
(vue)el-steps从别的页面跳转进来怎么实现和点击同样效果 需求: 解决思路:监听路由,给active赋值对应下标 组件: <el-steps:active"active"finish-status"process"class"steps custom-steps":…...
什么是原码和补码
补码的本质确实是模运算(Modular Arithmetic),这是理解补码为何能统一加减法的核心数学原理。下面用最通俗的语言和例子解释清楚: —### 1. 先理解什么是“模运算”- 模运算就是“周期性计数”,比如钟表: -…...
vscode 同一个工作区,不同文件夹之间跳转问题
你说的问题,其实和 VS Code 的「工作区」机制、c_cpp_properties.json、compile_commands.json 或 LSP 后端(如 clangd)的索引行为有关。 ⸻ 📌 你的现象总结: 操作方式 是否能跳转 说明 打开整个上层文件夹&#x…...
嵌入式学习--江协51单片机day5
江协每个模块的学习都是第一集讲原理,第二集将简单应用。如果比较着急的,可以不看第一集,只要明白怎么用就行。 今天学习DS1302时钟和蜂鸣器 DS1302 内部原理图,DS1302是有内部电源,电源的引脚名要注意 这两个原理图…...
记录算法笔记(2025.5.13)二叉树的最大深度
给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3 示例 2: 输入:root [1,null,2] …...
关于github使用总结
文章目录 一、本地使用git(一)创建一个新的本地Git库首先在本地创建一个新的git仓库然后进行一次初始提交提交过后就可以查看提交记录 (二)在本地仓库进行版本恢复先执行 git log 查看项目提交历史使用 git checkout 恢复版本 二、…...
进程与线程:09 进程同步与信号量
课程引入:进程同步与信号量 接下来这节课开始,我们再开始讲多进程图像。讲多进程图像的下一个点,前面我们讲清楚了多进程图像要想实现切换,调度是如何做的。同时,多个进程放在内存中,就会存在多进程合作的…...
鸿蒙 Core File Kit(文件基础服务)之简单使用文件
查看常用的沙箱目录 应用沙箱文件访问关系图 应用文件目录结构图 Entry Component struct Index {build() {Button(查看常用的沙箱目录).onClick(_>{let ctx getContext() // UI下只能使用这个方法,不能 this.contextconsole.log(--应用缓存文件保存目录&#x…...
游戏引擎学习第277天:稀疏实体系统
回顾并为今天定下基调 上次我们结束的时候,基本上已经控制住了跳跃的部分,达到了我想要的效果,现在我们主要是在等待一些新的艺术资源。因此,等新艺术资源到位后,我们可能会重新处理跳跃的部分,因为现在的…...
基于Win在VSCode部署运行OpenVINO模型
一、准备工作 1、Python 下载Win平台的Python安装包,添加环境变量,测试: python --version 在VSCode里( CtrlShiftP 打开命令面板),指定Python解释器为上面安装路径。写一个python脚本运行测试。 2、虚…...
关于maven的依赖下不下来的问题
相信大家对于maven下不下依赖会感到很烦,这里就来给大家进行解惑。 首先maven依赖报错基本是两种情况,一个是下载报错,这种情况就要考虑是否在maven的setting.xml文件中配了阿里云的相关配置没,其次就要检查是否真的存在这个依赖…...
按键精灵ios脚本新增元素功能助力辅助工具开发(一)
元素节点功能(iOSElement) 在按键精灵 iOS 新版 APP v2.2.0 中,新增了元素节点功能 iOSElement,该功能包含共 15 个函数。这一功能的出现,为开发者在处理 iOS 应用界面元素时提供了更为精准和高效的方式。通过这些函…...
【数据结构】——栈和队列OJ
一、有效的括号 题目链接: 20. 有效的括号 - 力扣(LeetCode) 题目的要求很简单,就是要求我们判断其输入的括号字符串是否是有效的括号,那么我们要如何判断呢? 我们可以这样,我们遍历出传入的…...
Windows部署LatentSync唇形同步(字节跳动北京交通大学联合开源)
#工作记录 一、前言 LatentSync:基于音频驱动的端到端唇形同步框架 LatentSync是由ByteDance开源的一个先进唇形同步框架,旨在通过音频条件驱动的潜在扩散模型实现高精度的唇形同步。与传统基于像素空间扩散或两阶段生成的方法不同,Late…...
MySQL:关系模型的基本理论
系列文章目录 1.关系模型的基本概念 2.数据库的完整性 文章目录 系列文章目录前言一、关系模型的基本概念 1.基本术语: 2.关系的特征二、数据库的完整性 1.常见用例:2.三类完整性原则3.MySQL提供的约束 三、触发器 1.触发器的定义 2.…...
9.1 C#控制SW中零件的变色与闪烁
本文介绍:装配件中某零件隐藏与显示、零件的颜色修改。 探讨本话题的目的是为了实现如下目的:如果某个气缸报警,那么3D中该气缸红色并闪烁。 目前,当勾选部件1闪烁时,零件1-1将在显示与隐藏之间闪烁。 示例代码放到如下位置: C#与solidworks示例1-零部件的显示与隐藏资源…...
Spring Boot 跨域问题全解:原理、解决方案与最佳实践
精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、跨域问题的本质 1.1 什么是跨域? 跨域(Cross-Origin)问题源于浏览器的同源策略(Same-Origin Policy&…...
C++学习之路,从0到精通的征途:继承
目录 一.继承的概念及定义 1.继承的概念 2.继承的定义 (1)继承的定义格式 (2)继承基类成员访问方式的变化 二.基类与派生类间的转换 1.派生类对象赋值给基类的引用/指针 2. 派生类对象直接赋值给基类对象 三.继承的作用域 四.派生类的默认成员函数 1.构造函数 2.拷…...
从零开始掌握FreeRTOS(2)链表之节点的定义
目录 节点 节点定义 节点实现 根节点 根节点定义 精简节点定义 根节点实现 在上篇文章,我们完成了 FreeRTOS 的移植。在创建任务之前,我们需要先了解FreeRTOS的运转机制。 FreeRTOS是一个多任务系统,由操作系统来管理执行每个任务。这些任务全都挂载到一个双向循…...
C 语言_常见排序算法全解析
排序算法是计算机科学中的基础内容,本文将介绍 C 语言中几种常见的排序算法,包括实现代码、时间复杂度分析、适用场景和详细解析。 一、冒泡排序(Bubble Sort) 基本思想:重复遍历数组,比较相邻元素,将较大元素交换到右侧。 代码实现: void bubbleSort(int arr[], i…...
LamaIndex rag(增强检索)入门
LamaIndex RAG 搭建 lamaindex rag 的简单是例 from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.core import Settings,SimpleDirectoryReader,VectorStoreIndex from llama_index.llms.huggingface import HuggingFaceLLM#初始化一个…...
七、深入 Hive DDL:管理表、分区与洞察元数据
作者:IvanCodes 日期:2025年5月13日 专栏:Hive教程 内容导航 一、表的 DDL 操作 (非创建)二、分区的 DDL 操作三、洞察元数据:SHOW 命令的威力结语:DDL 与 SHOW,Hive 管理的双翼练习题一、选择题二、代码题…...
SQLMesh信号机制详解:如何精准控制模型评估时机
SQLMesh的信号机制为数据工程师提供了更精细的模型评估控制能力。本文深入解析信号机制的工作原理,通过简单和高级示例展示如何自定义信号,并提供实用的使用技巧和测试方法,帮助读者优化数据管道的调度效率。 一、为什么需要信号机制…...
STM32 __main汇编分析
在STM32的启动流程中,__main是一个由编译器自动生成的C标准库函数,其汇编级调用逻辑可通过启动文件(如startup_stm32fxxx.s)观察到,但具体实现细节被封装在编译器的运行时库中。以下是其核心逻辑解析: 一、…...
Google Earth Engine(GEE) 代码详解:批量计算_年 NDVI 并导出(附 Landsat 8 数据处理全流程)
一、代码整体目标 基于 Landsat 8 卫星数据,批量计算 2013-2020 年研究区的 NDVI(归一化植被指数),实现去云处理、数据合成、可视化及批量导出为 GeoTIFF 格式,适用于植被动态监测、生态环境评估等场景。 二、代码分步解析(含核心原理与易错点) 1. 加载并显示研究区边…...
【漫话机器学习系列】257.填补缺失值(Imputing Missing Values)
数据科学必备技能:填补缺失值(Imputing Missing Values) 在数据分析和机器学习项目中,缺失值(Missing Values) 是非常常见的问题。缺失的数据如果处理不当,会严重影响模型的训练效果࿰…...
c 中的哈希表
哈希是一种可以接受各种类型、大小的输入,输出一个固定长度整数的过程。你可以将哈希理解成一种特殊的映射,哈希映射,将一个理论无限的集合A映射到有限整数集合B上。 哈希函数:哈希函数是哈希过程的核心,它决定了哈希映…...
AI空域调度系统的社会角色与伦理边界
当AI空域调度系统成为城市运行不可或缺的一部分,其角色已不再是单纯的技术工具,而逐步具备了社会属性。平台既作为智能基础设施的调度中枢,也承担起数据治理、行为规训和公共资源分配等功能。本章聚焦AI调度系统的“类政府性”角色崛起&#…...
pringboot3+vue3融合项目实战-大事件文章管理系统-文章分类列表
GetMappingpublic Result <List<Category>>list(){List<Category> list categoryService.list();return Result.success(list);}然后在categoryservice接口新增 List list(); 然后再categoryserviceimpl实现类里面加入 Overridepublic List<Category&g…...
关于cleanRL Q-learning
内置变量 内置变量是由编程语言解释器或运行时环境预定义的变量。它们通常用于提供程序的元信息(如文件路径、模块名称)或控制程序行为。在 Python 中,内置变量通常以双下划线开头和结尾,例如 __file__、__name__。 以下是一些常…...
Electron-Vue3、Electron-React、Electron-Angular打造舆情监控系统项目
Electron是一个跨平台的桌面应用开发框架,可以让我们用html css js的技术开发跨平台桌面上可以安装的软件。视频详解: Electron教程 ElectronVue跨平台桌面软件开发教程-2024年更新(大地老师) 从Electron环境搭建开始到手把手教你调试、Elect…...
STM32 修炼手册
第一章 计算机体系结构(了解) 后续在板子上开发的时候,需要考虑是否有操作系统 方式一:有操作系统,通过c库通过os api操作硬件方式二:无操作系统, 通过c库通过固件库操作硬件 第二章 STM32开发板概述 板子/开发板&…...
React vs Vue:点击外部事件处理的对比与实现
React vs Vue:点击外部事件处理的对比与实现 在 Web 应用中,“点击外部事件监听”是一种常见需求,典型应用如:点击弹窗外部关闭弹窗、点击下拉菜单外关闭菜单。虽然在 React 和 Vue 中实现的原理类似——都是通过监听 document 的…...
rk3576--- HDMI CEC唤醒
文章目录 一、CEC唤醒的相关概念二、CEC唤醒实现(一)内核配置(二)设备树dts(三)驱动注册中断(四)休眠后开启MCU(五)验证 一、CEC唤醒的相关概念 CEC 是一种在…...
榕壹云搭子系统技术解析:基于Spring Boot+MySQL+UniApp的同城社交平台开发实践
一、引言 本文将分享一款基于Spring Boot、MySQL和UniApp开发的同城社交平台的技术实现细节,重点探讨其架构设计、核心功能及开发过程中的技术考量。该项目旨在为开发者提供可扩展的社交平台解决方案,支持快速二次开发与独立部署。 二、技术选型与架构设计 1. 技术栈概览 …...
Node.js事件循环中的FIFO原则
1. Node.js事件循环中的FIFO原则 Node.js的事件循环确实遵循先进先出(FIFO)原则,但这个原则的适用范围需要明确。具体来说: FIFO原则的适用范围:FIFO原则主要适用于每个阶段内部的任务队列,而不是跨越不同…...
基于javaweb的SpringBoot爱游旅行平台设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
服务器相关
虚拟机服务器搭建 virtualbox安装 下载地址:Downloads – Oracle VirtualBox centos镜像下载地址 centos-7-isos-x86_64安装包下载_开源镜像站-阿里云 阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 清华大学开源软件镜像站 | Tsinghua Open Source Mirror…...
Linux的文件查找与压缩
查找文件 find命令 # 命令:find 路径范围 选项1 选项1的值 \[选项2 选项2 的值…]# 作用:用于查找文档(其选项有55 个之多)# 选项:# -name:按照文档名称进行搜索(支持模糊搜索,\* &…...
Q1财报持续向好,腾讯音乐如何在不确定中寻找确定性?
最近一段时间,各家上市公司的财报都备受关注,腾讯音乐娱乐集团作为文娱类的头部企业也是备受市场关注的,今日腾讯音乐第一季度财报已公布,业绩持续向好。在这个不确定性的大环境下,腾讯音乐是如何寻找自己的确定性的&a…...
window 显示驱动开发-报告图形内存(一)
计算图形内存 在 VidMm 能够向客户端报告准确的帐户之前,它必须首先计算图形内存的总量。 VidMm 使用以下内存类型和公式来计算图形内存: 系统总内存 此值是操作系统可访问的系统内存总量。 BIOS 分配的内存不会出现在此数字中。 例如,一台…...
DELL R770 服务器,更换RAID卡教程!
今天的任务,是帮客户的一台戴尔DELL PowerEdge R770 服务器,更换RAID卡(也可以称之为PERC模块、阵列卡、RAID控制器等)。 根据我的个传统习惯,依然是顺便做一个教程,分享给有需要的粉丝们。如果看完教程&am…...
【Java】网络编程(Socket)
网络编程 Socket 我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则使用套接字Socket来进行分离 套接字就像是传输层为应用层开的一个小口,应用程…...
力扣-226.翻转二叉树
题目描述 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 class Solution { public:TreeNode *invertTree(TreeNode *root) {if (!root) {return NULL;}TreeNode *temp root->right;root->right root->left;root->left …...
数据结构——例题1
eg1:求解 S 1! 2! 3! ... n! #include<stdio.h> #include<stdlib.h>long sum(int n){long s 0,t,i,j;for(i1;i<n;i){t1;for(j1;j<i;j){t*j;}st;}return s; }int main(){int n;printf("请输入一个整数:");scanf("…...
INT202 Complexity of Algroithms 算法的复杂度 Pt.7 NP-Completeness NP完全性
文章目录 1.P与NP问题1.1 计算上难以解决的问题(Hard Computational Problems)1.2 决策问题和优化问题(Decision/Optimization problems)1.3 计算问题的正式定义1.4 复杂性类1.4.1 复杂性类 P P P1.4.2 证明(Certifica…...
K8s 图形界面管理kubesphere
1. 概述 KubeSphere 是一个开源的、基于 Kubernetes 的容器平台,旨在简化企业级 Kubernetes 集群的部署、管理和运维。KubeSphere 提供了丰富的功能,包括多租户管理、DevOps 流水线、应用商店、监控与日志、服务网格、网络策略等,帮助企业快…...
MCU程序加密保护(一)闪存读写保护法 加密与解密
MCU(微控制器单元)的加密方法可以从硬件、软件和通信协议三个层面来理解。以下是常见的MCU加密手段,按类型分类说明: 针对目前 STM32 系列微控制器在程序加密保护方面手段单一、保护效果有限的问题,本文介绍并分析了四…...