কোনও কাঁটাচামচ বোমা ছাড়াই একটি স্মৃতি ফাঁস তৈরি করুন [বন্ধ]


54

আপনার কাজটি একটি মেমরি ফুটো তৈরি করা । এটি এমন একটি প্রোগ্রাম যা প্রচুর পরিমাণে মেমরি ব্যবহার করে, যতক্ষণ না কম্পিউটার শেষ হয়ে যায় এবং নিজেকে শেষ হয়ে যাওয়া থেকে বাঁচানোর জন্য কিছু অদলবদল করতে হয়। মেমরিটি প্রকাশের একমাত্র উপায় হ'ল টাস্ক ম্যানেজারে প্রোগ্রামটি মেরে ফেলা বা কমান্ড লাইন কিল যেমন taskkill /im yourprogram /f(উইন্ডোজে) ব্যবহার করা বা কম্পিউটার পুনরায় চালু করা। অ্যাপ্লিকেশনটি কেবলমাত্র বন্ধ করা হোগের স্মৃতিতে চালিয়ে যাওয়া আটকাবে না।

নিয়মাবলী:

  1. যে কোনও ধরণের কাঁটাচামচ বোমা নিষিদ্ধ। তার মানে কুখ্যাত বাশ লাইন :(){ :|:&};:নিষিদ্ধ!

  2. অ্যাপ্লিকেশনটি কেবল একক থ্রেডযুক্ত হতে হবে। এটি কাঁটাচামচ বোমা বিধি নির্দেশ করে।

  3. প্রোগ্রামটি অবশ্যই অন্যান্য প্রোগ্রামগুলি পরিচালনা করে না। এর অর্থ হ'ল আপনি ঠিক এর মতো কিছু করতে পারবেন না run(memoryfiller.exe)। এর একমাত্র ব্যতিক্রম হ'ল প্রোগ্রামগুলি যা আপনার ওএস বা ভাষার সাথে বান্ডিল করা হয়, যা মূলত মেমরি গ্রাস করার জন্য ডিজাইন করা হয়নি (অর্থাত তাদের অন্য উদ্দেশ্য রয়েছে)। এর অর্থ হ'ল পছন্দ করা catএবং ln -sঅনুমোদিত।

  4. আপনি যতটা স্মৃতি পছন্দ করতে পারেন। যত বেশি তত ভালো.

  5. কোড পুরোপুরি ব্যাখ্যা করা আবশ্যক।

শুভকামনা। এটি একটি জনপ্রিয়তার প্রতিযোগিতা তাই জিজ্ঞাসার তারিখের 10 দিনের পরে সর্বাধিক ভোট সহ কোডটি জয়ী!


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

54
এটা কি ঠিক নয় while(1)malloc(999);?
ডুরকনব

10
আমি নিশ্চিত নই "" এটি বন্ধ করলেও এটি হোগ মেমরি হওয়া উচিত "এর সাথে সামঞ্জস্যপূর্ণ" অ্যাপ্লিকেশনটি কেবলমাত্র একক থ্রেডড থাকতে হবে। " যদি কোনও থ্রেডের মেমরির পরিমাণ না থাকে তবে ওএস এটিকে আবার নিতে পারে, তাই না?
এ্যাবিবিস

51
আধটা ঘন্টার জন্য কয়েকটি ট্যাব খুলতে চলুন কেবল ফায়ার ফক্স 26 চালান। এটি আপনার কম্পিউটারকে তার হাঁটুতে আনবে।
ব্র্যাডেন সেরা

1
@mniip। এটাই চ্যালেঞ্জের পুরো বিষয়টি। একটি কঠিন চ্যালেঞ্জ করা। এবং ডোরকনব। আমি কিছু অন্য চেয়েছিলেন! ;)
জর্জ

উত্তর:


78

উইন্ডোজ

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

সংকলন করতে: cl /MD leak.cpp /link psapi.lib

#include <windows.h>
#include <psapi.h>

typedef void (*ProcFunc)(DWORD pid);
#define ALLOC_SIZE 0x100000
LPVOID buf;

void ForEachProcess(ProcFunc f)
{
    DWORD aProcesses[1024], cbNeeded;

    if (!EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded))
        return;

    for (unsigned int i = 0; i < cbNeeded / sizeof(DWORD); i++)
        if (aProcesses[i] != 0)
            f(aProcesses[i]);
}

void RemoteLeak(DWORD pid)
{
    HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pid );
    if (hProcess == NULL)
        return;

    for (;;)
    {
        LPVOID ptr = VirtualAllocEx(hProcess, NULL, ALLOC_SIZE, 
                                    MEM_COMMIT, PAGE_READWRITE);
        if (ptr == NULL)
            return;

        WriteProcessMemory(hProcess, ptr, buf, ALLOC_SIZE, NULL);
    }
}

int main(void)
{
    buf = malloc(ALLOC_SIZE);
    if (buf == NULL)
        return 0;

    memset(buf, 0xFF, ALLOC_SIZE);

    ForEachProcess(RemoteLeak);

    return 0;
}

9
উইন্ডোজ খারাপ।
টমসডিং

4
আমার আজ রাতে বন্ধ করা দরকার আমি এটি দিয়ে যাই;)
জর্জ

1
"(একজন সাধারণ ব্যবহারকারী হিসাবে চলমান, প্রশাসনিক সুবিধাগুলি ব্যবহার না করে" - এটি সম্পর্কে নিশ্চিত নন, আপনার SeDebugPrivilege প্রয়োজন যা ডিফল্টরূপে নিয়মিত ব্যবহারকারীর টোকেনে উপস্থিত থাকে না
rkosegi

@ আরকোসেগি ধন্যবাদ, স্থির।
অ্যান্ড্রু মেডিকো

14
+1 এটি অনেকগুলি উপকারের দাবি রাখে কারণ এটি এখনও পর্যন্ত একমাত্র উত্তর যা আসল ক্লোজিংয়ের সাথে মিলিত এটি এখনও এটি হগ মেমরির প্রয়োজনীয়তা তৈরি করে। খুব সৃজনশীল সমাধান :-)
ড্যানিয়েল

72

জাভা

import java.util.concurrent.atomic.AtomicInteger;

public class Hydra {
  // Not actually necessary for the leak - keeps track of how many Hydras there are, so we know when they're all gone
  public static AtomicInteger count = new AtomicInteger(0);
  public Hydra() {
    count.incrementAndGet();
  }
  protected void finalize() {
    new Hydra();
    new Hydra();
    count.decrementAndGet();
  }

  public static void main(String[] args) throws InterruptedException {
    new Hydra();
    while (Hydra.count.get() > 0) {
      // Prevent leaks ;-)
      System.gc();
      System.runFinalization();
    } 
  }
}

ব্যাখ্যা

আপনি ধরে নিতে পারেন যেহেতু কোডটিতে কোনও রেফারেন্স নেই (অন্যটি count, যা আপনি নিরাপদে উপেক্ষা করতে পারেন), এটি ফাঁস হতে পারে না। যাইহোক, চূড়ান্তকরণকারী দুটি নতুন হাইড্রাস তৈরি করে এবং এটিগুলির জন্য কোনও রেফারেন্স রাখে না, চূড়ান্ত না হওয়া পর্যন্ত তারা ঘুরে বেড়াবে। এর অর্থ হ'ল প্রোগ্রামটি আবর্জনা সংগ্রহের সময় কেবল মেমরি ফাঁস করে - সুতরাং কলগুলি System.gc()এবং System.runFinalization()


7
@TimS। এখন তোমার খোদা কোথাই?!?
ক্রুঙ্কার

হয় System.gc()এবং System.runFinalization()প্রয়োজনীয়? এটি হ'ল কখনও কখনও জিসিটি এলোমেলোভাবে চলবে, বা আপনাকে কিছু স্মৃতি পূরণ করতে হবে, বা জিসি কল করতে হবে?
ক্রুঙ্কার

4
একটি সাধারণ প্রোগ্রামে System.gc()এবং System.runFinalization()এটি প্রয়োজনীয় হবে না। মেমরির চাপের কারণে আবর্জনা সংগ্রহ স্বাভাবিকভাবেই ঘটবে। তবে আবর্জনা সংগ্রহ চলমান শুরু না করা পর্যন্ত এই অ্যাপ্লিকেশনটিতে কোনও মেমরির চাপ নেই। আমি কিছুকে কৃত্রিমভাবে পরিচয় করিয়ে দেওয়ার বিষয়ে চিন্তা করেছি (উদাহরণস্বরূপ, new Hydra()লুপের অভ্যন্তরে সরে গিয়ে) তবে এটি আরও খারাপ ছিল।
জেমস_পিক

