control-flag

control-flag

自监督系统检测代码控制结构异常

control-flag是一种自监督异常模式检测系统,通过挖掘开源代码库中C/C++等高级语言的控制结构,学习典型模式并检测用户代码中的异常。该系统包含模式挖掘和异常扫描两个阶段,可用于发现拼写错误、缺失NULL检查等问题,有助于识别代码潜在缺陷并提升软件质量。

ControlFlagGitHub自监督学习代码分析异常检测Github开源项目

友好请求:感谢您访问 control-flag GitHub 仓库!如果您觉得 control-flag 有用,我们很感谢您能给我们留言(发送至 niranjan.hasabnis@intel.com)。当然,我们也非常欢迎您的推荐!

-- ControlFlag 团队

linux 构建和测试 linux 样式检查 macos 构建和测试 macos 样式检查 GitHub 许可证

ControlFlag:一个自监督的特异模式检测系统,用于软件控制结构

ControlFlag 是一个自监督的特异模式检测系统,它通过挖掘开源仓库(在 GitHub 和其他版本控制系统上)中的模式,学习高级编程语言(如 C/C++)控制结构中出现的典型模式。然后,它将学习到的模式应用于检测用户代码中的异常模式。

简要技术描述

ControlFlag 的模式异常检测系统可用于各种问题,如拼写错误检测、标记缺失的 NULL 检查等。这个概念验证演示了 ControlFlag 在拼写错误检测中的应用。

下图显示了 ControlFlag 的两个主要阶段:(1)模式挖掘阶段,和(2)扫描异常模式阶段。模式挖掘阶段是一个"训练阶段",它从用户提供的 GitHub 仓库中挖掘典型模式,然后从挖掘的模式构建决策树。另一方面,扫描阶段将挖掘的模式应用于标记用户指定目标仓库中的异常表达式。

ControlFlag 设计

