Skip to content

Commit 456c046

Browse files
authored
Merge pull request #16693 from jketema/func-fix
C++: Correctly identify orphaned variables as static
2 parents 9f4c138 + 4488518 commit 456c046

File tree

5 files changed

+59
-0
lines changed

5 files changed

+59
-0
lines changed

cpp/ql/lib/semmle/code/cpp/Variable.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,10 @@ class LocalVariable extends LocalScopeVariable, @localvariable {
410410
or
411411
orphaned_variables(underlyingElement(this), unresolveElement(result))
412412
}
413+
414+
override predicate isStatic() {
415+
super.isStatic() or orphaned_variables(underlyingElement(this), _)
416+
}
413417
}
414418

415419
/**

cpp/ql/test/library-tests/ir/ir/aliased_ir.expected

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13430,6 +13430,32 @@ ir.cpp:
1343013430
# 1898| v1898_6(void) = AliasedUse : m1898_3
1343113431
# 1898| v1898_7(void) = ExitFunction :
1343213432

13433+
# 1899| const char[17] __PRETTY_FUNCTION__
13434+
# 1899| Block 0
13435+
# 1899| v1899_1(void) = EnterFunction :
13436+
# 1899| m1899_2(unknown) = AliasedDefinition :
13437+
# 1899| r1899_3(glval<char[17]>) = VariableAddress[__PRETTY_FUNCTION__] :
13438+
# 1899| r1899_4(glval<char[17]>) = StringConstant[__PRETTY_FUNCTION__] :
13439+
# 1899| r1899_5(char[17]) = Load[?] : &:r1899_4, ~m?
13440+
# 1899| m1899_6(char[17]) = Store[__PRETTY_FUNCTION__] : &:r1899_3, r1899_5
13441+
# 1899| m1899_7(unknown) = Chi : total:m1899_2, partial:m1899_6
13442+
# 1899| v1899_8(void) = ReturnVoid :
13443+
# 1899| v1899_9(void) = AliasedUse : ~m1899_7
13444+
# 1899| v1899_10(void) = ExitFunction :
13445+
13446+
# 1900| const char[10] __func__
13447+
# 1900| Block 0
13448+
# 1900| v1900_1(void) = EnterFunction :
13449+
# 1900| m1900_2(unknown) = AliasedDefinition :
13450+
# 1900| r1900_3(glval<char[10]>) = VariableAddress[__func__] :
13451+
# 1900| r1900_4(glval<char[10]>) = StringConstant[__func__] :
13452+
# 1900| r1900_5(char[10]) = Load[?] : &:r1900_4, ~m?
13453+
# 1900| m1900_6(char[10]) = Store[__func__] : &:r1900_3, r1900_5
13454+
# 1900| m1900_7(unknown) = Chi : total:m1900_2, partial:m1900_6
13455+
# 1900| v1900_8(void) = ReturnVoid :
13456+
# 1900| v1900_9(void) = AliasedUse : ~m1900_7
13457+
# 1900| v1900_10(void) = ExitFunction :
13458+
1343313459
# 1911| void* missing_declaration_entries::Bar1<int>::missing_type_decl_entry(missing_declaration_entries::Bar1<int>::pointer)
1343413460
# 1911| Block 0
1343513461
# 1911| v1911_1(void) = EnterFunction :

cpp/ql/test/library-tests/ir/ir/raw_ir.expected

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12384,6 +12384,30 @@ ir.cpp:
1238412384
# 1898| v1898_5(void) = AliasedUse : ~m?
1238512385
# 1898| v1898_6(void) = ExitFunction :
1238612386

12387+
# 1899| const char[17] __PRETTY_FUNCTION__
12388+
# 1899| Block 0
12389+
# 1899| v1899_1(void) = EnterFunction :
12390+
# 1899| mu1899_2(unknown) = AliasedDefinition :
12391+
# 1899| r1899_3(glval<char[17]>) = VariableAddress[__PRETTY_FUNCTION__] :
12392+
# 1899| r1899_4(glval<char[17]>) = StringConstant[__PRETTY_FUNCTION__] :
12393+
# 1899| r1899_5(char[17]) = Load[?] : &:r1899_4, ~m?
12394+
# 1899| mu1899_6(char[17]) = Store[__PRETTY_FUNCTION__] : &:r1899_3, r1899_5
12395+
# 1899| v1899_7(void) = ReturnVoid :
12396+
# 1899| v1899_8(void) = AliasedUse : ~m?
12397+
# 1899| v1899_9(void) = ExitFunction :
12398+
12399+
# 1900| const char[10] __func__
12400+
# 1900| Block 0
12401+
# 1900| v1900_1(void) = EnterFunction :
12402+
# 1900| mu1900_2(unknown) = AliasedDefinition :
12403+
# 1900| r1900_3(glval<char[10]>) = VariableAddress[__func__] :
12404+
# 1900| r1900_4(glval<char[10]>) = StringConstant[__func__] :
12405+
# 1900| r1900_5(char[10]) = Load[?] : &:r1900_4, ~m?
12406+
# 1900| mu1900_6(char[10]) = Store[__func__] : &:r1900_3, r1900_5
12407+
# 1900| v1900_7(void) = ReturnVoid :
12408+
# 1900| v1900_8(void) = AliasedUse : ~m?
12409+
# 1900| v1900_9(void) = ExitFunction :
12410+
1238712411
# 1911| void* missing_declaration_entries::Bar1<int>::missing_type_decl_entry(missing_declaration_entries::Bar1<int>::pointer)
1238812412
# 1911| Block 0
1238912413
# 1911| v1911_1(void) = EnterFunction :

cpp/ql/test/library-tests/variables/variables/variable.expected

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@
3939
| variables.cpp:51:9:51:12 | town | file://:0:0:0:0 | char * | Field | | |
4040
| variables.cpp:52:16:52:22 | country | file://:0:0:0:0 | char * | MemberVariable, StaticStorageDurationVariable | | static |
4141
| variables.cpp:56:14:56:29 | externInFunction | file://:0:0:0:0 | int | GlobalLikeVariable, GlobalVariable, StaticStorageDurationVariable | | |
42+
| variables.cpp:60:10:60:17 | __func__ | file://:0:0:0:0 | const char[9] | GlobalLikeVariable, StaticInitializedStaticLocalVariable | | static |

cpp/ql/test/library-tests/variables/variables/variables.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,7 @@ struct address {
5555
void hasExtern() {
5656
extern int externInFunction;
5757
}
58+
59+
const char* isStatic() {
60+
return __func__;
61+
}

0 commit comments

Comments
 (0)