1
হ্যাঁ, "এটি বন্ধ করার পরেও এটি হাগ মেমোরি তৈরি করা উচিত" এর প্রতি আমি খুব বেশি মনোযোগ দিইনি, কারণ এটি অর্থবহ বলে মনে হচ্ছে না (@ জার্মানি_গুইয়ের মতো ঝরঝরে ওএস হ্যাক বাদে)। জাভা সর্বদা একটি চূড়ান্তকরণ থ্রেড স্পিন করে, তাই সম্ভবত জাভা অ্যাপ্লিকেশনটির # 2 বিধি মেনে চলার কোনও উপায় নেই।
জেমস_পিক

1
ইউনিক্স সিস্টেমে আপনি সিগ্কিল (ব্লগ 9) ব্লক করতে পারবেন না, তাই আপনি আপনার প্রোগ্রামটি অবিরাম বন্ধ করতে পারবেন না (ভাল, আপনি যদি এটিকে নিরবচ্ছিন্ন অপেক্ষার স্থানে নিয়ে যাওয়ার ব্যবস্থা করেন তবে ... তাই সম্ভবত এমন কোনও এনএফএস সার্ভারকে রিমোট-মেরে ফেলবেন যার ফাইলগুলি আপনি অ্যাক্সেস কাজ করতে পারে ;-))
celtschk

37

সি

সি প্রোগ্রামিং ভাষা ব্যবহার করে এবং লিনাক্স কার্নেল ২.6.৩২-৪৯-জেনেরিক এবং libc-2.11.1.so এর সাথে পরীক্ষিত with

মেমরিটি প্রকাশের একমাত্র উপায় হ'ল প্রোগ্রামটি টাস্ক ম্যানেজারে হত্যা করা বা টাস্ককিল / আইএম আপনার প্রোগ্রাম / এফ ব্যবহার করা বা পিসি পুনরায় চালু করা।

সিগ্কিল এবং সিগস্টপ ব্যতীত অন্য কোনও সংকেতকে অবরুদ্ধ করে এটি অর্জন করা হয়।

এটি বন্ধ করা এখনও এটি হোগ মেমরির হওয়া উচিত।

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

যে কোনও ধরণের কাঁটাচামচ বোমা নিষিদ্ধ। তার অর্থ এই যে কুখ্যাত বাশ: () {: |: &} ;: নিষিদ্ধ!

প্রক্রিয়া কাঁটাচামচ না।

অ্যাপ্লিকেশনটি কেবল একক থ্রেডড থাকতে হবে। এটি কাঁটা বোমা বিধি নির্দেশ করে rule

কোনও নতুন থ্রেড তৈরি করা হয়নি।

প্রোগ্রামটি অবশ্যই অন্যান্য প্রোগ্রাম চালাবেন না। এর অর্থ হ'ল আপনি রানের মতো কিছু করতে পারবেন না (মেমরিফিলার.এক্স.ই.)

কোনও নতুন প্রক্রিয়া তৈরি হয় না।

আপনি যতটা স্মৃতি পছন্দ করতে পারেন। যত বেশি তত ভালো.

অপারেটিং সিস্টেম যতটা সরবরাহ করতে পারে।

কোড পুরোপুরি ব্যাখ্যা করা আবশ্যক।

উত্সটিতে মন্তব্য যুক্ত করা হয়েছে।

এবং অবশেষে এখানে কোড:

#define _GNU_SOURCE

#include <stdio.h>
#include <signal.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdlib.h>


int main(int argc, char* argv[]) {

    /*
    set the real, effective and set user id to root,
    so that the process can adjust possible limits.
    if the process doesn't have the CAP_SETUID capability, terminate the process.
    */
    if (setresuid(0, 0, 0) == -1) {
        printf("Are you root?!\n");
        return 1;
    }

    /*
    block all signals except for kill and stop.
    this allows to terminate the parent process (most likely a terminal)
    that this process is running in and turn it into a daemon.
    additionally this makes it impossible to terminate the process
    in a normal way and therefore satisfies the requirement that closing
    it should still make it hog memory.
    */
    sigset_t mask;
    sigfillset(&mask);
    sigprocmask(SIG_SETMASK, &mask, NULL);

    /*
    allow the process to acquire a virtually unlimited amount of memory
    and queue a virtually unlimited amount of signals.
    this is to prevent an out of memory error due to a virtual limit for the root user,
    which would prevent the process from leaking any more memory
    and to prevent the process from getting killed due to too many queued
    signals that the process is blocking.
    */
    struct rlimit memory = { RLIM_INFINITY, RLIM_INFINITY },
                  signal = { RLIM_INFINITY, RLIM_INFINITY};
    setrlimit(RLIMIT_AS, &memory);
    setrlimit(RLIMIT_SIGPENDING, &signal);

    /*
    allocate a buffer big enough to store a file name into it
    that is generated from the process' pid.
    if the file can be opened (which should always be the case unless /proc is not mounted)
    the file will be opened and the string -17 followed by a new line written to it.
    this will cause the oom killer to ignore our process and only kill other,
    innocent processes when running out of memory.
    */
    char file_name[20];
    sprintf(file_name, "/proc/%u/oom_adj", getpid());

    FILE* oom_killer_file = fopen(file_name, "w");
    if (oom_killer_file) {
        fprintf(oom_killer_file, "-17\n");
        fclose(oom_killer_file);
    }

    /*
    get the size of virtual memory pages in bytes,
    so the process knows the size of chunks that have to be
    made dirty to force the kernel to map the virtual memory page into RAM.
    */
    long page_size = sysconf(_SC_PAGESIZE);

    // allocate a virtually infinite amount of memory by chunks of a page size.
    while(1) {
        // will overwrite any previous stored address in tmp, leaking that memory.
        char* tmp = (char*) malloc(page_size);
        if (tmp)
            // make the memory page dirty to force the kernel to map it into RAM.
            tmp[0] = 0;
    }

    return 0;
}

আপনি যদি এই প্রোগ্রামটি চালিয়ে যান তবে যা ঘটতে আগ্রহী তার জন্য: আমার 2 জিবি র‌্যাম এবং 4 জিবি স্বাপের পরীক্ষার সিস্টেমে র‌্যামটি এবং অদলবদূত করতে 10 মিনিট সময় লেগেছে। ওওএম হত্যাকারী এটির কাজ শুরু করে এবং তিন মিনিট পরে সমস্ত ধরণের প্রক্রিয়াটি হত্যা করা হয়। এমনকি মাউস, কীবোর্ড এবং ডিসপ্লেও সিস্টেমটি বাদ দিয়েছে। /var/log/kern.log, নিহত প্রক্রিয়াগুলি ব্যতীত কোনও দরকারী তথ্য প্রদর্শন করে না।


আমি ওوم কিলারটিকে প্রক্রিয়াটি উপেক্ষা করার জন্য এবং পরিবর্তে মেমরি মুক্ত করার জন্য নির্দোষ প্রক্রিয়াগুলিকে হত্যা করার জন্য উত্সটি সম্পাদনা করেছি।
foobar

5
আপনি যদি এই প্রোগ্রামটি চালিয়ে যান তবে যা ঘটতে আগ্রহী তার জন্য: আমার 2 জিবি র‌্যাম এবং 4 জিবি স্বাপের পরীক্ষার সিস্টেমে র‌্যামটি এবং অদলবদূত করতে 10 মিনিট সময় লেগেছে। ওওএম হত্যাকারী এটির কাজ শুরু করে এবং তিন মিনিট পরে সমস্ত ধরণের প্রক্রিয়া হত্যা করা হয়। এমনকি মাউস, কীবোর্ড এবং ডিসপ্লেও সিস্টেমটি বাদ দিয়েছে। /var/log/kern.log, নিহত প্রক্রিয়াগুলি ব্যতীত কোনও দরকারী তথ্য প্রদর্শন করে না।
foobar

হাহা, দারুণ! আপনার বিবরণটি আপনার উত্তরে সম্পাদনা করা উচিত। +1
ডুরকনব

1
আমি ডাউনওয়েট করিনি, তবে কোডটি ফর্ম্যাট করা যায় তাই মন্তব্যগুলি পড়ার জন্য কোনও অনুভূমিক স্ক্রোলিংয়ের প্রয়োজন হয় না তবে ভাল লাগবে।
পাওলো ইবারম্যান

2
1 এর জন্য +1) ইনপুট / আউটপুট ডিভাইসগুলি হস্তান্তর করার প্রক্রিয়া সৃষ্টি করে এবং 2) লগগুলি থেকে ট্র্যাক করা এমন একটি প্রোগ্রাম তৈরি করা। এটি গোঁফ-কুঁচকির স্তর।
কেভিন

29

খাঁটি বাশ

