I have just found ~30 bugs in our code, where someone wrote:
vector<int> v;
...
v.empty(); // v.clear() was intended!
No problem, I'll just add warn_unused_result to vector::empty(), right?
Well, that did expose the 30 bugs above, but unfortunately I can't do that permanently, because it also exposed this false positive:
assert(v.empty());
where assert in NDEBUG mode expanded into
static_cast<void>(v.empty());
and triggered the warning :-(
P.S. Some of the bugs I found were in parts of the code imported from open-source projects, so it's not a problem that is specific to just Google. If the assert problem could be addressed, adding warn_unused_result to trunk libstdc++ would benefit everyone.
Google ref: b/16983603.
I wouldn't call this bug fixed.
I have just found ~30 bugs in our code, where someone wrote:
vector<int> v;
...
v.empty(); // v.clear() was intended!
No problem, I'll just add warn_unused_result to vector::empty(), right?
Well, that did expose the 30 bugs above, but unfortunately I can't do that permanently, because it also exposed this false positive:
assert( v.empty( ));
where assert in NDEBUG mode expanded into
static_ cast<void> (v.empty( ));
and triggered the warning :-(
P.S. Some of the bugs I found were in parts of the code imported from open-source projects, so it's not a problem that is specific to just Google. If the assert problem could be addressed, adding warn_unused_result to trunk libstdc++ would benefit everyone.