@@ -20,27 +20,36 @@ import codingstandards.c.misra
2020import codingstandards.cpp.Identifiers
2121import codingstandards.cpp.Scope
2222
23+ ExternalIdentifiers getExternalIdentifierTarget ( NameQualifiableElement nqe ) {
24+ result = nqe .( Access ) .getTarget ( )
25+ or
26+ result = nqe .( FunctionCall ) .getTarget ( )
27+ }
28+
2329/**
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`.
2631 */
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
3243}
3344
34- from ExternalIdentifiers e , Reference a1 , TranslationUnit t1
45+ from ExternalIdentifiers e , ExternalIdentifierReference a1 , TranslationUnit t1
3546where
3647 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
4453 )
4554select e , "Declaration with external linkage is accessed in only one translation unit $@." , a1 ,
4655 a1 .toString ( )
0 commit comments