কাঁটাচামচ নয়, আমি প্রতিশ্রুতি দিচ্ছি:

:(){ : $@$@;};: :

এটি দেখতে অনেকটা কাঁটাচামচ বোমার মতো, এবং অনুরূপ পুনরাবৃত্ত কৌশলটি ব্যবহার করে, তবে কাঁটাচামচ নেই। অবশ্যই এটি আপনার শেলটি মেমরির বাইরে চলে যাবে, সুতরাং আপনাকে এই আদেশটি আটকানোর আগে একটি নতুন শেল শুরু করার পরামর্শ দেওয়া হচ্ছে।

  • বলা একটি ফাংশন সংজ্ঞা :
  • ফাংশনটি কেবল পুনরাবৃত্তভাবে কল করে $@(আরগ তালিকা) দ্বিগুণ করে
  • ফাংশন সংজ্ঞার পরে, ফাংশনটিকে :প্রাথমিক আরগ দিয়ে ডাকা হয়:

আউটপুট:

$ bash
$ :(){ : $1$1;};: :
bash: xmalloc: ../bash/stringlib.c:135: cannot allocate 536870913 bytes (5368795136 bytes allocated)
$

এই উত্তরের পূর্ববর্তী সম্পাদনায় আমি করেছি a=$(yes), তবে আমি "প্রোগ্রামটি অবশ্যই অন্য প্রোগ্রাম চালাবেন না" এই নিয়মটি লক্ষ্য করেছি, সুতরাং bashকোনও কোর্টিল বা অন্য কোনও কিছু না বলেই খাঁটি ব্যবহার করা দরকার ।


এখানে অন্য একটি:

দয়া করে এই উত্পাদন উত্পাদনে চালাবেন না

:(){ : <(:);};:

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

ক্লাসিক কাঁটাচামচ বোমা হিসাবে, একটি পুনরাবৃত্ত ফাংশন :()সংজ্ঞায়িত করা হয়। তবে এটি নিজে কল কল করে না। পরিবর্তে এটি একটি যুক্তি দিয়ে নিজেকে কল করে, যা নিজেকে প্রক্রিয়া প্রতিস্থাপনে ডাকা হয় । যেহেতু প্রক্রিয়া প্রতিস্থাপন কোনও ফাইল বর্ণনাকারী খোলার মাধ্যমে কাজ করে /dev/fd/n, এটি কেবল প্রক্রিয়া (বাশ) মেমরি খায় না, এটি কিছু কার্নেল স্মৃতিও খেয়ে ফেলবে। আমার উবুন্টু মেশিনে এটি কয়েক সেকেন্ড পরে উইন্ডো ম্যানেজারকে অক্ষম করে তোলে, তারপরে এই স্ক্রিনটি শেষ হওয়ার কিছুক্ষণ পরে:

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

OKতারপরে ক্লিক করা এই পর্দা দেয়:

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

এই বিকল্পগুলির কোনওটিই খুব বেশি সহায়ক বলে মনে হচ্ছে না - এই মুহুর্তে পুনরায় চালু করা একমাত্র ভাল বিকল্প বলে মনে হচ্ছে।


3
$ which yes->/usr/bin/yes
ইজকাটা

2
"টাস্ক ম্যানেজারে প্রোগ্রামটি মেরে ফেলা বা টাস্ককিল / আইএম আপনার প্রোগ্রাম / এফ ব্যবহার করা বা পিসি পুনরায় চালু করা মেমরিটি প্রকাশের একমাত্র উপায় it এটি বন্ধ করার পরেও এটি হগ মেমরির হওয়া উচিত" " >> ব্যাশটি একটি সিগমেন্টটার ব্যবহার করে শেষ করা যেতে পারে, সুতরাং এটি চালানো বন্ধ করার জন্য এটি হত্যার প্রয়োজন হয় না। সিস্টেমটি স্মৃতিশক্তি শেষ হয়ে গেলে এটি চলমান বন্ধ করে দেয়। একবার বাশটি সমাপ্ত হয়ে গেলে হয় সিগইটার্ম দ্বারা বা মেমরি শেষ হয়ে যাওয়ার পরে, মেমরিটি অপারেটিং সিস্টেমে ফিরিয়ে দেওয়া হয়।
foobar

এটি আমার পক্ষে কাজ করে না ... ধরণের ... আমি স্মৃতিটি ধীরে ধীরে দূরে চলে যেতে দেখতে পাচ্ছি, তবে এটি খুব ধীরে ধীরে ঘটে এবং কেবল সিটিআরএল + সি টিপে এটিও মারা যেতে পারে। এটি এখন 1 মিনিটের জন্য চলছে এবং এটি প্রায় 1 জিবি দখল করেছে। আমার কাছে খুব দ্রুত একটি মেশিন রয়েছে ... তবে তাতে কিছু আসে যায় না, তাই না?
স্টিফানোস ক্যালান্টজিস

আমার নিজের মন্তব্যের জবাব: কমান্ডটি প্রায় 2 মিনিট 49 সেকেন্ড পরে বাশটিকে হত্যা করেছিল। আমি প্রাথমিকভাবে ধরে নিয়েছি এটি এই উত্তরের ভিত্তিতে তাত্ক্ষণিকভাবে চলেছে।
স্টেফানোস ক্যালান্টজিস

@ স্টেফানোস ক্যালান্টজিস আপনার মন্তব্যের জন্য ধন্যবাদ। এটি আমাকে আরও কিছুটা ভাবতে বাধ্য করেছে এবং আমি সবেমাত্র আরও একটি খারাপ শেল স্নিপেট পেয়েছি - সম্পাদনা দেখুন।
ডিজিটাল ট্রমা

24

এক্সএমএল

<!DOCTYPE boom [
<!ENTITY Z 'ka-boom!'><!ENTITY Y '&Z;&Z;'><!ENTITY X '&Y;&Y;'><!ENTITY W '&X;&X;'>
<!ENTITY V '&W;&W;'><!ENTITY U '&V;&V;'><!ENTITY T '&U;&U;'><!ENTITY S '&T;&T;'>
<!ENTITY R '&S;&S;'><!ENTITY Q '&R;&R;'><!ENTITY P '&Q;&Q;'><!ENTITY O '&P;&P;'>
<!ENTITY N '&O;&O;'><!ENTITY M '&N;&N;'><!ENTITY L '&M;&M;'><!ENTITY K '&L;&L;'>
<!ENTITY J '&K;&K;'><!ENTITY I '&J;&J;'><!ENTITY H '&I;&I;'><!ENTITY G '&H;&H;'>
<!ENTITY F '&G;&G;'><!ENTITY E '&F;&F;'><!ENTITY D '&E;&E;'><!ENTITY C '&D;&D;'>
<!ENTITY B '&C;&C;'><!ENTITY A '&B;&B;'><!ENTITY z '&A;&A;'><!ENTITY y '&z;&z;'>
<!ENTITY x '&y;&y;'><!ENTITY w '&x;&x;'><!ENTITY v '&w;&w;'><!ENTITY u '&v;&v;'>
<!ENTITY t '&u;&u;'><!ENTITY s '&t;&t;'><!ENTITY r '&s;&s;'><!ENTITY q '&r;&r;'>
<!ENTITY p '&q;&q;'><!ENTITY o '&p;&p;'><!ENTITY n '&o;&o;'><!ENTITY m '&n;&n;'>
<!ENTITY l '&m;&m;'><!ENTITY k '&l;&l;'><!ENTITY j '&k;&k;'><!ENTITY i '&j;&j;'>
<!ENTITY h '&i;&i;'><!ENTITY g '&h;&h;'><!ENTITY f '&g;&g;'><!ENTITY e '&f;&f;'>
<!ENTITY d '&e;&e;'><!ENTITY c '&d;&d;'><!ENTITY b '&c;&c;'><!ENTITY a '&b;&b;'>
]>
<boom a="&a;"/>

তারপরে নথিটি কোনও এক্সএমএল পার্সারে পাস করুন যা সত্তা রেফারেন্স লুপ / ​​পুনরাবৃত্তি সনাক্তকরণ করে না। উদাহরণস্বরূপ, xpathপার্ল সহ অন্তর্ভুক্ত:

xpath boom.xml /

কিভাবে এটা কাজ করে:

  1. পার্সার মুখোমুখি <boom a="&a;">
  2. পার্সার বিস্তৃতি "&a;"মধ্যে"&b;&b;"
  3. পার্সার এর মধ্যে একটিকে প্রসারিত "&b;"করে "&c;&c;"(প্রত্যাবর্তনে, এটি অন্যটি প্রসারিত করবে "&b;")
  4. পার্সার "&c;"ইত্যাদির মধ্যে একটি প্রসারিত করে ...

