Tolong, jelaskan mengapa dan daftarkan bahasa mana yang memiliki fitur (mis) yang diimplementasikan Sejauh yang Anda tahu.
Posting apa yang Anda anggap fitur berbahaya, bukan apa yang tidak Anda sukai.
a = 1/0
- Ekspresi dasar, berbahaya. ;-)
Tolong, jelaskan mengapa dan daftarkan bahasa mana yang memiliki fitur (mis) yang diimplementasikan Sejauh yang Anda tahu.
Posting apa yang Anda anggap fitur berbahaya, bukan apa yang tidak Anda sukai.
a = 1/0
- Ekspresi dasar, berbahaya. ;-)
Jawaban:
Informasi: http://php.net/manual/en/security.globals.php
Sejauh ini, ini adalah fitur terburuk yang pernah diterapkan untuk alasan keterbacaan dan alasan keamanan. Pada dasarnya semua parameter GET yang diterima diubah menjadi variabel.
Misalnya dengan URL ini: /index.php?value=foobar
Anda dapat melakukan hal berikut:
<?php
echo $value; // return foobar
?>
Saat Anda membaca kode, sangat membingungkan untuk mengetahui dari mana variabel tersebut berasal.
Juga jika fitur ini disalahgunakan, itu dapat menyebabkan lubang keamanan. Berikut ini contoh kode dari php.net yang menunjukkan bagaimana itu dapat disalahgunakan:
<?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";
}
?>
Izinkan Null secara default, kesalahan "triliun" * dolar. Maaf, Tony Hoare. Hampir setiap bahasa tersedia di planet ini.
* Saya menyesuaikan ekspresi yang diciptakan oleh Tony Hoare untuk mencerminkan kerugian aktual pada hari-hari ini :-)
C dan C ++ MACROS. Jika saya pernah melihat kesalahan kompiler lain karena seseorang memilih nama fungsi standar untuk makro mereka yang mengacaukan kode saya, saya akan berteriak. Mari kita lihat yang terakhir:
#define vector(int) new VARIANT[int];
Aaarg! Apa yang telah Anda lakukan dengan vektor STL saya !?
Fallthrough secara default di C dan C ++ beralih pernyataan.
break
pernyataannya, atau seseorang menambahkan case di antara dua case (atau memesan ulang), tidak menyadari ada perselisihan di antara mereka. Saya tidak melihat ada cara yang lebih baik daripada cara C # untuk meminta istirahat atau goto, dll.
Konversi tipe implisit ketika tipe yang dikonversi antara tidak memiliki hubungan yang jelas. Misalnya, mengubah acak, non-numerik string
menjadi int
, seperti di PHP.
explicit
, yang menghentikan konversi tipe implisit, tetapi masih ada masalah.
0
untuk beberapa nilai.
goto : walaupun ok dalam kasus yang jarang terjadi, ini lebih sering disalahgunakan dan menyebabkan program sulit dibaca.
TIDAK ADA
Hanya karena suatu fitur sering disalahgunakan tidak membuatnya berbahaya.
IMHO seluruh "dianggap berbahaya" adalah Reductio ad Hitlerum dari diskusi bahasa pemrograman.
Sebagian besar, jika tidak semua, fitur "berbahaya" memiliki, atau sebelumnya, penggunaan yang sangat valid atau hanya metode kenyamanan di tempat pertama. Terserah pengembang untuk memahami pro dan kontra dan kode yang sesuai.
Jika pertanyaan Anda dimaksudkan untuk menjadi sesuatu di sepanjang baris "fitur bahasa apa yang memiliki perangkap umum atau efek samping yang tidak menguntungkan" jawaban saya akan berbeda.
[Sunting] Untuk menjadi jelas: Saya tidak bermaksud melanjutkan penggunaan metode yang sudah usang. Jika pengembang mendepresiasi / menghapus fitur, Anda harus menggunakan penggantinya. Saya mengacu pada konsep bahwa bagian bahasa saat ini dianggap berbahaya karena beberapa tidak menyukai apa yang didorongnya atau pertukaran yang terlibat dalam menggunakannya yang banyak orang diskusikan.
Autovivification (atau fitur bind-variable-on-(assign | use) lainnya) adalah fitur yang saya temukan paling banyak memberi saya bug.
PLEASE
dalam INTERCAL. Jangan cukup menggunakannya, itu mengeluh. Gunakan itu terlalu banyak, itu mengeluh.
Meskipun beberapa orang tidak setuju dengan pria itu atau berbagai hal yang dia katakan, banyak JavaScript Douglas Crockford : Bagian yang Baik pada dasarnya adalah pertanyaan ini diterapkan pada JS. Di antara keluhan Crockford:
Cakupan global secara default untuk semuanya (DC menunjukkan cara menggunakan fungsi / objek sebagai ruang nama dan pembatas ruang lingkup untuk mengatasi ini.)
Pernyataan seperti with
, yang perilaku kegagalannya menentukan hal-hal di namespace global. (Gah! Ini seperti moto JS adalah jika kamu gagal, maka gagal sekuat mungkin !)
Perilaku yang tidak terduga dengan ==
operator, yang pada dasarnya mengharuskan Anda untuk selalu menggunakan ===
operator.
Penyisipan titik koma.
Benar-benar banyak JS harus dianggap berbahaya, bahkan mungkin seluruh bahasa, tetapi bagian yang baik sangat baik sehingga jenis make up untuk itu (setidaknya untuk saya.)
Ok, sebenarnya bukan fitur bahasa itu sendiri tetapi masih cukup erat hubungannya.
Tiba-tiba aplikasi Flash / Flex Anda berhenti bekerja dan tidak ada yang bisa memberi Anda petunjuk sedikit pun tentang apa yang telah terjadi. Tidak ada pesan kesalahan, tidak ada stacktrace, tidak ada apa-apa. Hanya saja tiba-tiba transisi layar tidak terjadi (atau terjadi dengan cara yang sepenuhnya salah), atau tombol tidak bereaksi terhadap klik lebih lama, atau kotak kombo kosong daripada diisi dengan beberapa entri.
"Fitur" itu sendiri bertanggung jawab atas beberapa laporan mengangkat bahu dan banyak rambut beruban yang saya dapatkan. -.- Sementara memunculkan beberapa pesan samar di wajah pengguna juga tidak diinginkan, itu setidaknya dapat membantu pengembang menyelesaikan masalah.
Tetapi Flash Player membuat Anda menusuk dalam kegelapan, mengandalkan deskripsi pengguna (sementara masalahnya mungkin berasal dari lokasi yang sama sekali berbeda dalam kode yang tidak ada hubungannya dengan apa yang dilakukan pengguna). Hanya jika Anda menggunakan Debug Player Anda benar-benar mendapatkan jendela sembulan dengan pesan kesalahan dan stacktrace.
Namun, itu bisa sangat menarik untuk menonton film flash yang tertanam di situs berita tertentu dan mendapatkan pesan berulang tentang referensi Null dari pemutar tertanam yang digunakan SWF. : D
Dalam C / C ++: Penugasan itu juga ekspresi DIGABUNGKAN dengan penugasan yang sangat mirip = dan operator == perbandingan. Bukan fitur yang berbahaya, tetapi ini adalah cara mudah untuk memperkenalkan bug (kadang-kadang halus) dengan salah ketik operator secara tidak sengaja.
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
Mengakses pengubah di Jawa dengan paket standar bahasa privat dan konvensi pemrograman pribadi.
Mengganti variabel terdefinisi dengan string kosong di shell tanpa peringatan: rm -rf $nosuchvar/*
.
${varname:-/dev/null}
mungkin menjadi solusi ...
Kemampuan untuk memutar berlawanan arah jarum jam di LOGO. Wtf, mari kita putar 360 - x
derajat searah jarum jam .
Di Jawa dan dalam bahasa lain, Anda dapat menghentikan utas dari yang lain secara sewenang-wenang tanpa memberikan waktu agar utas yang Anda hentikan selesai dengan benar. Kemampuan ini telah ditinggalkan mengingat sejumlah besar masalah yang dapat menyebabkan hampir semua situasi.
Variabel Variabel dalam PHP
Hanya karena Anda $can
tidak bermaksud seperti Anda$$should
use strict
) dan cara mudah untuk menyalakannya lagi dalam keadaan yang Anda inginkan ( no strict 'refs'
).
The With
pernyataan dalam Delphi datang ke pikiran, meskipun ada kasus ketika itu berguna.
Array dalam AWK mulai dari indeks 1 !
car
! : P
Dalam Perl, konteks skalar vs konteks daftar bisa rumit. Ada beberapa poin bagus yang membuat operasi tertentu menjadi nyaman, tetapi kadang-kadang Anda mengalami sesuatu yang buruk, seperti mengubah sepenuhnya makna operator (berpotensi dari jarak yang cukup jauh dalam kode).
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)
Itu tidak benar.
(Itu muncul karena mencoba membuat sesuatu yang bertindak seperti operator jangkauan biasa, sehingga Anda dapat mengatakan sesuatu dalam satu lingkaran seperti next if /start_regex/ .. /end_regex/
).
Sintaks impor relatif Python 2.x. Misalkan saya memiliki paket x.plugins
yang menambahkan dukungan untuk berbagai perpustakaan lain untuk x
. Dan misalkan saya memiliki sqlalchemy
modul x.plugins
sehingga saya dapat menambahkan dukungan sqlalchemy ke x
. Menurut Anda apa yang akan terjadi jika saya menambahkan baris berikut ke sqlalchemy.py?
import sqlalchemy
Jawabannya adalah modul akan mencoba mengimpor sendiri. Apa yang dilakukan sintaks ini pada dasarnya membuatnya tidak mungkin untuk mengimpor paket sqlalchemy global yang sebenarnya. Python 2.5 menambahkan cara untuk menentukan bahwa ini adalah impor relatif:
from . import sqlalchemy
... tetapi tidak sampai Python 3 bahwa sintaks pertama sebenarnya sudah dihapus (meskipun dapat dinonaktifkan dengan Python 2.6+ with from __future__ import absolute_import
).
sun.misc.unsafe adalah favorit saya sepanjang waktu ; koleksi "kami membutuhkan ini untuk mengimplementasikan hal-hal, tetapi sungguh, benar-benar tidak berpikir Anda harus menggunakannya."
FORTRAN blok umum. Jika Anda membuat kesalahan sederhana, satu bagian dari aplikasi dapat mengalahkan global bagian lain.
FORTRAN ditugaskan pernyataan goto / COBOL mengubah pernyataan. Kode modifikasi diri. Bahaya, peringatan, monster spaghetti terbang !!
Orientasi Objek (dari semua bahasa yang diketik secara statis). Saya akan bertaruh fitur ini memiliki, dan akan terus, biayanya jauh lebih besar daripada null pointer. Orientasi Objek hanya baik dalam bahasa lewat pesan dinamis . Jadi itu harus dijatuhkan dari bahasa dinamis seperti Python juga (karena tidak menggunakan pesan yang lewat tetapi panggilan subrutin konvensional).
Pengembang yang tidak berpengalaman baik mengandalkan itu diaktifkan dan dengan demikian menganggap semua input pengguna untuk melarikan diri untuk digunakan dalam permintaan SQL atau mengandalkan itu dinonaktifkan dan dengan demikian selalu luput dari input mereka.
Ketika mengasumsikan itu diaktifkan dan kemudian menjalankan kode pada sistem di mana itu tidak terbuka lebar lubang injeksi SQL.
Ketika menganggap itu dinonaktifkan dan tidak, itu akan menyebabkan backslash disimpan di DB, menyebabkan string jelek / tidak benar.
Juga tidak ada cara yang sangat sederhana untuk menangani kedua kasus - Anda perlu memeriksa apakah itu diaktifkan menggunakan get_magic_quotes_gpc()
dan kemudian menerapkan stripslashes()
pada semua nilai dalam $_*
array - karena array_map
tidak rekursif Anda memerlukan fungsi khusus untuk ini.
Fitur bahasa yang memungkinkan pemrogram untuk menulis kode tanpa komentar atau tanpa komentar.
keluar sedikit mengambil risiko di sini - fungsi batal. suatu fungsi selalu melakukan sesuatu, oleh karena itu ia harus mengembalikan hasil atau sedikit informasi lain mengenai keberhasilan atau kegagalannya.
POKE dalam DASAR ...
Saya harus mengatakan pengumpulan sampah. Ini tidak menghilangkan kebutuhan untuk berpikir tentang manajemen memori, tetapi menghilangkan persepsi kebutuhan untuk berpikir tentang manajemen memori, yang terlalu sering menghilangkan pemikiran yang sebenarnya, dan kemudian Anda mendapatkan babi sumber daya yang sangat besar dan tidak tahu mengapa. Terutama ketika perilaku GC generasi modern dapat digambarkan tanpa terlalu banyak hiperbola sebagai "satu kebocoran memori besar dengan desain".
C, dan pasti C ++: Aritmatika pointer. Mengizinkan orang untuk mengubah bilangan bulat menjadi alamat memori meminta masalah.
Dan mungkin bahkan akses mentah ke pointer sama sekali?
Dalam C ++ Anda memiliki referensi yang membuat pointer hampir sepenuhnya tidak perlu. Untuk kasus yang tersisa, smart pointer harus dianggap wajib.
Java juga membuktikan bahwa Anda dapat membuat bahasa pemrograman yang menggunakan pointer tanpa mengizinkan orang mengakses nilai pointer itu sendiri.
Terlepas dari null
... tapi itu cerita yang berbeda.
for(int i=0;i<SIZE;++i) ++arr[i]
lebih lambat dari for(int*i=arr;i<arr+SIZE;++i)*i++
. Semua java berhasil membuktikan adalah bahwa Anda perlu pointer, atau apakah Anda tidak pernah melihatnya sun.misc.Unsafe
? Jika Anda tidak membutuhkan pointer, tolong jelaskan cara menulis fungsi swap generik menggunakan Java. (mis. int a = 1, b = 2; swap (a, b); nyatakan (a == 2 && b == 1);). Belum lagi semua masalah di c / c ++ yang akan Anda miliki jika Anda HARUS menggunakan referensi. Bagaimana Anda akan memanggil fungsi virtual pada sebuah struct yang tidak jelas dengan pointer?