alipay / alipay/ant-application-security-testing-benchmark

4 个 case 的 evaluation item 标注指向了隔壁目录的评价项,在部分文件系统下会导致打分工具 NPE

Offen
#162 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Java
Sterne
495
Forks
62
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

# 4 个 case 的 evaluation item 标注指向了隔壁目录的评价项,在部分文件系统下会导致打分工具 NPE

## 问题

以下 4 个 case 文件里标注的 `evaluation item`,与「列出该 case 的 config.json」所声明的 `evaluation_item` 不一致:

| case 文件 | 所在目录 | 文件内标注的 evaluation item | 该目录 config.json 的 evaluation_item |
|---|---|---|---|
| `asynchronous_promisify_001_T.js` | `sast-js/case/completeness/single_app_tracing/asynchronous_tracing/delayed_execution_async/` | `完整度->单应用跟踪完整度->并发、多线程、异步->同步原语` | `...->延迟执行异步` |
| `asynchronous_promisify_002_F.js` | 同上 | 同上 | 同上 |
| `Private_Variable_001_T.java` | `sast-java/src/main/java/com/sast/astbenchmark/case_language_maturity/completeness/single_app_tracing/variable_scope/private_variable/` | `完整度->单应用跟踪完整度->变量作用域->静态变量` | `...->private变量` |
| `Private_Variable_002_F.java` | 同上 | 同上 | 同上 |

这 4 个 case 的 `bind_url` 和所在目录都指向 `delayed_execution_async` / `private_variable`,只有 `evaluation item` 一行写成了隔壁评价项,看起来是复制模板时漏改。

对 `sast-js` / `sast-go` / `sast-java` / `sast-python2` / `sast-python3` 全量比对过(config.json 引用的 case 共 2837 个),不一致的只有上面这 4 个。

## 影响一:打分工具在部分文件系统上直接崩溃

`BenchmarkScore.readExpectedResultsNew()` 用 `Files.find(...)` 遍历 config.json,而 `levelMap` / `composeMap` 是**静态**字段、跨 config.json 累加。每读一个 config.json,都会拿它去遍历该语言的全部 case,命中 `composeMap` 但没进 `levelMap` 的就抛 NPE(`BenchmarkScore.java:1352` 附近):

```
java.lang.NullPointerException: Please check asynchronous_promisify_002_F.js is the relevant configuration correct?
bind_url: /completeness/single_app_tracing/asynchronous_tracing/delayed_execution_async/asynchronous_promisify_002_F
evaluation_item: 完整度->单应用跟踪完整度->并发、多线程、异步->同步原语
at com.alipay.xast.score.BenchmarkScore.processJsonFile(BenchmarkScore.java:1355)
at com.alipay.xast.score.BenchmarkScore.lambda$readExpectedResultsNew$13(BenchmarkScore.java:1170)
```

于是崩不崩完全取决于 `Files.find` 的返回顺序:

- 先读到 `delayed_execution_async/config.json` → 文件名已进 `levelMap` → 正常
- 先读到 `promise_callback_await/config.json`(它声明了「同步原语」)→ NPE,整个打分中断

同一份代码、同一份数据,在 macOS(APFS) 上通过,在 Linux 容器(overlayfs) 里必崩:

```
macOS: delayed_execution_async/config.json 先被处理 → 通过
容器 overlayfs: promise_callback_await/config.json 先被处理 → NPE
```

`sast-java` 是同样的情况(`Private_Variable_002_F.java`)。也就是说,在 Docker 里跑 `create-scorecard` 时,`sast-js` 和 `sast-java` 这两个靶场目前无法出报告。

## 影响二:即使不崩,这 4 个 case 的归属也是错的

在 macOS 上能正常出报告,但生成的 xlsx 里:

```
文件名: asynchronous_promisify_001_T.js
评价项: 完整度->单应用跟踪完整度->并发、多线程、异步->同步原语
评价项达成条件: async_await_001_T.js && !async_await_002_F.js, asynchronous_promise_001_T.js && ...
```

「评价项达成条件」取的是「同步原语」那组的 compose 表达式,**其中并不包含这个 case 自己**。这 4 个用例被挂到了与自身无关的评价项下面。

## 建议

1. 把这 4 个文件的 `evaluation item` 改成与所在目录 / config.json 一致(`延迟执行异步`、`private变量`);如果设计意图确实是归到「同步原语」/「静态变量」,那就应该调整 config.json 的分组,把这些 case 移进对应的 scene_list。
2. 另外建议在 `BenchmarkScore.readExpectedResultsNew()` 的两处 `Files.find(...)` 后加 `.sorted()`。静态累加的 `levelMap`/`composeMap` 叠加文件系统相关的遍历顺序,会让同样的数据在不同平台给出不同结果(要么崩、要么静默通过),排序后至少能保证行为与平台无关、问题可复现。

## 复现环境

- macOS 15 (APFS) + JDK 11:通过
- `maven:3.9.6-eclipse-temurin-11` 容器 (overlayfs) + 同一份仓库:`sast-js` / `sast-java` 均 NPE
- 命令:`mvn com.alipay.xast:xastutils-maven-plugin:create-scorecard -Dlang=js -DdirectoryPath=<靶场> -DresultFile=<任意可被 Reader 解析的结果文件>`

Beitragsleitfaden

Beitragsleitfaden öffnen

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.