あなたの仕事は簡単です。コンパイルまたは実行時に一目で明らかにエラーを生成するはずのプログラムを作成しますが、他の無関係なエラーは生成しないか、生成します。これは人気コンテストですので、クリエイティブになりましょう。
あなたの仕事は簡単です。コンパイルまたは実行時に一目で明らかにエラーを生成するはずのプログラムを作成しますが、他の無関係なエラーは生成しないか、生成します。これは人気コンテストですので、クリエイティブになりましょう。
回答:
次のコードを必ず標準準拠モードでコンパイルしてください(たとえば、g ++では-ansiフラグを使用します)。
int main()
{
// why doesn't the following line give a type mismatch error??/
return "success!";
}
使い方:
?? /は、次の改行をエスケープするバックスラッシュに変換される3文字表記シーケンスであるため、次の行はまだコメントの一部であるため、構文エラーは生成されません。C ++では、戻り値を省略すること
main
は明確に定義されており、0を返すことと同等であり、実行が成功したことを示します。
いつもこれのファンです。
x = x
いいえNameError
。xは今nil
です。
これはRubyの単なる「機能」です:-)
これは私が以前に手に入れたもっとありふれたものです:
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。(そして、それは確かにエリフではありません - わがままなpythonプログラマー(私)に悲惨です!)インタープリターelseifは通常のメソッド呼び出しのように見え、x <0ブロックを入力しないので、すぐに他に進み、例外を発生させないでください。このバグは、構文強調表示環境では信じられないほど明白です。ありがたいことに(?)コードゴルフはそのような環境ではありません。
ここにかなり普通のコード...
void main() = main--;
CではなくHaskellです。2つの引数を取る「void」という名前の関数を定義します。最初の名前は「main」で、2番目の(名前のない)タプルが空の場合、「main」変数を返します。「-」はHaskellでコメントを開始するため、「;」コメントアウトされています。
var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');
仕組みは次のとおりです。
最初
a
は実際にはа
(つまり、Crylic 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
現在のディレクトリに名前の付いたファイルがない場合、エラーが発生します。
上記のエラーにより、前のコマンド
&&
はゼロ以外の終了ステータスになり、exit
実行されません。
for
ループは無限ではありません。実際、ループはまったくありません。bashは2の64乗を計算できないため、算術式の結果は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
、ではありません&&
。)
x = 10&987&&654&&&321
そのプログラムフラグメントは正当なVBScriptです。どうして?そして、の価値はx
何ですか?
レクサーはこれをとして分解します
x = 10 & 987 & &654& & &321
。で始まる整数リテラル&
は、奇妙なことに、8進数リテラルです。で終わる8進リテラル&
は、さらに奇妙なことに、長整数です。したがって、xの値は、これら4つの整数の10進数値の連結です10987428209
。
class Foo
{
static void Main(string[] args)
{
Bar();
}
static IEnumerable<object> Bar()
{
throw new Exception("I am invincible!");
yield break;
}
}
Bar
メソッドはを実行するため、メソッドはyield
呼び出されたときに実際には実行されず、列挙子を返します。この列挙子は、反復されるとメソッドを実行します。
main=195;
195がretのオペコードであるx86プラットフォームで動作します。何もしません
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
は、新しい行のUnicodeです。コメントアウトされていますが、Javaコンパイラーはコメントアウトされていないため、この後のコードをコードとして扱います。
varargs
は可変引数ではありません;)
\u000d
、未定義の値への参照を使用します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
は整数の定数であるため、int
オーバーロードと厳密に一致しint*
ます。それでも、ほとんどのプログラマーはNULL
ポインターに関連付けられているため、NULLポインターの逆参照が予想されます。
NULL
として定義できるようnullptr
になっており、そうする実装(まだ私が知っているものではないが、期待している)は、予想されるセグメンテーションフォールトを提供します。
print """""quintuple-quoted strings!"""""
完全に有効ですが、出力を推測するのは困難です。最初の3つの "文字は複数行文字列を開始し、次の2つは文字列の一部です。最後に、最初の3つの"は文字列を終了し、最後の2つはパーサーによって複数行文字列に連結される空の文字列リテラルです。
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には正と負の無限大があり、ゼロ除算のエラーはありません。
NaN
/のInf
ように)それらの上に)。最新のFPハードウェアは、両方の方法で動作するように構成できます。言語に依存しない; 知らない恥。
トリグラフとスペースのないラムダを混ぜることは非常に混乱しやすく、トリグラフを知らない人にとって間違いのように見えます。
int main()
{
return??-??(??)()??<return"??/x00FF";??>()??(0??);
}
使い方:
??で始まる3つのシンボルで構成される一部のシーケンスは、トライグラフと呼ばれ、完全に準拠したプリプロセッサに置き換えられます。前処理された問題の行は次のようになります。return〜[](){return "\ x00FF"; }()[0]; ご覧のとおり、これは0xFF番目の文字で構成される文字列を返す余分なラムダ関数に他なりません。[0]ちょうどその文字を抽出し、〜 NOTとそれを、その0が返されます。
int main(){(([](){})());}
trigraphedときも...素敵に見えるかもしれません
[](){}
は、[](int a){return a+1;}
1つと同様にラムダ関数です。([](){})()
その関数を呼び出して、void
間違っていない場合に戻ります。全体(([](){})());
はに要約されますが(void);
、これは何もしないステートメントです。main
その後、return
ステートメントがなくてもよいように、ゼロを返します。
Private Sub DivByZero()
Dim x() As String
x = Split(vbNullString, ",")
Debug.Print 1 / UBound(x)
End Sub
空のカンマ区切り文字列を分割すると、空の配列が得られます。ゼロエラーによる明らかな除算であるはずですよね?
いや。驚くべきことに、長さゼロの文字列が分割されると、ランタイムは、下限が0で上限が-1の配列を提供します。上記のコードは-1を出力します。
5..toString();
5 .toString();
与える:5
一方、
5.toString();
SyntaxErrorを返します
使い方:
JavaScriptは、数値上のドットを浮動小数点リテラルとして解析しようとします
ここに最初の投稿、これを取得するかどうかはわかりませんが、ここに行きます。
<html>
<head></head>
<body>
<?php $_POST['non-existant'] = $idontexisteither ?>
</body>
</html>
それは
.html
ファイルです...
.html
拡張子があり、Webサーバーが.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プログラムの1つにこのコード行があることを発見し、新しいバージョンの評価を低くしない限り、ソースコードを変更したくないため、バグを修正しました。
これは、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;
}
nullポインターを逆参照するため、これは明らかにセグメンテーション違反です。
間違っています-実際、ループ条件が1つずれているため、無限ループです。プレフィックスの減少により
i
、1023から-1になります。これは、割り当てがのすべての要素だけでなくarr
、その直前のメモリ位置も上書きすることを意味します-これはたまたまi
保存されている場所です。に達すると-1
、i
それ自体で上書き0
され、ループ条件が再び満たされます...
これは元のバリアントIで、もう再現できません。
同じことは
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 == 0/0の場合、これは機能しないことに注意してください。atは整数0/0で除算するとArithmeticExceptionがスローされます。
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の関数、サブ、および変数名は何でもかまいません。このスクリプトは、呼び出される関数
:(
と1つの引数を作成します"):"
が、通常の命名規則に従っていないため、角括弧で囲まれています。戻り値はパラメーター値に設定されます。追加のコロンを使用して、すべてを1行で取得します。Msgboxステートメントは、関数への参照を取得しますが(かっこは必要ありません)、:)
パラメーターとしてスマイリーを使用して呼び出します。
実際、私は間違ってそれをやったことに気づいた:)
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*/
、ab = 0の前に開かれたコメントの終了点として、コメントアウトされたコードに依存しています。0x000dの整数abに関するExplainは、改行を非表示にして次の行のコメントアウトをアクティブにします
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);
}