Skip to content

Commit 6998ed0

Browse files
committed
Migrate Rule 21.2 to the ReservedNames library
1 parent 92cfb2f commit 6998ed0

File tree

4 files changed

+26
-26
lines changed

4 files changed

+26
-26
lines changed

c/misra/src/rules/RULE-21-1/DefineAndUndefUsedOnReservedIdentifierOrMacroName.ql

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,23 +16,10 @@
1616

1717
import cpp
1818
import codingstandards.c.misra
19-
import codingstandards.cpp.Naming
19+
import codingstandards.cpp.ReservedNames
2020

21-
from PreprocessorDirective p, string name
21+
from PreprocessorDirective p, string message
2222
where
2323
not isExcluded(p, Preprocessor4Package::defineAndUndefUsedOnReservedIdentifierOrMacroNameQuery()) and
24-
(
25-
p.(Macro).hasName(name)
26-
or
27-
p.(PreprocessorUndef).getName() = name
28-
) and
29-
(
30-
Naming::Cpp14::hasStandardLibraryMacroName(name)
31-
or
32-
Naming::Cpp14::hasStandardLibraryObjectName(name)
33-
or
34-
name.regexpMatch("_.*")
35-
or
36-
name = "defined"
37-
)
38-
select p, "Reserved identifier '" + name + "' has been undefined or redefined."
24+
ReservedNames::C11::isAReservedIdentifier(p, message, false)
25+
select p, message
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
| test.c:1:1:1:17 | #define _NOT_OKAY | Reserved identifier '_NOT_OKAY' has been undefined or redefined. |
2-
| test.c:2:1:2:16 | #undef _NOT_OKAY | Reserved identifier '_NOT_OKAY' has been undefined or redefined. |
3-
| test.c:5:1:5:13 | #define errno | Reserved identifier 'errno' has been undefined or redefined. |
1+
| test.c:1:1:1:17 | #define _NOT_OKAY | Macro '_NOT_OKAY' declares a reserved name beginning _ followed by an uppercase letter. |
2+
| test.c:2:1:2:16 | #undef _NOT_OKAY | Undef '_NOT_OKAY' declares a reserved name beginning _ followed by an uppercase letter. |
3+
| test.c:5:1:5:13 | #define errno | Macro 'errno' declares a name reserved for a macro from the C11 standard library header 'errno.h'. |

cpp/common/src/codingstandards/cpp/ReservedNames.qll

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ module ReservedNames {
131131
scope = MacroScope() and
132132
cNameSpace = MacroNameSpace() and
133133
identifierDescription = "Macro parameter"
134+
or
135+
e.(PreprocessorUndef).getName() = identifierName and
136+
scope = MacroScope() and
137+
cNameSpace = MacroNameSpace() and
138+
identifierDescription = "Undef"
134139
)
135140
}
136141

@@ -148,7 +153,13 @@ module ReservedNames {
148153

149154
module TargetedCLibrary = CStandardLibrary::C11;
150155

151-
predicate isAReservedIdentifier(Element m, string message) {
156+
/**
157+
* Holds if the given C program element is a reserved identifier according to the C11 standard or MISRA.
158+
*
159+
* @param requireHeaderIncluded false if we don't require
160+
*/
161+
predicate isAReservedIdentifier(Element m, string message, boolean requireHeaderIncluded) {
162+
requireHeaderIncluded = [true, false] and
152163
exists(
153164
string name, Scope scope, CNameSpace cNameSpace, string reason, string identifierDescription
154165
|
@@ -187,8 +198,8 @@ module ReservedNames {
187198
// > unless explicitly stated otherwise (see 7.1.4).
188199
exists(string header |
189200
TargetedCLibrary::hasMacroName(header, name, _) and
190-
// The relevant header is included directly or transitively by the file
191-
m.getFile().getAnIncludedFile*().getBaseName() = header and
201+
// The relevant header is included directly or transitively by the file, or we don't apply that requirement
202+
(m.getFile().getAnIncludedFile*().getBaseName() = header or requireHeaderIncluded = false) and
192203
reason =
193204
"declares a name reserved for a macro from the " + TargetedCLibrary::getName() +
194205
" standard library header '" + header + "'"
@@ -272,8 +283,8 @@ module ReservedNames {
272283
or
273284
scope = MacroScope()
274285
) and
275-
// The relevant header is included directly or transitively by the file
276-
m.getFile().getAnIncludedFile*().getBaseName() = header and
286+
// The relevant header is included directly or transitively by the file, or we don't apply that requirement
287+
(m.getFile().getAnIncludedFile*().getBaseName() = header or requireHeaderIncluded = false) and
277288
reason =
278289
"declares a reserved name from the " + TargetedCLibrary::getName() +
279290
" standard library header '" + header +

cpp/common/src/codingstandards/cpp/rules/declaredareservedidentifier/DeclaredAReservedIdentifier.qll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,7 @@ Query getQuery() { result instanceof DeclaredAReservedIdentifierSharedQuery }
1313

1414
query predicate problems(Element m, string message) {
1515
not isExcluded(m, getQuery()) and
16-
ReservedNames::C11::isAReservedIdentifier(m, message)
16+
ReservedNames::C11::isAReservedIdentifier(m, message, true) and
17+
// Not covered by this rule
18+
not m instanceof PreprocessorUndef
1719
}

0 commit comments

Comments
 (0)