Suppress clang-analyzer false positive

Summary:
Fixing two types of clang-analyzer false positives:
* db is deleted and then reopen, and clang-analyzer thinks we are reusing the pointer after it has been deleted. Adding asserts to hint clang-analyzer the pointer is recreated.
* ParsedInternalKey is (intentionally) uninitialized. Initialize the struct only when clang-analyzer is running.
Closes https://github.com/facebook/rocksdb/pull/2334

Differential Revision: D5093801

Pulled By: yiwu-arbug

fbshipit-source-id: f51355382098eb3da5ab9f64e094c6d03e6bdf7d
This commit is contained in:
Yi Wu 2017-05-19 10:43:11 -07:00 committed by Facebook Github Bot
parent 217b866f47
commit d746aead1a
5 changed files with 24 additions and 2 deletions

View File

@ -933,7 +933,12 @@ void DBIter::FindPrevUserKey() {
return; return;
} }
size_t num_skipped = 0; size_t num_skipped = 0;
// Suppress false positive clang analyzer warnings.
#ifdef __clang_analyzer__
ParsedInternalKey ikey(Slice(), 0, 0);
#else
ParsedInternalKey ikey; ParsedInternalKey ikey;
#endif // __clang_analyzer__
FindParseableKey(&ikey, kReverse); FindParseableKey(&ikey, kReverse);
int cmp; int cmp;
while (iter_->Valid() && while (iter_->Valid() &&

View File

@ -258,13 +258,15 @@ __attribute__((__no_sanitize_undefined__))
void CloseDB() { void CloseDB() {
delete db_; delete db_;
db_ = NULL; db_ = nullptr;
} }
Status OpenDB() { Status OpenDB() {
CloseDB(); CloseDB();
env_->ResetState(); env_->ResetState();
return DB::Open(options_, dbname_, &db_); Status s = DB::Open(options_, dbname_, &db_);
assert(db_ != nullptr);
return s;
} }
void DeleteAllData() { void DeleteAllData() {

View File

@ -115,8 +115,10 @@ TEST_F(SpatialDBTest, TestNextID) {
ASSERT_OK(db_->Insert(WriteOptions(), BoundingBox<double>(10, 10, 15, 15), ASSERT_OK(db_->Insert(WriteOptions(), BoundingBox<double>(10, 10, 15, 15),
"two", FeatureSet(), {"simple"})); "two", FeatureSet(), {"simple"}));
delete db_; delete db_;
db_ = nullptr;
ASSERT_OK(SpatialDB::Open(SpatialDBOptions(), dbname_, &db_)); ASSERT_OK(SpatialDB::Open(SpatialDBOptions(), dbname_, &db_));
assert(db_ != nullptr);
ASSERT_OK(db_->Insert(WriteOptions(), BoundingBox<double>(55, 55, 65, 65), ASSERT_OK(db_->Insert(WriteOptions(), BoundingBox<double>(55, 55, 65, 65),
"three", FeatureSet(), {"simple"})); "three", FeatureSet(), {"simple"}));
delete db_; delete db_;
@ -177,6 +179,7 @@ TEST_F(SpatialDBTest, SimpleTest) {
{SpatialIndexOptions("index", BoundingBox<double>(0, 0, 128, 128), {SpatialIndexOptions("index", BoundingBox<double>(0, 0, 128, 128),
3)})); 3)}));
ASSERT_OK(SpatialDB::Open(SpatialDBOptions(), dbname_, &db_)); ASSERT_OK(SpatialDB::Open(SpatialDBOptions(), dbname_, &db_));
assert(db_ != nullptr);
ASSERT_OK(db_->Insert(WriteOptions(), BoundingBox<double>(33, 17, 63, 79), ASSERT_OK(db_->Insert(WriteOptions(), BoundingBox<double>(33, 17, 63, 79),
"one", FeatureSet(), {"index"})); "one", FeatureSet(), {"index"}));
@ -193,6 +196,7 @@ TEST_F(SpatialDBTest, SimpleTest) {
if (iter == 1) { if (iter == 1) {
delete db_; delete db_;
db_ = nullptr;
ASSERT_OK(SpatialDB::Open(SpatialDBOptions(), dbname_, &db_, true)); ASSERT_OK(SpatialDB::Open(SpatialDBOptions(), dbname_, &db_, true));
} }
@ -214,6 +218,7 @@ TEST_F(SpatialDBTest, SimpleTest) {
{"three", "five"}); {"three", "five"});
delete db_; delete db_;
db_ = nullptr;
} }
} }

