mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
C++: fix handling of aligned allocators
This commit is contained in:
@@ -92,11 +92,11 @@ private cached newtype HCBase =
|
||||
mk_MemberFunctionCall(trg, qual, args, _)
|
||||
}
|
||||
or
|
||||
HC_NewExpr(Type t, HC_Alloc alloc, HC_Init init) {
|
||||
mk_NewExpr(t, alloc, init, _, _)
|
||||
HC_NewExpr(Type t, HC_Alloc alloc, HC_Init init, HC_Align align) {
|
||||
mk_NewExpr(t, alloc, init, align, _, _)
|
||||
} or
|
||||
HC_NewArrayExpr(Type t, HC_Alloc alloc, HC_Init init) {
|
||||
mk_NewArrayExpr(t, alloc, init, _, _)
|
||||
HC_NewArrayExpr(Type t, HC_Alloc alloc, HC_Init init, HC_Align align) {
|
||||
mk_NewArrayExpr(t, alloc, init, align, _, _)
|
||||
}
|
||||
or
|
||||
HC_SizeofType(Type t) {mk_SizeofType(t, _)}
|
||||
@@ -123,11 +123,18 @@ private newtype HC_Alloc =
|
||||
}
|
||||
or
|
||||
HC_NoAlloc()
|
||||
|
||||
/** Used to implement optional init on `new` expressions */
|
||||
private newtype HC_Init =
|
||||
HC_NoInit()
|
||||
or
|
||||
HC_HasInit(HashCons hc) {mk_HasInit(hc, _)}
|
||||
|
||||
private newtype HC_Align =
|
||||
HC_NoAlign()
|
||||
or
|
||||
HC_HasAlign(HashCons hc) {mk_HasAlign(hc, _)}
|
||||
|
||||
/** Used to implement hash-consing of argument lists */
|
||||
private newtype HC_Args =
|
||||
HC_EmptyArgs(Function fcn) {
|
||||
@@ -525,6 +532,10 @@ private predicate mk_HasInit(HashCons hc, NewOrNewArrayExpr new) {
|
||||
hc = hashCons(new.(NewArrayExpr).getInitializer())
|
||||
}
|
||||
|
||||
private predicate mk_HasAlign(HashCons hc, NewOrNewArrayExpr new) {
|
||||
hc = hashCons(new.getAlignmentArgument())
|
||||
}
|
||||
|
||||
private predicate analyzableNewExpr(NewExpr new) {
|
||||
strictcount(new.getAllocatedType()) = 1 and
|
||||
(
|
||||
@@ -538,14 +549,16 @@ private predicate analyzableNewExpr(NewExpr new) {
|
||||
)
|
||||
}
|
||||
|
||||
private predicate mk_NewExpr(Type t, HC_Alloc alloc, HC_Init init, boolean aligned, NewExpr new) {
|
||||
private predicate mk_NewExpr(Type t, HC_Alloc alloc, HC_Init init, HC_Align align, boolean aligned,
|
||||
NewExpr new) {
|
||||
analyzableNewExpr(new) and
|
||||
t = new.getAllocatedType() and
|
||||
(
|
||||
new.hasAlignedAllocation() and
|
||||
align = HC_HasAlign(hashCons(new.getAlignmentArgument())) and
|
||||
aligned = true
|
||||
or
|
||||
not new.hasAlignedAllocation() and
|
||||
align = HC_NoAlign() and
|
||||
aligned = false
|
||||
)
|
||||
and
|
||||
@@ -594,15 +607,16 @@ private predicate analyzableNewArrayExpr(NewArrayExpr new) {
|
||||
)
|
||||
}
|
||||
|
||||
private predicate mk_NewArrayExpr(Type t, HC_Alloc alloc, HC_Init init, boolean aligned,
|
||||
NewArrayExpr new) {
|
||||
private predicate mk_NewArrayExpr(Type t, HC_Alloc alloc, HC_Init init, HC_Align align,
|
||||
boolean aligned, NewArrayExpr new) {
|
||||
analyzableNewArrayExpr(new) and
|
||||
t = new.getAllocatedType() and
|
||||
(
|
||||
new.hasAlignedAllocation() and
|
||||
align = HC_HasAlign(hashCons(new.getAlignmentArgument())) and
|
||||
aligned = true
|
||||
or
|
||||
not new.hasAlignedAllocation() and
|
||||
align = HC_NoAlign() and
|
||||
aligned = false
|
||||
)
|
||||
and
|
||||
@@ -744,14 +758,14 @@ cached HashCons hashCons(Expr e) {
|
||||
result = HC_MemberFunctionCall(fcn, qual, args)
|
||||
)
|
||||
or
|
||||
exists(Type t, HC_Alloc alloc, HC_Init init, boolean aligned
|
||||
| mk_NewExpr(t, alloc, init, aligned, e) and
|
||||
result = HC_NewExpr(t, alloc, init)
|
||||
exists(Type t, HC_Alloc alloc, HC_Init init, HC_Align align, boolean aligned
|
||||
| mk_NewExpr(t, alloc, init, align, aligned, e) and
|
||||
result = HC_NewExpr(t, alloc, init, align)
|
||||
)
|
||||
or
|
||||
exists(Type t, HC_Alloc alloc, HC_Init init, boolean aligned
|
||||
| mk_NewArrayExpr(t, alloc, init, aligned, e) and
|
||||
result = HC_NewArrayExpr(t, alloc, init)
|
||||
exists(Type t, HC_Alloc alloc, HC_Init init, HC_Align align, boolean aligned
|
||||
| mk_NewArrayExpr(t, alloc, init, align, aligned, e) and
|
||||
result = HC_NewArrayExpr(t, alloc, init, align)
|
||||
)
|
||||
or
|
||||
exists(Type t
|
||||
|
||||
@@ -38,9 +38,9 @@
|
||||
| test.cpp:92:11:92:11 | x | 92:c11-c11 93:c10-c10 |
|
||||
| test.cpp:97:3:97:3 | x | 97:c3-c3 98:c3-c3 |
|
||||
| test.cpp:97:3:97:5 | ... ++ | 97:c3-c5 98:c3-c5 |
|
||||
| test.cpp:103:10:103:11 | 1 | 103:c10-c11 104:c7-c7 107:c7-c7 108:c7-c7 10:c16-c16 179:c21-c21 247:c11-c11 248:c11-c11 270:c19-c19 271:c19-c19 |
|
||||
| test.cpp:103:10:103:11 | 1 | 103:c10-c11 104:c7-c7 107:c7-c7 108:c7-c7 10:c16-c16 179:c21-c21 247:c11-c11 248:c11-c11 271:c19-c19 272:c19-c19 |
|
||||
| test.cpp:104:3:104:3 | x | 104:c3-c3 105:c3-c3 106:c3-c3 107:c3-c3 108:c3-c3 |
|
||||
| test.cpp:105:7:105:7 | 2 | 105:c7-c7 106:c7-c7 107:c11-c11 108:c11-c11 21:c16-c16 249:c11-c11 270:c15-c15 270:c22-c22 271:c15-c15 271:c22-c22 272:c15-c15 |
|
||||
| test.cpp:105:7:105:7 | 2 | 105:c7-c7 106:c7-c7 107:c11-c11 108:c11-c11 21:c16-c16 249:c11-c11 271:c15-c15 271:c22-c22 272:c15-c15 272:c22-c22 273:c15-c15 |
|
||||
| test.cpp:107:7:107:11 | ... + ... | 107:c7-c11 108:c7-c11 |
|
||||
| test.cpp:110:15:110:17 | 1 | 110:c15-c17 111:c9-c11 |
|
||||
| test.cpp:110:15:110:17 | (char *)... | 110:c15-c17 111:c9-c11 |
|
||||
@@ -86,14 +86,14 @@
|
||||
| test.cpp:247:3:247:12 | new | 247:c3-c12 248:c3-c12 |
|
||||
| test.cpp:253:16:253:36 | new[] | 253:c16-c36 254:c16-c36 |
|
||||
| test.cpp:256:3:256:21 | new | 256:c3-c21 257:c3-c21 |
|
||||
| test.cpp:256:7:256:10 | (void *)... | 256:c7-c10 257:c7-c10 260:c11-c14 261:c11-c14 |
|
||||
| test.cpp:256:7:256:10 | ptr1 | 256:c7-c10 257:c7-c10 260:c11-c14 261:c11-c14 |
|
||||
| test.cpp:256:7:256:10 | (void *)... | 256:c7-c10 257:c7-c10 260:c11-c14 261:c11-c14 263:c11-c14 |
|
||||
| test.cpp:256:7:256:10 | ptr1 | 256:c7-c10 257:c7-c10 260:c11-c14 261:c11-c14 263:c11-c14 |
|
||||
| test.cpp:258:7:258:10 | (void *)... | 258:c7-c10 262:c11-c14 |
|
||||
| test.cpp:258:7:258:10 | ptr2 | 258:c7-c10 262:c11-c14 |
|
||||
| test.cpp:260:3:260:25 | new | 260:c3-c25 261:c3-c25 |
|
||||
| test.cpp:260:7:260:8 | 32 | 260:c7-c8 261:c7-c8 262:c7-c8 264:c7-c8 265:c7-c8 267:c7-c8 268:c7-c8 270:c7-c8 271:c7-c8 272:c7-c8 |
|
||||
| test.cpp:260:7:260:8 | (size_t)... | 260:c7-c8 261:c7-c8 262:c7-c8 264:c7-c8 265:c7-c8 267:c7-c8 268:c7-c8 270:c7-c8 271:c7-c8 272:c7-c8 |
|
||||
| test.cpp:264:3:264:19 | new | 264:c3-c19 265:c3-c19 |
|
||||
| test.cpp:267:3:267:23 | new[] | 267:c3-c23 268:c3-c23 |
|
||||
| test.cpp:267:21:267:22 | 10 | 267:c21-c22 268:c21-c22 92:c15-c16 |
|
||||
| test.cpp:272:19:272:19 | 3 | 272:c19-c19 35:c16-c16 |
|
||||
| test.cpp:260:7:260:8 | 32 | 260:c7-c8 261:c7-c8 262:c7-c8 265:c7-c8 266:c7-c8 268:c7-c8 269:c7-c8 271:c7-c8 272:c7-c8 273:c7-c8 |
|
||||
| test.cpp:260:7:260:8 | (size_t)... | 260:c7-c8 261:c7-c8 262:c7-c8 265:c7-c8 266:c7-c8 268:c7-c8 269:c7-c8 271:c7-c8 272:c7-c8 273:c7-c8 |
|
||||
| test.cpp:265:3:265:19 | new | 265:c3-c19 266:c3-c19 |
|
||||
| test.cpp:268:3:268:23 | new[] | 268:c3-c23 269:c3-c23 |
|
||||
| test.cpp:268:21:268:22 | 10 | 268:c21-c22 269:c21-c22 92:c15-c16 |
|
||||
| test.cpp:273:19:273:19 | 3 | 273:c19-c19 35:c16-c16 |
|
||||
|
||||
@@ -260,6 +260,7 @@ void test16() {
|
||||
new(32, ptr1) IntHolder;
|
||||
new(32, ptr1) IntHolder;
|
||||
new(32, ptr2) IntHolder;
|
||||
new(16, ptr1) IntHolder;
|
||||
|
||||
new(32) IntHolder;
|
||||
new(32) IntHolder;
|
||||
|
||||
Reference in New Issue
Block a user