আনর্ডার্ড_ম্যাপ চলাকালীন মেমরি ফাঁস :: জিসিসির সাথে কী-ব্যতিক্রম সন্নিবেশ করান - শক্তিশালী ব্যতিক্রম সুরক্ষা গ্যারান্টি ভঙ্গ করছেন?


10

আমি জিসিসি 7.3.1 ব্যবহার করছি, তবে কলিরুতেও পরীক্ষা করেছি, যা আমার বিশ্বাস সংস্করণ 9.2.0। নিম্নলিখিত দিয়ে তৈরি করুন:

g++ -fsanitize=address -fno-omit-frame-pointer rai.cpp

এখানে rai.cpp:

#include <iostream>
#include <unordered_map>

int main()
{
    try
    {
        struct MyComp {
            bool operator()(const std::string&, const std::string&) const {
                throw std::runtime_error("Nonono");
            }
        };

        std::unordered_map<std::string, std::string, std::hash<std::string>, MyComp> mymap;
        mymap.insert(std::make_pair("Hello", "There"));
        mymap.insert(std::make_pair("Hello", "There")); // Hash match forces compare
    } catch (const std::exception& e) {
        std::cerr << "Caught exception: " << e.what() << "\n";
    }
}

এটি চালানোর ফলাফল:

> ./a.out
Caught exception: Nonono

=================================================================
==72432==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 32 byte(s) in 1 object(s) allocated from:
...

Direct leak of 4 byte(s) in 1 object(s) allocated from:
...

Indirect leak of 60 byte(s) in 2 object(s) allocated from:
...

SUMMARY: AddressSanitizer: 96 byte(s) leaked in 4 allocation(s).

আমি ভিজ্যুয়াল সি ++ ( Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314 for x64) এর সাথে কোনও মেমরি ফাঁস দেখতে পাচ্ছি না ।

এটি কি unordered_map::insert( https://stackoverflow.com/a/11699271/1958315 ) এর দৃ exception় ব্যতিক্রমের সুরক্ষা গ্যারান্টিটি ভঙ্গ করে ? এটি কি জিসিসি এসটিএলে একটি বাগ আছে?


এসটিএল কেবল এটির ব্যতিক্রমগুলি ধরতে চলেছে (যদি তা পারে)। এটি আক্রমণকারী ভেঙে আপনার বিরুদ্ধে রক্ষা করবে না। এটি সম্পর্কে ভাল সিপিপিসন আলোচনা: youtube.com/…
নাথান অলিভার

1
@ নাথান অলিভার-রিইনস্টেটমোনিকা সম্ভবত ডকুমেন্টেশনগুলি তখন আপডেট করা দরকার, যেমন std::unordered_map::insertপরিষ্কার স্পষ্টভাবে বলা হয়েছে "1-4) যদি কোনও অপারেশন দ্বারা ব্যতিক্রম ছুঁড়ে ফেলা হয় তবে সন্নিবেশটির কোনও প্রভাব নেই।" (জোর দেওয়া আমার) এখান থেকে en.cppreferences.com/w/cpp/container/unordered_map/insert
স্লাভা

libc ++ এই প্রোগ্রামটি চালানোর সময় কোনও মেমরি ফাঁস করে না।
মার্শাল ক্লো

@ নাথান অলিভার-রিইনস্টেটমোনিকা এটি বাজে কথা। স্ট্যান্ডার্ড লাইব্রেরিতে ব্যবহারকারী যে ধরণের সংজ্ঞা দেয় তার ব্যতিক্রমগুলি পরিচালনা করতে হবে। এখানে কোনও ভাঙা আক্রমণকারী নেই।
জোনাথন ওয়েকেলি

@ রাই এটি একটি বাগ, দয়া করে এটি রিপোর্ট করুন gcc.gnu.org/bugs
জোনাথন ওয়াকলি

উত্তর:


2

গ্যারান্টি মান দ্বারা বাধ্যতামূলক (সর্বশেষ খসড়া থেকে উদ্ধৃতি):

[Container.requirements.general]

অন্যথায় সুনির্দিষ্ট না করে ([এসোসিয়েটিভ.আরইকিমিটস.সেসপেট]], [আনর্ডার.রেক.এক্সেপ্ট]], [ডেক.মোডিফায়ার্স], এবং [ভেক্টর.মডিফায়ার্স]) এই ধারায় বর্ণিত সমস্ত ধারক নিম্নলিখিত অতিরিক্ত প্রয়োজনীয়তা পূরণ করে:

  • কোনও একক উপাদান সন্নিবেশ করার সময় যদি কোনও ব্যতিক্রম কোনও সন্নিবেশ () বা এমপ্লেস () ফাংশন দিয়ে ফেলে দেওয়া হয়, তবে সেই ফাংশনের কোনও প্রভাব নেই।

[Associative.reqmts.except]

সাহসী পাত্রে, যদি কোনও elementোকানো বা একক উপাদান empোকানো এমপ্যাসের ক্রিয়াকলাপের মধ্যে থেকে কোনও অপারেশন দ্বারা ব্যতিক্রম ছুঁড়ে দেওয়া হয় তবে সন্নিবেশটির কোনও প্রভাব নেই।

[Unord.req.except]

আনর্ডার্ড অ্যাসোসিয়েটিভ ধারকগুলির জন্য, যদি কোনও elementোকানো বা একক উপাদান প্রবেশকরণের ফাংশনটি এম্পলেসের মধ্যে থেকে ধারকটির হ্যাশ ফাংশন ব্যতীত অন্য কোনও ক্রিয়াকলাপ ব্যতিক্রম হয় তবে সন্নিবেশটির কোনও প্রভাব নেই no

আমি যতদূর বুঝতে পেরেছি, "এর কোনও প্রভাব নেই" বোঝায় "মেমরি ফাঁস হয় না"। এই জাতীয় ব্যাখ্যার অধীনে, আমি একটি ফুটোকে বাগ হিসাবে বিবেচনা করব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.