คุณสมบัติภาษาใดที่ถือว่าเป็นอันตราย [ปิด]


20

โปรดอธิบายสาเหตุและรายการภาษาที่มีการใช้งานคุณสมบัติ (ผิดพลาด) เท่าที่คุณทราบ

โพสต์สิ่งที่คุณพิจารณาถึงคุณสมบัติที่เป็นอันตรายไม่ใช่สิ่งที่คุณไม่ชอบ


1
ไปที่ถือว่าเป็นอันตราย
sbi

2
@sbi คุณยังสามารถอ่านได้ในหน้าเดียวกัน "XMLHttpRequest ถือว่าเป็นอันตราย" ...
HoLyVieR

1
พวกเขาทั้งหมดถือว่าเป็นอันตรายโดยใครบางคนหรือคนอื่น ๆ ด้วยข้อยกเว้นที่เป็นไปได้ของการแสดงออกขั้นพื้นฐาน
David Thornley


3
@ David Thornley: a = 1/0- การแสดงออกขั้นพื้นฐานเป็นอันตราย ;-)
Orbling

คำตอบ:


37

ลงทะเบียน Globals ใน PHP

ข้อมูล: http://php.net/manual/th/security.globals.php

นี่คือคุณลักษณะที่แย่ที่สุดที่จะนำมาใช้เนื่องจากเหตุผลในการอ่านและเหตุผลด้านความปลอดภัย โดยพื้นฐานแล้วพารามิเตอร์ GET ทั้งหมดที่ได้รับจะถูกเปลี่ยนเป็นตัวแปร

ตัวอย่างเช่นกับ URL นี้: /index.php?value=foobar

คุณสามารถทำสิ่งต่อไปนี้:

<?php
echo $value; // return foobar
?>

เมื่อคุณกำลังอ่านโค้ดมันค่อนข้างสับสนที่จะรู้ว่าตัวแปรมาจากไหน

นอกจากนี้หากใช้งานผิดวัตถุประสงค์อาจทำให้เกิดช่องโหว่ด้านความปลอดภัย นี่คือตัวอย่างรหัสจาก php.net ที่แสดงให้เห็นว่าสามารถนำไปใช้ในทางที่ผิดได้อย่างไร:

<?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";
}
?>

นั่นเป็นเรื่องที่น่ากลัวมาก ในขณะที่ฉันสามารถเข้าใจความต้องการได้ แต่ให้ดำเนินการต่อโดยไม่มีเหตุผล
TheLQ

14
ควรสังเกตและเน้นว่าการลงทะเบียน globals ไม่ได้เปิดใช้งานโดยค่าเริ่มต้นตั้งแต่ PHP 4.2 (ย้อนกลับไปในปี 2000), ถูกคัดค้านใน PHP 5.3 (2009) และจะถูกลบทั้งหมดใน PHP 6 แต่ผู้คนยังคงย้อนกลับไป ถึง "OMG register globals" แม้กระทั่งหลังจากผ่านไป 10 ปี

1
PHP ที่สิ้นหวังค่อนข้างสวย
Ming-Tang

@SHiNKiROU มันไม่สิ้นหวังคุณสมบัตินั้นเลิกใช้แล้วและจะถูกลบใน PHP 6
HoLyVieR

1
มันไม่ได้สิ้นหวังมันอยู่หลังภาษาอื่น ๆ มากมายจนเหตุผลเดียวที่ใคร ๆ ก็ใช้มันก็เพราะว่ามันจนกระทั่งเมื่อเร็ว ๆ นี้มันง่ายกว่ามากที่จะได้รับเว็บโฮสติ้งราคาถูกกว่าภาษาอื่น ๆ
intuited

22

อนุญาต Null โดยค่าเริ่มต้นความผิดพลาดของ "ล้านล้าน" * ดอลลาร์ ขออภัยโทนี่โฮอาร์ เกือบทุกภาษามีอยู่บนโลกใบนี้

Tony Hoare อธิบาย

* ฉันปรับการแสดงออกประกาศเกียรติคุณจาก Tony Hoare เพื่อสะท้อนการสูญเสียที่เกิดขึ้นจริงในวันนี้ :-)


นี่ไม่ใช่คุณสมบัติหรือข้อผิดพลาด แต่ขาดคุณสมบัติ การมีประเภทอ้างอิงที่ไม่เป็นโมฆะไม่ใช่สิ่งที่คุณสามารถวางลงในภาษาได้ มันต้องใช้ความคิดและการออกแบบที่ดีมากและยากมากที่จะทำในลักษณะที่ไม่รู้สึกอยากต่อสู้กับคอมไพเลอร์ Spec # และ Singularity แสดงว่ามันยากแค่ไหน
imgx64

@ imgx86 ไม่เป็นความผิดพลาดแน่นอน ประเภทการอ้างอิงที่ไม่เป็นโมฆะเป็นคุณสมบัติที่เพิ่มขึ้นในการตอบสนองต่อข้อผิดพลาดที่เป็นโมฆะเพื่ออนุญาตให้ใช้งานร่วมกับระบบประเภทที่ปกติอนุญาตให้เป็นโมฆะ
Matt Olenik

@Kyralessa: บางทีเขาต้องการให้แน่ใจว่า HoLyVieR ได้รับตราประชานิยม? :-) ฉันเห็นด้วยมันไม่มีเหตุผลที่จะยอมรับคำตอบของคุณเช่นนี้
Macneil

18

MACROS C และ C ++ ถ้าฉันต้องเห็นข้อผิดพลาดของคอมไพเลอร์อื่นเนื่องจากมีคนเลือกชื่อฟังก์ชันมาตรฐานสำหรับแมโครของพวกเขาซึ่งใช้รหัสของฉันฉันจะกรีดร้อง เรามาดูการละเมิดครั้งสุดท้าย:

#define vector(int) new VARIANT[int];

Aaarg! คุณทำอะไรกับเวกเตอร์ STL ของฉัน!


