On Fri, Jun 21, 2019 at 03:50:02PM +0200, Ard Biesheuvel wrote: > On Fri, 21 Jun 2019 at 15:44, Arnd Bergmann <a...@arndb.de> wrote: > > One pattern I have seen here is temporary variables from macros or > > inline functions whose lifetime now extends over the entire function > > rather than just the basic block in which they are defined, see e.g. > > lpfc_debug_dump_qe() being inlined multiple times into > > lpfc_debug_dump_all_queues(). Each instance of the local > > "char line_buf[LPFC_LBUF_SZ];" seems to add on to the previous > > one now, where the behavior without the structleak plugin is that > > they don't.
Ewww. > Right, that seems to be due to the fact that this code > > /* split the first bb where we can put the forced initializers */ > gcc_assert(single_succ_p(ENTRY_BLOCK_PTR_FOR_FN(cfun))); > bb = single_succ(ENTRY_BLOCK_PTR_FOR_FN(cfun)); > if (!single_pred_p(bb)) { > split_edge(single_succ_edge(ENTRY_BLOCK_PTR_FOR_FN(cfun))); > gcc_assert(single_succ_p(ENTRY_BLOCK_PTR_FOR_FN(cfun))); > } > > puts all the initializers at the beginning of the function rather than > inside the scope of the definition. Do you see a sane way to improve this? I hadn't noticed that this actually moved it up to the start of the function. :( -- Kees Cook