[2/9] Use unsigned as base type for some enums
Commit Message
-fsanitize=undefined complains about using operator~ on various enum
types that are used with DEF_ENUM_FLAGS_TYPE. This patch fixes these
problems by explicitly setting the base type for these enums to
unsigned.
ChangeLog
2018-08-27 Tom Tromey <tom@tromey.com>
* symfile-add-flags.h (enum symfile_add_flag): Use unsigned as
base type.
* objfile-flags.h (enum objfile_flag): Use unsigned as base type.
* gdbtypes.h (enum type_instance_flag_value): Use unsigned as base
type.
* c-lang.h (enum c_string_type_values): Use unsigned as base
type.
* btrace.h (enum btrace_thread_flag): Use unsigned as base type.
---
gdb/ChangeLog | 11 +++++++++++
gdb/btrace.h | 2 +-
gdb/c-lang.h | 2 +-
gdb/gdbtypes.h | 2 +-
gdb/objfile-flags.h | 2 +-
gdb/symfile-add-flags.h | 2 +-
6 files changed, 16 insertions(+), 5 deletions(-)
Comments
On 2018-08-27 10:56 AM, Tom Tromey wrote:
> -fsanitize=undefined complains about using operator~ on various enum
> types that are used with DEF_ENUM_FLAGS_TYPE. This patch fixes these
> problems by explicitly setting the base type for these enums to
> unsigned.
Can you give an example of how the error manifests itself (I'm not really
familiar with -fsanitize=undefined). Is the error reported at compile-time
or run-time? I'm not able to make a synthetic standalone example to reproduce
the error.
In any case, that LGTM if that makes the compiler happy. If the error reported
by -fsanitize=undefined is at run-time, could we add a static assert in there
to make sure the underlying types of types used with DEF_ENUM_FLAGS_TYPE are
unsigned, to get a compilation error?
Simon
>>>>> "Simon" == Simon Marchi <simon.marchi@ericsson.com> writes:
Simon> Can you give an example of how the error manifests itself (I'm not really
Simon> familiar with -fsanitize=undefined). Is the error reported at compile-time
Simon> or run-time? I'm not able to make a synthetic standalone example to reproduce
Simon> the error.
You will get an error at runtime, and with the flags added by the last
patch in the series, a crash.
The error looks somewhat like the error from the expression dumping
patch:
runtime error: load of value 2887952, which is not a valid value for type 'exp_opcode'
(I don't have an exact error handy, this was just taken from the other
patch.)
Simon> In any case, that LGTM if that makes the compiler happy. If the error reported
Simon> by -fsanitize=undefined is at run-time, could we add a static assert in there
Simon> to make sure the underlying types of types used with DEF_ENUM_FLAGS_TYPE are
Simon> unsigned, to get a compilation error?
With the final patch, any UB will cause gdb to crash (in development
mode), presumably leading to a test suite failure. I think it isn't
necessary to require unsigned as the underlying type -- any type will
do. However I don't know how to assert that.
Tom
@@ -228,7 +228,7 @@ struct btrace_call_history
};
/* Branch trace thread flags. */
-enum btrace_thread_flag
+enum btrace_thread_flag : unsigned
{
/* The thread is to be stepped forwards. */
BTHR_STEP = (1 << 0),
@@ -35,7 +35,7 @@ struct parser_state;
/* The various kinds of C string and character. Note that these
values are chosen so that they may be or'd together in certain
ways. */
-enum c_string_type_values
+enum c_string_type_values : unsigned
{
/* An ordinary string: "value". */
C_STRING = 0,
@@ -192,7 +192,7 @@ enum type_code
/* * Some bits for the type's instance_flags word. See the macros
below for documentation on each bit. */
-enum type_instance_flag_value
+enum type_instance_flag_value : unsigned
{
TYPE_INSTANCE_FLAG_CONST = (1 << 0),
TYPE_INSTANCE_FLAG_VOLATILE = (1 << 1),
@@ -25,7 +25,7 @@
/* Defines for the objfile flags field. Defined in a separate file to
break circular header dependencies. */
-enum objfile_flag
+enum objfile_flag : unsigned
{
/* When an object file has its functions reordered (currently
Irix-5.2 shared libraries exhibit this behaviour), we will need
@@ -26,7 +26,7 @@
symbol_file_add, etc. Defined in a separate file to break circular
header dependencies. */
-enum symfile_add_flag
+enum symfile_add_flag : unsigned
{
/* Be chatty about what you are doing. */
SYMFILE_VERBOSE = 1 << 1,