Skip to content

Commit 87b9afc

Browse files
authored
Merge branch 'main' into redsun82/ripunzip
2 parents 3be8591 + 73e72f5 commit 87b9afc

File tree

4 files changed

+42
-14
lines changed

4 files changed

+42
-14
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()

rust/ql/lib/codeql/rust/internal/TypeInference.qll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ private import TypeMention
99
private import typeinference.FunctionType
1010
private import typeinference.FunctionOverloading as FunctionOverloading
1111
private import typeinference.BlanketImplementation as BlanketImplementation
12+
private import codeql.rust.internal.CachedStages
1213
private import codeql.typeinference.internal.TypeInference
1314
private import codeql.rust.frameworks.stdlib.Stdlib
1415
private import codeql.rust.frameworks.stdlib.Builtins as Builtins
@@ -419,9 +420,10 @@ module CertainTypeInference {
419420
* Holds if `n` has complete and certain type information and if `n` has the
420421
* resulting type at `path`.
421422
*/
422-
pragma[nomagic]
423+
cached
423424
Type inferCertainType(AstNode n, TypePath path) {
424-
result = inferAnnotatedType(n, path)
425+
result = inferAnnotatedType(n, path) and
426+
Stages::TypeInferenceStage::ref()
425427
or
426428
result = inferCertainCallExprType(n, path)
427429
or
@@ -3407,8 +3409,6 @@ private Type inferCastExprType(CastExpr ce, TypePath path) {
34073409

34083410
cached
34093411
private module Cached {
3410-
private import codeql.rust.internal.CachedStages
3411-
34123412
/** Holds if `receiver` is the receiver of a method call with an implicit dereference. */
34133413
cached
34143414
predicate receiverHasImplicitDeref(AstNode receiver) {

0 commit comments

Comments
 (0)