On Wed, Jul 14, 2021 at 07:30:45PM +0000, Qing Zhao wrote:
> Hi, Kees,
> 
> 
> > On Jul 14, 2021, at 2:11 PM, Kees Cook <keesc...@chromium.org> wrote:
> > 
> > On Wed, Jul 14, 2021 at 02:09:50PM +0000, Qing Zhao wrote:
> >> Hi, Richard,
> >> 
> >>> On Jul 14, 2021, at 2:14 AM, Richard Biener <richard.guent...@gmail.com> 
> >>> wrote:
> >>> 
> >>> On Wed, Jul 14, 2021 at 1:17 AM Qing Zhao <qing.z...@oracle.com> wrote:
> >>>> 
> >>>> Hi, Kees,
> >>>> 
> >>>> I took a look at the kernel testing case you attached in the previous 
> >>>> email, and found the testing failed with the following case:
> >>>> 
> >>>> #define INIT_STRUCT_static_all          = { .one = arg->one,            \
> >>>>                                           .two = arg->two,            \
> >>>>                                           .three = arg->three,        \
> >>>>                                           .four = arg->four,          \
> >>>>                                       }
> >>>> 
> >>>> i.e, when the structure type auto variable has been explicitly 
> >>>> initialized in the source code.  -ftrivial-auto-var-init in the 4th 
> >>>> version
> >>>> does not initialize the paddings for such variables.
> >>>> 
> >>>> But in the previous version of the patches ( 2 or 3), 
> >>>> -ftrivial-auto-var-init initializes the paddings for such variables.
> >>>> 
> >>>> I intended to remove this part of the code from the 4th version of the 
> >>>> patch since the implementation for initializing such paddings is 
> >>>> completely different from
> >>>> the initializing of the whole structure as a whole with memset in this 
> >>>> version of the implementation.
> >>>> 
> >>>> If we really need this functionality, I will add another separate patch 
> >>>> for this additional functionality, but not with this patch.
> >>>> 
> >>>> Richard, what’s your comment and suggestions on this?
> >>> 
> >>> I think this can be addressed in the gimplifier by adjusting
> >>> gimplify_init_constructor to clear
> >>> the object before the initialization (if it's not done via aggregate
> >>> copying).  
> >> 
> >> I did this in the previous versions of the patch like the following:
> >> 
> >> @@ -5001,6 +5185,17 @@ gimplify_init_constructor (tree *expr_p, gimple_seq 
> >> *pre_p, gimple_seq *post_p,
> >>      /* If a single access to the target must be ensured and all elements
> >>         are zero, then it's optimal to clear whatever their number.  */
> >>      cleared = true;
> >> +  else if (flag_trivial_auto_var_init > AUTO_INIT_UNINITIALIZED
> >> +           && !TREE_STATIC (object)
> >> +           && type_has_padding (type))
> >> +    /* If the user requests to initialize automatic variables with
> >> +       paddings inside the type, we should initialize the paddings too.
> >> +       C guarantees that brace-init with fewer initializers than members
> >> +       aggregate will initialize the rest of the aggregate as-if it were
> >> +       static initialization.  In turn static initialization guarantees
> >> +       that pad is initialized to zero bits.
> >> +       So, it's better to clear the whole record under such situation.  */
> >> +    cleared = true;
> >>    else
> >>      cleared = false;
> >> 
> >> Then the paddings are also initialized to zeroes with this option. (Even 
> >> for -ftrivial-auto-var-init=pattern).
> > 
> > Thanks! I've tested with the attached patch to v4 and it passes all my
> > tests again.
> > 
> >> Is the above change Okay? (With this change, when 
> >> -ftrivial-auto-var-init=pattern, the paddings for the
> >> structure variables that have explicit initializer will be ZEROed, not 
> >> 0xFE)
> > 
> > Padding zeroing in the face of pattern-init is correct (and matches what
> > Clang does).
> 
> During the discussion before the 4th version of the patch, we have agreed 
> that pattern-init will use 0xFE byte-repeatable patterns 
> to initialize all the types (this includes the paddings when the structure 
> type variables are not explicitly initialized). And will not match
> Clang’s current behavior. 

Right, that's fine.

> If we initialize the paddings when the structure type variables are 
> explicitly initialized to Zeroes, then there will be inconsistency 
> between values that are used to initialize structure paddings under different 
> situations, This looks not good to me.
> 
> If we have agreed on using 0xFE byte-repeatable patterns for pattern-init, 
> then all the paddings should be initialized with the same 
> pattern. 

Ah! By "situation", you mean how the compiler chooses to initialize the
structure members?

It sounds like for =zero mode, padding will be 0, but for =pattern,
padding may be either 0x00 or 0xFE, depending on which kind of
initialization is internally chosen. Is that right? I'm fine with this
since the =zero case is what I'm primarily focused on being as safe
as possible.

-Kees

-- 
Kees Cook

Reply via email to