Xin vui lòng, giải thích lý do và liệt kê các ngôn ngữ có tính năng (mis) được triển khai Theo như bạn biết.
Đăng những gì bạn cho là một tính năng có hại, không phải những gì bạn không thích.
a = 1/0
- Biểu hiện cơ bản, có hại. ;-)
Xin vui lòng, giải thích lý do và liệt kê các ngôn ngữ có tính năng (mis) được triển khai Theo như bạn biết.
Đăng những gì bạn cho là một tính năng có hại, không phải những gì bạn không thích.
a = 1/0
- Biểu hiện cơ bản, có hại. ;-)
Câu trả lời:
Thông tin: http://php.net/manual/en/security.globals.php
Đây là tính năng tồi tệ nhất từng được thực hiện vì lý do dễ đọc và lý do bảo mật. Về cơ bản, tất cả các tham số GET nhận được được chuyển thành các biến.
Ví dụ với URL này: /index.php?value=foobar
Bạn có thể làm như sau:
<?php
echo $value; // return foobar
?>
Khi bạn đang đọc mã, sẽ rất khó hiểu khi biết biến đó đến từ đâu.
Ngoài ra nếu tính năng này bị lạm dụng, nó có thể dẫn đến lỗ hổng bảo mật. Đây là một ví dụ mã từ php.net cho thấy cách nó có thể bị sử dụng sai:
<?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";
}
?>
Cho phép Null theo mặc định, lỗi "nghìn tỷ" * đô la. Xin lỗi Tony Hoare. Hầu như mọi ngôn ngữ có sẵn trên hành tinh.
* Tôi đã điều chỉnh biểu thức do Tony Hoare đặt ra để phản ánh khoản lỗ thực tế vào những ngày này :-)
C và C ++ MACROS. Nếu tôi phải thấy một lỗi trình biên dịch khác do ai đó chọn tên hàm tiêu chuẩn cho macro của họ, điều đó sẽ làm hỏng mã của tôi, tôi sẽ hét lên. Hãy xem lần vi phạm cuối cùng:
#define vector(int) new VARIANT[int];
Có giá trị! Bạn đã làm gì với vector STL của tôi!?
Theo mặc định trong các câu lệnh chuyển đổi C và C ++.
break
câu nói hoặc ai đó thêm trường hợp giữa hai trường hợp (hoặc đặt hàng lại chúng), không nhận thấy có sự rơi vào giữa chúng. Tôi không thấy bất kỳ cách nào mà dự phòng tốt hơn cách C # yêu cầu phá vỡ hoặc trường hợp goto, v.v.
Chuyển đổi loại ngầm định khi các loại được chuyển đổi giữa không có mối quan hệ rõ ràng. Ví dụ, chuyển đổi ngẫu nhiên, không số string
thành một int
, như trong PHP.
explicit
, dừng các chuyển đổi kiểu ngầm định, nhưng vẫn còn vấn đề.
0
giá trị ngẫu nhiên .
goto : mặc dù ok trong các trường hợp hiếm hoi, nó thường bị sử dụng sai và dẫn đến các chương trình khó đọc.
KHÔNG AI
Chỉ vì một tính năng bị lạm dụng thường xuyên không làm cho nó có hại.
IMHO toàn bộ "được coi là có hại" là Redlerio ad Hitlerum của các cuộc thảo luận ngôn ngữ lập trình.
Hầu hết, nếu không phải tất cả, các tính năng "có hại" có hoặc ban đầu, trường hợp sử dụng rất hợp lệ hoặc đơn giản là các phương thức tiện lợi ở nơi đầu tiên. Tùy thuộc vào các nhà phát triển để hiểu những ưu và nhược điểm và mã phù hợp.
Nếu câu hỏi của bạn có nghĩa là một cái gì đó dọc theo dòng chữ "tính năng ngôn ngữ nào có những cạm bẫy phổ biến hoặc tác dụng phụ đáng tiếc" thì câu trả lời của tôi sẽ khác.
[sửa] Để rõ ràng: Tôi không có nghĩa là tiếp tục sử dụng các phương pháp không dùng nữa. Nếu các nhà phát triển đang phản đối / loại bỏ một tính năng, bạn nên sử dụng thay thế. Tôi đang đề cập đến khái niệm rằng một phần hiện tại của ngôn ngữ được coi là có hại vì một số người không thích những gì nó khuyến khích hoặc sự đánh đổi liên quan đến việc sử dụng nó mà nhiều người thảo luận.
Tự động hóa (hoặc tính năng liên kết biến-biến- (gán | sử dụng)) khác là tính năng mà tôi đã tìm thấy để cung cấp cho tôi nhiều lỗi nhất.
PLEASE
trong INTERCAL. Đừng sử dụng nó đủ, nó phàn nàn. Sử dụng nó quá nhiều, nó phàn nàn.
Mặc dù một số người không đồng ý với người đàn ông hoặc những điều khác nhau mà anh ta nói, rất nhiều JavaScript của Douglas Crockford : Phần tốt về cơ bản là câu hỏi này được áp dụng cho JS. Trong số các khiếu nại của Crockford:
Phạm vi toàn cầu theo mặc định cho mọi thứ (DC chỉ ra cách sử dụng hàm / đối tượng làm không gian tên và dấu phân cách phạm vi để sắp xếp thứ này vào.)
Các tuyên bố như with
, có hành vi thất bại là xác định mọi thứ trong không gian tên toàn cầu. (Gah! Giống như phương châm của JS là nếu bạn thất bại, thì hãy thất bại hết sức có thể !)
Hành vi bất ngờ với ==
toán tử, về cơ bản đòi hỏi bạn phải luôn sử dụng ===
toán tử.
Chèn dấu chấm phẩy.
Thực sự rất nhiều JS nên được coi là có hại, thậm chí có thể là toàn bộ ngôn ngữ, nhưng những phần tốt thì quá tốt đến nỗi nó bù đắp cho nó (ít nhất là đối với tôi.)
Ok, không thực sự là một tính năng của ngôn ngữ nhưng vẫn liên quan khá chặt chẽ.
Đột nhiên, ứng dụng Flash / Flex của bạn ngừng hoạt động và không ai có thể cho bạn gợi ý nhỏ nhất về những gì f * đã xảy ra. Không có thông báo lỗi, không stacktrace, không có gì. Chỉ là đột nhiên quá trình chuyển đổi màn hình không xảy ra (hoặc xảy ra theo cách hoàn toàn sai) hoặc các nút không phản ứng với các lần nhấp nữa hoặc các hộp tổ hợp trống thay vì được điền với một số mục.
Chỉ riêng "tính năng" đó chịu trách nhiệm cho một số báo cáo nhún vai và cả đống tóc bạc tôi đã nhận được. -.- Trong khi bật lên một số thông điệp khó hiểu trong khuôn mặt của người dùng cũng không mong muốn, ít nhất nó có thể giúp nhà phát triển khắc phục sự cố.
Nhưng Flash Player khiến bạn bị đâm trong bóng tối, dựa vào mô tả của người dùng (trong khi vấn đề thực sự có thể bắt nguồn từ một vị trí hoàn toàn khác trong mã không liên quan gì đến những gì người dùng đang làm). Chỉ khi bạn sử dụng Trình gỡ lỗi, bạn mới thực sự nhận được cửa sổ bật lên với thông báo lỗi và ngăn xếp.
Tuy nhiên, có thể khá thú vị khi xem phim nhúng flash trên các trang web tin tức nhất định và nhận được thông báo lặp đi lặp lại về các tham chiếu Null từ trình phát SWF được sử dụng. : D
Trong C / C ++: Các bài tập đó cũng là các biểu thức COMBINED VỚI các toán tử gán = và so sánh == rất giống nhau. Không phải là một tính năng có hại cho mỗi se, nhưng đó là cách dễ dàng để giới thiệu các lỗi (đôi khi tinh tế) bằng cách vô tình làm cho người vận hành nhầm lẫn.
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
Các công cụ sửa đổi truy cập trong Java với gói mặc định ngôn ngữ riêng và mặc định quy ước lập trình riêng.
Thay thế các biến không xác định bằng một chuỗi rỗng trong shell mà không có bất kỳ cảnh báo nào : rm -rf $nosuchvar/*
.
${varname:-/dev/null}
có thể là một cách giải quyết ...
Khả năng quay ngược chiều kim đồng hồ trong LOGO. Wtf, cho phép chỉ xoay theo chiều kim đồng hồ 360 - x
.
Trong Java và trong ngôn ngữ khác, bạn có thể dừng một luồng từ một luồng khác một cách tùy ý mà không dành thời gian cho luồng mà bạn dừng để hoàn thành đúng. Khả năng này đã bị phản đối khi xem xét số lượng lớn vấn đề mà nó có thể mang lại trong gần như mọi tình huống.
Các biến số trong PHP
Chỉ vì bạn $can
không có nghĩa là bạn$$should
use strict
) và cách dễ dàng để bật lại trong chính xác các trường hợp bạn muốn ( no strict 'refs'
).
Các With
tuyên bố trong Delphi nói đến cái tâm, mặc dù có những trường hợp khi nó có ích.
Mảng trong AWK bắt đầu từ chỉ số 1 !
car
! : P
Trong Perl, bối cảnh vô hướng so với bối cảnh danh sách có thể khó khăn. Nó có một số điểm tốt giúp cho các hoạt động nhất định trở nên thuận tiện, nhưng đôi khi bạn gặp phải điều gì đó khủng khiếp, như thay đổi hoàn toàn ý nghĩa của một toán tử (có khả năng từ một khoảng cách đáng kể trong mã).
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)
Điều đó không đúng.
(Nó phát sinh từ việc cố gắng tạo ra thứ gì đó hoạt động giống như toán tử phạm vi thông thường, vì vậy bạn có thể nói điều gì đó trong một vòng lặp như thế next if /start_regex/ .. /end_regex/
).
Cú pháp nhập tương đối của Python 2.x. Giả sử tôi có một gói x.plugins
bổ sung hỗ trợ cho các thư viện khác x
. Và giả sử tôi có một sqlalchemy
mô-đun x.plugins
để tôi có thể thêm hỗ trợ sqlalchemy vào x
. Bạn nghĩ điều gì sẽ xảy ra nếu tôi thêm dòng sau vào sqlalchemy.py?
import sqlalchemy
Câu trả lời là mô-đun sẽ cố gắng tự nhập. Những gì cú pháp này làm về cơ bản là làm cho không thể nhập gói sqlalchemy toàn cầu thực tế. Python 2.5 đã thêm một cách để xác định rằng đây là một lần nhập tương đối:
from . import sqlalchemy
... nhưng phải đến Python 3, cú pháp đầu tiên mới thực sự bị loại bỏ (mặc dù nó có thể bị vô hiệu hóa trong Python 2.6+ với from __future__ import absolute_import
).
sun.misc.unsafe là sở thích của tôi mọi lúc; bộ sưu tập "chúng tôi cần điều này để thực hiện mọi thứ, nhưng thực sự, thực sự không nghĩ rằng bạn nên sử dụng nó."
FORTRAN khối chung. Nếu bạn mắc một lỗi đơn giản, một phần của ứng dụng có thể ghi đè lên phần chung của phần khác.
FORTRAN được gán câu lệnh goto / câu lệnh thay đổi COBOL. Mã tự sửa đổi. Nguy hiểm, cảnh báo, quái vật bay spaghetti !!
Định hướng đối tượng (từ tất cả các ngôn ngữ gõ tĩnh). Tôi sẽ đặt cược tính năng này có, và sẽ tiếp tục, chi phí bao la hơn con trỏ null. Định hướng đối tượng chỉ tốt trong một ngôn ngữ truyền thông điệp động . Vì vậy, nó cũng nên được loại bỏ khỏi các ngôn ngữ động như Python (vì nó không sử dụng chuyển tin nhắn mà gọi chương trình con thông thường).
Các nhà phát triển chưa có kinh nghiệm hoặc dựa vào nó được kích hoạt và do đó giả sử tất cả đầu vào của người dùng được thoát để sử dụng trong truy vấn SQL hoặc dựa vào nó bị vô hiệu hóa và do đó luôn thoát khỏi đầu vào của họ.
Khi giả sử nó được kích hoạt và sau đó chạy mã trên một hệ thống mà ở đó nó không mở ra các lỗ hổng SQL rộng.
Khi giả sử nó bị vô hiệu hóa và không, nó sẽ dẫn đến các dấu gạch chéo ngược thực sự được lưu trữ trong DB, gây ra các chuỗi xấu / không chính xác.
Cũng không có cách cực kỳ đơn giản để xử lý cả hai trường hợp - bạn cần kiểm tra xem nó có được kích hoạt get_magic_quotes_gpc()
hay không và sau đó áp dụng stripslashes()
cho tất cả các giá trị trong $_*
mảng - vì array_map
không đệ quy nên bạn cần một hàm tùy chỉnh cho việc này.
Tính năng ngôn ngữ cho phép các lập trình viên viết mã không bị lỗi hoặc vô nghĩa.
đi ra ngoài một chút trên một chi ở đây - các hàm void. một hàm luôn luôn làm một cái gì đó, do đó nó sẽ trả về kết quả hoặc một số thông tin khác liên quan đến thành công hay thất bại của nó.
ĐIỂM CƠ BẢN ...
Tôi phải nói là thu gom rác. Nó không loại bỏ nhu cầu suy nghĩ về quản lý bộ nhớ, nhưng nó loại bỏ nhận thức về nhu cầu suy nghĩ về quản lý bộ nhớ, điều này thường loại bỏ suy nghĩ thực tế, và sau đó bạn nhận được rất nhiều tài nguyên khổng lồ và không biết tại sao. Đặc biệt là khi hành vi của các thế hệ GC hiện đại có thể được mô tả mà không có quá nhiều sự cường điệu như "một rò rỉ bộ nhớ lớn theo thiết kế".
C, và chắc chắn là C ++: Số học con trỏ. Cho phép mọi người chuyển đổi số nguyên thành địa chỉ bộ nhớ đang yêu cầu sự cố.
Và thậm chí có thể truy cập thô vào con trỏ hoàn toàn?
Trong C ++, bạn có các tài liệu tham khảo làm cho con trỏ gần như hoàn toàn không cần thiết. Đối với các trường hợp còn lại con trỏ thông minh nên được coi là bắt buộc.
Java cũng chứng minh rằng bạn có thể tạo một ngôn ngữ lập trình sử dụng các con trỏ mà không cho phép mọi người truy cập vào chính giá trị con trỏ.
Ngoài null
... nhưng đó là một câu chuyện khác.
for(int i=0;i<SIZE;++i) ++arr[i]
là chậm hơn so với for(int*i=arr;i<arr+SIZE;++i)*i++
. Tất cả java quản lý để chứng minh là bạn cần con trỏ, hoặc bạn chưa bao giờ nhìn vào sun.misc.Unsafe
? Nếu bạn không cần con trỏ, vui lòng giải thích cách viết hàm hoán đổi chung bằng Java. (ví dụ: int a = 1, b = 2; hoán đổi (a, b); khẳng định (a == 2 && b == 1);). Chưa kể tất cả các vấn đề trong c / c ++ bạn sẽ gặp phải nếu bạn HAD sử dụng tài liệu tham khảo. Làm thế nào bạn sẽ gọi một hàm ảo trên một con trỏ có cấu trúc mờ đục?