SPA Knowledge Base issues
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues
2021-12-24T20:48:09+08:00
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/47
污点分析的rules里面,m需要先dispatch后再使用吗
2021-12-24T20:48:09+08:00
Ricolove
污点分析的rules里面,m需要先dispatch后再使用吗
我想直接resolve方法签名,可以吗
我想直接resolve方法签名,可以吗
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/46
taintTransfer四元组的u为什么不是多余的呢
2021-12-22T11:56:22+08:00
Ricolove
taintTransfer四元组的u为什么不是多余的呢
【路人】DZ21330015 李煦阳<ccyy407@qq.com> 2021/12/13 22:16:33
求助,taintTransfer四元组的u为什么不是多余的呢,m和to应该可以唯一确定u呀
![AP1_D__FS71Z4CI_ESW9HRC](/uploads/4f7b88d08e8dbbbb13441d0402b41f84/AP1_D__FS71Z4CI_ESW9HRC.png)
m应该是dispatch过的呀
【路人】DZ21330015 李煦阳<ccyy407@qq.com> 2021/12/13 22:16:33
求助,taintTransfer四元组的u为什么不是多余的呢,m和to应该可以唯一确定u呀
![AP1_D__FS71Z4CI_ESW9HRC](/uploads/4f7b88d08e8dbbbb13441d0402b41f84/AP1_D__FS71Z4CI_ESW9HRC.png)
m应该是dispatch过的呀
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/45
a[3] = 1; a[4] = 2; 那么这个时候 a[NAC] 应该等于什么
2021-12-11T21:44:24+08:00
Ricolove
a[3] = 1; a[4] = 2; 那么这个时候 a[NAC] 应该等于什么
【管理员】助教-陈钦霖(742722969) 20:50:31
nac
【管理员】助教-陈钦霖(742722969) 20:50:31
nac
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/44
不要求跟踪ArrayLengthExp吧
2021-12-11T21:44:06+08:00
Ricolove
不要求跟踪ArrayLengthExp吧
【群主】谭添(236069938) 2021/12/11 12:28:57
arraylength是一元运算符,返回值当成NAC
【群主】谭添(236069938) 2021/12/11 12:28:57
arraylength是一元运算符,返回值当成NAC
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/43
y = T.f 怎么拿到所有相关语句
2021-12-11T21:43:34+08:00
Ricolove
y = T.f 怎么拿到所有相关语句
【管理员】助教-陈钦霖(742722969) 2021/12/10 23:31:20
初始化的时候自己存一下呗
【管理员】助教-陈钦霖(742722969) 2021/12/10 23:31:20
初始化的时候自己存一下呗
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/42
什么时候需要考虑 context?
2021-12-11T21:42:17+08:00
Ricolove
什么时候需要考虑 context?
不需要考虑context。context 只是为了提高分析精度,常量传播用不到。如果没有 context,那么可能会出现假 alias。
不需要考虑context。context 只是为了提高分析精度,常量传播用不到。如果没有 context,那么可能会出现假 alias。
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/41
能从InterSolver调InterConstantPropagation中的新方法吗
2021-12-08T22:58:45+08:00
Ricolove
能从InterSolver调InterConstantPropagation中的新方法吗
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/40
有没有什么办法把staticFieldAccess塞进Fact里
2021-12-08T22:57:48+08:00
Ricolove
有没有什么办法把staticFieldAccess塞进Fact里
【路人】MF21330012 陈振宇(895761580) 2021/12/7 11:51:45
求问一个很基础的问题,有没有什么办法把staticFieldAccess塞进Fact里
还是说根本塞不进去,必须得开一个新的field放staticField的信息
【路人】MF21330012 陈振宇(895761580) 2021/12/7 11:51:45
求问一个很基础的问题,有没有什么办法把staticFieldAccess塞进Fact里
还是说根本塞不进去,必须得开一个新的field放staticField的信息
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/39
一个顺序问题相关的疑问,一个静态复制可能不会立刻引起别名分析变化
2021-12-08T22:56:57+08:00
Ricolove
一个顺序问题相关的疑问,一个静态复制可能不会立刻引起别名分析变化
【路人】181240020 胡俊豪<181240020@smail.nju.edu.cn> 2021/12/5 21:34:24
我有一个顺序问题相关的疑问。比如a=T.f这句话。如果其他很远的地方形如T.f=的static Store语句更新了,按理说下一个该更新的就是这个a=T.f。但是由于a=T.f与T.f=没有edge(离得很远,甚至在不同的方法里),那按照worklist算法,T.f=更新后,可能不会引起a=T.f更新。
A7这个地方的flow insen...
【路人】181240020 胡俊豪<181240020@smail.nju.edu.cn> 2021/12/5 21:34:24
我有一个顺序问题相关的疑问。比如a=T.f这句话。如果其他很远的地方形如T.f=的static Store语句更新了,按理说下一个该更新的就是这个a=T.f。但是由于a=T.f与T.f=没有edge(离得很远,甚至在不同的方法里),那按照worklist算法,T.f=更新后,可能不会引起a=T.f更新。
A7这个地方的flow insensitive可能会引起这样的问题?所以需要多次启动worklist?
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/38
依赖分析的顺序可能会出现错误的结果,这是为什么
2021-12-08T22:50:42+08:00
Ricolove
依赖分析的顺序可能会出现错误的结果,这是为什么
【路人】201870048 张乃仁(793125457) 2021/12/5 20:40:26
我写的A7似乎有点问题:对于 Interprocedural 的 testcase,依赖分析的顺序(也就是语句被加进 WorkList 的顺序)可能会出现错误的结果。然后
![X8557U__VUBRFV_HE_X9_FX](/uploads/b6b5d29f8e53559606ce59b8335e78a5/X8557U__VUBRFV_HE_X9_FX.png)
这样...
【路人】201870048 张乃仁(793125457) 2021/12/5 20:40:26
我写的A7似乎有点问题:对于 Interprocedural 的 testcase,依赖分析的顺序(也就是语句被加进 WorkList 的顺序)可能会出现错误的结果。然后
![X8557U__VUBRFV_HE_X9_FX](/uploads/b6b5d29f8e53559606ce59b8335e78a5/X8557U__VUBRFV_HE_X9_FX.png)
这样多加几遍好像就没问题了,这种处理合法吗((
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/37
ConstantPropagation.java 的提交?
2021-12-08T22:48:46+08:00
Ricolove
ConstantPropagation.java 的提交?
【路人】MG21330034 林昊(1184264181) 2021/12/1 14:48:25
想问下作业7这里的意思是不是评测用的ConstantPropagation.java只包含了作业4的功能呢?也就是说如果要增加这次作业的代码到ConstantPropagation.java的话一定要提交自己的版本?
【路人】MG21330034 林昊(1184264181) 2021/12/1 14:48:25
想问下作业7这里的意思是不是评测用的ConstantPropagation.java只包含了作业4的功能呢?也就是说如果要增加这次作业的代码到ConstantPropagation.java的话一定要提交自己的版本?
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/36
关于数组下标使用数组元素来指定
2021-12-08T22:45:53+08:00
Ricolove
关于数组下标使用数组元素来指定
【路人】DZ21330015 李煦阳<ccyy407@qq.com> 2021/11/28 21:42:23
还没有做作业,不过想问,对于a=b; a[0] = 0; b[a[0]] = a[0]; 是有可能解出来 a[0] = b[0] = 0的吗?... 感觉flow-sensitive和insensitive想要很好结合的话,有一些微妙的地方...
【路人】DZ21330015 李煦阳<ccyy407@qq.com> 2021/11/28 21:42:23
还没有做作业,不过想问,对于a=b; a[0] = 0; b[a[0]] = a[0]; 是有可能解出来 a[0] = b[0] = 0的吗?... 感觉flow-sensitive和insensitive想要很好结合的话,有一些微妙的地方...
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/35
taie处理的if分支中字节码的对应行号有误
2021-11-18T23:01:05+08:00
Tianyun Zhang
taie处理的if分支中字节码的对应行号有误
可复现的实例:
```java
class A {
int x;
A foo(A a) {
if (a.x > 0) {
return null;
} else {
return new A();
}
}
public static void main(String[] args) {
A a = new A();
...
可复现的实例:
```java
class A {
int x;
A foo(A a) {
if (a.x > 0) {
return null;
} else {
return new A();
}
}
public static void main(String[] args) {
A a = new A();
a.x = 2;
a.foo(a);
}
}
```
Taie生成的字节码结果(`.tir`文件):
```
class A extends java.lang.Object {
int x;
A foo(A a) {
int temp$0, %intconst0;
A temp$1, temp$2;
[0@L6] temp$0 = a.<A: int x>;
[1@L6] %intconst0 = 0;
[2@L6] if (temp$0 > %intconst0) goto 4;
[3@L6] goto 7;
[4@L6] nop;
[5@L6] temp$1 = null;
[6@L7] return temp$1;
[7@L7] nop;
[8@L7] temp$2 = new A;
[9@L9] invokespecial temp$2.<A: void <init>()>();
[10@L9] return temp$2;
}
public static void main(java.lang.String[] args) {
A temp$0, a, temp$2;
int temp$1;
[0@L15] temp$0 = new A;
[1@L15] invokespecial temp$0.<A: void <init>()>();
[2@L15] a = temp$0;
[3@L16] temp$1 = 2;
[4@L16] a.<A: int x> = temp$1;
[5@L17] temp$2 = invokevirtual a.<A: A foo(A)>(a);
[6@L17] return;
}
void <init>() {
[0@L1] invokespecial %this.<java.lang.Object: void <init>()>();
[1@L1] return;
}
}
```
`A::foo`函数中,`new A`应该出现在第9行而不是第7行。
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/34
探讨: CHA的复杂度与实现优化
2021-11-10T11:56:20+08:00
yanghaku
探讨: CHA的复杂度与实现优化
1. CHA的dispatch的时候,是沿着继承树找父类的, 最坏情况就是找到root类(java.lang.Object)才有method实现,复杂度是$`O(h)`$, h为开始dispatch的深度.
2. virtual call的处理, 需要遍历所有的子类(子接口), 并且每个都需要dispatch沿着路径回父节点找method实现.
那么最坏情况下: 继承图退化成一个链,method只有root类实现了, 这个复杂度就是$`1+2+3+...+(n-1)\...
1. CHA的dispatch的时候,是沿着继承树找父类的, 最坏情况就是找到root类(java.lang.Object)才有method实现,复杂度是$`O(h)`$, h为开始dispatch的深度.
2. virtual call的处理, 需要遍历所有的子类(子接口), 并且每个都需要dispatch沿着路径回父节点找method实现.
那么最坏情况下: 继承图退化成一个链,method只有root类实现了, 这个复杂度就是$`1+2+3+...+(n-1)\ =\ O(n^2)`$ (n为总节点个数).
考虑到CHA的本质是callsite的类C有可能指向其所有的子类实例, 所以子类所有的method实现都有可能. 那么就可以在BFS/DFS遍历的时候, 遇到实现的method(非abstract)就加到resolve的method集合里面即可, 避免所有的节点都调用dispatch. 这样复杂度就是$`O(n)`$, 每个节点只需要访问一次.
因此我的实现是, virtual call的时候, 令callsite声明的类为C, resolve(cs) = BFS(C的后继)找到的所有的非abstract的method + dispatch(C).
(dispatch C 可能不存在,因为C可能是接口或者抽象类).
当前是过了作业给的样例, 并且自己造的几个也过了. 但是我不确定这样考虑是否全面(**会不会漏掉或者多找了method?**).
感兴趣的同学可以在这个Issue讨论一下下
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/33
怎么获得 CallKind
2021-10-30T10:28:28+08:00
Ricolove
怎么获得 CallKind
![image](/uploads/140433964a361583acb2a036a97a576c/image.png)
![image](/uploads/140433964a361583acb2a036a97a576c/image.png)
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/32
returnEdge有多个returnVar怎么处理
2021-10-29T23:12:27+08:00
Ricolove
returnEdge有多个returnVar怎么处理
【路人】MF21330012 陈振宇(895761580) 2021/10/29 18:37:46
求问一下returnEdge有多个returnVar怎么处理啊
之前的想法是从里面挑一个为常数的 错了
【路人】MF21330012 陈振宇(895761580) 2021/10/29 18:37:46
求问一下returnEdge有多个returnVar怎么处理啊
之前的想法是从里面挑一个为常数的 错了
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/31
为啥icfg会有多个入口点呀
2021-10-29T23:11:02+08:00
Ricolove
为啥icfg会有多个入口点呀
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/30
为啥要分callNode和noncallnode啊 我写的这俩逻辑一样
2021-10-29T23:09:58+08:00
Ricolove
为啥要分callNode和noncallnode啊 我写的这俩逻辑一样
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/29
递归遍历子接口和子类有什么简洁的写法吗
2021-10-29T23:09:26+08:00
Ricolove
递归遍历子接口和子类有什么简洁的写法吗
【路人】191830204 张侃(1550792743) 2021/10/29 15:27:02
递归遍历子接口和子类有什么简洁的写法吗
【路人】191830204 张侃(1550792743) 2021/10/29 15:27:11
写一堆好乱
【路人】191830204 张侃(1550792743) 2021/10/29 15:27:02
递归遍历子接口和子类有什么简洁的写法吗
【路人】191830204 张侃(1550792743) 2021/10/29 15:27:11
写一堆好乱
https://git.nju.edu.cn/Ricolove/spa-knowledge-base/-/issues/28
resolve 里 m 是函数签名,T = {m} 的时候怎么构造出 m 对应的方法
2021-10-29T23:09:07+08:00
Ricolove
resolve 里 m 是函数签名,T = {m} 的时候怎么构造出 m 对应的方法
![image](/uploads/c1b61274d2a6339e12598550231fb8de/image.png)
![image](/uploads/c1b61274d2a6339e12598550231fb8de/image.png)