Fitur bahasa apa yang dianggap berbahaya? [Tutup]

20

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.

bigown
sumber
2
@ sbi Anda juga dapat membaca di halaman yang sama "XMLHttpRequest Dianggap Berbahaya" ...
HoLyVieR
1
Semuanya dianggap berbahaya, oleh orang lain, dengan kemungkinan pengecualian ekspresi dasar.
David Thornley
3
@ David Thornley: a = 1/0- Ekspresi dasar, berbahaya. ;-)
Orbling

Jawaban:

37

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:

<?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";
}
?>
HoLyVieR
sumber
Mengerikan. Meskipun saya dapat memahami keinginannya, mempertahankannya secara default sama sekali tidak masuk akal
TheLQ
14
Perlu dicatat dan ditekankan bahwa register global belum diaktifkan secara default sejak PHP 4.2 (sepanjang tahun 2000), tidak digunakan lagi dalam PHP 5.3 (2009) dan akan dihapus seluruhnya dalam PHP 6, tetapi orang-orang masih tetap kembali ke "OMG register global" dengan baik bahkan setelah 10 tahun.
1
PHP Pretty Hopeless
Ming-Tang
@SHiNKiROU Bukan tanpa harapan, fitur itu sudah usang dan akan dihapus dalam PHP 6.
HoLyVieR
1
Ini bukan harapan, itu hanya jauh di belakang begitu banyak bahasa lain bahwa satu-satunya alasan siapa pun menggunakannya adalah karena itu sampai saat ini jauh lebih mudah untuk mendapatkan webhosting murah untuk itu daripada bahasa lain.
intuited
22

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 :-)

bigown
sumber
Ini bukan fitur atau kesalahan, melainkan kekurangan fitur. Memiliki jenis referensi yang tidak dapat dibatalkan bukanlah sesuatu yang dapat Anda gunakan dengan mudah dalam suatu bahasa; Ini membutuhkan banyak pemikiran dan desain yang baik, dan sangat sulit untuk dilakukan dengan cara yang tidak terasa seperti berkelahi dengan kompiler. Spec # dan Singularity menunjukkan betapa sulitnya itu.
imgx64
@ imgx86, tidak, itu pasti sebuah kesalahan. Tipe referensi yang tidak dapat dibatalkan adalah fitur yang ditambahkan sebagai respons terhadap kesalahan nol untuk memungkinkan kompatibilitas dengan sistem tipe yang biasanya memungkinkan null.
Matt Olenik
@Kyralessa: Mungkin dia ingin memastikan bahwa HoLyVieR mendapat lencana populis? :-) Saya setuju, tidak masuk akal untuk menerima jawaban Anda sendiri seperti ini.
Macneil
18

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 !?

wheaties
sumber
Namespacing adalah salah satu hal yang membuat typedef dan template segera lebih ramah.
Shog9
4
Setuju, tetapi hanya karena bahasa modern telah menemukan penggantian untuk fungsi makro tekstual. Kembali ketika mereka ditemukan, makro adalah Good Thing karena teknologi kompiler sangat primitif.
dsimcha
di mana Anda menemukan makro ini?
rwong
@dsimcha - Saya tidak tahu tentang ini. Lisp macro sudah ada sejak lama.
Jason Baker
2
@Jason: Saya tidak mengetuk macro AST "nyata" ala Lisp, yang masih berguna dan keren. Saya hanya membenci makro gaya C / C ++ yang bekerja murni pada tingkat tekstual, tidak memiliki konsep ruang lingkup, memungkinkan seseorang untuk membuat abstraksi yang sangat bocor dan kode yang dikaburkan, dan dapat sepenuhnya dibuat usang oleh fitur yang lebih modern, salah satunya, ironisnya , adalah makro "asli".
dsimcha
14

Fallthrough secara default di C dan C ++ beralih pernyataan.