การกำหนดเนมสเปซเป็นหนึ่งในสิ่งที่ทำให้การพิมพ์และแม่แบบเป็นมิตรมากขึ้นในทันที
Shog9

4
เห็นด้วย แต่เพียงเพราะภาษาสมัยใหม่ได้พบการแทนที่สำหรับการทำงานของแมโครต้นฉบับเดิม ย้อนกลับไปเมื่อพวกเขาถูกประดิษฐ์มาโครเป็นสิ่งที่ดีเพราะเทคโนโลยีคอมไพเลอร์ดั้งเดิมมาก
dsimcha

คุณพบมาโครนี้จากที่ใด

@dsimcha - ฉันไม่รู้เกี่ยวกับสิ่งนี้ มาโครเสียงกระเพื่อมมาเป็นเวลานาน
Jason Baker

2
@ Jason: ฉันไม่ได้เคาะมาโคร Lisp แบบ "ของจริง" ซึ่งยังมีประโยชน์และเจ๋ง ฉันเกลียดมาโคร C / C ++ - สไตล์มาโครที่ทำงานในระดับข้อความล้วน ๆ ไม่มีแนวคิดเกี่ยวกับขอบเขตอนุญาตให้สร้าง abstractions ที่น่าขันรั่วไหลและโค้ดที่สับสนและสามารถทำให้ล้าสมัยอย่างสมบูรณ์โดยคุณลักษณะที่ทันสมัยกว่าอย่างใดอย่างหนึ่งแดกดัน เป็นมาโคร "ของจริง"
dsimcha

14

การตกหล่นโดยค่าเริ่มต้นในคำสั่งการเปลี่ยน C และ C ++


18
นี่เป็นคุณสมบัติที่มีประโยชน์เสมอในรหัสทั้งหมดที่ฉันเขียน นี่เป็นวิธีการที่ไม่ถูกต้องหรือไม่?
greyfade

6
@greyfade: มีประโยชน์จนกว่าคุณจะลืมbreakคำสั่งหรือบางคนเพิ่มเคสระหว่างสองกรณี (หรือสั่งอีกครั้ง) ไม่สังเกตเห็นว่ามีการตกลงระหว่างกัน ฉันไม่เห็นทางที่ fallthrough ดีกว่าวิธีที่ C # ต้องใช้ทั้งการแบ่งหรือกรณีข้าม ฯลฯ
ทิมสามี

9
อุปกรณ์ของ Duff ทำหน้าที่เย้ยหยันเมื่อคุณได้รับการยกเว้น!
Jesse C. Slicer

3
ฉันเห็นด้วย. โดยค่าเริ่มต้นไม่ใช่คุณสมบัติที่ดี

11
ไม่มีใครอ่านหรือไม่? เขากล่าวว่าการผิดพลาดโดยค่าเริ่มต้น
Matt Olenik

13

การแปลงประเภทโดยนัยเมื่อประเภทที่ถูกแปลงระหว่างไม่มีความสัมพันธ์ที่ชัดเจน ตัวอย่างเช่นการแปลงแบบสุ่มไม่ใช่ตัวเลขstringให้เป็นintเช่นใน PHP


7
ควรสังเกตว่าเมื่อคุณได้รับหัวของคุณสิ่งนี้จะกลายเป็นปัญหา เป็นปัญหาจริง ๆ เท่านั้นถ้าคุณไม่ทำการตรวจสอบในพื้นที่สำคัญสำหรับค่าที่ผู้ใช้ป้อน แต่มีประโยชน์อย่างมากถ้าพูดว่าคุณรู้ว่ามีบางอย่างที่เป็นตัวเลข แต่มาเป็นสตริง ตัวอย่างเช่นเขตข้อมูลจากฐานข้อมูลอาจถูกส่งคืนเป็นสตริงและคุณไม่ต้องการกังวลเกี่ยวกับการส่ง
Tarka

2
@Slokun: คุณช่วยยกตัวอย่างที่ดีกว่าได้ไหม? เหตุใดจึงต้องเก็บค่าสำคัญใน db โดยใช้ชนิดสตริง
Steven Evers

@SnOrfus รับจำนวนที่ส่งผ่านใน URL, การป้อนข้อมูลผู้ใช้, ฟังก์ชั่นและสิ่งอื่น ๆ ที่พบได้ทั่วไปในภาษาที่พิมพ์ไม่คงที่
TheLQ

นี่เป็นปัญหาใน C เนื่องจากค่าของสตริงที่ยกมาเป็นตัวชี้ซึ่งสามารถแปลงเป็นจำนวนเต็มและสิ่งนี้สามารถสร้างโครงสร้างที่ดูเหมือนว่าพวกเขาอาจทำให้คอมไพล์ได้อย่างถูกต้อง แต่สร้างเรื่องไร้สาระ ใน C ++ คุณสามารถกำหนดฟังก์ชั่นการแปลงด้วยคำหลักexplicitซึ่งจะหยุดการแปลงประเภทโดยนัย แต่ยังคงมีปัญหาอยู่
David Thornley

@TheLQ: หากเป็นข้อมูลที่ป้อนโดยผู้ใช้คุณจะต้องตรวจสอบความถูกต้องเพื่อตรวจสอบว่าเป็นตัวเลขหรือไม่ ชอบ @Slokun กล่าว หากคุณกำลังอ่านข้อมูลจากไฟล์คุณสามารถคาดหวังว่าข้อมูลตัวเลขจะเป็นที่ที่ควรจะเป็น แต่การมีข้อยกเว้นเกิดขึ้นในกรณีที่ดิสก์เกิดความเสียหายมักจะดีกว่าแค่มีการสุ่ม0ค่าบางค่า
intuited

12

ข้ามไป : แม้ว่าจะใช้ได้ในบางกรณี แต่ก็มักจะใช้ในทางที่ผิดและนำไปสู่การอ่านยาก


พระเจ้าที่ดีใช่ xkcd.com/292
TheLQ

