Skip to content

Commit 3feee50

Browse files
authored
Merge branch 'main' into exclude-rvaluerefs-a7-1-1
2 parents dd892ff + a665a9a commit 3feee50

File tree

55 files changed

+1607
-466
lines changed

Some content is hidden

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

55 files changed

+1607
-466
lines changed

.github/workflows/upgrade_codeql_dependencies.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ jobs:
5353
find c \( -name '*.ql' -or -name '*.qll' \) -print0 | xargs -0 --max-procs "$XARGS_MAX_PROCS" codeql query format --in-place
5454
5555
- name: Create Pull Request
56-
uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5
56+
uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6
5757
with:
5858
title: "Upgrade `github/codeql` dependency to ${{ github.event.inputs.codeql_cli_version }}"
5959
body: |

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.41.0-dev
2+
version: 2.42.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.41.0-dev
2+
version: 2.42.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.41.0-dev
2+
version: 2.42.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.41.0-dev
2+
version: 2.42.0-dev
33
extractor: cpp
44
license: MIT
55
dependencies:

c/misra/src/codeql-suites/misra-c-default.qls

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@
77
- exclude:
88
tags contain:
99
- external/misra/audit
10+
- external/misra/strict
1011
- external/misra/default-disabled
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
- description: MISRA C 2012 (Strict)
2+
- qlpack: codeql/misra-c-coding-standards
3+
- include:
4+
kind:
5+
- problem
6+
- path-problem
7+
tags contain:
8+
- external/misra/strict

c/misra/src/codingstandards/c/misra/EssentialTypes.qll

Lines changed: 89 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,19 @@ class EssentialTypeCategory extends TEssentialTypeCategory {
3131
}
3232
}
3333

