Skip to content

Commit a23f7a5

Browse files
authored
Merge branch 'main' into jeongsoolee09/MISRA-C++-2023-Banned856
2 parents 5f0ad4d + 69147ac commit a23f7a5

File tree

58 files changed

+2383
-122
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+2383
-122
lines changed

.github/copilot-instructions.md

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,204 @@ When reviewing tests, it is critical to:
5858
- Check that the locations do not refer to files in the standard library, as these have issues in GitHub's Code Scanning UI and complicate our compiler compatibility tests.
5959
- Consider the "test coverage" of the query, are each of its logical statements effectively exercised individually, collectively? The test should neither be overly bloated nor under specified.
6060
- Consider the edge cases of the language itself, will the analysis work in non-trivial cases, are all relevant language concepts tested here? This doesn't need to be exhaustive, but it should be thoughfully thorough.
61+
62+
## Validating Query Style
63+
64+
The following list describes the required style guides for a query that **must** be validated during the code-review process.
65+
66+
A query **must** include:
67+
68+
- A use of the `isExcluded` predicate on the element reported as the primary location. This predicate ensures that we have a central mechanism for excluding results. This predicate may also be used on other elements relevant to the alert, but only if a suppression on that element should also cause alerts on the current element to be suppressed.
69+
- A well formatted alert message:
70+
- The message should be a complete standalone sentence, with punctuation and a period.
71+
- The message should refer to this particular instance of the problem, rather than repeating the generic rule. e.g. "Call to banned function x." instead of "Do not use function x."
72+
- Code elements should be placed in 'single quotes', unless they are formatted as links.
73+
- Avoid value judgments such as "dubious" and "suspicious", and focus on factual statements about the problem.
74+
- If possible, avoid constant alert messages. Either add placeholders and links (using $@), or concatenate element names to the alert message. Non-constant messages make it easier to find particular results, and links to other program elements can help provide additional context to help a developer understand the results. Examples:
75+
- Instead of `Call to banned function.` prefer `Call to banned function foobar.`.
76+
- Instead of `Return value from call is unused.` prefer `Return value from call to function [x] is unused.`, where `[x]` is a link to the function itself.
77+
- Do not try to explain the solution in the message; instead that should be provided in the help for the query.
78+
79+
All lines in CodeQL source files and test files should be kept to a maximum of 100 characters.
80+
81+
All public predicates, classes, modules and files should be documented with QLDoc. All QLDoc should follow the following QLDoc style guide:
82+
83+
### General QLDoc requirements
84+
85+
1. Documentation must adhere to the [QLDoc specification](https://codeql.github.com/docs/ql-language-reference/ql-language-specification/#qldoc).
86+
1. Documentation comments should be appropriate for users of the code.
87+
1. Documentation for maintainers of the code must use normal comments.
88+
1. Use `/** ... */` for documentation, even for single line comments.
89+
- For single-line documentation, the `/**` and `*/` are written on the same line as the comment.
90+
- For multi-line documentation, the `/**` and `*/` are written on separate lines. There is a `*` preceding each comment line, aligned on the first `*`.
91+
1. Use code formatting (backticks) within comments for code from the source language, and also for QL code (for example, names of classes, predicates, and variables).
92+
1. Give explanatory examples of code in the target language, enclosed in ```` ```<target language> ```` or `` ` ``.
93+
94+
95+
### Language requirements
96+
97+
1. Use American English.
98+
1. Use full sentences, with capital letters and periods, except for the initial sentence of the comment, which may be fragmentary as described below.
99+
1. Use simple sentence structures and avoid complex or academic language.
100+
1. Avoid colloquialisms and contractions.
101+
1. Use words that are in common usage.
102+
103+
104+
### Requirements for specific items
105+
106+
1. Public declarations must be documented.
107+
1. Non-public declarations should be documented.
108+
1. Declarations in query files should be documented.
109+
1. Library files (`.qll` files) should have a documentation comment at the top of the file.
110+
1. Query files, except for tests, must have a QLDoc query documentation comment at the top of the file.
111+
112+
### QLDoc for predicates
113+
114+
1. Refer to all predicate parameters in the predicate documentation.
115+
1. Reference names, such as types and parameters, using backticks `` ` ``.
116+
1. Give examples of code in the target language, enclosed in ```` ```<target language> ```` or `` ` ``.
117+
1. Predicates that override a single predicate don't need QLDoc, as they will inherit it.
118+
119+
#### Predicates without result
120+
121+
1. Use a third-person verb phrase of the form ``Holds if `arg` has <property>.``
122+
1. Avoid:
123+
- `/** Whether ... */`
124+
- `/** Relates ... */`
125+
- Question forms:
126+
- ``/** Is `x` a foo? */``
127+
- ``/** Does `x` have a bar? */``
128+
129+
##### Example
130+
131+
```ql
132+
/**
133+
* Holds if the qualifier of this call has type `qualifierType`.
134+
* `isExactType` indicates whether the type is exact, that is, whether
135+
* the qualifier is guaranteed not to be a subtype of `qualifierType`.
136+
*/
137+
```
138+
139+
#### Predicates with result
140+
141+
1. Use a third-person verb phrase of the form `Gets (a|the) <thing>.`
142+
1. Use "if any" if the item is usually unique but might be missing. For example
143+
`Gets the body of this method, if any.`
144+
1. If the predicate has more complex behaviour, for example multiple arguments are conceptually "outputs", it can be described like a predicate without a result. For example
145+
``Holds if `result` is a child of this expression.``
146+
1. Avoid:
147+
- `Get a ...`
148+
- `The ...`
149+
- `Results in ...`
150+
- Any use of `return`
151+
152+
##### Example
153+
```ql
154+
/**
155+
* Gets the expression denoting the super class of this class,
156+
* or nothing if this is an interface or a class without an `extends` clause.
157+
*/
158+
```
159+
160+
#### Deprecated predicates
161+
162+
The documentation for deprecated predicates should be updated to emphasize the deprecation and specify what predicate to use as an alternative.
163+
Insert a sentence of the form `DEPRECATED: Use <other predicate> instead.` at the start of the QLDoc comment.
164+
165+
##### Example
166+
167+
```ql
168+
/** DEPRECATED: Use `getAnExpr()` instead. */
169+
deprecated Expr getInitializer()
170+
```
171+
172+
#### Internal predicates
173+
174+
Some predicates are internal-only declarations that cannot be made private. The documentation for internal predicates should begin with `INTERNAL: Do not use.`
175+
176+
##### Example
177+
178+
```ql
179+
/**
180+
* INTERNAL: Do not use.
181+
*/
182+
```
183+
184+
#### Special predicates
185+
186+
Certain special predicates should be documented consistently.
187+
188+
- Always document `toString` as
189+
190+
```ql
191+
/** Gets a textual representation of this element. */
192+
string toString() { ... }
193+
```
194+
195+
- Always document `hasLocationInfo` as
196+
197+
```ql
198+
/**
199+
* Holds if this element is at the specified location.
200+
* The location spans column `startcolumn` of line `startline` to
201+
* column `endcolumn` of line `endline` in file `filepath`.
202+
* For more information, see
203+
* [Locations](https://codeql.github.com/docs/writing-codeql-queries/providing-locations-in-codeql-queries/).
204+
*/
205+
206+
predicate hasLocationInfo(string filepath, int startline, int startcolumn, int endline, int endcolumn) { ... }
207+
```
208+
209+
### QLDoc for classes
210+
211+
1. Document classes using a noun phrase of the form `A <domain element> that <has property>.`
212+
1. Use "that", not "which".
213+
1. Refer to member elements in the singular.
214+
1. Where a class denotes a generic concept with subclasses, list those subclasses.
215+
216+
##### Example
217+
218+
```ql
219+
/**
220+
* A delegate declaration, for example
221+
* ```
222+
* delegate void Logger(string text);
223+
* ```
224+
*/
225+
class Delegate extends ...
226+
```
227+
228+
```ql
229+
/**
230+
* An element that can be called.
231+
*
232+
* Either a method (`Method`), a constructor (`Constructor`), a destructor
233+
* (`Destructor`), an operator (`Operator`), an accessor (`Accessor`),
234+
* an anonymous function (`AnonymousFunctionExpr`), or a local function
235+
* (`LocalFunction`).
236+
*/
237+
class Callable extends ...
238+
```
239+
240+
### QLDoc for modules
241+
242+
Modules should be documented using a third-person verb phrase of the form `Provides <classes and predicates to do something>.`
243+
244+
##### Example
245+
246+
```ql
247+
/** Provides logic for determining constant expressions. */
248+
```
249+
```ql
250+
/** Provides classes representing the control flow graph within functions. */
251+
```
252+
253+
### Special variables
254+
255+
When referring to `this`, you may either refer to it as `` `this` `` or `this <type>`. For example:
256+
- ``Holds if `this` is static.``
257+
- `Holds if this method is static.`
258+
259+
When referring to `result`, you may either refer to it as `` `result` `` or as `the result`. For example:
260+
- ``Holds if `result` is a child of this expression.``
261+
- `Holds if the result is a child of this expression.`

c/cert/src/qlpack.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: codeql/cert-c-coding-standards
2-
version: 2.56.0-dev
2+
version: 2.57.0-dev
33
description: CERT C 2016
44
suites: codeql-suites
55
license: MIT

c/cert/test/qlpack.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: codeql/cert-c-coding-standards-tests
2-
version: 2.56.0-dev
2+
version: 2.57.0-dev
33
extractor: cpp
44
license: MIT
55
dependencies:

c/common/src/qlpack.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: codeql/common-c-coding-standards
2-
version: 2.56.0-dev
2+
version: 2.57.0-dev
33
license: MIT
44
dependencies:
55
codeql/common-cpp-coding-standards: '*'

c/common/test/qlpack.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: codeql/common-c-coding-standards-tests
2-
version: 2.56.0-dev
2+
version: 2.57.0-dev
33
extractor: cpp
44
license: MIT
55
dependencies:

c/misra/src/qlpack.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: codeql/misra-c-coding-standards
2-
version: 2.56.0-dev
2+
version: 2.57.0-dev
33
description: MISRA C 2012
44
suites: codeql-suites
55
license: MIT

c/misra/test/qlpack.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: codeql/misra-c-coding-standards-tests
2-
version: 2.56.0-dev
2+
version: 2.57.0-dev
33
extractor: cpp
44
license: MIT
55
dependencies:
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
- `A0-1-3` - `UnusedLocalFunction.ql`:
2+
- Query now reports unused public members of classes in anonymous namespaces, which have internal linkage.
3+
- Alert message no longer contains the fully qualified name of the function, since the given function is already linked.

cpp/autosar/src/qlpack.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: codeql/autosar-cpp-coding-standards
2-
version: 2.56.0-dev
2+
version: 2.57.0-dev
33
description: AUTOSAR C++14 Guidelines R22-11, R21-11, R20-11, R19-11 and R19-03
44
suites: codeql-suites
55
license: MIT

cpp/autosar/src/rules/A0-1-3/UnusedLocalFunction.ql

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

1717
import cpp
1818
import codingstandards.cpp.autosar
19-
import codingstandards.cpp.DynamicCallGraph
20-
import codingstandards.cpp.deadcode.UnusedFunctions
19+
import codingstandards.cpp.rules.unusedlocalfunction.UnusedLocalFunction
2120

22-
/**
23-
* Checks if an overloaded function of
24-
* the function passed in the arguments, is called.
25-
*/
26-
predicate overloadedFunctionIsCalled(Function unusedFunction) {
27-
exists(Function f | f = unusedFunction.getAnOverload() and f = getTarget(_))
28-
}
29-
30-
/** Checks if a Function's address was taken. */
31-
predicate addressBeenTaken(Function unusedFunction) {
32-
exists(FunctionAccess fa | fa.getTarget() = unusedFunction)
33-
}
34-
35-
/** A `Function` nested in an anonymous namespace. */
36-
class AnonymousNamespaceFunction extends Function {
37-
AnonymousNamespaceFunction() { getNamespace().getParentNamespace*().isAnonymous() }
38-
}
39-
40-
/**
41-
* A function which is "local" to a particular scope or translation unit.
42-
*/
43-
class LocalFunction extends UnusedFunctions::UsableFunction {
44-
string localFunctionType;
45-
46-
LocalFunction() {
47-
this.(MemberFunction).isPrivate() and
48-
localFunctionType = "Private member"
49-
or
50-
// A function in an anonymous namespace (which is deduced to have internal linkage)
51-
this instanceof AnonymousNamespaceFunction and
52-
// Not member functions, which don't have internal linkage
53-
not this instanceof MemberFunction and
54-
localFunctionType = "Anonymous namespace"
55-
or
56-
// Static functions with internal linkage
57-
this.isStatic() and
58-
// Member functions never have internal linkage
59-
not this instanceof MemberFunction and
60-
// Functions in anonymous namespaces automatically have the "static" specifier added by the
61-
// extractor. We therefore excluded them from this case, and instead report them in the
62-
// anonymous namespace, as we don't know whether the "static" specifier was explicitly
63-
// provided by the user.
64-
not this instanceof AnonymousNamespaceFunction and
65-
localFunctionType = "Static"
66-
}
67-
68-
/** Gets the type of local function. */
69-
string getLocalFunctionType() { result = localFunctionType }
21+
module UnusedLocalFunctionConfig implements UnusedLocalFunctionConfigSig {
22+
Query getQuery() { result = DeadCodePackage::unusedLocalFunctionQuery() }
7023
}
7124

72-
from LocalFunction unusedLocalFunction, string name
73-
where
74-
not isExcluded(unusedLocalFunction, DeadCodePackage::unusedLocalFunctionQuery()) and
75-
// No static or dynamic call target for this function
76-
not unusedLocalFunction = getTarget(_) and
77-
// If this is a TemplateFunction or an instantiation of a template, then only report it as unused
78-
// if all other instantiations of the template are unused
79-
not exists(
80-
Function functionFromUninstantiatedTemplate, Function functionFromInstantiatedTemplate
81-
|
82-
// `unusedLocalFunction` is a template instantiation from `functionFromUninstantiatedTemplate`
83-
unusedLocalFunction.isConstructedFrom(functionFromUninstantiatedTemplate)
84-
or
85-
// `unusedLocalFunction` is from an uninstantiated template
86-
unusedLocalFunction = functionFromUninstantiatedTemplate
87-
|
88-
// There exists an instantiation which is called
89-
functionFromInstantiatedTemplate.isConstructedFrom(functionFromUninstantiatedTemplate) and
90-
functionFromInstantiatedTemplate = getTarget(_)
91-
) and
92-
// A function is defined as "used" if any one of the following holds true:
93-
// - It's an explicitly deleted functions e.g. =delete
94-
// - It's annotated as "[[maybe_unused]]"
95-
// - It's part of an overloaded set and any one of the overloaded instance
96-
// is called.
97-
// - It's an operand of an expression in an unevaluated context.
98-
not unusedLocalFunction.isDeleted() and
99-
not unusedLocalFunction.getAnAttribute().getName() = "maybe_unused" and
100-
not overloadedFunctionIsCalled(unusedLocalFunction) and
101-
not addressBeenTaken(unusedLocalFunction) and
102-
// Get a printable name
103-
(
104-
if exists(unusedLocalFunction.getQualifiedName())
105-
then name = unusedLocalFunction.getQualifiedName()
106-
else name = unusedLocalFunction.getName()
107-
)
108-
select unusedLocalFunction,
109-
unusedLocalFunction.getLocalFunctionType() + " function " + name +
110-
" is not statically called, or is in an unused template."
25+
import UnusedLocalFunction<UnusedLocalFunctionConfig>

0 commit comments

Comments
 (0)