Page 26 - 《软件学报》2024年第6期
P. 26

2602                                                       软件学报  2024  年第  35  卷第  6  期


                 意味着措施    1  是无用的. 措施   1  可以让措施   3  的静态分析阶段跳过诸多无意义的非            Go  函数, 降低初始化阶段所
                 带来额外开销, 因此措施 1 也是必不可少的. 为了揭示措施                1  对减少初始化开销的作用, 我们只采用措施             2  和措
                 施  3, 不采用措施  1  去重复第  4.2.2  节中的测试, 结果显示在这     277  个包中, 总初始化时间增加了约        20.14%.

                                                表 1 各个措施误报率测试结果

                             减少误报的措施           总包数        报错的包数        误报的包数         误报率 (%)
                                  无             277         277           276          99.64
                                措施1             277         277           276          99.64
                                措施2             277         277           276          99.64
                              措施1+措施2           277          24            23          95.83
                                措施3             277         274           273          99.63
                              措施3+措施1           277         274           273          99.63
                              措施3+措施2           277          1             0           0.00
                            措施3+措施1+措施2         277          1             0           0.00


                 4.4   开源项目测试
                    为了了解真实世界       Go  项目中是否有违反      Go  逃逸不变式引发的内存安全问题, 我们选取了             18  个在各个领域
                 具有代表性的     Go  开源项目来进行测试, 这些开源项目涉及            Web、数据库、分布式系统、边缘计算、云存储等多
                 个领域. 选取的仓库如表       2  所示. 测试时使用和第      4.1  节相似的测试方法: 以包为单位, 将这些项目提供的测试用
                 例和  Benchmark  编译成可执行文件, 并随后使用        DBI-Go 进行检测. 在这    18  个开源仓库中共有 1 730   个包提供了
                 测试用例或者     Benchmark. 最后的测试结果显示, DBI-Go 在这些仓库中并未检测到问题.


                                               表 2 测试的代表性 Go 开源项目

                             类型             仓库名                    简介                可测试的包数
                                             hugo              轻量 Web 框架                 123
                                            beego             Go 语言 Web 框架               54
                             Web
                                           go-restful  用 Go 构建的 REST 风格的 Web 服务包          1
                                           websocket       WebSocket 协议的 Go 实现            1
                             代理            v2ray-core          网络代理工具                    64
                                            dgraph     分布式的、可扩展的图数据库管理系统                 84
                             数据库
                                             etcd             分布式键值数据库                   93
                                              cli           GitHub 官方命令行工具               170
                             git服务
                                             gogs              自托管 Git 服务                24
                            边缘计算           kubeedge       Kubernetes 原生边缘计算框架            66
                                           open-local      云原生本地存储管理系统                    9
                            存储管理
                                            rclone              云存储管理                    133
                          依赖注入框架           IOC-golang  依赖注入框架, 便于搭建任何 Go 应用              55
                                           protobuf-go       Google 数据交换格式               43
                             序列化
                                         json-iterator/go  encoding/json 包的高性能替代         10
                             分布式            grpc-go          gRPC 的 Go 语言实现              108
                            容器管理           kubernetes       生产级容器调度和管理                   680
                            日志管理             zap           快速、结构化、分级的日志                  12
                                                   合计                                   1 730

                 4.5   适用性测试

                    上述测试中针对额外运行时开销、Go             标准库以及编译工具链的测试中所使用的               Go  编译器为当前的最新版
   21   22   23   24   25   26   27   28   29   30   31