Hangi dil özellikleri zararlı kabul edilir? [kapalı]


20

Lütfen, neden bildiğiniz kadarıyla (mis) özelliğinin uygulandığını ve hangi dillerin listelendiğini açıklayın .

Sevdiğiniz şeyi değil, zararlı bir özellik olarak gördüğünüzü yayınlayın.



2
@sbi Ayrıca "XMLHttpRequest
Zarar Görmüş

1
Hepsi, temel ifadeler hariç, biri veya diğeri tarafından zararlı olarak kabul edilir.
David Thornley


3
@David Thornley: a = 1/0- temel ifade, zararlı. ;-)
Yörünge

Yanıtlar:


37

PHP'de Globalleri Kaydet

Bilgi: http://php.net/manual/en/security.globals.php

Bu, okunabilirlik nedenleri ve güvenlik nedenleriyle bugüne kadar uygulanacak en kötü özelliktir. Temel olarak, alınan tüm GET parametreleri değişkenlere dönüştürülür.

Örneğin bu URL ile: /index.php?value=foobar

Aşağıdakileri yapabilirsiniz:

<?php
echo $value; // return foobar
?>

Kodu okurken, değişkenin nereden geldiğini bilmek çok kafa karıştırıcıdır.

Ayrıca, özellik yanlış kullanılırsa güvenlik açığına neden olabilir. Php.net'ten nasıl kötüye kullanılabileceğini gösteren bir kod örneği:

<?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";
}
?>

Bu korkunç.
İsteği

14
Kaydetti ve sicil globaller PHP 4.2 (2000 yılında tüm yolu geri) yana varsayılan olarak etkin edilmediğini vurguladı PHP 5.3 (2009) 'de kaldırılmıştır ve PHP 6'da tamamen kaldırılacak, ama insanlar olmalıdır hala geri devam 10 yıl sonra bile "OMG kayıt globalleri" ne.

1
Oldukça Umutsuz PHP
Ming-Tang

@SHiNKiROU Umutsuz değil, bu özellik kullanımdan kaldırıldı ve PHP 6'da kaldırılacak.
HoLyVieR

1
Umutsuz değil, diğer birçok dilin çok gerisinde kalıyor, çünkü bunu herkesin kullanmasının tek nedeni, yakın zamana kadar ucuz webhosting almak için diğer dillere göre çok daha kolay olmasıydı.
intuited

22

Varsayılan olarak Null'a izin ver, "trilyon" * dolar hatası. Üzgünüm Tony Hoare. Gezegendeki hemen hemen her dil.

Tony Hoare açıklıyor

* Tony Hoare tarafından yazılan ifadeyi bu günlerde gerçek kaybı yansıtacak şekilde ayarladım :-)


Bu bir özellik veya hata değil, özellik eksikliğidir. Null edilemeyen referans türlerine sahip olmak, bir dile hafifçe düşebileceğiniz bir şey değildir; Çok fazla düşünce ve iyi tasarım gerektirir ve derleyici ile kavga gibi hissetmeyecek şekilde yapmak çok zordur. Spec # ve Singularity bunun ne kadar zor olduğunu gösterir.
imgx64

@ imgx86, hayır, kesinlikle bir hata. Null edilemeyen referans türleri, normalde null'a izin veren bir tür sistemiyle uyumluluk sağlamak için null hatasına yanıt olarak eklenen bir özelliktir.
Matt Olenik

@Kyralessa: Belki de HoLyVieR'nin Popülist rozetini aldığından emin olmak istiyor? :-) Kabul ediyorum, kendi cevabınızı böyle kabul etmek mantıklı değil.
Macneil

18

C ve C ++ MAKROS. Hiç kimse kodumu vidalar makro için standart bir işlev adı seçerek başka bir derleyici hatası görmek zorunda kalırsanız çığlık atacağım. En son rahatsız olanı görelim:

#define vector(int) new VARIANT[int];

Aaarg! STL vektörümle ne yaptın !?


Ad alanı, typedef'leri ve şablonları hemen daha kolay hale getiren şeylerden biridir.
Shog9

4
Anlaşıldı, ancak sadece modern diller metinsel makroların işlevselliğinin yerini aldıkları için. İcat edildiklerinde, makrolar İyi Bir Şeydi çünkü derleyici teknolojisi çok ilkeldi.
dsimcha

