220 40448 <171c3741-7ebf-4383-83eb-ed68b08b10b2@isocpp.org> article
Path: news.gmane.org!.POSTED!not-for-mail
From: florian.csdt@gmail.com
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: more security concerns
Date: Tue, 9 Oct 2018 07:12:37 -0700 (PDT)
Lines: 349
Approved: news@gmane.org
Message-ID: <171c3741-7ebf-4383-83eb-ed68b08b10b2@isocpp.org>
References: <CAFdMc-0NqfbqeOhhH1YiVGxDRVPv7COKNqge3mLu8UE8SgcXNw@mail.gmail.com>
 <CAO8_tC4kNZ6s-xMXo69n1D3dbOMkqt0fjLU44Uq5TfABp17hQQ@mail.gmail.com>
 <CAFdMc-1DpAUkYDVyNmP5H49XyNVDq5_T6UkEVaQGMGA0YEhNGw@mail.gmail.com>
 <94d79dd7-ba3b-4bf8-91ed-e5dc02b33670@isocpp.org> <CAFdMc-1tpJj3bSzHgD=pxWD2eVokRX3ST2QE-oF6M8z1=DTEoQ@mail.gmail.com>
 <c71e2ca9-c5f4-4699-b2c1-b23245eef683@isocpp.org> <CAFdMc-3RRFoPYsyyQAX0w0eshYRytoes00VkoDPLrOPjWjjv3A@mail.gmail.com>
 <dba0bf6d-92da-440e-8e61-af336cacd537@isocpp.org> <CAFdMc-1cyt1gnCvvtrE+JOW0s=wab=0eU1APYzdrwejxjqc1zg@mail.gmail.com>
 <c35b213e-cbfd-41e2-a8dd-e5cf93343b8c@isocpp.org> <bf24037e-142a-4730-84e0-1886f6235e45@isocpp.org>
 <CAFdMc-1nTmSAMa4zOg5tAbm=rspsbMv0Z_sBfpTTHHvauJKiJg@mail.gmail.com>
 <e7edc1e3-a9b3-421c-a72f-623d6c34b104@isocpp.org> <CAFdMc-0-p7rOo3MYrfa+x_zc21h58fZb_Qt5a1g6ocasCqyJXw@mail.gmail.com>
 <f5b06d59-bfc0-491b-b553-aca1c1050ee1@isocpp.org> <CANiq72kBPp9uONTPvC7L9n8+rtnXtE12MM_YJQDw1JsbVQ9frA@mail.gmail.com>
 <199794e8-8362-489b-818f-ab6c510c5c84@isocpp.org>
 <CANiq72mHdtv1H87QQWjRQzAa_BkCgr4SU9C2iOr7aJxGJJqf+w@mail.gmail.com>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: blaine.gmane.org
