# V1088. No objects are passed to the 'std::scoped_lock' constructor. No locking will be performed. This can cause concurrency issues.

The analyzer has detected a problem. An object of the 'std::scoped_lock' type is constructed without arguments passed to it — i.e., without lockable objects. This can lead to problems in a multithreaded application: race condition, data race, etc.

Since C++17, the standard library has 'std::scoped_lock' class template. It was implemented as a convenient alternative to 'std::lock_guard'. We can use 'std::scoped_lock' when we need to lock an arbitrary number of lockable objects at a time. The class provides an algorithm that prevents deadlocks.

However, the new design has certain disadvantages. Let's see how we can declare one of its constructors:

    template <class ...MutexTypes>
    class scoped_lock
    {
      // ....
    public:
      explicit scoped_lock(MutexTypes &...m);
      // ....
    };

The constructor receives an arbitrary number of arguments of the 'MutexTypes' (parameter pack) type. The parameter pack 'MutexTypes' can be empty. As a result, we can get a RAII object without locks:

    void bad()
    {
      // ....
      std::scoped_lock lock;
      // ....
    }

To fix this, we should initialize 'std::scoped_lock' with a lockable object:

    std::mutex mtx;

    void good()
    {
      // ....
      std::scoped_lock lock { mtx };
      // ....
    }

This diagnostic is classified as:

CWE-821 CERT-CON43-C