https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63928

            Bug ID: 63928
           Summary: [5 Regression] use after free in cp/constexpr.c
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: trippels at gcc dot gnu.org
                CC: jason at gcc dot gnu.org

bootstrap-asan shows:

==69040==ERROR: AddressSanitizer: heap-use-after-free on address 0x0a8800353c88
at pc 0x000010972e94 bp 0x3fffd9fbb510 sp 0x3fffd9fbb580
READ of size 8 at 0x0a8800353c88 thread T0
    #0 0x10972e90 in cxx_eval_store_expression
../../gcc/gcc/cp/constexpr.c:2541
    #1 0x10972e90 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2913
    #2 0x1096e540 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2924
    #3 0x1096d808 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2918
    #4 0x1096e998 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:3188
    #5 0x1096a684 in cxx_eval_call_expression ../../gcc/gcc/cp/constexpr.c:1329
    #6 0x1096ebd8 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2834
    #7 0x1097d4a8 in cxx_eval_outermost_constant_expr
../../gcc/gcc/cp/constexpr.c:3314
    #8 0x1098723c in maybe_constant_value(tree_node*, tree_node*)
../../gcc/gcc/cp/constexpr.c:3427
    #9 0x107e30f8 in finish_static_assert(tree_node*, tree_node*, unsigned int,
bool) ../../gcc/gcc/cp/semantics.c:7046
    #10 0x10658d94 in cp_parser_static_assert ../../gcc/gcc/cp/parser.c:12139
    #11 0x106aa5a8 in cp_parser_member_declaration
../../gcc/gcc/cp/parser.c:20673
    #12 0x1062f158 in cp_parser_member_specification_opt
../../gcc/gcc/cp/parser.c:20542
    #13 0x1062f158 in cp_parser_class_specifier_1
../../gcc/gcc/cp/parser.c:19734
    #14 0x1062f158 in cp_parser_class_specifier ../../gcc/gcc/cp/parser.c:19970
    #15 0x1062f158 in cp_parser_type_specifier ../../gcc/gcc/cp/parser.c:14630
    #16 0x10636e84 in cp_parser_decl_specifier_seq
../../gcc/gcc/cp/parser.c:11864
    #17 0x106a4038 in cp_parser_simple_declaration
../../gcc/gcc/cp/parser.c:11454
    #18 0x106a53e0 in cp_parser_block_declaration
../../gcc/gcc/cp/parser.c:11403
    #19 0x106b2084 in cp_parser_declaration ../../gcc/gcc/cp/parser.c:11300
    #20 0x106b290c in cp_parser_declaration_seq_opt
../../gcc/gcc/cp/parser.c:11186
    #21 0x106b45ec in cp_parser_namespace_body ../../gcc/gcc/cp/parser.c:16166
    #22 0x106b45ec in cp_parser_namespace_definition
../../gcc/gcc/cp/parser.c:16147
    #23 0x106b2254 in cp_parser_declaration ../../gcc/gcc/cp/parser.c:11288
    #24 0x106b290c in cp_parser_declaration_seq_opt
../../gcc/gcc/cp/parser.c:11186
    #25 0x106b45ec in cp_parser_namespace_body ../../gcc/gcc/cp/parser.c:16166
    #26 0x106b45ec in cp_parser_namespace_definition
../../gcc/gcc/cp/parser.c:16147
    #27 0x106b2254 in cp_parser_declaration ../../gcc/gcc/cp/parser.c:11288
    #28 0x106b290c in cp_parser_declaration_seq_opt
../../gcc/gcc/cp/parser.c:11186
    #29 0x106b45ec in cp_parser_namespace_body ../../gcc/gcc/cp/parser.c:16166
    #30 0x106b45ec in cp_parser_namespace_definition
../../gcc/gcc/cp/parser.c:16147
    #31 0x106b2254 in cp_parser_declaration ../../gcc/gcc/cp/parser.c:11288
    #32 0x106b290c in cp_parser_declaration_seq_opt
../../gcc/gcc/cp/parser.c:11186
    #33 0x106b3980 in cp_parser_translation_unit ../../gcc/gcc/cp/parser.c:4101
    #34 0x106b3980 in c_parse_file() ../../gcc/gcc/cp/parser.c:32197
    #35 0x10a7a9fc in c_common_parse_file()
../../gcc/gcc/c-family/c-opts.c:1039
    #36 0x119d855c in compile_file ../../gcc/gcc/toplev.c:570
    #37 0x101edb5c in do_compile ../../gcc/gcc/toplev.c:2040
    #38 0x101edb5c in toplev::main(int, char**) ../../gcc/gcc/toplev.c:2137
    #39 0x101f3098 in main ../../gcc/gcc/main.c:38
    #40 0x3fff817e47a8  (/lib64/libc.so.6+0x447a8)

0x0a8800353c88 is located 200 bytes inside of 208-byte region
[0x0a8800353bc0,0x0a8800353c90)
freed by thread T0 here:
    #0 0x10291710 in __interceptor_free
../../../../gcc/libsanitizer/asan/asan_malloc_linux.cc:28
    #1 0x10501d1c in xcallocator<hash_map<tree_node*, tree_node*,
