前言
距离上次和大家分享 SSA 相关的知识已经过去了许久,在这大概两个月的时间里,牛牛可是丝毫没有摸鱼!兢兢业业的完成几个大型 PR 后,在最近的更新的 v1.2.7-sp 2 中,SSA终于从科普文章中的屠龙刀变成了Yak中解析代码的利器。
![](https://pic3.zhimg.com/80/v2-fd08478714e62217bc06ab4dbe0fa8ce_1440w.webp)
有了 SSA 现在我们能做啥!
目前 YakSSA 模块可以完整解析 Yak代码并生成对应的 SSA 格式数据流和控制流分离的指令集,基于此可以方便的进行数据流分析,同时重建的类型系统更进一步提高了静态分析能力。
简而言之!YakSSA 模块提供了非常不错的程序分析能力!如果经常使用 Yak Runner 的朋友们可能已经注意到,目前的 Yak Runner 错误提示功能已经不只有编译语法报错了,这就得益于 SSA 模块的加入。通过静态分析的错误提示,在大家编写代码的时候可以边写边进行修正,以后再也不用等运行时报错再修改代码了!
![动图封面](https://pic3.zhimg.com/v2-833059105a909c946ab67094f21d933e_b.jpg)
目前的 YakRunner 支持以下的程序错误检查:
1、变量未定义
SSA 在生成时就会计算变量的 use-def 链,因此对于各种未定义变量的使用的定位手到擒来!从最简单的单纯使用未定义变量:
![](https://pic3.zhimg.com/80/v2-ae15b5adb2c50c6aef5b73a462d15d0e_1440w.webp)
到在 a.$b
形式的索引:
![](https://pic1.zhimg.com/80/v2-d3f19633cfb7bed3059877f08cc04c30_1440w.webp)
再到数据流交汇时可能出现的未定义变量:
![](https://pic2.zhimg.com/80/v2-d0fdfa27cf8786b78450e5fede27da19_1440w.webp)
甚至在模板字符串中的未定义变量使用:
![](https://pic2.zhimg.com/80/v2-1f1e013178d51adf6e3cdd47ef0eb921_1440w.webp)
再进一步,如果在闭包函数中使用到了外部变量,但是其实外部根本没有定义该变量呢?或者定义闭包函数时定义了变量,但调用函数时外部变量不存在了呢?YakSSA 仍然可以帮到你!
![](https://pic2.zhimg.com/80/v2-a2972d9bdcfddc781b7b5def8b222aa1_1440w.webp)
2、函数参数和返回值检查
在之前,对于大家经常使用(并且真的非常好用)的标准库函数的检查一直不到位,很多时候不熟悉的函数需要查找文档甚至代码的定义才能确定参数以及返回值。现在有了 YakSSA 的检查,将会对这些统统进行静态检查!大家遇到报错也可以立刻修正!对于返回值个数的检查:
![](https://pic2.zhimg.com/80/v2-fc4063af02ae59fdea0ca67d703a759d_1440w.webp)
对于参数的检查:
![](https://pic4.zhimg.com/80/v2-869fc781b2171af7e97ee02210a80c57_1440w.webp)
3、函数错误追踪
另一个经常出现在标准库函数调用的问题就是错误处理, 大家可能会在调用函数时将几个参数全部使用同一个变量接受,这当然是可行的,这个变量将会成为一个列表。但是很多时候大家直接忘记了该函数返回的错误,当这个错误存在的时候,可能该列表其他数据都是无意义甚至引起错误的。错误必须要得到处理,YakSSA 贯彻了这个思路,并且得益于数据流分析,无论这个错误被如何传递,YakSSA可以将这个错误追踪的相当准确。
![](https://pic3.zhimg.com/80/v2-fdb8eebeb791c704fc73fd5129e142c2_1440w.webp)
当然处理错误仍然是非常简单的,在 Yak 内只需要 die(err)
或者使用 ~
形式的函数调用即可,比 Golang 方便得多,又保证程序流程的正确性,何乐不为呢。
4、函数~ 调用
当使用 ~
调用的时候,函数最后的错误将会被自动处理,此时的函数返回值将会少一个错误。这大家都知道,但是这意味着我们需要记住大部分函数的返回值数量么?当然不是,现在 YakSSA 将会自动检查函数返回值的数量,包括使用 ~
调用的情况,同样会去除最后一个错误。
![](https://pic1.zhimg.com/80/v2-a7bb3d35e8aa39497349d7766ed8d100_1440w.webp)
但是如果一个函数并没有返回错误的话,是不应该对其使用 ~
形式的调用的!
![](https://pic1.zhimg.com/80/v2-b38a38433da65c157fbaf3175a9500d8_1440w.webp)
下一步!
目前的 YakSSA 静态分析能力已经在 YakRunner 中初步使用起来,但这只是一小步,接下来的一段时间内 Yak 将会继续加强对代码的静态检查,基于此我们还可以做很多有趣的事情!
标签:YakSSA,变量,错误,提示,语法,Yak,SSA,函数 From: https://www.cnblogs.com/yaklang/p/17776655.html