Skip to content

Commit eefebc5

Browse files
committed
在文档AST解析阶段执行声明和参数预算
1 parent d4afb9f commit eefebc5

7 files changed

Lines changed: 62 additions & 5 deletions

File tree

‎crates/codeguard-adapters/src/clang_documentation_ast.rs‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ pub fn parse_clang_documentation_ast(raw: &[u8], source: &[u8]) -> Result<Value,
3939
})
4040
});
4141
if kind == "FunctionDecl" || ordinary_method {
42+
if functions.len() >= 2000 {
43+
return Err("clang_documentation_ast_budget_exceeded");
44+
}
4245
functions.push(function(node, text)?);
4346
continue;
4447
}
@@ -140,6 +143,9 @@ fn function(node: &Value, source: &str) -> Result<Value, &'static str> {
140143
.iter()
141144
.filter(|p| p["kind"] == "ParmVarDecl")
142145
.collect();
146+
if params.len() > 256 {
147+
return Err("clang_documentation_ast_budget_exceeded");
148+
}
143149
let comments: Vec<&Value> = parts
144150
.iter()
145151
.filter(|p| p["kind"] == "FullComment")

‎crates/codeguard-adapters/tests/clang_documentation_ast_contract.rs‎

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,44 @@ fn oversized_inputs_macro_locations_and_malformed_child_lists_are_rejected() {
144144
.is_err()
145145
);
146146
}
147+
148+
#[test]
149+
fn parser_stops_at_report_function_and_parameter_limits() {
150+
let mut source = String::new();
151+
let mut declarations = Vec::new();
152+
for index in 0..2001 {
153+
let name = format!("f{index}");
154+
let offset = source.len() + 4;
155+
source.push_str(&format!("int {name}();\n"));
156+
declarations.push(json!({"kind":"FunctionDecl","name":name,"loc":{"offset":offset,"tokLen":name.len()},"type":{"qualType":"int ()"}}));
157+
}
158+
let mut ast = json!({"kind":"TranslationUnitDecl","inner":declarations});
159+
assert_eq!(
160+
parse_clang_documentation_ast(&serde_json::to_vec(&ast).unwrap(), source.as_bytes()).err(),
161+
Some("clang_documentation_ast_budget_exceeded")
162+
);
163+
ast["inner"].as_array_mut().unwrap().pop();
164+
assert_eq!(
165+
parse_clang_documentation_ast(&serde_json::to_vec(&ast).unwrap(), source.as_bytes())
166+
.unwrap()["functions"]
167+
.as_array()
168+
.unwrap()
169+
.len(),
170+
2000
171+
);
172+
let source = "int f(int x);";
173+
let mut ast = function(source, "f", vec![]);
174+
let params: Vec<_> = (0..257)
175+
.map(|index| json!({"kind":"ParmVarDecl","name":format!("x{index}")}))
176+
.collect();
177+
ast["inner"][0]["inner"] = json!(params);
178+
assert_eq!(
179+
parse_clang_documentation_ast(&serde_json::to_vec(&ast).unwrap(), source.as_bytes()).err(),
180+
Some("clang_documentation_ast_budget_exceeded")
181+
);
182+
ast["inner"][0]["inner"].as_array_mut().unwrap().pop();
183+
assert!(
184+
parse_clang_documentation_ast(&serde_json::to_vec(&ast).unwrap(), source.as_bytes())
185+
.is_ok()
186+
);
187+
}

‎openspec/changes/introduce-rust-codeguard-cli/specs/native-tool-adapters/spec.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1248,3 +1248,11 @@ The C++ adapter SHALL observe explicitly declared, identifier-named constructors
12481248
#### Scenario: Constructor parameter description is empty
12491249
- **WHEN** an explicit in-class constructor has a purpose but an empty description for a named parameter
12501250
- **THEN** observation SHALL retain the missing parameter component, mark return description not_applicable, and SHALL NOT invent a return obligation or grant semantic qualification
1251+
1252+
### Requirement: Clang documentation parsing SHALL enforce report cardinality budgets
1253+
1254+
Parsing SHALL stop with an explicit budget failure before producing more than 2000 function/method/constructor observations or processing more than 256 direct parameters for any observed declaration. Exceeding either limit SHALL NOT truncate into a clean or complete report; inputs exactly at the limits SHALL remain eligible for the existing source, structure and qualification checks.
1255+
1256+
#### Scenario: Oversized declaration inventory
1257+
- **WHEN** an AST has 2001 supported declarations or a supported declaration has 257 parameters
1258+
- **THEN** parsing SHALL return clang_documentation_ast_budget_exceeded and SHALL NOT produce an apparently complete partial inventory

