From bef38bbf1a4f9337f910a5c9cb8fdfefa1431950 Mon Sep 17 00:00:00 2001 From: Nikos Gorogiannis Date: Fri, 4 May 2018 01:49:51 -0700 Subject: [PATCH] [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 --- infer/src/concurrency/RacerDConfig.ml | 3 +- .../tests/codetoanalyze/cpp/racerd/issues.exp | 1 + .../codetoanalyze/cpp/racerd/std_lock.cpp | 40 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 infer/tests/codetoanalyze/cpp/racerd/std_lock.cpp diff --git a/infer/src/concurrency/RacerDConfig.ml b/infer/src/concurrency/RacerDConfig.ml index 770113490..da7e3c181 100644 --- a/infer/src/concurrency/RacerDConfig.ml +++ b/infer/src/concurrency/RacerDConfig.ml @@ -67,7 +67,8 @@ module Models = struct ; "folly::SharedMutexImpl::lockExclusiveImpl" ; "folly::SharedMutexImpl::lockSharedImpl" ; "std::mutex::lock" - ; "std::unique_lock::lock" ] + ; "std::unique_lock::lock" + ; "std::lock" ] in let matcher_lock_constructor = QualifiedCppName.Match.of_fuzzy_qual_names diff --git a/infer/tests/codetoanalyze/cpp/racerd/issues.exp b/infer/tests/codetoanalyze/cpp/racerd/issues.exp index 4222172d4..95bf8a710 100644 --- a/infer/tests/codetoanalyze/cpp/racerd/issues.exp +++ b/infer/tests/codetoanalyze/cpp/racerd/issues.exp @@ -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, [,access to `this.suspiciously_read`,,access to `this.suspiciously_read`] codetoanalyze/cpp/racerd/reporting.cpp, reporting::Basic_call1, 1, LOCK_CONSISTENCY_VIOLATION, ERROR, [,call to reporting::Basic_test,access to `xparam.x1.w`,,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, [,call to reporting::Basic_call1,call to reporting::Basic_test,access to `xparam.x1.w`,,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, [,access to `this.not_guarded`,,access to `this.not_guarded`] codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock_get2, 3, LOCK_CONSISTENCY_VIOLATION, ERROR, [,access to `this.suspiciously_written1`,,access to `this.suspiciously_written1`] codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock_get2, 4, LOCK_CONSISTENCY_VIOLATION, ERROR, [,access to `this.suspiciously_written2`,,access to `this.suspiciously_written2`] codetoanalyze/cpp/racerd/unique_lock.cpp, basics::UniqueLock_get4, 1, LOCK_CONSISTENCY_VIOLATION, ERROR, [,access to `this.suspiciously_read1`,,access to `this.suspiciously_read1`] diff --git a/infer/tests/codetoanalyze/cpp/racerd/std_lock.cpp b/infer/tests/codetoanalyze/cpp/racerd/std_lock.cpp new file mode 100644 index 000000000..e4e99a1d3 --- /dev/null +++ b/infer/tests/codetoanalyze/cpp/racerd/std_lock.cpp @@ -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 + +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