Mime-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_2038_367397919.1539094357450"
X-Trace: blaine.gmane.org 1539094234 29314 195.159.176.226 (9 Oct 2018 14:10:34 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Tue, 9 Oct 2018 14:10:34 +0000 (UTC)
To: ISO C++ Standard - Future Proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBC26HM4V3MIRBVXO6LOQKGQE4UH74WI@isocpp.org Tue Oct 09 16:10:29 2018
Return-path: <std-proposals+bncBC26HM4V3MIRBVXO6LOQKGQE4UH74WI@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-yw1-f70.google.com ([209.85.161.70])
	by blaine.gmane.org with esmtp (Exim 4.84_2)
	(envelope-from <std-proposals+bncBC26HM4V3MIRBVXO6LOQKGQE4UH74WI@isocpp.org>)
	id 1g9siT-0007UU-JN
	for gclcip-std-proposals@m.gmane.org; Tue, 09 Oct 2018 16:10:29 +0200
Original-Received: by mail-yw1-f70.google.com with SMTP id v132-v6sf915716ywb.15
        for <gclcip-std-proposals@m.gmane.org>; Tue, 09 Oct 2018 07:12:40 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=date:from:to:message-id:in-reply-to:references:subject:mime-version
         :x-original-sender:reply-to:precedence:mailing-list:list-id
         :list-post:list-help:list-archive:list-subscribe:list-unsubscribe;
        bh=R7xrIBZ7iBTwiNbFOttgw4M8BhQ3GU2oBf5tY0x5b44=;
        b=Mu9erVeZgq4y4/9X6kQidR2VbFoWYRx/KDBwxoA66CfW3gDXw4d3bEEZNW08uX17n8
         cCr+R3g1FsKbJ73BjbcTQBaae3VXmXlUVr5lOwktotDtcpC4edMfaqVHaZhEVvJnbQX3
         jgcIFhNxvVMvNO2mdvBHd9/JjN8KWPUeXVF2PswvgVZK7UecRpRZXpVTzLBW7bTRYOpp
         iVFhfb6sEOJ7Lik9p0XNtuQbiVB26t27LfVl+/YmWr7oNWMFNcv92c0aITA1JHpXihyt
         hLDBJbFQam6g+8UYsTMM+omazu2neGB+L6869RMcbnuKrM7gYne9ij4U+86gTDzH/NDC
         BLqA==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20161025;
        h=date:from:to:message-id:in-reply-to:references:subject:mime-version
         :x-original-sender:reply-to:precedence:mailing-list:list-id
         :list-post:list-help:list-archive:list-subscribe:list-unsubscribe;
        bh=R7xrIBZ7iBTwiNbFOttgw4M8BhQ3GU2oBf5tY0x5b44=;
        b=lHFjKJu5TGHSoZ+LbypVL3bBWum4TEsvTuPKQcQ6rrX43GkAQ4qoZ/LlrBHWhIur3Q
         pPG/+JbcRffDoqhFDhcSKDBj6b8y+PZqHtsWLe5R/B7pIOQugYUohL9K6/QBRnJin/2w
         D8+VwsNncDMoUSknDNXNaTVWbRx/xwL7RO29N+2PoNz+hQGT+QHw7ZK11oZgS+eqRrgJ
         zh9E/WCa+/SK5NrCAHzb6dlzRvHVAUuQcJNR9SsmJna7DoVT7pW5/cVPcm4u/a2r8JJL
         vRNWQO/GfgACKtKHRN4L1Go7xqfIO3l2ITbcFD0QGP1+bu/eBld9GYnNIt0jN34bO0Mp
         X6UQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20161025;
        h=x-gm-message-state:date:from:to:message-id:in-reply-to:references
         :subject:mime-version:x-original-sender:reply-to:precedence
         :mailing-list:list-id:x-spam-checked-in-group:list-post:list-help
         :list-archive:list-subscribe:list-unsubscribe;
        bh=R7xrIBZ7iBTwiNbFOttgw4M8BhQ3GU2oBf5tY0x5b44=;
        b=gLl6l4ANZhuxYXB1bBNRpZ3navcXvKj95e+7KW09xbyUQwAnVOWYAvUYRPGIuAM68Q
         lxwNg6B2EBgUMLEeFLUuzDhh0JHKQ1pGlQKfEKxWUVCkypUbXh++lKBDgc8R9hStL0sb
         RheoZLq2iCwNGTD2oDdOF1xXl5iuZQPe1rAfL4YA3FKuTzi2Xr/7QJEPjPGEub5peoZo
         pDt74Dr5Ouo5sej/tpilYM8049eK6ZVusUXX9Mb/IrXmbhainpB8kqTRiqYNXFum4rG8
         j5ib7dwQExfOiOJM+ZtL+Eu7B3WQlcxZrBknT+El2+GdQ3PbKzZn7b/UIhXXIRknJo3x
         oiCQ==
X-Gm-Message-State: ABuFfog7hvjulNjDLNgiD868meI99OXMqMpPru1x6FHJ3n8Clkg2SkC0
	v6cN3ZPvpbt8MKcU0X3qRlb4oA==
X-Google-Smtp-Source: ACcGV63mwG/pdbciv6W8k+eXX6n4D99JeH3BC97PhroNzfEClCJPmedFlnoDCvn3+JbFKfw4mJ8Rhw==
X-Received: by 2002:a25:ba50:: with SMTP id z16-v6mr13847391ybj.18.1539094359563;
        Tue, 09 Oct 2018 07:12:39 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 2002:a81:9157:: with SMTP id i84-v6ls1344717ywg.12.gmail; Tue, 09
 Oct 2018 07:12:38 -0700 (PDT)
X-Received: by 2002:a0d:dd42:: with SMTP id g63-v6mr306775ywe.2.1539094357890;
        Tue, 09 Oct 2018 07:12:37 -0700 (PDT)
In-Reply-To: <CANiq72mHdtv1H87QQWjRQzAa_BkCgr4SU9C2iOr7aJxGJJqf+w@mail.gmail.com>
X-Original-Sender: florian.csdt@gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:40448
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/40448>

------=_Part_2038_367397919.1539094357450
Content-Type: multipart/alternative; 
	boundary="----=_Part_2039_335946979.1539094357450"

------=_Part_2039_335946979.1539094357450
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable



Le mardi 9 octobre 2018 15:54:35 UTC+2, Miguel Ojeda a =C3=A9crit :
>
> On Tue, Oct 9, 2018 at 2:56 PM <floria...@gmail.com <javascript:>> wrote:=
=20
> >=20
> >=20
> > Le mardi 9 octobre 2018 14:42:10 UTC+2, Miguel Ojeda a =C3=A9crit :=20
> >>=20
> >> Hi Florian,=20
> >>=20
> >> On Tue, Oct 9, 2018 at 2:24 PM <floria...@gmail.com> wrote:=20
> >> >=20
> >> > For your second point, I didn't think about it yet. So I didn't take=
=20
> it into consideration when I proposed the [[undead]] attribute. But if yo=
ur=20
> goal is security, then you would also need to take into consideration thi=
s.=20
> >> > Let's imagine an attribute [[secret]].=20
> >> > Every object marked as [[secret]] will be cleaned before function=20
> exit.=20
> >> > This cleaning means set to zero every location that still contains=
=20
> the object (known to the compiler).=20
> >>=20
> >> This sounds very similar to secure_val, but as a variable attribute.=
=20
> >=20
> >=20
> > Yes it is similar. But I think attribute is more appropriate because=20
> those security issues are not about C++: in order to read a destroyed=20
> value, you need to use undefined behavior somehow.=20
> >=20
>
> I am not sure what you mean by "are not about C++" or by "reading a=20
> destroyed value". Do you mean you want to have compiler support so=20
> that other languages (like C) can take advantage of it?=20
>

No, I mean these security issues arise beyond the scope of C++.
As far as C++ is concerned, you cannot access a destroyed value (so the=20
secret remains secret).
Any attempt in doing that leads to undefined behaviours: meaning the result=
=20
does not depends on C++ semantic anymore.
So if every single undefined behavior would crash the program instant=20
(which is actually valid), there would be no secret leaking issue at all.

That's what I mean when I say it is not about C++.

I don't necessarily want to have it for other languages (but it would be=20
good if we do).
=20