‎openspec/changes/introduce-rust-codeguard-cli/tasks.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,7 @@
345345
- [ ] 8.26 实现 c 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。
346346
- [ ] 8.27 完成 c 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。
347347
- [ ] 8.28 为 cpp 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。
348-
- [ ] 8.29 实现 cpp 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 新增C++17局部原生/WASM对照:12例实际执行,包含2例语义边界;1测试通过、0忽略,未授予生产资格,见[验收记录](../../../tests/acceptance/cpp17-native-wasm-differential.md)。 编译数据库静态解析基础已补充:有界参数数组、原序多配置、命令字符串不执行及畸形/超限反例;2测试通过,已接到项目发现,记录双读稳定摘要与unknown配置;发现测试先失败后2项通过。尚未接到原生执行,不升级构建生态状态。 公开init定向4项默认/WASM均通过,补充六类参数上下文阻塞,涵盖静态摘要持久化、command-only阻塞及配置变化/删除时保留任务;见[初始化验收](../../../tests/acceptance/c-family-compilation-database-init.md)。 C++17类内普通方法及显式构造已有实际Clang结构观察,构造不要求返回说明;类/析构/模板等仍未解析,见[局部验收](../../../tests/acceptance/cpp17-method-documentation.md)。
348+
- [ ] 8.29 实现 cpp 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 新增C++17局部原生/WASM对照:12例实际执行,包含2例语义边界;1测试通过、0忽略,未授予生产资格,见[验收记录](../../../tests/acceptance/cpp17-native-wasm-differential.md)。 编译数据库静态解析基础已补充:有界参数数组、原序多配置、命令字符串不执行及畸形/超限反例;2测试通过,已接到项目发现,记录双读稳定摘要与unknown配置;发现测试先失败后2项通过。尚未接到原生执行,不升级构建生态状态。 公开init定向4项默认/WASM均通过,补充六类参数上下文阻塞,涵盖静态摘要持久化、command-only阻塞及配置变化/删除时保留任务;见[初始化验收](../../../tests/acceptance/c-family-compilation-database-init.md)。 C++17类内普通方法及显式构造已有实际Clang结构观察,构造不要求返回说明;解析阶段已有2000声明/256参数预算,超限明确阻塞不截断。类/析构/模板等仍未解析,见[局部验收](../../../tests/acceptance/cpp17-method-documentation.md)。
349349
- [ ] 8.30 完成 cpp 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。
350350
- [ ] 8.31 为 objc 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。
351351
- [ ] 8.32 实现 objc 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。

‎rulepacks/production_acceptance_plan_v1.json‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616
"crates/codeguard-adapters/src/cargo_documentation_config.rs": "2544cb061cd0f89cd888b6e5de933c88ad6efd6a160e81c5d5869023bb67e8b6",
1717
"crates/codeguard-adapters/src/cargo_documentation_workspace.rs": "0814890f213919c7a111ea520e26ced4110d6afa98b8583e1b99d79027aa6ebd",
1818
"crates/codeguard-adapters/src/cargo_workspace_reference.rs": "95f9ed06ac881ee17a124edca4ae3f6541690ef60aeabd0d1a6ffac0ede1cb02",
19-
"crates/codeguard-adapters/src/clang_documentation_ast.rs": "5396c23863b2b89d954cc2191737920f79847d9e3113f7ee5a07312a627a91df",
19+
"crates/codeguard-adapters/src/clang_documentation_ast.rs": "cd23308d05a0f03d0805c26e0749145ee0a2e35b535527dff70c46c9778a0ac5",
2020
"crates/codeguard-adapters/src/clang_documentation_rule.rs": "4e7a99010c5a62fdd6812ce16068749863a5777df1103e304055ad8e3d8f834c",
2121
"crates/codeguard-adapters/src/clang_documentation_structure.rs": "368112aafedb8144d38cc05466586e7b3a21e6e937ceaade76133b9113fd005a",
2222
"crates/codeguard-adapters/src/gradle_dependency_check_plan.rs": "dfb85a3dfcf6c5e0697bb3eb58ecbd8f2d47feb71f60db506f765b0ee86b23f3",
2323
"crates/codeguard-adapters/src/gradle_owasp_report_ownership_parser.rs": "11d06f8905022307d99b50e68d1bfd44bd2f2fdd29d85872bef1d40864b83c00",
2424
"crates/codeguard-adapters/src/lib.rs": "c312683cf5f82653095f8ef00b9a824bef76655f4878b9691a077387a3cf18c9",
2525
"crates/codeguard-adapters/src/ruff_settings.rs": "23736d55ef974a9f0b571d162365c6554001fa5ee3b2b69db6deb4507466af88",
26-
"crates/codeguard-adapters/tests/clang_documentation_ast_contract.rs": "3ed16ccb058ecfa147228ddb5dac768be2ce5d0f214324766324c09bb2a60ced",
26+
"crates/codeguard-adapters/tests/clang_documentation_ast_contract.rs": "72784b15c71cc7aae81f70bd5a8af40564b39ce3e190543645a77057aae99561",
2727
"crates/codeguard-adapters/tests/clang_documentation_contract.rs": "9d603b7ccb435c5e55837156e76d506573e8703aadf7017be07b6cf28281e261",
2828
"crates/codeguard-adapters/tests/clang_documentation_structure_contract.rs": "d27769a0da59999d186cbe3b5a6c059e2a1269e00708c1f967c5f24f25367141",
2929
"crates/codeguard-adapters/tests/ruff_settings_contract.rs": "a34cd88caaf4d1d49688bcbc31d534ba21b5298f5e1a1c9bd59125ceda3e072a",
@@ -177,7 +177,7 @@
177177
"tests/acceptance/clang-standalone-native.md": "155e64133bc4353cdbfe223c8e2c5bf1d2ab2c3e95c7c2e0232e9931988db017",
178178
"tests/acceptance/clippy-documentation-aggregate.md": "99f0b90dafda408b755f414277b55313c453771131038adada6295e572f15cc6",
179179
"tests/acceptance/clippy-documentation-contract.md": "7843e99c75b262710126c0c1b56596a0a004db563603b0575564e86416304060",
180-
"tests/acceptance/cpp17-method-documentation.md": "46c26b5aef2c417e8af1d5c3e181780adcee86248d796bb9daa029c54a919a77",
180+
"tests/acceptance/cpp17-method-documentation.md": "e9c2dc053cfeb48d09d7538450513e2c0baa166e2e3f603082dbba9cc3442741",
181181
"tests/acceptance/cpp17-native-wasm-differential.md": "5177a5877bcba9d417c18d373a9431f86e95cfdea26d0f91a12241a5e8881f3e",
182182
"tests/acceptance/erlang-native-first-workbench.md": "3303eaec7903b193c5794901831b0b89fc0e6b6aae80086d60b0ef8b75b9d4d1",
183183
"tests/acceptance/eslint-directory-feedback.md": "8aa71fcd3bb1b7b5dde384b14e883cbc8190546e07e86c63d8d936ebfa42a05b",

‎tests/acceptance/cpp17-method-documentation.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,5 @@
77
[机器证据](evidence/cpp17-method-documentation.json)仅在全部断言通过后写出,绑定源码、测试、编译器及实际AST摘要,保存脱敏结构观察。本轮未验收智能体宿主、完整项目配置、独立精度或任务关闭。
88

99
当前显式构造函数增量:新测试先失败后通过,空参数描述产生parameter:size而不产生return;类外构造上下文仍未解析。真实Clang样例包含有用途及参数说明的Box(int size),read/clear/Box三者无缺失组件,undocumented缺少注释,类/运算符仍未解析。最终AST6项、结构合约含真实工具4项实际通过、0忽略;同名机器证据已更新为本次输入、测试及AST摘要,历史记录可从b455217读取。
10+
11+
解析资源增量:合成AST反例先复现2001声明被完整返回,随后在解析阶段加2000声明/256直接参数上限;2001/257返回明确预算错误,2000/256仍可解析。不截断成完整报告。最终AST7项、结构合约含真实Clang4项通过;这是边界功能验收,不是生产吞吐或延迟基准。

‎tests/acceptance/evidence/production-acceptance-plan/all.json‎

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)