Gì? Không có lỗi? [đóng cửa]


197

Nhiệm vụ của bạn rất đơn giản. Viết chương trình rõ ràng sẽ tạo ra lỗi ngay từ cái nhìn đầu tiên khi được biên dịch hoặc chạy, nhưng không hoặc không tạo ra một số lỗi không liên quan khác. Đây là một cuộc thi phổ biến, vì vậy hãy sáng tạo.


11
hmmmm .... cái này là một lời trêu ghẹo não +1
Tim Seguine

1
Ước gì tôi có thể tìm thấy nó ... có một ví dụ PL / I cũ bao gồm một câu lệnh dọc theo dòng "if if if then then then then other other other = if then other ..." (PL / Tôi cho phép sử dụng từ khóa của nó là tên biến và có biểu thức điều kiện tương tự như C ?: cũng sử dụng từ khóa if / then /
other

8
Tôi đề nghị toàn bộ ngôn ngữ brainfuck, bởi vì mã BF trông giống như nó sẽ không được biên dịch.
Agi Hammerthief

@NigelNquande chỉ khi bạn không quen thuộc với nó ...;)
Jwosty

Câu trả lời:


281

C ++

Đảm bảo rằng bạn biên dịch mã sau trong chế độ tuân thủ tiêu chuẩn (ví dụ: đối với g ++, hãy sử dụng cờ -ansi):

int main()
{
  // why doesn't the following line give a type mismatch error??/
  return "success!";
}

Làm thế nào nó hoạt động:

?? / là một chuỗi ba chữ được dịch thành dấu gạch chéo ngược thoát khỏi dòng mới sau đây, vì vậy dòng tiếp theo vẫn là một phần của nhận xét và do đó sẽ không tạo ra lỗi cú pháp. Lưu ý rằng trong C ++, bỏ qua trả về mainđược xác định rõ và tương đương với trả về 0, biểu thị một lần chạy thành công.


7
Tôi cảm thấy như câu trả lời đầu tiên chỉ cần insta-won này ngay lập tức.
tạm

1
Nó cũng có giá trị trong C99.
R ..

1
có những cảnh báo với
-Wall

2
@ BЈовић Tường luôn ném cảnh báo về mọi thứ
Kiwy

4
@Kiwy Nó chỉ ném cảnh báo cho mã rác như trên. -Wall không đưa ra cảnh báo cho tất cả mọi thứ.
BЈовић

86

Hồng ngọc

Luôn luôn là một fan hâm mộ của điều này.

x = x

Không NameError. x tại là nil.

Đây chỉ là một "tính năng" của Ruby :-)

Đây là một thứ trần tục hơn mà tôi đã nhận được trước đây:

x = 42

if x < 0
  raise Exception, "no negatives please"
elseif x == 42
  raise Exception, "ah! the meaning of life"
else  
  p 'nothing to see here...'
end 

In "không có gì để xem ở đây."

elsif , không elseif . (và nó chắc chắn không elif - khốn cho các lập trình viên python bướng bỉnh (tôi)!) Vì vậy, để người phiên dịch elseif trông giống như một cuộc gọi phương pháp thông thường, và vì chúng ta không nhập x <0 khối, chúng tôi đi thẳng vào khác và đừng đưa ra một ngoại lệ. Lỗi này là vô cùng rõ ràng trong bất kỳ môi trường làm nổi bật cú pháp, rất may (?) Golf code không phải là một môi trường như vậy.


5
Bạn đã cho tôi. Tôi đã thực hiện cả Python và Lua trước đây và bây giờ bắt đầu trên Ruby. Lua dùng cái đó.
Đi xe đạp

7
Ý nghĩa của vũ trụ là gì để xem?
dùng80551


77

C?

Mã khá bình thường ở đây ...

void main() = main--;

Đó là Haskell, không phải C. Nó định nghĩa một hàm có tên là "void" có hai đối số. Cái đầu tiên được đặt tên là "chính" và nếu cái thứ hai (chưa được đặt tên) là một tuple trống, nó sẽ trả về biến "chính". "-" bắt đầu nhận xét bằng Haskell, vì vậy dấu ";" được bình luận ra.


21
Nói cách khác, đó là gian lận?
Ông Lister

75
Gian lận là bình thường trong các cuộc thi thách thức mã. Chúng tôi gọi đó là sự sáng tạo. : P
Joe Z.

31
Tôi sẽ gọi đây là gian lận, không phải sáng tạo. Bạn phải xác định môi trường bạn đang chạy trước khi bạn có thể xem xét liệu một số mã có bị lỗi hay không. Nếu không, tôi chỉ có thể cung cấp cho bạn tiếng ồn dòng là Malbolge và hỏi bạn nếu nó biên dịch.
Tim S.

5
Nó chỉ được cho là khiến bạn dừng lại một giây và đi 'hey bạn có thể làm điều đó không?' :)
intx13