>
> Note that there are C++-only attributes; and that, anyway, it would be=20
> nice to have a concrete use case (e.g. secure_val) where such features=20
> could be used.=20
>
> >>=20
> >>=20
> >> > Also, in order to not deduce the secret from other temporaries, any=
=20
> value depending on a [[secret]] object is also marked implicitly as=20
> [[secret]].=20
> >> >=20
> >> > This does not address cache persistency, but it can be covered if th=
e=20
> [[secret]] can take an optional argument to ensure cache lines related to=
=20
> this object are flushed (done by the compiler).=20
> >> >=20
> >> > With this, you start to have a pretty strong security plan for stack=
=20
> objects. But the heap objects cannot be marked as secret. So for that,=20
> maybe you could mark the delete statement as [[secret]] and let the=20
> compiler do the same thing for heap objects.=20
> >>=20
> >> I would say users should not care where or how the value is stored.=20
> >> Having to mark delete statements with an attribute seems odd.=20
> >=20
> >=20
> > The problem is, when you create an object on the heap, on don't really=
=20
> own the object. that's why it needs a special treatment.=20
> > Maybe marking the pointer type as [[secret]] could solve the issue.=20
>
> Yes, exactly, that is why secure_val is a template: in my view, it has=20
> to be applied the type; not on statements (Daniel's original proposal)=20
> or variables (your initial [[secret]] proposal). If you create a type=20
> attribute, then it could be used itself to implement (part of)=20
> secure_val.=20
>

true.
=20

>
> > If you delete a [[secret]] pointer, then the compiler needs to ensure=
=20
> every location is cleaned afterwards.=20
> >=20
> >>=20
> >> As a=20
> >> user, I would simply prefer to be able to mark my type T with=20
> >> [[secret]] and then *that* could be put into the heap. That is the=20
> >> reason I went for a template, because it looked natural to wrap values=
=20
> >> with it:=20
> >>=20
> >>   std::secure_val<int> my_very_secret_number;=20
> >>   std::secure_val<char [N]> my_private_key;=20
> >>=20
> >> etc.=20
> >=20
> >=20
> > The problem with your template approach is: you don't have the cascade=
=20
> of the secret property, so temporaries depending on your secure_val will=
=20
> not be cleaned.=20
>
> It depends. Note that the accesses to the secret value must go through=20
> access(). This is intended so that code inside that block may be=20
> treated specially by the compiler. The examples given in the proposal=20
> about how this can be used are encryption (compiler support not needed=20
> in principle), disabling speculation (compiler support needed), etc.=20
>

Your encryption use case actually needs compiler support if your compiler=
=20
is "smart" enough to duplicate your object location.
=20

>
> > Also, your template is not safely implementable in C++: you need=20
> cooperation from the compiler in the same way as with the attribute,=20
> because of the possible mutliple locations of your object.=20
> >=20
>
> Of course it isn't, that is the whole point of secure_val. :-)=20
>
> Let me put it this way: I would love secure_val to be implementable in=20
> C++ (or at least part of it, e.g. the auto-clear [[secret]] part that=20
> you are discussing). However, it is not clear yet how many things we=20
> would need to add to the language or how. Some things, like=20
> Spectre-class vulnerabilities, are still being researched. Therefore,=20
> I suggested secure_val first to make the most common use case=20
> concrete, and at the same time give developers a simple solution to=20
> it. Since secure_val does not force almost anything on the vendors=20
> (except the auto-clear), it can be updated to provide further=20
> guarantees as time goes on.=20
>

The auto-clear does require compiler support if you want a proper/safe=20
implementation of it.
But you're right: it can be done incrementally.
=20
Cheers,
Florian

--=20
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
To view this discussion on the web visit https://groups.google.com/a/isocpp=
..org/d/msgid/std-proposals/171c3741-7ebf-4383-83eb-ed68b08b10b2%40isocpp.or=
g.

------=_Part_2039_335946979.1539094357450
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>Le mardi 9 octobre 2018 15:54:35 UTC+2, Miguel Oje=
da a =C3=A9crit=C2=A0:<blockquote class=3D"gmail_quote" style=3D"margin: 0;=
margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On Tue, =
Oct 9, 2018 at 2:56 PM &lt;<a href=3D"javascript:" target=3D"_blank" gdf-ob=
fuscated-mailto=3D"yXSXjqVgBAAJ" rel=3D"nofollow" onmousedown=3D"this.href=
=3D&#39;javascript:&#39;;return true;" onclick=3D"this.href=3D&#39;javascri=
pt:&#39;;return true;">floria...@gmail.com</a>&gt; wrote:
<br>&gt;
<br>&gt;
<br>&gt; Le mardi 9 octobre 2018 14:42:10 UTC+2, Miguel Ojeda a =C3=A9crit =
:
<br>&gt;&gt;
<br>&gt;&gt; Hi Florian,
<br>&gt;&gt;
<br>&gt;&gt; On Tue, Oct 9, 2018 at 2:24 PM &lt;<a>floria...@gmail.com</a>&=
gt; wrote:
<br>&gt;&gt; &gt;
<br>&gt;&gt; &gt; For your second point, I didn&#39;t think about it yet. S=
o I didn&#39;t take it into consideration when I proposed the [[undead]] at=
tribute. But if your goal is security, then you would also need to take int=
o consideration this.
<br>&gt;&gt; &gt; Let&#39;s imagine an attribute [[secret]].
<br>&gt;&gt; &gt; Every object marked as [[secret]] will be cleaned before =
function exit.
<br>&gt;&gt; &gt; This cleaning means set to zero every location that still=
 contains the object (known to the compiler).
<br>&gt;&gt;
<br>&gt;&gt; This sounds very similar to secure_val, but as a variable attr=
ibute.
<br>&gt;
<br>&gt;
<br>&gt; Yes it is similar. But I think attribute is more appropriate becau=
se those security issues are not about C++: in order to read a destroyed va=
lue, you need to use undefined behavior somehow.
<br>&gt;
<br>
<br>I am not sure what you mean by &quot;are not about C++&quot; or by &quo=
t;reading a
<br>destroyed value&quot;. Do you mean you want to have compiler support so
<br>that other languages (like C) can take advantage of it?
<br></blockquote><div><br></div><div>No, I mean these security issues arise=
 beyond the scope of C++.</div><div>As far as C++ is concerned, you cannot =
access a destroyed value (so the secret remains secret).</div><div>Any atte=
mpt in doing that leads to undefined behaviours: meaning the result does no=
t depends on C++ semantic anymore.</div><div>So if every single undefined b=
ehavior would crash the program instant (which is actually valid), there wo=
uld be no secret leaking issue at all.</div><div><br></div><div>That&#39;s =
what I mean when I say it is not about C++.</div><div><br></div><div>I don&=
#39;t necessarily want to have it for other languages (but it would be good=
 if we do).<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" sty=
