On Fri, Jan 1, 2016, at 11:58 PM, Kevin Ballard wrote:
> On Fri, Jan 1, 2016, at 11:25 PM, Chris Lattner via swift-evolution wrote:
> > > On Dec 31, 2015, at 1:56 PM, Dave Abrahams <dabrah...@apple.com> wrote:
> > >>> 2) Adding asserts to code should not make the code more dangerous 
> > >>> whatever the build. Assuming the truth of the assert may lead to 
> > >>> runtime safety checks being skipped and undefined behaviour when a 
> > >>> no-op would be a safe behaviour.
> > >> 
> > >> This only affects code built with -Ounchecked, which is definitely not a 
> > >> safe mode to build your code.  The intention of this mode is that you 
> > >> can use it to get a performance boost, if you believe your code to be 
> > >> sufficiently tested.  This mode, which isn’t the default in any way, 
> > >> intentionally takes the guard rails off to get better performance.
> > >> 
> > >> If you don’t like that model, don’t use this mode.
> > > 
> > > Let’s just consider -O; I think I understand Joseph’s objection here, and 
> > > it seems valid.
> > 
> > Ah, good point.
> > 
> > > Normally in -O, we say that if you stay in the “safe subset” of Swift 
> > > code, you never get undefined behavior, even if there’s a bug in your 
> > > code.  You might get *unpredictable* behavior of course, but presumably 
> > > guaranteeing no undefined behavior rules out large classes of problems, 
> > > including many security holes.  Now suppose you decide to be responsible 
> > > and add some asserts to help you catch bugs during development.  
> > > Hopefully they help you catch all the bugs, but what if they don’t?  All 
> > > of a sudden, if you still have a bug when you ship, you now have 
> > > undefined behavior.  As much as I’m a fan of assertions having 
> > > optimization benefits, It seems a little perverse that using them could 
> > > make shipping code less secure.
> > 
> > Yes, I agree.  -O should not imply undefined behavior in the case of an 
> > assert() predicate being dynamically false.
> > 
> > It sounds like we just need a documentation update here?
> 
> assert() and assertionFailure() are already explicitly documented as doing 
> nothing in -O builds, and only making the assumption that the condition is 
> always true/function is never called in -Ounchecked builds.
> 
> As far as I can tell, the only actual inaccuracy in the documentation is the 
> fact that assert() claims that the optimizer may assume the condition is 
> always true in -Ounchecked when it doesn't seem to actually do that (because 
> it doesn't do anything at all when not using -Onone). Both assert() and 
> assertionFailure() do nothing in -O, which matches the documentation.

Having said that, it occurs to me that maybe the optimizer is actually 
specially detecting the call to assert() under -Ounchecked, but from the source 
of assert() there's nothing there to indicate that it actually makes any 
assumptions under -Ounchecked.

-Kevin Ballard
_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to