[review] Add static_asserts for the sizes of space-critical structs

Message ID gerrit.1572028967000.Idd68320aa3e79ee7cc749019724636a58ce4b9c6@gnutoolchain-gerrit.osci.io
State New, archived
Headers

Commit Message

Simon Marchi (Code Review) Oct. 25, 2019, 6:42 p.m. UTC
  Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/306
......................................................................

Add static_asserts for the sizes of space-critical structs

Specifically the three structs mentioned in symtab.h:
- general_symbol_info
- symbol
- partial_symbol

This ensures that those structs won't accidentally get bigger.

gdb/ChangeLog:

2019-10-25  Christian Biesinger  <cbiesinger@google.com>

	* psympriv.h: Add static_asserts for sizeof (general_symbol_info)
	and sizeof (symbol).
	* symtab.h: Add a static_assert for sizeof (partial_symbol).

Change-Id: Idd68320aa3e79ee7cc749019724636a58ce4b9c6
---
M gdb/psympriv.h
M gdb/symtab.h
2 files changed, 11 insertions(+), 0 deletions(-)
  

Comments

Simon Marchi (Code Review) Oct. 29, 2019, 7:22 p.m. UTC | #1
Tom Tromey has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/306
......................................................................


Patch Set 2: Code-Review+1

(1 comment)

I think these spots should maybe come with a short comment explaining
that the assert is just to make sure you don't change the size by
accident.  That way people changing the size on purpose will know
they can just update the assert.  WDYT?

https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/306/2/gdb/symtab.h 
File gdb/symtab.h:

https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/306/2/gdb/symtab.h@1189 
PS2, Line 1189: 
1180 |   /* FIXME drow/2003-02-21: For the LOC_BLOCK case, it might be better
1181 |      to add a magic symbol to the block containing this information,
1182 |      or to have a generic debug info annotation slot for symbols.  */
1183 | 
1184 |   void *aux_value;
1185 | 
1186 |   struct symbol *hash_next;
1187 | };
1188 | 
1189 | gdb_static_assert ((sizeof (void *) == 8 && sizeof (symbol) == 72) ||

|| at the start of the next line.
  
Simon Marchi (Code Review) Nov. 4, 2019, 5:43 p.m. UTC | #2
Christian Biesinger has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/306
......................................................................


Uploaded patch set 3: Patch Set 2 was rebased.

(1 comment)

https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/306/2/gdb/symtab.h 
File gdb/symtab.h:

https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/306/2/gdb/symtab.h@1189 
PS2, Line 1189: 
1184 |   void *aux_value;
1185 | 
1186 |   struct symbol *hash_next;
1187 | };
1188 | 
1189 > gdb_static_assert ((sizeof (void *) == 8 && sizeof (symbol) == 72) ||
1190 | 		   (sizeof (void *) == 4 && sizeof (symbol) == 40));
1191 | 
1192 | /* Several lookup functions return both a symbol and the block in which the
1193 |    symbol is found.  This structure is used in these cases.  */
1194 | 

> || at the start of the next line.

Done
  
Simon Marchi (Code Review) Nov. 4, 2019, 5:56 p.m. UTC | #3
Tom Tromey has posted comments on this change.

Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/306
......................................................................


Patch Set 4: Code-Review+2

Thank you.  This looks good to me.
  

Patch

diff --git a/gdb/psympriv.h b/gdb/psympriv.h
index 3e89742..b32311c 100644
--- a/gdb/psympriv.h
+++ b/gdb/psympriv.h
@@ -81,6 +81,10 @@ 
   ENUM_BITFIELD(address_class) aclass : SYMBOL_ACLASS_BITS;
 };
 
+gdb_static_assert ((sizeof (void *) == 8 && sizeof (partial_symbol) == 40)
+		   || (sizeof (void *) == 4 &&
+		       sizeof (partial_symbol) == 24));
+
 /* A convenience enum to give names to some constants used when
    searching psymtabs.  This is internal to psymtab and should not be
    used elsewhere.  */
diff --git a/gdb/symtab.h b/gdb/symtab.h
index dc65409..e02e49b 100644
--- a/gdb/symtab.h
+++ b/gdb/symtab.h
@@ -445,6 +445,10 @@ 
   short section;
 };
 
+gdb_static_assert ((sizeof (void *) == 8 && sizeof (general_symbol_info) == 32)
+		   || (sizeof (void *) == 4 &&
+		       sizeof (general_symbol_info) == 20));
+
 extern void symbol_set_demangled_name (struct general_symbol_info *,
 				       const char *,
                                        struct obstack *);
@@ -1182,6 +1186,9 @@ 
   struct symbol *hash_next;
 };
 
+gdb_static_assert ((sizeof (void *) == 8 && sizeof (symbol) == 72) ||
+		   (sizeof (void *) == 4 && sizeof (symbol) == 40));
+
 /* Several lookup functions return both a symbol and the block in which the
    symbol is found.  This structure is used in these cases.  */