Skip to content

Commit 23e1ebd

Browse files
committed
保留编译数据库多配置的不同上下文阻塞
1 parent 7171fdf commit 23e1ebd

3 files changed

Lines changed: 54 additions & 3 deletions

File tree

‎crates/codeguard-cli/src/c_family_compilation_discovery.rs‎

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,15 @@ pub(crate) fn observe<P: ObservationPort>(
2626
reason = match parse_c_family_compilation_database(&bytes) {
2727
Ok(entries) => {
2828
parsed = true;
29+
let blockers: std::collections::BTreeSet<_> = entries
30+
.iter()
31+
.filter_map(|entry| entry.execution_context_blocker())
32+
.collect();
33+
for blocker in &blockers {
34+
report
35+
.unknown_conditions
36+
.push(format!("{blocker}:{relative}"));
37+
}
2938
entries
3039
.iter()
3140
.find_map(|entry| entry.execution_context_blocker())
@@ -43,9 +52,10 @@ pub(crate) fn observe<P: ObservationPort>(
4352
report.observation_complete = false;
4453
report.blocked_paths.push(relative.into());
4554
}
46-
report
47-
.unknown_conditions
48-
.push(format!("{reason}:{relative}"));
55+
let condition = format!("{reason}:{relative}");
56+
if !report.unknown_conditions.contains(&condition) {
57+
report.unknown_conditions.push(condition);
58+
}
4959
let build_root = relative.rsplit_once('/').map_or(".", |(parent, _)| parent);
5060
report.checker_configurations.push(CheckerConfiguration {
5161
build_root: build_root.into(),
@@ -110,6 +120,41 @@ mod tests {
110120
assert!(report.build_roots.is_empty());
111121
}
112122

123+
#[test]
124+
fn multiple_compilation_contexts_keep_each_distinct_blocker() {
125+
let mut report = crate::discovery::empty_report(Path::new("project"));
126+
let observation = DatabaseObservation {
127+
bytes: br#"[
128+
{"directory":"/a","file":"a.cpp","arguments":["clang++","-std=c++17","@flags.rsp"]},
129+
{"directory":"/b","file":"a.cpp","arguments":["clang++","a.cpp"]},
130+
{"directory":"/c","file":"a.cpp","arguments":["clang++","-std=c++17","@other.rsp"]}
131+
]"#,
132+
changed: false,
133+
reads: Cell::new(0),
134+
};
135+
super::observe(
136+
&mut report,
137+
&observation,
138+
Path::new("project/compile_commands.json"),
139+
"compile_commands.json",
140+
);
141+
for reason in [
142+
"compilation_database_response_file_unresolved",
143+
"compilation_database_standard_missing",
144+
] {
145+
assert_eq!(
146+
report
147+
.unknown_conditions
148+
.iter()
149+
.filter(|entry| *entry == &format!("{reason}:compile_commands.json"))
150+
.count(),
151+
1
152+
);
153+
}
154+
assert_eq!(report.checker_configurations[0].configuration, "unknown");
155+
assert!(report.observation_complete);
156+
}
157+
113158
#[test]
114159
fn unstable_or_command_only_database_never_becomes_verified_config() {
115160
for (bytes, changed) in [

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,3 +1228,7 @@ The adapter SHALL parse bounded compilation database bytes without filesystem ac
12281228
#### Scenario: Static compilation arguments expose unresolved execution context
12291229
- **WHEN** the argument vector uses response files, frontend passthrough, compiler plugins or ambiguous/missing/unsupported explicit standards
12301230
- **THEN** initialization SHALL preserve configuration unknown and execution not_run, expose a concrete context blocker, and SHALL NOT classify that blocker as a source violation. No known blocker SHALL NOT imply execution authorization or verified project coverage.
1231+
1232+
#### Scenario: Distinct blockers across compilation configurations remain visible
1233+
- **WHEN** multiple argument-vector entries have different known execution-context blockers
1234+
- **THEN** observation SHALL retain each distinct per-entry blocker in unknown conditions, deduplicate identical reasons, and SHALL NOT stop reporting after the first entry or claim complete flag auditing

‎tests/acceptance/c-family-compilation-database-init.md‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@
1313
新增上下文诊断:响应文件、前端透传、插件、重复标准、缺标准、不支持标准6类参数反例通过。适配器3项测试通过;当前公开CLI定向4项默认/WASM各通过(WASM 2.00秒),严格Clippy通过。配置可读不等于执行上下文可用;未命中已知阻塞也不授权运行。
1414

1515
低误报修复:合法-stdlib选择曾被-std前缀匹配误识别为重复标准,新增测试先复现失败后修正。Apple Clang21实际stdin核验-std=c++17、--std=c++17、--std c++17均接受,-std c++17拒绝;仅接纳核对过的选项形式。适配器4项通过,默认初始化47项通过(2.47秒),WASM新增合法反例1项通过(1.82秒)。不扩大语言版本或项目执行资格。
16+
17+
多配置诊断修复:同一文件多条数据库配置中的不同阻塞类型全部保留,同类原因去重;新增反例先因遗漏standard_missing失败,修复后发现定向3项默认/WASM各通过,全工作区WASM严格Clippy通过。这里是每条配置的首个已知阻塞汇总,不是完整编译器参数审计,仍不执行项目命令。

0 commit comments

Comments
 (0)