mirror of
https://github.com/facebookincubator/mvfst.git
synced 2025-07-29 03:41:11 +03:00
remove virtual destructor in quic::PriorityQueue::Priority
Summary: fix for OSS issue reported in https://github.com/facebook/mvfst/issues/382 UndefinedBehaviorSanitizer: dynamic-type-mismatch buck-out/v2/gen/fbcode/12f4c1ea6c843aab/quic/priority/__http_priority_queue__/buck-headers/quic/priority/HTTPPriorityQueue.h:133:9 buck-out/v2/gen/fbcode/12f4c1ea6c843aab/quic/priority/__http_priority_queue__/buck-headers/quic/priority/HTTPPriorityQueue.h:76:23: runtime error: member call on address 0x51a0000026b8 which does not point to an object of type 'quic::HTTPPriorityQueue::Priority' 0x51a0000026b8: note: object is of type 'quic::PriorityQueue::Priority' be be be be 10 1b 13 02 00 00 00 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 00 00 00 00 ^~~~~~~~~~~~~~~~~~~~~~~ vptr for 'quic::PriorityQueue::Priority' #0 0x000000e36302 in quic::HTTPPriorityQueue::Priority::operator==(quic::HTTPPriorityQueue::Priority const&) const fbcode/quic/priority/HTTPPriorityQueue.h:76 ``` Reviewed By: mjoras Differential Revision: D73674107 fbshipit-source-id: 4934e404cf6298d6351d4b45f676a8a83838f91f
This commit is contained in:
committed by
Facebook GitHub Bot
parent
b49e49ed1b
commit
6a52a365ab
@ -13,6 +13,23 @@ constexpr size_t kDestroyIndexThreshold = 50;
|
||||
} // namespace
|
||||
|
||||
namespace quic {
|
||||
|
||||
/*implicit*/ HTTPPriorityQueue::Priority::Priority(
|
||||
const PriorityQueue::Priority& basePriority)
|
||||
: PriorityQueue::Priority(basePriority) {
|
||||
if (!isInitialized()) {
|
||||
getFields() = kDefaultPriority;
|
||||
}
|
||||
}
|
||||
|
||||
HTTPPriorityQueue::Priority::Priority(uint8_t u, bool i, OrderId o) {
|
||||
auto& fields = getFields();
|
||||
fields.urgency = u;
|
||||
fields.incremental = i;
|
||||
fields.order = (i ? 0 : o);
|
||||
fields.paused = false;
|
||||
}
|
||||
|
||||
PriorityQueue::PriorityLogFields HTTPPriorityQueue::toLogFields(
|
||||
const PriorityQueue::Priority& pri) const {
|
||||
// This is defined by the QLOG schema
|
||||
|
@ -41,20 +41,9 @@ class HTTPPriorityQueue : public quic::PriorityQueue {
|
||||
// TODO: change default priority to (3, false, false, 0) to match spec
|
||||
static constexpr HTTPPriority kDefaultPriority{3, false, true, 0};
|
||||
|
||||
/*implicit*/ Priority(const PriorityQueue::Priority& basePriority)
|
||||
: PriorityQueue::Priority(basePriority) {
|
||||
if (!isInitialized()) {
|
||||
getFields() = kDefaultPriority;
|
||||
}
|
||||
}
|
||||
/*implicit*/ Priority(const PriorityQueue::Priority& basePriority);
|
||||
|
||||
Priority(uint8_t u, bool i, OrderId o = 0) {
|
||||
auto& fields = getFields();
|
||||
fields.urgency = u;
|
||||
fields.incremental = i;
|
||||
fields.order = (i ? 0 : o);
|
||||
fields.paused = false;
|
||||
}
|
||||
Priority(uint8_t u, bool i, OrderId o = 0);
|
||||
|
||||
enum Paused { PAUSED };
|
||||
|
||||
@ -66,7 +55,7 @@ class HTTPPriorityQueue : public quic::PriorityQueue {
|
||||
Priority& operator=(const Priority&) = default;
|
||||
Priority(Priority&&) = default;
|
||||
Priority& operator=(Priority&&) = default;
|
||||
~Priority() override = default;
|
||||
~Priority() = default;
|
||||
|
||||
const HTTPPriority* operator->() const {
|
||||
return &getFields();
|
||||
@ -94,7 +83,7 @@ class HTTPPriorityQueue : public quic::PriorityQueue {
|
||||
}
|
||||
|
||||
[[nodiscard]] uint64_t toUint64() const {
|
||||
auto& fields = getFields();
|
||||
const auto& fields = getFields();
|
||||
return (
|
||||
(uint64_t(fields.urgency) << 61) | (uint64_t(fields.paused) << 60) |
|
||||
(uint64_t(fields.incremental) << 59) | fields.order);
|
||||
|
@ -122,7 +122,7 @@ class PriorityQueue {
|
||||
public:
|
||||
Priority() : storage_{kUninitialized} {}
|
||||
|
||||
virtual ~Priority() = default;
|
||||
~Priority() = default;
|
||||
|
||||
[[nodiscard]] bool isInitialized() const {
|
||||
return storage_ != kUninitialized;
|
||||
@ -133,16 +133,14 @@ class PriorityQueue {
|
||||
|
||||
template <typename T>
|
||||
T& getPriority() {
|
||||
static_assert(
|
||||
std::is_trivially_copyable<T>::value, "T must be trivially copyable");
|
||||
static_assert(std::is_pod<T>::value, "T must be trivially copyable");
|
||||
static_assert(sizeof(T) <= sizeof(StorageType), "T must fit in storage_");
|
||||
return *reinterpret_cast<T*>(storage_.data());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
const T& getPriority() const {
|
||||
static_assert(
|
||||
std::is_trivially_copyable<T>::value, "T must be trivially copyable");
|
||||
static_assert(std::is_pod<T>::value, "T must be trivially copyable");
|
||||
static_assert(sizeof(T) <= sizeof(StorageType), "T must fit in storage_");
|
||||
return *reinterpret_cast<const T*>(storage_.data());
|
||||
}
|
||||
|
Reference in New Issue
Block a user