bu makroyu nerede buldun?
rwong

@dsimcha - Bunu bilmiyorum. Lisp makroları uzun zamandır var.
Jason Baker

2
@Jason: Lisp tarzı "gerçek" AST makrolarını çalmıyorum, hala kullanışlı ve havalı. Sadece metin düzeyinde çalışan, kapsam kavramına sahip olmayan, gülünç sızan soyutlamalar ve gizlenmiş kodlar oluşturmaya izin veren ve ironik olarak tamamen modern hale getirilebilen C / C ++ tarzı makrolardan nefret ediyorum. , "gerçek" makrolardır.
dsimcha

14

C ve C ++ anahtar deyimlerinde varsayılan olarak son kullanma.


18
Bu, yazdığım tüm kodlarda her zaman yardımcı bir özelliktir. Bu nasıl bir yanlışlık?
greyfade

6
@greyfade: İfadeyi unutana kadar breakveya biri iki vaka arasına bir vaka ekler (ya da yeniden sıralar ), aralarında düşüş olduğunu fark etmeden faydalıdır. Geri dönüşün bir mola veya goto davası, vb. Gerektiren C # yolundan daha iyi olduğunu göremiyorum
Tim Goodman

9
Duff'ın Cihazı dokunulmazlığınızı gözetliyor!
Jesse C. Slicer

3
Katılıyorum. Varsayılan olarak iyi bir özellik değildir.

11
Kimse okumuyor mu? VARSAYILAN tarafından sonbahar dedi
Matt

13

Araya dönüştürülen türlerin belirgin bir ilişkisi olmadığında örtük tür dönüşümleri. Örneğin, bir rasgele, sayısal dönüştürücü stringbir içine intPHP gibi.


7
Dikkatinizi çekerseniz, başınızı döndürdüğünüzde, bu tür şeyler sorun olmayacaktır. Bu, kullanıcının girdiği değerler için kritik alanlarda herhangi bir kontrol yapmazsanız, ancak bir şeyin sayı olacağını biliyor ancak dize olarak geliyorsa, son derece yararlıdır. Örneğin, bir DB'deki bir alan muhtemelen bir dize olarak döndürülür ve onu yayınlamak konusunda endişelenmek istemezsiniz.
Tarka

2
@Slokun: Daha iyi bir örnek bulabilir misin? Neden bir db tipi kullanarak integral değerlerini bir db'de depolarsınız?
Steven Evers

@SnOrfus Bir URL'ye, kullanıcı girişine, işlevlere ve statik olarak yazılmayan diller için ortak olan diğer şeylere bir numara geçirilmesi.
TheLQ

Bu, C'de de bir sorundur, çünkü alıntılanan bir dizenin değeri bir tamsayıya dönüştürülebilen bir işaretçidir ve bu, mantıklı bir şekilde derlenebilecek, ancak saçmalık üretebilecek gibi görünen yapılar yapabilir. C ++ 'da, explicitörtük tür dönüşümlerini durduran anahtar kelime ile dönüştürme işlevlerini tanımlayabilirsiniz , ancak yine de sorunlar vardır.
David Thornley

@TheLQ: Kullanıcı girdisi ise, bir sayı olup olmadığını anlamak için doğrulamanız gerekir. @Slokun dedi. Bir dosyadan veri okuyorsanız, sayısal verilerin olması gerektiği yerde olmasını bekleyebilirsiniz, ancak disk bozulması durumunda bir istisna oluşturmak genellikle 0bazı değerler için rastgele olmaktan daha iyidir .
intuited

12

goto : nadir durumlarda iyi olmasına rağmen, daha sık yanlış kullanılır ve programların okunması zorlaşır.


Tanrım evet. xkcd.com/292
TheLQ

3
Goto'nun akıllıca kullanılmasına izin vermek, bir programı 3 milyon satırlık koddan kurtaracaktı.
Dave

2
Ah, abartı ... Geçerli bir edebi teknik.
Robert Harvey

11

YOK

Bir özelliğin sık sık kötüye kullanılması onu zararlı yapmaz.

IMHO "zararlı kabul edilir" programlama dili tartışmalarının Reductio ad Hitlerum olduğunu.