3
ฉันได้เห็นสิ่งที่ตรงกันข้ามซึ่งการอนุญาตให้ใช้งาน goto อย่างชาญฉลาดจะช่วยให้โปรแกรมไม่สามารถถูกโค้ด 3 ล้านบรรทัดได้
เดฟ

2
อ้ออธิ ... เทคนิคทางวรรณกรรมที่ถูกต้อง
Robert Harvey

11

ไม่มี

เพียงเพราะฟีเจอร์ที่ถูกนำไปใช้ในทางที่ผิดบ่อยครั้งไม่ได้ทำให้เกิดอันตราย

IMHO ทั้งหมด "ถือว่าเป็นอันตราย" คือReductio ad Hitlerumของการสนทนาภาษาโปรแกรม

ส่วนใหญ่ถ้าไม่ทั้งหมดของคุณสมบัติ "อันตราย" มีหรือมีมา แต่เดิมกรณีการใช้งานที่ถูกต้องมากหรือเป็นเพียงวิธีการอำนวยความสะดวกในตอนแรก มันขึ้นอยู่กับนักพัฒนาที่จะเข้าใจข้อดีข้อเสียและรหัสตาม

หากคำถามของคุณมีความหมายที่จะเป็นบางสิ่งบางอย่างตามแนวของ "คุณสมบัติภาษาอะไรมีข้อผิดพลาดทั่วไปหรือผลข้างเคียงที่โชคร้าย" คำตอบของฉันจะแตกต่างกัน

[แก้ไข] มีความชัดเจน: ฉันไม่ได้หมายถึงการใช้วิธีการคัดค้านอย่างต่อเนื่อง หากนักพัฒนาซอฟต์แวร์คิดค่าเสื่อมราคา / ลบคุณลักษณะคุณควรใช้การแทนที่ ฉันหมายถึงแนวคิดว่าส่วนปัจจุบันของภาษาถือว่าเป็นอันตรายเพราะบางคนไม่ชอบสิ่งที่กระตุ้นหรือการแลกเปลี่ยนที่เกี่ยวข้องกับการใช้งานที่หลายคนพูดถึง


13
ฉันไม่เห็นด้วยตัวอย่างที่ดีคือคำตอบของฉัน PHP register ทั่วโลกแย่มากไม่มีวิธีที่คุณใช้ นี่คือเหตุผลว่าทำไมเลิกใช้แล้วและไม่แนะนำให้ใช้กับ PHP เวอร์ชันเก่า
HoLyVieR

5
+1 อยู่ในมือผิดภาษาใด ๆ ที่สร้างเป็นอันตราย
mouviciel

5
จุดดี ... แม้ว่า 95% ของ gotos จะไม่ดีตัวมันเองก็ยังคงคุ้มค่าสำหรับอีก 5%
eds

1
ฉันคิดว่ามันเหมือนกับการวางปุ่มที่นั่งอีเจ็คเตอร์ข้างปุ่มเปิด / ปิดวิทยุ คุณลักษณะนี้อาจไม่เลว แต่ไม่ป้องกันอันตรายจากการใช้งานโดยไม่ตั้งใจ
LennyProgrammers

1
ฉันคิดว่านี่คือการเขียนโปรแกรมเทียบเท่า "ปืนไม่ฆ่าคนทำคน"
Orbling

7

Autovivification (หรือคุณสมบัติอื่น ๆ ผูกตัวแปร -on- (assign | ใช้)) เป็นคุณสมบัติที่ฉันได้พบเพื่อให้ข้อบกพร่องมากที่สุด


+1 - เราอาจไม่เห็นด้วยกับ iterator sugar แต่นี่คือสิ่งที่ฉันเห็นด้วย 100%
ChaosPandion

7

PLEASEใน INTERCAL อย่าใช้มันให้พอมันบ่น ใช้มันมากเกินไปก็บ่น


2
ภาษานั้นไม่ควรใช้อย่างจริงจัง มันถูกสร้างขึ้นให้เป็นภาษาการเขียนโปรแกรมที่ 'ไม่เหมือนใคร' ดังนั้นมันจึงเต็มไปด้วยสิ่งต่าง ๆ (เช่น comefrom - เหนือความคิดของฉัน) ที่ไม่เข้าท่า
ShdNx

4
ฉันคิดว่ามันจะชัดเจน แต่ใช่ฉันรู้ว่ามันไม่ใช่ภาษาที่จริงจัง
Alan Pearce

2
ขออภัยมีบางคนจริงจังเกินไปที่นี่
ทำเครื่องหมาย C

1
เพิ่งค้นพบภาษาเมื่อสัปดาห์ที่แล้วบนวิกิพีเดียและได้รับความนิยม (และยังคงเป็น O_O)
Oliver Weiler

มีภาษา "ท้าทาย" จำนวนหนึ่งและเป็นที่นิยมอยู่เสมอเพราะผู้เขียนโค้ดมักจะทำงานเนื่องจากความรักในการไล่ล่า ยังเป็นที่นิยมมากสำหรับคำถามสัมภาษณ์เนื่องจากพวกเขาป้านจงใจคิดและยาก
Orbling

7

แม้ว่าคนบางคนไม่เห็นด้วยกับชายหรือสิ่งต่าง ๆ ที่เขาพูดJavaScriptของ Douglas Crockford จำนวนมาก: The Good Partsเป็นคำถามที่ใช้กับ JS ท่ามกลางข้อร้องเรียนของ Crockford:

  • ขอบเขตทั่วโลกโดยค่าเริ่มต้นสำหรับทุกอย่าง (DC แสดงวิธีการใช้ฟังก์ชั่น / วัตถุเป็น namespaces และตัวคั่นขอบเขตที่จะโต้เถียงนี้)

  • คำสั่งwithที่มีพฤติกรรมความล้มเหลวคือการกำหนดสิ่งต่าง ๆ ที่ namespace ทั่วโลก (Gah! มันเหมือนคำขวัญ JS คือถ้าคุณล้มเหลวแล้วล้มเหลวอย่างหนักที่สุด !)

  • พฤติกรรมที่ไม่คาดคิดกับ==ผู้ปฏิบัติงานซึ่งโดยทั่วไปกำหนดให้คุณต้องใช้ตัว===ดำเนินการเสมอ

  • อัฒภาคแทรก