10
@JoeZ. Nó có thể trông giống như perl trong một số trường hợp.
dùng80551

72

JavaScript

var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');

Đây là cách nó hoạt động:

Đầu tiên athực sự là một а(nghĩa là Unicode Cryllic "a").


8
Thủ thuật này có thể được áp dụng cho bất kỳ ngôn ngữ nào chấp nhận mã thông báo Unicode (ví dụ: Java, C #).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, được minh họa bằng tên người dùng của bạn
TheDoctor

9
giải pháp quá rõ ràng
thepirat000

6
quá rõ ràng cho bất cứ ai đi qua nó trước đây. Tôi chắc chắn có rất nhiều người mới và cái gọi là "chuyên gia web" có thể gặp phải vấn đề này.
Thebluefish

42
Rõ ràng? Vì vậy, bạn luôn luôn nhìn vào tên biến của mình thông qua số Unicode của chúng thay vì trông chúng như thế nào? Bạn có thể nhận thấy nó nếu bạn tìm kiếm "a" (hoặc "а"?) Và không tìm thấy những gì bạn mong đợi, nhưng khi chỉ cần đọc, bạn không thể nhìn thấy nó (ít nhất là trong phông chữ được hiển thị ở đây).
Tim S.

70

JavaScript

Khi tôi đang cung cấp mã sau đây, tôi đã nói nhiều lần "Nó phải là một lỗi đánh máy! Làm thế nào nó có thể hoạt động?" .

console.log( 42..toString(2) );

Mô tả dưới đây được sao chép chính xác từ một trong những trường hợp gần đây .

Như bạn có thể biết, trong JavaScript mọi thứ trừ chữ đều là một đối tượng. Số là đối tượng là tốt. Vì vậy, về mặt lý thuyết (và thực tế), bạn có thể nhận được các thuộc tính hoặc gọi các phương thức của bất kỳ chữ nào thông qua ký hiệu dấu chấm, như bạn làm 'string'.lengthhoặc [1,2,3].pop(). Trong trường hợp số bạn có thể làm tương tự nhưng bạn nên nhớ rằng sau một dấu chấm duy nhất, trình phân tích cú pháp sẽ tìm một phần phân số của số có giá trị float (như trong 123.45). Nếu bạn sử dụng một số nguyên, bạn nên "thông báo" cho trình phân tích cú pháp rằng một phần phân số trống, đặt dấu chấm phụ trước khi xử lý thuộc tính : 123..method().


18
Là một chàng trai lua, tôi đã mong đợi422
mniip

3
Không thấy cách sử dụng này trước đây, rất gọn gàng.
Nit

5
Cảm thấy tồi tệ vì đã hoàn toàn quen với ..ký hiệu này, nhưng hoàn toàn không biết gì về .toString(a freaking argument here?)ký hiệu: P Oh tốt, đã tìm ra nó ngay bây giờ :)
David Mulder

Sản lượng này là gì? Và tại sao ? Tôi tò mò.
Nicolas Barbulesco

3
Đối với người lười biếng, đối số chỉ định cơ sở (vì vậy điều này sẽ in 42 ở dạng nhị phân) và hoàn toàn không quan trọng đối với mã này. ..là phần khó hiểu.
Kat

63

bash

#!/bin/bash

[ 1 < 2 ] && exit

for i in `seq 1 $[2 ** 64]`
    do "$0" | "$0"
done

while [[ false ]]
    do :
done

if maybe
    do [: [: [: [: [; [; [; [; ;] ;] ;] ;] :] :] :] :]
fi

Các kết quả

  • Bạn có thể mong đợi tập lệnh không tạo ra bất kỳ lỗi nào, vì nó thoát ra sau lệnh đầu tiên. Nó không.

  • Bạn có thể mong đợi các thông báo lỗi điển hình gây ra bởi một quả bom ngã ba đang diễn ra do forvòng lặp. Không có bom ngã ba.

  • Bạn có thể mong đợi bash phàn nàn về maybelệnh bị thiếu hoặc toàn bộ lỗi cú pháp bên trong ifkhối. Nó sẽ không.

  • Thông báo lỗi duy nhất mà tập lệnh có thể tạo ra kết thúc bằng 2: No such file or directory.