34+
class EssentiallySignedOrUnsignedType extends EssentialTypeCategory {
35+
EssentiallySignedOrUnsignedType() {
36+
this = EssentiallySignedType() or this = EssentiallyUnsignedType()
37+
}
38+
}
39+
3440
/**
3541
* An expression in the program that evaluates to a compile time constant signed or unsigned integer.
3642
*/
3743
private class ConstantIntegerExpr extends Expr {
3844
pragma[noinline]
3945
ConstantIntegerExpr() {
40-
getEssentialTypeCategory(this.getType()) =
41-
[
42-
EssentiallyUnsignedType().(EssentialTypeCategory),
43-
EssentiallySignedType().(EssentialTypeCategory)
44-
] and
46+
getEssentialTypeCategory(this.getType()) instanceof EssentiallySignedOrUnsignedType and
4547
exists(this.getValue().toFloat()) and
4648
not this instanceof Conversion
4749
}
@@ -192,8 +194,8 @@ class EssentialEqualityOperationExpr extends EssentialExpr, EqualityOperation {
192194
override Type getEssentialType() { result instanceof BoolType }
193195
}
194196

195-
class EssentialBinaryBitwiseOperationExpr extends EssentialExpr, BinaryBitwiseOperation {
196-
EssentialBinaryBitwiseOperationExpr() {
197+
class EssentialShiftOperationExpr extends EssentialExpr, BinaryBitwiseOperation {
198+
EssentialShiftOperationExpr() {
197199
this instanceof LShiftExpr or
198200
this instanceof RShiftExpr
199201
}
@@ -235,9 +237,7 @@ class EssentialUnaryPlusExpr extends EssentialExpr, UnaryPlusExpr {
235237
operandEssentialType = getEssentialType(getOperand()) and
236238
operandEssentialTypeCategory = getEssentialTypeCategory(operandEssentialType)
237239
|
238-
if
239-
operandEssentialTypeCategory =
240-
[EssentiallyUnsignedType().(TEssentialTypeCategory), EssentiallySignedType()]
240+
if operandEssentialTypeCategory instanceof EssentiallySignedOrUnsignedType
241241
then result = operandEssentialType
242242
else result = getStandardType()
243243
)
@@ -257,6 +257,13 @@ class EssentialUnaryMinusExpr extends EssentialExpr, UnaryMinusExpr {
257257
}
258258
}
259259

260+
bindingset[essentialTypeA, essentialTypeB]
261+
private Type maxRankType(Type essentialTypeA, Type essentialTypeB) {
262+
if essentialTypeA.getSize() > essentialTypeB.getSize()
263+
then result = essentialTypeA
264+
else result = essentialTypeB
265+
}
266+
260267
class EssentialConditionalExpr extends EssentialExpr, ConditionalExpr {
261268
override Type getEssentialType() {
262269
exists(Type thenEssentialType, Type elseEssentialType |
@@ -267,30 +274,34 @@ class EssentialConditionalExpr extends EssentialExpr, ConditionalExpr {
267274
then result = thenEssentialType
268275
else
269276
if
270-
getEssentialTypeCategory(thenEssentialType) = EssentiallySignedType() and
271-
getEssentialTypeCategory(elseEssentialType) = EssentiallySignedType()
272-
then
273-
if thenEssentialType.getSize() > elseEssentialType.getSize()
274-
then result = thenEssentialType
275-
else result = elseEssentialType
276-
else
277-
if
278-
getEssentialTypeCategory(thenEssentialType) = EssentiallyUnsignedType() and
279-
getEssentialTypeCategory(elseEssentialType) = EssentiallyUnsignedType()
280-
then
281-
if thenEssentialType.getSize() > elseEssentialType.getSize()
282-
then result = thenEssentialType
283-
else result = elseEssentialType
284-
else result = this.getStandardType()
277+
getEssentialTypeCategory(thenEssentialType) = getEssentialTypeCategory(elseEssentialType) and
278+
getEssentialTypeCategory(thenEssentialType) instanceof EssentiallySignedOrUnsignedType
279+
then result = maxRankType(thenEssentialType, elseEssentialType)
280+
else result = this.getStandardType()
285281
)
286282
}
287283
}
288284

289-
class EssentialBinaryArithmeticExpr extends EssentialExpr, BinaryArithmeticOperation {
290-
EssentialBinaryArithmeticExpr() {
291-
// GNU C extension has min/max which we can ignore
292-
not this instanceof MinExpr and
293-
not this instanceof MaxExpr
285+
/**
286+
* A binary operation subject to usual conversions, with essential type behaviour as specified by D.7.9.
287+
*/
288+
class EssentialBinaryOperationSubjectToUsualConversions extends EssentialExpr, BinaryOperation {
289+
EssentialBinaryOperationSubjectToUsualConversions() {
290+
this instanceof MulExpr
291+
or
292+
this instanceof DivExpr
293+
or
294+
this instanceof RemExpr
295+
or
296+
this instanceof AddExpr
297+
or
298+
this instanceof SubExpr
299+
or
300+
this instanceof BitwiseAndExpr
301+
or
302+
this instanceof BitwiseOrExpr
303+
or
304+
this instanceof BitwiseXorExpr
294305
}
295306

296307
override Type getEssentialType() {
@@ -305,50 +316,57 @@ class EssentialBinaryArithmeticExpr extends EssentialExpr, BinaryArithmeticOpera
305316
rightEssentialTypeCategory = getEssentialTypeCategory(rightEssentialType)
306317
|
307318
if
308-
leftEssentialTypeCategory = EssentiallySignedType() and
309-
rightEssentialTypeCategory = EssentiallySignedType()
319+
leftEssentialTypeCategory = rightEssentialTypeCategory and
320+
leftEssentialTypeCategory instanceof EssentiallySignedOrUnsignedType
310321
then
311322
if exists(getValue())
312-
then result = stlr(this)
313-
else (
314-
if leftEssentialType.getSize() > rightEssentialType.getSize()
315-
then result = leftEssentialType
316-
else result = rightEssentialType
317-
)
318-
else
319-
if
320-
leftEssentialTypeCategory = EssentiallyUnsignedType() and
321-
rightEssentialTypeCategory = EssentiallyUnsignedType()
322323
then
323-
if exists(getValue())
324-
then result = utlr(this)
325-
else (
326-
if leftEssentialType.getSize() > rightEssentialType.getSize()
327-
then result = leftEssentialType
328-
else result = rightEssentialType
329-
)
330-
else
331-
if
332-
this instanceof AddExpr and
333-
(
334-
leftEssentialTypeCategory = EssentiallyCharacterType()
335-
or
336-
rightEssentialTypeCategory = EssentiallyCharacterType()
337-
) and
338-
(
339-
leftEssentialTypeCategory =
340-
[EssentiallySignedType(), EssentiallyUnsignedType().(TEssentialTypeCategory)]
341-
or
342-
rightEssentialTypeCategory =
343-
[EssentiallySignedType(), EssentiallyUnsignedType().(TEssentialTypeCategory)]
344-
)
345-
or
346-
this instanceof SubExpr and
347-
leftEssentialTypeCategory = EssentiallyCharacterType() and
348-
rightEssentialTypeCategory =
349-
[EssentiallySignedType(), EssentiallyUnsignedType().(TEssentialTypeCategory)]
350-
then result instanceof PlainCharType
351-
else result = this.getStandardType()
324+
leftEssentialTypeCategory = EssentiallySignedType() and result = stlr(this)
325+
or
326+
leftEssentialTypeCategory = EssentiallyUnsignedType() and result = utlr(this)
327+
else result = maxRankType(leftEssentialType, rightEssentialType)
328+
else result = this.getStandardType()
329+
)
330+
}
331+
}
332+
333+
/**
334+
* An add expression, with essential type behaviour as specified by D.7.9.
335+
*/
336+
class EssentialAddExpr extends EssentialBinaryOperationSubjectToUsualConversions, AddExpr {
337+
override Type getEssentialType() {
338+
exists(
339+
EssentialTypeCategory operandTypeCategory, EssentialTypeCategory otherOperandTypeCategory
340+
|
341+
operandTypeCategory = getEssentialTypeCategory(getEssentialType(getAnOperand())) and
342+
otherOperandTypeCategory = getEssentialTypeCategory(getEssentialType(getAnOperand()))
343+
|
344+
if
345+
operandTypeCategory = EssentiallyCharacterType() and
346+
otherOperandTypeCategory instanceof EssentiallySignedOrUnsignedType
347+
then result instanceof PlainCharType
348+
else result = super.getEssentialType()
349+
)
350+
}
351+
}
352+
353+
/**
354+
* A sub expression, with essential type behaviour as specified by D.7.9.
355+
*/
356+
class EssentialSubExpr extends EssentialBinaryOperationSubjectToUsualConversions, SubExpr {
357+
override Type getEssentialType() {
358+
exists(
359+
EssentialTypeCategory leftEssentialTypeCategory,
360+
EssentialTypeCategory rightEssentialTypeCategory
361+
|
362+
leftEssentialTypeCategory = getEssentialTypeCategory(getEssentialType(getLeftOperand())) and
363+
rightEssentialTypeCategory = getEssentialTypeCategory(getEssentialType(getRightOperand()))
364+
|
365+
if
366+
leftEssentialTypeCategory = EssentiallyCharacterType() and
367+
rightEssentialTypeCategory instanceof EssentiallySignedOrUnsignedType
368+
then result instanceof PlainCharType
369+
else result = super.getEssentialType()
352370
)
353371
}
354372
}

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.41.0-dev
2+
version: 2.42.0-dev
33
description: MISRA C 2012
44
suites: codeql-suites
55
license: MIT
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/**
2+
* @id c/misra/unused-object-definition
3+
* @name RULE-2-8: A project should not contain unused object definitions
4+
* @description Object definitions which are unused should be removed.
5+
* @kind problem
6+
* @precision very-high
7+
* @problem.severity recommendation
8+
* @tags external/misra/id/rule-2-8
9+
* maintainability
10+
* performance
11+
* external/misra/c/2012/amendment4
12+
* external/misra/obligation/advisory
13+
*/
14+
15+
import cpp
16+
import codingstandards.c.misra
17+
import codingstandards.cpp.deadcode.UnusedObjects
18+
19+
from ReportDeadObject report
20+
where
21+
not isExcluded(report.getPrimaryElement(), DeadCode2Package::unusedObjectDefinitionQuery()) and
22+
not report.hasAttrUnused()
23+
select report.getPrimaryElement(), report.getMessage(), report.getOptionalPlaceholderLocation(),
24+
report.getOptionalPlaceholderMessage()
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* @id c/misra/unused-object-definition-strict
3+
* @name RULE-2-8: A project should not contain '__attribute__((unused))' object definitions
4+
* @description A strict query which reports all unused object definitions with
5+
* '__attribute__((unused))'.
6+
* @kind problem
7+
* @precision very-high
8+
* @problem.severity recommendation
9+
* @tags external/misra/id/rule-2-8
10+
* maintainability
11+
* performance
12+
* external/misra/c/2012/amendment4
13+
* external/misra/c/strict
14+
* external/misra/obligation/advisory
15+
*/
16+
17+
import cpp
18+
import codingstandards.c.misra
19+
import codingstandards.cpp.deadcode.UnusedObjects
20+
21+
from ReportDeadObject report
22+
where
23+
not isExcluded(report.getPrimaryElement(), DeadCode2Package::unusedObjectDefinitionStrictQuery()) and
24+
report.hasAttrUnused()
25+
select report.getPrimaryElement(), report.getMessage(), report.getOptionalPlaceholderLocation(),
26+
report.getOptionalPlaceholderMessage()

0 commit comments

Comments
 (0)