Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
d7215f5
Draft PR for Rule 4-1-3, no undefined/unspecified behavior
MichaelRFairhurst Mar 9, 2026
6457dc6
add base ql files
MichaelRFairhurst Mar 9, 2026
b2a6480
Temporarily run workflows on branch PR
MichaelRFairhurst Mar 10, 2026
46d7355
Commit compilable stub queries
MichaelRFairhurst Mar 10, 2026
3cfaa72
Build fixes: empty tests, disable pack gen CI/CD
MichaelRFairhurst Mar 10, 2026
d7d4769
Michaelrfairhurst/rule 4 1 3 detect data races (#1077)
MichaelRFairhurst Mar 11, 2026
4c873a2
Reuse A2-13-4 as an audit query for undefined behavior.
MichaelRFairhurst Mar 14, 2026
8223495
Add critical unspecified behavior for signed integer overflow
MichaelRFairhurst Mar 14, 2026
c727f2f
Import MEM51-CPP, mismatched new/delete[]/malloc/free is UB
MichaelRFairhurst Mar 14, 2026
61b7454
Share OOP55-CPP with UB from ptr-to-member use
MichaelRFairhurst Mar 16, 2026
f5f59c7
Import A5-6-1 division/mod by zero
MichaelRFairhurst Mar 17, 2026
38cf430
Import INT50-CPP into 4-1-3
MichaelRFairhurst Mar 17, 2026
c8494ab
Format test.cpp
MichaelRFairhurst Mar 17, 2026
6a6bcba
Apply suggestions from code review
mbaluda Mar 19, 2026
9f3f3ba
Merge pull request #1081 from github/michaelrfairhurst/undefined-beha…
MichaelRFairhurst Mar 19, 2026
5b693f5
Merge remote-tracking branch 'origin/michaelrfairhurst/package-undefi…
MichaelRFairhurst Mar 19, 2026
c3071fb
Merge pull request #1083 from github/michaelrfairhurst/undefined-beha…
MichaelRFairhurst Mar 19, 2026
6f940c3
Merge remote-tracking branch 'origin/michaelrfairhurst/package-undefi…
MichaelRFairhurst Mar 19, 2026
7e4819f
Merge pull request #1086 from github/michaelrfairhurst/package-undefi…
MichaelRFairhurst Mar 19, 2026
78a2db9
Merge remote-tracking branch 'origin/michaelrfairhurst/package-undefi…
MichaelRFairhurst Mar 19, 2026
2756406
Merge pull request #1087 from github/michaelrfairhurst/package-undefi…
MichaelRFairhurst Mar 19, 2026
410895c
Merge remote-tracking branch 'origin/michaelrfairhurst/package-undefi…
MichaelRFairhurst Mar 19, 2026
85ae3f4
Re-add dropped query in json
MichaelRFairhurst Mar 19, 2026
b51f403
Potential fix for pull request finding
mbaluda Mar 24, 2026
e29bd68
Re-add queries in json deleted during merge
MichaelRFairhurst Mar 26, 2026
6c6ad11
Delete placeholder queries
MichaelRFairhurst Mar 27, 2026
ff9b709
Regenerate undefined query metadata qll
MichaelRFairhurst Mar 27, 2026
de08d26
Merge branch 'michaelrfairhurst/package-undefined-behavior' into mich…
MichaelRFairhurst Mar 27, 2026
e55f1de
Merge branch 'michaelrfairhurst/package-undefined-behavior' into mich…
MichaelRFairhurst Mar 27, 2026
458e649
Merge pull request #1082 from github/michaelrfairhurst/package-undefi…
MichaelRFairhurst Mar 30, 2026
992b672
Merge pull request #1088 from github/michaelrfairhurst/package-undefi…
MichaelRFairhurst Mar 30, 2026
5d5fcd7
Merge remote-tracking branch 'origin/main' into michaelrfairhurst/pac…
MichaelRFairhurst Mar 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/codeql_unit_tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ on:
- main
- next
- "rc/**"
- michaelrfairhurst/package-undefined-behavior

jobs:

Expand Down
1 change: 1 addition & 0 deletions .github/workflows/extra-rule-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ on:
- main
- "rc/**"
- next
- michaelrfairhurst/package-undefined-behavior


jobs:
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/tooling-unit-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ on:
- main
- "rc/**"
- next
- michaelrfairhurst/package-undefined-behavior

jobs:
prepare-supported-codeql-env-matrix:
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/validate-package-files.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
- main
- next
- "rc/**"
- michaelrfairhurst/package-undefined-behavior

jobs:
validate-package-files:
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/validate-query-formatting.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
- main
- next
- "rc/**"
- michaelrfairhurst/package-undefined-behavior

env:
XARGS_MAX_PROCS: 4
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/validate-query-help.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
- main
- next
- "rc/**"
- michaelrfairhurst/package-undefined-behavior

jobs:
validate-query-help-files:
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/validate-query-test-case-formatting.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ on:
- main
- next
- "rc/**"
- michaelrfairhurst/package-undefined-behavior

env:
XARGS_MAX_PROCS: 4
Expand Down
26 changes: 6 additions & 20 deletions c/cert/src/rules/INT32-C/SignedIntegerOverflow.ql
Original file line number Diff line number Diff line change
Expand Up @@ -19,24 +19,10 @@

import cpp
import codingstandards.c.cert
import codingstandards.cpp.Overflow
import semmle.code.cpp.controlflow.Guards
import semmle.code.cpp.valuenumbering.GlobalValueNumbering
import codingstandards.cpp.rules.signedintegeroverflowshared.SignedIntegerOverflowShared

from InterestingOverflowingOperation op
where
not isExcluded(op, IntegerOverflowPackage::signedIntegerOverflowQuery()) and
(
// An operation that returns a signed integer type
op.getType().getUnderlyingType().(IntegralType).isSigned()
or
// The divide or rem expression on a signed integer
op.(DivOrRemOperation).getDividend().getType().getUnderlyingType().(IntegralType).isSigned()
) and
// Not checked before the operation
not op.hasValidPreCheck() and
// Covered by INT34-C
not op instanceof LShiftExpr
select op,
"Operation " + op.getOperator() + " of type " + op.getType().getUnderlyingType() +
" may overflow or underflow."
module SignedIntegerOverflowConfig implements SignedIntegerOverflowSharedConfigSig {
Query getQuery() { result = IntegerOverflowPackage::signedIntegerOverflowQuery() }
}

import SignedIntegerOverflowShared<SignedIntegerOverflowConfig>
1 change: 0 additions & 1 deletion c/cert/test/rules/INT32-C/SignedIntegerOverflow.qlref

This file was deleted.

1 change: 1 addition & 0 deletions c/cert/test/rules/INT32-C/SignedIntegerOverflow.testref
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
c/common/test/rules/signedintegeroverflowshared/SignedIntegerOverflowShared.ql
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// GENERATED FILE - DO NOT MODIFY
import codingstandards.cpp.rules.possibledataracebetweenthreadsshared.PossibleDataRaceBetweenThreadsShared
import codingstandards.c.Objects as CObjects
import codingstandards.c.SubObjects as CSubObjects

module TestFileConfig implements PossibleDataRaceBetweenThreadsSharedConfigSig {
Query getQuery() { result instanceof TestQuery }

class ObjectIdentity = CObjects::ObjectIdentity;

class SubObject = CSubObjects::SubObject;
}

import PossibleDataRaceBetweenThreadsShared<TestFileConfig>
132 changes: 132 additions & 0 deletions c/common/test/rules/possibledataracebetweenthreadsshared/test.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,132 @@
#include "locale.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "threads.h"
#include "time.h"
#include "uchar.h"
#include "wchar.h"

int g1;
int g2;
int g3;
int g4;
mtx_t g4_lock;
int g5;
mtx_t g5_lock;

void single_thread1_reads_g1(void *p) {
g1; // COMPLIANT
}

void many_thread2_reads_g1(void *p) {
g1; // COMPLIANT
}

void single_thread3_reads_g2(void *p) {
g2; // COMPLIANT
}

void single_thread4_writes_g2(void *p) {
g2 = 1; // NON-COMPLIANT
}

void many_thread5_writes_g3(void *p) {
g3 = 1; // NON-COMPLIANT
}

void single_thread6_reads_g4_locked(void *p) {
mtx_lock(&g4_lock);
g4; // COMPLIANT
}

void single_thread7_writes_g4_locked(void *p) {
mtx_lock(&g4_lock);
g4 = 1; // COMPLIANT
}

void many_thread8_writes_g5_locked(void *p) {
mtx_lock(&g5_lock);
g5 = 1; // COMPLIANT
}

struct {
int m1;
int m2;
} g6;

void single_thread9_writes_g6_m1(void *p) {
g6.m1 = 1; // COMPLIANT
}

void single_thread10_writes_g6_m2(void *p) {
g6.m2 = 1; // COMPLIANT
}

struct {
int m1;
} g7;

void single_thread11_writes_g7_m1(void *p) {
g7.m1 = 1; // NON-COMPLIANT
}

void single_thread12_writes_g7_m1(void *p) {
g7.m1 = 1; // NON-COMPLIANT
}

void many_thread13_calls_nonreentrant_funcs(void *p) {
setlocale(LC_ALL, "C"); // NON-COMPLIANT
tmpnam(""); // NON-COMPLIANT
rand(); // NON-COMPLIANT
srand(0); // NON-COMPLIANT
getenv("PATH"); // NON-COMPLIANT
getenv_s(NULL, NULL, 0, NULL); // NON-COMPLIANT
strtok("a", "b"); // NON-COMPLIANT
strerror(0); // NON-COMPLIANT
asctime(NULL); // NON-COMPLIANT
ctime(NULL); // NON-COMPLIANT
gmtime(NULL); // NON-COMPLIANT
localtime(NULL); // NON-COMPLIANT
mbrtoc16(NULL, NULL, 0, NULL); // NON-COMPLIANT
mbrtoc32(NULL, NULL, 0, NULL); // NON-COMPLIANT
c16rtomb(NULL, 0, NULL); // NON-COMPLIANT
c32rtomb(NULL, 0, NULL); // NON-COMPLIANT
mbrlen(NULL, 0, NULL); // NON-COMPLIANT
mbrtowc(NULL, NULL, 0, NULL); // NON-COMPLIANT
wcrtomb(NULL, 0, NULL); // NON-COMPLIANT
mbsrtowcs(NULL, NULL, 0, NULL); // NON-COMPLIANT
wcsrtombs(NULL, NULL, 0, NULL); // NON-COMPLIANT
}

int main(int argc, char *argv[]) {
thrd_t single_thread1;
thrd_t many_thread2;
thrd_t single_thread3;
thrd_t single_thread4;
thrd_t many_thread5;
thrd_t single_thread6;
thrd_t single_thread7;
thrd_t many_thread8;
thrd_t single_thread9;
thrd_t single_thread10;
thrd_t single_thread11;
thrd_t single_thread12;
thrd_t many_thread13;

thrd_create(&single_thread1, single_thread1_reads_g1, NULL);
thrd_create(&single_thread3, single_thread3_reads_g2, NULL);
thrd_create(&single_thread4, single_thread4_writes_g2, NULL);
thrd_create(&single_thread6, single_thread6_reads_g4_locked, NULL);
thrd_create(&single_thread7, single_thread7_writes_g4_locked, NULL);
thrd_create(&single_thread9, single_thread9_writes_g6_m1, NULL);
thrd_create(&single_thread10, single_thread10_writes_g6_m2, NULL);
thrd_create(&single_thread11, single_thread11_writes_g7_m1, NULL);
thrd_create(&single_thread12, single_thread12_writes_g7_m1, NULL);
for (;;) {
thrd_create(&many_thread2, many_thread2_reads_g1, NULL);
thrd_create(&many_thread5, many_thread5_writes_g3, NULL);
thrd_create(&many_thread8, many_thread8_writes_g5_locked, NULL);
thrd_create(&many_thread13, many_thread13_calls_nonreentrant_funcs, NULL);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@
| test.c:147:5:147:12 | ... %= ... | Operation %= of type signed int may overflow or underflow. |
| test.c:161:3:161:5 | - ... | Operation - of type signed int may overflow or underflow. |
| test.c:173:3:173:6 | ... ++ | Operation ++ of type signed int may overflow or underflow. |
| test.c:189:3:189:6 | ... -- | Operation -- of type signed int may overflow or underflow. |
| test.c:189:3:189:6 | ... -- | Operation -- of type signed int may overflow or underflow. |
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// GENERATED FILE - DO NOT MODIFY
import codingstandards.cpp.rules.signedintegeroverflowshared.SignedIntegerOverflowShared

module TestFileConfig implements SignedIntegerOverflowSharedConfigSig {
Query getQuery() { result instanceof TestQuery }
}

import SignedIntegerOverflowShared<TestFileConfig>
Loading
Loading