Niall C.
sumber
18
Ini selalu merupakan fitur yang membantu dalam semua kode yang saya tulis. Bagaimana ini bisa keliru?
greyfade
6
@greyfade: Sangat membantu sampai Anda lupa breakpernyataannya, 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.
Tim Goodman
9
Perangkat Duff mencemooh impunitas Anda!
Jesse C. Slicer
3
saya setuju. Secara default bukan fitur yang baik.
11
Apakah tidak ada yang membaca? Dia mengatakan fallthrough BY DEFAULT
Matt Olenik
13

Konversi tipe implisit ketika tipe yang dikonversi antara tidak memiliki hubungan yang jelas. Misalnya, mengubah acak, non-numerik stringmenjadi int, seperti di PHP.

Chinmay Kanchi
sumber
7
Perlu dicatat bahwa setelah Anda mengatasinya, hal semacam ini menjadi tidak menjadi masalah. Ini hanya benar-benar masalah jika Anda tidak melakukan pemeriksaan di area kritis untuk nilai yang dimasukkan pengguna, tetapi sangat berguna jika, katakanlah, Anda tahu sesuatu akan menjadi angka, tetapi muncul sebagai string. Misalnya, bidang dari DB kemungkinan akan dikembalikan sebagai string, dan Anda tidak ingin khawatir tentang castingnya.
Tarka
2
@ Sokun: Bisakah Anda memberikan contoh yang lebih baik? Mengapa menyimpan nilai integral dalam db menggunakan tipe string?
Steven Evers
@SnOrfus Memperoleh nomor yang dikirimkan dalam URL, input pengguna, fungsi, dan hal-hal lain yang umum untuk bahasa yang diketik secara tidak statis.
TheLQ
Ini juga merupakan masalah dalam C, karena nilai string yang dikutip adalah sebuah pointer, yang dapat dikonversi ke integer, dan ini dapat membuat konstruksi yang sepertinya masuk akal dikompilasi dengan benar tetapi menghasilkan omong kosong. Di C ++, Anda dapat menentukan fungsi konversi dengan kata kunci explicit, yang menghentikan konversi tipe implisit, tetapi masih ada masalah.
David Thornley
@TheLQ: Jika input pengguna, Anda harus memvalidasinya untuk mencari tahu apakah itu angka. Seperti kata @Slokun. Jika Anda membaca data dari file, Anda dapat mengharapkan data numerik sesuai dengan yang seharusnya, tetapi memiliki pengecualian yang muncul dalam kasus kerusakan disk sering lebih baik daripada hanya memiliki acak 0untuk beberapa nilai.
intuited
12

goto : walaupun ok dalam kasus yang jarang terjadi, ini lebih sering disalahgunakan dan menyebabkan program sulit dibaca.

Brian R. Bondy
sumber
Ya tuhan ya. xkcd.com/292
TheLQ
3
Saya telah melihat hal sebaliknya di mana memungkinkan penggunaan goto secara bijaksana akan menyelamatkan sebuah program dari menjadi 3 juta baris kode.
Dave
2
Ah, hiperbola ... Teknik sastra yang valid.
Robert Harvey
11

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.

Tagihan
sumber
13
Saya tidak setuju, contoh balasan yang baik adalah jawaban saya. Daftar global PHP buruk, tidak peduli bagaimana Anda menggunakannya. Inilah sebabnya mengapa itu sudah usang dan sangat disarankan untuk tidak pernah menggunakan versi PHP yang lebih lama.
HoLyVieR
5
+1 Dimasukkan ke tangan yang salah, konstruksi bahasa apa pun berbahaya.
mouviciel
5
Poin bagus ... bahkan jika 95% dari goto buruk, fitur itu sendiri masih layak dimiliki untuk 5% lainnya
eds
1
Saya pikir ini lebih seperti meletakkan tombol kursi ejector di sebelah tombol radio on / off. Fitur itu sendiri mungkin tidak buruk, tetapi tidak mencegah bahaya dengan penggunaannya yang tidak disengaja.
LennyProgrammers
1
Saya pikir ini adalah program yang setara dengan "senjata tidak membunuh orang, orang melakukannya".
Orbling
7

