@@ -345,23 +345,53 @@ impl RustAnalyzer {
345345 if call_node. name . contains ( "push_str" ) || call_node. name . contains ( "push" ) {
346346 string_pushes += 1 ;
347347 }
348-
349- // Detect string concatenation in loops
350- if call_node. name . contains ( "+" ) && string_pushes > 2 {
351- issues. push ( PerformanceIssue {
352- issue_type : PerformanceIssueType :: StringConcatenation ,
353- location : call_node. span . clone ( ) ,
354- description : "Multiple string operations detected" . to_string ( ) ,
355- suggestion : Some (
356- "Consider using String::with_capacity() or format! macro"
357- . to_string ( ) ,
358- ) ,
359- impact : PerformanceImpact :: Medium ,
360- } ) ;
361- }
362348 }
363349 }
364350 }
351+
352+ // If we have multiple string push operations, it's a performance issue
353+ if string_pushes >= 3 {
354+ issues. push ( PerformanceIssue {
355+ issue_type : PerformanceIssueType :: StringConcatenation ,
356+ location : function_node. span . clone ( ) ,
357+ description : format ! (
358+ "Multiple string operations detected: {} push operations" ,
359+ string_pushes
360+ ) ,
361+ suggestion : Some (
362+ "Consider using String::with_capacity() or format! macro" . to_string ( ) ,
363+ ) ,
364+ impact : PerformanceImpact :: Medium ,
365+ } ) ;
366+ }
367+ }
368+
369+ // Fallback: Check entire function content for string patterns if scope_map is empty
370+ if !self . scope_map . contains_key ( & function_node. id )
371+ || self . scope_map . get ( & function_node. id ) . unwrap ( ) . is_empty ( )
372+ {
373+ let mut push_str_count = 0 ;
374+
375+ for node in & self . nodes {
376+ if matches ! ( node. kind, NodeKind :: Call ) && node. name . contains ( "push_str" ) {
377+ push_str_count += 1 ;
378+ }
379+ }
380+
381+ if push_str_count >= 3 {
382+ issues. push ( PerformanceIssue {
383+ issue_type : PerformanceIssueType :: StringConcatenation ,
384+ location : function_node. span . clone ( ) ,
385+ description : format ! (
386+ "Multiple string operations detected: {} push_str calls" ,
387+ push_str_count
388+ ) ,
389+ suggestion : Some (
390+ "Consider using String::with_capacity() or format! macro" . to_string ( ) ,
391+ ) ,
392+ impact : PerformanceImpact :: Medium ,
393+ } ) ;
394+ }
365395 }
366396
367397 issues
@@ -659,6 +689,27 @@ impl RustAnalyzer {
659689 }
660690 }
661691
692+ // Fallback: Check for transmute calls globally if scope_map is empty
693+ if !self . scope_map . contains_key ( & function_node. id )
694+ || self . scope_map . get ( & function_node. id ) . unwrap ( ) . is_empty ( )
695+ {
696+ for node in & self . nodes {
697+ if matches ! ( node. kind, NodeKind :: Call ) && node. name . contains ( "transmute" ) {
698+ issues. push ( SafetyIssue {
699+ issue_type : SafetyIssueType :: TypeTransmutation ,
700+ location : function_node. span . clone ( ) ,
701+ description : "Type transmutation is extremely dangerous" . to_string ( ) ,
702+ rationale : None ,
703+ mitigation : Some (
704+ "Validate size and alignment requirements, consider safer alternatives"
705+ . to_string ( ) ,
706+ ) ,
707+ risk_level : RiskLevel :: Critical ,
708+ } ) ;
709+ }
710+ }
711+ }
712+
662713 issues
663714 }
664715
@@ -744,6 +795,32 @@ impl RustAnalyzer {
744795 }
745796 }
746797
798+ // Fallback: Check for multiple lock calls globally if scope_map is empty
799+ if !self . scope_map . contains_key ( & function_node. id )
800+ || self . scope_map . get ( & function_node. id ) . unwrap ( ) . is_empty ( )
801+ {
802+ let lock_calls: Vec < & Node > = self
803+ . nodes
804+ . iter ( )
805+ . filter ( |n| matches ! ( n. kind, NodeKind :: Call ) && n. name . contains ( "lock" ) )
806+ . collect ( ) ;
807+
808+ if lock_calls. len ( ) > 1 {
809+ issues. push ( ConcurrencyIssue {
810+ issue_type : ConcurrencyIssueType :: DeadlockPotential ,
811+ location : function_node. span . clone ( ) ,
812+ description : format ! (
813+ "Multiple mutex locks detected ({}), potential deadlock risk" ,
814+ lock_calls. len( )
815+ ) ,
816+ suggestion : Some (
817+ "Ensure consistent lock ordering or use try_lock with timeouts" . to_string ( ) ,
818+ ) ,
819+ severity : ConcurrencySeverity :: High ,
820+ } ) ;
821+ }
822+ }
823+
747824 issues
748825 }
749826
0 commit comments