"Zararlı" özelliklerin tümü olmasa da çoğu, çok geçerli bir kullanım senaryosuna sahiptir ya da başlangıçta kolaylık yöntemidir. Artılarını ve eksilerini anlamak ve buna göre kodlamak geliştiricilere bağlıdır.

Eğer sorularınız "hangi dil özelliklerinin ortak tuzakları veya talihsiz yan etkileri var" çizgisinde bir şey olsaydı, cevabım farklı olurdu.

Açık olmak gerekirse: Kullanımdan kaldırılan yöntemlerin sürekli kullanımı anlamına gelmez. Geliştiriciler bir özelliği amortismana tabi tutuyor / kaldırıyorsa, yenisini kullanmalısınız. Dilin şu andaki bir bölümünün zararlı olduğu kavramına atıfta bulunuyorum, çünkü bazıları teşvik ettiği şeyden veya birçok insanın konuştuğu dili kullanmaktan hoşlanmıyor.


13
Kabul etmiyorum, iyi bir karşı örnek benim cevabım. PHP kayıt küresel sadece kötüydü, onları nasıl kullandığınız hiçbir mater. Bu nedenle kullanımdan kaldırılmıştır ve PHP'nin eski sürümlerinde asla kullanılmaması önemle tavsiye edilir.
HoLyVieR

5
+1 Yanlış ellere geçtiğinizde, herhangi bir dil yapısı zararlıdır.
mouviciel

5
İyi bir nokta ... gotoların% 95'i kötü olsa bile, özellik hala diğer% 5 için sahip olmaya değer
eds

1
Sanırım ejektör koltuğu düğmesini radyo açma / kapama düğmesinin yanına koymak gibi. Özelliğin kendisi kötü olmayabilir, ancak yanlışlıkla kullanılması nedeniyle zarar görmesini engellemez.
LennyProgrammers

1
Bence bu "silahlar insanları öldürmez, insanlar öldürür" programlama eşdeğeri.
Kasım'da Orbling

7

Autovivification (veya diğer bind-variable-on- (ata | use) özelliği) bana en çok hata verdiğim özellik.


+1 - Yineleyici şeker üzerinde anlaşmayabiliriz, ancak bu% 100 ile anlaşabileceğim bir şey.
ChaosPandion

7

PLEASEINTERCAL. Yeterince kullanma, şikayet ediyor. Çok fazla kullanın, şikayet ediyor.


2
Bu dilin ciddiye alınması gerekmiyor. Çok 'benzersiz' bir programlama dili olarak yaratıldı, bu yüzden mantıklı olmayan şeylerle (örneğin, gelen - sadece aklımın üstünde) doludur.
ShdNx

4
Bunun açık olacağını düşündüm, ama evet, bunun ciddi bir dil olmadığının farkındayım.
Alan Pearce

2
Üzgünüm, bazı insanlar buralarda çok ciddi.
Mark C

1
Sadece geçen hafta Wikipedia'da dili keşfetti ve ne kadar popüler olduğu konusunda havaya uçtu (ve yine de O_O).
Oliver Weiler

Bir dizi "meydan okuma" dili vardır ve her zaman popülerdir, çünkü kodlayıcılar kovalamaca sevgisi nedeniyle işi yapma eğilimindedir. Ayrıca kasıtlı olarak geniş, düşündürücü ve zor oldukları için mülakat soruları için de çok popüler.
Kasım'da Orbling

7

Bazı insanlar adam ya da söylediği çeşitli şeylerle aynı fikirde olmasalar da, bir çok Douglas Crockford JavaScript'i: İyi Parçalar temelde bu soru JS'ye uygulanır. Crockford'un şikayetleri arasında:

  • Her şey için varsayılan olarak global kapsam (DC, işlev / nesnelerin ad alanları olarak nasıl kullanılacağını ve bunu sınırlamak için kapsam sınırlayıcılarını nasıl göstereceğini gösterir.)

  • withBaşarısızlık davranışı genel ad alanındaki şeyleri tanımlamak gibi ifadeler . (Gah! JS sloganı gibi, eğer başarısız olursan, o zaman mümkün olduğunca sert ol !)

  • ==Temel olarak her zaman ===operatörü kullanmanızı gerektiren , işleç ile beklenmedik davranış .

  • Noktalı virgül ekleme.