Autovivification (atau fitur bind-variable-on-(assign | use) lainnya) adalah fitur yang saya temukan paling banyak memberi saya bug.

Paul Nathan
sumber
+1 - Kami mungkin tidak setuju dengan gula iterator tapi ini adalah sesuatu yang bisa saya setujui dengan 100%.
ChaosPandion
7

PLEASEdalam INTERCAL. Jangan cukup menggunakannya, itu mengeluh. Gunakan itu terlalu banyak, itu mengeluh.

Alan Pearce
sumber
2
Bahasa itu seharusnya tidak digunakan dengan serius. Itu dibuat menjadi bahasa pemrograman yang sangat 'unik', sehingga penuh dengan hal-hal (misalnya datang dari - hanya di atas pikiran saya) yang tidak masuk akal.
ShdNx
4
Saya pikir itu akan jelas, tapi ya, saya sadar itu bukan bahasa yang serius.
Alan Pearce
2
Maaf, beberapa orang terlalu serius di sini.
Mark C
1
Baru saja menemukan bahasa minggu lalu di Wikipedia dan terpesona betapa populernya (dan masih ist O_O).
Oliver Weiler 8-10
Ada sejumlah bahasa "tantangan" dan mereka selalu populer, karena coders cenderung melakukan pekerjaan itu karena suka mengejar. Juga sangat populer untuk pertanyaan wawancara karena mereka sengaja tumpul, berpikir keras dan keras.
Orbling
7

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.)

CodexArcanum
sumber
6

"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

Baelnorn
sumber
Aplikasi iPhone terkadang macet tanpa peringatan, dalam timing aneh tertentu
Ming-Tang
3
Gagal diam dalam segala hal sangat buruk.
6

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();
}
Sebastian Negraszus
sumber
... dikombinasikan dengan fakta bahwa integer atau pointer adalah kondisi yang valid.
barjak
5

Mengakses pengubah di Jawa dengan paket standar bahasa privat dan konvensi pemrograman pribadi.

Hoa Long Tam
sumber
5

