@@ -98,27 +98,33 @@ fn run_audit(args: AuditArgs) {
9898
9999 let source_files = discovery:: discover_source_files ( & krate. source_dir , & fs_read) ;
100100 let mut dep_findings = Vec :: new ( ) ;
101+ let mut parsed_files = Vec :: new ( ) ;
101102
102103 for file_path in source_files {
103104 match parser:: parse_file ( & file_path, & fs_read) {
104105 Ok ( parsed) => {
105106 let findings =
106107 det. analyse ( & parsed, & krate. name , & krate. version , & crate_deny) ;
107108 dep_findings. extend ( findings) ;
109+ parsed_files. push ( parsed) ;
108110 }
109111 Err ( _e) => {
110112 // Silently skip unparseable files in deps
111113 }
112114 }
113115 }
114116
115- let emap = export_map:: build_export_map (
117+ let mut emap = export_map:: build_export_map (
116118 & normalized_name,
117119 & krate. version ,
118120 & dep_findings,
119121 & krate. source_dir ,
120122 ) ;
121123
124+ // Also export extern function declarations (e.g., libgit2-sys, sqlite3-sys)
125+ // so callers like git2 get cross-crate FFI findings.
126+ export_map:: add_extern_exports ( & mut emap, & parsed_files, & krate. source_dir ) ;
127+
122128 // Cache for registry deps
123129 if krate. is_dependency {
124130 export_map:: save_export_map_cache ( & cache_dir, & emap, & fs_write) ;
@@ -170,26 +176,29 @@ fn run_audit(args: AuditArgs) {
170176
171177 let source_files = discovery:: discover_source_files ( & krate. source_dir , & fs_read) ;
172178 let mut dep_findings = Vec :: new ( ) ;
179+ let mut parsed_files = Vec :: new ( ) ;
173180
174181 for file_path in source_files {
175182 match parser:: parse_file ( & file_path, & fs_read) {
176183 Ok ( parsed) => {
177184 let findings =
178185 det. analyse ( & parsed, & krate. name , & krate. version , & crate_deny) ;
179186 dep_findings. extend ( findings) ;
187+ parsed_files. push ( parsed) ;
180188 }
181189 Err ( e) => {
182190 eprintln ! ( " Warning: {e}" ) ;
183191 }
184192 }
185193 }
186194
187- let emap = export_map:: build_export_map (
195+ let mut emap = export_map:: build_export_map (
188196 & normalized_name,
189197 & krate. version ,
190198 & dep_findings,
191199 & krate. source_dir ,
192200 ) ;
201+ export_map:: add_extern_exports ( & mut emap, & parsed_files, & krate. source_dir ) ;
193202
194203 if krate. is_dependency {
195204 export_map:: save_export_map_cache ( & cache_dir, & emap, & fs_write) ;
@@ -274,6 +283,7 @@ fn run_audit(args: AuditArgs) {
274283
275284 let source_files = discovery:: discover_source_files ( & krate. source_dir , & fs_read) ;
276285 let mut ws_crate_findings = Vec :: new ( ) ;
286+ let mut ws_parsed_files = Vec :: new ( ) ;
277287
278288 for file_path in source_files {
279289 if config:: should_exclude ( & file_path, & cfg. analysis . exclude ) {
@@ -285,6 +295,7 @@ fn run_audit(args: AuditArgs) {
285295 let findings =
286296 det. analyse ( & parsed, & krate. name , & krate. version , & crate_deny) ;
287297 ws_crate_findings. extend ( findings) ;
298+ ws_parsed_files. push ( parsed) ;
288299 }
289300 Err ( e) => {
290301 eprintln ! ( " Warning: {e}" ) ;
@@ -294,12 +305,13 @@ fn run_audit(args: AuditArgs) {
294305
295306 // Build export map for this workspace crate (for downstream ws crates)
296307 let normalized_name = discovery:: normalize_crate_name ( & krate. name ) ;
297- let ws_emap = export_map:: build_export_map (
308+ let mut ws_emap = export_map:: build_export_map (
298309 & normalized_name,
299310 & krate. version ,
300311 & ws_crate_findings,
301312 & krate. source_dir ,
302313 ) ;
314+ export_map:: add_extern_exports ( & mut ws_emap, & ws_parsed_files, & krate. source_dir ) ;
303315 workspace_export_maps. push ( ws_emap) ;
304316
305317 all_findings. extend ( ws_crate_findings) ;
0 commit comments