Giải trình

  • [không đặc biệt đối với bash, do đó < 2, thực hiện, như thường lệ, chuyển hướng. Trừ khi có một tệp có tên 2trong thư mục hiện tại, điều này sẽ gây ra lỗi.

  • Do lỗi đó ở trên, lệnh trước &&sẽ có trạng thái thoát khác không và exitsẽ không được thực thi.

  • Các forvòng lặp không phải là vô hạn. Trong thực tế, không có vòng lặp nào cả. Vì bash không thể tính được lũy thừa thứ 64 của 2, kết quả của biểu thức số học là 0.

  • [[ false ]]kiểm tra nếu falselà một chuỗi null. Không phải vậy, nên whilevòng lặp này là vô hạn.

  • Do những điều trên, ifcâu lệnh không bao giờ được thực thi, do đó không có lỗi nào được phát hiện.


55

Perl

use strict;
use warnings;
Syntax error!
exit 0;

Nguồn và giải thích: https://stackoverflow.com/questions/11695110


137
Các chương trình Perl thường trông giống như lỗi.
ugoren

1
@ugoren Chỉ khi được viết và đọc bởi những người có ít kiến ​​thức về Perl.
TLP

8
Bạn phải thích rằng bình luận của @ ugoren có số lần nâng cao gấp đôi so với câu trả lời :)
yo '

2
Nhắc nhở tôi về thủ thuật Windows shell, "Nếu bạn hài lòng và bạn biết điều đó, Lỗi cú pháp!"
Jwosty

47

Java

class Gotcha {
    public static void main(String... args) {
        try  {
            main();
        } finally {
            main();
        }
    }
}

Không có chồng tràn ở đây; di chuyển dọc.

Thoạt nhìn, điều này sẽ tạo ra một StackOverflowError, nhưng nó không! Nó thực sự chỉ chạy mãi mãi (ít nhất là cho tất cả các mục đích thực tế; về mặt kỹ thuật, nó sẽ chấm dứt sau một thời gian nhiều đơn đặt hàng lớn hơn tuổi của vũ trụ). Nếu bạn muốn biết làm thế nào / tại sao điều này hoạt động, xem điều này . Ngoài ra, nếu bạn tình cờ tự hỏi tại sao chúng ta có thể gọi main()mà không có đối số khi phương thức chính thường cần một String[]đối số: đó là vì chúng ta đã tuyên bố nó là đối số biến ở đây, điều này hoàn toàn hợp lệ.


3
Như câu hỏi bạn liên kết giải thích, nó không chạy vô thời hạn, mà thay vào đó trong một thời gian cực kỳ dài.
Kevin

1
@Kevin Chúng ta không được phạm tội không cần thiết ở đây; "dài hơn tuổi của vũ trụ", đối với tất cả các mục đích thực tế, "mãi mãi".
arshajii

8
Bạn nói "Không có ngăn xếp nào bị tràn ở đây", trong thực tế, hệ thống tiếp tục ném ngăn xếp tràn ra liên tục, và cuối cùng sẽ ném một ngoại lệ tràn ngăn xếp. (như bạn đề cập, cuối cùng có thể là một khoảng thời gian rất rất dài) Và, nó phụ thuộc vào độ sâu của ngăn xếp. Trên máy ảo nhỏ hơn hoặc hệ thống nhúng, độ sâu ngăn xếp có thể nhỏ hơn rất nhiều.
McKay

@McKay Câu nói đó rõ ràng là một dòng ném đơn thuần, không có nghĩa là được thực hiện theo nghĩa đen. OP yêu cầu một chương trình có vẻ như sẽ tạo ra lỗi, nhưng không được. Trong trường hợp chung, câu trả lời trên thỏa mãn yêu cầu này. Chắc chắn, chúng ta có thể tạo ra một tình huống mơ hồ trong trường hợp không, nhưng điều đó không làm mất hiệu lực câu trả lời. Tôi hy vọng rằng bạn sẽ xem xét lại downvote của bạn.
arshajii

3
@McKay Bằng cách này, cho rằng ngăn xếp kích thước nhỏ (ví dụ 100 như trái ngược với bình thường ~ 10.000), và chúng ta có thể vẫn làm 10.000.000 cuộc gọi mỗi giây. Sau đó, tổng thời gian hoạt động lên tới 4.019.693.684.133.147 năm - vẫn còn nhiều đơn đặt hàng lớn hơn tuổi của vũ trụ.
arshajii

42

Cà phê

What? No error? Yep, this code does not have any bugs, why would it?

?theo sau là khoảng trắng là toán tử gọi hàm, nhưng chỉ khi nó tồn tại. JavaScript không có hàm được gọi What, do đó hàm không được gọi và các đối số của nó đơn giản bị bỏ qua. Các từ khác trong mã là các lệnh gọi hàm thực sự không được gọi, vì Whathàm không tồn tại. Cuối cùng, ?là toán tử tồn tại, vì nó không được sử dụng trong chức năng gọi. Các kết thúc câu khác, chẳng hạn như .hoặc !sẽ không hoạt động, như .đối với các phương thức và !không phải là toán tử (không thể được sử dụng sau một mã định danh). Để đọc cách CoffeeScript chuyển đổi mã này thành JavaScript, hãy truy cập http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code%20does%20not%20have%20any%20bugs%2C % 20why% 20it% 20would% 3F .


36

VBScript

Các &nhà điều hành trong VBScript là chuỗi nối nhưng những gì trên trái đất là &&&&&các nhà khai thác? (Hãy nhớ rằng toán tử "và" trong VBScript là Andkhông &&.)

