Mirror of the gdb mailing list
 help / color / mirror / Atom feed
From: Zack Weinberg <zack@codesourcery.com>
To: gdb@sources.redhat.com
Subject: Suggestion: Detect inconsistent structure definitions
Date: Wed, 13 Mar 2002 10:22:00 -0000	[thread overview]
Message-ID: <20020313182221.GE8197@codesourcery.com> (raw)

Consider the following two source files:

-- a.c --
struct A {
  int a;
  int b;
};

struct A a = { 1, 2 };

-- b.c --
struct A {
  char a;
  char b;
};

extern struct A a;

int main(void) { 
  if (a.a == 1 && b.a == 2)
    return 0;
  else
    return 1;
}

--
It is obvious that the complete program consisting of these two files
is buggy: the declarations of struct A do not match.  However, the
program will compile, link, and execute with no complaints, just an
unexpected return value.

When the program is large and complicated, this sort of bug can be
near-impossible to find, especially when the structure type
declaration _is_ properly isolated in a header file, but other headers
(possibly from third-party libraries) have issued inconsistent
typedefs/#defines for the aggregate's member types.  I just spent two
days chasing exactly this problem in an INN installation.

The compiler and linker do not have enough information to detect the
bug, but gdb does; each object file's debug info will contain a type
declaration for struct A, and they won't match.  With stabs, it's
obvious just doing

$ strings -a a.out | grep '^A:'
A:T(0,20)=s8a:(0,1),0,32;b:(0,1),32,32;;
A:T(0,20)=s2a:(0,2),0,8;b:(0,2),8,8;;

I can see the same thing in readelf -w output when DWARF2 is used,
although more verbosely.

It Would Be Nice if gdb would notice this and print a warning message,
along the lines of 

warning: type `struct A' defined inconsistently in object files `a.o'
and `b.o'

when started up.

zw


             reply	other threads:[~2002-03-13 18:22 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-03-13 10:22 Zack Weinberg [this message]
2002-03-13 10:40 ` Kris Warkentin
2002-03-13 16:02   ` Daniel Jacobowitz
2002-03-14  5:14     ` Kris Warkentin
2002-03-13 16:07 ` Daniel Jacobowitz
2002-03-14 11:13   ` Zack Weinberg
2002-03-14 21:03     ` Daniel Jacobowitz
2002-03-14 22:11       ` Andrew Cagney
     [not found] ` <mailpost.1016043761.7328@news-sj1-1>
2002-03-13 18:35   ` cgd

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20020313182221.GE8197@codesourcery.com \
    --to=zack@codesourcery.com \
    --cc=gdb@sources.redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox