________________________________________________________
Message: 2
Date: Wed, 4 Jun 2014 08:15:08 -0400
From: Jeff Garzik <[email protected]>
Subject: Re: [Bitcoin-development] # error "Bitcoin cannot
be compiled
without assertions." <<<<NOT
To: Mike Hearn <[email protected]>
Cc: "[email protected]"
<[email protected]>,
Ron <[email protected]>
Message-ID:
<cajhla0ptthfvd-1br5s2k-4uw6v6qleyabf2ysrxoosjth9...@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8
Yes, check macros like that can be useful.
I like the kernel's policy, which parallels our direction:
1) Enable and use lightweight assertions for most users.
2) No assertions with side effects
If you want to compile them out, that's fine, but they
should always
be present in production software.
_____________________________________________________
I don't think many of you actually read what I said, and you went off on your
own tangents.
I said:
this commit and code with all side effects removed from the assertions.
in Vol 37, Issue 4
I intentionally left the gcc code alone. Only the MSC code is assert "fixed".
I would have hoped that someone would have noticed and incorporated these
changes into the gcc code. Simply by removing the #ifdef _MSC_VER ... #else
... #endif etc. etc.
Did I say I compiled them out? No! Did anyone bother to look at my code or
what I said?
Here is an example from main.cpp CTransaction::UpdateCoins(...
- // add outputs
+ // add outputs sure looks like an assert with side effects here!?
+#ifdef _MSC_VER
+ bool
+ fTest = inputs.SetCoins(txhash, CCoins(*this, nHeight));
+ #ifdef _DEBUG
+ assert(fTest);
+ #else
+ if( !fTest )
+ releaseModeAssertionfailure( __FILE__, __LINE__, __PRETTY_FUNCTION__ );
+ #endif
+#else
assert(inputs.SetCoins(txhash, CCoins(*this, nHeight)));
+#endif
Note that I do the test, and if debugging, I let it abort() the program if it
fails. Note that in release mode it calls a new function on failure, that I
leave you to discover what it does. I see that this assert has been "fixed" in
0.9.x, but I think my "fix" is better, since it allows release mode code to run
better, if not identically.
I changed every assert() in the bitcoind 086 sources to behave this way. Since
C++ is perniciously baroque, it is not clear if a side effect can or has
occurred in the most innocuous of C++ statements. Is the example above
side-effect free?
Here is a piece of what I made my decision on:
http://www.gnu.org/software/libc/manual/html_node/Consistency-Checking.html and
the link to the book previously given.
Also, no one answered the question about bitcoin-qt, to whit, can or should it
be compiled in RELEASE mode because of this? Should it have always been
compiled in DEBUG mode in the past too?
Ron
------------------------------------------------------------------------------
Learn Graph Databases - Download FREE O'Reilly Book
"Graph Databases" is the definitive new guide to graph databases and their
applications. Written by three acclaimed leaders in the field,
this first edition is now available. Download your free book today!
http://p.sf.net/sfu/NeoTech
_______________________________________________
Bitcoin-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/bitcoin-development