// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_BASE_USE_AFTER_FREE_CHECKER_H_
#define MEDIA_BASE_USE_AFTER_FREE_CHECKER_H_

#include "base/debug/crash_logging.h"
#include "base/debug/dump_without_crashing.h"
#include "base/location.h"
#include "media/base/media_export.h"

namespace {

static base::debug::CrashKeyString* crash_key_string() {
  static base::debug::CrashKeyString* string = nullptr;
  if (!string) {
    string = base::debug::AllocateCrashKeyString(
        "use_after_free_checker", base::debug::CrashKeySize::Size32);
  }

  return string;
}

}  // namespace

namespace media {

// Maintains a guard value from ctor => dtor, and causes a crash if it's ever
// found to be in an incorrect state.  Includes a crash key that identifies
// whether itse use-after-free or corruption.
class MEDIA_EXPORT UseAfterFreeChecker {
 public:
  inline ~UseAfterFreeChecker() {
    check();
    state_ = State::kDestructed;
  }

  void check() {
    if (state_ != State::kConstructed) {
      base::debug::ScopedCrashKeyString scoped(
          crash_key_string(),
          state_ == State::kDestructed ? "destructed" : "corrupt");
      CHECK(false);
    }
  }

 private:
  enum State : uint64_t {
    kConstructed = 0x80C0FFEE,
    kDestructed = 0xDEADC0DE,
  };

  // Declare this as an int rather than State, to avoid undefinedness if it gets
  // overwritten with an arbitrary value.
  uint64_t state_ = State::kConstructed;
};

}  // namespace media

#endif  // MEDIA_BASE_USE_AFTER_FREE_CHECKER_H_
