যতটা সম্ভব বাইটে স্মৃতি ফাঁস করুন


79

আপনার কাজটি এমন কোড লিখন যা কমপক্ষে একটি বাইট মেমোরি যতটা সম্ভব কম বাইটে ফাঁস হবে। কেবল বরাদ্দ নয় মেমরিটি ফাঁস হতে হবে ।

ফাঁস মেমরি হ'ল মেমরি যা প্রোগ্রামটি বরাদ্দ করে তবে এটি মেমরিটিকে সঠিকভাবে বিলোপ করার আগে অ্যাক্সেসের ক্ষমতা হারিয়ে ফেলে। বেশিরভাগ উচ্চ স্তরের ভাষার জন্য এই স্মৃতিটি গাদাতে বরাদ্দ করতে হয়।

সি ++ এর একটি উদাহরণ নিম্নলিখিত প্রোগ্রাম হবে:

int main(){new int;}

এই করে তোলে new intএটি একটি পয়েন্টার ছাড়া গাদা উপর। এই স্মৃতিটি তাত্ক্ষণিকভাবে ফাঁস হয়ে গেছে কারণ আমাদের কাছে এটি অ্যাক্সেস করার কোনও উপায় নেই।

এখানে ভালগ্রাইন্ডের থেকে ফুটা সংক্ষিপ্তসারটি দেখতে পাওয়া যায়:

LEAK SUMMARY:
   definitely lost: 4 bytes in 1 blocks
   indirectly lost: 0 bytes in 0 blocks
     possibly lost: 0 bytes in 0 blocks
   still reachable: 0 bytes in 0 blocks
        suppressed: 0 bytes in 0 blocks

অনেক ভাষার মেমোরি ডিবাগার থাকে (যেমন ভালগ্রাইন্ড ) আপনি যদি মেমরি ফাঁস করেছেন তা নিশ্চিত করতে আপনি যদি এই জাতীয় ডিবাগার থেকে আউটপুট অন্তর্ভুক্ত করতে পারেন তবে।

লক্ষ্যটি হ'ল আপনার উত্সে বাইট সংখ্যা হ্রাস করা।


2
সম্ভবত আপনার বিভিন্ন পরিমাণের ফাঁস হতে পারে এবং আপনি কতটা ফাঁস করে তার উপর নির্ভর করে আপনার বাইট গণনার x% হারাবেন
ক্রিস্টোফার

11
@ ক্রিস্টোফারপিয়ার্ট একজনের জন্য আমি চ্যালেঞ্জগুলির জন্য বোনাসের অনুরাগী নই এবং দুজনের জন্য আপনি ইতিমধ্যে দেখিয়েছেন যে আনবাউন্ডেড মেমোরি ফাঁস করা খুব সহজ।
শ্রুতচিলিজম ও'জাইক

1
সম্পর্কিত । যদিও কোনও সদৃশ নয়, কারণ এই প্রশ্নের বেশিরভাগ উত্তর আসলে স্মৃতিশক্তি ফাঁস হওয়ার চেয়ে স্মৃতিতে একটি অসীম ਪਹੁੰਚযোগ্য কাঠামো গঠন করে।

2
ধারণা কি? মেমো কি মুক্তি দেওয়া যায় না? আমার ধারণা, আবর্জনা সংগ্রহ করা ভাষা বা বাগ শোষণের জন্য এটির জন্য দেশীয় মৃত্যুদন্ডের প্রয়োজন হবে।
akostadinov

7
আমি দেখছি যে গল্ফিংয়ের জন্য ডিজাইন করা ভাষাগুলি কীভাবে
এটির জন্য খারাপভাবে

উত্তর:


89

পার্ল (5.22.2), 0 বাইট

এটি অনলাইন চেষ্টা করুন!

