Skip to content

Commit 73e72f5

Browse files
authored
Merge pull request #20864 from MathiasVP/better-sizeof-api
C++: Lift `getTypeOperand` to a superclass
2 parents 68552f9 + 4279a97 commit 73e72f5

File tree

3 files changed

+38
-10
lines changed

3 files changed

+38
-10
lines changed

cpp/ql/lib/semmle/code/cpp/exprs/Cast.qll

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -750,6 +750,16 @@ class SizeofPackTypeOperator extends SizeofPackOperator {
750750
*/
751751
class SizeofOperator extends Expr, @runtime_sizeof {
752752
override int getPrecedence() { result = 16 }
753+
754+
/**
755+
* Gets the contained type of this `sizeof`. For example,
756+
* the result is `int` in both cases below:
757+
* ```
758+
* sizeof(int);
759+
* sizeof(42);
760+
* ```
761+
*/
762+
Type getTypeOperand() { none() } // overridden in subclasses
753763
}
754764

755765
/**
@@ -766,6 +776,8 @@ class SizeofExprOperator extends SizeofOperator {
766776
/** Gets the contained expression. */
767777
Expr getExprOperand() { result = this.getChild(0) }
768778

779+
override Type getTypeOperand() { result = this.getExprOperand().getType() }
780+
769781
override string toString() { result = "sizeof(<expr>)" }
770782

771783
override predicate mayBeImpure() { this.getExprOperand().mayBeImpure() }
@@ -784,8 +796,7 @@ class SizeofTypeOperator extends SizeofOperator {
784796

785797
override string getAPrimaryQlClass() { result = "SizeofTypeOperator" }
786798

787-
/** Gets the contained type. */
788-
Type getTypeOperand() { sizeof_bind(underlyingElement(this), unresolveElement(result)) }
799+
override Type getTypeOperand() { sizeof_bind(underlyingElement(this), unresolveElement(result)) }
789800

790801
override string toString() { result = "sizeof(" + this.getTypeOperand().getName() + ")" }
791802

@@ -842,6 +853,16 @@ class AlignofTypeOperator extends AlignofOperator {
842853
*/
843854
class DatasizeofOperator extends Expr, @datasizeof {
844855
override int getPrecedence() { result = 16 }
856+
857+
/**
858+
* Gets the contained type of this `__datasizeof`. For example,
859+
* the result is `int` in both cases below:
860+
* ```
861+
* __datasizeof(int);
862+
* __datasizeof(42);
863+
* ```
864+
*/
865+
Type getTypeOperand() { none() }
845866
}
846867

847868
/**
@@ -855,6 +876,8 @@ class DatasizeofExprOperator extends DatasizeofOperator {
855876
/** Gets the contained expression. */
856877
Expr getExprOperand() { result = this.getChild(0) }
857878

879+
override Type getTypeOperand() { result = this.getExprOperand().getType() }
880+
858881
override string toString() { result = "__datasizeof(<expr>)" }
859882

860883
override predicate mayBeImpure() { this.getExprOperand().mayBeImpure() }
@@ -870,8 +893,7 @@ class DatasizeofTypeOperator extends DatasizeofOperator {
870893

871894
override string getAPrimaryQlClass() { result = "DatasizeofTypeOperator" }
872895

873-
/** Gets the contained type. */
874-
Type getTypeOperand() { sizeof_bind(underlyingElement(this), unresolveElement(result)) }
896+
override Type getTypeOperand() { sizeof_bind(underlyingElement(this), unresolveElement(result)) }
875897

876898
override string toString() { result = "__datasizeof(" + this.getTypeOperand().getName() + ")" }
877899

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
1-
| sizeof.cpp:19:15:19:25 | sizeof(int) | 4 | SizeofTypeOperator.getTypeOperand() | file://:0:0:0:0 | int |
2-
| sizeof.cpp:20:15:20:26 | sizeof(char) | 1 | SizeofTypeOperator.getTypeOperand() | file://:0:0:0:0 | char |
3-
| sizeof.cpp:21:15:21:27 | sizeof(int *) | 8 | SizeofTypeOperator.getTypeOperand() | file://:0:0:0:0 | int * |
4-
| sizeof.cpp:22:15:22:29 | sizeof(MyClass) | 16 | SizeofTypeOperator.getTypeOperand() | sizeof.cpp:4:7:4:13 | MyClass |
1+
| sizeof.cpp:19:15:19:25 | sizeof(int) | 4 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int |
2+
| sizeof.cpp:20:15:20:26 | sizeof(char) | 1 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | char |
3+
| sizeof.cpp:21:15:21:27 | sizeof(int *) | 8 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int * |
4+
| sizeof.cpp:22:15:22:29 | sizeof(MyClass) | 16 | SizeofOperator.getTypeOperand() | sizeof.cpp:4:7:4:13 | MyClass |
55
| sizeof.cpp:23:15:23:23 | sizeof(<expr>) | 4 | SizeofExprOperator.getExprOperand() | sizeof.cpp:23:22:23:22 | i |
6+
| sizeof.cpp:23:15:23:23 | sizeof(<expr>) | 4 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int |
67
| sizeof.cpp:24:15:24:23 | sizeof(<expr>) | 1 | SizeofExprOperator.getExprOperand() | sizeof.cpp:24:22:24:22 | c |
8+
| sizeof.cpp:24:15:24:23 | sizeof(<expr>) | 1 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | char |
79
| sizeof.cpp:25:15:25:25 | sizeof(<expr>) | 8 | SizeofExprOperator.getExprOperand() | sizeof.cpp:25:22:25:24 | ptr |
10+
| sizeof.cpp:25:15:25:25 | sizeof(<expr>) | 8 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int * |
811
| sizeof.cpp:26:15:26:24 | sizeof(<expr>) | 16 | SizeofExprOperator.getExprOperand() | sizeof.cpp:26:22:26:23 | mc |
12+
| sizeof.cpp:26:15:26:24 | sizeof(<expr>) | 16 | SizeofOperator.getTypeOperand() | sizeof.cpp:4:7:4:13 | MyClass |
913
| sizeof.cpp:27:15:27:25 | sizeof(<expr>) | 40 | SizeofExprOperator.getExprOperand() | sizeof.cpp:27:22:27:24 | arr |
14+
| sizeof.cpp:27:15:27:25 | sizeof(<expr>) | 40 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int[10] |
1015
| sizeof.cpp:28:16:28:29 | sizeof(<expr>) | 4 | SizeofExprOperator.getExprOperand() | sizeof.cpp:28:23:28:28 | access to array |
16+
| sizeof.cpp:28:16:28:29 | sizeof(<expr>) | 4 | SizeofOperator.getTypeOperand() | file://:0:0:0:0 | int |

cpp/ql/test/library-tests/types/sizeof/sizeof.ql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import cpp
22

33
from SizeofOperator sto, string elemDesc, Element e
44
where
5-
elemDesc = "SizeofTypeOperator.getTypeOperand()" and
6-
e = sto.(SizeofTypeOperator).getTypeOperand()
5+
elemDesc = "SizeofOperator.getTypeOperand()" and
6+
e = sto.getTypeOperand()
77
or
88
elemDesc = "SizeofExprOperator.getExprOperand()" and
99
e = sto.(SizeofExprOperator).getExprOperand()

0 commit comments

Comments
 (0)