Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd3d017b

Browse files
authored
Merge pull request#242 from github/lcartey/improve-identifier-performance
Improve performance of C queries related to identifiers
2 parents8dc1ea5 +68654e0 commitd3d017b

File tree

3 files changed

+59
-18
lines changed

3 files changed

+59
-18
lines changed

‎c/misra/src/rules/RULE-5-8/IdentifiersWithExternalLinkageNotUnique.ql‎

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,39 @@ import cpp
1515
import codingstandards.c.misra
1616
import codingstandards.cpp.Identifiers
1717

18-
fromDeclarationde,ExternalIdentifierse
18+
/**
19+
* Holds if the `identifierName` has conflicting declarations.
20+
*/
21+
predicateisExternalIdentifierNotUnique(stringidentifierName){
22+
// More than one declaration with this name
23+
count(Declarationd|d.getName()=identifierName)>1and
24+
// At least one declaration is an external identifier
25+
exists(ExternalIdentifierse|e.getName()=identifierName)
26+
}
27+
28+
/**
29+
* Holds if the `Declaration` `d` is conflicting with an external identifier.
30+
*/
31+
predicateisConflictingDeclaration(Declarationd,stringname){
32+
isExternalIdentifierNotUnique(name)and
33+
d.getName()=name
34+
}
35+
36+
/**
37+
* An external identifier which is not uniquely defined in the source code.
38+
*/
39+
classNotUniqueExternalIdentifierextendsExternalIdentifiers{
40+
NotUniqueExternalIdentifier(){isExternalIdentifierNotUnique(getName())}
41+
42+
DeclarationgetAConflictingDeclaration(){
43+
notresult=thisand
44+
isConflictingDeclaration(result,getName())
45+
}
46+
}
47+
48+
fromNotUniqueExternalIdentifiere,Declarationde
1949
where
2050
notisExcluded(de, Declarations6Package::identifiersWithExternalLinkageNotUniqueQuery())and
2151
notisExcluded(e, Declarations6Package::identifiersWithExternalLinkageNotUniqueQuery())and
22-
notde=eand
23-
de.getName()=e.getName()
52+
de=e.getAConflictingDeclaration()
2453
selectde,"Identifier conflicts with external identifier $@",e,e.getName()

‎c/misra/src/rules/RULE-8-7/ShouldNotBeDefinedWithExternalLinkage.ql‎

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,36 @@ import codingstandards.c.misra
2020
import codingstandards.cpp.Identifiers
2121
import codingstandards.cpp.Scope
2222

23+
ExternalIdentifiersgetExternalIdentifierTarget(NameQualifiableElementnqe){
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-
classReferenceextendsNameQualifiableElement{
28-
Reference(){
29-
thisinstanceofAccessor
30-
thisinstanceofFunctionCall
31-
}
32+
classExternalIdentifierReferenceextendsNameQualifiableElement{
33+
ExternalIdentifierReference(){exists(getExternalIdentifierTarget(this))}
34+
35+
ExternalIdentifiersgetExternalIdentifierTarget(){result=getExternalIdentifierTarget(this)}
36+
}
37+
38+
predicateisReferencedInTranslationUnit(
39+
ExternalIdentifierse,ExternalIdentifierReferencer,TranslationUnitt
40+
){
41+
r.getExternalIdentifierTarget()=eand
42+
r.getFile()=t
3243
}
3344

34-
fromExternalIdentifierse,Referencea1,TranslationUnitt1
45+
fromExternalIdentifierse,ExternalIdentifierReferencea1,TranslationUnitt1
3546
where
3647
notisExcluded(e, Declarations6Package::shouldNotBeDefinedWithExternalLinkageQuery())and
37-
(a1.(Access).getTarget()=eora1.(FunctionCall).getTarget()=e)and
38-
a1.getFile()=t1and
39-
//not accessed in any other translation unit
40-
notexists(TranslationUnitt2,Referencea2|
41-
nott1=t2and
42-
(a2.(Access).getTarget()=eora2.(FunctionCall).getTarget()=e)and
43-
a2.getFile()=t2
48+
isReferencedInTranslationUnit(e,a1,t1)and
49+
// Not referenced in any other translation unit
50+
notexists(TranslationUnitt2|
51+
isReferencedInTranslationUnit(e, _,t2)and
52+
nott1=t2
4453
)
4554
selecte,"Declaration with external linkage is accessed in only one translation unit $@.",a1,
4655
a1.toString()
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
* The performance of the following identifier related rules has been improved:
2+
* MISRA C 2012`Rule 5.8`
3+
* MISRA C 2012`Rule 8.7`

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp