Skip to content

Commit 81ad110

Browse files
author
Robert Marsh
committed
C++: uninit instr for string literal initializers
1 parent 51c4ef4 commit 81ad110

File tree

4 files changed

+187
-175
lines changed

4 files changed

+187
-175
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ abstract class TranslatedVariableDeclaration extends TranslatedElement, Initiali
120120

121121
private predicate hasUninitializedInstruction() {
122122
not exists(getInitialization()) or
123-
getInitialization() instanceof TranslatedListInitialization
123+
getInitialization() instanceof TranslatedListInitialization or
124+
getInitialization() instanceof TranslatedStringLiteralInitialization
124125
}
125126
}
126127

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

Lines changed: 61 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -2666,64 +2666,67 @@ ir.cpp:
26662666
# 571| mu0_1(unknown) = AliasedDefinition :
26672667
# 571| mu0_2(unknown) = UnmodeledDefinition :
26682668
# 572| r0_3(glval<char[32]>) = VariableAddress[a_pad] :
2669-
# 572| r0_4(glval<char[1]>) = StringConstant[""] :
2670-
# 572| r0_5(char[1]) = Load : &:r0_4, ~mu0_2
2671-
# 572| mu0_6(char[1]) = Store : &:r0_3, r0_5
2672-
# 572| r0_7(unknown[31]) = Constant[0] :
2673-
# 572| r0_8(int) = Constant[1] :
2674-
# 572| r0_9(glval<char>) = PointerAdd[1] : r0_3, r0_8
2675-
# 572| mu0_10(unknown[31]) = Store : &:r0_9, r0_7
2676-
# 573| r0_11(glval<char[4]>) = VariableAddress[a_nopad] :
2677-
# 573| r0_12(glval<char[4]>) = StringConstant["foo"] :
2678-
# 573| r0_13(char[4]) = Load : &:r0_12, ~mu0_2
2679-
# 573| mu0_14(char[4]) = Store : &:r0_11, r0_13
2680-
# 574| r0_15(glval<char[5]>) = VariableAddress[a_infer] :
2681-
# 574| r0_16(glval<char[5]>) = StringConstant["blah"] :
2682-
# 574| r0_17(char[5]) = Load : &:r0_16, ~mu0_2
2683-
# 574| mu0_18(char[5]) = Store : &:r0_15, r0_17
2684-
# 575| r0_19(glval<char[2]>) = VariableAddress[b] :
2685-
# 575| mu0_20(char[2]) = Uninitialized[b] : &:r0_19
2686-
# 576| r0_21(glval<char[2]>) = VariableAddress[c] :
2687-
# 576| mu0_22(char[2]) = Uninitialized[c] : &:r0_21
2688-
# 576| r0_23(int) = Constant[0] :
2689-
# 576| r0_24(glval<char>) = PointerAdd[1] : r0_21, r0_23
2690-
# 576| r0_25(unknown[2]) = Constant[0] :
2691-
# 576| mu0_26(unknown[2]) = Store : &:r0_24, r0_25
2692-
# 577| r0_27(glval<char[2]>) = VariableAddress[d] :
2693-
# 577| mu0_28(char[2]) = Uninitialized[d] : &:r0_27
2694-
# 577| r0_29(int) = Constant[0] :
2695-
# 577| r0_30(glval<char>) = PointerAdd[1] : r0_27, r0_29
2696-
# 577| r0_31(char) = Constant[0] :
2697-
# 577| mu0_32(char) = Store : &:r0_30, r0_31
2698-
# 577| r0_33(int) = Constant[1] :
2699-
# 577| r0_34(glval<char>) = PointerAdd[1] : r0_27, r0_33
2700-
# 577| r0_35(char) = Constant[0] :
2701-
# 577| mu0_36(char) = Store : &:r0_34, r0_35
2702-
# 578| r0_37(glval<char[2]>) = VariableAddress[e] :
2703-
# 578| mu0_38(char[2]) = Uninitialized[e] : &:r0_37
2704-
# 578| r0_39(int) = Constant[0] :
2705-
# 578| r0_40(glval<char>) = PointerAdd[1] : r0_37, r0_39
2706-
# 578| r0_41(char) = Constant[0] :
2707-
# 578| mu0_42(char) = Store : &:r0_40, r0_41
2708-
# 578| r0_43(int) = Constant[1] :
2709-
# 578| r0_44(glval<char>) = PointerAdd[1] : r0_37, r0_43
2710-
# 578| r0_45(char) = Constant[1] :
2711-
# 578| mu0_46(char) = Store : &:r0_44, r0_45
2712-
# 579| r0_47(glval<char[3]>) = VariableAddress[f] :
2713-
# 579| mu0_48(char[3]) = Uninitialized[f] : &:r0_47
2714-
# 579| r0_49(int) = Constant[0] :
2715-
# 579| r0_50(glval<char>) = PointerAdd[1] : r0_47, r0_49
2716-
# 579| r0_51(char) = Constant[0] :
2717-
# 579| mu0_52(char) = Store : &:r0_50, r0_51
2718-
# 579| r0_53(int) = Constant[1] :
2719-
# 579| r0_54(glval<char>) = PointerAdd[1] : r0_47, r0_53
2720-
# 579| r0_55(unknown[2]) = Constant[0] :
2721-
# 579| mu0_56(unknown[2]) = Store : &:r0_54, r0_55
2722-
# 580| v0_57(void) = NoOp :
2723-
# 571| v0_58(void) = ReturnVoid :
2724-
# 571| v0_59(void) = UnmodeledUse : mu*
2725-
# 571| v0_60(void) = AliasedUse : ~mu0_2
2726-
# 571| v0_61(void) = ExitFunction :
2669+
# 572| mu0_4(char[32]) = Uninitialized[a_pad] : &:r0_3
2670+
# 572| r0_5(glval<char[1]>) = StringConstant[""] :
2671+
# 572| r0_6(char[1]) = Load : &:r0_5, ~mu0_2
2672+
# 572| mu0_7(char[1]) = Store : &:r0_3, r0_6
2673+
# 572| r0_8(unknown[31]) = Constant[0] :
2674+
# 572| r0_9(int) = Constant[1] :
2675+
# 572| r0_10(glval<char>) = PointerAdd[1] : r0_3, r0_9
2676+
# 572| mu0_11(unknown[31]) = Store : &:r0_10, r0_8
2677+
# 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 :
27272730

