कृपया, यह बताएं कि क्यों और कौन सी भाषाओं में (गलत) सुविधा लागू है, जहां तक आप जानते हैं।
पोस्ट जिसे आप एक हानिकारक विशेषता मानते हैं, न कि आप जो नापसंद करते हैं।
a = 1/0
- मूल अभिव्यक्ति, हानिकारक। ;-)
कृपया, यह बताएं कि क्यों और कौन सी भाषाओं में (गलत) सुविधा लागू है, जहां तक आप जानते हैं।
पोस्ट जिसे आप एक हानिकारक विशेषता मानते हैं, न कि आप जो नापसंद करते हैं।
a = 1/0
- मूल अभिव्यक्ति, हानिकारक। ;-)
जवाबों:
जानकारी: http://php.net/manual/en/security.globals.php
यह पठनीयता कारणों और सुरक्षा कारणों से अब तक की सबसे खराब विशेषता है। मूल रूप से प्राप्त सभी GET पैरामीटर चर में बदल जाते हैं।
इस URL के साथ उदाहरण के लिए: /index.php?value=foobar
आप निम्न कार्य कर सकते हैं:
<?php
echo $value; // return foobar
?>
जब आप कोड पढ़ रहे होते हैं, तो यह जानना बहुत भ्रामक होता है कि चर कहाँ से आता है।
इसके अलावा अगर सुविधा का दुरुपयोग किया जाता है, तो यह सुरक्षा छेद को जन्म दे सकता है। यहाँ php.net से एक कोड उदाहरण है जो दिखाता है कि इसका दुरुपयोग कैसे किया जा सकता है:
<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
$authorized = true;
}
// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
include "/highly/sensitive/data.php";
}
?>
डिफ़ॉल्ट रूप से नल की अनुमति दें, "ट्रिलियन" * डॉलर की गलती। सॉरी टोनी होरे। ग्रह पर उपलब्ध लगभग हर भाषा।
* मैंने इन दिनों वास्तविक नुकसान को प्रतिबिंबित करने के लिए टोनी होरे द्वारा गढ़ी गई अभिव्यक्ति को समायोजित किया :-)
C और C ++ मेक्रो। अगर मुझे कभी किसी अन्य कंपाइलर त्रुटि को किसी को अपने मैक्रो के लिए मानक फ़ंक्शन नाम चुनने के कारण देखना पड़ता है जो मेरे कोड को स्क्रू करता है तो मैं चीखने जा रहा हूं। आइए देखते हैं अंतिम अंतिम एक:
#define vector(int) new VARIANT[int];
Aaarg! आपने मेरे एसटीएल वेक्टर के साथ क्या किया है !?
C और C ++ स्टेटमेंट में डिफ़ॉल्ट रूप से गिरावट।
break
बयान को नहीं भूल जाते हैं , या कोई व्यक्ति दो मामलों के बीच एक मामला जोड़ता है (या उन्हें फिर से आदेश देता है), यह देखते हुए कि उनके बीच गिरावट नहीं हुई थी। मुझे ऐसा कोई रास्ता नहीं दिख रहा है, जो किसी भी तरह से ब्रेक या गोटो के मामले में गिराने के सी # तरीके से बेहतर हो, आदि
जब स्पष्ट प्रकार के बीच कोई स्पष्ट संबंध नहीं होता है तो लागू प्रकार के रूपांतरण। उदाहरण के लिए, PHP की तरह , एक यादृच्छिक, गैर-संख्यात्मक string
में परिवर्तित करना int
।
explicit
, जो निहित प्रकार के रूपांतरणों को रोकता है, लेकिन अभी भी समस्याएं हैं।
0
कुछ मान के लिए यादृच्छिक होने से बेहतर होता है ।
गोटो : हालांकि दुर्लभ मामलों में ठीक है, यह अधिक बार दुरुपयोग होता है और कार्यक्रमों को पढ़ने के लिए कठिन होता है।
कोई नहीं
सिर्फ इसलिए कि एक विशेषता का अक्सर दुरुपयोग होता है, यह हानिकारक नहीं होता है।
IMHO संपूर्ण "हानिकारक माना जाता है" प्रोग्रामिंग लैंग्वेज चर्चाओं का Reductio ad Hitlerum है।
अधिकांश, यदि सभी नहीं, तो "हानिकारक" सुविधाओं में मूल रूप से, एक बहुत ही मान्य उपयोग मामला है या पहली जगह में सुविधा के तरीके हैं। यह डेवलपर्स पर निर्भर है कि वे पेशेवरों और विपक्षों और कोड को समझें।
यदि आपके प्रश्नों का अर्थ "किस भाषा की विशेषताओं के सामान्य नुकसान या दुर्भाग्यपूर्ण दुष्प्रभाव हैं" की तर्ज पर कुछ होना चाहिए था, तो मेरा उत्तर अलग होगा।
[संपादित करें] स्पष्ट होने के लिए: मेरा मतलब यह नहीं है कि पदावनत विधियों का निरंतर उपयोग हो। यदि डेवलपर्स एक विशेषता को हटा रहे हैं / हटा रहे हैं, तो आपको प्रतिस्थापन का उपयोग करना चाहिए। मैं इस अवधारणा का उल्लेख कर रहा हूं कि भाषा का एक वर्तमान हिस्सा हानिकारक माना जाता है क्योंकि कुछ को यह पसंद नहीं है कि वह इसे प्रोत्साहित करे या इसका उपयोग करने में शामिल ट्रेड-ऑफ जो कि बहुत से लोग चर्चा करते हैं।
ऑटोविविफिकेशन (या अन्य बाइंड-वैरिएबल-ऑन- (असाइन | यूज़) फ़ीचर) वह फीचर है, जो मुझे सबसे अधिक बग देने के लिए मिला है।
PLEASE
INTERCAL में। यह पर्याप्त उपयोग न करें, यह शिकायत करता है। इसका बहुत अधिक उपयोग करें, यह शिकायत करता है।
यद्यपि कुछ लोग उस आदमी या विभिन्न चीजों से असहमत हैं जो वह कहता है, डगलस क्रॉकफोर्ड के जावास्क्रिप्ट का एक बहुत : अच्छा भाग मूल रूप से जेएस पर लागू होता है। क्रॉकफोर्ड की शिकायतों के बीच:
सब कुछ के लिए डिफ़ॉल्ट रूप से वैश्विक गुंजाइश (डीसी दिखाता है कि फ़ंक्शन / ऑब्जेक्ट्स को नामस्थान और स्कोम डेलिमीटर के रूप में कैसे उपयोग किया जाए।)
जैसे कथन with
, जिनका विफलता व्यवहार वैश्विक नाम स्थान पर चीजों को परिभाषित करना है। (जीएएच! जेएस के आदर्श वाक्य की तरह यदि आप असफल होते हैं, तो जितना संभव हो उतना कठिन हो !)
==
ऑपरेटर के साथ अप्रत्याशित व्यवहार , जो मूल रूप से आपको हमेशा ===
ऑपरेटर का उपयोग करने की आवश्यकता होती है ।
अर्धविराम सम्मिलन।
वास्तव में जेएस की एक पूरी बहुत हानिकारक माना जाना चाहिए, शायद पूरी भाषा भी, लेकिन अच्छे हिस्से सिर्फ इतने अच्छे हैं कि यह इस तरह का बना (कम से कम मेरे लिए)।
ठीक है, वास्तव में भाषा की एक विशेषता नहीं है, लेकिन अभी भी बहुत बारीकी से संबंधित है।
अचानक आपका फ्लैश / फ्लेक्स एप्लिकेशन काम करना बंद कर देता है और कोई भी आपको संकेत नहीं दे सकता है कि एफ * क्या हुआ है। कोई त्रुटि संदेश, कोई स्टैकट्रेस, कोई कुछ नहीं। यह सिर्फ इतना है कि अचानक स्क्रीन संक्रमण नहीं होता है (या पूरी तरह से गलत तरीके से होता है), या बटन किसी भी लंबे समय तक क्लिक करने के लिए प्रतिक्रिया नहीं करते हैं, या कुछ प्रविष्टियों के साथ आबाद होने के बजाय कॉम्बोक्स खाली हैं।
यह "सुविधा" अकेले कई श्रग रिपोर्टों के लिए जिम्मेदार है और मुझे मिलने वाले भूरे बालों की एक पूरी गुच्छा के । -.- उपयोगकर्ता के चेहरे में कुछ गुप्त संदेश को पॉप अप करते समय या तो वांछनीय नहीं है, यह कम से कम डेवलपर को समस्या को ठीक करने में मदद कर सकता है।
लेकिन फ्लैश प्लेयर आपको उपयोगकर्ता के विवरण पर भरोसा करते हुए, अंधेरे में इधर-उधर छटपटाता हुआ छोड़ देता है (जबकि समस्या वास्तव में कोड में पूरी तरह से भिन्न स्थान से उत्पन्न हो सकती है, जिसका उपयोगकर्ता के साथ कुछ भी लेना-देना नहीं है)। यदि आप वास्तव में डिबग प्लेयर का उपयोग करते हैं तो केवल आपको त्रुटि संदेश और स्टैकट्रेस के साथ पॉपअप विंडो मिलती है।
हालांकि, कुछ समाचार साइटों पर फ्लैश एम्बेडेड फिल्में देखने और उपयोग किए गए एम्बेडेड खिलाड़ी SWF से नल संदर्भों के बारे में बार-बार संदेश प्राप्त करना काफी दिलचस्प हो सकता है। : डी
C / C ++ में: ये असाइनमेंट भी बहुत समान असाइनमेंट = और तुलना == ऑपरेटरों के साथ जुड़े हुए हैं। प्रति सेहत के लिए हानिकारक नहीं है, लेकिन गलती से ऑपरेटर को गलती से (कभी-कभी सूक्ष्म) बग का परिचय देना आसान है।
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
पैकेज निजी भाषा डिफ़ॉल्ट और निजी प्रोग्रामिंग सम्मेलन डिफ़ॉल्ट के साथ जावा में मॉडिफायर एक्सेस करें।
शेल में एक खाली स्ट्रिंग द्वारा अपरिभाषित चर की जगह: बिना किसी चेतावनी के rm -rf $nosuchvar/*
।
${varname:-/dev/null}
हो सकता है वर्कअराउंड ...
लोगो में वामावर्त को चालू करने की क्षमता। Wtf, बस क्लॉकवाइज 360 - x
डिग्री को चालू करने देता है ।
जावा और अन्य भाषा में, आप एक दूसरे से एक धागा को मनमाने ढंग से समाप्त होने वाले धागे के लिए समय दिए बिना एक बंद कर सकते हैं। लगभग सभी स्थिति में भारी मात्रा में समस्या को देखते हुए इस क्षमता को घटाया गया है।
PHP में चर चर
सिर्फ इसलिए $can
कि आपका मतलब यह नहीं है$$should
use strict
) और इसे फिर से चालू करने के लिए एक आसान तरीका है कि आप इसे ( no strict 'refs'
) चाहते हैं ।
With
हालांकि ऐसे मामले हैं, जब यह उपयोगी है डेल्फी में बयान, मन में आता है।
इंडेक्स 1 पर शुरू होने वाले AWK में एरर्स !
car
! : पी
पर्ल में, स्केलर संदर्भ बनाम सूची संदर्भ मुश्किल हो सकता है। यह कुछ अच्छे बिंदुओं को मिला है जो निश्चित संचालन को सुविधाजनक बनाते हैं, लेकिन कभी-कभी आप किसी भयानक चीज़ में भाग लेते हैं, जैसे पूरी तरह से ऑपरेटर का अर्थ बदलना (संभवतः कोड में एक महत्वपूर्ण दूरी से दूर)।
sub foo { (1..5) }
my @list = foo(); # (1,2,3,4,5)
my $length = scalar @list; # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)
यह सिर्फ सही नहीं है।
(यह कुछ बनाने की कोशिश करने से उत्पन्न होता है जो नियमित रेंज ऑपरेटर की तरह काम करता है, इसलिए आप लूप में कुछ कह सकते हैं next if /start_regex/ .. /end_regex/
)।
पायथन 2.x का सापेक्ष आयात वाक्य-विन्यास। मान लीजिए मेरे पास एक पैकेज है x.plugins
जो विभिन्न अन्य पुस्तकालयों के लिए समर्थन जोड़ता है x
। और मान लीजिए कि मेरे पास एक sqlalchemy
मॉड्यूल है x.plugins
तो मैं sqlalchemy समर्थन को जोड़ सकता हूं x
। आपको क्या लगता है कि अगर मैं निम्नलिखित लाइन को sqlalchemy.py में जोड़ दूं तो क्या होगा?
import sqlalchemy
इसका उत्तर यह है कि मॉड्यूल स्वयं को आयात करने का प्रयास करेगा। यह वाक्यविन्यास जो करता है वह अनिवार्य रूप से वास्तविक वैश्विक sqlalchemy पैकेज को आयात करना असंभव बनाता है। पायथन 2.5 ने यह निर्दिष्ट करने का एक तरीका जोड़ा कि यह एक सापेक्ष आयात है:
from . import sqlalchemy
... लेकिन यह पायथन 3 तक नहीं है कि पहले सिंटैक्स को वास्तव में छुटकारा मिल गया था (हालांकि इसे अजगर 2.6+ के साथ अक्षम किया जा सकता है from __future__ import absolute_import
)।
sun.misc.unsafe मेरा ऑलटाइम फेवरेट है; "चीजों को लागू करने के लिए हमें इसकी आवश्यकता थी, लेकिन वास्तव में, वास्तव में ऐसा नहीं लगता कि आपको इसका उपयोग करना चाहिए।"
फोरट्रान आम ब्लॉक। यदि आपने एक साधारण गलती की है, तो आवेदन का एक हिस्सा दूसरे हिस्से के ग्लोबल्स को रोक सकता है।
FORTRAN को गोटो स्टेटमेंट / COBOL परिवर्तन स्टेटमेंट सौंपा गया है। स्व-संशोधित कोड। खतरे, चेतावनी, उड़ान स्पेगेटी राक्षस !!
ऑब्जेक्ट ओरिएंटेशन (सभी सांख्यिकीय रूप से टाइप की गई भाषाओं से)। मैं इस सुविधा को दांव पर लगा दूंगा और इसे जारी रखने के लिए, अशक्त बिंदुओं की तुलना में बहुत अधिक खर्च करना होगा । ऑब्जेक्ट ओरिएंटेशन केवल एक गतिशील संदेश पासिंग भाषा में अच्छा है । तो इसे पायथन जैसी गतिशील भाषाओं से भी हटा दिया जाना चाहिए (क्योंकि यह संदेश पासिंग लेकिन पारंपरिक सबरूटीन कॉलिंग का उपयोग नहीं करता है)।
अनुभवहीन डेवलपर्स या तो इस पर सक्षम होने पर भरोसा करते हैं और इस तरह सभी उपयोगकर्ता इनपुट को SQL क्वेरी में उपयोग के लिए बच जाते हैं या यह अक्षम होने पर भरोसा करते हैं और इस तरह हमेशा अपने इनपुट से बच जाते हैं।
यह मानते हुए कि यह सक्षम है और फिर एक सिस्टम पर कोड चला रहा है, जहां यह नहीं है कि यह चौड़े SQL इंजेक्शन छेद को खोलता है।
यह मानते हुए कि यह अक्षम है और यह नहीं है, इसके परिणामस्वरूप बैकस्लैश वास्तव में डीबी में जमा हो जाएगा, जिससे बदसूरत / गलत तार पैदा होंगे।
दोनों मामलों को संभालने का कोई बहुत सरल तरीका नहीं है - आपको यह जांचने की आवश्यकता है कि क्या यह सक्षम है get_magic_quotes_gpc()
और फिर सरणियों stripslashes()
में सभी मानों पर लागू होता है $_*
- चूंकि array_map
पुनरावर्ती नहीं है इसलिए आपको इसके लिए एक कस्टम फ़ंक्शन की आवश्यकता है।
भाषा की सुविधा जो प्रोग्रामर को असम्बद्ध या अर्थहीन टिप्पणी लिखने की अनुमति देती है।
यहाँ एक अंग पर थोड़ा बाहर जा रहा है - शून्य कार्य। एक फ़ंक्शन हमेशा कुछ करता है, इसलिए इसे या तो परिणाम या कुछ अन्य बिट जानकारी को उसकी सफलता या विफलता के बारे में वापस करना चाहिए।
बुनियादी में POKE ...
मुझे कचरा संग्रहण कहना होगा। यह स्मृति प्रबंधन के बारे में सोचने की आवश्यकता को समाप्त नहीं करता है, लेकिन यह स्मृति प्रबंधन के बारे में सोचने की आवश्यकता की धारणा को समाप्त करता है , जो सभी अक्सर वास्तविक विचार को समाप्त कर देता है, और फिर आपको भारी संसाधन प्राप्त होते हैं और पता नहीं क्यों। खासकर तब जब आधुनिक जेनेशनल जीसी के व्यवहार को बहुत ज्यादा हाइपरबोले के बिना "डिजाइन द्वारा एक बड़ी मेमोरी लीक" के रूप में वर्णित किया जा सकता है।
C, और निश्चित रूप से C ++: सूचक अंकगणित। पूर्णांक को मेमोरी पतों में परिवर्तित करने के लिए लोगों को समस्या के लिए पूछ रहा है।
और शायद पूरी तरह से संकेत तक कच्चे पहुंच?
C ++ में आपके पास ऐसे संदर्भ होते हैं जो पॉइंटर्स को लगभग पूरी तरह से अनावश्यक बनाते हैं। शेष मामलों के लिए स्मार्ट पॉइंटर्स को अनिवार्य माना जाना चाहिए।
जावा भी साबित होता है कि आप कर सकते हैं एक प्रोग्रामिंग भाषा बना हैं जो पॉइंटर का उपयोग करता है, बिना लोगों को पॉइंटर मान तक पहुंचने की अनुमति देता है।
इसके अलावा null
... लेकिन यह एक अलग कहानी है।
for(int i=0;i<SIZE;++i) ++arr[i]
से धीमी है for(int*i=arr;i<arr+SIZE;++i)*i++
। सभी जावा साबित करने में कामयाब रहे कि आपको सूचक की आवश्यकता है, या क्या आपने कभी नहीं देखा है sun.misc.Unsafe
? यदि आपको पॉइंटर्स की आवश्यकता नहीं है, तो कृपया जावा का उपयोग करके जेनेरिक स्वैप फ़ंक्शन लिखने का तरीका बताएं। (उदाहरण के लिए int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);)। C / c ++ में सभी समस्याओं का उल्लेख नहीं है यदि आपके पास संदर्भ का उपयोग करने के लिए HAD है। आप एक अपारदर्शी संरचना w / o पॉइंटर्स पर वर्चुअल फ़ंक्शन कैसे कहेंगे?