Project

General

Profile

« Previous | Next » 

Revision b223a78a

Added by shyouhei (Shyouhei Urabe) almost 6 years ago

this ternary operator is an undefined behaviour

Let me quote ISO/IEC 9899:2018 section 6.5.15:

Constraints

The first operand shall have scalar type.
One of the following shall hold for the second and third operands:
— both operands have arithmetic type;
— both operands have the same structure or union type;
— both operands have void type;
(snip)

Here, *option is a const struct rb_compile_option_struct. OTOH
COMPILE_OPTION_DEFAULT is a struct rb_compile_option_struct, without
const. These two are not the "same structure or union type". Hence
the expression renders undefined behaviour. COMPILE_OPTION_DEFAULT is
not a const because RubyVM::InstructionSequence.compile_option=
touches its internals on-the-fly. There is no way to meet the
constraints quoted above.

Using ternary operator here was a mistake at the first place. Let's
just replace it with a normal if statement.