@ohos-graphics/stability-code-review 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +169 -0
  2. package/SKILL.md +518 -0
  3. package/bin/install.js +165 -0
  4. package/config/rules.yaml +445 -0
  5. package/config/whitelist.yaml +52 -0
  6. package/package.json +40 -0
  7. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_001.md +275 -0
  8. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_002.md +273 -0
  9. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_003.md +305 -0
  10. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_004.md +350 -0
  11. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_005.md +301 -0
  12. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_006.md +320 -0
  13. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_007.md +432 -0
  14. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_008.md +394 -0
  15. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_009.md +425 -0
  16. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_010.md +472 -0
  17. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_011.md +204 -0
  18. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_012.md +210 -0
  19. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_013.md +226 -0
  20. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_014.md +222 -0
  21. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_015.md +256 -0
  22. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_016.md +269 -0
  23. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_017.md +222 -0
  24. package/references/BoundaryCondition/StabilityCodeReview_BoundaryCondition_018.md +336 -0
  25. package/references/ConcurrencyStability/StabilityCodeReview_ConcurrencyStability_001.md +414 -0
  26. package/references/ConcurrencyStability/StabilityCodeReview_ConcurrencyStability_002.md +335 -0
  27. package/references/ConcurrencyStability/StabilityCodeReview_ConcurrencyStability_003.md +284 -0
  28. package/references/ConcurrencyStability/StabilityCodeReview_ConcurrencyStability_004.md +313 -0
  29. package/references/ConcurrencyStability/StabilityCodeReview_ConcurrencyStability_005.md +364 -0
  30. package/references/ExceptionHandling/StabilityCodeReview_ExceptionHandling_001.md +142 -0
  31. package/references/ExceptionHandling/StabilityCodeReview_ExceptionHandling_002.md +222 -0
  32. package/references/ExceptionHandling/StabilityCodeReview_ExceptionHandling_003.md +383 -0
  33. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_001.md +258 -0
  34. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_002.md +131 -0
  35. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_003.md +220 -0
  36. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_004.md +224 -0
  37. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_005.md +250 -0
  38. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_006.md +153 -0
  39. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_007.md +169 -0
  40. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_008.md +153 -0
  41. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_009.md +144 -0
  42. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_010.md +152 -0
  43. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_011.md +221 -0
  44. package/references/GraphicsStability/StabilityCodeReview_GraphicsStability_012.md +318 -0
  45. package/references/InitializationOrder/StabilityCodeReview_InitializationOrder_001.md +411 -0
  46. package/references/Lifecycle/StabilityCodeReview_Lifecycle_001.md +255 -0
  47. package/references/Lifecycle/StabilityCodeReview_Lifecycle_002.md +177 -0
  48. package/references/MemoryStability/StabilityCodeReview_MemoryStability_001.md +332 -0
  49. package/references/MemoryStability/StabilityCodeReview_MemoryStability_002.md +261 -0
  50. package/references/MemoryStability/StabilityCodeReview_MemoryStability_003.md +428 -0
  51. package/references/MemoryStability/StabilityCodeReview_MemoryStability_004.md +400 -0
  52. package/references/MemoryStability/StabilityCodeReview_MemoryStability_005.md +364 -0
  53. package/references/MemoryStability/StabilityCodeReview_MemoryStability_006.md +359 -0
  54. package/references/MemoryStability/StabilityCodeReview_MemoryStability_007.md +279 -0
  55. package/references/PROBLEM_TEMPLATE.md +65 -0
  56. package/references/PerformanceStability/StabilityCodeReview_PerformanceStability_001.md +380 -0
  57. package/references/PerformanceStability/StabilityCodeReview_PerformanceStability_002.md +437 -0
  58. package/references/REPORT_TEMPLATE.csv +5 -0
  59. package/references/REPORT_TEMPLATE.md +132 -0
  60. package/references/RULE_DEVELOPMENT_GUIDE.md +711 -0
  61. package/references/RULE_INDEX.md +101 -0
  62. package/references/RULE_TEMPLATE.md +192 -0
  63. package/references/ResourceManagement/StabilityCodeReview_ResourceManagement_001.md +334 -0
  64. package/references/ResourceManagement/StabilityCodeReview_ResourceManagement_002.md +425 -0
  65. package/references/ResourceManagement/StabilityCodeReview_ResourceManagement_003.md +420 -0
  66. package/references/ResourceManagement/StabilityCodeReview_ResourceManagement_004.md +409 -0
  67. package/references/ResourceManagement/StabilityCodeReview_ResourceManagement_005.md +445 -0
  68. package/references/ResourceManagement/StabilityCodeReview_ResourceManagement_006.md +384 -0
  69. package/references/ResourceManagement/StabilityCodeReview_ResourceManagement_007.md +395 -0
  70. package/scripts/add-rule.py +423 -0