x = 10&987&&654&&&321

Đoạn chương trình đó là VBScript hợp pháp. Tại sao? Và giá trị của là xgì?

Các lexer phá vỡ điều này như x = 10 & 987 & &654& & &321. Một chữ nguyên bắt đầu bằng &, thật kỳ lạ, một chữ bát phân. Một số bát phân kết thúc bằng &, thậm chí kỳ lạ hơn, là một số nguyên dài. Vì vậy, giá trị của x là phép nối các giá trị thập phân của bốn số nguyên đó : 10987428209.


8
Đó chỉ là ... wow.
primo

27

Mục tiêu-C

Không phải là một vấn đề lớn, nhưng nó đã làm tôi ngạc nhiên khi cố gắng đặt một liên kết bên trong một bình luận:

http://www.google.com
        return 42;

http là nhãn mã ở đây, các nhãn như vậy được sử dụng trong hướng dẫn goto


8
Điều này sẽ làm việc trong bất kỳ ngôn ngữ giống như C hỗ trợ //bình luận.
Ilmari Karonen

Vâng, có lẽ, tôi chỉ không chắc chắn trong khi đăng bài
Piotr

14
Tuy nhiên, giới hạn một URL trên mỗi giao thức cho mỗi phạm vi.
Ben Voigt

1
Bạn vẫn có thể sử dụng https: // trong cùng phạm vi.
Florian F

25

C #

class Foo
{
    static void Main(string[] args)
    {
        Bar();
    }

    static IEnumerable<object> Bar()
    {
        throw new Exception("I am invincible!");
        yield break;
    }
}

Bởi vì Barphương thức thực hiện a yield, phương thức không thực sự chạy khi được gọi, nó trả về một liệt kê mà khi lặp lại, s sẽ chạy phương thức.


Cuối cùng ... Đây là FOO và BAR :)
VVK

1
Đó là những gì foo và bar dành cho;) tên của những thứ không thực sự quan trọng.
McKay

22

C

main=195;

Hoạt động trên nền tảng x86, trong đó 195 là opcode cho ret. Không lam gi cả,


Opcode cho ret là 195 chứ không phải 193, phải không?
Dennis

Không làm việc cho tôi. Tôi hy vọng điều này sẽ thực thi mã tại địa chỉ 195.
nwellnhof

Tbanks @Dennis, mã đã đúng, giải thích sai.
ugoren

3
Trên bất kỳ nền tảng nào (bao gồm x86 hiện đại ), nơi các trang có thể đọc được mà không thể thực thi được, điều này sẽ bị sập khi nhập mainmainđã được đặt trong phân đoạn dữ liệu, không thể thực thi được. Thật thú vị, const int main=195sẽ không sụp đổ (trên x86) (nhưng sẽ tạo ra trạng thái thoát rác) vì .rodatatheo mặc định được đặt trong cùng phân khúc .textvà do đó có thể thực thi được. ( const char main[]="1\300\303";sẽ thoát thành công! (vẫn trên x86))
zwol

2
Tôi đang sử dụng máy 64 bit (tôi không biết điều này có thay đổi gì không) và main = 195 đưa ra một segfault, nhưng const int main = 195; làm.
w4etwetewtwet

21

Java

Có lẽ là quá rõ ràng.

public static void main(String[] varargs) throws Exception{
    char a, b = (char)Integer.parseInt("000d",16);
    // Chars have \u000d as value, so they're equal
    if(a == b){
        throw new Exception("This should be thrown");
    }
}

Gì?

Ném một lỗi cú pháp sau \u000d. \u000dlà unicode cho một dòng mới. Mặc dù nó được nhận xét, trình biên dịch Java coi mã này là mã vì nó không được nhận xét nữa.


11
của bạn varargskhông phải là varargs;)
Navin

Câu hỏi là "mã có vẻ như thất bại nhưng không", không phải "mã có vẻ như bị lỗi, nhưng lại làm theo cách khác". Có lỗi cú pháp thay vì ngoại lệ vẫn là lỗi.
Nzall

19
Tôi nghĩ bạn nên đọc lại câu hỏi ban đầu: "hoặc tạo ra một số lỗi không liên quan khác."
Tom Verelst

Trên thực tế, không có \u000d, nó sẽ sử dụng một tham chiếu đến giá trị không xác định a.
LegionMammal978

19

C ++

#include <iostream>

int succ(int x)
{
  return x + 1;
}

int succ(double x)
{
  return int(x + 1.0);
}

int succ(int *p)
{
  return *p + 1;
}

int main()
{
  std::cout << succ(NULL) << '\n';
}

Tại sao?

