[Development] Suggested addition to wiki.qt.io/Coding_Conventions

Marc Mutz marc.mutz at kdab.com
Fri May 15 07:26:36 CEST 2015


On Thursday 14 May 2015 09:33:59 Olivier Goffart wrote:
> On Thursday 14. May 2015 08:48:36 Thiago Macieira wrote:
> > On Thursday 14 May 2015 02:15:54 Marc Mutz wrote:
[...]
> > > The standard doesn't talk about DLLs and SOs. Semantics of those
> > > constructs is supplied by the platform ABI, not std-C++.
> >
> > Right.
> 
> Allow me to disagree!
> 
> The standard C++ defines all the semantics of the code unless it defines it
> as  implementation-defined or undefined behaviour.
> The ABI is just an implementation detail and cannot overwrite the C++ 
> standards.

Similar example to DLLs: Multithreading. The C++98 standard didn't talk about 
multithreading. So a standards-conforming function could just say

  int refCount;
  void ref() { ++refCount; }
  bool deref() { return --refCount; }

The standard guarantees that ++x turns x into x+1 (assuming no overflow 
occurs), and -- turnx x into x-1. It says that int -> bool conversion exists 
and that the conversion result is (x != 0). So you can prove that in the above 
code, deref() return true whenever it has been called as many times as ref() 
has been before it (assuming refCount == 0 initially) - the basis of ref-
counting.

Enter MT, and none of the three guarantees above are valid anymore.

You have entered a realm outside std-C++. So you do when using DLLs, too.

C++11 talks about MT, so the above code gets what it deserves when ref() or 
deref() are called from more than one thread: UB. Maybe modules will make 
comparing addresses of inline functions across DLL boundaries UB.

I don't see a difference between the two examples.

Thanks,
Marc

-- 
Marc Mutz <marc.mutz at kdab.com> | Senior Software Engineer
KDAB (Deutschland) GmbH & Co.KG, a KDAB Group Company
Tel: +49-30-521325470
KDAB - The Qt Experts



More information about the Development mailing list