From mboxrd@z Thu Jan 1 00:00:00 1970 From: Anthony Liguori Subject: Re: [PATCH kvm-unit-tests 2/4] Introduce a C++ wrapper for the kvm APIs Date: Wed, 24 Nov 2010 11:27:42 -0600 Message-ID: <4CED4B0E.3030805@codemonkey.ws> References: <1290595933-13122-1-git-send-email-avi@redhat.com> <1290595933-13122-3-git-send-email-avi@redhat.com> <50DD1E97-0ECD-41E6-B6F8-1D78AA4A4876@suse.de> <4CED2416.1040102@codemonkey.ws> <20101124154006.GE15111@redhat.com> <4CED344B.3030000@codemonkey.ws> <4CED3FE6.50900@redhat.com> <4CED41A0.8060003@redhat.com> <4CED4276.9090103@redhat.com> <4CED445E.30105@redhat.com> <4CED4629.2060804@redhat.com> <4CED4738.2020406@redhat.com> <4CED488D.40806@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Cc: Avi Kivity , Gleb Natapov , Alexander Graf , Marcelo Tosatti , kvm@vger.kernel.org To: Jes Sorensen Return-path: Received: from mail-gy0-f174.google.com ([209.85.160.174]:36044 "EHLO mail-gy0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754937Ab0KXR2O (ORCPT ); Wed, 24 Nov 2010 12:28:14 -0500 Received: by gyb11 with SMTP id 11so2915310gyb.19 for ; Wed, 24 Nov 2010 09:28:14 -0800 (PST) In-Reply-To: <4CED488D.40806@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 11/24/2010 11:17 AM, Jes Sorensen wrote: > On 11/24/10 18:11, Avi Kivity wrote: > >> On 11/24/2010 07:06 PM, Jes Sorensen wrote: >> >>> Sorry but that is utterly and completely bogus! The enforcement is only >>> as good as the developers and maintainers make it, >>> >> class File { >> public: >> virtual ~File() {} >> virtual void read(...) = 0; >> virtual void write(...) = 0; >> }; >> >> Anyone wishing to implement this interface is forced to implement read >> and write methods (callbacks) with exactly the right signature. The >> compiler will complain if they don't. So if File is a good interface, >> we can make the compiler force people to use it correctly. >> >> We can emulate this in C with ->ops-> things, but that's just >> boilerplate and more places for people to get things wrong, or lazy and >> take shortcuts. >> > In the mean time we spend our time debugging the runtime because the > virtual functions don't behave as expected. In C we know what is going > on, in C++ it is pray and hope. > The alternative in C is: struct file_operations { void (*release)(void); void (*read)(...); void (*write)(...); }; struct file { struct file_operations *ops; }; If I do: static file_operations posix_file_ops = { .read = posix_file_read, .write = posix_file_write, }; struct posix_file { struct file parent; int fd; }; void posix_file_init(struct posix_file *obj) { obj->parent.ops = posix_file_ops; obj->fd = ...; }; The compiler won't generate an error. Only upon a call to file_release() will a null pointer dereference happens whereas in C++, because this paradigm is structured in the language, the compiler can help assist you. Regards, Anthony Liguori > Jes >