যদি পুরো সম্প্রসারণ ঘটতে পারে তবে "কা-বুম!" এর 2 ^ 52 প্রসারণ হবে। প্রতিটি চরিত্রের জন্য 2-বাইট অনুমান করে এটি 64 পাইবি ব্যবহার করার চেষ্টা করবে। সম্প্রসারণ যায় "কা-বুম!" একসাথে, যাতে আপনি সাধারণত এটি দেখতে পারেন সমস্ত উপরে শীর্ষে মেমরি ব্যবহার করে।

এটি বিভিন্ন নাম দিয়ে যায়, এখানে ভাল ওভারভিউ: http://projects.webappsec.org/w/page/13247002/XML%20Entity%20Exsionsion



@ কোল জনসন ইউপ! আমি ডাব্লুএএসসি হুমকির শ্রেণিবদ্ধকরণ প্রকল্পে অবদান রেখেছি, তাই আমি উইকিপিডিয়া না করে ডাব্লুএএসসি-র প্রতি নির্দেশ করতে বাধ্য বোধ করি। :)
urউরোবুর

22

সি ++

int main()
{
    for(;;)int *a=new int;
}

এই কোডটি অপ্রত্যাশিত ছিল! টাস্ক ম্যানেজারটি খোলা থাকাকালীন এটি আমার কম্পিউটারটিকে ঝুলিয়ে দিয়েছিল এবং দেখিয়েছিল যে এটি 1 সেকেন্ডে 890 এমবি মেমরি নিয়েছে তখন এটিও স্তব্ধ হয়ে গেছে। আমি জানি না এটি কীভাবে কাজ করে, সম্ভবত এটি একটি পরিবর্তনশীলকে স্মৃতি প্রদান delete a;করে চলেছে this এই কোডটি আরও অনুসন্ধান করার জন্য আমি একটি বিবৃতি যুক্ত করেছি এবং পরীক্ষার সময় প্রতিটি জিনিসই ঠিক ছিল (কোনও ঝুলন্ত নয়) সুতরাং, আমি মনে করি স্মৃতিশক্তিটি হ'ল প্রদত্ত (কারণে new int) এবং তারপরে delete aনীচের নতুন কোডে ফ্রি স্পেসে (কারণে ) ফিরিয়ে নেওয়া হয়েছে ।

int main()
{
    for(;;)
    {
         int *a=new int;
         delete a;
    }
}  

সুতরাং, আমি উপসংহারে পৌঁছেছি যে এই পৃথিবীতে কোনও র‌্যাম এই পরিচালনা করতে পারে না !!!

সম্পাদনা করুন : তবে অনেক প্রসেসর উদাহরণস্বরূপ intel core 2 duoএই কোডটি পরিচালনা করতে পারে না তবে
intel core i-seriesকরতে পারেন (আমার জন্য কাজ করেছেন ...)

মনে রাখবেন প্রশ্নের উত্তরটি 1 ম কোড, দ্বিতীয়টিটি ব্যাখ্যার জন্য।


9
সুন্দর, সংকলকটি মনে করে আপনি new intপয়েন্টারটিকে ওভাররোট করলেও আপনি এখনও এটি ব্যবহার করতে যাচ্ছেন , যাতে আপনি এটি আর কখনও অ্যাক্সেস করতে পারবেন না ... সুতরাং কোনও আবর্জনা সংগ্রহের জন্য ডাকা হয় না এবং আপনি একটি চর্বিযুক্ত বাচ্চা স্কিটলস খায় তার চেয়ে দ্রুত মেমরি পূর্ণ করে
ডেভিড উইলকিন্স

37
@ ডেভিডওয়িলকিন্স: ... এটি সি ++, সি ++ এর কোনও আবর্জনা সংগ্রহকারী নেই।
ফোশি

32
যদি আপনার কাছে এটি অপ্রত্যাশিত থাকে যে এই কোডটি ফাঁস হয়ে যায়, তবে আমি মনে করি আপনি যতক্ষণ না আরও ভাল শিখেন ততক্ষণ আপনি সি ++ ব্যবহার করবেন না।
সোভিক

1
@ এসভিক তবে এটি অন্ধকারে ডার্ট বোর্ডকে আঘাত করার মতো নয়! আমার কিছু আইডিয়া ছিল যা এটি কাজের প্রশ্নটি করতে চাইবে।
মুকুল কুমার

15
@ এসভিক কীভাবে তার 'সি ++' ব্যবহার না করা হলে 'সে আরও ভাল করে শিখবে'?
কেভিন

16

BrainFuck

+[>+]

ব্যাখ্যা:

লুপটি প্রবেশের জন্য এটি সেলটি 1-এ বৃদ্ধি করে এটি শেষ কোষের ধনাত্মক ছিল যতক্ষণ না এটি বাড়িয়ে পরবর্তী কক্ষে চলে যায়।

সাধারণত A BrainFuck ইন্টারপ্রেটার টেপটিতে কোষের সংখ্যার কঠোর সীমাবদ্ধতার সাথে ত্রুটিযুক্ত থাকে, তবে কিছু সংক্ষেপক গতিশীলভাবে কোষ যুক্ত করে। এগুলি মেমোরি গ্রহণ করা অব্যাহত রাখবে যতক্ষণ না এটি আর গ্রাস করে।

beefএটিই হ'ল একটি দোভাষী এবং এটি উবুন্টু সফটওয়্যার সেন্টারে পাওয়া যায় এবং আমার অব্যবহৃত মেশিনে চালানো ২৯ ঘন্টা আগে শুরু হয়েছিল এবং সেই সময়ে ১ জিবি র‌্যাম গ্রহণ করেছে। এখানে আউটপুটtop

PID  USER        PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND  
2978 sylwester   20   0 1030m 984m 2536 R 100,1 12,4   1750:52 beef

এটিতে 4 জিবি ক্যাশে এবং 6 গিগাবাইট অদলবদল রয়েছে তাই আমি অনুমান করি যে আমি এই উত্তরটি 12 দিনের মধ্যে কীভাবে চলেছি তা আপডেট করব।

আপডেট 03.24 17:11

PID  USER        PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND  
2978 sylwester   20   0 1868m 1,8g 2456 R  99,9 22,9   6008:18 beef    

আপডেট 03.31 00:20

PID  USER        PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND  
2978 sylwester   20   0 2924m 2,8g 2052 R 100,0 36,1  15019:46 beef   

সুতরাং এটি 10 ​​দিন ধরে চলছে। দেখে মনে হচ্ছে আকর্ষণীয় কিছু হওয়ার আগে এটি কমপক্ষে 10 টির জন্য চলবে।


সুন্দর এবং সংক্ষিপ্ত।
nrubin29

15

সি এবং পসিক্স

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

এই সমাধানটি মূলত theতিহ্যগত while(1){malloc(1);}সমাধান। তবে ম্যালোকের পরিবর্তে, এটি পসআইএক্স ভাগ করা মেমরি ফাংশন ব্যবহার করে। যেহেতু এটি প্রতিটি বরাদ্দকে একটি ভাগ করা মেমরি শনাক্তকারীকে বরাদ্দ করে, প্রক্রিয়াটি শেষ হয়ে গেলে মেমরিটি অ্যাক্সেস করা এখনও সম্ভব। সুতরাং কার্নেল মেমরি মুক্ত করতে পারে না।

#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>

#define SHMSZ (2*1024*1024) /*Ubuntu rejects shared allocations larger than about 2MiB*/

main() {
  int shmid;
  key_t key = 0xF111; /* Lets use `Fill' as our first ID.*/
  char *shm;

  while(1) { /* Like malloc, but using shared memory */
    if ((shmid = shmget(key, SHMSZ, IPC_CREAT|0666)) < 0){return 1;}/*Get shared memory*/
    if ((shm = shmat(shmid, NULL, 0)) == (void *) -1) { return 1; } /*Attach it        */
    memset(shm,0,SHMSZ);                                            /*Fill it up       */
    key++                                                           /*On to the next ID*/
  }
}

সেরা এবং সবচেয়ে উজ্জ্বল সি উত্তর আইএমও। +1
syb0rg

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

14

সি শার্প

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

using System;

class A
{
    public event Action Event;
}

class B
{
    public void Handler() { }
}

class Program
{
    static void Main()
    {
        A a = new A();

        while( true )
            a.Event += new B().Handler;
    }
}

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

স্থির ইভেন্টগুলির একই পরিণতি হয়, যেহেতু তারা কখনই সুযোগের বাইরে যায় না, প্রক্রিয়াটি শেষ হয়ে গেলে তারা কেবল তখনই পরিষ্কার হয়ে যায়, আপনি যদি প্রথম ইভেন্টটি থেকে সাবস্ক্রাইব না করেন। সর্বদা আপনার রেফারেন্স সঞ্চয় করুন, লোকেরা!

