首页 > 其他分享 >codeQL 笔记

codeQL 笔记

时间:2023-07-24 17:36:46浏览次数:41  
标签:闭包 predicate parentOf codeQL 笔记 Person result 谓词

codeQL

CodeQL是一种代码分析引擎,通过CodeQL可以根据已知的安全漏洞,在其他源代码中查找相似的安全问题。

谓词

定义方式类似于函数,和Java有点像的是在定义的时候需要指定是否有返回值,如果有返回值则需要以返回类型开头,如果没有返回值,则使用predicate开头

predicate southern(Person p) {
	p.getLocation() = "south"
}
int getAge(Person p) {
	result = 18
} 

递归

普通递归
Person ancestorOf(Person p) {
    result = parentOf(p) or
    result = parentOf(ancestorOf(p))
}

这种方式称为操作的传递闭包,再处理传递闭包时,+和*有特殊用法

  • parentOf+(p),这表示对变量p应用一次或多次谓词parentOf(),它等价于ancestorOf(p)
  • parentOf*(p),表示对变量p应用零次或多次谓词parentOf(),因此,它要么返回变量p的祖先,要么返回p本身
相互递归
int getAnEven() {
  result = 0
  or
  result <= 100 and result = getAnOdd() + 1
}
 
int getAnOdd() {
  result = getAnEven() + 1
}
 
select getAnEven()

闭包

传递闭包

使用的符号还是+和*

如果要将某个谓词应用一次或多次,可以在谓词名称后面加上”+“

假设我们定义了一个带有成员谓词getAParent()的类Person,那么p.getAparent()只会返回p的父辈。而传递闭包p.getAparent+()则会返回p的父辈、p的父辈的父辈,等等。

Person getAnAncestor() {
  result = this.getAParent()
  or
  result = this.getAParent().getAnAncestor()
}

自反传递闭包运算符*

和传递闭包的作用相似,不过使用*是将一个谓词用于自身零次或多次

比如p.getAparent*()的返回结果可能是p的父类或者p本身

显式定义为

Person getAnAncestor2() {
  result = this
  or
  result = this.getAParent().getAnAncestor2()
}

对于QL语言来说,可以用类表示一个逻辑属性:当一个值满足该属性时,它就是类的成员,这说明一个值可能是多个类的成员。

在codeQL中也有方法重写,就是重新定义父类中的成员谓词

class Child extends Person {
 
    /* the characteristic predicate */
    Child() { this.getAge() < 10 }
 
    /* a member predicate */
    override predicate isAllowedIn(string region) {
        region = this.getLocation()
    }
}

标签:闭包,predicate,parentOf,codeQL,笔记,Person,result,谓词
From: https://www.cnblogs.com/pr1s0n/p/17577823.html

相关文章

  • 尚硅谷 k8s 学习笔记
    K8S进阶部分       1.Deployment部署           1.1自愈能力           1.2多副本           1.3扩容、缩容           1.4滚动更新           1.5版本回退           1.6工作负载  ......
  • 128MTT 学习笔记
    标题是我乱起的名字。在做某题时受到了启发,想出了一种之前没听说过的MTT,在某谷上一问发现有人和我想的一样,立马去学了。这种方法,我叫它128MTT,它用到了科技__int128。主要思想就是找一个\(10^{27}\)以上的大NTT模数,全程使用__int128做NTT。然而longlong取模尚能用......
  • VUEX笔记
    VUEX笔记statestate:{ ip:''}gettersconstgetters={ ip:state=>state.ip}mutations同步操作this.$store.commit()mutations:{ SET_IP:(state,ip)=>{ state.ip=ip }}actions异步操作this.$store.dispatch()Action类似于mutati......
  • TED Talk 学习笔记
    Howtospeaksothatpeoplewanttolisten|JulianTreasureAvoid:gossipjudgingnegativitycomplaning:viralmiseryexcuseslying:embroidery,exaggerationdogmatism:bombardsomebodyCornerstones/Foundations:HAIL,togreetoracclaimenthusiasitcal......
  • Lombok笔记
    Lombok项目是一个java库,它可以自动插入到编辑器和构建工具中,增强java的性能。不需要再写getter、setter或equals方法,只要有一个注解,就有一个功能齐全的构建器、自动记录变量等等。使用步骤:1:安装插件2:导入架包<dependencies><dependency><groupId>org.projectlomb......
  • AirNet使用笔记8
    摘要:SDD显示多监视源航迹;1、SDD同时显示多监视源航迹,在“DataSource”选择。.sdd_offline.conf.0不加点不是隐藏文件也行。[root@ACC-3conf]#more/home/cdatc/AirNet/bin/conf/.sdd_offline.conf.0B_OPS_IS_MAINTAIN=1......
  • C#中的重写与多态知识点整理(刘铁锰老师课堂笔记)
    在C#中,重写(Override)和多态(Polymorphism)是面向对象编程中的重要概念。通过重写和多态,我们可以更好地组织和管理代码,提高代码的可维护性和可扩展性。重写(Override)重写是指在派生类中重新实现基类中已经定义的方法。通过重写一个方法,我们可以为派生类中的该方法提供新的实现,同时让......
  • 【js学习笔记五十二】weakmap的应用
     目录前言导语 代码部分前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语WeakuMap编辑 代码......
  • 【js学习笔记五十一】weakmap
     目录前言导语 代码部分前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语WeakMap编辑 代码部......
  • c#学习笔记,实现物联网MQTT通信
    一、什么是MQTT MQTT协议由于其用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务,具有开销低、占用带宽低、即时通讯等优点,使其在物联网、小型设备、移动应用等方面有较广泛的应用,在工业物联网中,MQTT也有广泛的应用。主要有以下特点:使用发布/订阅消息模式,提供......