จริงๆแล้ว JS จำนวนมากควรได้รับการพิจารณาว่าเป็นอันตรายแม้กระทั่งทั้งภาษา แต่ชิ้นส่วนที่ดีนั้นก็แย่มากจนทำให้มันเหมาะสำหรับมัน (อย่างน้อยสำหรับฉัน)


6

"ล้มเหลวอย่างเงียบ ๆ " ใน Flash Player เป็นพฤติกรรมเริ่มต้น

ตกลงไม่ใช่คุณสมบัติของภาษาเอง แต่ก็ยังมีความเกี่ยวข้องอย่างใกล้ชิด

ทันใดนั้นแอปพลิเคชั่น Flash / Flex ของคุณก็หยุดทำงานและไม่มีใครสามารถบอกได้ว่าเกิดอะไรขึ้นกับ f * ไม่มีข้อความแสดงข้อผิดพลาดไม่มีสแต็คเทรซไม่มีอะไรเลย เป็นเพียงว่าการเปลี่ยนหน้าจอก็ไม่ได้เกิดขึ้น (หรือเกิดขึ้นในทางที่ผิด) หรือปุ่มไม่ตอบสนองต่อการคลิกอีกต่อไปหรือ comboboxes ว่างเปล่าแทนที่จะถูกเติมด้วยรายการบางรายการ

"คุณสมบัติ" เพียงอย่างเดียวนั้นมีหน้าที่รายงานยักหลายอย่างและผมสีเทาจำนวนมากที่ฉันได้รับ -.- ในขณะที่ popping อัพข้อความลับ ๆ บางอย่างในหน้าของผู้ใช้ไม่พึงประสงค์อย่างน้อยก็อย่างน้อยก็สามารถช่วยนักพัฒนาได้รับการแก้ไขปัญหา

แต่ Flash Player ปล่อยให้คุณแทงไปในที่มืดโดยอาศัยคำอธิบายของผู้ใช้ (ในขณะที่ปัญหาอาจเกิดจากตำแหน่งที่แตกต่างอย่างสิ้นเชิงในรหัสที่ไม่มีส่วนเกี่ยวข้องกับสิ่งที่ผู้ใช้ทำ) เฉพาะในกรณีที่คุณใช้ Debug Player คุณจะได้รับหน้าต่างป๊อปอัพพร้อมกับข้อความแสดงข้อผิดพลาดและสแต็กสแต็ก

อย่างไรก็ตามอาจเป็นเรื่องที่น่าสนใจในการรับชมภาพยนตร์ที่ฝังตัวแฟลชในเว็บไซต์ข่าวบางแห่งและได้รับข้อความซ้ำ ๆ : D


แอพของ iPhone ก็พังโดยไม่มีการเตือนในบางเวลาที่แปลก ๆ
Ming-Tang

3
การล้มเหลวอย่างเงียบ ๆ ในสิ่งใดก็เป็นหมัดที่ค่อนข้างสวย

6

ใน C / C ++: การกำหนดนั้นเป็นนิพจน์ที่รวมเข้ากับการมอบหมาย = และการเปรียบเทียบ == ตัวดำเนินการที่คล้ายกันมาก ไม่ใช่คุณสมบัติที่เป็นอันตรายต่อ แต่เป็นวิธีที่ง่ายในการแนะนำข้อผิดพลาด (บางครั้งบอบบาง) โดยการพิมพ์ผิดพนักงานโดยไม่ตั้งใจ

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

... รวมกับความจริงที่ว่าจำนวนเต็มหรือตัวชี้เป็นเงื่อนไขที่ถูกต้อง
barjak

5

เข้าถึงโมดิฟายเออร์ใน Java ด้วยค่าเริ่มต้นภาษาส่วนตัวของแพ็กเกจและค่าเริ่มต้นของแผนการเขียนโปรแกรมส่วนตัว


5