Mengganti variabel terdefinisi dengan string kosong di shell tanpa peringatan: rm -rf $nosuchvar/*.

duros
sumber
+1 Argh! LOL - default mengerikan (dan contoh lucu / menakutkan)
Orbling
@Orbling sesuatu seperti ${varname:-/dev/null}mungkin menjadi solusi ...
duro
Yah itu untuk menunjukkan kebutuhan untuk selalu secara defensif memeriksa keberadaan dan konten variabel sebelum digunakan.
Orbling
4

Kemampuan untuk memutar berlawanan arah jarum jam di LOGO. Wtf, mari kita putar 360 - xderajat searah jarum jam .

jjnguy
sumber
Yah, sudah lama sejak saya menggunakan LOGO. Mengapa ini berbahaya?
Mason Wheeler
5
Logo dapat digunakan untuk mengontrol robot penyu nyata. Terkadang Anda ingin kura-kura memutar arah tertentu, atau berputar lebih dari satu kali. Misalnya, mungkin Anda sedang memprogramnya untuk melakukan semacam tarian.
Daniel Cassidy
@Mason, Itu seharusnya menjadi lelucon.
jjnguy
3
Ya, terutama di LOGO For Clocks.
intuited
1
Saya suka Logo (lihat programmers.stackexchange.com/questions/21028/… ) dan ini adalah bahasa pengajaran yang sangat baik, terutama untuk kaum muda. Ketika saya mengatakan 11 dan pertama kali menggunakan Logo sebagian besar kelas saya tidak tahu banyak geometri, tetapi mereka diberi tahu 90 adalah seperempat putaran dan tahu kiri dari kanan. Jadi ini bukan fitur negatif - sama seperti mengapa kita tidak memperbanyak dengan timbal balik alih-alih memiliki operator pembagian. Ya, saya tahu ini lelucon.
Orbling
4

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.

HoLyVieR
sumber
Meskipun saya kira ini bisa berbahaya, ada kalanya ini sangat berguna (misalnya, debugger mendukung satu langkah dan titik istirahat).
Jerry Coffin
1
@ Jerry Debugging adalah hal lain, tidak menghentikan proses, menjeda itu.
HoLyVieR
sebaliknya, itu menghentikan utas. Rupanya, Anda sedang berbicara tentang membunuh utas, bukan hanya menghentikannya. Itu agak sulit dibenarkan ...
Jerry Coffin
Saya tidak melihat ini sebagai fitur bahasa. Lebih banyak hal perpustakaan standar.
Jason Baker
4

Variabel Variabel dalam PHP

Hanya karena Anda $cantidak bermaksud seperti Anda$$should

Kendall Hopkins
sumber
1
Seperti biasa, Perl ... memiliki fitur (berpotensi berbahaya) yang tersedia, memiliki cara praktik terbaik yang mudah untuk mematikannya ( use strict) dan cara mudah untuk menyalakannya lagi dalam keadaan yang Anda inginkan ( no strict 'refs').
1
Saya belum pernah menemukan penggunaan untuk memiliki nama variabel dinamis. Dan hanya beberapa kali yang saya lakukan, itu membuat kode tidak terbaca dan momen WTF beberapa bulan kemudian ketika saya meninjau kembali kode.
TheLQ
Mmm, aplikasi termasuk metaprogramming dengan variabel paket menjengkelkan orang lain atau tabel simbol (yang sedikit berbeda, saya kira).
1
@ Jo, saya akan menantang Anda untuk menunjukkan kepada saya satu contoh di mana variabel variabel membuat solusi menjadi lebih jelas.
Kendall Hopkins
1
Komentar itu dimaksudkan sebagai lelucon, maaf saya tidak membuat itu jelas, tetapi karena Anda bertanya di sini adalah contoh terbaik di mana variabel variabel membuat solusi menjadi lebih jelas . Saya akui itu contoh yang agak buruk.
Joe D
3

The Withpernyataan dalam Delphi datang ke pikiran, meskipun ada kasus ketika itu berguna.

Remko
sumber
Kasus yang bagus ketika saya memindahkan sesuatu dari Delphi ke Lazarus dan keturunan TControl saya berisi "dengan Canvas do ... Width, Height" merujuk ukuran kontrol, tetapi Lazarus TCanvas memiliki Width dan Delphi sendiri, jadi ini menyebabkan kode yang dikompilasi secara salah
Maksee
3

Array dalam AWK mulai dari indeks 1 !

Oliver Weiler
sumber
2
Array dalam C dan C ++ mulai dari indeks 0!
David Thornley
4
Array dalam pelat mulai dari indeks car! : P
Joe D
Di Lua juga - tidak termaafkan!
Tobu
2

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/).

pengguna2348
sumber
Manusia yang sangat membingungkan. Hal terburuk tentang mempelajari Perl adalah berusaha memahami hal itu.
glenatron
Saya selalu berpikir apa pun yang memungkinkan fungsi untuk kembali dalam berbagai cara adalah kenyamanan praktis.
Orbling
2

Sintaks impor relatif Python 2.x. Misalkan saya memiliki paket x.pluginsyang menambahkan dukungan untuk berbagai perpustakaan lain untuk x. Dan misalkan saya memiliki sqlalchemymodul x.pluginssehingga 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).

Jason Baker
sumber
1

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."

Dean J
sumber
7
Setiap bahasa yang baik harus memiliki paket yang tidak aman di perpustakaan standar. Mengimpor paket ini dengan jelas menunjukkan niat Anda untuk melakukan hal-hal tingkat rendah yang tidak dapat diport. Alternatifnya adalah: 1- Memiliki fitur yang tidak aman dalam bahasa itu sendiri (C ++ misalnya) dan 2- Harus menggunakan bahasa yang berbeda seperti C untuk melakukan hal-hal tingkat rendah (misalnya Python dan Ruby). Pendekatan paket yang tidak aman tampaknya jauh lebih baik bagi saya.
imgx64
1

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 !!

Stephen C
sumber
FORTRAN tidak memiliki pernyataan ALTER. FORTRAN memiliki pernyataan ASSIGN, dengan GOTO yang ditugaskan. COBOL memiliki pernyataan ALTER, yang memiliki tujuan yang sama.
John R. Strohm
@ John - terima kasih. Ingatan saya tentang tugas / perubahan redup ... paling tidak karena saya diajarkan untuk tidak pernah menggunakannya.
Stephen C
1

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).

Yttrill
sumber
Python mendukung (untuk semua maksud dan tujuan) pesan Smalltalk lewat idiom. Hanya saja tidak dinamai seperti itu. Kedua, saya pikir itu setidaknya bisa diperdebatkan untuk menyebut fitur bahasa yang meresap itu berbahaya.
Jason Baker
Orientasi Objek masih meningkatkan penggunaan kembali kode dan enkapsulasi kode / data. Terlepas dari penggunaan fitur statis / dinamis.
Orbling
@Orbling: Dibandingkan dengan apa? Menurut pendapat saya, bahasa pemrograman fungsional memiliki penggunaan kembali kode yang lebih tinggi dan saya pikir sistem modul Haskell cukup baik untuk enkapsulasi kode / data.
LennyProgrammers
@ Lenny222 Dibandingkan dengan pemrograman imperatif standar. Saya juga lebih suka pendekatan fungsional, Haskell adalah bahasa pilihan saya.
Orbling
@Jason Baker: yah tentu saja masih bisa diperdebatkan, tetapi menjadi begitu meresap itulah yang membuatnya sangat berbahaya! OP memang meminta pendapat saya, dan saya memberikannya. Hanya karena sekelompok Lemmings melompat dari tebing tidak membuat perilakunya waras. Dalam hal ini terbukti secara matematis, OOP tidak berfungsi, dan paradigma yang benar diterima dengan baik: teori kategori adalah cara untuk mewakili abstraksi (sebenarnya adalah teori abstraksi)
Yttrill
1

magic_quotesdalam 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 menerapkan stripslashes()pada semua nilai dalam $_*array - karena array_maptidak rekursif Anda memerlukan fungsi khusus untuk ini.

Pencuri
sumber
Atau Anda bisa menggunakan kueri parameterisasi.
Pieter B
Bahkan kemudian Anda akan mendapatkan garis miring terbalik jika tanda kutip sihir diaktifkan dan Anda tidak mengharapkannya.
ThiefMaster
-3

Fitur bahasa yang memungkinkan pemrogram untuk menulis kode tanpa komentar atau tanpa komentar.

tia
sumber
1
Dan bagaimana cara memperbaikinya?
Maniero
1
@bigown: dengan menerapkan fitur komentar-atau-mati: D.
tia
3
Itu disebut Pemrograman Literate. en.wikipedia.org/wiki/Literate_programming
Barry Brown
2
Itu bukan fitur, tetapi itu adalah bug yang sangat terkenal di bagian depan pengguna, kebanyakan orang tahu itu dengan nama latinnya: Homo Sapiens.
Joe D
-3

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.

Brad Clawsie
sumber
3
Pascal memiliki prosedur (tidak ada nilai balik) serta fungsi (nilai balik).
Jon Onstott
Fungsi selalu melakukan sesuatu (biasanya, fungsi placeholder ada orang?) , Tetapi sering kali tidak perlu memberi tahu siapa pun tentang hal itu.
Orbling
-4

POKE dalam DASAR ...

squelart
sumber
7
POKE itu luar biasa.
Shog9
2
Pada masa awal menyodok adalah satu-satunya cara yang masuk akal Anda dapat mencapai hal-hal tertentu secara mendasar. Musik di Apple] [terlintas dalam pikiran ...
Bill
2
Anda tidak bisa berbuat banyak tanpa POKE pada Commodore 64, jika saya ingat dengan benar.
MetalMikester
1
Jangan lupa MENGINTIP, keduanya penting.
Orbling
-5

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".

Mason Wheeler
sumber
2
Jika Anda memiliki referensi yang ada di beberapa koleksi di suatu tempat, Anda memiliki masalah lain.
Chinmay Kanchi
2
Itu sebabnya bahasa gc'ed memiliki referensi yang lemah :)
Chinmay Kanchi
4
Sementara GC tentunya memiliki kekuatan dan kelemahan, saya harus mengatakan bahwa Mason jauh lebih benar daripada yang salah dalam hal ini. Faktanya, saya telah melihat orang yang menggunakan GC menghabiskan banyak waktu ekstra untuk manajemen memori karena mereka akhirnya mencoba meretas beberapa hal setelah fakta alih-alih merencanakannya di muka. GC juga umumnya mencegah kehancuran deterministik, yang mengarah pada pekerjaan ekstra yang berurusan dengan mengelola semua sumber daya selain memori.
Jerry Coffin
3
@ChaosPandion: Apakah saya benar-benar bodoh jika saya berpikir bahwa, pada mesin multitasking modern, untuk menjaga agar paging tidak merusak kinerja sistem Anda, memori harus dilepaskan sesegera mungkin? Tidak ada GC yang pernah berhasil mencapai hasil itu, dan pada kenyataannya, pengumpul sampah generasi, yang seharusnya menjadi yang terbaik, varietas paling modern, melakukan sebaliknya, untuk kinerja terbaik, harus melepaskan memori selambat mungkin. Saya tidak melihat itu sebagai alat yang tepat untuk pekerjaan apa pun, tidak ketika itu memperlambat program saya yang lain. Apakah saya bodoh untuk itu?
Mason Wheeler
2
@ Larry: Ini deterministik dalam program ini. Jika saya selesai dengan blok memori 5 KB, maka tanyakan 5 KB lainnya segera setelah itu, apa yang terjadi? Dalam sistem pengumpulan sampah, perlu meminta blok 5 KB baru, meskipun ada blok yang sangat bagus tidak digunakan, kecuali GC telah berjalan untuk sementara, dalam hal ini Anda dapat mendaur ulang blok yang lama. Dengan malloc dan gratis, Anda akan selalu dapat mendaur ulang blok lama. Kalikan ini dengan beberapa ratus ribu dan itu menjadi masalah nyata.
Mason Wheeler
-5

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.

Asgeir S. Nilsen
sumber
5
Pointer, walaupun terkadang sulit digunakan dengan benar, sangat diperlukan untuk sejumlah besar operasi memori yang efisien.
Bill
1
Benar. Tetapi membiarkan orang untuk mengubah bilangan bulat menjadi referensi memori secara teratur, atau menambahkan nomor ke alamat memori sebagian besar berbahaya menurut pendapat saya saat ini. Dalam C ++ Anda memiliki referensi sebagai alternatif yang sangat baik, dan smart pointer / auto pointer ketika Anda benar-benar membutuhkannya untuk menjadi pointer.
Asgeir S. Nilsen
4
Jawaban ini hanya valid jika Anda bekerja pada tumpukan perangkat lunak yang dibangun untuk menyembunyikan pointer. Dalam semua kasus lain, jawaban ini salah.
Paul Nathan
3
Beberapa bahasa pemrograman perlu memiliki pointer yang tersedia sehingga Anda dapat menulis semua sistem operasi dan mesin virtual untuk bahasa pemrograman lainnya.
2
-1. Ada alasan mengapa Anda membutuhkan ptr aritmatika: Iterasi suatu titik lebih cepat daripada pengindeksan. 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?
KitsuneYMG