using System;

class Program
{
    static event Action Event;

    static void Main()
    {
        while( true )
            Event += new Action( delegate{ } );
    }
}

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

সম্পাদনা : আপনি মূলত অন্য যে কোনও অবজেক্টের সাথেও একই কাজটি করতে পারেন, যতক্ষণ আপনি একটি রেফারেন্স যুক্ত করেন ঠিক ততক্ষণ এই রেফারেন্সটি মুক্ত করার কোনও উপায় নেই তা নিশ্চিত করে।

স্থির বস্তু এবং অ্যারে ব্যবহার করে এমন একটি উদাহরণ এখানে।

using System;
using System.Collections.Generic;

static class Leak
{
    private static List<decimal[]> Junk;

    static Leak()
    {
        Junk = new List<decimal[]>();
    }

    public static void Add( uint size )
    {
        decimal[] arr = new decimal[size];
        Junk.Add( arr );
    }
}

class Program
{
    static void Main()
    {
        while( true )
            Leak.Add( 1 );
    }
}

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


10

বাশ (কোনও বাহ্যিক উপযোগ নেই)

এখানে কাঁটাচামচ বোমা নেই।

সতর্কতা: এটি আপনার শেলটিকে হত্যা করতে পারে।

কেবল রেফারেন্সের জন্য পূর্ণসংখ্যার একটি অ্যারে তৈরি করার চেষ্টা করছি কারণ আমি পূর্ণসংখ্যার দেখতে কেমন তা ভুলে যেতে থাকি।

while :; do _+=( $((++__)) ); done

ফলাফল স্বরূপ:

xmalloc: expr.c:264: cannot allocate 88 bytes (268384240 bytes allocated)

2
+1 এর জন্য "কারণ আমি ভুলে যাচ্ছি যে সংখ্যাগুলি কেমন দেখায়" :)
ডেভিড কনরাড

8

জে (7)

সতর্কতা: আমি যখন এটি চেষ্টা করেছি তখন এটি আমার সিস্টেমটিকে হিমশীতল করে (উইন্ডোজ 8, জে 8.01, কিউটি টার্মিনালে)।

2#^:_[_
  • 2# প্রতিটি উপাদান নকল করে আর্গুমেন্টের দৈর্ঘ্য দ্বিগুণ করে,
  • ^:_ প্রদত্ত ফাংশনটির ফিক্সপয়েন্টটি খুঁজে বের করে (তবে এটির কোনওটি নেই তাই এটি অন্তহীনভাবে লুপ হয়),
  • [__যুক্তি হিসাবে এটি কল ।

8

হাস্কেল (গ্রাহামের নম্বর)

এটি খুব সহজ: এটি গ্রাহামের সংখ্যা গণনা করে

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

গ্রাহামের সংখ্যার একটি সাধারণ ডিজিটাল উপস্থাপনা ধারণ করে পর্যবেক্ষণযোগ্য মহাবিশ্ব খুব ছোট, এই ধারণা ধরে নিয়ে যে প্রতিটি সংখ্যার একটি প্লাঙ্ক ভলিউম রয়েছে

(উইকিপিডিয়া অনুসারে)

import Data.Sequence
import Data.Foldable

(↑) a 1 b = a ^ b
(↑) a _ 0 = 1
(↑) a i b = a ↑ (i-1) $ a ↑ i $ b-1

graham = last $ toList $ iterateN 64 (\i -> 3 ↑ i $ 3) 4
main = print graham

সুতরাং, ধারণাটি হ'ল মেমোরিটি (ক্রমবর্ধমান) প্রচুর পরিমাণে Integer(হাস্কেলের ইন্টিজারগুলি নির্বিচারে আকারের) দ্বারা ব্যবহৃত হবে।

আপনি যদি এটি পরীক্ষা করে দেখতে চান তবে আপনাকে স্ট্যাকের আকার বাড়াতে বা এটি ভিতরে লোড করতে হতে পারে ghci


2
বোবা মহাবিশ্ব, পূর্ণসংখ্যার জন্য হাস্কেল মান অনুসারে নয়। কেন এটি স্বেচ্ছাচারী আকার সমর্থন করতে পারে না?
পাইরুলেজ

6

@ কমিন্টার্ন দ্বারা অনুপ্রাণিত।

প্রতিস্থাপন / দেব / নাল স্নিগ্ধ মোডে জড়িত। কার্নেল শিরোনাম, সুপারসার মোড এবং একটি ওয়ার্কিং সংকলক প্রয়োজন।

# make
# rm /dev/null
# insmod devnull.ko
# chmod go+rw /dev/null

আনন্দ কর.

Makefile নামক:

MODULE := devnull
KVERS  ?= $(shell uname -r)
KDIR   ?= /lib/modules/$(KVERS)/build
KMAKE := make -C $(KDIR) M=$(PWD)

obj-m += $(MODULE).o

all:
    $(KMAKE) modules

install:
    $(KMAKE) modules_install

clean:
    $(KMAKE) clean

সোর্স কোড:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/ioport.h>
#include <linux/device.h>
#include <linux/version.h>
#include <linux/slab.h>
#include <asm/io.h>
#include <asm/uaccess.h>

#define DEVICE_NAME "null"
#define MAJOR_NUMBER 0

MODULE_LICENSE("GPL");
MODULE_AUTHOR("nola <florian@n0la.org>");
MODULE_DESCRIPTION("/dev/null - memory leak style");
MODULE_VERSION("0.1");
MODULE_SUPPORTED_DEVICE("null");

static struct class *class_null;
static int major = 0;

static int device_open(struct inode *, struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);
static loff_t device_llseek(struct file *, loff_t, int);

static struct file_operations fops = {
    .owner = THIS_MODULE,
    .llseek = &device_llseek,
    .read = &device_read,
    .write = &device_write,
    .open = &device_open,
    .release = &device_release
};

static int __init mod_init(void)
{
    struct device *dev_null;

    if ((major = register_chrdev(MAJOR_NUMBER, DEVICE_NAME, &fops)) < 0) {
        return major;
    }

    /* create /dev/null
     * We use udev to make the file.
     */
    class_null = class_create(THIS_MODULE, DEVICE_NAME);
    if (IS_ERR(class_null)) {
        unregister_chrdev(major, DEVICE_NAME);
        return -EIO;
    }

#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
    dev_null = device_create(class_null, NULL, MKDEV(major, 0),
                             NULL, "%s", DEVICE_NAME
        );
#else
    dev_null = device_create(class_null, NULL, MKDEV(major, 0),
                             "%s", DEVICE_NAME
        );
#endif
    if (IS_ERR(dev_null)) {
        class_destroy(class_null);
        unregister_chrdev(major, DEVICE_NAME);
        return -EIO;
    }

    return 0;
}

static void __exit mod_exit(void)
{
    device_destroy(class_null, MKDEV(major, 0));
    class_unregister(class_null);
    class_destroy(class_null);
    unregister_chrdev(major, DEVICE_NAME);
}

static int device_open(struct inode *inode, struct file *file)
{
    file->f_pos = 0x00;

    try_module_get(THIS_MODULE);
    return 0;
}

static int device_release(struct inode *inode, struct file *file)
{
    /* decrement usage count: Not. Uncomment the line for less fun. */
    /* module_put(THIS_MODULE); */
    return 0;
}

static loff_t device_llseek(struct file *filep, loff_t offs, int mode)
{
    loff_t newpos;

    switch (mode) {
    case 2:
    case 0:
        newpos = offs;
        break;

    case 1:
        newpos = filep->f_pos + offs;
        break;

    default:
        return -EINVAL;
    }

    if (newpos < 0) {
        return -EINVAL;
    }

    filep->f_pos = newpos;

    return newpos;
}

static ssize_t device_read(struct file *filep, char *dst, size_t len,
                           loff_t *off)
{
    char *buf = NULL;

    if (dst == NULL || len == 0) {
        return -EINVAL;
    }

    buf = kmalloc(sizeof(char) * len, GFP_KERNEL);
    if (buf == NULL) {
        return -EINVAL;
    }

    /* Do how a /dev/null does.
     */
    memset(dst, 0, len);

    *off += len;
    return len;
}

static ssize_t device_write(struct file *filep, const char *src, size_t len,
                            loff_t *off)
{
    char *buf = NULL;

    buf = kmalloc(sizeof(char) * len, GFP_KERNEL);
    if (buf == NULL) {
        return -EINVAL;
    }

    *off += len;
    return len;
}

module_init(mod_init);
module_exit(mod_exit);

এই সতর্কতা আপনাকে রিবুট করতে বাধ্য করতে পারে!

এটা মুছে ফেলার জন্য:

# rmmod -f devnull # or a reboot
# rm -rf /dev/null
# mknod /dev/null c 1 3
# chmod go+rw /dev/null

6

চুনি

সকলেই জানেন যে যোগফল (1 / n ^ 2) = পাই ^ 2/6

সুতরাং আমি একটি আনুমানিক ফাংশন সংজ্ঞায়িত করতে পারি:

pi_approx = lambda {|i|
Math.sqrt( 
  6*( 
    (1...Float::INFINITY).map{|n| n.to_f**(-2)}.take(i).reduce(:+)
    )
  )
}

p pi_approx.(100_000)

অবশ্যই (1..infinity) বন্য চলবে।

তবে খেয়াল করুন যে অলস ব্যবহার করা এই কাজটি করবে;)