27282731
# 584| void VarArgs()
27292732
# 584| Block 0

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

Lines changed: 63 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -876,67 +876,72 @@ ssa.cpp:
876876
# 213| m0_1(unknown) = AliasedDefinition :
877877
# 213| mu0_2(unknown) = UnmodeledDefinition :
878878
# 214| r0_3(glval<char[32]>) = VariableAddress[a_pad] :
879-
# 214| r0_4(glval<char[1]>) = StringConstant[""] :
880-
# 214| r0_5(char[1]) = Load : &:r0_4, ~m0_1
881-
# 214| m0_6(char[1]) = Store : &:r0_3, r0_5
882-
# 214| r0_7(unknown[31]) = Constant[0] :
883-
# 214| r0_8(int) = Constant[1] :
884-
# 214| r0_9(glval<char>) = PointerAdd[1] : r0_3, r0_8
885-
# 214| m0_10(unknown[31]) = Store : &:r0_9, r0_7
886-
# 215| r0_11(glval<char[4]>) = VariableAddress[a_nopad] :
887-
# 215| r0_12(glval<char[4]>) = StringConstant["foo"] :
888-
# 215| r0_13(char[4]) = Load : &:r0_12, ~m0_1
889-
# 215| m0_14(char[4]) = Store : &:r0_11, r0_13
890-
# 216| r0_15(glval<char[5]>) = VariableAddress[a_infer] :
891-
# 216| r0_16(glval<char[5]>) = StringConstant["blah"] :
892-
# 216| r0_17(char[5]) = Load : &:r0_16, ~m0_1
893-
# 216| m0_18(char[5]) = Store : &:r0_15, r0_17
894-
# 217| r0_19(glval<char[2]>) = VariableAddress[b] :
895-
# 217| m0_20(char[2]) = Uninitialized[b] : &:r0_19
896-
# 218| r0_21(glval<char[2]>) = VariableAddress[c] :
897-
# 218| m0_22(char[2]) = Uninitialized[c] : &:r0_21
898-
# 218| r0_23(int) = Constant[0] :
899-
# 218| r0_24(glval<char>) = PointerAdd[1] : r0_21, r0_23
900-
# 218| r0_25(unknown[2]) = Constant[0] :
901-
# 218| m0_26(unknown[2]) = Store : &:r0_24, r0_25
902-
# 219| r0_27(glval<char[2]>) = VariableAddress[d] :
903-
# 219| m0_28(char[2]) = Uninitialized[d] : &:r0_27
904-
# 219| r0_29(int) = Constant[0] :
905-
# 219| r0_30(glval<char>) = PointerAdd[1] : r0_27, r0_29
906-
# 219| r0_31(char) = Constant[0] :
907-
# 219| m0_32(char) = Store : &:r0_30, r0_31
908-
# 219| m0_33(char[2]) = Chi : total:m0_28, partial:m0_32
909-
# 219| r0_34(int) = Constant[1] :
910-
# 219| r0_35(glval<char>) = PointerAdd[1] : r0_27, r0_34
879+
# 214| m0_4(char[32]) = Uninitialized[a_pad] : &:r0_3
880+
# 214| r0_5(glval<char[1]>) = StringConstant[""] :
881+
# 214| r0_6(char[1]) = Load : &:r0_5, ~m0_1
882+
# 214| m0_7(char[1]) = Store : &:r0_3, r0_6
883+
# 214| m0_8(char[32]) = Chi : total:m0_4, partial:m0_7
884+
# 214| r0_9(unknown[31]) = Constant[0] :
885+
# 214| r0_10(int) = Constant[1] :
886+
# 214| r0_11(glval<char>) = PointerAdd[1] : r0_3, r0_10
887+
# 214| m0_12(unknown[31]) = Store : &:r0_11, r0_9
888+
# 214| m0_13(char[32]) = Chi : total:m0_8, partial:m0_12
889+
# 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
911911
# 219| r0_36(char) = Constant[0] :
912912
# 219| m0_37(char) = Store : &:r0_35, r0_36
913913
# 219| m0_38(char[2]) = Chi : total:m0_33, partial:m0_37
914-
# 220| r0_39(glval<char[2]>) = VariableAddress[e] :
915-
# 220| m0_40(char[2]) = Uninitialized[e] : &:r0_39
916-
# 220| r0_41(int) = Constant[0] :
917-
# 220| r0_42(glval<char>) = PointerAdd[1] : r0_39, r0_41
918-
# 220| r0_43(char) = Constant[0] :
919-
# 220| m0_44(char) = Store : &:r0_42, r0_43
920-
# 220| m0_45(char[2]) = Chi : total:m0_40, partial:m0_44
921-
# 220| r0_46(int) = Constant[1] :
922-
# 220| r0_47(glval<char>) = PointerAdd[1] : r0_39, r0_46
923-
# 220| r0_48(char) = Constant[1] :
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] :
924924
# 220| m0_49(char) = Store : &:r0_47, r0_48
925925
# 220| m0_50(char[2]) = Chi : total:m0_45, partial:m0_49
926-
# 221| r0_51(glval<char[3]>) = VariableAddress[f] :
927-
# 221| m0_52(char[3]) = Uninitialized[f] : &:r0_51
928-
# 221| r0_53(int) = Constant[0] :
929-
# 221| r0_54(glval<char>) = PointerAdd[1] : r0_51, r0_53
930-
# 221| r0_55(char) = Constant[0] :
931-
# 221| m0_56(char) = Store : &:r0_54, r0_55
932-
# 221| m0_57(char[3]) = Chi : total:m0_52, partial:m0_56
933-
# 221| r0_58(int) = Constant[1] :
934-
# 221| r0_59(glval<char>) = PointerAdd[1] : r0_51, r0_58
935-
# 221| r0_60(unknown[2]) = Constant[0] :
936-
# 221| m0_61(unknown[2]) = Store : &:r0_59, r0_60
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
937937
# 221| m0_62(char[3]) = Chi : total:m0_57, partial:m0_61
938-
# 222| v0_63(void) = NoOp :
939-
# 213| v0_64(void) = ReturnVoid :
940-
# 213| v0_65(void) = UnmodeledUse : mu*
941-
# 213| v0_66(void) = AliasedUse : ~m0_1
942-
# 213| v0_67(void) = ExitFunction :
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 :

0 commit comments

Comments
 (0)