mirror of
https://github.com/github/codeql.git
synced 2026-04-30 11:15:13 +02:00
C++: IR query for redundant null check
This new query is not written because it's the most interesting query we could write but because it's an IR-based query whose results are easy to verify.
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
void test1(int *p) {
|
||||
int x;
|
||||
x = *p;
|
||||
if (p == nullptr) { // BAD
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void test2(int *p) {
|
||||
int x = *p;
|
||||
if (x > 100)
|
||||
return;
|
||||
if (!p) // BAD
|
||||
return;
|
||||
}
|
||||
|
||||
void test_indirect(int **p) {
|
||||
int x;
|
||||
x = **p;
|
||||
if (*p == nullptr) { // BAD [NOT DETECTED]
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
struct ContainsIntPtr {
|
||||
int **intPtr;
|
||||
};
|
||||
|
||||
bool check_curslist(ContainsIntPtr *cip) {
|
||||
// both the deref and the null check come from the same instruction, but it's
|
||||
// an AliasedDefinition instruction.
|
||||
return *cip->intPtr != nullptr; // GOOD
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
| RedundantNullCheckSimple.cpp:4:7:4:7 | Load: p | This null check is redundant because the value is $@ in any case | RedundantNullCheckSimple.cpp:3:7:3:8 | Load: * ... | dereferenced here |
|
||||
| RedundantNullCheckSimple.cpp:13:8:13:8 | Load: p | This null check is redundant because the value is $@ in any case | RedundantNullCheckSimple.cpp:10:11:10:12 | Load: * ... | dereferenced here |
|
||||
@@ -0,0 +1 @@
|
||||
Likely Bugs/RedundantNullCheckSimple.ql
|
||||
Reference in New Issue
Block a user