mirror of
https://github.com/github/codeql.git
synced 2026-04-23 07:45:17 +02:00
Merge pull request #19976 from jketema/incr-2
C++: Output `CopyValue` in the IR when there is a non-transparent conversion
This commit is contained in:
@@ -151,7 +151,7 @@ private module Cached {
|
||||
)
|
||||
or
|
||||
// Similarly for `i++` and `++i` we pretend that the generated
|
||||
// `StoreInstruction` is contains the result of the expression even though
|
||||
// `StoreInstruction` contains the result of the expression even though
|
||||
// this isn't totally aligned with the C/C++ standard.
|
||||
exists(TranslatedCrementOperation tco |
|
||||
store = tco.getInstruction(CrementStoreTag()) and
|
||||
|
||||
@@ -4146,7 +4146,8 @@ predicate exprNeedsCopyIfNotLoaded(Expr expr) {
|
||||
private predicate exprImmediatelyDiscarded(Expr expr) {
|
||||
exists(ExprStmt s |
|
||||
s = expr.getParent() and
|
||||
not exists(StmtExpr se | s = se.getStmt().(BlockStmt).getLastStmt())
|
||||
not exists(StmtExpr se | s = se.getStmt().(BlockStmt).getLastStmt()) and
|
||||
not exists(expr.getConversion())
|
||||
)
|
||||
or
|
||||
exists(CommaExpr c | c.getLeftOperand() = expr)
|
||||
|
||||
@@ -42,8 +42,16 @@ void test_aggregate_literal() {
|
||||
void test_postfix_crement(int *p, int q) {
|
||||
p++; // $ asExpr="... ++" asIndirectExpr="... ++" asExpr=p asIndirectExpr=p
|
||||
q++; // $ asExpr="... ++" asExpr=q
|
||||
(void)(p++); // $ numberOfNodes="... ++: 2" asExpr="... ++" numberOfIndirectNodes="... ++: 2" asIndirectExpr="... ++" MISSING: asExpr=p asIndirectExpr=p
|
||||
(void)(q++); // $ numberOfNodes="... ++: 2" asExpr="... ++" MISSING: asExpr=q
|
||||
(p++); // $ asExpr="... ++" asIndirectExpr="... ++" asExpr="p(... ++)" asIndirectExpr="p(*... ++)"
|
||||
(q++); // $ asExpr="... ++" asExpr="q(... ++)"
|
||||
(void)(p++); // $ asExpr="p(... ++)" asIndirectExpr="p(*... ++)"
|
||||
(void)(q++); // $ asExpr="q(... ++)"
|
||||
(void)p++; // $ asExpr="p(... ++)" asIndirectExpr="p(*... ++)"
|
||||
(void)q++; // $ asExpr="q(... ++)"
|
||||
int *p1 = p++; // $ asExpr="... ++" asIndirectExpr="... ++" asExpr="p(... ++)" asIndirectExpr="p(*... ++)"
|
||||
int q1 = q++; // $ asExpr="... ++" asExpr="q(... ++)"
|
||||
(int*)(p++); // $ asExpr="... ++" asIndirectExpr="... ++" asExpr="p(... ++)" asIndirectExpr="p(*... ++)"
|
||||
(int)(q++); // $ asExpr="... ++" asExpr="q(... ++)"
|
||||
int *p2 = (int*)(p++); // $ asExpr="... ++" asIndirectExpr="... ++" asExpr="p(... ++)" asIndirectExpr="p(*... ++)"
|
||||
int q2 = (int)(q++); // $ asExpr="... ++" asExpr="q(... ++)"
|
||||
}
|
||||
|
||||
@@ -24262,6 +24262,180 @@ ir.cpp:
|
||||
# 2725| getExpr().getFullyConverted(): [ReferenceDereferenceExpr] (reference dereference)
|
||||
# 2725| Type = [PlainCharType] char
|
||||
# 2725| ValueCategory = prvalue(load)
|
||||
# 2728| [TopLevelFunction] void test_postfix_crement(int*, int)
|
||||
# 2728| <params>:
|
||||
# 2728| getParameter(0): [Parameter] p
|
||||
# 2728| Type = [IntPointerType] int *
|
||||
# 2728| getParameter(1): [Parameter] q
|
||||
# 2728| Type = [IntType] int
|
||||
# 2728| getEntryPoint(): [BlockStmt] { ... }
|
||||
# 2729| getStmt(0): [ExprStmt] ExprStmt
|
||||
# 2729| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2729| Type = [IntPointerType] int *
|
||||
# 2729| ValueCategory = prvalue
|
||||
# 2729| getOperand(): [VariableAccess] p
|
||||
# 2729| Type = [IntPointerType] int *
|
||||
# 2729| ValueCategory = lvalue
|
||||
# 2730| getStmt(1): [ExprStmt] ExprStmt
|
||||
# 2730| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2730| Type = [IntType] int
|
||||
# 2730| ValueCategory = prvalue
|
||||
# 2730| getOperand(): [VariableAccess] q
|
||||
# 2730| Type = [IntType] int
|
||||
# 2730| ValueCategory = lvalue
|
||||
# 2731| getStmt(2): [ExprStmt] ExprStmt
|
||||
# 2731| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2731| Type = [IntPointerType] int *
|
||||
# 2731| ValueCategory = prvalue
|
||||
# 2731| getOperand(): [VariableAccess] p
|
||||
# 2731| Type = [IntPointerType] int *
|
||||
# 2731| ValueCategory = lvalue
|
||||
# 2731| getExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 2731| Type = [IntPointerType] int *
|
||||
# 2731| ValueCategory = prvalue
|
||||
# 2732| getStmt(3): [ExprStmt] ExprStmt
|
||||
# 2732| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2732| Type = [IntType] int
|
||||
# 2732| ValueCategory = prvalue
|
||||
# 2732| getOperand(): [VariableAccess] q
|
||||
# 2732| Type = [IntType] int
|
||||
# 2732| ValueCategory = lvalue
|
||||
# 2732| getExpr().getFullyConverted(): [ParenthesisExpr] (...)
|
||||
# 2732| Type = [IntType] int
|
||||
# 2732| ValueCategory = prvalue
|
||||
# 2733| getStmt(4): [ExprStmt] ExprStmt
|
||||
# 2733| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2733| Type = [IntPointerType] int *
|
||||
# 2733| ValueCategory = prvalue
|
||||
# 2733| getOperand(): [VariableAccess] p
|
||||
# 2733| Type = [IntPointerType] int *
|
||||
# 2733| ValueCategory = lvalue
|
||||
# 2733| getExpr().getFullyConverted(): [CStyleCast] (void)...
|
||||
# 2733| Conversion = [VoidConversion] conversion to void
|
||||
# 2733| Type = [VoidType] void
|
||||
# 2733| ValueCategory = prvalue
|
||||
# 2733| getExpr(): [ParenthesisExpr] (...)
|
||||
# 2733| Type = [IntPointerType] int *
|
||||
# 2733| ValueCategory = prvalue
|
||||
# 2734| getStmt(5): [ExprStmt] ExprStmt
|
||||
# 2734| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2734| Type = [IntType] int
|
||||
# 2734| ValueCategory = prvalue
|
||||
# 2734| getOperand(): [VariableAccess] q
|
||||
# 2734| Type = [IntType] int
|
||||
# 2734| ValueCategory = lvalue
|
||||
# 2734| getExpr().getFullyConverted(): [CStyleCast] (void)...
|
||||
# 2734| Conversion = [VoidConversion] conversion to void
|
||||
# 2734| Type = [VoidType] void
|
||||
# 2734| ValueCategory = prvalue
|
||||
# 2734| getExpr(): [ParenthesisExpr] (...)
|
||||
# 2734| Type = [IntType] int
|
||||
# 2734| ValueCategory = prvalue
|
||||
# 2735| getStmt(6): [ExprStmt] ExprStmt
|
||||
# 2735| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2735| Type = [IntPointerType] int *
|
||||
# 2735| ValueCategory = prvalue
|
||||
# 2735| getOperand(): [VariableAccess] p
|
||||
# 2735| Type = [IntPointerType] int *
|
||||
# 2735| ValueCategory = lvalue
|
||||
# 2735| getExpr().getFullyConverted(): [CStyleCast] (void)...
|
||||
# 2735| Conversion = [VoidConversion] conversion to void
|
||||
# 2735| Type = [VoidType] void
|
||||
# 2735| ValueCategory = prvalue
|
||||
# 2736| getStmt(7): [ExprStmt] ExprStmt
|
||||
# 2736| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2736| Type = [IntType] int
|
||||
# 2736| ValueCategory = prvalue
|
||||
# 2736| getOperand(): [VariableAccess] q
|
||||
# 2736| Type = [IntType] int
|
||||
# 2736| ValueCategory = lvalue
|
||||
# 2736| getExpr().getFullyConverted(): [CStyleCast] (void)...
|
||||
# 2736| Conversion = [VoidConversion] conversion to void
|
||||
# 2736| Type = [VoidType] void
|
||||
# 2736| ValueCategory = prvalue
|
||||
# 2737| getStmt(8): [DeclStmt] declaration
|
||||
# 2737| getDeclarationEntry(0): [VariableDeclarationEntry] definition of p1
|
||||
# 2737| Type = [IntPointerType] int *
|
||||
# 2737| getVariable().getInitializer(): [Initializer] initializer for p1
|
||||
# 2737| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2737| Type = [IntPointerType] int *
|
||||
# 2737| ValueCategory = prvalue
|
||||
# 2737| getOperand(): [VariableAccess] p
|
||||
# 2737| Type = [IntPointerType] int *
|
||||
# 2737| ValueCategory = lvalue
|
||||
# 2738| getStmt(9): [DeclStmt] declaration
|
||||
# 2738| getDeclarationEntry(0): [VariableDeclarationEntry] definition of q1
|
||||
# 2738| Type = [IntType] int
|
||||
# 2738| getVariable().getInitializer(): [Initializer] initializer for q1
|
||||
# 2738| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2738| Type = [IntType] int
|
||||
# 2738| ValueCategory = prvalue
|
||||
# 2738| getOperand(): [VariableAccess] q
|
||||
# 2738| Type = [IntType] int
|
||||
# 2738| ValueCategory = lvalue
|
||||
# 2739| getStmt(10): [ExprStmt] ExprStmt
|
||||
# 2739| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2739| Type = [IntPointerType] int *
|
||||
# 2739| ValueCategory = prvalue
|
||||
# 2739| getOperand(): [VariableAccess] p
|
||||
# 2739| Type = [IntPointerType] int *
|
||||
# 2739| ValueCategory = lvalue
|
||||
# 2739| getExpr().getFullyConverted(): [CStyleCast] (int *)...
|
||||
# 2739| Conversion = [PointerConversion] pointer conversion
|
||||
# 2739| Type = [IntPointerType] int *
|
||||
# 2739| ValueCategory = prvalue
|
||||
# 2739| getExpr(): [ParenthesisExpr] (...)
|
||||
# 2739| Type = [IntPointerType] int *
|
||||
# 2739| ValueCategory = prvalue
|
||||
# 2740| getStmt(11): [ExprStmt] ExprStmt
|
||||
# 2740| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2740| Type = [IntType] int
|
||||
# 2740| ValueCategory = prvalue
|
||||
# 2740| getOperand(): [VariableAccess] q
|
||||
# 2740| Type = [IntType] int
|
||||
# 2740| ValueCategory = lvalue
|
||||
# 2740| getExpr().getFullyConverted(): [CStyleCast] (int)...
|
||||
# 2740| Conversion = [IntegralConversion] integral conversion
|
||||
# 2740| Type = [IntType] int
|
||||
# 2740| ValueCategory = prvalue
|
||||
# 2740| getExpr(): [ParenthesisExpr] (...)
|
||||
# 2740| Type = [IntType] int
|
||||
# 2740| ValueCategory = prvalue
|
||||
# 2741| getStmt(12): [DeclStmt] declaration
|
||||
# 2741| getDeclarationEntry(0): [VariableDeclarationEntry] definition of p2
|
||||
# 2741| Type = [IntPointerType] int *
|
||||
# 2741| getVariable().getInitializer(): [Initializer] initializer for p2
|
||||
# 2741| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2741| Type = [IntPointerType] int *
|
||||
# 2741| ValueCategory = prvalue
|
||||
# 2741| getOperand(): [VariableAccess] p
|
||||
# 2741| Type = [IntPointerType] int *
|
||||
# 2741| ValueCategory = lvalue
|
||||
# 2741| getExpr().getFullyConverted(): [CStyleCast] (int *)...
|
||||
# 2741| Conversion = [PointerConversion] pointer conversion
|
||||
# 2741| Type = [IntPointerType] int *
|
||||
# 2741| ValueCategory = prvalue
|
||||
# 2741| getExpr(): [ParenthesisExpr] (...)
|
||||
# 2741| Type = [IntPointerType] int *
|
||||
# 2741| ValueCategory = prvalue
|
||||
# 2742| getStmt(13): [DeclStmt] declaration
|
||||
# 2742| getDeclarationEntry(0): [VariableDeclarationEntry] definition of q2
|
||||
# 2742| Type = [IntType] int
|
||||
# 2742| getVariable().getInitializer(): [Initializer] initializer for q2
|
||||
# 2742| getExpr(): [PostfixIncrExpr] ... ++
|
||||
# 2742| Type = [IntType] int
|
||||
# 2742| ValueCategory = prvalue
|
||||
# 2742| getOperand(): [VariableAccess] q
|
||||
# 2742| Type = [IntType] int
|
||||
# 2742| ValueCategory = lvalue
|
||||
# 2742| getExpr().getFullyConverted(): [CStyleCast] (int)...
|
||||
# 2742| Conversion = [IntegralConversion] integral conversion
|
||||
# 2742| Type = [IntType] int
|
||||
# 2742| ValueCategory = prvalue
|
||||
# 2742| getExpr(): [ParenthesisExpr] (...)
|
||||
# 2742| Type = [IntType] int
|
||||
# 2742| ValueCategory = prvalue
|
||||
# 2743| getStmt(14): [ReturnStmt] return ...
|
||||
ir23.cpp:
|
||||
# 1| [TopLevelFunction] bool consteval_1()
|
||||
# 1| <params>:
|
||||
|
||||
@@ -20156,6 +20156,123 @@ ir.cpp:
|
||||
# 2724| v2724_12(void) = AliasedUse : ~m2725_8
|
||||
# 2724| v2724_13(void) = ExitFunction :
|
||||
|
||||
# 2728| void test_postfix_crement(int*, int)
|
||||
# 2728| Block 0
|
||||
# 2728| v2728_1(void) = EnterFunction :
|
||||
# 2728| m2728_2(unknown) = AliasedDefinition :
|
||||
# 2728| m2728_3(unknown) = InitializeNonLocal :
|
||||
# 2728| m2728_4(unknown) = Chi : total:m2728_2, partial:m2728_3
|
||||
# 2728| r2728_5(glval<int *>) = VariableAddress[p] :
|
||||
# 2728| m2728_6(int *) = InitializeParameter[p] : &:r2728_5
|
||||
# 2728| r2728_7(int *) = Load[p] : &:r2728_5, m2728_6
|
||||
# 2728| m2728_8(unknown) = InitializeIndirection[p] : &:r2728_7
|
||||
# 2728| m2728_9(unknown) = Chi : total:m2728_4, partial:m2728_8
|
||||
# 2728| r2728_10(glval<int>) = VariableAddress[q] :
|
||||
# 2728| m2728_11(int) = InitializeParameter[q] : &:r2728_10
|
||||
# 2729| r2729_1(glval<int *>) = VariableAddress[p] :
|
||||
# 2729| r2729_2(int *) = Load[p] : &:r2729_1, m2728_6
|
||||
# 2729| r2729_3(int) = Constant[1] :
|
||||
# 2729| r2729_4(int *) = PointerAdd[4] : r2729_2, r2729_3
|
||||
# 2729| m2729_5(int *) = Store[p] : &:r2729_1, r2729_4
|
||||
# 2730| r2730_1(glval<int>) = VariableAddress[q] :
|
||||
# 2730| r2730_2(int) = Load[q] : &:r2730_1, m2728_11
|
||||
# 2730| r2730_3(int) = Constant[1] :
|
||||
# 2730| r2730_4(int) = Add : r2730_2, r2730_3
|
||||
# 2730| m2730_5(int) = Store[q] : &:r2730_1, r2730_4
|
||||
# 2731| r2731_1(glval<int *>) = VariableAddress[p] :
|
||||
# 2731| r2731_2(int *) = Load[p] : &:r2731_1, m2729_5
|
||||
# 2731| r2731_3(int) = Constant[1] :
|
||||
# 2731| r2731_4(int *) = PointerAdd[4] : r2731_2, r2731_3
|
||||
# 2731| m2731_5(int *) = Store[p] : &:r2731_1, r2731_4
|
||||
# 2731| r2731_6(int *) = CopyValue : r2731_2
|
||||
# 2732| r2732_1(glval<int>) = VariableAddress[q] :
|
||||
# 2732| r2732_2(int) = Load[q] : &:r2732_1, m2730_5
|
||||
# 2732| r2732_3(int) = Constant[1] :
|
||||
# 2732| r2732_4(int) = Add : r2732_2, r2732_3
|
||||
# 2732| m2732_5(int) = Store[q] : &:r2732_1, r2732_4
|
||||
# 2732| r2732_6(int) = CopyValue : r2732_2
|
||||
# 2733| r2733_1(glval<int *>) = VariableAddress[p] :
|
||||
# 2733| r2733_2(int *) = Load[p] : &:r2733_1, m2731_5
|
||||
# 2733| r2733_3(int) = Constant[1] :
|
||||
# 2733| r2733_4(int *) = PointerAdd[4] : r2733_2, r2733_3
|
||||
# 2733| m2733_5(int *) = Store[p] : &:r2733_1, r2733_4
|
||||
# 2733| r2733_6(int *) = CopyValue : r2733_2
|
||||
# 2733| v2733_7(void) = Convert : r2733_6
|
||||
# 2734| r2734_1(glval<int>) = VariableAddress[q] :
|
||||
# 2734| r2734_2(int) = Load[q] : &:r2734_1, m2732_5
|
||||
# 2734| r2734_3(int) = Constant[1] :
|
||||
# 2734| r2734_4(int) = Add : r2734_2, r2734_3
|
||||
# 2734| m2734_5(int) = Store[q] : &:r2734_1, r2734_4
|
||||
# 2734| r2734_6(int) = CopyValue : r2734_2
|
||||
# 2734| v2734_7(void) = Convert : r2734_6
|
||||
# 2735| r2735_1(glval<int *>) = VariableAddress[p] :
|
||||
# 2735| r2735_2(int *) = Load[p] : &:r2735_1, m2733_5
|
||||
# 2735| r2735_3(int) = Constant[1] :
|
||||
# 2735| r2735_4(int *) = PointerAdd[4] : r2735_2, r2735_3
|
||||
# 2735| m2735_5(int *) = Store[p] : &:r2735_1, r2735_4
|
||||
# 2735| r2735_6(int *) = CopyValue : r2735_2
|
||||
# 2735| v2735_7(void) = Convert : r2735_6
|
||||
# 2736| r2736_1(glval<int>) = VariableAddress[q] :
|
||||
# 2736| r2736_2(int) = Load[q] : &:r2736_1, m2734_5
|
||||
# 2736| r2736_3(int) = Constant[1] :
|
||||
# 2736| r2736_4(int) = Add : r2736_2, r2736_3
|
||||
# 2736| m2736_5(int) = Store[q] : &:r2736_1, r2736_4
|
||||
# 2736| r2736_6(int) = CopyValue : r2736_2
|
||||
# 2736| v2736_7(void) = Convert : r2736_6
|
||||
# 2737| r2737_1(glval<int *>) = VariableAddress[p1] :
|
||||
# 2737| r2737_2(glval<int *>) = VariableAddress[p] :
|
||||
# 2737| r2737_3(int *) = Load[p] : &:r2737_2, m2735_5
|
||||
# 2737| r2737_4(int) = Constant[1] :
|
||||
# 2737| r2737_5(int *) = PointerAdd[4] : r2737_3, r2737_4
|
||||
# 2737| m2737_6(int *) = Store[p] : &:r2737_2, r2737_5
|
||||
# 2737| r2737_7(int *) = CopyValue : r2737_3
|
||||
# 2737| m2737_8(int *) = Store[p1] : &:r2737_1, r2737_7
|
||||
# 2738| r2738_1(glval<int>) = VariableAddress[q1] :
|
||||
# 2738| r2738_2(glval<int>) = VariableAddress[q] :
|
||||
# 2738| r2738_3(int) = Load[q] : &:r2738_2, m2736_5
|
||||
# 2738| r2738_4(int) = Constant[1] :
|
||||
# 2738| r2738_5(int) = Add : r2738_3, r2738_4
|
||||
# 2738| m2738_6(int) = Store[q] : &:r2738_2, r2738_5
|
||||
# 2738| r2738_7(int) = CopyValue : r2738_3
|
||||
# 2738| m2738_8(int) = Store[q1] : &:r2738_1, r2738_7
|
||||
# 2739| r2739_1(glval<int *>) = VariableAddress[p] :
|
||||
# 2739| r2739_2(int *) = Load[p] : &:r2739_1, m2737_6
|
||||
# 2739| r2739_3(int) = Constant[1] :
|
||||
# 2739| r2739_4(int *) = PointerAdd[4] : r2739_2, r2739_3
|
||||
# 2739| m2739_5(int *) = Store[p] : &:r2739_1, r2739_4
|
||||
# 2739| r2739_6(int *) = CopyValue : r2739_2
|
||||
# 2739| r2739_7(int *) = Convert : r2739_6
|
||||
# 2740| r2740_1(glval<int>) = VariableAddress[q] :
|
||||
# 2740| r2740_2(int) = Load[q] : &:r2740_1, m2738_6
|
||||
# 2740| r2740_3(int) = Constant[1] :
|
||||
# 2740| r2740_4(int) = Add : r2740_2, r2740_3
|
||||
# 2740| m2740_5(int) = Store[q] : &:r2740_1, r2740_4
|
||||
# 2740| r2740_6(int) = CopyValue : r2740_2
|
||||
# 2740| r2740_7(int) = Convert : r2740_6
|
||||
# 2741| r2741_1(glval<int *>) = VariableAddress[p2] :
|
||||
# 2741| r2741_2(glval<int *>) = VariableAddress[p] :
|
||||
# 2741| r2741_3(int *) = Load[p] : &:r2741_2, m2739_5
|
||||
# 2741| r2741_4(int) = Constant[1] :
|
||||
# 2741| r2741_5(int *) = PointerAdd[4] : r2741_3, r2741_4
|
||||
# 2741| m2741_6(int *) = Store[p] : &:r2741_2, r2741_5
|
||||
# 2741| r2741_7(int *) = CopyValue : r2741_3
|
||||
# 2741| r2741_8(int *) = Convert : r2741_7
|
||||
# 2741| m2741_9(int *) = Store[p2] : &:r2741_1, r2741_8
|
||||
# 2742| r2742_1(glval<int>) = VariableAddress[q2] :
|
||||
# 2742| r2742_2(glval<int>) = VariableAddress[q] :
|
||||
# 2742| r2742_3(int) = Load[q] : &:r2742_2, m2740_5
|
||||
# 2742| r2742_4(int) = Constant[1] :
|
||||
# 2742| r2742_5(int) = Add : r2742_3, r2742_4
|
||||
# 2742| m2742_6(int) = Store[q] : &:r2742_2, r2742_5
|
||||
# 2742| r2742_7(int) = CopyValue : r2742_3
|
||||
# 2742| r2742_8(int) = Convert : r2742_7
|
||||
# 2742| m2742_9(int) = Store[q2] : &:r2742_1, r2742_8
|
||||
# 2743| v2743_1(void) = NoOp :
|
||||
# 2728| v2728_12(void) = ReturnIndirection[p] : &:r2728_7, m2728_8
|
||||
# 2728| v2728_13(void) = ReturnVoid :
|
||||
# 2728| v2728_14(void) = AliasedUse : ~m2728_9
|
||||
# 2728| v2728_15(void) = ExitFunction :
|
||||
|
||||
ir23.cpp:
|
||||
# 1| bool consteval_1()
|
||||
# 1| Block 0
|
||||
|
||||
@@ -2725,4 +2725,21 @@ char UseBracketOperator(const WithBracketOperator x, int i) {
|
||||
return x[i];
|
||||
}
|
||||
|
||||
void test_postfix_crement(int *p, int q) {
|
||||
p++;
|
||||
q++;
|
||||
(p++);
|
||||
(q++);
|
||||
(void)(p++);
|
||||
(void)(q++);
|
||||
(void)p++;
|
||||
(void)q++;
|
||||
int *p1 = p++;
|
||||
int q1 = q++;
|
||||
(int*)(p++);
|
||||
(int)(q++);
|
||||
int *p2 = (int*)(p++);
|
||||
int q2 = (int)(q++);
|
||||
}
|
||||
|
||||
// semmle-extractor-options: -std=c++20 --clang
|
||||
|
||||
@@ -18317,6 +18317,121 @@ ir.cpp:
|
||||
# 2724| v2724_10(void) = AliasedUse : ~m?
|
||||
# 2724| v2724_11(void) = ExitFunction :
|
||||
|
||||
# 2728| void test_postfix_crement(int*, int)
|
||||
# 2728| Block 0
|
||||
# 2728| v2728_1(void) = EnterFunction :
|
||||
# 2728| mu2728_2(unknown) = AliasedDefinition :
|
||||
# 2728| mu2728_3(unknown) = InitializeNonLocal :
|
||||
# 2728| r2728_4(glval<int *>) = VariableAddress[p] :
|
||||
# 2728| mu2728_5(int *) = InitializeParameter[p] : &:r2728_4
|
||||
# 2728| r2728_6(int *) = Load[p] : &:r2728_4, ~m?
|
||||
# 2728| mu2728_7(unknown) = InitializeIndirection[p] : &:r2728_6
|
||||
# 2728| r2728_8(glval<int>) = VariableAddress[q] :
|
||||
# 2728| mu2728_9(int) = InitializeParameter[q] : &:r2728_8
|
||||
# 2729| r2729_1(glval<int *>) = VariableAddress[p] :
|
||||
# 2729| r2729_2(int *) = Load[p] : &:r2729_1, ~m?
|
||||
# 2729| r2729_3(int) = Constant[1] :
|
||||
# 2729| r2729_4(int *) = PointerAdd[4] : r2729_2, r2729_3
|
||||
# 2729| mu2729_5(int *) = Store[p] : &:r2729_1, r2729_4
|
||||
# 2730| r2730_1(glval<int>) = VariableAddress[q] :
|
||||
# 2730| r2730_2(int) = Load[q] : &:r2730_1, ~m?
|
||||
# 2730| r2730_3(int) = Constant[1] :
|
||||
# 2730| r2730_4(int) = Add : r2730_2, r2730_3
|
||||
# 2730| mu2730_5(int) = Store[q] : &:r2730_1, r2730_4
|
||||
# 2731| r2731_1(glval<int *>) = VariableAddress[p] :
|
||||
# 2731| r2731_2(int *) = Load[p] : &:r2731_1, ~m?
|
||||
# 2731| r2731_3(int) = Constant[1] :
|
||||
# 2731| r2731_4(int *) = PointerAdd[4] : r2731_2, r2731_3
|
||||
# 2731| mu2731_5(int *) = Store[p] : &:r2731_1, r2731_4
|
||||
# 2731| r2731_6(int *) = CopyValue : r2731_2
|
||||
# 2732| r2732_1(glval<int>) = VariableAddress[q] :
|
||||
# 2732| r2732_2(int) = Load[q] : &:r2732_1, ~m?
|
||||
# 2732| r2732_3(int) = Constant[1] :
|
||||
# 2732| r2732_4(int) = Add : r2732_2, r2732_3
|
||||
# 2732| mu2732_5(int) = Store[q] : &:r2732_1, r2732_4
|
||||
# 2732| r2732_6(int) = CopyValue : r2732_2
|
||||
# 2733| r2733_1(glval<int *>) = VariableAddress[p] :
|
||||
# 2733| r2733_2(int *) = Load[p] : &:r2733_1, ~m?
|
||||
# 2733| r2733_3(int) = Constant[1] :
|
||||
# 2733| r2733_4(int *) = PointerAdd[4] : r2733_2, r2733_3
|
||||
# 2733| mu2733_5(int *) = Store[p] : &:r2733_1, r2733_4
|
||||
# 2733| r2733_6(int *) = CopyValue : r2733_2
|
||||
# 2733| v2733_7(void) = Convert : r2733_6
|
||||
# 2734| r2734_1(glval<int>) = VariableAddress[q] :
|
||||
# 2734| r2734_2(int) = Load[q] : &:r2734_1, ~m?
|
||||
# 2734| r2734_3(int) = Constant[1] :
|
||||
# 2734| r2734_4(int) = Add : r2734_2, r2734_3
|
||||
# 2734| mu2734_5(int) = Store[q] : &:r2734_1, r2734_4
|
||||
# 2734| r2734_6(int) = CopyValue : r2734_2
|
||||
# 2734| v2734_7(void) = Convert : r2734_6
|
||||
# 2735| r2735_1(glval<int *>) = VariableAddress[p] :
|
||||
# 2735| r2735_2(int *) = Load[p] : &:r2735_1, ~m?
|
||||
# 2735| r2735_3(int) = Constant[1] :
|
||||
# 2735| r2735_4(int *) = PointerAdd[4] : r2735_2, r2735_3
|
||||
# 2735| mu2735_5(int *) = Store[p] : &:r2735_1, r2735_4
|
||||
# 2735| r2735_6(int *) = CopyValue : r2735_2
|
||||
# 2735| v2735_7(void) = Convert : r2735_6
|
||||
# 2736| r2736_1(glval<int>) = VariableAddress[q] :
|
||||
# 2736| r2736_2(int) = Load[q] : &:r2736_1, ~m?
|
||||
# 2736| r2736_3(int) = Constant[1] :
|
||||
# 2736| r2736_4(int) = Add : r2736_2, r2736_3
|
||||
# 2736| mu2736_5(int) = Store[q] : &:r2736_1, r2736_4
|
||||
# 2736| r2736_6(int) = CopyValue : r2736_2
|
||||
# 2736| v2736_7(void) = Convert : r2736_6
|
||||
# 2737| r2737_1(glval<int *>) = VariableAddress[p1] :
|
||||
# 2737| r2737_2(glval<int *>) = VariableAddress[p] :
|
||||
# 2737| r2737_3(int *) = Load[p] : &:r2737_2, ~m?
|
||||
# 2737| r2737_4(int) = Constant[1] :
|
||||
# 2737| r2737_5(int *) = PointerAdd[4] : r2737_3, r2737_4
|
||||
# 2737| mu2737_6(int *) = Store[p] : &:r2737_2, r2737_5
|
||||
# 2737| r2737_7(int *) = CopyValue : r2737_3
|
||||
# 2737| mu2737_8(int *) = Store[p1] : &:r2737_1, r2737_7
|
||||
# 2738| r2738_1(glval<int>) = VariableAddress[q1] :
|
||||
# 2738| r2738_2(glval<int>) = VariableAddress[q] :
|
||||
# 2738| r2738_3(int) = Load[q] : &:r2738_2, ~m?
|
||||
# 2738| r2738_4(int) = Constant[1] :
|
||||
# 2738| r2738_5(int) = Add : r2738_3, r2738_4
|
||||
# 2738| mu2738_6(int) = Store[q] : &:r2738_2, r2738_5
|
||||
# 2738| r2738_7(int) = CopyValue : r2738_3
|
||||
# 2738| mu2738_8(int) = Store[q1] : &:r2738_1, r2738_7
|
||||
# 2739| r2739_1(glval<int *>) = VariableAddress[p] :
|
||||
# 2739| r2739_2(int *) = Load[p] : &:r2739_1, ~m?
|
||||
# 2739| r2739_3(int) = Constant[1] :
|
||||
# 2739| r2739_4(int *) = PointerAdd[4] : r2739_2, r2739_3
|
||||
# 2739| mu2739_5(int *) = Store[p] : &:r2739_1, r2739_4
|
||||
# 2739| r2739_6(int *) = CopyValue : r2739_2
|
||||
# 2739| r2739_7(int *) = Convert : r2739_6
|
||||
# 2740| r2740_1(glval<int>) = VariableAddress[q] :
|
||||
# 2740| r2740_2(int) = Load[q] : &:r2740_1, ~m?
|
||||
# 2740| r2740_3(int) = Constant[1] :
|
||||
# 2740| r2740_4(int) = Add : r2740_2, r2740_3
|
||||
# 2740| mu2740_5(int) = Store[q] : &:r2740_1, r2740_4
|
||||
# 2740| r2740_6(int) = CopyValue : r2740_2
|
||||
# 2740| r2740_7(int) = Convert : r2740_6
|
||||
# 2741| r2741_1(glval<int *>) = VariableAddress[p2] :
|
||||
# 2741| r2741_2(glval<int *>) = VariableAddress[p] :
|
||||
# 2741| r2741_3(int *) = Load[p] : &:r2741_2, ~m?
|
||||
# 2741| r2741_4(int) = Constant[1] :
|
||||
# 2741| r2741_5(int *) = PointerAdd[4] : r2741_3, r2741_4
|
||||
# 2741| mu2741_6(int *) = Store[p] : &:r2741_2, r2741_5
|
||||
# 2741| r2741_7(int *) = CopyValue : r2741_3
|
||||
# 2741| r2741_8(int *) = Convert : r2741_7
|
||||
# 2741| mu2741_9(int *) = Store[p2] : &:r2741_1, r2741_8
|
||||
# 2742| r2742_1(glval<int>) = VariableAddress[q2] :
|
||||
# 2742| r2742_2(glval<int>) = VariableAddress[q] :
|
||||
# 2742| r2742_3(int) = Load[q] : &:r2742_2, ~m?
|
||||
# 2742| r2742_4(int) = Constant[1] :
|
||||
# 2742| r2742_5(int) = Add : r2742_3, r2742_4
|
||||
# 2742| mu2742_6(int) = Store[q] : &:r2742_2, r2742_5
|
||||
# 2742| r2742_7(int) = CopyValue : r2742_3
|
||||
# 2742| r2742_8(int) = Convert : r2742_7
|
||||
# 2742| mu2742_9(int) = Store[q2] : &:r2742_1, r2742_8
|
||||
# 2743| v2743_1(void) = NoOp :
|
||||
# 2728| v2728_10(void) = ReturnIndirection[p] : &:r2728_6, ~m?
|
||||
# 2728| v2728_11(void) = ReturnVoid :
|
||||
# 2728| v2728_12(void) = AliasedUse : ~m?
|
||||
# 2728| v2728_13(void) = ExitFunction :
|
||||
|
||||
ir23.cpp:
|
||||
# 1| bool consteval_1()
|
||||
# 1| Block 0
|
||||
|
||||
Reference in New Issue
Block a user