更多详细信息可以在我们的 MAPS 论文中找到(https://arxiv.org/abs/2011.03616)。

目录结构(不断演进)

  • src:ControlFlag 用于拼写错误检测系统的源代码
  • scripts:用于模式挖掘和扫描异常的脚本
  • quick_start:运行快速启动测试的脚本
  • github:用于下载 GitHub 仓库的脚本和数据
  • tests:单元测试

安装

ControlFlag 可以在 Linux 和 MacOS 上构建。

要求

  • CMake 3.4.3 或更高版本
  • 兼容 C++17 的编译器
  • Tree-sitter 解析器(作为 cmake 的一部分自动下载)
  • GNU parallel (可选,如果你想生成自己的训练数据)

在基于 Linux 的系统上测试过的构建配置

  • CentOS-7.6/Ubuntu-20.04 with g++-v10.2.0 for x86_64

在 MacOS 上测试过的构建配置

  • MacOS Mojave v10.14.6 with clang-1001.0.46.4 (Apple LLVM version 10.0.1) for x86_64 (从命令行工具包获得)

构建

$ cd control-flag
$ cmake .
$ make -j
$ make test

make test 中的所有测试都应该通过。

使用 ControlFlag

快速开始

使用从多个 GitHub 仓库获得的模式来扫描你选择的仓库

根据你设备的内存限制,下载你感兴趣的语言的训练数据。但请注意,使用较小的数据集可能会导致 ControlFlag 产生的结果准确性降低,并可能增加它生成的假阳性数量。

语言数据集名称磁盘大小内存要求直接链接MD5 校验和
C小型~100MB~400MB链接2825f209aba0430993f7a21e74d99889
C中型~450MB~1.3GB链接aab2427edebe9ed4acab75c3c6227f24
C大型~9GB~13GB链接1ba954d9716765d44917445d3abf8e85
C++小型~200MB~500MB链接f954486e20961f0838ac08e5d4dbf312
C++中型~500MB~1.3GB链接a5c18ea1cdbe354b93aabf9ecaa5b07a
C++大型~1.2GB~3GB链接4f5ffc1ab942eaba399cafd5be8bb45f
PHP小型~120MB~1GB链接5a1cc4c24a20de7dad1b9f40661d517a
$ 从上面的链接下载 <tgz_file>。
$ (可选) md5sum <tgz_file>
$ tar -zxf <tgz_file>

要扫描你选择的 C 代码,使用以下命令:

$ scripts/scan_for_anomalies.sh -d <要扫描异常的目录> -t <训练数据>.ts -o <存储日志文件的输出目录> -l 1

要扫描你选择的 C++ 代码,使用以下命令:

$ scripts/scan_for_anomalies.sh -d <要扫描异常的目录> -t <训练数据>.ts -o <存储日志文件的输出目录> -l 4

一旦运行完成(这可能需要一些时间,取决于你的系统和 ControlFlag 可以扫描的仓库中的程序数量),请参考下面的章节来理解扫描输出

从一个小型仓库挖掘模式并将其应用到另一个小型仓库

在这个 C 语言程序的测试中,我们将从 GitHub 的 Glb-director 项目中挖掘模式,并将它们应用于标记 GitHub 的 brubeck 项目中的异常。

只需运行以下命令:

cd quick_start && ./test1_c.sh

如果一切顺利,你可以在 test1_scan_output 目录中看到扫描器的输出。通过 grep "Potential anomaly" -C 5 *.log 查找其中的 "Potential anomaly" 标签,你应该看到类似下面的输出:

thread_6.log-Level:TWO Expression:(parenthesized_expression (binary_expression ("==") (identifier) (non_terminal_expression))) found in training dataset:
Source file: brubeck/src/server.c:266:5:(s == sizeof(fdsi))
thread_6.log-Autocorrect search took 0.000 secs
thread_6.log:Potential anomaly
thread_6.log-Did you mean:(parenthesized_expression (binary_expression ("==") (identifier) (non_terminal_expression))) with editing cost:0 and occurrences: 1
thread_6.log-Did you mean:(parenthesized_expression (binary_expression ("==") (identifier) (null))) with editing cost:1 and occurrences: 25
thread_6.log-Did you mean:(parenthesized_expression (binary_expression ("==") (identifier) (identifier))) with editing cost:1 and occurrences: 5
thread_6.log-Did you mean:(parenthesized_expression (binary_expression (">=") (identifier) (non_terminal_expression))) with editing cost:1 and occurrences: 3
thread_6.log-Did you mean:(parenthesized_expression (binary_expression ("==") (non_terminal_expression) (non_terminal_expression))) with editing cost:1 and occurrences: 2

brubeck/src/server.c 文件的第 266 行标记了异常。

详细步骤

  1. 模式挖掘阶段 (如果你想自己生成训练数据)

如果你不想自己生成训练数据,请转到下面的评估步骤

在这个阶段,我们挖掘出现在高级语言(如 C 语言)控制结构中的特异模式。这个概念验证从 C 程序中出现的 if 语句中挖掘模式。

如果你想使用自己的仓库来挖掘模式,请跳到步骤 1.2。 1.1 下载星标数超过100的C语言GitHub仓库

以下步骤展示如何下载星标数超过100的C语言GitHub仓库(c100.txt)并生成训练数据。training_repo_dir是一个目录,下面的命令将在其中克隆所有仓库。

$ cd github
$ python download_repos.py -f c100.txt -o <training_repo_dir> -m clone -p 5

1.2 从下载的仓库中挖掘模式

你可以使用自己的仓库来挖掘表达式,只需将其替换<training_repo_dir>即可。

mine_patterns.sh脚本可以帮助完成这个任务。其用法如下:

用法: ./mine_patterns.sh -d <用于挖掘模式的目录> -o <存储训练数据的输出文件>
可选参数:
[-n 用于挖掘的进程数]  (默认值: 系统CPU数)
[-l 源语言编号] (默认值: 1 (C), 支持: 1 (C), 2 (Verilog), 3 (PHP), 4 (C++))
[-g github仓库ID] (默认值: 0) GitHub仓库的唯一标识符(如果有)

我们这样使用它:

$ scripts/mine_patterns.sh -d <training_repo_dir> -o <training_data_file> -l 1

<training_dat_file>包含在指定GitHub仓库中找到的C语言条件表达式及其AST(抽象语法树)表示。如果你想查看,可以将其作为文本文件打开。

评估(或扫描异常)

我们可以运行scan_for_anomalies.sh脚本来扫描感兴趣的目标目录。其用法如下:

用法: ./scan_for_anomalies.sh -t <训练数据> -d <用于扫描异常模式的目录>
可选参数:
 [-c 自动纠正的最大成本]              (默认值: 2)
 [-n 自动纠正的最大结果数] (默认值: 5)
 [-j 扫描线程数]            (默认值: 系统CPU数)
 [-o 输出日志目录]                        (默认值: /tmp)
 [-l 源语言编号]                (默认值: 1 (C), 支持: 1 (C), 2 (Verilog), 3 (PHP), 4 (C++))
 [-a 异常阈值]                     (默认值: 3.0)

作为扫描异常的一部分,如果条件表达式被标记为异常,ControlFlag还会建议可能的纠正。25是纠正的max_cost——建议的纠正应该与可能错误输入的表达式有多接近。增加max_cost会导致提出更多纠正建议。如果你觉得报告的异常数量过高,可以考虑将anomaly_threshold降低到1.0或更低

理解扫描输出

output_log_dir下,你会找到多个日志文件,对应不同扫描线程的输出。潜在异常会以"Potential anomaly"作为标签报告。以下命令将报告至少包含一个异常的日志文件。

$ grep "Potential anomaly" <output_log_dir>/thread_*.log

一个示例异常报告如下所示:

级别:<ONE or TWO> 表达式: <异常表达式的AST>
源文件和行号: <包含异常的源代码表达式及行号>
潜在异常
您是否指的是...

"您是否指的是"后面的文本显示了对异常表达式可能的纠正。

成功案例

为了服务社区,我们经常使用ControlFlag扫描开源软件包。我们在各种开源项目中发现了几个编程错误。以下列出了一些已被各自开发者确认的错误。

问题链接语言错误表达式备注
https://github.com/curl/curl/pull/6193Cif (s->keepon > TRUE)使用>比较变量和布尔值
https://github.com/vrpn/vrpn/issues/263C(l_inbuf[2] | 1), if (l_inbuf[3] | 1)错误使用|而非&
https://github.com/vlm/asn1c/issues/443Cif(!saved_aid && 0)死代码
https://github.com/shoes/shoes3/issues/468Cif ((attr == 39) || (attr = 49))错误使用=而非==
https://github.com/IoLanguage/io/issues/455Cif (UArray_greaterThan_(self, other) | UArray_equals_(self, other))低效使用|而非||
https://github.com/IoLanguage/io/issues/455Cif( ln = (SFG_Node *)node->Next ), if( ln = (SFG_Node *)node->Prev )缺少括号
https://github.com/elua/elua/issues/170Cif (Protection_Level_1_Register &= FMI_Sector_Mask)缺少括号

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多