당신의 작업은 간단합니다. 컴파일하거나 실행할 때 언뜻보기에 오류가 발생하지만 관련되지 않은 다른 오류는 발생하지 않는 프로그램을 작성하십시오. 이것은 인기 콘테스트이므로 창의력을 발휘하십시오.
당신의 작업은 간단합니다. 컴파일하거나 실행할 때 언뜻보기에 오류가 발생하지만 관련되지 않은 다른 오류는 발생하지 않는 프로그램을 작성하십시오. 이것은 인기 콘테스트이므로 창의력을 발휘하십시오.
답변:
표준 준수 모드에서 다음 코드를 컴파일해야합니다 (예 : 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 ]]falsenull 문자열 인지 테스트 합니다. 그렇지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';
}
왜?
NULLintergal 상수이므로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입니다.
잘못되었습니다-실제로 루프 조건이 하나씩 해제되어 무한 루프입니다. 접두사 감소로 인해
i1023에서 -1로 실행됩니다. 이는 할당이의 모든 요소arr뿐만 아니라 바로 앞에있는 메모리 위치도 덮어 쓰는 것을 의미합니다i. 에 도달-1하면i자신을 덮어 쓰므로0루프 조건이 다시 충족됩니다 ...
이것은 더 이상 재현 할 수없는 원래 변형이었습니다.
같은 일이
i0에서 위로 올라가고 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);
}