le=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left=
: 1ex;">
<br>Note that there are C++-only attributes; and that, anyway, it would be
<br>nice to have a concrete use case (e.g. secure_val) where such features
<br>could be used.
<br>
<br>&gt;&gt;
<br>&gt;&gt;
<br>&gt;&gt; &gt; Also, in order to not deduce the secret from other tempor=
aries, any value depending on a [[secret]] object is also marked implicitly=
 as [[secret]].
<br>&gt;&gt; &gt;
<br>&gt;&gt; &gt; This does not address cache persistency, but it can be co=
vered if the [[secret]] can take an optional argument to ensure cache lines=
 related to this object are flushed (done by the compiler).
<br>&gt;&gt; &gt;
<br>&gt;&gt; &gt; With this, you start to have a pretty strong security pla=
n for stack objects. But the heap objects cannot be marked as secret. So fo=
r that, maybe you could mark the delete statement as [[secret]] and let the=
 compiler do the same thing for heap objects.
<br>&gt;&gt;
<br>&gt;&gt; I would say users should not care where or how the value is st=
ored.
<br>&gt;&gt; Having to mark delete statements with an attribute seems odd.
<br>&gt;
<br>&gt;
<br>&gt; The problem is, when you create an object on the heap, on don&#39;=
t really own the object. that&#39;s why it needs a special treatment.
<br>&gt; Maybe marking the pointer type as [[secret]] could solve the issue=
..
<br>
<br>Yes, exactly, that is why secure_val is a template: in my view, it has
<br>to be applied the type; not on statements (Daniel&#39;s original propos=
al)
<br>or variables (your initial [[secret]] proposal). If you create a type
<br>attribute, then it could be used itself to implement (part of)
<br>secure_val.
<br></blockquote><div><br></div><div>true.<br></div><div>=C2=A0</div><block=
quote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-le=
ft: 1px #ccc solid;padding-left: 1ex;">
<br>&gt; If you delete a [[secret]] pointer, then the compiler needs to ens=
ure every location is cleaned afterwards.
<br>&gt;
<br>&gt;&gt;
<br>&gt;&gt; As a
<br>&gt;&gt; user, I would simply prefer to be able to mark my type T with
<br>&gt;&gt; [[secret]] and then *that* could be put into the heap. That is=
 the
