File tree Expand file tree Collapse file tree 3 files changed +65
-1
lines changed Expand file tree Collapse file tree 3 files changed +65
-1
lines changed Original file line number Diff line number Diff line change @@ -19,7 +19,18 @@ import codingstandards.c.misra
1919from  Macro  m 
2020where 
2121  not  isExcluded ( m ,  DeadCodePackage:: unusedMacroDeclarationQuery ( ) )  and 
22+   // We consider a macro "used" if there is a macro access 
2223  not  exists ( MacroAccess  ma  |  ma .getMacro ( )  =  m )  and 
24+   // Or if there exists a check whether the macro is defined which the extractor 
25+   // hasn't been able to tie to a macro (usually because this use came before 
26+   // the macro was defined e.g. a header guard) 
27+   not  exists ( PreprocessorBranchDirective  bd  | 
28+     // Covers the #ifdef and #ifndef cases 
29+     bd .getHead ( )  =  m .getName ( ) 
30+     or 
31+     // Covers the use of defined() to check if a macro is defined 
32+     m .getName ( )  =  bd .getHead ( ) .regexpCapture ( ".*defined *\\(? *([^\\s()]+) *\\)?\\.*" ,  1 ) 
33+   )  and 
2334  // We consider a macro "used" if the name is undef-ed at some point in the same file, or a file 
2435  // that includes the file defining the macro. This will over approximate use in the case of a 
2536  // macro which is defined, then undefined, then re-defined but not used. 
Original file line number Diff line number Diff line change 1313void  test () {
1414  MACRO2 ;
1515  HEADER_MACRO2 ;
16- }
16+ }
17+ 
18+ #define  CHECKED_MACRO_1  // COMPLIANT - used in branch 
19+ #define  CHECKED_MACRO_2  // COMPLIANT - used in branch 
20+ #define  CHECKED_MACRO_3  // COMPLIANT - used in branch 
21+ 
22+ #ifdef  CHECKED_MACRO_1 
23+ #endif 
24+ 
25+ #ifndef  CHECKED_MACRO_2 
26+ #endif 
27+ 
28+ #if  defined(CHECKED_MACRO_3 )
29+ #endif 
30+ 
31+ // In the case above, the extractor will identify macro accesses with each use 
32+ // of the macro. In the case above, the extractor does not tie them together, 
33+ // but the standard considers this acceptable usage. Notably, this type of 
34+ // pattern occurs for header guards. 
35+ 
36+ #ifdef  CHECKED_MACRO_BEFORE_1 
37+ #endif 
38+ 
39+ #ifndef  CHECKED_MACRO_BEFORE_2 
40+ #endif 
41+ 
42+ #if  defined(CHECKED_MACRO_BEFORE_3 )
43+ #endif 
44+ 
45+ // clang-format off 
46+ 
47+ #if  defined (CHECKED_MACRO_BEFORE_4 )
48+ #endif 
49+ 
50+ #if  defined( CHECKED_MACRO_BEFORE_5  )
51+ #endif 
52+ 
53+ #if  defined ( CHECKED_MACRO_BEFORE_6  )
54+ #endif 
55+ 
56+ #if  defined CHECKED_MACRO_BEFORE_7 
57+ #endif 
58+ 
59+ // clang-format on 
60+ 
61+ #define  CHECKED_MACRO_BEFORE_1  // COMPLIANT - used in branch 
62+ #define  CHECKED_MACRO_BEFORE_2  // COMPLIANT - used in branch 
63+ #define  CHECKED_MACRO_BEFORE_3  // COMPLIANT - used in branch 
64+ #define  CHECKED_MACRO_BEFORE_4  // COMPLIANT - used in branch 
65+ #define  CHECKED_MACRO_BEFORE_5  // COMPLIANT - used in branch 
66+ #define  CHECKED_MACRO_BEFORE_6  // COMPLIANT - used in branch 
67+ #define  CHECKED_MACRO_BEFORE_7  // COMPLIANT - used in branch 
Original file line number Diff line number Diff line change 1+  -  ` RULE-2-5 `  - ` UnusedMacroDeclaration.ql ` :
2+    -  Exclude false positives where a macro was used before definition, for example a header guard.
 
 
   
 
     
   
   
          
    
    
     
    
      
     
     
    You can’t perform that action at this time.
  
 
    
  
    
      
        
     
       
      
     
   
 
    
    
  
 
  
 
     
    
0 commit comments