pi_approx = lambda {|i|
Math.sqrt( 
  6*( 
    (1...Float::INFINITY).lazy.map{|n| n.to_f**(-2)}.take(i).reduce(:+)
    )
  )
}

p pi_approx.(100_000)
#=> 3.141583104326456

5

সি - 28 25 টি অক্ষর (সম্পূর্ণ প্রোগ্রাম)

এটি চালান না, বা আপনার সিস্টেমটি দ্রুত হিমশীতল হয়ে উঠবে!

main(){while(malloc(9));}

কলকে ম্যালোক 9 বাইট মেমরি সংরক্ষণ করবে এবং নিয়মিত অপারেটিং সিস্টেম থেকে নতুন মেমরি পৃষ্ঠাগুলির জন্য অনুরোধ করবে। ফিরে আসা ঠিকানার কোনও পয়েন্টার সংরক্ষণ না করে ম্যালোক দ্বারা বরাদ্দ করা মেমরিটি অবিলম্বে ফাঁস হয়ে যায়। সিস্টেমটি একবারে মেমরির (র‌্যাম এবং স্ব্যাপের স্থান) শেষ হয়ে যাওয়ার পরে বা প্রক্রিয়াটির জন্য মেমরির সীমাটি পৌঁছে গেলে প্রোগ্রামটি হ'ল লুপটি ভেঙে শেষ হয়ে যায়।


2
বেশি দিন নয় - যে কোনও যুক্তিসঙ্গতভাবে আধুনিক সিস্টেমে একটি OOM হত্যাকারী থাকা উচিত যা প্রক্রিয়াটিকে কিক করে মারে । কমপক্ষে উবুন্টু 12.04 করে।
ডিজিটাল ট্রমা

1
ঠিক আছে, এই কোডটি চেষ্টা করার সময় আমি আমার উবুন্টুকে 13.10 টি ক্র্যাশ করেছি ...
ম্যাথিউ রডিক

@ ডিজিটালট্রামুমা যেমন ফ্রিবিএসডি-র কোনও ওমকে আছে?
রুসলান

1
main(){while(malloc(9));}আরও 3 টি অক্ষর বাঁচায় এবং আমার স্মৃতি তাত্ক্ষণিকভাবে পূরণ করে।
gmatht

@gmatht: পরামর্শের জন্য ধন্যবাদ! আমি উত্তরটি সম্পাদনা করেছি ... যদিও আমি প্রতিটি লুপে ব্লকের আকার বাড়ানোর ধারণা পছন্দ করি।
ম্যাথিউ রডিক

4

VB স্ক্রিপ্ট

do
    Set d1 = createobject("Scripting.Dictionary")
    d1.add true, d1
    Set d1 = Nothing
loop

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

লুপ, কিন্তু মেমরি হোগ, প্রোগ্রামটি স্থগিত করে। প্রোগ্রামটি বন্ধ হওয়ার পরে, মেমরিটি এখনও ব্যবহৃত হয়। সিস্টেমটি পুনরায় চালু করে কেবল পুনরুদ্ধার করা যায়।


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

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

1
ভিবিএস স্ক্রিপ্ট ভিবি.নেটকে উল্লেখযোগ্যভাবে পূর্বাভাস দেয় - এটি ভিবি.নেটের কোনও কমান্ড লাইন সংস্করণ নয়; এটি উত্তরাধিকার ভিজ্যুয়াল বেসিকের একটি ব্যাখ্যাযুক্ত উপসেট।
ক্রিস জে

ধন্যবাদ, আপনি উভয়। VBScript এবং VB.NET এর মধ্যে সম্পর্ক কী তা আমি বুঝতে পারি নি।
ডেভিড কনরাড

4

হ্যাঁ এবং tmpfs

যখন কেউ উবুন্টু নিয়ে ফ্রি আসবে তখন কেন নতুন প্রোগ্রাম লিখবেন?

yes > /run/user/$UID/large_file_on_my_ramdisk

আপনি সম্ভবত জানেন, বা ইতিমধ্যে অনুমান করেছেন, উবুন্টু ডিফল্টরূপে tmpfs হিসাবে মাউন্ট করে / চালান / ব্যবহারকারী / যা একটি ধরণের র্যাম ডিস্ক

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

এটিতে একটি ছোট্ট বাগ রয়েছে: উবুন্টু ডিফল্টরূপে ব্যবহারকারী লিখনযোগ্য tmpfs / রান / 1000 থেকে 100 মেগাবাইট সীমাবদ্ধ করে, তাই অদলবরণ মৃত্যুর বৈশিষ্ট্যটি আপনার মেশিনের বাইরে থাকা বাক্সে সমর্থিত নাও হতে পারে। তবে আমি নিম্নলিখিত মেশিনে নিম্নলিখিত দ্রুত কাজের সাথে এটি ঠিক করতে পেরেছি:

sudo mount -o remount,size=10G tmpfs /run/user/

আমার কোনও /run/userডিরেক্টরি নেই। আপনি উবুন্টুর কোন সংস্করণ ব্যবহার করেন এবং এর জন্য আপনি কী ইনস্টল করেছিলেন?
রুসলান

উবুন্টু ট্রাস্টি তাহর (14.04)। কোন বিশেষ ইনস্টল প্রয়োজন।
gmatht

আপনার কোনও tmpfsফাইল সিস্টেম মাউন্ট করা আছে কিনা তা জানতে আপনি সেগুলি তালিকাভুক্ত করতে পারেন df -t tmpfs। আমার উবুন্টু সিস্টেমে একটি দুর্দান্ত বিশাল /run/shmউপলব্ধ রয়েছে ...
টবি স্পিড

4

সজোরে আঘাত

সতর্কতা: নিম্নলিখিত কোডটি আপনার কম্পিউটারকে বুটমুক্ত করতে সক্ষম করে।

printf "\\xe8\\xfd\\xff" | dd of=/dev/sda
reboot

সতর্কতা: পূর্ববর্তী কোডটি আপনার কম্পিউটারকে আনবুটযোগ্য করে তুলবে।

আপনার বুট ড্রাইভের সাথে / dev / sda প্রতিস্থাপন করুন। এটি আপনার বুট সেক্টরের শুরুতে E8 এফডি এফএফ লিখেছে writes বুট করার সময়, BIOS আপনার বুট সেক্টরটিকে মেমরির মধ্যে পড়ে এবং এটি কার্যকর করে। এই অপকডগুলি এই সমাবেশের সমতুল্য:

label:
  call label

এটি অসীম পুনরাবৃত্তি, যা অবশেষে স্ট্যাকের উপচে পড়বে cause