NULLlà một hằng số intergal, vì vậy nó phù hợp với inttình trạng quá tải hoàn toàn tốt hơn so với int*một. Tuy nhiên, hầu hết các lập trình viên đã NULLliên kết với các con trỏ, do đó, có thể dự kiến ​​một con trỏ null null.


11
Rất may, C ++ 11 cho phép các triển khai xác định NULLnullptrvà các triển khai thực hiện điều đó (chưa có gì tôi biết, nhưng tôi thực sự mong đợi chúng) sẽ đưa ra lỗi phân đoạn dự kiến.
hvd

16

Con trăn

print """""quintuple-quoted strings!"""""

Hoàn toàn hợp lệ, nhưng đầu ra là khó đoán. 3 ký tự đầu tiên bắt đầu một chuỗi nhiều dòng và hai ký tự tiếp theo là một phần của chuỗi. Cuối cùng, ba ký tự đầu tiên chấm dứt chuỗi và hai ký tự cuối cùng là một chuỗi ký tự trống được trình phân tích cú pháp nối với chuỗi đa dòng .


20
Chỉ cần một phần thưởng : print """""""""Python strings don't have to start with the same number of quotes they end with.""""".
Konrad Borowski

15

JavaScript

if (1/0 === -1/0) {
  throw "Surely there's an error in here somewhere...";
}

Làm thế nào nó hoạt động:

Có vô cực tích cực và tiêu cực trong JS, và không có lỗi khi chia cho số không.


2
Bạn cũng có thể thực hiện một số thủ thuật với NaN ...
intx13

8
meh, điều này xảy ra trong bất kỳ ngôn ngữ với phao.
Navin

3
@Navin: trong bất kỳ ngôn ngữ nào có số float mà phép chia cho số 0 không gây ra lỗi.
nwk

2
@nwk Tiêu chuẩn IEEE cho phao nói rằng chia cho 0 phải là một inf. Tôi không biết bất kỳ ngôn ngữ nào thay đổi điều này.
Navin

1
IEEE 754 chỉ định hai mô hình: tín hiệu NaN / Inf (tăng ngoại lệ cho phép chia 0, căn bậc hai từ -1, tràn / tràn, v.v.) và không báo hiệu (xử lý NaN/ Infgiống như các giá trị đối số thông thường với toán học được xác định rõ về họ). Phần cứng FP hiện đại có thể được cấu hình để vận hành cả hai cách. Ngôn ngữ bất khả tri; xấu hổ không biết.
ulidtko

14

C ++

Việc trộn các chữ viết tay và lambdas không gian có thể khá khó hiểu và chắc chắn trông có vẻ không ổn đối với những người không biết về các bức thư:

int main()
{
    return??-??(??)()??<return"??/x00FF";??>()??(0??);
}

Làm thế nào nó hoạt động:

Một số trình tự bao gồm 3 ký hiệu, bắt đầu bằng ??, được gọi là các biểu tượng và sẽ được thay thế bằng một bộ tiền xử lý tuân thủ đầy đủ. Được xử lý trước, dòng trong câu hỏi trông như sau: return ~ [] () {return "\ x00FF"; } () [0]; Như mọi người có thể thấy, đây không là gì ngoài hàm lambda thừa, trả về một chuỗi bao gồm ký tự 0xFFth. Các [0] chỉ trích nhân vật đó và ~ nots nó, vì vậy 0 được trả về.


12
Chương trình C ++ hợp lệ int main(){(([](){})());}cũng có thể trông rất tuyệt khi được phân tích ...
Angew

1
Người đó thậm chí còn làm gì?
Joe Z.

1
@Joe Z [](){}là một hàm lambda, giống như [](int a){return a+1;}là một. ([](){})()gọi hàm đó, trả về voidnếu tôi không nhầm. Toàn bộ (([](){})());sau đó sôi lên (void);, đó là một tuyên bố không làm gì. mainsau đó chỉ trả về 0, giống như nó không có returncâu lệnh.
tomsmeding

13

VBA / VB6

Private Sub DivByZero()

    Dim x() As String
    x = Split(vbNullString, ",")

    Debug.Print 1 / UBound(x)

End Sub

Việc tách một chuỗi được phân cách bằng dấu phẩy trống sẽ tạo ra một mảng trống. Nên là một sự phân chia rõ ràng bởi lỗi không, phải không?

Không. Đáng ngạc nhiên, khi bất kỳ chuỗi có độ dài bằng 0 nào được phân chia, bộ thực thi cung cấp cho bạn một mảng có giới hạn dưới là 0 và giới hạn trên là -1. Đoạn mã trên sẽ xuất -1.


@minitech Trên thực tế, nếu bạn chuyển một mảng trống cho UBound, nó sẽ cung cấp cho bạn một Lỗi đăng ký ngoài phạm vi.
Comitern

… tốt. Tôi lấy lại cái đó. VBA = /
Ry-