default_hashmap_traits>::hash_entry>::data_free(hash_map<tree_node*,
tree_node*, default_hashmap_traits>::hash_entry*)
../../gcc/gcc/hash-table.h:233
    #2 0x10501d1c in hash_table<hash_map<tree_node*, tree_node*,
default_hashmap_traits>::hash_entry, xcallocator, true>::expand()
../../gcc/gcc/hash-table.h:1346
    #3 0x10502220 in hash_table<hash_map<tree_node*, tree_node*,
default_hashmap_traits>::hash_entry, xcallocator,
true>::find_slot_with_hash(tree_node* const&, unsigned int, insert_option)
../../gcc/gcc/hash-table.h:1455
    #4 0x10502220 in hash_map<tree_node*, tree_node*,
default_hashmap_traits>::put(tree_node* const&, tree_node* const&)
../../gcc/gcc/hash-map.h:207
    #5 0x109706e0 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2888
    #6 0x1096e5d0 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2958
    #7 0x10969548 in cxx_bind_parameters_in_call
../../gcc/gcc/cp/constexpr.c:1072
    #8 0x10969548 in cxx_eval_call_expression ../../gcc/gcc/cp/constexpr.c:1235
    #9 0x1096ebd8 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2834
    #10 0x10974554 in cxx_eval_binary_expression
../../gcc/gcc/cp/constexpr.c:1485
    #11 0x1096e064 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:3064
    #12 0x109716b0 in cxx_eval_store_expression
../../gcc/gcc/cp/constexpr.c:2527
    #13 0x109716b0 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2913
    #14 0x1096e540 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2924
    #15 0x1096d808 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2918
    #16 0x1096e998 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:3188
    #17 0x1096a684 in cxx_eval_call_expression
../../gcc/gcc/cp/constexpr.c:1329
    #18 0x1096ebd8 in cxx_eval_constant_expression
../../gcc/gcc/cp/constexpr.c:2834
    #19 0x1097d4a8 in cxx_eval_outermost_constant_expr
../../gcc/gcc/cp/constexpr.c:3314
    #20 0x1098723c in maybe_constant_value(tree_node*, tree_node*)
../../gcc/gcc/cp/constexpr.c:3427
    #21 0x107e30f8 in finish_static_assert(tree_node*, tree_node*, unsigned
int, bool) ../../gcc/gcc/cp/semantics.c:7046
    #22 0x10658d94 in cp_parser_static_assert ../../gcc/gcc/cp/parser.c:12139
    #23 0x106aa5a8 in cp_parser_member_declaration
../../gcc/gcc/cp/parser.c:20673
    #24 0x1062f158 in cp_parser_member_specification_opt
../../gcc/gcc/cp/parser.c:20542
    #25 0x1062f158 in cp_parser_class_specifier_1
../../gcc/gcc/cp/parser.c:19734
    #26 0x1062f158 in cp_parser_class_specifier ../../gcc/gcc/cp/parser.c:19970
    #27 0x1062f158 in cp_parser_type_specifier ../../gcc/gcc/cp/parser.c:14630
    #28 0x10636e84 in cp_parser_decl_specifier_seq
../../gcc/gcc/cp/parser.c:11864
    #29 0x106a4038 in cp_parser_simple_declaration
../../gcc/gcc/cp/parser.c:11454
    #30 0x106a53e0 in cp_parser_block_declaration
../../gcc/gcc/cp/parser.c:11403
    #31 0x106b2084 in cp_parser_declaration ../../gcc/gcc/cp/parser.c:11300
    #32 0x106b290c in cp_parser_declaration_seq_opt
../../gcc/gcc/cp/parser.c:11186
    #33 0x106b45ec in cp_parser_namespace_body ../../gcc/gcc/cp/parser.c:16166
    #34 0x106b45ec in cp_parser_namespace_definition
../../gcc/gcc/cp/parser.c:16147
    #35 0x106b2254 in cp_parser_declaration ../../gcc/gcc/cp/parser.c:11288
    #36 0x106b290c in cp_parser_declaration_seq_opt
../../gcc/gcc/cp/parser.c:11186

previously allocated by thread T0 here:
    #0 0x10291c80 in __interceptor_calloc
../../../../gcc/libsanitizer/asan/asan_malloc_linux.cc:54
    #1 0x12bfff50 in xcalloc ../../gcc/libiberty/xmalloc.c:162

SUMMARY: AddressSanitizer: heap-use-after-free
../../gcc/gcc/cp/constexpr.c:2541 cxx_eval_store_expression
Shadow bytes around the buggy address:
  0x03510006a740: fd fd fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x03510006a750: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x03510006a760: fd fd fd fd fd fd fd fd fd fd fa fa fa fa fa fa
  0x03510006a770: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
  0x03510006a780: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
=>0x03510006a790: fd[fd]fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x03510006a7a0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x03510006a7b0: fd fd fd fd fd fd fd fd fd fd fa fa fa fa fa fa
  0x03510006a7c0: fa fa fa fa fa fa fa fa fd fd fd fd fd fd fd fd
  0x03510006a7d0: fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd fd
  0x03510006a7e0: fd fd fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07
  Heap left redzone:       fa
  Heap right redzone:      fb
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack partial redzone:   f4
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe

Reply via email to