আমি জানতাম যে এখানে কোনও ভাষা থাকবে যা একটি খালি প্রোগ্রামটিতে মেমরি ফাঁস করে। আমি এটি একটি ইওসোলং হিসাবে প্রত্যাশা করছিলাম, তবে perlএটি কোনও প্রোগ্রামের স্মৃতি ফাঁস করে দেয়। (আমি ধরে নিচ্ছি যে এটি ইচ্ছাকৃত, কারণ মেমরি মুক্ত করা যদি আপনি জানেন যে আপনি যেভাবেই প্রস্থান করতে যাচ্ছেন ঠিক সময় নষ্ট করছেন; যেমন, আজকাল সাধারণ পরামর্শটি হ'ল একবার আপনার প্রোগ্রামের প্রস্থান রুটিনে চলে আসার পরে বাকি কোনও স্মৃতিই ফাঁস করা to ।)

প্রতিপাদন

$ echo -n | valgrind perl
snip
==18517== 
==18517== LEAK SUMMARY:
==18517==    definitely lost: 8,134 bytes in 15 blocks
==18517==    indirectly lost: 154,523 bytes in 713 blocks
==18517==      possibly lost: 0 bytes in 0 blocks
==18517==    still reachable: 0 bytes in 0 blocks
==18517==         suppressed: 0 bytes in 0 blocks
==18517== 
==18517== For counts of detected and suppressed errors, rerun with: -v
==18517== ERROR SUMMARY: 15 errors from 15 contexts (suppressed: 0 from 0)

16
আমি আনলম্বদা উত্তরটি পছন্দ করেছি, তবে এটি একটি (আইএমএইচও) খুব প্রসারিত, কারণ স্পষ্টতই অনুবাদক নিজেই যা স্মৃতি ফাঁস করে, অর্থাৎ আমি অবশ্যই হারিয়ে ফেলেছি: 14 ব্লকের মধ্যে 7,742 বাইটtes যখন আমি perl --versionআমার মেশিনে চালিত করি ` এটি সত্ত্বেও এটি কোনও প্রোগ্রাম চালায় না।
জেপেলিন

11
@ জেপেলিন: একমত হয়েছে, তবে আমাদের বিধি অনুসারে, এটি প্রয়োগকরণ যা ভাষার সংজ্ঞা দেয়, সুতরাং যদি প্রয়োগটি মেমরি ফাঁস করে, ভাষাটির সমস্ত প্রোগ্রাম লিক মেমোরি করে। আমি অবশ্যই এই নিয়মের সাথে একমত হওয়ার বিষয়ে নিশ্চিত নই, তবে এই মুহুর্তে এটি সত্যিই পরিবর্তন করতে সক্ষম হওয়ার জন্য খুব বেশি জড়িত।

8
এটি নোড জেএসেও কাজ করে।
ডেনিস

6
এটি মেকিংয়ে একটি নতুন স্ট্যান্ডার্ড ফাঁকফুলের মতো মনে হচ্ছে ...
মাইকেল হ্যাম্পটন

46
অবশেষে একটি পার্ল স্ক্রিপ্ট যা আমি বুঝতে পারি।
ব্যবহারকারী 11153

66

সি, 48 31 22 বাইট

সতর্কতা: এটিকে বহুবার চালাবেন না।

প্রচুর সহায়তা / ধারণার জন্য ডেনিসকে ধন্যবাদ !

f(k){shmget(k,1,512);}

এটি আরও এক ধাপ এগিয়ে যায়। shmgetপ্রোগ্রামটি শেষ হয়ে গেলে ভাগ করা মেমরি বরাদ্দ দেয় যা অবনমিত হয় না। এটি মেমোরি সনাক্ত করতে একটি কী ব্যবহার করে, তাই আমরা একটি অবিরাম প্রান্ত ব্যবহার করি। এটি প্রযুক্তিগতভাবে অপরিজ্ঞাত আচরণ, তবে ব্যবহারিকভাবে এর অর্থ হ'ল আমরা যখন ডাকা হয় তখন স্ট্যাকের শীর্ষের উপরে থাকা মানটি ব্যবহার করি। এটি পরের বারে লেখা হবে যে স্ট্যাকটিতে কোনও কিছু যুক্ত হয়, তাই আমরা কীটি হারাব।


কেবলমাত্র এটি কাজ করে না তা যদি আপনি আগে স্ট্যাকের মধ্যে কী ছিল তা নির্ধারণ করতে পারেন। অতিরিক্ত 19 বাইটের জন্য আপনি এই সমস্যাটি এড়াতে পারেন:

f(){srand(time(0));shmget(rand(),1,512);}

বা, 26 বাইটের জন্য:

main(k){shmget(&k,1,512);}

তবে এইটির সাথে, প্রোগ্রামটি বেরিয়ে যাওয়ার পরে মেমরিটি ফাঁস হয়। প্রোগ্রামটি চলাকালীন মেমোরিতে অ্যাক্সেস রয়েছে যা নিয়মের বিরুদ্ধে রয়েছে তবে প্রোগ্রামটি বন্ধ হয়ে যাওয়ার পরে আমরা কীটিতে অ্যাক্সেস হারিয়ে ফেলি এবং মেমরিটি এখনও বরাদ্দ করা হয়। এর জন্য অ্যাড্রেস স্পেস লেআউট র্যান্ডমাইজেশন (এএসএলআর) প্রয়োজন, অন্যথায় &kসর্বদা একই হবে। আজকাল এএসএলআর সাধারণত ডিফল্ট হিসাবে চালু থাকে।


প্রতিপাদন:

ipcs -mআপনার সিস্টেমে কী ভাগ করা মেমরি রয়েছে তা দেখতে আপনি ব্যবহার করতে পারেন। আমি পরিষ্কারতার জন্য পূর্ব-বিদ্যমান এন্ট্রিগুলি সরিয়েছি:

$ cat leakMem.c 
f(k){shmget(k,1,512);}
int main(){f();}     
$ gcc leakMem.c -o leakMem
leakMem.c:1:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 f(k){shmget(k,1,512);}
 ^
leakMem.c: In function ‘f’:
leakMem.c:1:1: warning: type of ‘k’ defaults to ‘int’ [-Wimplicit-int]
leakMem.c:1:6: warning: implicit declaration of function ‘shmget’ [-Wimplicit-function-declaration]
 f(k){shmget(k,1,512);}
ppcg:ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      


$ ./leakMem 

$ ipcs -m

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      

0x0000007b 3375157    Riley      0          1          0  

1
@ অ্যান্ড্রুস্যাভিনিখ তাত্ত্বিকভাবে, এই শ্মিড একটি ফাইলে সংরক্ষণ করতে পারত এবং ভবিষ্যতে কোনও প্রোগ্রাম এটি সংযুক্ত করতে পারে। এভাবেই ইউনিক্স শেয়ার করা মেমরি কাজ করে ...
tbodt

1
@ অ্যান্ড্রুস্যাভিনিখ শেয়ার্ড মেমরিটি মূলত এমন একটি সংস্থান হয়ে যায় যা ওএস অন্যান্য প্রক্রিয়াগুলিকে দিতে পারে। এটি র‌্যামে থাকে এমন কোনও ফাইলের মতো এবং নাম (কী) মুছে ফেলা না হওয়া পর্যন্ত কোনও প্রক্রিয়া যাতে অ্যাক্সেস করে। এমন একটি প্রক্রিয়া কল্পনা করুন যা একটি সংখ্যা গণনা করে এবং এটিকে মেমোরিতে সঞ্চয় করে এবং প্রক্রিয়াকরণের আগে প্রস্থান করে যা ডেটাটি ভাগ করে নেওয়া মেমোরিতে সংযুক্ত হয়। এই ক্ষেত্রে, যদি ওএস মেমরিটি মুক্ত করে তবে দ্বিতীয় প্রক্রিয়াটি এটি পেতে পারে না।
রিলে

35
এই পোস্ট করার জন্য আপনাকে ধন্যবাদ। আমি স্রেফ ভাগ করা মেমরি ফাঁসের বিরুদ্ধে টিআইও রক্ষা করেছি।
ডেনিস

4
@ ডেনিস এই কারণেই আমি টিআইও লিঙ্ক পোস্ট করিনি। আমি জানতাম না এটি সুরক্ষিত ছিল কি না।
রিলে

12
আমি পছন্দ করি আপনি প্রোগ্রামটি যেখানে উদ্দেশ্যটির চেয়ে কম মেমরি ফাঁস করেন সেই দৃশ্যের বর্ণনা দিতে সমস্যা শব্দটি কীভাবে ব্যবহার করেন ।
কাস্পার্ড

40

আনলম্বদা ( c-refcnt/unlambda), 1 বাইট

i

এটি অনলাইন চেষ্টা করুন!

প্রাক-বিদ্যমান দোভাষী যা খুব সাধারণ প্রোগ্রামগুলিতে মেমরি ফাঁস করে দেয় এটি সন্ধান করা সত্যই চ্যালেঞ্জ। এই ক্ষেত্রে, আমি উলাম্বদা ব্যবহার করেছি। একাধিক আধিকারিক আনলম্বদা দোভাষী রয়েছে, তবে c-refcntএটি তৈরি করা সবচেয়ে সহজতম এবং এটির এখানে দরকারী সম্পত্তি রয়েছে যে কোনও প্রোগ্রাম সফলভাবে চালিত হলে এটি মেমরি ফাঁস করে। সুতরাং এখানে আমাকে যা দেওয়ার দরকার ছিল তা হ'ল সহজতম আইনী আনলাম্বদা প্রোগ্রাম, কোনও বিকল্প নেই। (নোট করুন যে খালি প্রোগ্রামটি এখানে কাজ করে না; দোভাষী যখন ক্রাশ হয় তখন স্মৃতিটি এখনও পৌঁছতে পারে))

প্রতিপাদন

$ উইজেট ftp://ftp.madore.org/pub/madore/unlambda/unlambda-2.0.0.tar.gz
... স্নিপ ...
2017-02-18 18:11:08 (975 কেবি / গুলি) - 'আনলাম্বদা -০.০.০.টার.gz' সংরক্ষণ করা হয়েছে [492894]
x তার এক্সএফ আনলাম্বদা -২.০.০.আরটাজ 
$ সিডি আনলাম্বদা-২.০.০ / সি-রিফ্রেন্ট /
$ জিসিসি আনলম্বদা.সি
$ প্রতিধ্বনি -নি | valgrind ./a.out / dev / stdin
... স্নিপ ...
== 3417 == সারসংক্ষেপ ফাঁস:
== 3417 == অবশ্যই হারিয়ে গেছে: 1 টি ব্লকে 40 বাইট
== 3417 == পরোক্ষভাবে হারানো: 0 টি ব্লকে 0 বাইট
== 3417 == সম্ভবত হারিয়ে গেছে: 0 টি ব্লকে 0 বাইট
== 3417 == এখনও পৌঁছনীয়: 0 টি ব্লকে 0 বাইট
== 3417 == দমন করা: 0 টি ব্লকে 0 বাইট
== 3417 == 
== 3417 == সনাক্ত এবং দমন করা ত্রুটির গণনার জন্য: -v এর সাথে পুনরায় চালু করুন
== 3417 == ত্রুটি সারসংক্ষেপ: 1 প্রসঙ্গে 1 টি ত্রুটি (দমন করা: 0 থেকে 0)

39

টিআই-বেসিক, 12 বাইট

While 1
Goto A
End
Lbl A
Pause 

"... একটি স্মৃতি ফাঁস হ'ল আপনি লুপের মধ্যে একটি গোটো / এলবিএল ব্যবহার করেন বা শর্তসাপেক্ষে (এন্ড কমান্ড রয়েছে এমন কোনও কিছু) এন্ড কমান্ডটি পৌঁছানোর আগে নিয়ন্ত্রণ কাঠামো থেকে বাইরে চলে যেতে ..." (আরও)


7
বাহ, আমি মনে করি এটি আমার মনে আছে। আমি আমার পুরানো বেসিক প্রোগ্রামগুলিতে আমার লুপগুলি থেকে ঝাঁপিয়ে পড়েছিলাম এবং লক্ষ্য করেছি যে কীভাবে আমার টিআই -৪৪ + আরও ধীর এবং ধীর হয়ে গেছে ...
রায়

2
হ্যাঁ, আমরা বেশিরভাগের অনুভূতি জানি;) @ রায়কোপা
টিমটেক

13
টিআই বেসিকের জন্য +1। আমি আমার নবম গ্রেড ইয়ারের বেশিরভাগ প্রোগ্রামগুলিতে ব্যয় করেছি।
মার্কাসোফটওয়্যার

Pause আপনার শেষে কি দরকার ? আপনি 2 বাইট সংরক্ষণ করতে পারে।
kamoroso94

@ কামোরোসো94 আমারও তাই মনে হয়, কারণ "যদি কোনও প্রোগ্রাম শেষ হয়ে যায় তবে লিকটি সাফ হয়ে যায় এবং এর ফলে আর কোনও সমস্যা তৈরি হবে না", সুতরাং প্রোগ্রামটি শেষ হতে বাধা দেওয়া।
টিমটেক

32

পাইথন <3.6.5, 23 বাইট

property([]).__init__()

property.__init__থেকে তথ্য ফাঁসের রেফারেন্স সম্পত্তি পুরাতন fget, fset, fdel, এবং __doc__যদি আপনি ইতিমধ্যেই সক্রিয়া তে এটি কল propertyউদাহরণস্বরূপ। এই বাগ অবশেষে CPython অংশ হিসাবে রিপোর্ট করা হয় ইস্যু 31787 এবং সংশোধন পাইথন 3.6.5 এবং পাইথন 3.7.0 । (এছাড়াও, হ্যাঁ, property([])আপনি করতে পারেন এমন একটি জিনিস))


একটি বাগ রিপোর্ট পাঠানো হয়েছে?
mbomb007


27

সি #, 34 বাইট

class L{~L(){for(;;)new L();}}

এই সমাধানটির জন্য গাদা প্রয়োজন হয় না। এটির জন্য কেবল সত্যিকারের পরিশ্রমী জিসি ( আবর্জনা সংগ্রাহক ) প্রয়োজন।

মূলত এটি জিসিকে তার নিজের শত্রুতে পরিণত করে।

ব্যাখ্যা

যখনই ডেস্ট্রাক্টরকে ডেকে আনা হয়, যতক্ষণ না সময়সীমা শেষ হয়ে যায় এবং জিসিকে ডাস্ট্রাক্টর শেষ হওয়ার অপেক্ষা না করে কেবল সেই বস্তুটি খনন করতে বলা হয় ততক্ষণ পর্যন্ত এই দুষ্ট শ্রেণির নতুন উদাহরণ তৈরি হয় creates ততক্ষণে হাজার হাজার নতুন দৃষ্টান্ত তৈরি হয়েছে।

এর "দুষ্টতা" হ'ল, জিসি যত বেশি কঠোরভাবে কাজ করছেন, এটি ততই আপনার মুখে ফুঁকবে।

দাবি অস্বীকার: আপনার জিসি আমার চেয়ে স্মার্ট হতে পারে। প্রোগ্রামটির অন্যান্য পরিস্থিতিতে জিসিকে প্রথম অবজেক্ট বা এর ডেস্ট্রাক্টরকে উপেক্ষা করার কারণ হতে পারে। এই ক্ষেত্রে এটি উড়ে যাবে না। তবে অনেকগুলি পরিবর্তনে এটি হবে । এখানে কয়েকটি বাইট যুক্ত করা এবং প্রতিটি সম্ভাব্য পরিস্থিতিতে একটি ফুটো নিশ্চিত হতে পারে। ঠিক আছে পাওয়ার সুইচ বাদে হয়ত।

পরীক্ষা

এখানে একটি পরীক্ষার স্যুট :

using System;
using System.Threading;
using System.Diagnostics;
class LeakTest {
    public static void Main() {
        SpawnLeakage();
        Console.WriteLine("{0}-: Objects may be freed now", DateTime.Now);
        // any managed object created in SpawbLeakage 
        //  is no longer accessible
        // The GC should take care of them

        // Now let's see
        MonitorGC();
    }
    public static void SpawnLeakage() {
        Console.WriteLine("{0}-: Creating 'leakage' object", DateTime.Now);
        L l = new L();
    }
    public static void MonitorGC() {
        while(true) {
            int top = Console.CursorTop;
            int left = Console.CursorLeft;
            Console.WriteLine(
                "{0}-: Total managed memory: {1} bytes",
                DateTime.Now,
                GC.GetTotalMemory(false)
            );
            Console.SetCursorPosition(left, top);
        }
    }
}

10 মিনিটের পরে আউটপুট:

2/19/2017 2:12:18 PM-: Creating 'leakage' object
2/19/2017 2:12:18 PM-: Objects may be freed now
2/19/2017 2:22:36 PM-: Total managed memory: 2684476624 bytes

এটি 2 684 476 624 বাইট। WorkingSetপ্রক্রিয়াটির মোট পরিমাণ ছিল প্রায় ৪.৮ জিবি

এই উত্তরটি এরিক লিপার্টের দুর্দান্ত নিবন্ধটি দ্বারা অনুপ্রাণিত হয়েছে: যখন আপনি জানেন সমস্ত কিছু ভুল হয়


এটি আকর্ষণীয়। আবর্জনা সংগ্রহকারী কি "ভুলে" যায় যে কিছু কিছুর উপস্থিতি রয়েছে এবং এর কারণে সেগুলি হারিয়ে ফেলে? আমি সি # তে বেশি কিছু জানি না। এছাড়াও এখন আমি ভাবছি, বোমা এবং ফুটোয়ের মধ্যে পার্থক্য কী? আমি কল্পনা করি যে কোনও কনস্ট্রাক্টরের ভিতরে থেকে কোনও কনস্ট্রাক্টরকে কল করে, বা অসীম পুনরাবৃত্তির ক্রিয়াকলাপ ঘটে যা কখনও থামে না, যদিও প্রযুক্তিগতভাবে সিস্টেমটি কখনই সেই উল্লেখগুলি অনুসরণ করে না, এটি কেবল স্থানের বাইরে চলে যায় ...
ডন উজ্জ্বল

1
কোন কনস্ট্রাক্টরের মধ্যে একটি কনস্ট্রাক্টর স্ট্যাকের ওভারফ্লো করে। তবে কোনও উদাহরণটির বিনাশককে ফ্ল্যাট শ্রেণিবিন্যাসে ডেকে আনা হয়। জিসি আসলে বস্তুর ট্র্যাক কখনও হারায় না। ঠিক যখনই এটি তাদের ধ্বংস করার চেষ্টা করে এটি অজান্তেই নতুন অবজেক্ট তৈরি করে। অন্যদিকে ব্যবহারকারীর কোডে উক্ত অবজেক্টগুলিতে অ্যাক্সেস নেই। এছাড়াও উল্লিখিত অসঙ্গতিগুলি দেখা দিতে পারে যেহেতু জিসি কোনও বিষয়টিকে তার ডেস্ট্রাক্টর না ডেকে ধ্বংস করার সিদ্ধান্ত নিতে পারে।
মিঃপলচ

শুধু ব্যবহার করে চ্যালেঞ্জটি কি সম্পূর্ণ হবে না class L{~L(){new L();}}? এএফআইকি for(;;)কেবলমাত্র এটিকে মেমোরি ফাঁস করে দেয়, তাই না?
বিজিআর ওয়ার্কার

1
দুঃখের বিষয়, না। যেহেতু প্রতিটি ধ্বংস হওয়া বস্তুর জন্য কেবল একটি নতুন উদাহরণ তৈরি হতে চলেছে, যা আবার অ্যাক্সেসযোগ্য এবং ধ্বংসের জন্য চিহ্নিত marked পদ্ধতি পুনরাবৃত্তি করুন। কেবলমাত্র একটি জিনিস ধ্বংসের জন্য মুলতুবি থাকবে। বাড়ছে না জনসংখ্যা।
মিঃপলচ

2
আসলে তা না. শেষ পর্যন্ত একটি চূড়ান্ত করা উপেক্ষা করা হবে। সংশ্লিষ্ট বস্তুটি নির্বিশেষে খাওয়া হবে।
মিঃপলচ

26

সি (জিসিসি) , 15 বাইট

f(){malloc(1);}

প্রতিপাদন

$ cat leak.c
f(){malloc(1);}
main(){f();}
$ gcc -g -o leak leak.c
leak.c: In function ‘f’:
leak.c:1:5: warning: incompatible implicit declaration of built-in function ‘malloc’ [enabled by default]
 f(){malloc(1);}
     ^
$ valgrind --leak-check=full ./leak
==32091== Memcheck, a memory error detector
==32091== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==32091== Using Valgrind-3.10.0 and LibVEX; rerun with -h for copyright info
==32091== Command: ./leak
==32091==
==32091==
==32091== HEAP SUMMARY:
==32091==     in use at exit: 1 bytes in 1 blocks
==32091==   total heap usage: 1 allocs, 0 frees, 1 bytes allocated
==32091==
==32091== 1 bytes in 1 blocks are definitely lost in loss record 1 of 1
==32091==    at 0x4C29110: malloc (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==32091==    by 0x40056A: f (leak.c:1)
==32091==    by 0x40057A: main (leak.c:2)
==32091==
==32091== LEAK SUMMARY:
==32091==    definitely lost: 1 bytes in 1 blocks
==32091==    indirectly lost: 0 bytes in 0 blocks
==32091==      possibly lost: 0 bytes in 0 blocks
==32091==    still reachable: 0 bytes in 0 blocks
==32091==         suppressed: 0 bytes in 0 blocks
==32091==
==32091== For counts of detected and suppressed errors, rerun with: -v
==32091== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

26

জাভাস্ক্রিপ্ট, 14 বাইট

Golfed

setInterval(0)

ডিফল্ট বিলম্বের সাথে একটি ফাঁকা ব্যবধান হ্যান্ডলার নিবন্ধভুক্ত করে ফলাফল টাইমার আইডি বাতিল করে (এটি বাতিল করা অসম্ভব করে তোলে)।

এখানে চিত্র বর্ণনা লিখুন

আমি কয়েক মিলিয়ন টাইমার তৈরি করতে, লিকটি চিত্রিত করতে, একটি ডিফল্ট ব্যবধান ব্যবহার করে পাগলের মতো সিপিইউ খায় বলে আমি একটি অ-ডিফল্ট ব্যবধান ব্যবহার করেছি।


5
হাহাহা আমি পছন্দ করি যে আপনি 'গল্ফড' টাইপ করেছেন, আমাকে অবারিত সংস্করণ সম্পর্কে কৌতূহলী করে তুলেছে
মার্টিজেন

9
এটি দেখতে এরকম দেখতে পারেif(window && window.setInterval && typeof window.setInterval === 'function') { window.setInterval(0); }
স্যাশাল্লাকা

3
আসলে, এটি বাতিল করা অসম্ভব: বিরতি (এবং সময়সীমা) আইডি এর ধারাবাহিকভাবে নম্বরযুক্ত, সুতরাং clearIntervalআপনার অন্তর শেষ না হওয়া অবধি কেবলমাত্র একটি ইনক্রিমেন্টিং আইডি দিয়ে কল করে জিনিসটি বাতিল করা মোটামুটি সহজ । উদাহরণস্বরূপ:for(let i=0;i<1e5;i++){try{clearInterval(i);}catch(ex){}}
ব্যবহারকারী 2428118

5
@ ইউজার ২৪২৮১১৮ যেমন জেপেলিন বলেছে, সি / সি ++ লিক "রিয়েল" না বলে এটি আর " free()
বৈধতা

1
বাহ, জাভাস্ক্রিপ্ট প্রকৃত প্রতিযোগী এমন অনেক চ্যালেঞ্জ নয় ...
জেরেড স্মিথ

19

জাভা, 10 বাইট

অবশেষে, জাভাতে একটি প্রতিযোগিতামূলক উত্তর!

Golfed

". "::trim

এটি একটি পদ্ধতির উল্লেখ (স্ট্রিং ধ্রুবকের বিরুদ্ধে), যা এর মতো ব্যবহার করা যেতে পারে:

Supplier<String> r = ". "::trim

ক্লাস দ্বারা রক্ষণাবেক্ষণ অনুযায়ী একটি আক্ষরিক স্ট্রিং ". "স্বয়ংক্রিয়ভাবে গ্লোবাল ইন্টার্নযুক্ত স্ট্রিং পুলগুলিতে যুক্ত হবে java.lang.Stringএবং আমরা তাৎক্ষণিকভাবে এটি ছাঁটাই করব, কোডটিতে আরও উল্লেখ করা যাবে না (যদি আপনি আবার একই স্ট্রিংটি আবার ঘোষণা না করেন)।

...

স্ট্রিংগুলির একটি পুল, প্রাথমিকভাবে খালি, স্ট্রিং ক্লাস দ্বারা ব্যক্তিগতভাবে রক্ষণাবেক্ষণ করা হয়।

সমস্ত আক্ষরিক স্ট্রিং এবং স্ট্রিং-মূল্যবান ধ্রুবক অভিব্যক্তি ইন্টার্ন করা হয়। স্ট্রিং লিটারালগুলি জাভা ™ ল্যাঙ্গুয়েজ স্পেসিফিকেশনের ৩.১০.৫ বিভাগে সংজ্ঞায়িত করা হয়েছে।

...

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#intern--

আপনি এটিকে একটি "প্রোডাকশন গ্রেড" মেমরি ফাঁস করে নিজেই স্ট্রিং যুক্ত করে এবং তারপরে ইন্টার্ন () পদ্ধতিটি স্পষ্টভাবে, একটি লুপে অনুরোধ করে।


2
আমি এটি সি # এর জন্য বিবেচনা করেছি ... তবে আমি এটি গণনা করি বলে মনে করি না, কারণ আপনি যেমন বলেছিলেন আপনি অন্য স্ট্রিংকে আক্ষরিক অন্তর্ভুক্ত করে সেই মেমরিটি অ্যাক্সেস করতে পারবেন । আমি কী ("." + " ").intern()করতে হবে তা জানতে আগ্রহী (যদি তারা ব্যবহারকারী ইনপুট বা ডাব্লু / ই হয়, তাই আমরা সংকলক অপ্টিমাইজেশন ছাড় করি)।
ভিজ্যুয়ালমেলন

1
প্রকৃতপক্ষে, একমাত্র sensক্যমত্যটি সবচেয়ে পাতলা, আমি কেবল "কোডটি সংকলন করা উচিত" পক্ষের উপর দৃ .়ভাবে করছি। আমি এখনও নিশ্চিত আমি এই সমাধান প্রশ্নে বাক্যে কথন দেওয়া কিনতে নই (এই স্ট্রিং না পারেন, মুক্তি, এবং তারা করতে পারেন স্বাভাবিক অপারেটিং কোড যদিও এটার সম্ভাবনা কম পাওয়া যাবে), কিন্তু আমি তাদের নিজস্ব রায় করতে অন্যদের আমন্ত্রণ
ভিজ্যুমেলন

3
স্ট্রিংটি এমনকি অ্যাক্সেসযোগ্য নয় , একা ফাঁস হোক। আমরা এটি যে কোনও সময় একটি সমান স্ট্রিংকে অভ্যন্তরীণ করে পুনরুদ্ধার করতে পারি। যদি এটি গণনা করা হয় তবে কোনও অব্যবহৃত বৈশ্বিক পরিবর্তনশীল (জাভাতে প্রাইভেট স্ট্যাটিক) ফাঁস হবে। মেমরি ফাঁস সংজ্ঞায়িত হয় না কিভাবে।
ব্যবহারকারী 2357112

3
@ ব্যবহারকারী 2357112 "... সেই স্ট্রিংটি এমনকি অ্যাক্সেসযোগ্যও নয় ..." এটি কেবলমাত্র স্পষ্ট দেখাচ্ছে কারণ আপনি কোডটি দেখেন। এখন বিবেচনা করুন যে আপনি এই পদ্ধতির রেফারেন্সটি X () আপনার কোডের জন্য একটি আর্গুমেন্ট হিসাবে পেয়েছেন, আপনি জানেন যে এটি ভিতরে একটি স্ট্রিং আক্ষরিক বরাদ্দ করে (এবং ইন্টার্নস), তবে আপনি জানেন না কোনটি হ'ল এটি "" বা "123" হতে পারে exactly বা একটি (সাধারণত) অজানা দৈর্ঘ্যের অন্য কোনও স্ট্রিং। আপনি কি দয়া করে প্রদর্শন করতে পারবেন যে আপনি কীভাবে এখনও এটি অ্যাক্সেস করতে পারবেন, বা এটি যে "ইন্টার্ন" পুলটিতে রয়েছে তা প্রবেশ বন্ধ করে দিন?
জেপেলিন

2
@ user2357112 একটি সীমাবদ্ধ মেমরি সহ একটি মেশিনে, আপনি কোনও মেমরির কোনও অংশে সঞ্চিত একটি মানটি অ্যাক্সেস করতে পারেন simply by guessing it correctly, তবে এর অর্থ এই নয় যে মেমরি ফাঁসের মতো জিনিসটির অস্তিত্ব নেই। there's probably some way to use reflection to determine the string's contents tooআপনি এই প্রদর্শন করতে পারেন? (ইঙ্গিত, স্ট্রিং.ইনটার্ন () স্থানীয় কোডে প্রয়োগ করা হয় )।
জেপেলিন

17

মরিচা, 52 বাইট

extern{fn malloc(_:u8);}fn main(){unsafe{malloc(9)}}

সিস্টেম ম্যালোকের সাথে কিছু বাইট বরাদ্দ করে। এটি ধরে নেয় ভুল এবিআই গ্রহণযোগ্য।


মরিচা (তত্ত্ব অনুসারে), 38 বাইট

fn main(){Box::into_raw(Box::new(1));}

আমরা স্তূপে মেমরি বরাদ্দ করি, একটি কাঁচা পয়েন্টার বের করি এবং তারপরে কার্যকরভাবে ফাঁস করি it ( Box::into_rawতখন ছোট std::mem::forget)

যাইহোক, মরচে ডিফল্ট জেমলোক ব্যবহার করে, যা ভালগ্রাইন্ড কোনও ফুটো সনাক্ত করতে পারে না । আমরা সিস্টেম বরাদ্দকারীতে স্যুইচ করতে পারি তবে এটি 50 বাইট যুক্ত করে এবং রাতের প্রয়োজন হয়। স্মৃতি সুরক্ষার জন্য অনেক ধন্যবাদ।


প্রথম প্রোগ্রামের আউটপুট:

==10228== Memcheck, a memory error detector
==10228== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==10228== Using Valgrind-3.12.0.SVN and LibVEX; rerun with -h for copyright info
==10228== Command: ./1
==10228== 
==10228== 
==10228== HEAP SUMMARY:
==10228==     in use at exit: 9 bytes in 1 blocks
==10228==   total heap usage: 7 allocs, 6 frees, 2,009 bytes allocated
==10228== 
==10228== LEAK SUMMARY:
==10228==    definitely lost: 9 bytes in 1 blocks
==10228==    indirectly lost: 0 bytes in 0 blocks
==10228==      possibly lost: 0 bytes in 0 blocks
==10228==    still reachable: 0 bytes in 0 blocks
==10228==         suppressed: 0 bytes in 0 blocks
==10228== Rerun with --leak-check=full to see details of leaked memory
==10228== 
==10228== For counts of detected and suppressed errors, rerun with: -v
==10228== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

অসাধারণ. এই জাতীয় পোস্টগুলি গত বছরের তুলনায় আমাকে মরিচা অন্বেষণ করতে পরিচালিত করেছিল, অবশ্যই আমি সবচেয়ে মজার ভাষা শেখার চেষ্টা করেছি।
উজ্জ্বল করুন

16

8086 এএসএম, 3 বাইট

এই উদাহরণগুলি ধরে নেয় যে একটি সি রানটাইম যুক্ত রয়েছে।

jmp _malloc

এটি e9 XX XXযেখানে সম্পর্কিত XX XXহয় সেখানে একত্রিত হয়_malloc

এটি mallocঅপ্রত্যাশিত পরিমাণ মেমরি বরাদ্দ করার অনুরোধ করে এবং তত্ক্ষণাত্ প্রক্রিয়াগুলি শেষ করে, ফিরে আসে। ডস-এর মতো কিছু অপারেটিং সিস্টেমে সিস্টেমটি পুনরায় চালু না হওয়া পর্যন্ত মেমরিটি পুনরুদ্ধারযোগ্য নাও হতে পারে!


ম্যালোকের স্বাভাবিক প্রয়োগের ফলে প্রক্রিয়া প্রস্থান করার সময় মেমরিটি মুক্ত হয়।
জোশুয়া

@ জোশুয়া হ্যাঁ, তবে এটি বাস্তবায়ন সংজ্ঞায়িত আচরণ।
FUZxxl

12

চতুর্থ, 6 বাইট

Golfed

s" " *

s" "স্ট্যাকের উপরে তার ঠিকানা এবং দৈর্ঘ্য (0) রেখে একটি খালি স্ট্রিং বরাদ্দ করে , তারপরে এগুলি বহুগুণ করে তোলে (ফলস্বরূপ একটি মেমরি ঠিকানা হারিয়ে যায়)।

Valgrind- র

%valgrind --leak-check=full gforth -e 's" " * bye'
...
==12788== HEAP SUMMARY:
==12788==     in use at exit: 223,855 bytes in 3,129 blocks
==12788==   total heap usage: 7,289 allocs, 4,160 frees, 552,500 bytes allocated
==12788== 
==12788== 1 bytes in 1 blocks are definitely lost in loss record 1 of 22
==12788==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==12788==    by 0x406E39: gforth_engine (in /usr/bin/gforth-0.7.0)
==12788==    by 0x41156A: gforth_go (in /usr/bin/gforth-0.7.0)
==12788==    by 0x403F9A: main (in /usr/bin/gforth-0.7.0)
==12788== 
...
==12818== LEAK SUMMARY:
==12818==    definitely lost: 1 bytes in 1 blocks
==12818==    indirectly lost: 0 bytes in 0 blocks

10

45 বাইট যান

package main
func main(){go func(){for{}}()}

এটি এর ভিতরে অনন্ত লুপ সহ একটি বেনামে গোরোটিন তৈরি করে। প্রোগ্রামটি স্বাভাবিক হিসাবে চালিয়ে যেতে পারে, যেমন গোরোটিন শুরু করা একযোগে চলমান ছোট থ্রেড তৈরি করার মতো, তবে গুরোটিনের জন্য বরাদ্দ হওয়া মেমরিটিকে পুনরায় দাবি করার জন্য প্রোগ্রামটির কোনও উপায় নেই। আবর্জনা সংগ্রহকারী এটি এখনও চলছে বলে এটি কখনই সংগ্রহ করবে না। কিছু লোক এটাকে 'গোরোটিন ফাঁস' বলে অভিহিত করে


গল্ফ চেক: কল করার চেয়ে এটি 2 বাইট কম C.malloc(8), যেহেতু আপনার প্রয়োজনimport"C"
রিকিং

9

জাভা 1.3, 23 বাইট

void l(){new Thread();}

থ্রেড তৈরি করা হচ্ছে তবে এটি শুরু হচ্ছে না। থ্রেডটি অভ্যন্তরীণ থ্রেড পুলে নিবন্ধিত রয়েছে, তবে কখনই শুরু করা হবে না, তাই কখনও শেষ হয় নি এবং তাই কখনও জিসির প্রার্থী হবেন না। এটি জাভা লম্বোবসগুলিতে আটকে থাকা একটি অপ্রকাশযোগ্য অবজেক্ট।

এটি জাভাতে একটি বাগ রয়েছে যার পরে এটি ঠিক করা হয়েছিল ১.৩ পর্যন্ত এটি অন্তর্ভুক্ত

পরীক্ষামূলক

নিম্নলিখিত প্রোগ্রামটি নতুন থ্রেড অবজেক্টের সাহায্যে মেমরিটিকে দূষিত করার এবং হ্রাসমান মুক্ত মেমরির স্থান দেখানো নিশ্চিত করে। ফাঁস পরীক্ষার খাতিরে, আমি নিবিড়ভাবে জিসি রান করি।

public class Pcg110485 {

    static
    void l(){new Thread();}

    public static void main(String[] args) {

        while(true){
            l();
            System.gc();
            System.out.println(Runtime.getRuntime().freeMemory());
        }
    }
}

যেহেতু এটি কেবল নির্দিষ্ট জাভা সংস্করণগুলিতে কাজ করে, আপনার পরিবর্তে আপনার হেডারটিতে "জাভা 3" বলা উচিত।

5
জাভা ৩ এর মতো কোনও জিনিস নেই এটি জাভা ১.৩। এখানে জাভা ছিল 1.0, 1.1, 2, 1.3, 1.4, 5, 6, 7, 8, 9. অদ্ভুত নম্বর, কিন্তু এটি এটি কিভাবে।
অলিভিয়ের

এটি আমার ধারণাও ছিল। অভিশাপ।
ম্যাজিক অক্টোপাস উরন

8

বেফুঞ্জ ( ছত্রাক ), 1 বাইট

$

এটি প্ল্যাটফর্ম নির্ভর ও সংস্করণ নির্ভর হতে পারে (আমি কেবল উইন্ডোজের 1.0.4 সংস্করণ দিয়ে পরীক্ষা করেছি), কিন্তু ছত্রাক ঐতিহাসিকভাবে একটি খুব ছিদ্রময় অনুবাদক হয়েছে। $(ড্রপ) কমান্ড একটি খালি স্ট্যাক কিছুই করতে পারবো না, কিন্তু এই কোড উপর লুপিং একরকম খুব দ্রুত মেমরি অনেক ফুটা করা পরিচালনা করে। কয়েক সেকেন্ডের মধ্যে এটি কয়েকটি জিগ ব্যবহার করবে এবং "মেমরির বাইরে" ত্রুটির সাথে ক্র্যাশ হয়ে যাবে।

মনে রাখবেন এটি $কমান্ড হতে হবে না - কেবল যে কোনও কিছু করতে হবে। যদিও এটি ফাঁকা উত্স ফাইলের সাথে কাজ করবে না। কমপক্ষে একটি অপারেশন করা আছে।


8

সুইফট 3, 38 বাইট

নতুন সংস্করণ:

class X{var x: X!};do{let x=X();x.x=x}

x নিজের কাছে একটি শক্তিশালী রেফারেন্স রয়েছে, সুতরাং এটি অবিচলিত হবে না, যা মেমরি ফাঁসের দিকে পরিচালিত করে।

পুরাতন রুপ:

class X{var y:Y!}
class Y{var x:X!}
do{let x=X();let y=Y();x.y=y;y.x=x}

xএর একটি শক্তিশালী রেফারেন্স yএবং বিপরীতে রয়েছে। সুতরাং, উভয়ই ক্ষয়িষ্ণু হবে না, একটি স্মৃতি ফাঁস হতে পারে।


হুম, আপনি এখনও সেই স্মৃতিটি উল্লেখ করতে পারেন xএবং y, সুতরাং এটি আমার কাছে সত্যই ফুটোয়ের মতো লাগে না (যদি আপনি তাদের কোনওভাবে ধ্বংস না করেন)।
জেপেলিন

@zeppelin শেষ লাইনটি ঠিক করতে কোনও ফাংশনে আবৃত হতে পারে
নোবেডি নাডা

@ নোবডিনাডা, যদি আমি কোনও doব্লকে শেষ পংক্তিটি রাখি যা জেপেলিনকে উত্থাপিত সমস্যাটি ঠিক করবে?
ড্যানিয়েল

@ ডপাপ হ্যাঁ; একটি doপাশাপাশি কাজ করবে। ভাল ধারণা!
NobodyNada

এটি সংক্ষিপ্ত করা যেতে পারে, আপনার দুটি ক্লাসের দরকার নেই - এক্স নিজেই রেফারেন্স রাখতে পারে:class X{var x: X!};do{let x=X();x.x=x}
সেবাস্তিয়ান ওসিয়স্কি

7

ডেল্ফি (বস্তু পাস্কাল) - 33 বাইট

ভেরিয়েবল, সম্পূর্ণ কনসোল প্রোগ্রাম ছাড়াই একটি অবজেক্ট তৈরি করা:

program;begin TObject.Create;end.

প্রকল্পে ফাস্টএমএম 4 সক্ষম করা মেমরির ফাঁস দেখিয়ে দেবে:

এখানে চিত্র বর্ণনা লিখুন


6

সি # - 84 বাইটস

class P{static void Main(){System.Runtime.InteropServices.Marshal.AllocHGlobal(1);}}

এটি অব্যবহৃত মেমরির ঠিক 1 বাইট বরাদ্দ করে এবং তারপরে হারায় IntPtr যা আমি বিশ্বাস করি এটি এটিকে পেতে বা মুক্ত করার একমাত্র উপায়। আপনি এটি একটি লুপে ভরাট করে এবং অ্যাপ্লিকেশনটি ক্র্যাশ হওয়ার জন্য অপেক্ষা করে এটি পরীক্ষা করতে পারেন (জিনিসগুলি দ্রুত করার জন্য কয়েকটি জিরো যুক্ত করতে পারে)।

আমি বিবেচনা করেছি System.IO.File.Create("a");এবং এরকম, তবে আমি নিশ্চিত নই যে এগুলি অগত্যা মেমরি ফাঁস, কারণ অ্যাপ্লিকেশন নিজেই স্মৃতি সংগ্রহ করবে , এটি নীচের ওএস যা ফাঁস হতে পারে (কারণ Closeবা Disposeবলা হয়নি)। ফাইল অ্যাক্সেস স্টাফের জন্যও ফাইল সিস্টেমের অনুমতি দরকার হয় এবং কেউ সেগুলির উপর নির্ভর করতে চায় না। এবং দেখা যাচ্ছে যে এটি কোনওভাবেই ফাঁস হবে না, কারণ চূড়ান্তকরণকারী বলা হচ্ছে এমন কিছুই থামছে না (যা অন্তর্নিহিত সংস্থানগুলি মুক্ত করে তোলে), যা কাঠামোর মধ্যে এই ধরণের বিচারের ত্রুটি (কিছুটা হলেও) প্রশমিত করা এবং প্রোগ্রামারগুলিকে আপাতদৃষ্টিতে অ-ডিটারমিনিস্টিক ফাইল লকিংয়ের সাথে বিভ্রান্ত করার জন্য (যদি আপনি সিনকি হন)। আমাকে সরাসরি এটার জন্য জন হানাকে ধন্যবাদ।

আমি একদম হতাশ যে আমি আরও ছোট উপায় খুঁজে পাচ্ছি না। । নেট জিসি কাজ করে, আমি IDisposablesএমসক্র্লিবের এমন কোনও কথা ভাবতে পারি না যা স্পষ্টভাবে ফুটো হয়ে যাবে (এবং তাদের সবারই চূড়ান্ত পরিণতি হয়েছে বলে মনে হয়, কতটা বিরক্তিকর) , আমি পরিচালনা না করা মেমরি বরাদ্দ করার অন্য কোনও উপায় সম্পর্কে অবগত নই (পিনভোকের সংক্ষিপ্ততা) ), এবং প্রতিফলন (ভাষা শব্দার্থবিদ্যা নির্বিশেষে (যেমন ব্যক্তিগত সদস্য বা কোন accessors সঙ্গে ক্লাস) এটি একটি রেফারেন্স সাথে কাউকে নিশ্চিত করে) করতে পাওয়া যাবে।


1
System.IO.File.Create("a")কোনও কিছু ফাঁস করবে না, তবে GC.SuppressFinalize(System.IO.File.Create("a"))যেমনটি স্পষ্টভাবে বলা হয়েছে যে উত্পাদকের চূড়ান্তকরণকারী চালনা করবেন না FileStream
জন হান্না

@ জনহান্না আমার আইডিস্পোজেবল প্যারানাইয়া মনে হয় আমার থেকে আরও ভাল হয়েছে।
ভিজুয়ালমেলন

আপনি সিস্টেম.ড্রেইং.বিটম্যাপ ব্যবহার করে জিডিআই + ফাঁস করার সুযোগ থাকতে পারে। এটি গণনা করে কিনা জানুন কারণ এটি উইন্ডোজ লাইব্রেরিটি ফাঁস হওয়ার কারণ, প্রোগ্রামটি নয়।
বিজিআর ওয়ার্কার

@ বিগ্রার ওয়ার্কার তাদের সন্দেহ নেই যে তাদেরও একটি চূড়ান্ত সিদ্ধান্ত রয়েছে এবং আমি কোড-গল্ফের বাইরের গ্রন্থাগারগুলি এড়িয়ে চলার ঝোঁক রাখি কারণ সেগুলি ব্যয় করার বিষয়ে আমি sensক্যমত্যের সাথে একমত নই: আপনি যদি এমন কোনও উপায় খুঁজে পেতে পারেন যে বিষয়ে আপনি আত্মবিশ্বাসী হন তবে পোস্টটি নির্দ্বিধায় অনুভব করুন এটা আপনার নিজের জবাব!
ভিজ্যুমেলন

<!-- language: lang-c# -->এই এবং সুন্দর উত্তরের জন্য ধন্যবাদ! (এটি সি # তাই আমি এটি পছন্দ করি)
মেটোনিয়াম

5

ফ্যাক্টর , 13 বাইট

ফ্যাক্টরের স্বয়ংক্রিয় মেমরি পরিচালনা রয়েছে তবে কিছু libc কার্যকারিতা অ্যাক্সেস দেয়:

1 malloc drop

ম্যানুয়ালি মেমরির 1 বাইট বরাদ্দ করে, তার ঠিকানাটি দেয় এবং এটি ড্রপ করে।

malloc আসলে মেমরি লিকের উপর নজর রাখার জন্য একটি অনুলিপি নিবন্ধন করে এডএন ডাবল ফ্রিজ, তবে আপনি যেটা ফাঁস করেছেন তা সনাক্ত করা সহজ কাজ নয়।

আপনি যদি নিশ্চিত হন যে আপনি সত্যিই সেই উল্লেখটি হারিয়েছেন:

1 (malloc) drop

এর সাথে পরীক্ষার ফাঁস [ 1 malloc drop ] leaks.বলে:

| Disposable class | Instances |                    |
| malloc-ptr       | 1         | [ List instances ] |

এর সাথে পরীক্ষার ফাঁস [ 1 (malloc) drop ] leaks.বলে:

| Disposable class | Instances | |

ওহ না! দুর্বল ফ্যাক্টর, এটি এখন আলঝেইমার! ডি:


5

কমন লিস্প (কেবলমাত্র এসবিসিএল), 28 26 বাইট

sb-alien::(make-alien int)

আপনি এটির মতো চালান sbcl --eval 'sb-alien::(make-alien int)':; কিছুই মুদ্রিত হয় এবং ফিরে আসে না, কিন্তু মেমরি বরাদ্দ হয়। আমি যদি (print ...)একটির ভিতরে ফর্মটি আবৃত করি তবে পয়েন্টারটি আরএপিএলে প্রদর্শিত হবে।

  1. package::(form)ফর্মটি পড়ার সময় অস্থায়ীভাবে বর্তমান প্যাকেজটিকে আবদ্ধ করার জন্য এসবিসিএল-তে একটি বিশেষ স্বরলিপি। এটি এখানে make-alienএবং intসাথে উভয় উপসর্গ এড়াতে ব্যবহৃত হয় sb-alien। আমি মনে করি যে বর্তমান প্যাকেজটি এটির জন্য সেট করা আছে তা ধরে নিয়ে প্রতারণা করা হবে, কারণ এটি প্রারম্ভের সময় নয়।

  2. make-alien প্রদত্ত ধরণের এবং optionচ্ছিক আকারের (ম্যালোক ব্যবহার করে) জন্য মেমরি বরাদ্দ করে।

  3. এটি আরইপিএলে কার্যকর করার সময়, 0বরাদ্দের পরে যুক্ত করুন যাতে REPL পয়েন্টারটি ফেরত না দেয় তবে পরিবর্তে সেই মানটি দেয়। তা না হলে, কোনো একটি বাস্তব লিক হবে কারণ REPL স্মরণ গত তিন ফিরে মান (দেখুন *, **,*** ) এবং আমরা এখনও বরাদ্দ মেমরি মুক্ত করার একটি সুযোগ থাকতে পারে।

2 বাইট অপসারণ করা হয়েছে PrzemysławP ধন্যবাদ, ধন্যবাদ!


1
আপনি যে মানটি ফিরিয়ে দেন তার পরিবর্তে আপনি 1(বা 2, 3ইত্যাদি) ব্যবহার করতে পারবেন না ? এটি 1 বাইট সংরক্ষণ করতে হবে। এছাড়াও এই উত্তরটি কি কেবল রেপিএল? সম্ভবত আপনি যদি কোডটি লোড করেন তবে আপনার অন্তর্ভুক্ত বা কিছু অন্তর্ভুক্ত না করতে পারে , কারণ এটি যেভাবে অ্যাক্সেসযোগ্য হবে না? ()1load()
প্রিজেমিসাউপি

1
@ প্রজেমিসাওপি আপনি উভয় পয়েন্টেই ঠিক বলেছেন, আমি চেষ্টা করেছি evalএবং আপনি যেমন বলেছিলেন তেমন কাজ করে। অনেক ধন্যবাদ!
coredump

4

অটোআইটি , 39 বাইট

#include<Memory.au3>
_MemGlobalAlloc(1)

গাদা থেকে একটি বাইট বরাদ্দ করে। যেহেতু ফেরানো হ্যান্ডেলটি _MemGlobalAllocবাতিল করা হয়েছে, স্পষ্টভাবে সেই বরাদ্দকে মুক্ত করার কোনও উপায় নেই।


3

সি ++, 16 বাইট

main(){new int;}

এটি ফাঁস পরীক্ষা করার জন্য আমার কাছে ভ্যালগ্রাইন্ড নেই, তবে এটি অবশ্যই হওয়া উচিত। অন্যথায় আমি চেষ্টা করবে:

main(){[]{new int;}();}

ভালগ্রাইন্ড ফলাফল

(এটি সত্যই ফাঁস হয়)

==708== LEAK SUMMARY:
==708==    definitely lost: 4 bytes in 1 blocks

@ ওয়েট উইজার্ড আমি ব্যবহার করছি g++ 4.3.2(অতি সাম্প্রতিক এক নয়) এবং এটি ঠিক জরিমানা সংকলন করে। কোনও রিটার্নের ধরণ intডিফল্ট বলে আমি মনে করি না। সঙ্গে -Wallআমি একটি সতর্কবার্তা যদিও আছে:plop.cpp:1: warning: ISO C++ forbids declaration of 'main' with no type
matovitch

2
@ ওয়েট উইজার্ড দুঃখিত, আমি সবেমাত্র দেখেছি প্রতিযোগিতা শুরু করার জন্য আপনি সি ++ উদাহরণ দিয়েছেন। রেডডিট থেকে আগত আমি কেবলমাত্র উত্তরের দিকে চেয়েছিলাম এবং (আশ্চর্যরূপে) কোনও সি ++ দেখতে পাইনি। আমি কিছুটা বোবা অনুভব করছি। : /
মাতোভিচ

Sensক্যমত্য হ'ল আপনি কেবল []{new int;}সি ++ ফাংশন হিসাবে গণনা করতে পারেন (চ্যালেঞ্জটি পুরো প্রোগ্রামটিকে নির্দিষ্ট করে না)।
টবি স্পিড

3

জাভা (ওপেনজেডকে 9) , 322 220 বাইট

import sun.misc.*;class Main{static void main(String[]a)throws Exception{java.lang.reflect.Field f=Unsafe.class.getDeclaredField("theUnsafe");f.setAccessible‌​(1<2);((Unsafe)f.get‌​(1)).allocateMemory(‌​1);}}

এটি অনলাইন চেষ্টা করুন!

এটি অন্য একটি মেমরি ফুটো যা স্ট্রিং ক্যাশে ব্যবহার করে না। এটি আপনার র‌্যামের অর্ধেক বরাদ্দ করে এবং আপনি এটি দিয়ে কিছুই করতে পারবেন না।

সমস্ত বাইট সংরক্ষণ করার জন্য জেপেলিনকে ধন্যবাদ


এর Unsafeঅভ্যন্তরের স্থির পরিবর্তনশীল থেকে উদাহরণটি পেয়ে আপনি একগুচ্ছ বাইট সংরক্ষণ করতে পারেন , যেমন:import sun.misc.*;class M{static void main(String[]a)throws Exception{java.lang.reflect.Field f=Unsafe.class.getDeclaredField("theUnsafe");f.setAccessible(1<2);((Unsafe)f.get(1)).allocateMemory(1);}}
জেপেলিন

এবং আপনি public static void mainস্ট্যাটিক ইনিশিয়ালাইজার দ্বারা প্রতিস্থাপনের মাধ্যমে আরও কিছু বাঁচাতে পারেন static{try{}catch(Exception e){}}(এটি প্রবর্তন করতে কিছুটা জটিল হলেও এটি বৈধ ও সংকলনযোগ্য)।
জেপেলিন

হ্যাঁ, কনস্ট্রাক্টরের ব্যবহার আমি ব্যবহার করা কোডের একটি Android সংস্করণে ব্যবহৃত হয়েছিল। আমি @ হোম যখন কিছু জিনিস পরিবর্তন করব তবে আমি আপনার একক বিবৃতি দিয়ে যে পথে
চলেছি

হোয়াইটস্পেস সরান, aপরিবর্তে ব্যবহার করুন argsএবং সর্বজনীন সরান। tio.run/nexus/…
পাভেল

সত্যটি 1> 0
মাস্টারএক্স 244

3

সি, 9 বাইট

main(){}

প্রমাণ:

localhost/home/elronnd-10061: cat t.c
main(){}
localhost/home/elronnd-10062: valgrind gcc t.c
==10092== Memcheck, a memory error detector
==10092== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==10092== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==10092== Command: gcc t.c
==10092==
t.c:1:1: warning: return type defaults to ‘int’ [-Wimplicit-int]
 main(){}
 ^~~~
==10092==
==10092== HEAP SUMMARY:
==10092==     in use at exit: 178,518 bytes in 73 blocks
==10092==   total heap usage: 362 allocs, 289 frees, 230,415 bytes allocated
==10092==
==10092== LEAK SUMMARY:
==10092==    definitely lost: 4,659 bytes in 8 blocks
==10092==    indirectly lost: 82 bytes in 5 blocks
==10092==      possibly lost: 0 bytes in 0 blocks
==10092==    still reachable: 173,777 bytes in 60 blocks
==10092==         suppressed: 0 bytes in 0 blocks
==10092== Rerun with --leak-check=full to see details of leaked memory
==10092==
==10092== For counts of detected and suppressed errors, rerun with: -v
==10092== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

1
আপনি আসলে স্মৃতি ফাঁস করছেন না; gccহয়। এটি খালি প্রোগ্রামের সাথেও কাজ করা উচিত। চেষ্টা করুন gcc src.c && valgrind ./a.out, যা একটি পরিষ্কার ফলাফল উত্পাদন করা উচিত।

3

সি #, 109 বাইট

public class P{static void Main({for(;;)System.Xml.Serialization.XmlSerializer.FromTypes(new[]{typeof(P)});}}

আমরা প্রোডাকশন কোডে এই ফাঁসের পিছনে ধারণাটি পেয়েছি এবং এটির গবেষণা করে এই নিবন্ধটি নিয়ে যায়। মূল সমস্যাটি নিবন্ধটির দীর্ঘ উদ্ধৃতিতে রয়েছে (আরও তথ্যের জন্য এটি পড়ুন):

PurchaseOrdeআর এর জন্য আমার কোড অনুসন্ধান করে , আমি page_loadআমার পৃষ্ঠাগুলির একটিতে কোডের এই লাইনটি পেয়েছিXmlSerializer serializer = new XmlSerializer(typeof(PurchaseOrder), new XmlRootAttribute(“”));

এটি দেখতে বেশ নির্দোষ কোডের মতো মনে হবে। আমরা একটি XMLSerializerজন্য তৈরি PurchaseOrder। কিন্তু কী ঘটে?

আমরা যদি XmlSerializerরিফ্লেক্টর সহ কনস্ট্রাক্টরটি একবার দেখে নিই তবে আমরা দেখতে পেলাম যে এটি কল করে this.tempAssembly = XmlSerializer.GenerateTempAssembly(this.mapping, type, defaultNamespace, location, evidence);যা একটি অস্থায়ী (গতিশীল) সমাবেশ উত্পন্ন করে। সুতরাং প্রতিবার এই কোডটি চলমান (যেমন প্রতিবার পৃষ্ঠাটি আঘাত করা হয়) এটি একটি নতুন সমাবেশ তৈরি করবে।

এটি একটি সমাবেশ উত্পন্ন করার কারণটি হ'ল এটির সিরিয়ালাইজেশন এবং deserialization জন্য ফাংশন উত্পন্ন করা প্রয়োজন এবং এগুলি কোথাও থাকার প্রয়োজন।

ঠিক আছে, ঠিক আছে ... এটি একটি সমাবেশ তৈরি করে, তাই কি? যখন আমরা এটি শেষ করেছি, এটি ঠিক ঠিক অদৃশ্য হয়ে যাবে?

ঠিক আছে ... একটি সমাবেশ জিসি হিপগুলির কোনও বিষয় নয়, জিসি সত্যই সমাবেশগুলির সম্পর্কে অজানা, সুতরাং এটি আবর্জনা সংগ্রহ করবে না। 1.0 এবং 1.1 এ সমাবেশগুলি থেকে মুক্তি পাওয়ার একমাত্র উপায় হ'ল এটিতে থাকা অ্যাপ্লিকেশন ডোমেনটি আনলোড করা।

এবং এর মধ্যে ড ওয়াটসনের সমস্যা রয়েছে lies

ভিজ্যুয়াল স্টুডিও 2015 এর সংকলক থেকে চালানো এবং ডায়াগনস্টিক সরঞ্জাম উইন্ডো ব্যবহার করে প্রায় 38 সেকেন্ড পরে নিম্নলিখিত ফলাফলগুলি দেখায়। নোট করুন প্রক্রিয়া স্মৃতিটি অবিচ্ছিন্নভাবে উঠছে এবং আবর্জনা সংগ্রাহক (জিসি) চলতে থাকে তবে কিছুই সংগ্রহ করতে পারে না।

ডায়াগনস্টিক সরঞ্জাম উইন্ডো


2

সি 30 বাইট

f(){int *i=malloc(sizeof(4));}

ভালগ্র্যান্ড ফলাফল:

         ==26311== HEAP SUMMARY:
         ==26311==     in use at exit: 4 bytes in 1 blocks
         ==26311==   total heap usage: 1 allocs, 0 frees, 4 bytes allocated
         ==26311== 
         ==26311== LEAK SUMMARY:
         ==26311==    definitely lost: 4 bytes in 1 blocks
         ==26311==    indirectly lost: 0 bytes in 0 blocks
         ==26311==      possibly lost: 0 bytes in 0 blocks
         ==26311==    still reachable: 0 bytes in 0 blocks
         ==26311==         suppressed: 0 bytes in 0 blocks
         ==26311== Rerun with --leak-check=full to see details of leaked memory

2
পরিবর্তে কেবল এটি করা সম্ভব main(){malloc(1);}?
kirbyfan64sos

@ হ্যাঁ! তবে এটি ইতিমধ্যে পোস্ট করা হয়েছে!
আবেল টম

2

ডার্ট, 76 বাইট

import'dart:async';main()=>new Stream.periodic(Duration.ZERO).listen((_){});

জাভাস্ক্রিপ্ট উত্তরের মতো কিছুটা। আপনি যখন .listenডার্ট স্ট্রিম অবজেক্টে কল করবেন তখন আপনাকে স্ট্রিমসস্ক্রিপশন ফিরিয়ে দেওয়া হবে, যা আপনাকে স্ট্রিম থেকে সংযোগ বিচ্ছিন্ন করতে দেয়। তবে, আপনি যদি এটিকে ফেলে দেন তবে আপনি কখনও স্ট্রিম থেকে সাবস্ক্রাইব করতে পারবেন না, ফলে ফাঁস হবে। যদি স্ট্রিম নিজেই সংগ্রহ হয়ে যায় তবে লিক ঠিক করার একমাত্র উপায় হ'ল তবে এটি এখনও স্ট্রিমকন্ট্রোলার + টাইমার কম্বো দ্বারা অভ্যন্তরীণভাবে রেফারেন্স করা হয়েছে।

দুর্ভাগ্যক্রমে, ডার্টটি আমি চেষ্টা করেছি এমন অন্যান্য জিনিসগুলির জন্য খুব স্মার্ট। ()async=>await new Completer().futureকাজ করে না কারণ প্রতীক্ষা করা ব্যবহার করা সমান new Completer().future.then(<continuation>), যা ক্লোজারটি নিজেই ধ্বংস হতে দেয় দ্বিতীয় সমাপ্তিটিকে রেফারেন্স করা হয় না (কমপ্লিটর ফিউচারের কাছ থেকে .futureএকটি রেফারেন্স ধারণ করে, ফিউচারটি ক্লোজার হিসাবে ধারাবাহিকতার একটি রেফারেন্স ধারণ করে)।

এছাড়াও, আইসোলেটগুলি (ওরফে থ্রেডগুলি) জিসি দ্বারা পরিষ্কার করা হয়েছে, সুতরাং নিজেকে একটি নতুন থ্রেডে তৈরি করুন এবং অবিলম্বে এটি থামিয়ে দিন ( import'dart:isolate';main(_)=>Isolate.spawn(main,0,paused:true);) কাজ করে না। এমনকি অসীম লুপের সাহায্যে আইসোলেট তৈরি করা ( import'dart:isolate';f(_){while(true){print('x');}}main()=>Isolate.spawn(f,0);) বিচ্ছিন্নভাবে মারা যায় এবং প্রোগ্রামটি থেকে বেরিয়ে যায়।

আচ্ছা ভালো.


যদি আপনার মূল প্রোগ্রামটি চলতে থাকে এবং অন্যান্য জিনিসগুলি চালিয়ে যায় তবে আবর্জনা সংগ্রহকারী কি কখনও বিচ্ছিন্নতা থামাতে সক্ষম হবে? আমি জিজ্ঞাসা করি কারণ আমার গোরোটিন উদাহরণটি একই রকম মনে হচ্ছে ... আমি ধরে নিয়েছি যে প্রোগ্রামটি বেরিয়েছে এবং সমস্ত স্মৃতি মেমরিকে ওএসকে দেয় যে অগত্যা এটি ফাঁস হয় নি তার অর্থ নয়।
উজ্জ্বল করুন

2

সুইফট, 12 বাইট

[3,5][0...0]

ব্যাখ্যা:

এটি একটি ডি-ফ্যাক্টো মেমরি ফুটো যা কোনও ভাষায়ই ঘটতে পারে, ভাষা মেমোরি ম্যানুয়াল ম্যানেজমেন্ট, স্বয়ংক্রিয় রেফারেন্স গণনা (সুইফের মতো এআরসি) বা এমনকি জঞ্জাল সংগ্রহের পরিষ্কার ব্যবহার করে তা নির্বিশেষে occur

[3,5]আক্ষরিক মাত্র একটি অ্যারে। এই অ্যারে কমপক্ষে এই 2 উপাদানগুলির জন্য পর্যাপ্ত মেমরি বরাদ্দ করে। 3এবং 5শুধু অবাধ হয়।

সাবস্ক্রিপশন (ইনডেক্সিং) একটি Array<T>উত্পাদন করে ArraySlice<T>। একটি ArraySlice<T>অ্যারে এটা থেকে তৈরি করা হয়েছে স্মৃতির মধ্যে একটি দৃশ্য।

[3,5][0...0]একটি উত্পাদন ArraySlice<Int>, যার মান হয় [3]। মনে রাখবেন যে, 3এই ফালি মধ্যে একই 3উপাদান হিসেবে 3মূল Arrayউপরে দেখানো, না একটি কপি।

ফলস্বরূপ স্লাইসটি একটি ভেরিয়েবলের মধ্যে সংরক্ষণ এবং ব্যবহার করা যেতে পারে। মূল অ্যারেটি আর উল্লেখ করা হয় না, তাই আপনি ভাবেন যে এটি বিলোপ করা যেতে পারে। তবে তা পারে না।

যেহেতু স্লাইসটি অ্যারের থেকে এসেছে তার স্মৃতিতে একটি দৃষ্টিভঙ্গি প্রকাশ করেছে, স্লাইসটি যতক্ষণ না বেঁচে থাকবে ততক্ষণ মূল অ্যারেটি জীবিত রাখতে হবে। 2বরাদ্দকৃত মেমরির মূল উপাদান-আকারগুলির মধ্যে, কেবলমাত্র প্রথম উপাদান-আকারের মেমরি ব্যবহার করা হচ্ছে, অন্যটির সাথে প্রথমটির বরাদ্দ না করার জন্য বিদ্যমান থাকা প্রয়োজন। মেমরির দ্বিতীয় উপাদান-আকার ডি-ফ্যাক্টর ফাঁস।

এই সমস্যার সমাধানটি হ'ল বড় অ্যারেগুলির ছোট ছোট টুকরোগুলি দীর্ঘকাল ধরে না রাখা। যদি আপনার টুকরো টুকরো বিষয়বস্তু অবিরত রাখতে হয়, তবে এটিকে একটি অ্যারেতে উন্নীত করুন, যা মেমরিটিকে অনুলিপি করার জন্য ট্রিগার করবে, এইভাবে মূল অ্যারের স্মৃতিতে নির্ভরতা সরিয়ে ফেলবে:

Array([3,5][0...0])

2

সমাধান 1: সি (ম্যাক ওএস এক্স x86_64), 109 বাইট

Golf_sol1.c এর উত্স

main[]={142510920,2336753547,3505849471,284148040,2370322315,2314740852,1351437506,1208291319,914962059,195};

উপরোক্ত প্রোগ্রামটি____ ডেটা বিভাগে এক্সিকিউশন অ্যাক্সেসের সাথে সংকলন করা দরকার।

clang golf_sol1.c -o golf_sol1 -Xlinker -segprot -Xlinker __DATA -Xlinker rwx -Xlinker rwx

তারপরে প্রোগ্রামটি চালনার জন্য নিম্নলিখিতটি চালান:

./golf_sol1 $(ruby -e 'puts "\xf5\xff\xff\xfe\xff\xff\x44\x82\x57\x7d\xff\x7f"')

ফলাফল:

দুর্ভাগ্যক্রমে ভালগ্র্যান্ড সিস্টেম কলগুলি থেকে বরাদ্দকৃত মেমরির জন্য নজর রাখে না, তাই আমি একটি ভাল সনাক্ত হওয়া ফুটোটি দেখতে পাচ্ছি না।

তবে আমরা বরাদ্দ মেমরির বৃহত্তর অংশটি দেখতে (ম্যালোক মেটাডেটা) ভিএমএ্যাপে দেখতে পারি।

                                VIRTUAL   REGION 
REGION TYPE                        SIZE    COUNT (non-coalesced) 
===========                     =======  ======= 
Kernel Alloc Once                    4K        2 
MALLOC guard page                   16K        4 
MALLOC metadata                   16.2M        7 
MALLOC_SMALL                      8192K        2         see MALLOC ZONE table below
MALLOC_TINY                       1024K        2         see MALLOC ZONE table below
STACK GUARD                       56.0M        2 
Stack                             8192K        3 
VM_ALLOCATE (reserved)             520K        3         reserved VM address space (unallocated)
__DATA                             684K       42 
__LINKEDIT                        70.8M        4 
__TEXT                            5960K       44 
shared memory                        8K        3 
===========                     =======  ======= 
TOTAL                            167.0M      106 
TOTAL, minus reserved VM space   166.5M      106 

ব্যাখ্যা

সুতরাং আমি মনে করি উন্নত সমাধানের দিকে যাওয়ার আগে আমার এখানে আসলে কী চলছে তা বর্ণনা করা দরকার।

এই মূল ফাংশনটি সি এর অনুপস্থিত প্রকারের ঘোষণাকে অপব্যবহার করছে (সুতরাং এটি লেখার অক্ষরগুলি নষ্ট করার প্রয়োজন ছাড়াই আমাদের পূর্বনির্ধারিত হয়), পাশাপাশি কীভাবে চিহ্নগুলি কাজ করে। লিঙ্কারটি কেবলমাত্র mainকল করার জন্য ডাকা প্রতীকটি খুঁজে পাবে কিনা তা নিয়ে চিন্তা করে। সুতরাং এখানে আমরা int এর মূল একটি অ্যারে তৈরি করছি যা আমরা আমাদের শেলকোড দিয়ে শুরু করব যা কার্যকর হবে। এ কারণে, প্রধানটিকে __TEXT বিভাগে যুক্ত করা হবে না বরং __Data বিভাগে যুক্ত করা হবে, কারণ আমাদের একটি নির্বাহযোগ্য __Data বিভাগের সাথে প্রোগ্রামটি সংকলন করতে হবে।

মূলত পাওয়া শেলকোডটি নিম্নলিখিত:

movq 8(%rsi), %rdi
movl (%rdi), %eax
movq 4(%rdi), %rdi
notl %eax
shrq $16, %rdi
movl (%rdi), %edi
leaq -0x8(%rsp), %rsi
movl %eax, %edx
leaq -9(%rax), %r10
syscall
movq (%rsi), %rsi
movl %esi, (%rsi)
ret

এটি যা করছে তা মেমরির একটি পৃষ্ঠা বরাদ্দ করার জন্য সিস্কল ফাংশনটিকে কল করছে (সিস্কেল ম্যাক_ভিএম_লোকট অভ্যন্তরীণভাবে ব্যবহার করে)। আরএক্স 0x100000a এর সমান হওয়া উচিত (আমরা কী ফাংশনটি সিস্কেলকে বলি), যখন আরডিআই বরাদ্দের লক্ষ্য রাখে (আমাদের ক্ষেত্রে আমরা এটি ম্যাচ_টাস্ক_সেলফ হতে চাই)), নতুন তৈরি হওয়া স্মৃতিতে পয়েন্টার লেখার জন্য আরএসআইয়ের ঠিকানাটি রাখা উচিত (সুতরাং আমরা এটি কেবল স্ট্যাকের একটি অংশের দিকে নির্দেশ করছি), আরডিএক্স বরাদ্দটির আকার ধারণ করে (আমরা কেবল বাইটস সংরক্ষণ করতে কেবল RAX বা 0x100000a এ যাচ্ছি), আর 10 পতাকা ধারণ করে (আমরা এটি ইঙ্গিত করছি যে এটি করতে পারে) যে কোনও জায়গায় বরাদ্দ করা হবে)।

এখন এটি স্পষ্টভাবে সুস্পষ্ট নয় যে আরএক্স এবং আরডিআই তাদের মানগুলি কোথা থেকে পাচ্ছে। আমরা জানি RAX এর 0x100000a হওয়া দরকার, এবং আরডিআই-এর মান ম্যাক_টাস্ক_সেলফ () হওয়া উচিত। ভাগ্যক্রমে mach_task_self () আসলে একটি ভেরিয়েবলের জন্য ম্যাক্রো (mach_task_self_), যা প্রতিবার একই মেমরি ঠিকানায় হয় (তবে পুনরায় বুট করা উচিত)। আমার বিশেষ উদাহরণে mach_task_self_ 0x00007fff7d578244 এ অবস্থিত। সুতরাং নির্দেশাবলী কাটাতে, আমরা পরিবর্তে এই তথ্যটি আরজিভি থেকে পাস করব। এই কারণেই আমরা এই অভিব্যক্তিটি দিয়ে প্রোগ্রামটি পরিচালনা করি$(ruby -e 'puts "\xf5\xff\xff\xfe\xff\xff\x44\x82\x57\x7d\xff\x7f"')প্রথম যুক্তি জন্য। স্ট্রিংটি দুটি মান সম্মিলিত, যেখানে RAX মান (0x100000a) কেবলমাত্র 32 টি বিট এবং এতে একটির পরিপূরক প্রয়োগ করা হয়েছে (সুতরাং কোনও নাল বাইট নেই; মূলটি পাওয়ার জন্য আমরা কেবল মানটি পাই না), পরের মানটি আরডিআই (0x00007fff7d578244) যা শেষে 2 টি অতিরিক্ত জাঙ্ক বাইট যুক্ত করে বামে স্থানান্তরিত হয়েছে (নাল বাইটগুলি বাদ দিতে, আমরা কেবল এটি আসলটিতে ফিরে পেতে ডানদিকে ফিরে স্থানান্তরিত করব)।

সিস্কেলের পরে আমরা আমাদের নতুন বরাদ্দ মেমরিটিতে লিখছি। এর কারণ হ'ল ম্যাক_ভিএম_লোকট (বা এই সিসকল) ব্যবহার করে বরাদ্দ করা মেমরিটি আসলে ভিএম পৃষ্ঠাগুলি, এবং মেমরিতে স্বয়ংক্রিয়ভাবে পৃষ্ঠাযুক্ত হয় না। বরং এগুলি সংরক্ষণ করা হয় যতক্ষণ না তাদের কাছে ডেটা লেখা হয় এবং তারপরে সেই পৃষ্ঠাগুলিকে মেমরিতে ম্যাপ করা হয়। নিশ্চিত ছিল না যে এটি প্রয়োজনীয়তাগুলি কেবলমাত্র সংরক্ষিত থাকলে পূরণ করবে কিনা।

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

সমাধান 2: সি (ম্যাক ওএস এক্স x86_64), 44 বাইট

Golf_sol2.c এর উত্স

main[]={141986632,10937,1032669184,2,42227};

উপরোক্ত প্রোগ্রামটি____ ডেটা বিভাগে এক্সিকিউশন অ্যাক্সেসের সাথে সংকলন করা দরকার।

clang golf_sol2.c -o golf_sol2 -Xlinker -segprot -Xlinker __DATA -Xlinker rwx -Xlinker rwx

তারপরে প্রোগ্রামটি চালনার জন্য নিম্নলিখিতটি চালান:

./golf_sol2 $(ruby -e 'puts "\xb8\xf5\xff\xff\xfe\xf7\xd0\x48\xbf\xff\xff\x44\x82\x57\x7d\xff\x7f\x48\xc1\xef\x10\x8b\x3f\x48\x8d\x74\x24\xf8\x89\xc2\x4c\x8d\x50\xf7\x0f\x05\x48\x8b\x36\x89\x36\xc3"')

ফলাফলটি আগের মতোই হওয়া উচিত, কারণ আমরা একই আকারের বরাদ্দ করছি।

ব্যাখ্যা

সমাধানটি 1 এর মত একই ধারণা অনুসরণ করে, আমরা আমাদের লিক কোডটির অংশটিকে প্রোগ্রামের বাইরে সরিয়ে নিয়েছি with

মূলত পাওয়া শেলকোড এখন নিম্নলিখিত:

movq 8(%rsi), %rsi
movl $42, %ecx
leaq 2(%rip), %rdi
rep movsb (%rsi), (%rdi)

এটি মূলত এই কোডটির পরে হওয়ার জন্য আমরা আরগভিতে যে শেলকোডটি পাস করি তা অনুলিপি করে (তাই এটি এটি অনুলিপি করার পরে এটি shellোকানো শেলকোডটি চালাবে)। আমাদের পক্ষে কাজটি হ'ল __ডাটা বিভাগটি কমপক্ষে একটি পৃষ্ঠার আকার হবে, তাই আমাদের কোডটি এত বড় না হলেও আমরা আরও "নিরাপদে" আরও লিখতে পারি। নেতিবাচকতা এখানে আদর্শ সমাধান, এমনকি অনুলিপিটিরও প্রয়োজন হবে না, পরিবর্তে এটি কেবল আরজিভিতে শেলকোডটি কল করে সরাসরি চালিত করে। তবে দুর্ভাগ্যক্রমে, এই স্মৃতিটিতে মৃত্যুদন্ড কার্যকর করার অধিকার নেই। আমরা এই মেমরির অধিকারগুলি পরিবর্তন করতে পারি, তবে এটির অনুলিপি করার চেয়ে আরও কোডের প্রয়োজন হবে। একটি বিকল্প কৌশল হ'ল বাহ্যিক প্রোগ্রাম থেকে অধিকারগুলি পরিবর্তন করা (তবে পরে এটি আরও)।

আরগভিতে আমরা যে শেলকোডটি পাস করি তা নিম্নলিখিত:

movl $0xfefffff5, %eax
notl %eax
movq $0x7fff7d578244ffff, %rdi
shrq $16, %rdi
movl (%rdi), %edi
leaq -0x8(%rsp), %rsi
movl %eax, %edx
leaq -9(%rax), %r10
syscall
movq (%rsi), %rsi
movl %esi, (%rsi)
ret

এটি আমাদের আগের কোডের মতোই একই, কেবলমাত্র আমরা EAX এবং আরডিআইয়ের জন্য মানগুলি অন্তর্ভুক্ত করছি কেবল তফাত।

সম্ভাব্য সমাধান 1: সি (ম্যাক ওএস এক্স x86_64), 11 বাইট

বাহ্যিকভাবে প্রোগ্রামটি সংশোধন করার ধারণাটি আমাদের বেকারকে একটি বাহ্যিক প্রোগ্রামে স্থানান্তরিত করার সম্ভাব্য সমাধান দেয়। যেখানে আমাদের আসল প্রোগ্রাম (জমা দেওয়া) কেবল একটি ডামি প্রোগ্রাম এবং লিকার প্রোগ্রামটি আমাদের লক্ষ্য প্রোগ্রামে কিছু মেমরি বরাদ্দ করবে। এখন আমি নিশ্চিত ছিলাম না যে এটি এই চ্যালেঞ্জের নিয়মের মধ্যে পড়ে কিনা তবে তা ভাগ করে নিই।

সুতরাং আমরা যদি আমাদের চ্যালেঞ্জ প্রোগ্রামের লক্ষ্যবস্তু সহ কোনও বাহ্যিক প্রোগ্রামে mach_vm_allocon ব্যবহার করি, তবে এর অর্থ আমাদের চ্যালেঞ্জ প্রোগ্রামটির কেবলমাত্র কিছু হওয়া দরকার:

main=65259;

যেখানে শেলকোডটি কেবল নিজের কাছে একটি স্বল্প লাফ (অসীম লাফ / লুপ) থাকে তাই প্রোগ্রামটি উন্মুক্ত থাকে এবং আমরা এটি কোনও বাহ্যিক প্রোগ্রাম থেকে উল্লেখ করতে পারি।

সম্ভাব্য সমাধান 2: সি (ম্যাক ওএস এক্স x86_64), 8 বাইট

ভ্যালগ্রিন্ড আউটপুটটির দিকে তাকাতে গিয়ে মজাদারভাবে যথেষ্ট আমি দেখেছি কমপক্ষে ভালগ্রাইন্ড অনুসারে, ডিল্ড লিক মেমরি। সুতরাং কার্যকরভাবে প্রতিটি প্রোগ্রাম কিছু মেমরি ফাঁস হয়। এটির ক্ষেত্রে, আমরা আসলে একটি প্রোগ্রাম তৈরি করতে পারি যা কিছুই না (কেবল প্রস্থান করে), এবং এটি আসলে স্মৃতি ফাঁস হবে।

উৎস:

main(){}


==55263== LEAK SUMMARY:
==55263==    definitely lost: 696 bytes in 17 blocks
==55263==    indirectly lost: 17,722 bytes in 128 blocks
==55263==      possibly lost: 0 bytes in 0 blocks
==55263==    still reachable: 0 bytes in 0 blocks
==55263==         suppressed: 16,316 bytes in 272 blocks

2

সরল ইংলিশ , 71 70 58 35 বাইট

একটি ফাঁকা লাইন মুছে ফেলে 1 বাইট সরানো হয়েছে। "বোগন" ধরণের সংজ্ঞাটি মুছে ফেলা এবং "বোগন" সাব টাইপের পরিবর্তে প্যারেন্ট "জিনিস" টাইপ ব্যবহার করে 12 বাইট অপসারণ করা হয়েছে। সম্পূর্ণ প্রোগ্রাম থেকে সরিয়ে 23 বাইট সরানো হয়েছে, কেবল এমন একটি রুটিনে যা মেমরি ফাঁস করে।

গল্ফ সংস্করণ:

To x:
Allocate memory for a thing.

অসম্পূর্ণ সংস্করণ যা একটি সম্পূর্ণ প্রোগ্রাম, একটি সাব টাইপ সংজ্ঞা ব্যবহার করে এবং মেমরি ফাঁস করে না:

A bogon is a thing.

To do something:
  Allocate memory for a bogon.
  Destroy the bogon.

To run:
  Start up.
  Do something.
  Shut down.

যদি "x" এর গল্ফযুক্ত সংস্করণটি বলা হয়, এটি "x" নাম্বার সংখ্যার অনুপাতের সাথে মেমরি ফাঁস করবে। গল্ফযুক্ত সংস্করণে, "জিনিসটি বাতিল করুন" " স্মৃতি ফুটো ঠিক করবে।

ডিফল্টরূপে মেমরি ফাঁসের জন্য সরল ইংরাজী পরীক্ষা করে। মেমরি ফাঁস করা সংস্করণটি চালানো হলে, প্রোগ্রামটি বন্ধ হওয়ার ঠিক আগে ডায়ালগ বক্স উপস্থিত হবে। কথোপকথন বাক্সটিতে "ডিবাগ", একটি "1 ড্রিপ" এর বার্তা এবং একটি "ঠিক আছে" বোতামের একটি শিরোনাম রয়েছে। যত বেশি বার ফাঁস ফাংশন বলা হয়, বার্তায় "ড্রিপস" এর সংখ্যা বেশি। মেমরি ফাঁস না করে এমন সংস্করণটি চালানো হলে ডায়ালগ বক্সটি উপস্থিত হয় না।

সাদামাটা ইংলিশে, একটি "জিনিস" দ্বিগুণ-সংযুক্ত তালিকার কোনও আইটেমের নির্দেশক। "থিং", "স্টার্ট আপ" এবং "শাট ডাউন" কে "নুডল" নামে পরিচিত একটি মডিউলে সংজ্ঞায়িত করা হয়েছে, যা প্রতিটি প্রকল্পে অনুলিপি করা (সাধারণত পৃথক ফাইল হিসাবে) প্রয়োজন। "এ", "" "," থেকে "," মেমরি বরাদ্দ করতে ", এবং" ধ্বংস করতে "সংকলকটিতে সংজ্ঞায়িত হয়েছে।

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