1
@minitech Yep. Tôi hiểu đây là một lỗi trong quá trình triển khai ban đầu của Split trong VB6. Trong .NET, họ cố tình "thêm" (hoặc có thể là tài liệu là từ tốt hơn) hành vi cho các mảng trống trả về một UBound -1 để duy trì khả năng tương thích ngược với tất cả các mã VB6 đã lợi dụng vụ hack này. Tách chuỗi null là cách duy nhất để có được mảng này trong VBA / VB6 mà không cần các lệnh gọi API của Windows.
Comitern

12

Javascript

5..toString();
5 .toString();

Tặng: 5

Trong khi:

5.toString();

Cung cấp SyntaxError

Làm thế nào nó hoạt động:

JavaScript cố phân tích dấu chấm trên một số dưới dạng dấu phẩy động


13
Làm thế nào mà nó xảy ra rằng bạn đã đăng chính xác trường hợp tương tự như tôi đã làm một giờ sau tôi?
VisioN

1
Này Vision, xin lỗi nhưng tôi đã không kiểm tra câu trả lời của bạn. Tôi cũng đã thêm một trường hợp với không gian. Tôi đọc điều này một lần trên vườn javascript không có gì khác.
Sumeet Kashyap

1
Sumeet, đừng xin lỗi. Câu trả lời của bạn đẹp hơn - và rõ ràng hơn nhiều - so với câu trả lời của @VisioN.
Nicolas Barbulesco

12

HTML

Bài đăng đầu tiên ở đây, tôi không chắc tôi có nhận được điều này hay không, nhưng ở đây đi.

<html>
    <head></head>
    <body>
        <?php $_POST['non-existant'] = $idontexisteither ?>
    </body>
</html>

Đó là một .htmltập tin ...


9
Vì vậy, mẹo ở đây là nó sẽ không thực thi khối PHP vì tệp có .htmlphần mở rộng và máy chủ web của bạn không được cấu hình để phân tích .htmlcác tệp như PHP?
VisioN

5
Đúng. Đây có phải là gian lận? @VisioN
Albzi

2
Tôi khá chắc chắn rằng điều này là gian lận. Tại ít nhất hãy viết "HTML" in đậm ở đầu.
Navin

Đẹp ! :-) Thủ thuật làm việc với tôi.
Nicolas Barbulesco

1
Tôi đã chỉnh sửa để làm rõ ngôn ngữ này được viết bằng ngôn ngữ nào
vijrox

9

PHP (40 byte)

<?for(;;$e.=$e++)foreach($e::$e()as&$e);

Đây là câu trả lời tôi đưa ra trong câu hỏi này: Chương trình kiểm tra sự điên rồ

Ý tưởng là tạo ra một mã tạo ra lỗi.

Lỗi đầu tiên mà chúng ta sẽ nghĩ đến là lỗi cú pháp.

Không có lỗi cú pháp ...

Khác là lớp / hàm không tồn tại.

Nó không chạy xa đến thế ...

Khác sẽ là hết thời gian hoặc tràn bộ nhớ, nhưng, một lần nữa, nó không đạt đến mức đó ...

Kiểm tra mã ở đây: http://writecodeonline.com/php/ (xóa <?phần đầu để kiểm tra).


3
Đây là một cuộc thi phổ biến. Không cần phải nhồi nhét mã ur để lưu byte. Chỉ cần định dạng lại để dễ đọc hơn;)
Songo

Tôi sẽ thêm một phiên bản có thể đọc được sau. Tôi đã sử dụng cùng một câu trả lời chính xác và hoàn toàn không chỉnh sửa nó.
Ismael Miguel

foreach(e()as&$e);là cốt lõi của giải pháp này. e()chỉ để giữ cho trình kiểm tra cú pháp hoạt động và &$esau đó aslà nguyên nhân gây ra lỗi.
TheConstructor

Thật ra, mọi thứ đều đóng một vai trò quan trọng.
Ismael Miguel

9

VBScript

Người dùng Visual Basic 6 sẽ biết rằng

If Blah Then Foo Bar

là hợp pháp, như là

If Blah Then 
    Foo Bar
End If

Nhưng những gì về

If Blah Then Foo Bar End If

? Hóa ra đó là hợp pháp trong VBScript nhưng không phải trong VB6. Tại sao?

Đó là một lỗi trong trình phân tích cú pháp; ý định là để từ chối điều này. Mã phát hiện End Ifđược cho là cũng sẽ kiểm tra xem đó có phải là Ifcâu lệnh nhiều dòng hay không. Khi tôi cố gắng sửa nó và gửi bản beta với bản sửa lỗi, một tổ chức tin tức trong ngành có ảnh hưởng nhất định đã phát hiện ra rằng họ có dòng mã này trong một trong các chương trình VBScript của họ và nói rằng họ sẽ xếp hạng phiên bản mới trừ khi chúng tôi không Đã sửa lỗi, vì họ không muốn thay đổi mã nguồn.