আপনার সমাবেশের উদাহরণে, আপনি কোনও চরিত্র সংরক্ষণ করতে পারেন ("লেবেল" নামটি ধরে jmpcall
নিলে

কল রিটার্নের জন্য স্ট্যাকের উপর ফেরতের ঠিকানা ছেড়ে দেয়। লাফানোর ফলে স্ট্যাকের ওভারফ্লো হতে পারে না।
জেরি যেরেমিয়া

3

Haskell,

main=print $ sum [0..]

এটি গণনা সংখ্যা যুক্ত করার চেষ্টা করে। হাস্কেল আংশিক অঙ্কগুলি মূল্যায়ন করে, এটি কেবল অসীম সংযোজন বিবৃতিতে পরিণত হয়। আপনি যদি অপটিমাইজেশন পতাকা সহ সংকলকটি চালনা করেন তবে এটি কাজ নাও করতে পারে।


3

সজোরে আঘাত

যেহেতু আমরা ইউটিলিটি বিশেষভাবে মেমরির গ্রাস করার জন্য ডিজাইন করা হয় না ব্যবহার করতে পারেন, আমি মেমরি মুক্ত করার জন্য একটি ইউটিলিটি উপর ফোকাস: swapon। এটি ডিস্কে লিখে কার্নেলটিকে মেমরি মুক্ত করতে দেয়।

এই স্ক্রিপ্টটি দুটি অপ্টিমাইজেশন সম্পাদন করে: (১) দ্রুত / টিএমপি তৈরি করতে tmpfs (এক ধরণের র‌্যাম ডিস্ক) হিসাবে মাউন্টিং tmp এবং (২) মেমরি মুক্ত করার জন্য একটি swapfile তৈরি করা। এগুলির প্রত্যেকটি নিজের দ্বারা যুক্তিসঙ্গত হয় তবে যদি অসাবধান ব্যবহারকারী উভয় কাজ করে তবে এটি অদলবদল করার একটি চক্র স্থাপন করে: ওএস যখন পৃষ্ঠাগুলি স্যুপ আউট করার চেষ্টা করে, তখন এটি টিএমপিএফগুলিকে লিখে দেয়; এটি tmpfs আরও মেমরি ব্যবহার করে; এটি আরও পৃষ্ঠাগুলি অদলবদলের কারণে মেমরির চাপ বাড়ায়। এটি আমার ভিএমতে কয়েক মিনিট সময় নিতে পারে, সিস্টেমটি ব্যবহার করে কোনও গর্তে নিজেকে খনন করতে আপনার জন্য যথেষ্ট সময় top

প্রোগ্রামটি স্বয়ংক্রিয়ভাবে কোনও মেমরি বরাদ্দ করার কারণে প্রোগ্রামটি বন্ধ করা কিছুটা পার্থক্য করে। প্রকৃতপক্ষে এটি মুক্ত মেমরির পক্ষে তুচ্ছ নয় কারণ আপনি স্বাম্পল ফাইলের আগে tmpfs আনমাউন্ট করে মেমরিটি মুক্ত করতে পারবেন না swapoffএবং আপনি স্মৃতি মুক্ত না করা পর্যন্ত এটি করা কঠিন।

এই উত্তরটি নেট না থেকে শীতল কৌশলগুলি বুঝতে না পেরে অন্ধ করার বিরুদ্ধে একটি সতর্কতামূলক গল্প হিসাবে বিবেচনা করা যেতে পারে।

sudo mount -t tmpfs -o size=9999G tmpfs /tmp # Use tmpfs to make /tmp faster
truncate -s 4096G /tmp/swap                  # Now make a giant swap file to free up memory 
sudo losetup /dev/loop4 /tmp/swap            # Use a loopback so we can mount the sparse file
sudo mkswap /dev/loop4
sudo swapon /dev/loop4
#The following line would cause a quick swap death, but isn't needed.
#dd if=/dev/zero of=/tmp/zero bs=1          # Zero the tmp dir so the VM can free more memory

2

পার্ল

sub _ {
  my($f,$b);
  $f=\$b;$b=\$f;
}
while(1) { _;}

বিজ্ঞপ্তি রেফারেন্স ব্যবহার করে। চলকগুলির জন্য রেফারেন্স গণনাটি কখনই 0 এ পৌঁছায় না এবং রেফারেন্সগুলি কখনই আবর্জনা সংগ্রহ করা হবে না।

আপনার ধৈর্য ধারণ করার প্রয়োজন হতে পারে তবে এটি আপনার সিস্টেমকে শ্বাসরোধ করার গ্যারান্টিযুক্ত। ডিস্কটি দ্রুত ঘুরতে শুরু করবে এবং ধোঁয়াগুলি দৃশ্যমান হতে পারে।


2

পিএইচপি (কেবলমাত্র লিনাক্স):

এই কোডটি অনির্ধারিত, যেহেতু আমার পিএইচপি চলমান একটি লিনাক্স কম্পিউটার নেই।

তবে এটি আমার ধারণার প্রমাণ:

ignore_user_abort(true);
ini_set('memory_limit',-1);
ini_set('max_execution_time',0);
/*
    sets php to ignore if the script was canceled in the browser
    (like clicking cancel or closing the browser)
    and takes away the memory limit,
    as well as the maximum execution time.
*/

function dont_let_it_stop(){shell_exec('php '.__FILE__.' &');}
//this function calls the file itself.

register_shutdown_function('dont_let_it_stop');
//this function will register the function declared above to be used when the script is being terminated

function get_info($f='current')
{
    return str_replace(' kB','',end(explode(':',trim($f(explode(PHP_EOL,file_get_contents('/proc/meminfo')))))))*1024
}
/*
    this function fetches the infos
    'current' fetches the max memory
    'next' fetches the actual used memory
*/

$max=get_info();//maximum memory
$current=get_info('next');//current memory

$imgs=array(imagecreatetruecolor(1e4,1e4));
$color=imagecolorallocatealpha($imgs[$i=0],128,128,128,126);
imagefill($imgs[$i],0,0,$color);
/*
    this creates an array and inserts one image (10000x10000 pixels),
    filling it then with a solid transparent color
*/

$total-=get_info('next');//calculates the space an image takes

while($max-get_info('next')>$total*2)//while the free memory is higher than the memory of 2 images, fill the array
{
    $imgs[$i++]=imagecreatetruecolor(1e4,1e4);
    $color=imagecolorallocatealpha($imgs[$i-1],128,128,128,126);
    imagefill($imgs[$i-1],0,0,$color);
}

//this is just to keep the images in memory, so the script doesn't end
while(1)sleep(60);

এটি বিশাল আরজিবিএ চিত্র (10000x10000 পিক্সেল) দিয়ে মেমরিটি পূর্ণ করবে।

এই শিশুটিকে বন্ধ করার একমাত্র উপায় হ'ল শক্তি বন্ধ করা।

কোড সব মন্তব্য করা হয়।

কোনও উন্নতি, সন্দেহ, ত্রুটি বা কিছু, নীচের মন্তব্য বাক্সটি ব্যবহার করুন।


লিনাক্স অ্যাক্সেস সহ কেউ কি এটি পরীক্ষা করে দেখতে চান? ধন্যবাদ :)
জর্জ

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

1
এটি অন্য প্রোগ্রামটি কল না করার বিষয়ে ব্যর্থ হয়
আইনাসিও

এটি অন্য প্রোগ্রামকে কল দিচ্ছে না: এটি একই প্রোগ্রামটিকে কল করছে যা একই ফাইলের জন্য ফাইলটি শুরু করেছিল।
ইসমাইল মিগুয়েল

2

পাইথন - 56

class x:
 def __setattr__(self,*args):self.y=0
x().y=0

একটি শ্রেণি তৈরি করে, বৈশিষ্ট্য নির্ধারণের জন্য একটি পদ্ধতি নির্ধারণ করে, এতে একটি বৈশিষ্ট্য নির্ধারণ করে এবং একটি প্রাথমিক উদাহরণ তৈরি করে যা এরপরে এটির একটি বৈশিষ্ট্য সেট করার চেষ্টা করে।

একটি সাধারণ পুনরাবৃত্তি ফাংশন ( def f(x):f(x)) কিছুটা অকল্পনীয় বলে মনে হয়েছিল তাই আমি সিদ্ধান্ত নিয়েছিলাম যে আসলে কোনও ফাংশনটি কখনই কল করবেন না ।

মেমরি পরিচালনা হয়ত পুনরাবৃত্তির গভীরতা ধরে ফেলতে পারে তবে এটি বাস্তবায়নের উপর নির্ভর করে।

এটি যদি কাঁটাচামচ বোমা হয় তবে দয়া করে আমাকে বলুন।


4
এই, শুধু একটি কোন মেমরি নিঃশেষিত কারণ: RuntimeError: maximum recursion depth exceeded while calling a Python object। এমনকি sys.setrecursionlimitবিভাজন ত্রুটির সাথে ক্রাশ হওয়ার আগে প্রায় কোনও স্মৃতি সহ সর্বাধিক পুনরাবৃত্তি সীমা নির্ধারণ করা হয় ।
বাকুরিউ

@ বাকুরিউ লাইক আমি বলেছি, এটি বাস্তবায়নের উপর নির্ভর করে (পাইথনের বাস্তবায়ন রয়েছে যা সি (++) এ রূপান্তর করে এবং সংকলন, যেমন শেডস্কিন, নুইটকা)।
সিজেফুরে

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

2

পার্ল

এটি একটি সহজ, কিন্তু আমি এটি গল্ফ মত মনে হয়েছিল।

{$x=[$x];redo}

দুই পুনরাবৃত্তিও পর $xধারণকারী অ্যারের একটি রেফারেন্স ধারণকারী অ্যারের একটি রেফারেন্স রয়েছে undef

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


2

ইসমাস্ক্রিপ্ট::

