From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 75226 invoked by alias); 20 Apr 2017 03:27:46 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 75202 invoked by uid 89); 20 Apr 2017 03:27:45 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.9 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_HELO_PASS,SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=Hx-languages-length:2807 X-HELO: simark.ca Received: from simark.ca (HELO simark.ca) (158.69.221.121) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 20 Apr 2017 03:27:43 +0000 Received: by simark.ca (Postfix, from userid 33) id 2FBA41E48D; Wed, 19 Apr 2017 23:27:43 -0400 (EDT) To: Pedro Alves Subject: Re: [PATCH 1/5] Poison non-POD memset & non-trivially-copyable memcpy/memmove X-PHP-Originating-Script: 33:rcube.php MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Date: Thu, 20 Apr 2017 03:27:00 -0000 From: Simon Marchi Cc: gdb-patches@sourceware.org In-Reply-To: <1492050475-9238-2-git-send-email-palves@redhat.com> References: <1492050475-9238-1-git-send-email-palves@redhat.com> <1492050475-9238-2-git-send-email-palves@redhat.com> Message-ID: <44b612a2b2dadc142c054a1967dc2600@polymtl.ca> X-Sender: simon.marchi@polymtl.ca User-Agent: Roundcube Webmail/1.2.4 X-IsSubscribed: yes X-SW-Source: 2017-04/txt/msg00576.txt.bz2 On 2017-04-12 22:27, Pedro Alves wrote: > This patch catches invalid initialization of non-POD types with > memset, at compile time. > > This is what I used to catch the problems fixed by the rest of the > series: > > $ make -k 2>&1 | grep "deleted function" > src/gdb/breakpoint.c:951:53: error: use of deleted function ‘void* > memset(T*, int, size_t) [with T = bp_location; > = void; size_t = long unsigned int]’ > src/gdb/breakpoint.c:7325:32: error: use of deleted function ‘void* > memset(T*, int, size_t) [with T = bp_location; > = void; size_t = long unsigned int]’ > src/gdb/btrace.c:1153:42: error: use of deleted function ‘void* > memset(T*, int, size_t) [with T = btrace_insn; > = void; size_t = long unsigned int]’ > > I'll move this to the end of the series before pushing (if agreed). > > (I've posted another series recently that adds some of the same traits > bits to common/traits.h. They're really useful.) That's really nice. I'm actually surprised we didn't get random crashes because of that yet! > diff --git a/gdb/common/poison.h b/gdb/common/poison.h > new file mode 100644 > index 0000000..57a1733 > --- /dev/null > +++ b/gdb/common/poison.h > @@ -0,0 +1,83 @@ > +/* Poison symbols at compile time. > + > + Copyright (C) 2017 Free Software Foundation, Inc. > + > + This file is part of GDB. > + > + This program is free software; you can redistribute it and/or > modify > + it under the terms of the GNU General Public License as published > by > + the Free Software Foundation; either version 3 of the License, or > + (at your option) any later version. > + > + This program is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + GNU General Public License for more details. > + > + You should have received a copy of the GNU General Public License > + along with this program. If not, see > . */ > + > +#ifndef COMMON_POISON_H > +#define COMMON_POISON_H > + > +#include "traits.h" > + > +/* Poison memset of non-POD types. The idea is catching invalid > + initialization of non-POD structs that is easy to be introduced as > + side effect of refactoring. For example, say this: > + > + struct S { VEC(foo_s) *m_data; }; > + > +is converted to this at some point: > + > + struct S { > + S() { m_data.reserve (10); } > + std::vector m_data; > + }; Here it says struct S ... > + > +and old code was initializing B objects like this: > + > + struct B b; > + memset (&b, 0, sizeof (B)); // whoops, now wipes vector. ... and here struct B? Simon