Có bất lợi nào khi để lỗi không được sửa không, ngoài việc cho phép bạn viết mã VBS không hợp lệ trong VB6?
Gabe

1
@Gabe: Không, không có nhược điểm nào khác ngoài việc chuyển mã VBScript sang VB khó hơn.
Eric Lippert

1
Một cái tên ! Tổ chức tin tức này là ai?
Nicolas Barbulesco

9

C

Điều này nhắc nhở tôi về một lỗi tôi gặp phải khi tôi học C. Đáng buồn là biến thể ban đầu dường như không hoạt động với GCC hiện tại, nhưng lỗi này vẫn xảy ra:

#define ARR_SIZE 1234
int main() {
    int i = ARR_SIZE;
    int arr[ARR_SIZE];
    while(i >= 0) {
        (--i)[arr] = 0;
    }
    i = *(int*)0;
}

Điều này rõ ràng là segfaults bởi vì chúng tôi bỏ qua một con trỏ null, phải không?

Sai - thực ra, đó là một vòng lặp vô hạn vì điều kiện vòng lặp của chúng ta bị tắt bởi một. Do giảm tiền tố, ichạy từ 1023 đến -1. Điều này có nghĩa là việc gán ghi đè không chỉ tất cả các thành phần arr, mà cả vị trí bộ nhớ trực tiếp trước nó - điều này xảy ra là nơi iđược lưu trữ. Khi đạt tới -1, ighi đè lên chính nó 0và do đó điều kiện vòng lặp được đáp ứng lại ...

Đây là biến thể ban đầu mà tôi không thể tái tạo nữa:

Điều tương tự cũng hoạt động với việc iđi lên từ 0 và bị tắt bởi một. GCC mới nhất luôn lưu trữ itrước đó arrtrong bộ nhớ; cái này phải khác ở các phiên bản cũ hơn (có thể tùy theo thứ tự khai báo). Đó là một lỗi thực tế tôi tạo ra trong một trong những chương trình đồ chơi đầu tiên của tôi liên quan đến mảng.

Ngoài ra, điều này là hiển nhiên nếu bạn biết cách con trỏ hoạt động trong C, nhưng có thể gây ngạc nhiên nếu bạn không:

Bạn có thể nghĩ rằng bài tập (--i)[arr]đưa ra một lỗi, nhưng nó hợp lệ và tương đương với arr[--i]. Một biểu thức a[x]chỉ là đường cú pháp để *(a + x)tính toán và hủy bỏ con trỏ đến phần tử được lập chỉ mục; việc bổ sung tất nhiên là giao hoán và do đó tương đương với *(x + a).


1
Theo như tôi có thể thấy, thân vòng lặp không bao giờ được thực thi (vì 1234 <= 0 ước tính là sai). Bạn có thể có nghĩa là viết "> ="?
celtschk

1
@celtschk vâng, đó là một lỗi đánh máy. Cảm ơn đã chú ý!
l4mpi

Là căn chỉnh bộ nhớ này thực sự được chỉ định, hoặc chỉ thực hiện theo cách này trong một số trình biên dịch?
Paŭlo Ebermann

9

Java

public class WhatTheHeckException extends RuntimeException {
    private static double d;        // Uninitialized variable
    public static void main(String... args) {
        if (d/d==d/d) throw new WhatTheHeckException();
        // Well that should always be true right? == is reflexive!

        System.out.println("Nothing to see here...");
    }
}

Tại sao điều này hoạt động:

Các trường đơn vị có giá trị mặc định. Trong trường hợp này d chỉ là 0 . 0/0 = NaN trong phép chia kép và NaN không bao giờ bằng chính nó, do đó, nếu trả về false. Lưu ý rằng điều này sẽ không hoạt động nếu bạn có 0/0 == 0/0 , vì tại đó sẽ là số nguyên 0/0 chia sẽ NÊN ném một số học ngoại lệ .


8

C ++ 11

struct comp {
    comp operator compl () { return comp { }; }
    operator comp () { return comp { }; }
    compl comp () { return; comp { }; }
};

int main() {
    comp com;
    compl com;
}

Biên dịch và chạy mà không có bất kỳ cảnh báo với g++ -pedantic-errors -std=c++11.

compllà một cách viết thay thế tiêu chuẩn cho ~, giống như notlà một thay thế cho !. complđược sử dụng ở đây để ghi đè đầu tiên operator~và sau đó xác định hàm hủy. Một mẹo khác là operator compchức năng chuyển đổi từ loại compsang chính nó. Đáng ngạc nhiên là tiêu chuẩn không cấm chức năng chuyển đổi như vậy - nhưng nó nói rằng chức năng đó không bao giờ được sử dụng.


8

VBScript

function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")

'Output: :)

Những gì nó làm:

