[racerd] recognise std::lock calls

Summary: std::lock allows for locking multiple lockable objects, while avoiding deadlock.  This will fix some FPs in C++.

Reviewed By: da319

Differential Revision: D7844198

fbshipit-source-id: 2b7140a
master
Nikos Gorogiannis 7 years ago committed by Facebook Github Bot
parent c99b634655
commit bef38bbf1a

@ -67,7 +67,8 @@ module Models = struct
; "folly::SharedMutexImpl::lockExclusiveImpl" ; "folly::SharedMutexImpl::lockExclusiveImpl"
; "folly::SharedMutexImpl::lockSharedImpl" ; "folly::SharedMutexImpl::lockSharedImpl"
; "std::mutex::lock" ; "std::mutex::lock"
; "std::unique_lock::lock" ] ; "std::unique_lock::lock"
; "std::lock" ]
in in
let matcher_lock_constructor = let matcher_lock_constructor =
QualifiedCppName.Match.of_fuzzy_qual_names QualifiedCppName.Match.of_fuzzy_qual_names

@ -18,6 +18,7 @@ codetoanalyze/cpp/racerd/lock_guard_with_scope.cpp, basics::LockGuardWithScope_g
codetoanalyze/cpp/racerd/lock_guard_with_scope.cpp, basics::LockGuardWithScope_get4, 0, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,access to `this.suspiciously_read`,<Write trace>,access to `this.suspiciously_read`] codetoanalyze/cpp/racerd/lock_guard_with_scope.cpp, basics::LockGuardWithScope_get4, 0, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,access to `this.suspiciously_read`,<Write trace>,access to `this.suspiciously_read`]
codetoanalyze/cpp/racerd/reporting.cpp, reporting::Basic_call1, 1, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,call to reporting::Basic_test,access to `xparam.x1.w`,<Write trace>,call to reporting::Basic_call1,call to reporting::Basic_test,access to `xparam.x1.w`] codetoanalyze/cpp/racerd/reporting.cpp, reporting::Basic_call1, 1, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,call to reporting::Basic_test,access to `xparam.x1.w`,<Write trace>,call to reporting::Basic_call1,call to reporting::Basic_test,access to `xparam.x1.w`]
codetoanalyze/cpp/racerd/reporting.cpp, reporting::Basic_test_unlock, 0, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,call to reporting::Basic_call1,call to reporting::Basic_test,access to `xparam.x1.w`,<Write trace>,call to reporting::Basic_call1,call to reporting::Basic_test,access to `xparam.x1.w`] codetoanalyze/cpp/racerd/reporting.cpp, reporting::Basic_test_unlock, 0, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,call to reporting::Basic_call1,call to reporting::Basic_test,access to `xparam.x1.w`,<Write trace>,call to reporting::Basic_call1,call to reporting::Basic_test,access to `xparam.x1.w`]
codetoanalyze/cpp/racerd/std_lock.cpp, basics::StdLock_get_bad, 0, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,access to `this.not_guarded`,<Write trace>,access to `this.not_guarded`]
codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock_get2, 3, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,access to `this.suspiciously_written1`,<Write trace>,access to `this.suspiciously_written1`] codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock_get2, 3, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,access to `this.suspiciously_written1`,<Write trace>,access to `this.suspiciously_written1`]
codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock_get2, 4, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,access to `this.suspiciously_written2`,<Write trace>,access to `this.suspiciously_written2`] codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock_get2, 4, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,access to `this.suspiciously_written2`,<Write trace>,access to `this.suspiciously_written2`]
codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock_get4, 1, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,access to `this.suspiciously_read1`,<Write trace>,access to `this.suspiciously_read1`] codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock_get4, 1, LOCK_CONSISTENCY_VIOLATION, ERROR, [<Read trace>,access to `this.suspiciously_read1`,<Write trace>,access to `this.suspiciously_read1`]

@ -0,0 +1,40 @@
/*
* Copyright (c) 2017 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
#include <mutex>
namespace basics {
class StdLock {
public:
StdLock() {}
void set_ok(StdLock* other) {
std::lock(mutex_, other->mutex_);
guarded = other->guarded;
}
int get_ok() {
mutex_.lock();
return guarded;
}
void set_bad(StdLock* other) {
std::lock(mutex_, other->mutex_);
not_guarded = other->not_guarded;
}
int get_bad() { return not_guarded; }
private:
int guarded;
int not_guarded;
std::mutex mutex_;
};
} // namespace basics
Loading…
Cancel
Save