z=z=>{while(1)z()};_=i=>(i+=1,i-=1,i++,i--,--i,++i,i<<=2,i>>=2,i+=0|Math.round(1+Math.random())&1|0,z(x=>setInterval(x=>z(x=>new Worker('data:text/javascript,'+_.toSource()),5))));setInterval(x=>z(x=>_(...Array(9e3).map((x,z)=>z*3/2*2/4*4e2>>2<<2))),5)

Ungolfed:

function forever(code) {
    // Loop forever
    var counter = 0;

    while (counter++ < 10) setInterval(code, 5);
};

function main(counter) {
    // Do some work.
    counter += 1; counter -= 1;

    counter++; counter--;
    --counter; ++counter;

    counter <<= 2;
    counter >>= 2;

    counter += 0 | Math.round(1 + Math.random()) & 1 | 0;

    forever(() => {
        setInterval(() => {
            forever(() => new Worker('data:text/javascript,' + main.toString()));
        }, 5);
    });
};

setInterval(() => {
    forever(() => {
        main(...Array(9e3).map((currentValue, index) => index * 3 / 2 * 2 / 4 * 4e2 >> 2 << 2));
    });
}, 5);

দ্রষ্টব্য: এটি ব্যবহার করে setTimeout, যা টাইমারদের অংশ হিসাবে সংজ্ঞাযুক্ত - এইচটিএমএল লিভিং স্ট্যান্ডার্ড

এটি মজিলা ফায়ারফক্সে চেষ্টা করুন (আপনি এটি বিকাশকারী কনসোলে পেস্ট করতে পারেন)। ফায়ারফক্স আরও এবং আরও বেশি স্মৃতি খায় এবং 100%সিপিইউ ব্যবহার করে একটি সিঙ্গল কোর মেশিনে (আমার মতো একটি 4-কোর মেশিনে, 25%এটি সিপিইউ ব্যবহার করে)। এটির অতিরিক্ত সুবিধা রয়েছে যা আপনি এটি থামাতে পারবেন না; আপনি যদি টাস্ক ম্যানেজারটি খুলতে পারেন তবে আপনি এটি দিয়ে ফায়ারফক্সকে হত্যা করতে পারেন।


1
এটি একটি কোরের 100% ব্যবহার করে। আপনার কোয়াডকোয়ার প্রসেসরে, এর ফলে সিপিইউ ব্যবহারের 25% হয়।
ইভান পেরেজ

@ ইলেক্টরোসা হ্যাঁ, আপনি একেবারে সঠিক। আমি আমার উত্তর আপডেট করেছি।
টুথব্রাশ

এটি কোনও কোড গল্ফের প্রশ্ন নয়, দয়া করে আপনার কোডটি পঠনযোগ্য করার চেষ্টা করুন।
পাওলো ইবারম্যান

@ PaŭloEbermann ঠিক আছে। আমি একটি অবারিত সংস্করণ পোস্ট করেছি।
টুথব্রাশ

1

সজোরে আঘাত

একটি খালি ফাইল তৈরি করুন এই পাঠ্য ফাইলটি test
প্রতিস্থাপন /dev/null/করুন

$ sudo mv test /dev/null

এটি @ Comintern এর উত্তরের অনুরূপভাবে কাজ করে। সমস্ত আউটপুট /dev/nullএখন এই পাঠ্য ফাইলে যুক্ত হবে, যা সময়ের সাথে সাথে বিশাল আকার ধারণ করবে এবং সিস্টেমটি ক্র্যাশ করবে।


1
একটি বিশাল ফাইল সিস্টেম ক্র্যাশ করবে না। এবং গড় গতিবেগের 500gb এর আকারটি ধরে নিতে ফাইলটি এমনকি ডিস্কটি পূরণ করতে খুব বেশি সময় নিতে পারে।
w4etwetewtwet

1
সিস্টেম যেখানে উপর /devএকটি হল devtmpfs, এটা ভরাট এবং সিস্টেম রোধ করা যেতে পারে। আমি অনুমান করছি যে এই উত্তরের উদ্দেশ্য।
টবি স্পিড

1

বাশ: 7 টি অক্ষর

এটি সহজতম বাশ সমাধান হওয়া উচিত। কোন কাঁটাচামচ, কোন প্রতারণা।

x=`yes`

আপনাকে এটিকে মূল হিসাবে চালিত না করার পরামর্শ দেওয়া হচ্ছে।


অতিরিক্ত দ্রষ্টব্য: এমনকি আপনি যদি এটি সিটিআরএল-সি মিডওয়ে দিয়ে শেষ করেন, এবং তারপরে unsetপরিবর্তনশীল হয় তবে শেলটি মারা না যাওয়া অবধি স্মৃতি বরাদ্দ থাকে। আপনি হত্যাযজ্ঞটি দেখতে পারেন top
দাঙ্গা

ব্যাশ ৪.২.৪৫ (১) এর সাথে আমার নিজস্ব পরীক্ষাগুলি শো unset xমেমরি মুক্ত করে free pdksh মেমরিটিও মুক্ত করে, তবে ksh93 এটিকে মুক্ত করতে ব্যর্থ হয় exitএবং ksh93 ডাম্পস কোরগুলিতে।
kernigh

আমার জন্য (বাশ ৪.৩.১১ (১)) প্যারেন্ট শেলটির জন্য শীর্ষে থাকা আবাসিক মেমরি ডিসপ্লেটি yesনিহত না হওয়া পর্যন্ত অবিচলিতভাবে উপরে উঠে যায়, কোন অবস্থাতেই এটি কেবল সেখানেই থাকে, unsetকোনও প্রভাব নেই। তবে এটি একটি বৃহত মেমরি সিস্টেমে রয়েছে এবং বেশ কয়েকটি গিগাবাইটের একটি ভেরিয়েবল থাকলে এটি কোনও সমস্যা হবে বলে মনে হয় না (যতক্ষণ না এটি শেষ পর্যন্ত শেলটি মেরে ফেলার সিদ্ধান্ত নেয়)।
দাঙ্গা

0

সি

main()
{
    void * buffer;
    while (1)
        buffer = malloc(4096);
}

ঠিক আছে এটি পৃষ্ঠার পরে মেমরি পৃষ্ঠা নেয় এবং শেষ পর্যন্ত কোনও স্মৃতি বাকী থাকে না।


একটি পৃষ্ঠা 4 কেবি হচ্ছে সর্বজনীন কীভাবে?
পিটার মর্টেনসেন

@ পিটার 4 কে প্রায়শই আকারের হয় তবে আমি এটি বলতে পারি না এটি সত্যিই সর্বজনীন কিনা তবে প্রদত্ত প্রশ্নের সাথে পৃষ্ঠা আকারের কোনও সম্পর্ক নেই।
এসটি 3

1
@ এসটি 3: আপনার স্মৃতি পৃষ্ঠাটি নোংরা করা উচিত। বেশিরভাগ আধুনিক অপারেটিং সিস্টেমগুলি ভার্চুয়াল মেমরি ব্যবহার করে এবং যখন আপনি মেমরি বরাদ্দ করেন তখন কেবল ভার্চুয়াল মেমরি টেবিলটিতে একটি রেকর্ড তৈরি করে। মেমোরি পৃষ্ঠায় একটি একক বাইট লেখা ইতিমধ্যে অপারেটিং সিস্টেমটিকে ভার্চুয়াল মেমরি পৃষ্ঠাটি শারীরিক স্মৃতিতে ম্যাপ করতে বাধ্য করবে।
foobar


0

চুনি

a=[];loop{a<<a}

এটি কেবল অবিরাম নিজের মধ্যে স্ব-রেফারেন্স যুক্ত (পুনরাবৃত্ত!)।

এই রুটি সম্পর্কে কেউ জানতে পেরে যখন কেউ এটির সাথে আমার রুবি স্যান্ডবক্সটি ভেঙেছে । : ডি

এর পুনরাবৃত্তির দিকগুলির ডেমো:

[1] pry(main)> a=[]; a<<a; a
=> [[...]]
[2] pry(main)> 

0

সি ++ 79

void f(char *p,int i){p=new char[i];f(p,++i);}
int main(){char c='a';f(&c,1);}

অ golfed

void leak(char *p,int i)
{
    p=new char[i];
    leak(p,++i);
}

int main()
{
    char c='a';
    f(&c,1);
}

প্রধান থেকে কল অন্তর্ভুক্ত করার জন্য আমি আমার এন্ট্রি স্থির করেছি।


এটি একটি জনপ্রিয়তা প্রতিযোগিতা। প্রোগ্রামটি যদি কাজ করে তবে এটিকে প্রধান এবং শিরোনাম রাখুন। এটা ভাল. এছাড়াও, আপনি কি কোনও গল্ফযুক্ত সংস্করণ পোস্ট করতে পারেন? ধন্যবাদ :)
জর্জ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.