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:
parent
217b866f47
commit
d746aead1a
@ -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() &&
|
||||||
|
@ -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() {
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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");
|
||||||
|
Loading…
Reference in New Issue
Block a user