Skip to content

Commit ae13774

Browse files
author
Robert Marsh
committed
C++: only generate uninits when needed
1 parent 81ad110 commit ae13774

File tree

5 files changed

+158
-164
lines changed

5 files changed

+158
-164
lines changed

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedDeclarationEntry.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ abstract class TranslatedVariableDeclaration extends TranslatedElement, Initiali
121121
private predicate hasUninitializedInstruction() {
122122
not exists(getInitialization()) or
123123
getInitialization() instanceof TranslatedListInitialization or
124-
getInitialization() instanceof TranslatedStringLiteralInitialization
124+
getInitialization().(TranslatedStringLiteralInitialization).zeroInitRange(_, _)
125125
}
126126
}
127127

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati
340340
* Holds if the `elementCount` array elements starting at `startIndex` must be
341341
* zero initialized.
342342
*/
343-
private predicate zeroInitRange(int startIndex, int elementCount) {
343+
predicate zeroInitRange(int startIndex, int elementCount) {
344344
exists(int targetCount |
345345
startIndex = expr.getUnspecifiedType().(ArrayType).getArraySize() and
346346
targetCount = getContext().getTargetType().getUnspecifiedType().(ArrayType).getArraySize() and

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

Lines changed: 50 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -2675,58 +2675,56 @@ ir.cpp:
26752675
# 572| r0_10(glval<char>) = PointerAdd[1] : r0_3, r0_9
26762676
# 572| mu0_11(unknown[31]) = Store : &:r0_10, r0_8
26772677
# 573| r0_12(glval<char[4]>) = VariableAddress[a_nopad] :
2678-
# 573| mu0_13(char[4]) = Uninitialized[a_nopad] : &:r0_12
2679-
# 573| r0_14(glval<char[4]>) = StringConstant["foo"] :
2680-
# 573| r0_15(char[4]) = Load : &:r0_14, ~mu0_2
2681-
# 573| mu0_16(char[4]) = Store : &:r0_12, r0_15
2682-
# 574| r0_17(glval<char[5]>) = VariableAddress[a_infer] :
2683-
# 574| mu0_18(char[5]) = Uninitialized[a_infer] : &:r0_17
2684-
# 574| r0_19(glval<char[5]>) = StringConstant["blah"] :
2685-
# 574| r0_20(char[5]) = Load : &:r0_19, ~mu0_2
2686-
# 574| mu0_21(char[5]) = Store : &:r0_17, r0_20
2687-
# 575| r0_22(glval<char[2]>) = VariableAddress[b] :
2688-
# 575| mu0_23(char[2]) = Uninitialized[b] : &:r0_22
2689-
# 576| r0_24(glval<char[2]>) = VariableAddress[c] :
2690-
# 576| mu0_25(char[2]) = Uninitialized[c] : &:r0_24
2691-
# 576| r0_26(int) = Constant[0] :
2692-
# 576| r0_27(glval<char>) = PointerAdd[1] : r0_24, r0_26
2693-
# 576| r0_28(unknown[2]) = Constant[0] :
2694-
# 576| mu0_29(unknown[2]) = Store : &:r0_27, r0_28
2695-
# 577| r0_30(glval<char[2]>) = VariableAddress[d] :
2696-
# 577| mu0_31(char[2]) = Uninitialized[d] : &:r0_30
2697-
# 577| r0_32(int) = Constant[0] :
2698-
# 577| r0_33(glval<char>) = PointerAdd[1] : r0_30, r0_32
2699-
# 577| r0_34(char) = Constant[0] :
2700-
# 577| mu0_35(char) = Store : &:r0_33, r0_34
2701-
# 577| r0_36(int) = Constant[1] :
2702-
# 577| r0_37(glval<char>) = PointerAdd[1] : r0_30, r0_36
2703-
# 577| r0_38(char) = Constant[0] :
2704-
# 577| mu0_39(char) = Store : &:r0_37, r0_38
2705-
# 578| r0_40(glval<char[2]>) = VariableAddress[e] :
2706-
# 578| mu0_41(char[2]) = Uninitialized[e] : &:r0_40
2707-
# 578| r0_42(int) = Constant[0] :
2708-
# 578| r0_43(glval<char>) = PointerAdd[1] : r0_40, r0_42
2709-
# 578| r0_44(char) = Constant[0] :
2710-
# 578| mu0_45(char) = Store : &:r0_43, r0_44
2711-
# 578| r0_46(int) = Constant[1] :
2712-
# 578| r0_47(glval<char>) = PointerAdd[1] : r0_40, r0_46
2713-
# 578| r0_48(char) = Constant[1] :
2714-
# 578| mu0_49(char) = Store : &:r0_47, r0_48
2715-
# 579| r0_50(glval<char[3]>) = VariableAddress[f] :
2716-
# 579| mu0_51(char[3]) = Uninitialized[f] : &:r0_50
2717-
# 579| r0_52(int) = Constant[0] :
2718-
# 579| r0_53(glval<char>) = PointerAdd[1] : r0_50, r0_52
2719-
# 579| r0_54(char) = Constant[0] :
2720-
# 579| mu0_55(char) = Store : &:r0_53, r0_54
2721-
# 579| r0_56(int) = Constant[1] :
2722-
# 579| r0_57(glval<char>) = PointerAdd[1] : r0_50, r0_56
2723-
# 579| r0_58(unknown[2]) = Constant[0] :
2724-
# 579| mu0_59(unknown[2]) = Store : &:r0_57, r0_58
2725-
# 580| v0_60(void) = NoOp :
2726-
# 571| v0_61(void) = ReturnVoid :
2727-
# 571| v0_62(void) = UnmodeledUse : mu*
2728-
# 571| v0_63(void) = AliasedUse : ~mu0_2
2729-
# 571| v0_64(void) = ExitFunction :
2678+
# 573| r0_13(glval<char[4]>) = StringConstant["foo"] :
2679+
# 573| r0_14(char[4]) = Load : &:r0_13, ~mu0_2
2680+
# 573| mu0_15(char[4]) = Store : &:r0_12, r0_14
2681+
# 574| r0_16(glval<char[5]>) = VariableAddress[a_infer] :
2682+
# 574| r0_17(glval<char[5]>) = StringConstant["blah"] :
2683+
# 574| r0_18(char[5]) = Load : &:r0_17, ~mu0_2
2684+
# 574| mu0_19(char[5]) = Store : &:r0_16, r0_18
2685+
# 575| r0_20(glval<char[2]>) = VariableAddress[b] :
2686+
# 575| mu0_21(char[2]) = Uninitialized[b] : &:r0_20
2687+
# 576| r0_22(glval<char[2]>) = VariableAddress[c] :
2688+
# 576| mu0_23(char[2]) = Uninitialized[c] : &:r0_22
2689+
# 576| r0_24(int) = Constant[0] :
2690+
# 576| r0_25(glval<char>) = PointerAdd[1] : r0_22, r0_24
2691+
# 576| r0_26(unknown[2]) = Constant[0] :
2692+
# 576| mu0_27(unknown[2]) = Store : &:r0_25, r0_26
2693+
# 577| r0_28(glval<char[2]>) = VariableAddress[d] :
2694+
# 577| mu0_29(char[2]) = Uninitialized[d] : &:r0_28
2695+
# 577| r0_30(int) = Constant[0] :
2696+
# 577| r0_31(glval<char>) = PointerAdd[1] : r0_28, r0_30
2697+
# 577| r0_32(char) = Constant[0] :
2698+
# 577| mu0_33(char) = Store : &:r0_31, r0_32
2699+
# 577| r0_34(int) = Constant[1] :
2700+
# 577| r0_35(glval<char>) = PointerAdd[1] : r0_28, r0_34
2701+
# 577| r0_36(char) = Constant[0] :
2702+
# 577| mu0_37(char) = Store : &:r0_35, r0_36
2703+
# 578| r0_38(glval<char[2]>) = VariableAddress[e] :
2704+
# 578| mu0_39(char[2]) = Uninitialized[e] : &:r0_38
2705+
# 578| r0_40(int) = Constant[0] :
2706+
# 578| r0_41(glval<char>) = PointerAdd[1] : r0_38, r0_40
2707+
# 578| r0_42(char) = Constant[0] :
2708+
# 578| mu0_43(char) = Store : &:r0_41, r0_42
2709+
# 578| r0_44(int) = Constant[1] :
2710+
# 578| r0_45(glval<char>) = PointerAdd[1] : r0_38, r0_44
2711+
# 578| r0_46(char) = Constant[1] :
2712+
# 578| mu0_47(char) = Store : &:r0_45, r0_46
2713+
# 579| r0_48(glval<char[3]>) = VariableAddress[f] :
2714+
# 579| mu0_49(char[3]) = Uninitialized[f] : &:r0_48
2715+
# 579| r0_50(int) = Constant[0] :
2716+
# 579| r0_51(glval<char>) = PointerAdd[1] : r0_48, r0_50
2717+
# 579| r0_52(char) = Constant[0] :
2718+
# 579| mu0_53(char) = Store : &:r0_51, r0_52
2719+
# 579| r0_54(int) = Constant[1] :
2720+
# 579| r0_55(glval<char>) = PointerAdd[1] : r0_48, r0_54
2721+
# 579| r0_56(unknown[2]) = Constant[0] :
2722+
# 579| mu0_57(unknown[2]) = Store : &:r0_55, r0_56
2723+
# 580| v0_58(void) = NoOp :
2724+
# 571| v0_59(void) = ReturnVoid :
2725+
# 571| v0_60(void) = UnmodeledUse : mu*
2726+
# 571| v0_61(void) = AliasedUse : ~mu0_2
2727+
# 571| v0_62(void) = ExitFunction :
27302728

27312729
# 584| void VarArgs()
27322730
# 584| Block 0

cpp/ql/test/library-tests/ir/ssa/aliased_ssa_ir.expected

Lines changed: 56 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -887,61 +887,59 @@ ssa.cpp:
887887
# 214| m0_12(unknown[31]) = Store : &:r0_11, r0_9
888888
# 214| m0_13(char[32]) = Chi : total:m0_8, partial:m0_12
889889
# 215| r0_14(glval<char[4]>) = VariableAddress[a_nopad] :
890-
# 215| m0_15(char[4]) = Uninitialized[a_nopad] : &:r0_14
891-
# 215| r0_16(glval<char[4]>) = StringConstant["foo"] :
892-
# 215| r0_17(char[4]) = Load : &:r0_16, ~m0_1
893-
# 215| m0_18(char[4]) = Store : &:r0_14, r0_17
894-
# 216| r0_19(glval<char[5]>) = VariableAddress[a_infer] :
895-
# 216| m0_20(char[5]) = Uninitialized[a_infer] : &:r0_19
896-
# 216| r0_21(glval<char[5]>) = StringConstant["blah"] :
897-
# 216| r0_22(char[5]) = Load : &:r0_21, ~m0_1
898-
# 216| m0_23(char[5]) = Store : &:r0_19, r0_22
899-
# 217| r0_24(glval<char[2]>) = VariableAddress[b] :
900-
# 217| m0_25(char[2]) = Uninitialized[b] : &:r0_24
901-
# 218| r0_26(glval<char[2]>) = VariableAddress[c] :
902-
# 218| m0_27(char[2]) = Uninitialized[c] : &:r0_26
903-
# 218| r0_28(int) = Constant[0] :
904-
# 218| r0_29(glval<char>) = PointerAdd[1] : r0_26, r0_28
905-
# 218| r0_30(unknown[2]) = Constant[0] :
906-
# 218| m0_31(unknown[2]) = Store : &:r0_29, r0_30
907-
# 219| r0_32(glval<char[2]>) = VariableAddress[d] :
908-
# 219| m0_33(char[2]) = Uninitialized[d] : &:r0_32
909-
# 219| r0_34(int) = Constant[0] :
910-
# 219| r0_35(glval<char>) = PointerAdd[1] : r0_32, r0_34
911-
# 219| r0_36(char) = Constant[0] :
912-
# 219| m0_37(char) = Store : &:r0_35, r0_36
913-
# 219| m0_38(char[2]) = Chi : total:m0_33, partial:m0_37
914-
# 219| r0_39(int) = Constant[1] :
915-
# 219| r0_40(glval<char>) = PointerAdd[1] : r0_32, r0_39
916-
# 219| r0_41(char) = Constant[0] :
917-
# 219| m0_42(char) = Store : &:r0_40, r0_41
918-
# 219| m0_43(char[2]) = Chi : total:m0_38, partial:m0_42
919-
# 220| r0_44(glval<char[2]>) = VariableAddress[e] :
920-
# 220| m0_45(char[2]) = Uninitialized[e] : &:r0_44
921-
# 220| r0_46(int) = Constant[0] :
922-
# 220| r0_47(glval<char>) = PointerAdd[1] : r0_44, r0_46
923-
# 220| r0_48(char) = Constant[0] :
924-
# 220| m0_49(char) = Store : &:r0_47, r0_48
925-
# 220| m0_50(char[2]) = Chi : total:m0_45, partial:m0_49
926-
# 220| r0_51(int) = Constant[1] :
927-
# 220| r0_52(glval<char>) = PointerAdd[1] : r0_44, r0_51
928-
# 220| r0_53(char) = Constant[1] :
929-
# 220| m0_54(char) = Store : &:r0_52, r0_53
930-
# 220| m0_55(char[2]) = Chi : total:m0_50, partial:m0_54
931-
# 221| r0_56(glval<char[3]>) = VariableAddress[f] :
932-
# 221| m0_57(char[3]) = Uninitialized[f] : &:r0_56
933-
# 221| r0_58(int) = Constant[0] :
934-
# 221| r0_59(glval<char>) = PointerAdd[1] : r0_56, r0_58
935-
# 221| r0_60(char) = Constant[0] :
936-
# 221| m0_61(char) = Store : &:r0_59, r0_60
937-
# 221| m0_62(char[3]) = Chi : total:m0_57, partial:m0_61
938-
# 221| r0_63(int) = Constant[1] :
939-
# 221| r0_64(glval<char>) = PointerAdd[1] : r0_56, r0_63
940-
# 221| r0_65(unknown[2]) = Constant[0] :
941-
# 221| m0_66(unknown[2]) = Store : &:r0_64, r0_65
942-
# 221| m0_67(char[3]) = Chi : total:m0_62, partial:m0_66
943-
# 222| v0_68(void) = NoOp :
944-
# 213| v0_69(void) = ReturnVoid :
945-
# 213| v0_70(void) = UnmodeledUse : mu*
946-
# 213| v0_71(void) = AliasedUse : ~m0_1
947-
# 213| v0_72(void) = ExitFunction :
890+
# 215| r0_15(glval<char[4]>) = StringConstant["foo"] :
891+
# 215| r0_16(char[4]) = Load : &:r0_15, ~m0_1
892+
# 215| m0_17(char[4]) = Store : &:r0_14, r0_16
893+
# 216| r0_18(glval<char[5]>) = VariableAddress[a_infer] :
894+
# 216| r0_19(glval<char[5]>) = StringConstant["blah"] :
895+
# 216| r0_20(char[5]) = Load : &:r0_19, ~m0_1
896+
# 216| m0_21(char[5]) = Store : &:r0_18, r0_20
897+
# 217| r0_22(glval<char[2]>) = VariableAddress[b] :
898+
# 217| m0_23(char[2]) = Uninitialized[b] : &:r0_22
899+
# 218| r0_24(glval<char[2]>) = VariableAddress[c] :
900+
# 218| m0_25(char[2]) = Uninitialized[c] : &:r0_24
901+
# 218| r0_26(int) = Constant[0] :
902+
# 218| r0_27(glval<char>) = PointerAdd[1] : r0_24, r0_26
903+
# 218| r0_28(unknown[2]) = Constant[0] :
904+
# 218| m0_29(unknown[2]) = Store : &:r0_27, r0_28
905+
# 219| r0_30(glval<char[2]>) = VariableAddress[d] :
906+
# 219| m0_31(char[2]) = Uninitialized[d] : &:r0_30
907+
# 219| r0_32(int) = Constant[0] :
908+
# 219| r0_33(glval<char>) = PointerAdd[1] : r0_30, r0_32
909+
# 219| r0_34(char) = Constant[0] :
910+
# 219| m0_35(char) = Store : &:r0_33, r0_34
911+
# 219| m0_36(char[2]) = Chi : total:m0_31, partial:m0_35
912+
# 219| r0_37(int) = Constant[1] :
913+
# 219| r0_38(glval<char>) = PointerAdd[1] : r0_30, r0_37
914+
# 219| r0_39(char) = Constant[0] :
915+
# 219| m0_40(char) = Store : &:r0_38, r0_39
916+
# 219| m0_41(char[2]) = Chi : total:m0_36, partial:m0_40
917+
# 220| r0_42(glval<char[2]>) = VariableAddress[e] :
918+
# 220| m0_43(char[2]) = Uninitialized[e] : &:r0_42
919+
# 220| r0_44(int) = Constant[0] :
920+
# 220| r0_45(glval<char>) = PointerAdd[1] : r0_42, r0_44
921+
# 220| r0_46(char) = Constant[0] :
922+
# 220| m0_47(char) = Store : &:r0_45, r0_46
923+
# 220| m0_48(char[2]) = Chi : total:m0_43, partial:m0_47
924+
# 220| r0_49(int) = Constant[1] :
925+
# 220| r0_50(glval<char>) = PointerAdd[1] : r0_42, r0_49
926+
# 220| r0_51(char) = Constant[1] :
927+
# 220| m0_52(char) = Store : &:r0_50, r0_51
928+
# 220| m0_53(char[2]) = Chi : total:m0_48, partial:m0_52
929+
# 221| r0_54(glval<char[3]>) = VariableAddress[f] :
930+
# 221| m0_55(char[3]) = Uninitialized[f] : &:r0_54
931+
# 221| r0_56(int) = Constant[0] :
932+
# 221| r0_57(glval<char>) = PointerAdd[1] : r0_54, r0_56
933+
# 221| r0_58(char) = Constant[0] :
934+
# 221| m0_59(char) = Store : &:r0_57, r0_58
935+
# 221| m0_60(char[3]) = Chi : total:m0_55, partial:m0_59
936+
# 221| r0_61(int) = Constant[1] :
937+
# 221| r0_62(glval<char>) = PointerAdd[1] : r0_54, r0_61
938+
# 221| r0_63(unknown[2]) = Constant[0] :
939+
# 221| m0_64(unknown[2]) = Store : &:r0_62, r0_63
940+
# 221| m0_65(char[3]) = Chi : total:m0_60, partial:m0_64
941+
# 222| v0_66(void) = NoOp :
942+
# 213| v0_67(void) = ReturnVoid :
943+
# 213| v0_68(void) = UnmodeledUse : mu*
944+
# 213| v0_69(void) = AliasedUse : ~m0_1
945+
# 213| v0_70(void) = ExitFunction :

0 commit comments

Comments
 (0)