33//! This module provides structured parsing of Rust code using the `syn` crate
44//! to eliminate false positives from text-based pattern matching.
55
6+ use crate :: utils:: debug_logger:: VerbosityLevel ;
7+ use crate :: { debug_print, debug_warn} ;
68use anyhow:: { Context , Result } ;
79use quote:: ToTokens ;
810use std:: collections:: HashMap ;
@@ -378,22 +380,20 @@ impl SecurityVisitor {
378380 receiver_str
379381 ) ;
380382
381- // Check for explicit owner validation patterns in the surrounding code
382- let code_context = & self . source_code ; // Access to full source for context analysis
383-
384- // Look for common owner validation patterns
385- let has_owner_check = code_context. contains ( "owner ==" )
386- || code_context. contains ( "owner !=" )
387- || code_context. contains ( "require!(" ) && code_context. contains ( ".owner" )
388- || code_context. contains ( "assert_eq!(" ) && code_context. contains ( ".owner" )
389- || code_context. contains ( "program_id" ) && code_context. contains ( "==" )
390- || code_context. contains ( "#[account(owner" )
391- || code_context. contains ( "owner_id" ) ;
383+ // Check for explicit owner validation patterns using line tracker
384+ // Look for common owner validation patterns in the code
385+ let has_owner_check = self . line_tracker . find_all_pattern_lines ( "owner ==" ) . len ( ) > 0
386+ || self . line_tracker . find_all_pattern_lines ( "owner !=" ) . len ( ) > 0
387+ || ( self . line_tracker . find_all_pattern_lines ( "require!(" ) . len ( ) > 0 && self . line_tracker . find_all_pattern_lines ( ".owner" ) . len ( ) > 0 )
388+ || ( self . line_tracker . find_all_pattern_lines ( "assert_eq!(" ) . len ( ) > 0 && self . line_tracker . find_all_pattern_lines ( ".owner" ) . len ( ) > 0 )
389+ || ( self . line_tracker . find_all_pattern_lines ( "program_id" ) . len ( ) > 0 && self . line_tracker . find_all_pattern_lines ( "==" ) . len ( ) > 0 )
390+ || self . line_tracker . find_all_pattern_lines ( "#[account(owner" ) . len ( ) > 0
391+ || self . line_tracker . find_all_pattern_lines ( "owner_id" ) . len ( ) > 0 ;
392392
393393 // Check for Anchor constraint-based validation
394- let has_anchor_owner_constraint = code_context . contains ( "#[account(owner =" )
395- || code_context . contains ( "owner @ " )
396- || code_context . contains ( "owner: " ) ;
394+ let has_anchor_owner_constraint = self . line_tracker . find_all_pattern_lines ( "#[account(owner =" ) . len ( ) > 0
395+ || self . line_tracker . find_all_pattern_lines ( "owner @ " ) . len ( ) > 0
396+ || self . line_tracker . find_all_pattern_lines ( "owner: " ) . len ( ) > 0 ;
397397
398398 debug_print ! (
399399 VerbosityLevel :: Detailed ,
@@ -412,21 +412,19 @@ impl SecurityVisitor {
412412 receiver_str
413413 ) ;
414414
415- // Check for explicit signer validation patterns in the surrounding code
416- let code_context = & self . source_code ;
417-
418- // Look for common signer validation patterns
419- let has_signer_check = code_context. contains ( "is_signer" )
420- || code_context. contains ( "require!(" )
421- && ( code_context. contains ( "signer" ) || code_context. contains ( "signed" ) )
422- || code_context. contains ( "assert!(" ) && code_context. contains ( "is_signer" )
423- || code_context. contains ( "#[account(signer" )
424- || code_context. contains ( "Signer<" ) ;
415+ // Check for explicit signer validation patterns using line tracker
416+ // Look for common signer validation patterns in the code
417+ let has_signer_check = self . line_tracker . find_all_pattern_lines ( "is_signer" ) . len ( ) > 0
418+ || ( self . line_tracker . find_all_pattern_lines ( "require!(" ) . len ( ) > 0
419+ && ( self . line_tracker . find_all_pattern_lines ( "signer" ) . len ( ) > 0 || self . line_tracker . find_all_pattern_lines ( "signed" ) . len ( ) > 0 ) )
420+ || ( self . line_tracker . find_all_pattern_lines ( "assert!(" ) . len ( ) > 0 && self . line_tracker . find_all_pattern_lines ( "is_signer" ) . len ( ) > 0 )
421+ || self . line_tracker . find_all_pattern_lines ( "#[account(signer" ) . len ( ) > 0
422+ || self . line_tracker . find_all_pattern_lines ( "Signer<" ) . len ( ) > 0 ;
425423
426424 // Check for conditional signer validation patterns
427- let has_conditional_signer = code_context . contains ( "if" )
428- && code_context . contains ( "is_signer" )
429- || code_context . contains ( "match" ) && code_context . contains ( "signer" ) ;
425+ let has_conditional_signer = ( self . line_tracker . find_all_pattern_lines ( "if" ) . len ( ) > 0
426+ && self . line_tracker . find_all_pattern_lines ( "is_signer" ) . len ( ) > 0 )
427+ || ( self . line_tracker . find_all_pattern_lines ( "match" ) . len ( ) > 0 && self . line_tracker . find_all_pattern_lines ( "signer" ) . len ( ) > 0 ) ;
430428
431429 debug_print ! (
432430 VerbosityLevel :: Detailed ,
0 commit comments