@@ -20,27 +20,36 @@ import codingstandards.c.misra
20
20
import codingstandards.cpp.Identifiers
21
21
import codingstandards.cpp.Scope
22
22
23
+ ExternalIdentifiers getExternalIdentifierTarget ( NameQualifiableElement nqe ) {
24
+ result = nqe .( Access ) .getTarget ( )
25
+ or
26
+ result = nqe .( FunctionCall ) .getTarget ( )
27
+ }
28
+
23
29
/**
24
- * Re-introduce function calls into access description as
25
- * "any reference"
30
+ * A reference to an external identifier, either as an `Access` or a `FunctionCall`.
26
31
*/
27
- class Reference extends NameQualifiableElement {
28
- Reference ( ) {
29
- this instanceof Access or
30
- this instanceof FunctionCall
31
- }
32
+ class ExternalIdentifierReference extends NameQualifiableElement {
33
+ ExternalIdentifierReference ( ) { exists ( getExternalIdentifierTarget ( this ) ) }
34
+
35
+ ExternalIdentifiers getExternalIdentifierTarget ( ) { result = getExternalIdentifierTarget ( this ) }
36
+ }
37
+
38
+ predicate isReferencedInTranslationUnit (
39
+ ExternalIdentifiers e , ExternalIdentifierReference r , TranslationUnit t
40
+ ) {
41
+ r .getExternalIdentifierTarget ( ) = e and
42
+ r .getFile ( ) = t
32
43
}
33
44
34
- from ExternalIdentifiers e , Reference a1 , TranslationUnit t1
45
+ from ExternalIdentifiers e , ExternalIdentifierReference a1 , TranslationUnit t1
35
46
where
36
47
not isExcluded ( e , Declarations6Package:: shouldNotBeDefinedWithExternalLinkageQuery ( ) ) and
37
- ( a1 .( Access ) .getTarget ( ) = e or a1 .( FunctionCall ) .getTarget ( ) = e ) and
38
- a1 .getFile ( ) = t1 and
39
- //not accessed in any other translation unit
40
- not exists ( TranslationUnit t2 , Reference a2 |
41
- not t1 = t2 and
42
- ( a2 .( Access ) .getTarget ( ) = e or a2 .( FunctionCall ) .getTarget ( ) = e ) and
43
- a2 .getFile ( ) = t2
48
+ isReferencedInTranslationUnit ( e , a1 , t1 ) and
49
+ // Not referenced in any other translation unit
50
+ not exists ( TranslationUnit t2 |
51
+ isReferencedInTranslationUnit ( e , _, t2 ) and
52
+ not t1 = t2
44
53
)
45
54
select e , "Declaration with external linkage is accessed in only one translation unit $@." , a1 ,
46
55
a1 .toString ( )
0 commit comments