<br>&gt;&gt; reason I went for a template, because it looked natural to wra=
p values
<br>&gt;&gt; with it:
<br>&gt;&gt;
<br>&gt;&gt; =C2=A0 std::secure_val&lt;int&gt; my_very_secret_number;
<br>&gt;&gt; =C2=A0 std::secure_val&lt;char [N]&gt; my_private_key;
<br>&gt;&gt;
<br>&gt;&gt; etc.
<br>&gt;
<br>&gt;
<br>&gt; The problem with your template approach is: you don&#39;t have the=
 cascade of the secret property, so temporaries depending on your secure_va=
l will not be cleaned.
<br>
<br>It depends. Note that the accesses to the secret value must go through
<br>access(). This is intended so that code inside that block may be
<br>treated specially by the compiler. The examples given in the proposal
<br>about how this can be used are encryption (compiler support not needed
<br>in principle), disabling speculation (compiler support needed), etc.
<br></blockquote><div><br></div><div>Your encryption use case actually need=
s compiler support if your compiler is &quot;smart&quot; enough to duplicat=
e your object location.<br></div><div>=C2=A0</div><blockquote class=3D"gmai=
l_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;=
padding-left: 1ex;">
<br>&gt; Also, your template is not safely implementable in C++: you need c=
ooperation from the compiler in the same way as with the attribute, because=
 of the possible mutliple locations of your object.
<br>&gt;
<br>
<br>Of course it isn&#39;t, that is the whole point of secure_val. :-)
<br>
<br>Let me put it this way: I would love secure_val to be implementable in
<br>C++ (or at least part of it, e.g. the auto-clear [[secret]] part that
<br>you are discussing). However, it is not clear yet how many things we
<br>would need to add to the language or how. Some things, like
<br>Spectre-class vulnerabilities, are still being researched. Therefore,
<br>I suggested secure_val first to make the most common use case
<br>concrete, and at the same time give developers a simple solution to
<br>it. Since secure_val does not force almost anything on the vendors
<br>(except the auto-clear), it can be updated to provide further
<br>guarantees as time goes on.
<br></blockquote><div><br></div><div>The auto-clear does require compiler s=
upport if you want a proper/safe implementation of it.</div><div>But you&#3=
9;re right: it can be done incrementally.<br></div><div>=C2=A0</div><div>Ch=
eers,</div><div>Florian<br></div></div>

<p></p>

-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/171c3741-7ebf-4383-83eb-ed68b08b10b2%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/171c3741-7ebf-4383-83eb-ed68b08b10b2=
%40isocpp.org</a>.<br />

------=_Part_2039_335946979.1539094357450--

------=_Part_2038_367397919.1539094357450--

.
