编写一个llvm编译器插件,完成在store汇编指令前对内存合法性的check。

news2024/11/17 21:30:00

dds(iceoryx、fastdds等)中间件采用了共享内存,如果app内存越界将共享内存踩踏坏了,将会形成灾难。本插件可以检测到app是否在写共享内存,如果是,我们可以让app assert。从而提高dds的稳定性

插件效果:

插件源码:

#include "llvm/Pass.h"

#include "llvm/IR/Function.h"

#include "llvm/IR/BasicBlock.h"

#include "llvm/IR/Instructions.h"

#include "llvm/Support/raw_ostream.h"

#include "llvm/Pass.h"

#include "llvm/IR/Constants.h"

#include "llvm/Support/CommandLine.h"

#include "llvm/IR/IRBuilder.h"

#include "llvm/IR/Value.h"

#include "llvm/IR/Module.h"

#include "llvm/IR/Function.h"

#include "llvm/IR/BasicBlock.h"

#include "llvm/IR/Instruction.h"

#include "llvm/IR/Instructions.h"

#include "llvm/Support/raw_ostream.h"

#include "llvm/IR/IntrinsicInst.h"

using namespace llvm;

namespace {

struct InsertStubPass : public FunctionPass {

static char ID;

const char *LOG_FUNCTION_STR = "log_function_call"; // 日志打印函数调用

InsertStubPass() : FunctionPass(ID) {}

bool runOnFunction(Function &F) override {

errs().write_escaped(F.getName()) << "-----------\n";

if(F.getName() != "init_ring_buffer")

return true;

// 字符串类型

Type *StringType = Type::getInt8PtrTy(F.getParent()->getContext());

// void type

Type *voidTy = Type::getVoidTy(F.getParent()->getContext());

bool isVarArg = false;

std::vector<Type*> functionCallParams;

functionCallParams.push_back(StringType);

FunctionType *functionCallType = FunctionType::get(

voidTy, functionCallParams, isVarArg

);

F.getParent()->getOrInsertFunction(LOG_FUNCTION_STR, functionCallType);

Function *logFunction = F.getParent()->getFunction(LOG_FUNCTION_STR);

for (BasicBlock &BB : F) {

for (Instruction &I : BB) {

errs() << I << "+++\n";

// 检查是否为mov指令

if ( auto *MOV = dyn_cast<StoreInst>(&I) ) {

errs().write_escaped("store ins") << "-----------\n";

// 在mov指令前插入一个空的call指令作为插桩

IRBuilder<> builder(MOV);

// ReturnInst i;

Value *PointerOperand = MOV->getPointerOperand();

errs() << "Store address: " << *PointerOperand << "\n";

Value *AddrOp = builder.CreatePointerCast(PointerOperand, builder.getInt8PtrTy());

// 该函数的指针变量

// Value *strPointer = builder.CreateGlobalStringPtr(f.getName());

// 自己定义的 日志函数

std::vector<Value *> args;

args.push_back(AddrOp); // 生成日志函数 的参数列表

// 创建自己的日志函数 并传入 本函数的函数指针

CallInst::Create(logFunction, args, "", MOV);

// 可以在这里添加插桩的相关信息,例如标记插桩的名称或其他属性

// StubCall->setName("stub_instruction");

// 如果需要追踪插桩的执行情况,可以在这里添加分析或者断言

// e.g., llvm::Assume(Builder.CreateICmpEQ(StubCall, StubCall));

}

}

}

return true;

}

};

}

char InsertStubPass::ID = 0;

static RegisterPass<InsertStubPass> X("insert-stub", "Insert a stub instruction before mov instructions", false, false);

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024 年 5 种领先的小语言模型:Phi 3、Llama 3 等

2024 年 5 种领先的小语言模型&#xff1a;Phi 3、Llama 3 等 近年来&#xff0c;GPT-3 和 BERT 等大型语言模型的发展改变了人工智能的格局&#xff0c;它们以其强大的功能和广泛的应用而闻名。 然而&#xff0c;除了这些巨头之外&#xff0c;一种新的 AI 工具类别也正在掀起…

Windows环境下训练OpenCV分类器

文章目录 1、Windows下安装OpenCV及依赖库2、获取opencv_createsamples.exe和opencv_traincascade.exe3、准备样本文件正负样本描述文件生成5、训练分类器5.1、使用opencv_createsamples.exe生成positives.vec文件5.2、使用opencv_traincascade.exe训练分类器 1、Windows下安装…

浅谈AI大模型的数据特点和应用问题

【摘要】AI大模型的训练、推理及应用落地都需要大量的数据&#xff0c;其数据具有参数和数据量大、质量要求高、行业垂直属性强、资源消耗大等特点&#xff0c;由此带来的个人隐私泄露、数据中毒、数据篡改等数据安全风险已成为业界必须应对的重要议题。目前大模型的规模化应用…

怎么用二维码看excel表格?生成文件二维码的制作技巧

Excel表格怎么放到二维码中&#xff0c;让其他人通过扫码查看数据呢&#xff1f;现在文件放入二维码中展示在很多的场景中都有应用&#xff0c;比如通知、数据、作品、报告等类型的内容都可以通过扫码的方式在手机上展现&#xff0c;那么如何将文件生成二维码呢&#xff1f; 文…

VUE-watch和watchEffect的区别

区别简短扼要地说&#xff1a; watch-官方定义&#xff1a;侦听一个或多个响应式数据源&#xff0c;并在数据源变化时调用所给的回调函数。是需要指定监听的数据&#xff0c;并且只有在响应式数据变化的时候去执行 watchEffect-官方定义&#xff1a;立即运行一个函数&#xff0…