View File

@ -47,6 +47,7 @@ class OptimisticTransactionTest : public testing::Test {
void Reopen() { void Reopen() {
delete txn_db; delete txn_db;
txn_db = nullptr;
Open(); Open();
} }
@ -54,6 +55,7 @@ private:
void Open() { void Open() {
Status s = OptimisticTransactionDB::Open(options, dbname, &txn_db); Status s = OptimisticTransactionDB::Open(options, dbname, &txn_db);
assert(s.ok()); assert(s.ok());
assert(txn_db != nullptr);
db = txn_db->GetBaseDB(); db = txn_db->GetBaseDB();
} }
}; };
@ -465,6 +467,7 @@ TEST_F(OptimisticTransactionTest, ColumnFamiliesTest) {
delete cfa; delete cfa;
delete cfb; delete cfb;
delete txn_db; delete txn_db;
txn_db = nullptr;
// open DB with three column families // open DB with three column families
std::vector<ColumnFamilyDescriptor> column_families; std::vector<ColumnFamilyDescriptor> column_families;
@ -480,6 +483,7 @@ TEST_F(OptimisticTransactionTest, ColumnFamiliesTest) {
s = OptimisticTransactionDB::Open(options, dbname, column_families, &handles, s = OptimisticTransactionDB::Open(options, dbname, column_families, &handles,
&txn_db); &txn_db);
ASSERT_OK(s); ASSERT_OK(s);
assert(txn_db != nullptr);
db = txn_db->GetBaseDB(); db = txn_db->GetBaseDB();
Transaction* txn = txn_db->BeginTransaction(write_options); Transaction* txn = txn_db->BeginTransaction(write_options);

View File

@ -2113,6 +2113,7 @@ TEST_P(TransactionTest, ColumnFamiliesTest) {
delete cfa; delete cfa;
delete cfb; delete cfb;
delete db; delete db;
db = nullptr;
// open DB with three column families // open DB with three column families
std::vector<ColumnFamilyDescriptor> column_families; std::vector<ColumnFamilyDescriptor> column_families;
@ -2129,6 +2130,7 @@ TEST_P(TransactionTest, ColumnFamiliesTest) {
s = TransactionDB::Open(options, txn_db_options, dbname, column_families, s = TransactionDB::Open(options, txn_db_options, dbname, column_families,
&handles, &db); &handles, &db);
assert(db != nullptr);
ASSERT_OK(s); ASSERT_OK(s);
Transaction* txn = db->BeginTransaction(write_options); Transaction* txn = db->BeginTransaction(write_options);
@ -2810,10 +2812,12 @@ TEST_P(TransactionTest, LockLimitTest) {
Status s; Status s;
delete db; delete db;
db = nullptr;
// Open DB with a lock limit of 3 // Open DB with a lock limit of 3
txn_db_options.max_num_locks = 3; txn_db_options.max_num_locks = 3;
s = TransactionDB::Open(options, txn_db_options, dbname, &db); s = TransactionDB::Open(options, txn_db_options, dbname, &db);
assert(db != nullptr);
ASSERT_OK(s); ASSERT_OK(s);
// Create a txn and verify we can only lock up to 3 keys // Create a txn and verify we can only lock up to 3 keys
@ -3736,6 +3740,7 @@ TEST_P(TransactionTest, TimeoutTest) {
Status s; Status s;
delete db; delete db;
db = nullptr;
// transaction writes have an infinite timeout, // transaction writes have an infinite timeout,
// but we will override this when we start a txn // but we will override this when we start a txn
@ -3744,6 +3749,7 @@ TEST_P(TransactionTest, TimeoutTest) {
txn_db_options.default_lock_timeout = -1; txn_db_options.default_lock_timeout = -1;
s = TransactionDB::Open(options, txn_db_options, dbname, &db); s = TransactionDB::Open(options, txn_db_options, dbname, &db);
assert(db != nullptr);
ASSERT_OK(s); ASSERT_OK(s);
s = db->Put(write_options, "aaa", "aaa"); s = db->Put(write_options, "aaa", "aaa");