@@ -0,0 +1,437 @@
1
+ ---
2
+ rule_id: "StabilityCodeReview_PerformanceStability_002"
3
+ name: "间接递归风险"
4
+ category: "性能稳定性"
5
+ severity: "HIGH"
6
+ language: ["cpp", "c++"]
7
+ author: "OH-Department7 Stability Team"
8
+ ---
9
+
10
+ # 间接递归风险
11
+
12
+ ## 问题描述
13
+
14
+ 间接递归(A调用B,B调用A)可能导致无限循环或栈溢出。与直接递归不同,间接递归更隐蔽,容易被忽视。长时间运行或深度递归会耗尽栈空间,引发程序崩溃。
15
+
16
+ ## 检测示例
17
+
18
+ ### ❌ 问题代码
19
+
20
+ ```cpp
21
+ // 场景1:简单间接递归 A->B->A
22
+ void ProcessA(Data* data)
23
+ {
24
+ if (data == nullptr) {
25
+ return;
26
+ }
27
+
28
+ if (data->type == TYPE_A) {
29
+ ProcessB(data); // A调用B
30
+ }
31
+ }
32
+
33
+ void ProcessB(Data* data)
34
+ {
35
+ if (data == nullptr) {
36
+ return;
37
+ }
38
+
39
+ if (data->flag) {
40
+ ProcessA(data); // B调用A,形成A->B->A递归环
41
+ }
42
+ }
43
+
44
+ // 场景2:多函数递归环 A->B->C->A
45
+ void HandleA(Request* req)
46
+ {
47
+ if (req->step == 1) {
48
+ HandleB(req); // A->B
49
+ }
50
+ }
51
+
52
+ void HandleB(Request* req)
53
+ {
54
+ if (req->step == 2) {
55
+ HandleC(req); // B->C
56
+ }
57
+ }
58
+
59
+ void HandleC(Request* req)
60
+ {
61
+ if (req->retry) {
62
+ HandleA(req); // C->A,形成A->B->C->A递归环
63
+ }
64
+ }
65
+
66
+ // 场景3:回调函数间接递归
67
+ class EventHandler {
68
+ public:
69
+ void OnEventA(Event* event) {
70
+ if (event->needRetry) {
71
+ ProcessEvent(event); // OnEventA->ProcessEvent
72
+ }
73
+ }
74
+
75
+ void ProcessEvent(Event* event) {
76
+ if (event->type == EVENT_A) {
77
+ OnEventA(event); // ProcessEvent->OnEventA,递归环
78
+ }
79
+ }
80
+ };
81
+
82
+ // 场景4:条件分支递归
83
+ void ValidateData(Data* data)
84
+ {
85
+ if (!CheckConditionA(data)) {
86
+ CorrectData(data); // ValidateData->CorrectData
87
+ }
88
+ }
89
+
90
+ void CorrectData(Data* data)
91
+ {
92
+ if (!ValidateData(data)) { // CorrectData->ValidateData,递归环
93
+ // 无限循环
94
+ }
95
+ }
96
+
97
+ // 场景5:虚函数间接递归
98
+ class Base {
99
+ public:
100
+ virtual void Process() {
101
+ Handle();
102
+ }
103
+
104
+ virtual void Handle() {
105
+ Process(); // Handle->Process,递归环
106
+ }
107
+ };
108
+ ```
109
+
110
+ ### ✅ 修复方案
111
+
112
+ ```cpp
113
+ // 修复场景1:添加递归深度限制或状态标志
114
+ void ProcessA(Data* data, int depth)
115
+ {
116
+ if (data == nullptr || depth > MAX_DEPTH) { // 正确:深度限制
117
+ return;
118
+ }
119
+
120
+ if (data->type == TYPE_A) {
121
+ ProcessB(data, depth + 1); // 传递深度参数
122
+ }
123
+ }
124
+
125
+ void ProcessB(Data* data, int depth)
126
+ {
127
+ if (data == nullptr || depth > MAX_DEPTH) { // 正确:深度限制
128
+ return;
129
+ }
130
+
131
+ if (data->flag) {
132
+ ProcessA(data, depth + 1); // 传递深度参数
133
+ }
134
+ }
135
+
136
+ // 修复场景2:使用循环代替递归
137
+ void HandleRequest(Request* req)
138
+ {
139
+ while (req != nullptr) { // 正确:使用循环代替递归
140
+ switch (req->step) {
141
+ case 1:
142
+ // 处理步骤1
143
+ req->step = 2;
144
+ break;
145
+ case 2:
146
+ // 处理步骤2
147
+ req->step = 3;
148
+ break;
149
+ case 3:
150
+ // 处理步骤3
151
+ if (!req->retry) {
152
+ return; // 退出循环
153
+ }
154
+ req->step = 1; // 重置步骤
155
+ break;
156
+ }
157
+ }
158
+ }
159
+
160
+ // 修复场景3:回调使用标志位防止递归
161
+ class EventHandler {
162
+ public:
163
+ void OnEventA(Event* event) {
164
+ if (event->processed) { // 正确:检查标志位
165
+ return;
166
+ }
167
+ event->processed = true;
168
+
169
+ if (event->needRetry) {
170
+ ProcessEvent(event);
171
+ }
172
+ }
173
+
174
+ void ProcessEvent(Event* event) {
175
+ if (event->type == EVENT_A) {
176
+ OnEventA(event); // 有标志位保护,不会递归
177
+ }
178
+ }
179
+ };
180
+
181
+ // 修复场景4:避免相互调用,使用状态机
182
+ enum ValidationState {
183
+ STATE_CHECK,
184
+ STATE_CORRECT,
185
+ STATE_DONE
186
+ };
187
+
188
+ void ValidateDataStateMachine(Data* data)
189
+ {
190
+ ValidationState state = STATE_CHECK;
191
+
192
+ while (state != STATE_DONE) { // 正确:状态机代替递归
193
+ switch (state) {
194
+ case STATE_CHECK:
195
+ if (CheckConditionA(data)) {
196
+ state = STATE_DONE;
197
+ } else {
198
+ state = STATE_CORRECT;
199
+ }
200
+ break;
201
+ case STATE_CORRECT:
202
+ CorrectData(data);
203
+ state = STATE_CHECK; // 回到检查状态
204
+ break;
205
+ }
206
+ }
207
+ }
208
+
209
+ // 修复场景5:虚函数避免递归调用
210
+ class Base {
211
+ public:
212
+ virtual void Process() {
213
+ // 具体处理
214
+ }
215
+
216
+ virtual void Handle() {
217
+ // 具体处理,不调用Process
218
+ }
219
+ };
220
+
221
+ // 修复场景6:Visitor模式中的间接递归防护
222
+ class RSRenderServiceVisitor {
223
+ public:
224
+ void PrepareNode(RSRenderNode& node) {
225
+ if (!canvas_) { return; } // 终止条件1
226
+ if (!node.ShouldPaint()) { return; } // 终止条件2
227
+
228
+ PrepareChildren(node); // 调用PrepareChildren
229
+ }
230
+
231
+ void PrepareChildren(RSRenderNode& node) {
232
+ for (auto& child : *node.GetSortedChildren()) {
233
+ child->Prepare(shared_from_this()); // child->Prepare调用PrepareNode,形成间接递归
234
+ }
235
+ }
236
+ };
237
+
238
+ // Visitor模式正确实现:有迭代器终止条件和多重检查
239
+ class SafeRenderVisitor {
240
+ public:
241
+ void PrepareNode(RSRenderNode& node) {
242
+ if (node.IsVisited()) { return; } // 终止条件:访问状态标志
243
+ if (!canvas_) { return; } // 终止条件:canvas有效性
244
+ if (!node.ShouldPaint()) { return; } // 终止条件:可见性
245
+
246
+ node.SetVisited(true); // 标记已访问
247
+ PrepareChildren(node);
248
+ }
249
+
250
+ void PrepareChildren(RSRenderNode& node) {
251
+ auto children = node.GetSortedChildren();
252
+ if (!children || children->empty()) { return; } // 终止条件:无子节点
253
+
254
+ for (auto& child : *children) { // 迭代器有终止条件
255
+ child->Prepare(shared_from_this());
256
+ }
257
+ }
258
+ };
259
+
260
+ // 修复场景7:使用跨节点访问状态标志
261
+ class RSRenderNode {
262
+ public:
263
+ void SetCrossNodeVisitedStatus(bool hasVisited);
264
+ void ResetCrossNodesVisitedStatus(); // 遍历前重置所有节点状态
265
+
266
+ void Prepare(std::shared_ptr<Visitor> visitor) {
267
+ if (crossNodeVisited_) { return; } // 防止重复处理
268
+ crossNodeVisited_ = true;
269
+
270
+ // 处理节点
271
+ visitor->PrepareChildren(*this);
272
+ }
273
+ private:
274
+ bool crossNodeVisited_ = false; // 跨节点访问状态标志
275
+ };
276
+ ```
277
+
278
+ ## 检测范围
279
+
280
+ 检查以下模式:
281
+
282
+ - A函数调用B函数,B函数又调用A函数
283
+ - 多函数递环(A->B->C->...->A)
284
+ - 回调函数与处理函数相互调用
285
+ - 虚函数之间相互调用
286
+ - 条件分支中的相互调用
287
+
288
+ ## 检测要点
289
+
290
+ 1. 构建函数调用图,检测循环依赖
291
+ 2. 识别A->B->A模式的调用链
292
+ 3. 检查是否有递归深度限制参数
293
+ 4. 检查是否有状态标志防止递归
294
+ 5. 排除明确标记为安全的调用
295
+
296
+ ### Visitor模式的间接递归
297
+
298
+ 现代C++中Visitor模式常见的间接递归:Visitor -> child -> Visitor
299
+
300
+ - **调用链**:
301
+ - Visitor::PrepareNode → Visitor::PrepareChildren
302
+ - PrepareChildren → child->Prepare(visitor)
303
+ - child->Prepare → Visitor::PrepareNode(回到Visitor)
304
+
305
+ - **识别特征**:
306
+ - 使用迭代器遍历子节点:`for (auto& child : *node.GetChildren())`
307
+ - 子节点调用visitor:`child->Prepare(visitor)` 或 `child->Accept(visitor)`
308
+ - visitor函数名含Prepare/Accept/Visit
309
+
310
+ - **防护机制**:
311
+ - 迭代器终止条件(遍历完所有子节点自然终止)
312
+ - 多重有效性检查(canvas有效性、节点可见性等)
313
+ - 跨节点访问状态标志(防止重复处理)
314
+
315
+ ### 迭代器遍历的深度控制
316
+
317
+ Visitor模式依赖迭代器的物理限制:
318
+
319
+ - 迭代器遍历子节点:`for (auto& child : *children)`
320
+ - 终止条件:遍历完所有子节点后迭代器自然结束
321
+ - 无传统递归:不使用函数直接调用自身
322
+
323
+ **注意**:迭代器本身不限制深度,需要额外的终止条件。
324
+
325
+ ### 跨节点访问状态标志
326
+
327
+ 防止节点被重复处理的机制:
328
+
329
+ - **状态标志**:`bool crossNodeVisited_`
330
+ - **设置状态**:`SetCrossNodeVisitedStatus(true)`
331
+ - **检查状态**:`if (crossNodeVisited_) return;`
332
+ - **重置状态**:遍历前调用 `ResetCrossNodesVisitedStatus()`
333
+
334
+ 适用场景:
335
+ - 跨节点的间接引用关系
336
+ - 多个节点指向同一个子节点
337
+ - 防止同一个节点被多次处理
338
+
339
+ ### 虚函数复杂间接递归
340
+
341
+ 虚函数多态可能形成复杂的间接递归:
342
+
343
+ - Base::Prepare → Derived1::Handle → Base::Prepare
344
+ - 需要构建虚函数调用图
345
+ - 检查虚函数override中是否调用了父类虚函数
346
+
347
+ ## 风险流分析(RiskFlow)
348
+
349
+ - **RISK_SOURCE**:函数间相互调用形成递环
350
+ - **RISK_TYPE**:无限递归
351
+ - **RISK_PATH**:A->B->A循环调用 → 无限递归 → 栈溢出崩溃
352
+ - **IMPACT_POINT**:栈空间耗尽,程序崩溃
353
+
354
+ ## 影响分析(ImpactAnalysis)
355
+
356
+ - **Trigger**:满足递归条件且无终止机制
357
+ - **Propagation**:无限函数调用,栈帧不断增长
358
+ - **Consequence**:栈溢出崩溃、服务中断
359
+ - **Mitigation**:添加递归深度限制、使用循环/状态机代替递归
360
+
361
+ ## 误报排除
362
+
363
+ | 场景 | 识别特征 | 处理方式 |
364
+ |------|----------|----------|
365
+ | 有深度限制 | 参数传递depth且有MAX_DEPTH检查 | 不报 |
366
+ | 有状态标志 | 有bool标志位检查防止递归 | 不报 |
367
+ | 不同条件 | A->B和B->A的调用条件互斥 | 不报 |
368
+ | NOPROTECT标记 | // NOPROTECT 注释 | 不报 |
369
+ ## 测试用例
370
+
371
+ ### 触发用例(应该报)
372
+
373
+ ```cpp
374
+ // test_PerformanceStability_002_trigger.cpp
375
+ void trigger_bad_1(Data* data)
376
+ {
377
+ if (data->type == TYPE_A) {
378
+ ProcessB(data); // A->B
379
+ }
380
+ }
381
+
382
+ void trigger_bad_2(Data* data)
383
+ {
384
+ if (data->flag) {
385
+ ProcessA(data); // B->A,应该报:形成A->B->A递环
386
+ }
387
+ }
388
+
389
+ void trigger_bad_3(Request* req)
390
+ {
391
+ HandleB(req); // A->B
392
+ }
393
+
394
+ void trigger_bad_4(Request* req)
395
+ {
396
+ HandleC(req); // B->C
397
+ }
398
+
399
+ void trigger_bad_5(Request* req)
400
+ {
401
+ HandleA(req); // C->A,应该报:形成A->B->C->A递环
402
+ }
403
+ ```
404
+
405
+ ### 安全用例(不应该报)
406
+
407
+ ```cpp
408
+ // test_PerformanceStability_002_safe.cpp
409
+ void safe_good_1(Data* data, int depth)
410
+ {
411
+ if (depth > MAX_DEPTH) { // 安全:有深度限制
412
+ return;
413
+ }
414
+ ProcessB(data, depth + 1);
415
+ }
416
+
417
+ void safe_good_2(Data* data, int depth)
418
+ {
419
+ if (depth > MAX_DEPTH) { // 安全:有深度限制
420
+ return;
421
+ }
422
+ ProcessA(data, depth + 1);
423
+ }
424
+
425
+ void safe_good_3(Request* req)
426
+ {
427
+ while (req != nullptr) { // 安全:使用循环
428
+ // 处理
429
+ }
430
+ }
431
+
432
+ // NOPROTECT: 特殊场景
433
+ void noprotect_case(Data* data)
434
+ {
435
+ ProcessB(data); // NOPROTECT标记,不报
436
+ }
437
+ ```
@@ -0,0 +1,5 @@
1
+ 问题序号,稳定性类别,规则名称,规则ID,问题描述,文件路径
2
+ 1,异常处理,异常未捕获风险,StabilityCodeReview_ExceptionHandling_001,【图形稳定性专项】【AI辅助代码检视】【异常处理】【异常未捕获风险】在<文件相对路径>:<行号>,函数<函数名>中,<问题描述>。,<文件相对路径>:<行号>
3
+ 2,并发稳定性,死锁风险,StabilityCodeReview_ConcurrencyStability_001,【图形稳定性专项】【AI辅助代码检视】【并发稳定性】【死锁风险】在<文件相对路径>:<起始行号>-<结束行号>,函数<函数名>中,<问题描述>。,<文件相对路径>:<起始行号>-<结束行号>
4
+ 3,内存稳定性,内存泄漏风险,StabilityCodeReview_MemoryStability_001,【图形稳定性专项】【AI辅助代码检视】【内存稳定性】【内存泄漏风险】在<文件相对路径>:<行号1>/<行号2>/<行号3>,函数<函数名>中,<问题描述>。,<文件相对路径>:<行号1>/<行号2>/<行号3>
5
+ <N>,<稳定性类别>,<规则名称>,<规则ID>,【图形稳定性专项】【AI辅助代码检视】【<稳定性类别>】【<规则名称>】在<文件相对路径>:<行号>,函数<函数名>中,<问题描述>。,<文件相对路径>:<行号>
@@ -0,0 +1,132 @@
1
+ # OpenHarmony 稳定性代码审查报告
2
+
3
+ **检视目标**: `<目录或文件相对路径>`
4
+ **检视时间**: `<YYYY-MM-DD HH:MM:SS>`
5
+ **检视框架版本**: OpenHarmony Stability Code Review Framework `<严格复制SKILL.md元数据中的metadata.version版本号字段>`
6
+ **检出问题总数**: `<总数>`
7
+ **严重程度分布**: CRITICAL(`<数量>`), HIGH(`<数量>`), MEDIUM(`<数量>`), LOW(`<数量>`)
8
+ **规则覆盖**: `<N>` 条规则(`<M>` 个稳定性分类)
9
+
10
+ ---
11
+
12
+ ## 检视概览
13
+
14
+ ### 代码信息
15
+ - **代码路径**: `<检视目标相对路径>`
16
+ - **代码行数**: `<N>` 行
17
+ - **功能描述**: `<功能描述文本>`
18
+
19
+ ### 问题统计
20
+
21
+ | 严重程度 | 检出问题数 | 占比 | 说明 |
22
+ |---------|---------|------|------|
23
+ | CRITICAL | `<数量>` | `<百分比>%` | `<严重等级说明>` |
24
+ | HIGH | `<数量>` | `<百分比>%` | `<严重等级说明>` |
25
+ | MEDIUM | `<数量>` | `<百分比>%` | `<严重等级说明>` |
26
+ | **总计** | **`<总数>`** | **100%** | **/** |
27
+
28
+ ### 分类问题分布
29
+
30
+ | 分类名称 | 规则数量(已检视/总数) | 检出问题数 | 严重程度 |
31
+ |---------|---------|-----------|---------|
32
+ | 异常处理 | `<N>/<N>` | `<M>` | `<严重程度分布>` |
33
+ | 并发稳定性 | `<N>/<N>` | `<M>` | `<严重程度分布>` |
34
+ | 性能稳定性 | `<N>/<N>` | `<M>` | `<严重程度分布>` |
35
+ | 资源管理 | `<N>/<N>` | `<M>` | `<严重程度分布>` |
36
+ | 初始化顺序 | `<N>/<N>` | `<M>` | `<严重程度分布>` |
37
+ | 边界条件 | `<N>/<N>` | `<M>` | `<严重程度分布>` |
38
+ | 生命周期 | `<N>/<N>` | `<M>` | `<严重程度分布>` |
39
+ | 内存稳定性 | `<N>/<N>` | `<M>` | `<严重程度分布>` |
40
+ | 图形稳定性 | `<N>/<N>` | `<M>` | `<严重程度分布>` |
41
+ | **总计** | **`<N>/<N>`** | **`<M>`** | **`<严重程度分布>`** |
42
+
43
+ ---
44
+
45
+ ## 检出问题详情
46
+
47
+ ### CRITICAL 级别问题(`<N>` 个)
48
+
49
+ #### 问题 1: `<问题标题>`
50
+
51
+ 问题格式严格参考[检出问题格式模板](references/PROBLEM_TEMPLATE.md)
52
+
53
+ ---
54
+
55
+ #### 问题 2: `<问题标题>`
56
+
57
+ 问题格式严格参考[检出问题格式模板](references/PROBLEM_TEMPLATE.md)
58
+
59
+ ---
60
+
61
+ `<重复以上结构列出所有CRITICAL问题>`
62
+
63
+ ---
64
+
65
+ ### HIGH 级别问题(`<N>` 个)
66
+
67
+ #### 问题 `<序号>`: `<问题标题>`
68
+
69
+ 问题格式严格参考[检出问题格式模板](references/PROBLEM_TEMPLATE.md)
70
+
71
+ ---
72
+
73
+ #### 问题 `<序号>`: `<问题标题>`
74
+
75
+ 问题格式严格参考[检出问题格式模板](references/PROBLEM_TEMPLATE.md)
76
+
77
+ ---
78
+
79
+ `<重复以上结构列出所有HIGH问题>`
80
+
81
+ ---
82
+
83
+ ### MEDIUM 级别问题(`<N>` 个)
84
+
85
+ #### 问题 `<序号>`: `<问题标题>`
86
+
87
+ 问题格式严格参考[检出问题格式模板](references/PROBLEM_TEMPLATE.md)
88
+
89
+ ---
90
+
91
+ #### 问题 `<序号>`: `<问题标题>`
92
+
93
+ 问题格式严格参考[检出问题格式模板](references/PROBLEM_TEMPLATE.md)
94
+
95
+ ---
96
+
97
+ `<重复以上结构列出所有MEDIUM问题>`
98
+
99
+ ---
100
+
101
+ ## 修复优先级建议
102
+
103
+ 根据严重程度和影响范围,建议按以下优先级修复:
104
+
105
+ ### 第一优先级(CRITICAL,`<N>`个)
106
+ 1. **`<问题分类1>`**: `<问题描述>`(`<数量>`个)
107
+ 2. **`<问题分类2>`**: `<问题描述>`(`<数量>`个)
108
+ 3. **`<问题分类3>`**: `<问题描述>`(`<数量>`个)
109
+
110
+ ### 第二优先级(HIGH,`<N>`个)
111
+ 1. **`<问题分类1>`**: `<问题描述>`(`<数量>`个)
112
+ 2. **`<问题分类2>`**: `<问题描述>`(`<数量>`个)
113
+ 3. **`<问题分类3>`**: `<问题描述>`(`<数量>`个)
114
+
115
+ ### 第三优先级(MEDIUM,`<N>`个)
116
+ 1. **`<问题分类1>`**: `<问题描述>`(`<数量>`个)
117
+ 2. **`<问题分类2>`**: `<问题描述>`(`<数量>`个)
118
+ 3. **`<问题分类3>`**: `<问题描述>`(`<数量>`个)
119
+
120
+ ---
121
+
122
+ ## 附录
123
+
124
+ ### 白名单过滤
125
+ - 文件路径: `<文件路径>`
126
+ - `<白名单过滤规则说明>`
127
+ - `<其他过滤条件>`
128
+
129
+ ---
130
+
131
+ **报告生成时间**: `<YYYY-MM-DD HH:MM:SS>`
132
+ **报告生成者**: Agent