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.
a = 1/0
- temel ifade, zararlı. ;-)
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.
a = 1/0
- temel ifade, zararlı. ;-)
Yanıtlar:
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";
}
?>
Varsayılan olarak Null'a izin ver, "trilyon" * dolar hatası. Üzgünüm Tony Hoare. Gezegendeki hemen hemen her dil.
* Tony Hoare tarafından yazılan ifadeyi bu günlerde gerçek kaybı yansıtacak şekilde ayarladım :-)
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 !?
C ve C ++ anahtar deyimlerinde varsayılan olarak son kullanma.
break
veya 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
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ü string
bir içine int
PHP gibi.
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.
0
bazı değerler için rastgele olmaktan daha iyidir .
goto : nadir durumlarda iyi olmasına rağmen, daha sık yanlış kullanılır ve programların okunması zorlaşır.
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.
Autovivification (veya diğer bind-variable-on- (ata | use) özelliği) bana en çok hata verdiğim özellik.
PLEASE
INTERCAL. Yeterince kullanma, şikayet ediyor. Çok fazla kullanın, şikayet ediyor.
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.)
with
Baş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).
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
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();
}
Java'da paket özel dil varsayılanı ve özel programlama kuralı varsayılanı ile değiştiricilere erişin.
Herhangi bir uyarı olmadan kabuğunda boş bir dize ile tanımsız değişkenleri değiştirme: rm -rf $nosuchvar/*
.
${varname:-/dev/null}
bir şey geçici bir çözüm olabilir ...
LOGO'da saat yönünün tersine dönme yeteneği. Wtf, sadece saat yönünde 360 - x
çevirelim.
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 .
PHP'de Değişken Değişkenler
Sadece seni $can
kastetmediğin için$$should
use strict
) ve tam olarak istediğiniz durumlarda ( no strict 'refs'
) açmak için kolay bir yol vardır .
With
O yararlı bulunuyor verilen durumlar da vardır rağmen Delphi açıklamada, akla gelen.
AWK dizileri dizin 1'den başlayarak !
car
! : P
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/
).
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 sqlalchemy
modülü x.plugins
ben 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
).
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."
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ı !!
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).
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.
Programcıların yorumlanmamış veya anlamsız yorumlu kod yazmalarına izin veren dil özelliği.
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.
TEMEL POKE ...
Çö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.
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.
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.Unsafe
mı? İş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?