Gerçekten bir sürü JS zararlı, hatta tüm dil olarak kabul edilmelidir, ama iyi parçalar o kadar da iyi ki, bunu telafi ediyor (en azından benim için).


6

Flash Player'da varsayılan davranış olarak "sessizce başarısız"

Tamam, gerçekten dilin bir özelliği değil, yine de oldukça yakından ilgili.

Aniden Flash / Flex uygulamanız çalışmayı durdurur ve kimse size f * 'nin ne olduğuna dair en ufak bir ipucu veremez. Hata mesajı yok, yığın izlemesi yok, hiçbir şey yok. Aniden ekran geçişi gerçekleşmez (veya tamamen yanlış bir şekilde gerçekleşir) veya düğmeler artık tıklamalara tepki vermez veya bazı girişlerle doldurmak yerine birleşik giriş kutuları boştur.

Bu "özellik" tek başına birkaç omuz silkme raporundan ve aldığım bir sürü gri saçtan sorumlu . -.- Kullanıcının yüzüne bazı şifreli mesajlar atmak da istenmiyor olsa da, en azından geliştiricinin sorunu çözmesine yardımcı olabilir.

Ancak Flash Player, kullanıcının açıklamasına dayanarak sizi karanlıkta bırakarak bırakır (sorun aslında kodda kullanıcının yaptığıyla hiçbir ilgisi olmayan tamamen farklı bir konumdan kaynaklanabilir). Yalnızca Hata Ayıklama Oynatıcısını kullanırsanız, açılır pencereyi bir hata mesajı ve yığın iziyle alırsınız.

Bununla birlikte, belirli haber sitelerinde flash gömülü film izlemek ve kullanılan gömülü oynatıcı SWF'sinden Null referansları hakkında tekrarlanan mesajlar almak oldukça ilginç olabilir. : D


iPhone uygulamaları da bazen garip zamanlamalarda uyarı vermeden kilitleniyor
Ming-Tang

3
Hiçbir şeyde sessizce başarısız olmak oldukça berbattır.

6

C / C ++ 'da: Bu atamalar aynı zamanda çok benzer atama = ve karşılaştırma == işleçleriyle KOMBİNE ifadelerdir. Kendi başına zararlı bir özellik değildir, ancak operatörü yanlışlıkla yanlış yazarak hataları (bazen ince) tanıtmanın kolay bir yoludur.

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

... bir tamsayı veya bir göstergenin geçerli bir durum olduğu gerçeğiyle birleştiğinde.
barjak

5

Java'da paket özel dil varsayılanı ve özel programlama kuralı varsayılanı ile değiştiricilere erişin.


5

