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.
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:
Daftarkan Globals di PHP
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:
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:
sumber
Izinkan Null secara default, kesalahan "triliun" * dolar. Maaf, Tony Hoare. Hampir setiap bahasa tersedia di planet ini.
Tony Hoare menjelaskan
* Saya menyesuaikan ekspresi yang diciptakan oleh Tony Hoare untuk mencerminkan kerugian aktual pada hari-hari ini :-)
sumber
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:
Aaarg! Apa yang telah Anda lakukan dengan vektor STL saya !?
sumber
Fallthrough secara default di C dan C ++ beralih pernyataan.
sumber
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
menjadiint
, seperti di PHP.sumber
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.
sumber
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.
sumber
Autovivification (atau fitur bind-variable-on-(assign | use) lainnya) adalah fitur yang saya temukan paling banyak memberi saya bug.
sumber
PLEASE
dalam INTERCAL. Jangan cukup menggunakannya, itu mengeluh. Gunakan itu terlalu banyak, itu mengeluh.sumber
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.)
sumber
"Gagal diam-diam" di Flash Player sebagai perilaku default
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
sumber
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.
sumber
Mengakses pengubah di Jawa dengan paket standar bahasa privat dan konvensi pemrograman pribadi.
sumber
Mengganti variabel terdefinisi dengan string kosong di shell tanpa peringatan:
rm -rf $nosuchvar/*
.sumber
${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 .sumber
Menghentikan Thread dari Thread lain
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.
sumber
Variabel Variabel dalam PHP
Hanya karena Anda
$can
tidak bermaksud seperti Anda$$should
sumber
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.sumber
Array dalam AWK mulai dari indeks 1 !
sumber
car
! : PDalam 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).
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/
).sumber
Sintaks impor relatif Python 2.x. Misalkan saya memiliki paket
x.plugins
yang menambahkan dukungan untuk berbagai perpustakaan lain untukx
. Dan misalkan saya memilikisqlalchemy
modulx.plugins
sehingga saya dapat menambahkan dukungan sqlalchemy kex
. Menurut Anda apa yang akan terjadi jika saya menambahkan baris berikut ke sqlalchemy.py?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:
... tetapi tidak sampai Python 3 bahwa sintaks pertama sebenarnya sudah dihapus (meskipun dapat dinonaktifkan dengan Python 2.6+ with
from __future__ import absolute_import
).sumber
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."
sumber
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 !!
sumber
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).
sumber
magic_quotes
dalam PHP .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 menerapkanstripslashes()
pada semua nilai dalam$_*
array - karenaarray_map
tidak rekursif Anda memerlukan fungsi khusus untuk ini.sumber
Fitur bahasa yang memungkinkan pemrogram untuk menulis kode tanpa komentar atau tanpa komentar.
sumber
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.
sumber
POKE dalam DASAR ...
sumber
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".
sumber
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.sumber
for(int i=0;i<SIZE;++i) ++arr[i]
lebih lambat darifor(int*i=arr;i<arr+SIZE;++i)*i++
. Semua java berhasil membuktikan adalah bahwa Anda perlu pointer, atau apakah Anda tidak pernah melihatnyasun.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?