Tên hàm, tên phụ và biến trong VBScript có thể là bất cứ thứ gì nếu bạn sử dụng dấu ngoặc vuông. Kịch bản lệnh này tạo một hàm được gọi :(và một đối số "):"nhưng vì chúng không tuân theo quy ước đặt tên thông thường nên chúng được bao quanh bởi dấu ngoặc vuông. Giá trị trả về được đặt thành giá trị tham số. Một dấu hai chấm bổ sung được sử dụng để có được mọi thứ trên một dòng. Câu lệnh Msgbox nhận được tham chiếu đến hàm (nhưng không cần dấu ngoặc) và gọi nó bằng một nụ cười:) tham số là .


1
Rất nhiều khuôn mặt nhăn nhó :(
Joe Z.

8

C #

Thật ra tôi đã bắt gặp mình làm sai điều đó :)

public static object Crash(int i)
{
    if (i > 0)
        return i + 1;
    else
        return new ArgumentOutOfRangeException("i");
}

public static void Main()
{
    Crash(-1);
}

ném , không trở về .


Haha, chào mừng đến với trang web! Kudos cho sự dũng cảm của điều này như là một bài viết đầu tiên. :)
Jonathan Van Matre

7

Java

enum derp
{

    public static void main(String[] a)
    {
        System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
    }
}

Và cách thức hoạt động của nó:

Firs bạn nghĩ Enum không hợp lệ nhưng nó hợp lệ; sau đó bạn nghĩ rằng nó sẽ in một thuộc tính đối tượng Điểm tiêu chuẩn nhưng Gotcha! do cách Snakeyaml tuần tự hóa, bạn gặp phải lỗi StackOverFLow mượt mà

Và một số khác:

enum derp
{

    ;public static void main(String[] a)
    {
        main(a);
    }
    static int x = 1;

    static
    {
        System.exit(x);
    }
}

bạn nghĩ rằng một Stackoverflow sẽ xảy ra do sự đệ quy rõ ràng nhưng chương trình lạm dụng thực tế là khi bạn chạy nó, nó static{} blocksẽ được thực thi trước và do nó thoát ra trước khi tải main ()

enum derp
{

    ;
        public static void main(
            String[] a)
    {
        int aa=1;
        int ab=0x000d;
        //setting integer ab to \u000d  /*)
        ab=0;

        /*Error!*/
        aa/=ab;
    }
    static int x = 1;
}

cái này dựa vào /*Error*/mã được đặt ra đó làm điểm đóng cho nhận xét được mở trước ab = 0; phần giải thích về số nguyên ab đến 0x000d ẩn dòng mới để kích hoạt nhận xét của dòng tiếp theo


1
Tôi không thể ngay bây giờ, nhưng thật tuyệt nếu bạn định dạng lại cái này, nếu có thể. Hơi khó đọc một chút là ...: P
Jwosty

làm cho em rõ ràng hơn; và các thẻ spoiler được dự định gây ra các thủ thuật không rõ ràng lúc đầu
masterX244

2
Đợi đã, vậy cái đầu tiên trên thực tế có tạo ra lỗi không? Điều đó trái ngược với những gì câu hỏi đang hỏi. Và tại sao không chỉ System.exit (1) trong giây?
Đi xe đạp

3
Không có lập trình viên java nào mong đợi một ngăn xếp tràn trong đoạn mã thứ hai. Xin lỗi, đó là quá rõ ràng.
Tobias

1
Thói quen mã hóa @VVK để sử dụng enum{thay vì class{lưu một byte sau đó
masterX244

6

C

Chuỗi và mảng trong c có thể khá khó hiểu

main(){
  int i=0;
  char string[64]="Hello world;H%s";
  while(strlen(&i++[string])){
    i[' '+string]=string[i]-' ';
  }
  5[string]=44;
  return printf(string,'!'+string);
}

9
Thật khó để đọc, nhưng tôi không biết mọi người đang mong đợi điều gì từ lỗi này
Bryan Chen

3
Tôi chỉ muốn nhắc nhở mọi người về ký hiệu hợp lệ nhưng độc đáo - hãy làm cho nó những gì bạn muốn. Tôi chắc chắn sẽ xem xét ba lần trước khi nói điều này là hợp lệ. Trước hết, các biểu thức như 5 [chuỗi] không được biết đến đối với một lập trình viên thông thường và thách thức logic lập chỉ mục mảng. Thứ hai, '' + chuỗi trông giống như thêm 2 chuỗi, nhưng với loại trích dẫn sai. Và thứ ba, & i ++ trông giống như địa chỉ của một số nguyên (nhưng quyền ưu tiên sẽ quan tâm đến điều đó). Cuối cùng, chúng tôi đang viết vượt ra ngoài chuỗi ký tự (nhưng không vượt quá bộ đệm sao lưu lớn hơn).
orion

Có vẻ không tệ lắm. Tôi chỉ mã hóa một chút trong C ++, nhưng tôi có thể tìm ra điều này.
Navin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.