rm -rf $nosuchvar/*การเปลี่ยนตัวแปรไม่ได้กำหนดโดยสตริงที่ว่างเปล่าในเปลือกโดยไม่มีคำเตือนใด ๆ


+1 อ๊าก! LOL - ค่าเริ่มต้นที่น่ากลัว (และตัวอย่างที่น่าขบขัน / น่ากลัว)
Orbling

@Orbling บางอย่างเช่น${varname:-/dev/null}อาจจะเป็นวิธีแก้ปัญหา ...
duros

มันจะแสดงความจำเป็นในการตรวจสอบการมีอยู่ของตัวแปรและเนื้อหาก่อนการใช้งานเสมอ
Orbling

4

ความสามารถในการหมุนทวนเข็มนาฬิกาในโลโก้ Wtf ให้เปลี่ยน360 - xองศาตามเข็มนาฬิกา


มันเป็นเวลานานแล้วที่ฉันใช้โลโก้ ทำไมสิ่งนี้ถึงเป็นอันตราย?
Mason Wheeler

5
โลโก้สามารถใช้เพื่อควบคุมหุ่นยนต์เต่าทางกายภาพที่แท้จริง บางครั้งคุณต้องการให้เต่าหมุนทิศทางที่เฉพาะเจาะจงหรือหมุนมากกว่าหนึ่งครั้ง ตัวอย่างเช่นบางทีคุณกำลังเขียนโปรแกรมเพื่อเต้นรำบางประเภท
Daniel Cassidy

@ Mason มันควรจะเป็นเรื่องตลก
jjnguy

3
ใช่โดยเฉพาะในโลโก้สำหรับนาฬิกา
intuited

1
ฉันรักโลโก้ (ดูprogrammers.stackexchange.com/questions/21028/… ) และเป็นภาษาการสอนที่ยอดเยี่ยมโดยเฉพาะอย่างยิ่งสำหรับคนหนุ่มสาว เมื่อฉันพูดว่า 11 และใช้โลโก้เป็นครั้งแรกส่วนใหญ่ในชั้นเรียนของฉันไม่ทราบว่ามีรูปทรงเรขาคณิตมากนัก แต่พวกเขาได้รับการบอกว่า 90 เป็นหนึ่งในสี่และรู้ทางซ้ายจากขวา ดังนั้นมันจึงไม่ใช่คุณสมบัติเชิงลบ - เหมือนกับว่าทำไมเราไม่คูณด้วยส่วนกลับแทนที่จะมีตัวดำเนินการหาร ใช่ฉันรู้ว่ามันเป็นเรื่องตลก
Orbling

4

การหยุดเธรดจากเธรดอื่น

ใน Java และในภาษาอื่นคุณสามารถหยุดเธรดจากอีกอันหนึ่งโดยไม่มีการให้เวลาสำหรับเธรดที่คุณหยุดให้เสร็จสิ้นอย่างถูกต้อง ความสามารถนี้ถูกคัดค้านโดยพิจารณาจากปัญหาจำนวนมากที่สามารถนำมาใช้ในเกือบทุกสถานการณ์


แม้ว่าฉันคิดว่าสิ่งนี้อาจเป็นอันตราย แต่ก็มีบางครั้งที่มีประโยชน์อย่างมาก (เช่นโปรแกรมดีบั๊กที่สนับสนุนการก้าวและจุดพักเดี่ยว)
Jerry Coffin

1
@Jerry Debugging เป็นอีกสิ่งหนึ่งทั้งหมดมันไม่หยุดกระบวนการ แต่หยุดไว้ชั่วคราว
HoLyVieR

ตรงกันข้ามมันจะหยุดเธรด เห็นได้ชัดว่าคุณกำลังพูดถึงการฆ่าเธรดไม่เพียง แต่หยุดมัน ที่เป็นบิตยากที่จะปรับ ...
เจอร์รี่โลงศพ

ฉันไม่เห็นว่านี่เป็นคุณสมบัติภาษา แต่อย่างใด เป็นสิ่งที่ห้องสมุดมาตรฐาน
Jason Baker

4

ตัวแปรตัวแปรใน PHP

เพียงเพราะคุณ$canไม่ได้หมายความว่าคุณ$$should


1
ตามปกติแล้ว Perl ... มีคุณสมบัติ (อาจเป็นอันตราย) มีวิธีปฏิบัติที่ดีที่สุดในการปิด ( use strict) และวิธีที่ง่ายในการเปิดใช้อีกครั้งในกรณีที่คุณต้องการ ( no strict 'refs')

1
ฉันไม่เคยพบการใช้งานเพื่อให้มีชื่อตัวแปรแบบไดนามิก และครั้งเดียวที่ฉันทำมันทำให้รหัสไม่สามารถอ่านได้และช่วงเวลา WTF ไม่กี่เดือนต่อมาเมื่อฉันกลับมาเยี่ยมชมรหัส
TheLQ

Mmm แอปพลิเคชันรวม metaprogramming กับตัวแปรแพ็กเกจที่น่ารังเกียจของผู้อื่นหรือตารางสัญลักษณ์ (ซึ่งแตกต่างกันเล็กน้อยฉันคิดว่า)

1
@ โจฉันจะท้าทายให้คุณแสดงตัวอย่างหนึ่งที่ตัวแปรตัวแปรทำให้การแก้ปัญหาชัดเจนขึ้น
Kendall Hopkins

1
ความคิดเห็นที่ถูกหมายเป็นเรื่องตลกขอโทษผมไม่ได้ให้ชัดเจน แต่เนื่องจากคุณถามนี่คือตัวอย่างที่ดีที่สุดที่ตัวแปรตัวแปรทำให้การแก้ปัญหาชัดเจน ฉันจะยอมรับว่ามันเป็นตัวอย่างที่ไม่ดีเลย
Joe D

3

Withคำสั่งใน Delphi มาถึงใจแม้ว่าจะมีกรณีที่มันเป็นประโยชน์


กรณีที่ดีเมื่อฉันย้ายบางสิ่งบางอย่างจาก Delphi ไปยัง Lazarus และลูกหลาน TControl ของฉันมี "with Canvas do ... Width, Height" อ้างอิงขนาดการควบคุม แต่ Lazarus TCanvas มีความกว้างและ Delphi ของตัวเองดังนั้นสิ่งนี้นำไปสู่การรวบรวมรหัสผิด
Maksee

3

อาร์เรย์ใน AWK เริ่มต้นที่ดัชนี1 !


2
อาร์เรย์ใน C และ C ++ เริ่มต้นที่ดัชนี 0!
David Thornley

4
อาร์เรย์ในเสียงกระเพื่อมเริ่มต้นที่ดัชนีcar! : P
Joe D

ใน Lua เช่นกัน - ยกโทษให้ไม่ได้!
Tobu

2

ใน Perl บริบทสเกลาร์กับบริบทรายการอาจเป็นเรื่องยุ่งยาก มีจุดดีที่ทำให้การดำเนินการบางอย่างสะดวก แต่บางครั้งคุณพบสิ่งที่แย่มากเช่นการเปลี่ยนความหมายของผู้ปฏิบัติงานอย่างสมบูรณ์ (อาจอยู่ในระยะห่างที่สำคัญในรหัส)

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)

นั่นไม่ถูกต้อง

(มันเกิดขึ้นจากการพยายามทำบางสิ่งบางอย่างที่ทำหน้าที่คล้ายกับโอเปอเรเตอร์ช่วงปกติดังนั้นคุณสามารถพูดอะไรซักอย่างในวงวนได้next if /start_regex/ .. /end_regex/)


ผู้ชายที่มีเพื่อให้เกิดความสับสน สิ่งที่แย่ที่สุดเกี่ยวกับการเรียนรู้ Perl ก็คือการพยายามทำให้ฉันเข้าใจ
glenatron

ฉันคิดเสมอว่าสิ่งใดที่ช่วยให้ฟังก์ชั่นการกลับมาได้หลายวิธีคือความสะดวกสบายที่สะดวกสบาย
Orbling

2

Python 2.x ไวยากรณ์การนำเข้าแบบสัมพัทธ์ สมมติว่าฉันมีแพคเกจx.pluginsที่เพิ่มการสนับสนุนสำหรับห้องสมุดอื่น ๆ xอีกมากมายสำหรับ และคิดว่าฉันมีsqlalchemyโมดูลในเพื่อให้สามารถเพิ่มการสนับสนุนเพื่อx.plugins sqlalchemy xคุณคิดว่าจะเกิดอะไรขึ้นถ้าฉันเพิ่มบรรทัดต่อไปนี้ใน sqlalchemy.py

import sqlalchemy

คำตอบคือโมดูลจะพยายามนำเข้าเอง สิ่งที่ไวยากรณ์นี้ทำคือทำให้ไม่สามารถนำเข้าแพคเกจ sqlalchemy ส่วนกลางที่แท้จริงได้ Python 2.5 เพิ่มวิธีการระบุว่านี่คือการนำเข้าแบบสัมพัทธ์:

from . import sqlalchemy

... แต่มันไม่ได้จนกว่า Python 3 ที่ไวยากรณ์แรกจะได้รับการกำจัด (แม้ว่าจะสามารถปิดการใช้งานใน Python 2.6+ ด้วยfrom __future__ import absolute_import)


1

sun.misc.unsafeเป็นรายการโปรดของฉันตลอดกาล ; คอลเลกชันของ "เราต้องการสิ่งนี้เพื่อดำเนินการต่างๆ แต่จริงๆแล้วไม่คิดว่าคุณควรใช้มัน"


7
ภาษาที่ดีทุกภาษาควรมีแพ็คเกจที่ไม่ปลอดภัยในไลบรารีมาตรฐาน การนำเข้าแพคเกจนี้แสดงให้เห็นอย่างชัดเจนถึงเจตนาของคุณในการทำสิ่งที่ไม่สามารถส่งได้ในระดับต่ำ ทางเลือกคือ: 1-มีคุณสมบัติที่ไม่ปลอดภัยในภาษานั้น (เช่น C ++) และ2 -ต้องใช้ภาษาอื่นเช่น C สำหรับทำสิ่งระดับต่ำ (Python และ Ruby เป็นต้น) วิธีแพคเกจที่ไม่ปลอดภัยดูเหมือนจะดีกว่าสำหรับฉัน
imgx64

1

บล็อกทั่วไปของ FORTRAN หากคุณทำผิดพลาดง่าย ๆ ส่วนหนึ่งของแอปพลิเคชั่นอาจปิดบังส่วนโค้งของอีกส่วนหนึ่งได้

FORTRAN ได้รับคำสั่ง goto / COBOL แก้ไขคำสั่ง รหัสแก้ไขตัวเอง อันตรายเตือนสัตว์ประหลาดปาเก็ตตี้ที่บินได้ !!


FORTRAN ไม่มีคำสั่ง ALTER FORTRAN มีคำสั่ง ASSIGN พร้อมกับ GOTO ที่ได้รับมอบหมาย COBOL มีคำสั่ง ALTER ซึ่งทำหน้าที่คล้ายกัน
John R. Strohm

@John - ขอบคุณ ความทรงจำในการมอบหมาย / แก้ไขของฉันสลัว ... ไม่น้อยเพราะฉันถูกสอนให้ไม่ใช้มัน
สตีเฟ่นซี

1

การวางแนววัตถุ (จากภาษาที่พิมพ์แบบคงที่ทั้งหมด) ฉันจะเดิมพันคุณลักษณะนี้ได้และจะยังคงที่จะเสียค่าใช้จ่ายอย่างมากมายมากกว่าตัวชี้ null การวางแนววัตถุทำได้ดีในภาษาที่ส่งผ่านข้อความแบบไดนามิกเท่านั้น ดังนั้นควรลบออกจากภาษาแบบไดนามิกเช่น Python ด้วย (เนื่องจากไม่ได้ใช้การส่งข้อความ แต่เป็นการเรียกรูทีนย่อยทั่วไป)


Python สนับสนุน (สำหรับเจตนาและวัตถุประสงค์ทั้งหมด) ข้อความของ smalltalk ที่ส่งผ่านสำนวน มันไม่ได้ตั้งชื่ออย่างนั้น ประการที่สองฉันคิดว่าอย่างน้อยก็เป็นที่ถกเถียงกันว่าการเรียกภาษาที่แพร่หลายนี้เป็นอันตราย
Jason Baker

การวางแนววัตถุยังช่วยปรับปรุงการใช้รหัสซ้ำและการห่อหุ้มรหัส / ข้อมูล ไม่คำนึงถึงการใช้งานสแตติก / ไดนามิกของคุณลักษณะ
Orbling

@Orbling: เปรียบเทียบกับอะไร ในความคิดของฉันภาษาการเขียนโปรแกรมการทำงานมีการใช้รหัสที่สูงขึ้นและฉันคิดว่าระบบโมดูลของ Haskell นั้นค่อนข้างดีสำหรับการห่อหุ้มรหัส / ข้อมูล
LennyProgrammers

@ Lenny222 เปรียบเทียบกับการเขียนโปรแกรมที่จำเป็นมาตรฐาน ฉันก็ชอบวิธีการทำงาน Haskell เป็นภาษาที่ฉันต้องการ
Orbling

@ Jason Baker: แน่นอนว่ามันเป็นที่ถกเถียงกันอยู่ แต่การแพร่หลายไปทั่วนั้นเป็นสิ่งที่ทำให้มันอันตรายมาก! OP ขอความคิดเห็นของฉันและฉันให้มัน เพียงเพราะพวง Lemmings กระโดดหน้าผาไม่ได้ทำให้พฤติกรรมมีสติ ในกรณีนี้ OOP ได้รับการพิสูจน์ทางคณิตศาสตร์แล้วใช้งานไม่ได้และกระบวนทัศน์ที่ถูกต้องได้รับการยอมรับเป็นอย่างดี: หมวดหมู่ทฤษฎีเป็นวิธีที่แสดงถึง abstractions (อันที่จริงแล้วเป็นทฤษฎีของ abstractions)
Yttrill

1

magic_quotesใน PHP

นักพัฒนาที่ไม่มีประสบการณ์ก็ขึ้นอยู่กับว่ามันถูกเปิดใช้งานและจะถือว่าอินพุตของผู้ใช้ทั้งหมดถูกหลบหนีเพื่อใช้ในแบบสอบถาม SQL หรือพึ่งพามันถูกปิดการใช้งานและจะหนีจากอินพุตของพวกเขา

เมื่อสมมติว่าเปิดใช้งานอยู่แล้วเรียกใช้รหัสบนระบบที่ไม่เปิดช่องโหว่การฉีด SQL ที่กว้าง

เมื่อสมมติว่ามันถูกปิดการใช้งานและไม่ใช่มันจะส่งผลให้แบ็กสแลชถูกจัดเก็บจริงในฐานข้อมูลทำให้เกิดสตริงที่น่าเกลียด / ไม่ถูกต้อง

นอกจากนี้ยังไม่มีวิธีที่ง่ายที่สุดในการจัดการกับทั้งสองกรณี - คุณต้องตรวจสอบว่ามีการเปิดใช้งานหรือไม่get_magic_quotes_gpc()และใช้stripslashes()กับค่าทั้งหมดใน$_*อาร์เรย์ - เนื่องจากarray_mapไม่เรียกซ้ำคุณต้องมีฟังก์ชันที่กำหนดเองสำหรับสิ่งนี้


หรือคุณสามารถใช้การค้นหาแบบกำหนดพารามิเตอร์
Pieter B

แม้ว่าคุณจะได้รับแบ็กสแลชหากเปิดใช้งานอัญประกาศเวทมนต์และคุณไม่คาดคิด
ThiefMaster

-3

คุณสมบัติภาษาที่อนุญาตให้โปรแกรมเมอร์เขียนโค้ดที่ไม่มีข้อคิดเห็นหรือไม่มีความคิดเห็น


1
และจะแก้ไขได้อย่างไร?
Maniero

1
@bigown: โดยการใช้คุณสมบัติ comment-or-die: D
tia

3
เรียกว่าการเขียนโปรแกรมวรรณกรรม en.wikipedia.org/wiki/Literate_programming
Barry Brown

2
นั่นไม่ใช่คุณสมบัติ แต่เป็นข้อบกพร่องที่โด่งดังอย่างมากในส่วนหน้าของผู้ใช้คนส่วนใหญ่รู้จักโดยใช้ชื่อละติน: Homo Sapiens
Joe D

-3

ออกไปข้างนอกนิดหน่อยที่นี่ - ฟังก์ชั่นโมฆะ ฟังก์ชั่นมักจะทำอะไรบางอย่างดังนั้นจึงควรส่งคืนผลลัพธ์หรือข้อมูลอื่น ๆ ที่เกี่ยวข้องกับความสำเร็จหรือความล้มเหลว


3
ปาสคาลมีขั้นตอน (ไม่มีค่าตอบแทน) เช่นเดียวกับฟังก์ชั่น (ค่าตอบแทน)
Jon Onstott

ฟังก์ชั่นมักจะทำอะไรบางอย่าง(โดยปกติแล้วตัวยึดตำแหน่งจะทำหน้าที่ใครก็ได้)แต่บ่อยครั้งที่ไม่จำเป็นต้องบอกใครเกี่ยวกับมัน
Orbling

-4

POKE ในภาษาเบสิก


7
POKE ยอดเยี่ยม
Shog9

2
ในวันแรกที่โผล่เป็นวิธีที่เหมาะสมเท่านั้นที่คุณสามารถบรรลุสิ่งบางอย่างในขั้นพื้นฐาน เพลงบน Apple] [นึกถึง ...
บิล

2
คุณไม่สามารถทำอะไรได้มากหากปราศจาก POKE ใน Commodore 64 ถ้าฉันจำได้ถูกต้อง
MetalMikester

1
อย่าลืม PEEK ทั้งที่จำเป็น
Orbling

-5

ฉันต้องบอกว่าเก็บขยะ ไม่ได้ขจัดความจำเป็นในการคิดเกี่ยวกับการจัดการหน่วยความจำ แต่กำจัดการรับรู้ถึงความจำเป็นในการคิดเกี่ยวกับการจัดการหน่วยความจำซึ่งทั้งหมดมักจะกำจัดความคิดที่เกิดขึ้นจริงแล้วคุณจะได้รับทรัพยากรมหาศาลและไม่รู้ว่าทำไม โดยเฉพาะอย่างยิ่งเมื่อพฤติกรรมของ GC generational สมัยใหม่สามารถอธิบายได้โดยไม่ต้องมีอติพจน์มากเกินไปในฐานะ "หน่วยความจำขนาดใหญ่หนึ่งรั่วไหลโดยการออกแบบ" อย่างไรก็ตาม


2
หากคุณมีข้อมูลอ้างอิงอยู่ในคอลเล็กชันบางแห่งคุณมีปัญหาอื่น
Chinmay Kanchi

2
นั่นเป็นเหตุผลที่ภาษา gc'ed มีการอ้างอิงที่อ่อนแอ :)
Chinmay Kanchi

4
ในขณะที่ GC มีทั้งจุดแข็งและจุดอ่อนแน่นอนฉันต้องบอกว่าเมสันนั้นถูกต้องมากกว่าผิดในเรื่องนี้ ในความเป็นจริงผมเคยเห็นคนใช้ GC ใช้จ่ายจำนวนมากเป็นพิเศษเวลาในการจัดการหน่วยความจำเพราะพวกเขาลงเอยด้วยการพยายามตัดสิ่งที่ตามความเป็นจริงแทนการวางแผนสำหรับมันขึ้นด้านหน้า โดยทั่วไป GC ยังป้องกันการทำลายล้างที่กำหนดไว้ล่วงหน้าซึ่งนำไปสู่การทำงานพิเศษเกี่ยวกับการจัดการทรัพยากรทั้งหมดนอกเหนือจากหน่วยความจำ
Jerry Coffin

3
@ChaosPandion: ฉันเป็นคนโง่จริงหรือเปล่าถ้าฉันคิดว่าในเครื่องมัลติทาสกิ้งที่ทันสมัยเพื่อที่จะป้องกันไม่ให้เพจจิ้งหลุดจากประสิทธิภาพของระบบคุณควรปล่อยหน่วยความจำโดยเร็วที่สุด? GC ไม่เคยมีใครเข้ามาใกล้เพื่อให้บรรลุผลดังกล่าวและในความเป็นจริงแล้วตัวเก็บขยะทั่วไปซึ่งควรจะเป็นสิ่งที่ดีที่สุดและทันสมัยที่สุดมีอยู่ตรงข้ามกัน: เพื่อประสิทธิภาพที่ดีที่สุด หน่วยความจำให้ช้าที่สุด ฉันไม่เห็นว่าเป็นเครื่องมือที่เหมาะสมสำหรับงานใด ๆ ไม่ใช่เมื่อมันทำให้โปรแกรมอื่น ๆ ของฉันช้าลง ฉันเป็นคนโง่ใช่มั้ย
Mason Wheeler

2
@Barry: มันกำหนดภายในโปรแกรม หากฉันใช้หน่วยความจำ 5 KB แล้วขออีก 5 KB หลังจากนั้นไม่นานจะเกิดอะไรขึ้น ในระบบที่รวบรวมขยะจำเป็นต้องขอบล็อก 5 KB ใหม่แม้ว่าจะมีบล็อกที่ดีอย่างสมบูรณ์ที่ไม่ได้ใช้งานเว้นแต่ว่า GC จะทำงานในระหว่างกาลซึ่งในกรณีนี้คุณสามารถรีไซเคิลบล็อกเก่าได้ ด้วย malloc และฟรีคุณจะสามารถรีไซเคิลบล็อกเก่าได้เสมอ ทวีคูณนี้สองสามแสนและกลายเป็นปัญหาจริง
Mason Wheeler

-5

C และ C ++ แน่นอน: ตัวชี้ทางคณิตศาสตร์ การอนุญาตให้บุคคลแปลงจำนวนเต็มเป็นที่อยู่หน่วยความจำกำลังถามถึงปัญหา

และบางทีแม้แต่การเข้าถึงตัวชี้ไปยังดิบอย่างสมบูรณ์?

ใน C ++ คุณมีการอ้างอิงที่ทำให้ตัวชี้เกือบไม่จำเป็นทั้งหมด สำหรับกรณีที่เหลือตัวชี้สมาร์ทควรได้รับการพิจารณาบังคับ

Java ยังพิสูจน์ให้เห็นว่าคุณสามารถสร้างภาษาการเขียนโปรแกรมที่ใช้ตัวชี้โดยไม่อนุญาตให้ผู้ใช้เข้าถึงค่าตัวชี้ได้

นอกเหนือจากnull... แต่นั่นเป็นเรื่องที่แตกต่าง


5
พอยน์เตอร์ในขณะที่ใช้งานได้ยากในบางครั้งมีความจำเป็นอย่างยิ่งสำหรับการดำเนินงานของหน่วยความจำที่มีประสิทธิภาพจำนวนมาก
บิล

1
จริง แต่การอนุญาตให้ผู้ใช้แปลงจำนวนเต็มเป็นการอ้างอิงหน่วยความจำเป็นประจำหรือการเพิ่มตัวเลขไปยังที่อยู่หน่วยความจำมักเป็นอันตรายในวันนี้ ใน C ++ คุณมีการอ้างอิงว่าเป็นทางเลือกที่ดีอย่างสมบูรณ์และพอยน์เตอร์พอยน์เตอร์ / พอยน์เตอร์อัจฉริยะอัตโนมัติเมื่อคุณต้องการให้มันเป็นพอยน์เตอร์
Asgeir S. Nilsen

4
คำตอบนี้ใช้ได้เฉพาะเมื่อคุณทำงานกับซอฟต์แวร์สแต็คที่สร้างขึ้นเพื่อซ่อนพอยน์เตอร์ ในทุกกรณีอื่น ๆ คำตอบนี้เป็นสิ่งที่ผิด
พอลนาธาน

3
ภาษาการเขียนโปรแกรมบางภาษาจำเป็นต้องมีพอยน์เตอร์เพื่อให้คุณสามารถเขียนระบบปฏิบัติการและเครื่องเสมือนทั้งหมดสำหรับภาษาการเขียนโปรแกรมอื่น

2
-1 มีเหตุผลที่คุณต้องการเลขคณิตของ PTR: การวนซ้ำจุดเร็วกว่าการทำดัชนี จะช้ากว่าfor(int i=0;i<SIZE;++i) ++arr[i] for(int*i=arr;i<arr+SIZE;++i)*i++java ทั้งหมดที่มีการจัดการเพื่อพิสูจน์ว่าคุณต้องการตัวชี้หรือคุณไม่เคยดูsun.misc.Unsafe? หากคุณไม่ต้องการตัวชี้โปรดอธิบายวิธีเขียนฟังก์ชันการแลกเปลี่ยนทั่วไปโดยใช้ Java (เช่น int a = 1, b = 2; swap (a, b); ยืนยัน (a == 2 && b == 1);) ไม่พูดถึงปัญหาทั้งหมดใน c / c ++ คุณจะมีถ้าคุณได้ใช้การอ้างอิง คุณจะเรียกใช้ฟังก์ชันเสมือนบนตัวชี้ทึบแสงแบบไม่มีตัวชี้ได้อย่างไร
KitsuneYMG
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.