VUE3和VUE2

VUE3和VUE2 上一篇文章中&#xff0c;我们对VUE3进行了一个初步的认识了解&#xff0c;本篇文章我们来进一步学习一下&#xff0c;顺便看一下VUE2的写法VUE3是否能做到兼容&#x1f600;。 一、新建组件 我们在components中新建一个组件&#xff0c;名称为Peron&#xff0c;…

ARM-2

c语言实现三盏灯的控制 #ifndef __LED_H__ #define __LED_H__typedef struct {volatile unsigned int MODER;volatile unsigned int OTYPER;volatile unsigned int OSPEEDER;volatile unsigned int PUPDR;volatile unsigned int IDR;volatile unsigned int ODR;volatile unsig…

@ApiModelProperty失效问题,和Freemaker自定义MybatisPlus模板

MybatisPlus生成模板&#xff0c;修改&#xff0c;set get方法的影响&#xff0c; 手动去掉getset方法加上Lombok注解 Size读取text类型为-1的长度bug&#xff0c; 去掉id不能为空NotNull的校验 &#xff08;增加lombok注解&#xff0c;TableField注解自动填充&#xff0c;…

基于EBAZ4205矿板的图像处理:09基于sobel边缘检测的图像锐化

基于EBAZ4205矿板的图像处理&#xff1a;09基于sobel边缘检测的图像锐化 项目全部文件 随后会上传项目全部文件 先看效果 锐化的有点过头了&#xff0c;不过我也懒得改了&#xff0c;想要改也很简单&#xff0c;无非就是给卷积运算后的结果加个系数&#xff0c;通过改系数调…

学习Uni-app开发小程序Day17

今天开始&#xff0c;就把uni-app前期使用的全部学完了&#xff0c;现在就把以前学习的&#xff0c;做成一案例&#xff0c;中间有未讲的&#xff0c;在进行补充&#xff0c;这里是根据老师视频进行项目案例编写的。 先弄出效果图&#xff0c;然后在根据效果图进行代码的编辑 …

Android:使用Kotlin搭建MVP架构模式

一、简介Android MVP架构模式 MVP全称&#xff1a;Model、View、Presenter&#xff1b; View&#xff1a;负责视图部分展示Model&#xff1a;负责数据的请求、解析、过滤等数据层操作。Presenter&#xff1a;View和Model交互的桥梁。对应MVC中的C&#xff08;controller&#x…

AJAX(JQuery版本)

目录 前言 一.load方法 1.1load()简介 1.2load()方法示例 1.3load()方法回调函数的参数 二.$.get()方法 2.1$.get()方法介绍 2.2详细说明 2.3一些例子 2.3.1请求test.php网页并传送两个参数 2.3.2显示test返回值 三.$.post()方法 3.1$.post()方法介绍 3.2详细说明 …

Debug-010-git stash的用法及使用场景

问题原因&#xff1a; 其实也不是最近&#xff0c;就是之前就碰到过这个问题&#xff0c;那就是我正在新分支开发新功能&#xff0c;开发程度还没有到可以commit的程度&#xff0c;我不想提交(因为有些功能没有完全实现&#xff0c;而且没有自测的话很容易有问题&#xff0c;提…

【C++初阶】—— 类和对象 (下)

&#x1f4dd;个人主页&#x1f339;&#xff1a;EterNity_TiMe_ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 类和对象 1. 运算符重载运算符重载赋值运算符重载前置和后置重载 2. 成员函数的补充3. 初始化列…

Python 调整PDF文件的页面大小

在处理PDF文件时&#xff0c;我们可能会遇到这样的情况&#xff1a;原始PDF文档不符合我们的阅读习惯&#xff0c;或者需要适配不同显示设备等。这时&#xff0c;我们就需要及时调整PDF文档中的页面尺寸&#xff0c;以满足不同应用场景的需求。 利用Python语言的高效性和灵活性…

SOLIDWORKS二次开发服务商 慧德敏学

SOLIDWORKS是一套三维设计软件, 采用特征建模、变量化驱动可方便地实现三维建模、装配和生成工程图。SOLIDWORKS软件本身所具有的交互方式, 可以使用户对已生成模型的尺寸、几何轮廓和相互约束关系随时进行修改, 而不需要编程。但要实现设计意义上的变量化绘图和系列化设计, 需…

89.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-游戏中使用的哈希算法逆向分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

4K高刷显示器 - 10大产品对比

4K高刷显示器 - 蚂蚁电竞 N27U 显示屏评测报告 一、产品品牌知名度 蚂蚁电竞&#xff0c;作为一家专注于电竞领域的品牌&#xff0c;近年来在市场上逐渐崭露头角。虽然相较于一些老牌显示器品牌&#xff0c;蚂蚁电竞的知名度还有待提高&#xff0c;但其在电竞领域的表现却不容…

C++数据结构——哈希表

前言&#xff1a;本篇文章将继续进行C数据结构的讲解——哈希表。 目录 一.哈希表概念 二.哈希函数 1.除留取余法 三.哈希冲突 1.闭散列 线性探测 &#xff08;1&#xff09;插入 &#xff08;2&#xff09;删除 2. 开散列 开散列概念 四.闭散列哈希表 1.基本框架 …

Excel实现将A列和B列的内容组合到一个新的列(例如C列)中,其中A列的每个值都与B列的所有值组合。

利用Excel中vba代码宏实现 原始数据&#xff1a; 自动生成后数据&#xff1a; vba实现代码&#xff1a; Sub CombineColumns()Dim ws As WorksheetDim lastRowA As Long, lastRowB As Long, i As Long, j As LongDim MyIndex As IntegerDim strCombine As String, strColA As…