Bug 21356 - value.c:828: internal-error: int value_contents_bits_eq(const value*, int, const value*, int, int): Assertion `offset1 + length <= TYPE_LENGTH (val1->enclosing_type) * TARGET_CHAR_BIT' failed
Summary: value.c:828: internal-error: int value_contents_bits_eq(const value*, int, co...
Status: NEW
Alias: None
Product: gdb
Classification: Unclassified
Component: gdb (show other bugs)
Version: 7.12.1
: P2 normal
Target Milestone: ---
Assignee: Keith Seitz
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2017-04-05 19:21 UTC by Steve Merritt
Modified: 2017-12-13 15:40 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed: 2017-12-13 00:00:00


Attachments
assertion reproducer (322 bytes, text/plain)
2017-04-05 19:22 UTC, Steve Merritt
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Steve Merritt 2017-04-05 19:21:32 UTC
gdb will assert when printing "container_object2" in the attached sample.

value.c:828: internal-error: int value_contents_bits_eq(const value*, int, const value*, int, int): Assertion `offset1 + length <= TYPE_LENGTH (val1->enclosing_type) * TARGET_CHAR_BIT' failed.


The use of a typedef in the declaration of one of the fields of the struct container_struct2 is triggering the issue.

In the attached sample, there are two nearly identical structs, container_struct1 and container_struct2.  The only difference between the two is the use of a typedef in container_struct2 when declaring one of the fields.  The field (_vla_struct_object2) is a variable length struct.

To reproduce:
   > gcc -g vls_assert.c
   > gdb a.out
   (gdb) b 49
   Breakpoint 1 at 0x40095a: file vls_assert.c, line 49.
   (gdb) r
   Breakpoint 1, vls_factory (n=5) at vls_assert.c:50
   50	  return;
   (gdb) p container_object1
   $1 = {_container_member1 = 5, _vla_struct_object1 = {_some_member = 10, 
       _vla_field = {0, 2, 4, 6, 8}}}
   (gdb) p container_object2
   $2 = {_container_member2 = 15, _vla_struct_object2 = {_some_member = 0, 
       _vla_field = {
   value.c:828: internal-error: int value_contents_bits_eq(const value*, 
   int, const value*, int, int): Assertion `offset1 + length <= TYPE_LENGTH
   (val1->enclosing_type) * TARGET_CHAR_BIT' failed.

I reproduced the issue with gcc 4.8.3 and gcc 6.3.0 on EL7.0.
Comment 1 Steve Merritt 2017-04-05 19:22:26 UTC
Created attachment 9974 [details]
assertion reproducer
Comment 2 Jan Kratochvil 2017-12-13 15:40:28 UTC
From: Keith Seitz <keiths@redhat.com>
[PATCH] Compute proper length for dynamic types of TYPE_CODE_TYPEDEF
https://sourceware.org/ml/gdb-patches/2017-06/msg00679.html
Message-Id: <1498265971-27536-1-git-send-email-keiths@redhat.com>