Herhangi bir uyarı olmadan kabuğunda boş bir dize ile tanımsız değişkenleri değiştirme: rm -rf $nosuchvar/*.


+1 Argh! LOL - korkunç varsayılan (ve eğlenceli / korkunç örnek)
Yörünge

@Orbling gibi ${varname:-/dev/null}bir şey geçici bir çözüm olabilir ...
duros

Kullanımdan önce değişken varlığı ve içeriği her zaman defansif olarak kontrol etme ihtiyacını göstermeye devam ediyor.
Kasım'da Orbling

4

LOGO'da saat yönünün tersine dönme yeteneği. Wtf, sadece saat yönünde 360 - xçevirelim.


LOGO kullandığımdan bu yana bir süre geçti. Bu neden zararlıdır?
Mason Wheeler

5
Logo gerçek, fiziksel bir kaplumbağa robotunu kontrol etmek için kullanılabilir. Bazen kaplumbağanın belirli bir yöne dönmesini veya birden fazla dönmesini istersiniz . Örneğin, belki bir çeşit dans için programlıyorsunuzdur.
Daniel Cassidy

@Mason, bir şaka olması gerekiyordu.
jjnguy

3
Evet, özellikle LOGO For Clocks'da.
intuited

1
Logoyu seviyorum (bkz. Programmers.stackexchange.com/questions/21028/… ) ve özellikle gençler için mükemmel bir öğretim dilidir. 11 dendiğinde ve ilk kez Logo kullandığımda, sınıfımın çoğu o kadar geometri bilmiyordu, ama 90'ın çeyrek tur olduğunu ve sağdan sola bildiğini söylediler. Yani bu olumsuz bir özellik değil - neden bir bölme işlecine sahip olmak yerine karşılıklarla çarpmadığımızla aynı. Evet, bunun bir şaka olduğunu biliyorum.
Kasım'da Orbling

4

Başka Bir Konudan Konu Başlığını Durdurma

Java'da ve başka bir dilde, bıraktığınız iş parçacığının düzgün bir şekilde tamamlanması için zaman vermeden bir iş parçacığını diğerinden keyfi olarak durdurabilirsiniz. Bu yetenek, neredeyse tüm durumlara getirebileceği büyük miktarda sorun göz önüne alındığında reddedildi .


Bunu herhalde ederken olabilir zararlı olabilir, bazen son derece yararlıdır vardır (örneğin, tek bir adım ve kırılma noktalarını destekleyen bir ayıklayıcı).
Jerry Coffin,

1
@ Jerry Hata ayıklama başka bir şeydir, süreci durdurmaz, duraklatır.
HoLyVieR

aksine, ipliği durdurur. Görünüşe göre, ipliği öldürmekten bahsediyorsun , sadece durdurmakla kalmıyor. Haklı çıkarmak biraz daha zor ...
Jerry Coffin

Bunu mutlaka bir dil özelliği olarak görmüyorum. Daha standart bir kütüphane.
Jason Baker

4

PHP'de Değişken Değişkenler

Sadece seni $cankastetmediğin için$$should


1
Her zamanki gibi, Perl ... (potansiyel olarak tehlikeli) özelliğe sahiptir, onu kapatmak için en iyi pratik bir yol ( use strict) ve tam olarak istediğiniz durumlarda ( no strict 'refs') açmak için kolay bir yol vardır .

1
Dinamik değişken adına sahip bir kullanım bulamadım. Ve ben sadece yaptım, birkaç ay sonra kodu yeniden okunan kodu okunamaz ve bir WTF an yaptı.
TheLQ

Mmm, uygulamalar diğer insanların iğrenç paket değişkenleri veya sembol tablosu (ki biraz farklı, sanırım) ile meta programlamayı içerir.

1
@Joe bana göstermek için size meydan olurdu bir değişken değişkenler çözüm anlaşılır kılmak nerede örneği.
Kendall Hopkins

1
Yorum bir şaka olarak ifade edildi, üzgünüm bunu netleştirmedim, ama burada sorduğunuz için değişken değişkenlerin bir çözümü daha net hale getirdiği en iyi örnek . Yine de oldukça kötü bir örnek olduğunu kabul edeceğim.
Joe D

3

WithO yararlı bulunuyor verilen durumlar da vardır rağmen Delphi açıklamada, akla gelen.


İyi bir vaka Lazarus için Delphi bir şey portu yaparken ve benim tcontrol soyundan kontrol boyutları referans "Tuval yapmak ile ... Genişlik, Yükseklik" içeriyordu, ancak bu yanlış derlenmiş kod yol açtı yüzden Lazarus TCanvas, Genişlik ve Delphi kendi vardı
Maksee


2

Perl'de, skaler bağlam ve liste bağlamı zor olabilir. Bazı işlemleri kolaylaştıran bazı iyi noktalara sahiptir, ancak bazen bir operatörün anlamını tamamen değiştirmek gibi (muhtemelen kodda önemli bir mesafeden uzakta) korkunç bir şeyle karşılaşırsınız .

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)

Bu doğru değil.

(Normal aralık operatörü gibi davranan bir şey yapmaya çalışmaktan kaynaklanır, böylece bir döngüde bir şey söyleyebilirsiniz next if /start_regex/ .. /end_regex/).


Adam çok kafa karıştırıcı. Perl'i öğrenmenin en kötü yanı başımı bu konuya getirmeye çalışmaktı.
glenatron

Her zaman bir işlevin birden çok şekilde geri dönmesini sağlayan her şeyin kullanışlı bir kolaylık olduğunu düşündüm.
Kasım'da Orbling

2

Python 2.x'in göreceli içe aktarım sözdizimi. Varsayalım x.pluginsçeşitli paketler için destek ekleyen bir paket var x. Ve ben bir olduğunu varsayalım sqlalchemymodülü x.pluginsben sqlalchemy desteği eklemek böylece x. Sqlalchemy.py'ye aşağıdaki satırı eklersem ne olacağını düşünüyorsunuz?

import sqlalchemy

Cevap, modülün kendisini içe aktarmaya çalışacağıdır. Bu sözdiziminin yaptığı, aslında gerçek küresel sqlalchemy paketini içe aktarmayı imkansız kılmaktır. Python 2.5 bunun göreli bir içe aktarma olduğunu belirtmenin bir yolunu ekledi:

from . import sqlalchemy

... ancak Python 3'e kadar ilk sözdiziminden gerçekten kurtulmuş değil (Python 2.6+ ile devre dışı bırakılabilse de from __future__ import absolute_import).


1

sun.misc.unsafe benim her zaman favorim; "şeyleri uygulamak için buna ihtiyacımız vardı, ama gerçekten, gerçekten kullanmanız gerektiğini düşünmüyorum."


7
Her iyi dilin standart kütüphanede güvenli olmayan bir paketi olmalıdır . Bu paketi içe aktarmak, düşük seviyeli taşınabilir olmayan şeyler yapma niyetinizi açıkça gösterir. Alternatifler şunlardır: 1- Dilin kendisinde güvenli olmayan özelliklere sahip olmak (örneğin C ++) ve 2- Düşük düzeyli şeyler yapmak için C gibi farklı bir dil kullanmak zorunda kalmak (örneğin Python ve Ruby). Güvensiz paket yaklaşımı benim için çok daha iyi görünüyor.
imgx64

1

FORTRAN ortak blokları. Basit bir hata yaptıysanız, uygulamanın bir kısmı başka bir bölümün küresellerini tıkayabilir.

FORTRAN, goto ifadesi / COBOL değişiklik ifadesi atadı. Kendini değiştiren kod. Tehlike, uyarı, uçan spagetti canavarları !!


FORTRAN'ın ALTER bildirimi yoktu. FORTRAN, atanmış GOTO ile birlikte ASSIGN ifadesine sahipti. COBOL, benzer bir amaca hizmet eden ALTER ifadesine sahipti.
John R. Strohm

@John - teşekkürler. Atama / değiştirme hafızam donuk ... en azından onları asla kullanmam öğretildiği için.
Stephen C

1

Nesne Yönlendirme (statik olarak yazılan tüm dillerden). Bu özelliğin sıfır işaretçilerden çok daha pahalıya mal olacağını iddia edeceğim ve devam edeceğim . Nesne Yönlendirme yalnızca dinamik bir mesaj iletme dilinde iyidir . Bu yüzden de Python gibi dinamik dillerden düşülmelidir (çünkü mesaj geçişini değil, geleneksel altyordam çağrısını kullanır).


Python (tüm niyet ve amaçlar için) smalltalk'un mesajını geçen deyimini destekler. Sadece bu şekilde adlandırılmamış. İkinci olarak, böylesine yaygın bir dil özelliğini zararlı olarak adlandırmanın en azından biraz tartışmalı olduğunu düşünüyorum.
Jason Baker

Nesne Yönlendirme yine de kodun yeniden kullanımını ve kod / veri kapsüllemesini geliştirir. Özelliğin statik / dinamik kullanımından bağımsız olarak.
Kasım'da Orbling

@Orbling: Neyle karşılaştırıldığında? Bence fonksiyonel programlama dilleri daha yüksek bir kod yeniden kullanımı var ve Haskell'in modül sisteminin kod / veri kapsülleme için oldukça iyi olduğunu düşünüyorum.
LennyProgrammers

@ Lenny222 Standart zorunlu programlama ile karşılaştırılmıştır. Ben de fonksiyonel yaklaşımı tercih ediyorum, Haskell benim tercih ettiğim bir dildir.
Aralık'ta Orbling

@Jason Baker: şüphesiz tartışmalıdır, ama bu kadar yaygın olmak onu bu kadar zararlı yapan şeydir! OP fikrimi sordu ve ben verdim. Sadece bir grup Lemmings'in bir uçurumdan atlaması davranışı akıl almaz hale getirir. Bu durumda matematiksel olarak kanıtlanmış OOP çalışmaz ve doğru paradigma iyi kabul edilir: kategori teorisi soyutlamaları temsil etmenin yoludur (aslında soyutlamalar teorisidir)
Yttrill

1

magic_quotesPHP .

Deneyimsiz geliştiriciler ya etkinleştirildiğine güvenir ve bu nedenle tüm kullanıcı girdilerinin bir SQL sorgusunda kullanılmak üzere kaçtığını veya devre dışı bırakıldığına güvenerek her zaman girdilerinden kaçtığını varsayar.

Etkinleştirildiğini ve daha sonra kodu olmadığı bir sistemde çalıştırdığınızda, geniş SQL enjeksiyon deliklerini açıyor.

Devre dışı bırakıldığını varsayarsak, ters eğik çizgilerin gerçekte DB'de depolanmasıyla sonuçlanır ve çirkin / yanlış dizelere neden olur.

Her iki durumu da ele almanın son derece basit bir yolu yoktur - kullanımının etkinleştirilip etkinleştirilmediğini kontrol etmeniz get_magic_quotes_gpc()ve ardından dizilerdeki stripslashes()tüm değerlere uygulamanız gerekir $_*- array_mapözyinelemeli olmadığından bunun için özel bir işleve ihtiyacınız vardır.


Veya sadece parametrelenmiş sorguları kullanabilirsiniz.
Pieter B

O zaman bile sihirli tırnaklar etkinleştirilirse ve bunu beklemezseniz ters eğik çizgiler alırsınız.
ThiefMaster

-3

Programcıların yorumlanmamış veya anlamsız yorumlu kod yazmalarına izin veren dil özelliği.


1
Ve bunu nasıl düzeltebilirim?
Maniero

1
@bigown: yorumla veya öl özelliğini uygulayarak: D.
tia

3
Buna Okuryazar Programlama denir. en.wikipedia.org/wiki/Literate_programming
Barry Brown

2
Bu bir özellik değil, ancak kullanıcı ön ucunda son derece ünlü bir böcek, çoğu insan bunu latin adıyla biliyor: Homo Sapiens.
Joe D

-3

burada bir uzuvda biraz dışarı çıkmak - geçersiz fonksiyonlar. bir işlev her zaman bir şeyler yapar, bu nedenle sonucu ya da başarısı ya da başarısızlığıyla ilgili başka bir bilgi vermelidir.


3
Pascal'ın fonksiyonları (dönüş değeri yok) ve fonksiyonlar (dönüş değeri) vardı.
Jon Onstott

İşlevler her zaman bir şey yapar (genellikle, yer tutucu işlevi kimdir?) , Ancak sık sık kimseye bunu söylemesine gerek yoktur.
Kasım'da Orbling

-4

TEMEL POKE ...


7
POKE harikaydı.
Shog9

2
İlk günlerde poke, bazı şeyleri temelde elde etmenin tek makul yoluydu. Apple'da Müzik] [akla geliyor ...
Bill

2
Doğru hatırlıyorsam, Commodore 64'te POKE olmadan fazla bir şey yapamazsınız.
MetalMikester

1
Her ikisi de gerekli olan PEEK'i unutmayın.
Kasım'da Orbling

-5

Çöp toplama demek zorundayım. Bellek yönetimi hakkında düşünme ihtiyacını ortadan kaldırmaz, ancak gerçek düşünceyi sıklıkla ortadan kaldıran bellek yönetimi hakkında düşünme ihtiyacını algılar ve daha sonra muazzam kaynak domuzları alırsınız ve nedenini bilmezsiniz. Özellikle modern kuşak GC'lerin davranışı, "tasarım gereği tek bir büyük bellek sızıntısı" olarak çok fazla abartı olmadan tarif edilebildiğinde.


2
Bir yerde bazı koleksiyonlarda oturan referanslarınız varsa, başka sorunlarınız var.
Chinmay Kanchi

2
Bu yüzden gc'ed dillerinin zayıf referansları var :)
Chinmay Kanchi

4
GC'nin kesinlikle güçlü ve zayıf yanları olsa da, Mason'un bu konuda yanlıştan çok daha doğru olduğunu söylemeliyim. Aslında, GC kullanan insanların bellek yönetimine çok fazla zaman harcadıklarını gördüm, çünkü ön plan yapmak yerine gerçeklerden sonra şeyleri hacklemeye çalışıyorlardı. GC ayrıca deterministik yıkımı önler, bu da bellek dışındaki tüm kaynakların yönetimi ile ilgili ekstra işlere yol açar.
Jerry Coffin,

3
@ChaosPandion: Modern bir çoklu görev makinesinde, disk belleği sisteminin sistem performansınızı düşürmesini önlemek için belleğin en kısa sürede serbest bırakılması gerektiğini düşünürsem gerçekten aptal mıyım? Hiçbir GC bu sonuca ulaşmaya bile yaklaşmayı başaramadı ve aslında, var olan en iyi, en modern çeşit olması beklenen nesil çöp toplayıcı tam tersini yapıyor: en iyi performans için, serbest bırakması gerekiyor bellek mümkün olduğunca geç . Bunu her zamanki gibi doğru bir araç olarak görmüyorum, diğer programlarımı yavaşlattığında değil. Bunun için bir aptal mıyım?
Mason Wheeler

2
@Barry: Program içinde belirleyici. 5 KB'lık bir bellek bloğuyla işim bittiğinde, kısa bir süre sonra 5 KB daha isteyin, ne olur? Çöp toplanan bir sistemde, GC arada çalışmadığı sürece kullanılmayan mükemmel bir blok olmasına rağmen yeni bir 5 KB blok istemesi gerekir, bu durumda eski bloğu geri dönüştürebilirsiniz. Malloc ve free ile her zaman eski bloğu geri dönüştürebilirsiniz. Bunu birkaç yüz bin ile çarpın ve bu gerçek bir sorun haline gelir.
Mason Wheeler

-5

C ve kesinlikle C ++: İşaretçi aritmetiği. İnsanların tamsayıları bellek adreslerine dönüştürmesine izin vermek sorun istiyor.

Ve belki de işaretçilere tamamen ham erişim?

C ++ 'da işaretçileri neredeyse tamamen gereksiz kılan referanslarınız vardır. Geri kalan vakalar için akıllı işaretçiler zorunlu kabul edilmelidir.

Java, insanların işaretçi değerine erişimine izin vermeden işaretçiler kullanan bir programlama dili yapabileceğinizi de kanıtlar .

Dışında null ... ama bu farklı bir hikaye.


5
İşaretçiler, zaman zaman düzgün bir şekilde kullanılması zor olsa da, çok sayıda verimli bellek işlemi için çok gereklidir.
Bill

1
Doğru. Ancak insanların tamsayıları düzenli olarak bellek referanslarına dönüştürmelerine izin vermek veya bellek adreslerine numara eklemek, bugünlerde çoğunlukla zararlı. C ++ 'da mükemmel bir alternatif olarak referanslarınız ve gerçekten bir işaretçi olmanız gerektiğinde akıllı işaretçiler / otomatik işaretçiler vardır.
Asgeir S. Nilsen

4
Bu yanıt yalnızca işaretçileri gizlemek için oluşturulmuş bir yazılım yığını üzerinde çalışıyorsanız geçerlidir. Diğer tüm durumlarda, bu cevap yanlıştır.
Paul Nathan

3
Diğer programlama dilleri için tüm işletim sistemlerini ve sanal makineleri yazabilmeniz için bazı programlama dilleri için işaretçiler bulunmalıdır.

2
-1. Ptr aritmetiğine ihtiyaç duymanızın bir nedeni var: Bir noktayı yinelemek endekslemeden hızlıdır. for(int i=0;i<SIZE;++i) ++arr[i]daha yavaştır for(int*i=arr;i<arr+SIZE;++i)*i++. Tüm java, işaretçiye ihtiyacınız olduğunu ya da hiç bakmadınız sun.misc.Unsafemı? İşaretçilere ihtiyacınız yoksa, lütfen Java kullanarak genel bir takas işlevinin nasıl yazılacağını açıklayın. (örneğin int a = 1, b = 2; takas (a, b); iddia (a == 2 && b == 1);). Eğer referansları kullanmak zorunda olsaydı c / c ++ tüm sorunları bahsetmiyorum. İşaretçiler olmadan opak bir yapı üzerinde sanal bir işlevi nasıl çağırırsınız?
KitsuneYMG
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.