당신의 작업은 간단합니다. 컴파일하거나 실행할 때 언뜻보기에 오류가 발생하지만 관련되지 않은 다른 오류는 발생하지 않는 프로그램을 작성하십시오. 이것은 인기 콘테스트이므로 창의력을 발휘하십시오.
당신의 작업은 간단합니다. 컴파일하거나 실행할 때 언뜻보기에 오류가 발생하지만 관련되지 않은 다른 오류는 발생하지 않는 프로그램을 작성하십시오. 이것은 인기 콘테스트이므로 창의력을 발휘하십시오.
답변:
표준 준수 모드에서 다음 코드를 컴파일해야합니다 (예 : g ++의 경우 -ansi 플래그 사용).
int main()
{
// why doesn't the following line give a type mismatch error??/
return "success!";
}
작동 방식 :
?? /는 다음 줄 바꿈을 이스케이프하는 백 슬래시로 변환되는 삼중 시퀀스이므로 다음 줄은 여전히 주석의 일부이므로 구문 오류가 발생하지 않습니다. C ++에서 리턴을 생략하는
main
것은 잘 정의되어 있으며 0을 리턴하는 것과 동일하며 성공적인 실행을 나타냅니다.
항상이 팬입니다.
x = x
없음 NameError
. x는 이제 nil
입니다.
이것은 루비의 "기능"입니다 :-)
이전에 얻은 더 평범한 것이 있습니다.
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
"아무것도 볼 수 없습니다"를 인쇄합니다.
그건 ELSIF 하지 ELSEIF . (그리고하지 확실히의 ELIF 인터프리터에 그래서 - 제멋대로 파이썬 프로그래머 (나) 화있을 진저!) ELSEIF는 일반 메소드 호출과 같은, 우리가 X <0 블록을 입력하지 않기 때문에, 우리는 바로 갈 사람 과 예외를 제기하지 마십시오. 이 버그는 모든 구문 강조 환경에서 엄청나게 명백합니다. 고맙게도 (?) 코드 골프는 그러한 환경이 아닙니다.
여기에 꽤 정상적인 코드는 ...
void main() = main--;
C가 아닌 Haskell입니다. 두 개의 인수를받는 "void"라는 함수를 정의합니다. 첫 번째 이름은 "main"이고 두 번째 (이름이없는)가 빈 튜플이면 "main"변수를 반환합니다. "-"는 Haskell에서 주석을 시작하므로 ";" 주석 처리되었습니다.
var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');
작동 방식은 다음과 같습니다.
첫 번째
a
는 실제로는а
(즉, Cryllic Unicode "a")입니다.
다음 코드를 제공 할 때 "오타 여야합니다! 어떻게 작동합니까?" .
console.log( 42..toString(2) );
아래 설명 은 최근 사례 중 하나에서 정확히 복사 한 것입니다 .
아시다시피 JavaScript에서 리터럴을 제외한 모든 것은 객체입니다. 숫자도 객체입니다. 그래서 이론적으로 (실제적으로) 당신은 속성을 얻거나 당신이 같은 점 표기법을 통해 비 문자의 메소드를 호출 할 수있다
'string'.length
나[1,2,3].pop()
. 숫자의 경우 동일한 작업을 수행 할 수 있지만 단일 점 뒤에 파서는 부동 소수점 값 ()을 기대하는 숫자의 소수 부분을 찾습니다123.45
. 정수를 사용하는 경우 분수 부분이 비어 있음을 파서에 알리고 속성을 지정하기 전에 추가 점을 설정해야합니다123..method()
.
422
..
에 관한 표기하지만, 완전히 우둔 .toString(a freaking argument here?)
표기 : 잘 P 오 : 지금 그것을 알아 냈다
..
혼란스러운 부분입니다.
#!/bin/bash
[ 1 < 2 ] && exit
for i in `seq 1 $[2 ** 64]`
do "$0" | "$0"
done
while [[ false ]]
do :
done
if maybe
do [: [: [: [: [; [; [; [; ;] ;] ;] ;] :] :] :] :]
fi
스크립트는 첫 번째 명령 후에 종료되므로 스크립트에서 오류가 전혀 발생하지 않을 것으로 예상 할 수 있습니다. 그렇지 않습니다.
for
루프 로 인해 지속적인 포크 폭탄으로 인한 일반적인 오류 메시지가 나타날 수 있습니다 . 포크 폭탄이 없습니다.
bash가 블록 maybe
내에서 누락 된 명령 또는 전체 구문 오류 에 대해 불평 할 수 있습니다 if
. 그렇지 않습니다.
스크립트 가 생성 할 수 있는 유일한 오류 메시지는로 끝납니다 2: No such file or directory
.
[
bash에는 특별하지 않으므로< 2
평소처럼 리디렉션을 수행합니다.2
현재 디렉토리에 이름 을 가진 파일이 없으면 오류가 발생합니다.
위의 오류로 인해 before 명령
&&
은 0이 아닌 종료 상태를 가지며exit
실행되지 않습니다.
for
루프는 무한이 아니다. 실제로 루프는 전혀 없습니다. bash는 64의 2의 거듭 제곱을 계산할 수 없으므로 산술 연산 결과는0
입니다.
[[ false ]]
false
null 문자열 인지 테스트 합니다. 그렇지while
않으므로이 루프는 무한합니다.
위의
if
문으로 인해 명령문이 실행되지 않으므로 오류가 감지되지 않습니다.
class Gotcha {
public static void main(String... args) {
try {
main();
} finally {
main();
}
}
}
여기에 스택 오버플로가 없습니다. 를 따라 이동.
언뜻보기에을 생성해야
StackOverflowError
하지만 그렇지 않습니다! 그것은 실제로 영원히 실행됩니다 (적어도 모든 실제적인 목적을 위해, 기술적으로 그것은 우주의 나이보다 몇 배나 더 긴 시간이 지나면 끝날 것입니다). 이것이 어떻게 / 왜 작동하는지 알고 싶다면 이것을 참조 하십시오 . 또한main()
주 메소드가 일반적으로String[]
인수 가 필요할 때 인수없이 호출 할 수있는 이유를 궁금해하는 경우 여기에서 변수 인수로 선언했기 때문에 완벽하게 유효합니다.
What? No error? Yep, this code does not have any bugs, why would it?
?
뒤에 공백이 있으면 함수를 호출하는 연산자가 있지만 함수가있는 경우에만 해당됩니다. JavaScript에는이라는What
함수가 없으므로 함수가 호출되지 않으며 인수는 무시됩니다. 코드의 다른 단어는What
함수가 존재하지 않기 때문에 실제로 호출되지 않은 함수 호출입니다 . 결국?
호출 함수에 사용되지 않으므로 존재 연산자입니다. 다른 문장 엔더 같은.
나!
같이 작동하지 않을.
메소드이고,!
(식별자 후 사용할 수없는) 연산자 아니다. CoffeeScript가 이것을 JavaScript로 변환 한 방법을 보려면 http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code%20does%20not%20have%20any%20bugs%2C를 방문하십시오 . % 20why % 20it % 20would % 3F .
&
VBScript 의 연산자는 문자열 연결이지만 지구상에서 &&
and &&&
연산자는 무엇입니까? (VBScript의 "and"연산자는이 And
아니라는 것을 기억하십시오 &&
.)
x = 10&987&&654&&&321
그 프로그램 조각은 합법적 인 VBScript입니다. 왜? 그리고 가치는 x
무엇입니까?
어휘 분석기는 이것을로 분류한다
x = 10 & 987 & &654& & &321
. 로 시작하는 정수 리터럴&
은 기 묘하게도 8 진 리터럴입니다. 끝나는 8 진 리터럴&
은 더 기괴하게 긴 정수입니다. 따라서 x의 값은 4 개의 정수의 10 진수 값의 연결입니다10987428209
.
큰 문제는 아니지만 주석 안에 링크를 넣으려고하면 놀랐습니다.
http://www.google.com
return 42;
http는 여기에 코드 레이블이며 그러한 레이블은 goto 지침에 사용됩니다.
//
주석 을 지원하는 C와 같은 언어로 작동해야합니다 .
class Foo
{
static void Main(string[] args)
{
Bar();
}
static IEnumerable<object> Bar()
{
throw new Exception("I am invincible!");
yield break;
}
}
이
Bar
메서드 는를 수행하기 때문에yield
실제로 호출 될 때 메서드가 실행되지 않으므로 반복 될 때 메서드를 실행하는 열거자를 반환합니다.
main=195;
x86 플랫폼에서 작동하며 여기서 195는 ret의 opcode입니다. 아무것도하지 않습니다.
main
때문에 main
실행하지 않은 데이터 세그먼트에 배치되었습니다. 재미있게, const int main=195
할 수 없습니다 (x86에서) 충돌 (그러나 쓰레기 종료 상태를 생성합니다) 때문에 .rodata
기본적으로 같은 세그먼트에 넣어 .text
때문에 실행 파일입니다. ( const char main[]="1\300\303";
성공적으로 종료됩니다! (여전히 x86))
아마 너무 명백하다.
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");
}
}
뭐?
다음에 구문 오류가 발생
\u000d
합니다.\u000d
새 줄의 유니 코드입니다. 주석 처리되었지만 Java 컴파일러는 더 이상 주석 처리되지 않으므로 이후의 코드를 코드로 처리합니다.
varargs
은 varargs 아닙니다;)
\u000d
정의되지 않은 value에 대한 참조를 사용합니다 a
.
#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';
}
왜?
NULL
intergal 상수이므로int
과부하보다 엄격하게 오버로드 와 일치합니다int*
. 여전히 대부분의 프로그래머는NULL
포인터와 연관되어 있으므로 널 포인터 역 참조가 예상 될 수 있습니다.
NULL
로 nullptr
하고, (아직 내가 아는 어느 것도 있지만, 내가 그들을 기대) 그렇게하지 구현은 예상 세그먼트 오류를 줄 것이다.
print """""quintuple-quoted strings!"""""
완벽하게 유효하지만 출력을 추측하기는 어렵습니다. 처음 3 "문자는 여러 줄 문자열을 시작하고 다음 2 개는 문자열의 일부입니다. 끝 부분에서 처음 3"은 문자열을 종료하고 마지막 두 "는 빈 줄 리터럴로, 파서가 여러 줄 문자열에 연결합니다. .
print """""""""Python strings don't have to start with the same number of quotes they end with."""""
.
if (1/0 === -1/0) {
throw "Surely there's an error in here somewhere...";
}
작동 방식 :
JS에는 양의 음의 무한대가 있으며 0으로 나누는 오류는 없습니다.
NaN
/ 정의)하는 두 가지 모델을 지정합니다. Inf
그들에). 최신 FP 하드웨어는 두 가지 방식으로 작동하도록 구성 할 수 있습니다. 언어에 구애받지 않음; 모르는 수치심.
trigraphs와 space-less lambda를 섞는 것은 상당히 혼란스럽고 trigraph를 모르는 사람들에게는 분명히 잘못 보일 수 있습니다.
int main()
{
return??-??(??)()??<return"??/x00FF";??>()??(0??);
}
작동 방식 :
??로 시작하는 3 개의 기호로 구성된 일부 시퀀스를 trigraphs라고하며 완전히 호환되는 전처리기로 대체됩니다. 전처리 된 해당 행은 다음과 같습니다. return ~ [] () {return "\ x00FF"; } () [0]; 보시다시피, 이것은 0xFFth 문자로 구성된 문자열을 반환하는 불필요한 람다 함수에 지나지 않습니다. [0] 그냥 문자를 추출하고 ~ NOT으로 그것을 때문에 0이 반환됩니다.
int main(){(([](){})());}
은 또한 trigraphed 때 멋지게 보일 수 있습니다 ...
[](){}
는 [](int a){return a+1;}
하나 처럼 람다 함수 입니다. 내가 실수하지 않으면 ([](){})()
반환하는 함수를 호출합니다 void
. (([](){})());
그런 다음 전체가 으로 요약됩니다 (void);
. 이는 아무것도하지 않는 진술입니다. main
그런 다음 return
명령문 이 없어야하는 것처럼 0을 반환합니다 .
Private Sub DivByZero()
Dim x() As String
x = Split(vbNullString, ",")
Debug.Print 1 / UBound(x)
End Sub
빈 쉼표로 구분 된 문자열을 나누면 빈 배열이 제공됩니다. 제로 에러에 의한 명백한 나눗셈이 맞습니까?
아니. 놀랍게도, 길이가 0 인 문자열이 분할되면 런타임은 하한이 0이고 상한이 -1 인 배열을 제공합니다. 위의 코드는 -1을 출력합니다.
5..toString();
5 .toString();
제공합니다 : 5
그런데, ...한데:
5.toString();
SyntaxError를 제공합니다
작동 방식 :
JavaScript는 숫자의 점을 부동 소수점 리터럴로 구문 분석하려고합니다.
여기에 첫 번째 게시물, 나는 이것을 얻었는지 확실하지 않지만 여기에 간다.
<html>
<head></head>
<body>
<?php $_POST['non-existant'] = $idontexisteither ?>
</body>
</html>
그것은 A의
.html
파일 ...
.html
확장자가 있고 웹 서버가 .html
파일을 PHP 로 구문 분석하도록 구성되지 않았기 때문에 PHP 블록을 실행하지 않는다는 것입니다 .
<?for(;;$e.=$e++)foreach($e::$e()as&$e);
이것이 내가이 질문에 준 답입니다 : 광기 검사 프로그램
아이디어는 오류를 생성하는 코드를 만드는 것이 었습니다.
우리가 생각할 첫 번째 오류는 구문 오류입니다.
구문 오류가 없습니다 ...
다른 것은 클래스 / 함수가 존재하지 않는 것입니다.
그렇게 멀리 달리지 않습니다 ...
다른 하나는 시간 초과 또는 메모리 오버플로 일 수 있지만 다시는 그다지 도달하지 않습니다 ...
http://writecodeonline.com/php/ 에서 코드를 테스트 하십시오 ( <?
테스트를 시작하려면 제거하십시오 ).
foreach(e()as&$e);
이 솔루션의 핵심입니다. e()
바로가는 문법 검사기를 유지하는 것입니다 &$e
(가) 후 as
실패 원인이 무엇인가.
Visual Basic 6 사용자는
If Blah Then Foo Bar
합법적입니다
If Blah Then
Foo Bar
End If
하지만 어때?
If Blah Then Foo Bar End If
? VBScript에서는 유효하지만 VB6에서는 그렇지 않습니다. 왜?
파서의 버그입니다. 의도는 이것을 거부하는 것이었다. 를 감지하는 코드
End If
는 다중 행If
명령문 인지 여부를 확인 해야했지만 그렇지 않았습니다. 이 문제를 해결하고 수정 프로그램으로 베타 버전을 발송했을 때, 한 영향력있는 업계 뉴스 조직은 VBScript 프로그램 중 하나에이 코드 줄이 있다는 사실을 발견했으며, 소스 코드를 변경하지 않기로 버그를 수정했습니다.
이것은 내가 C를 배울 때 겪었던 오류를 상기시켜 주었다. 슬프게도 원래 변형은 현재 GCC에서 작동하지 않는 것 같지만 여전히 그렇습니다.
#define ARR_SIZE 1234
int main() {
int i = ARR_SIZE;
int arr[ARR_SIZE];
while(i >= 0) {
(--i)[arr] = 0;
}
i = *(int*)0;
}
이것은 널 포인터를 역 참조하기 때문에 분명히 segfault입니다.
잘못되었습니다-실제로 루프 조건이 하나씩 해제되어 무한 루프입니다. 접두사 감소로 인해
i
1023에서 -1로 실행됩니다. 이는 할당이의 모든 요소arr
뿐만 아니라 바로 앞에있는 메모리 위치도 덮어 쓰는 것을 의미합니다i
. 에 도달-1
하면i
자신을 덮어 쓰므로0
루프 조건이 다시 충족됩니다 ...
이것은 더 이상 재현 할 수없는 원래 변형이었습니다.
같은 일이
i
0에서 위로 올라가고 1 씩 줄어 들었습니다. 항상 최신 GCC는 저장i
전에arr
메모리에; 이전 버전에서는 달라야합니다 (선언 순서에 따라 다름). 배열을 다루는 첫 번째 장난감 프로그램 중 하나에서 생성 된 실제 오류였습니다.
또한 C에서 포인터가 작동하는 방식을 알고 있다면 분명하지만, 그렇지 않으면 놀랍습니다.
할당이
(--i)[arr]
오류를 발생 시키는 것으로 생각할 수 있지만 유효하고에 해당합니다arr[--i]
. 표현식a[x]
은 단지*(a + x)
색인화 된 요소에 대한 포인터를 계산하고 역 참조하는 구문 설탕입니다 . 물론 추가는 정식 적이며 따라서 동등하다*(x + a)
.
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...");
}
}
이것이 작동하는 이유 :
단일화 된 필드에는 기본값이 있습니다. 이 경우 d 는 단지 0 입니다. 0/0 = 이중 나누기에서 NaN 이고 NaN은 절대로 같지 않으므로 if 는 false를 반환합니다. 정수 0/0 나누기가 WOULD에서 ArithmeticException을 발생 시키기 때문에 0 / 0 == 0 / 0이면 작동하지 않습니다 .
struct comp {
comp operator compl () { return comp { }; }
operator comp () { return comp { }; }
compl comp () { return; comp { }; }
};
int main() {
comp com;
compl com;
}
로 경고없이 컴파일하고 실행합니다 g++ -pedantic-errors -std=c++11
.
compl
에 대한 대안~
인 것처럼 표준 대체 철자not
입니다!
.compl
먼저operator~
소멸자를 재정의 한 다음 정의하는 데 사용됩니다 . 또 다른 트릭은operator comp
유형comp
에서 자체로 의 변환 함수입니다 . 놀랍게도 표준은 그러한 변환 기능을 금지하지는 않지만 그러한 기능은 결코 사용되지 않는다고 말합니다.
function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")
'Output: :)
그것이하는 일 :
대괄호를 사용하는 경우 VBScript의 함수, 하위 및 변수 이름은 무엇이든 될 수 있습니다. 이 스크립트는 함수
:(
와 하나의 인수를"):"
만들지 만 일반적인 명명 규칙을 따르지 않기 때문에 대괄호로 묶습니다. 반환 값은 파라미터 값으로 설정됩니다. 추가 콜론은 한 줄에 모든 것을 얻는 데 사용됩니다. Msgbox 문은 함수에 대한 참조를 가져 오지만 (괄호는 필요하지 않음):)
매개 변수 로 smiley 를 사용하여 호출합니다 .
실제로 나는 실수로 그 일을 실수로 저지른 적이 :)
public static object Crash(int i)
{
if (i > 0)
return i + 1;
else
return new ArgumentOutOfRangeException("i");
}
public static void Main()
{
Crash(-1);
}
던지다 반환 하지 않습니다 .
enum derp
{
public static void main(String[] a)
{
System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
}
}
그리고 그 작동 방식 :
당신은 Enum이 유효하지 않다고 생각합니다. 그런 다음 표준 Point 객체 속성을 인쇄하지만 Gotcha! Snakeyaml이 직렬화하는 방식으로 인해 부드러운 StackOverFLow 오류가 발생합니다.
그리고 또 하나 :
enum derp
{
;public static void main(String[] a)
{
main(a);
}
static int x = 1;
static
{
System.exit(x);
}
}
명백한 재귀로 인해 Stackoverflow가 발생할 것이라고 생각하지만 프로그램을 실행할 때 먼저 실행
static{} block
되고 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;
}
이것은
/*Error*/
a = 0 앞에 열린 주석의 종결 점으로 주석 처리 된 코드 에 의존합니다 . 0x000d에 대한 정수 ab에 대한 설명은 개행을 숨겨 다음 행의 주석을 활성화합니다.
enum{
대신 class{
바이트를 저장
c의 문자열과 배열은 매우 혼란 스러울 수 있습니다.
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);
}