Ваше завдання просте. Напишіть програму, яка, очевидно, повинна створювати помилку на перший погляд при компілюванні або запуску, але або не робить, або створює якусь іншу непов'язану помилку. Це конкурс популярності, тому будьте креативними.
Ваше завдання просте. Напишіть програму, яка, очевидно, повинна створювати помилку на перший погляд при компілюванні або запуску, але або не робить, або створює якусь іншу непов'язану помилку. Це конкурс популярності, тому будьте креативними.
Відповіді:
Переконайтеся, що ви компілюєте такий код у стандартному відповідному режимі (наприклад, для 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
Друкує "тут нічого не бачити".
Це ельсиф , а не інший . (і це, звичайно, не elif - горе горе-програмовому програмісту python (мені)!) Тож для інтерпретатора elseif це виглядає як звичайний виклик методу, і оскільки ми не вводимо блок x <0, ми переходимо прямо до іншого і не створюйте винятку. Ця помилка неймовірно очевидна в будь-якому середовищі, що виділяє синтаксис, на щастя (?) Код гольфу - це не таке середовище.
Тут досить нормальний код ...
void main() = main--;
Це Haskell, а не C. Він визначає функцію з назвою "void", яка бере два аргументи. Перший називається "основним", і якщо другий (без імені) - порожній кортеж, він повертає "головну" змінну. "-" починає коментар у Haskell, тому ";" коментується.
var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');
Ось як це працює:
Перший
a
насправді єа
(тобто Cryical Unicode "a").
Коли я надав наступний код, мені багато разів говорили: "Це повинно бути помилковим помилкою! Як це може працювати?" .
console.log( 42..toString(2) );
Опис нижче було скопійовано саме з одного з останніх випадків .
Як ви, напевно, знаєте, в JavaScript все, крім літералів, є об'єктом. Числа також є об'єктами. Таким чином, теоретично (і практично) ви можете отримати властивості або викликати методи будь-якого нелітерального за допомогою точкових позначень, як ви це робите
'string'.length
або[1,2,3].pop()
. У разі чисел ви можете зробити те ж саме, але вам слід пам’ятати, що після однієї крапки аналізатор буде шукати дробову частину числа, що очікує значення float (як у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
цикл. Немає вилкової бомби.
Ви можете очікувати, що баш скаржиться на відсутність maybe
команди або на всю помилку синтаксису всередині if
блоку. Це не стане.
Єдине повідомлення про помилку, яке може створити сценарій, закінчується 2: No such file or directory
.
[
не особливий для bash, тому< 2
виконує, як зазвичай, перенаправлення. Якщо2
в поточному каталозі немає файлу з ім'ям , це призведе до помилки.
Через цю помилку вище, команда раніше
&&
матиме ненульовий статус виходу іexit
не буде виконуватися.
for
Цикл не є нескінченним. Насправді циклу взагалі немає. Оскільки bash не може обчислити 64-ю потужність 2, результат арифметичного виразу є0
.
[[ false ]]
тести, якщоfalse
це нульовий рядок. Це не так, тому цяwhile
петля нескінченна.
Через вищезазначене,
if
оператор ніколи не виконується, тому помилки не виявляються.
use strict;
use warnings;
Syntax error!
exit 0;
Джерело та пояснення: https://stackoverflow.com/questions/11695110
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 % 20 чому% 20it% 20буде% 3F .
&
Оператор VBScript є конкатенація , але то , що на землі є &&
і &&&
оператори? (Нагадаємо, що оператор "і" у VBScript є And
, ні &&
.)
x = 10&987&&654&&&321
Цей фрагмент програми є легальним VBScript. Чому? А яка цінність x
?
Лексер розбиває це як
x = 10 & 987 & &654& & &321
. Ціле число, яке починається з,&
є, як це не дивно, восьмеричним буквалом. Восьмий дословник, який закінчується,&
- ще більш дивно, довге ціле число. Таким чином, значення х є конкатенація десяткових значень цих чотирьох чисел:10987428209
.
Не велика справа, але це мене здивувало, намагаючись поставити посилання всередині коментаря:
http://www.google.com
return 42;
http - тут кодова мітка, такі мітки використовуються в інструкціях goto
//
коментарі.
class Foo
{
static void Main(string[] args)
{
Bar();
}
static IEnumerable<object> Bar()
{
throw new Exception("I am invincible!");
yield break;
}
}
Оскільки
Bar
метод робить ayield
, метод насправді не запускається при виклику, він повертає нумератор, який при ітерації s запускає метод.
main=195;
Працює на платформах x86, де 195 - опкод для ret. Нічого не робить,
main
оскільки main
вона розміщена в сегменті даних, який не виконується. Забавно, неconst int main=195
вийде з ладу (на x86) (але створить статус виходу сміття), оскільки за замовчуванням розміщується в тому ж сегменті, що і тому виконується. ( .rodata
.text
const char main[]="1\300\303";
Напевно, занадто очевидно.
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
не вараги;)
\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
як nullptr
, а реалізації, які так роблять (ще я не знаю, але я їх очікую) призведе до очікуваної помилки сегментації.
print """""quintuple-quoted strings!"""""
Прекрасно справедливий, але висновок важко здогадатися. Перші 3 "символи починають багаторядковий рядок, а наступні два - частина рядка. Наприкінці перші три" s "завершують рядок, а останні два - порожній літеральний рядок, який об'єднується парсером у рядок з рядком .
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
як звичайне argebraic значення з чітко визначеною математикою на них). Сучасне обладнання FP може бути налаштоване для роботи в обох напрямках. Мова-агностик; сором не знати.
Змішування триграфів та лямбдів, що не мають простору, може бути дуже заплутаним і, безумовно, виглядає помилково для людей, які не знають про триграфи:
int main()
{
return??-??(??)()??<return"??/x00FF";??>()??(0??);
}
Як це працює:
Деякі послідовності, що складаються з 3 символів, починаючи з ??, називаються триграфами і будуть заміщені повністю сумісним препроцесором. Попередньо оброблений рядок виглядає так: return ~ [] () {return "\ x00FF"; } () [0]; Як видно, це не що інше, як зайва лямбда-функція, що повертає рядок, що складається з символу 0xFFth. [0] просто витягує цей символ і ~ ноти його, так що 0 повертається.
int main(){(([](){})());}
також може виглядати приємно, коли її сфотографують ...
[](){}
- це лямбда-функція, як [](int a){return a+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
розширення, а ваш веб-сервер не налаштований для розбору .html
файлів як PHP?
<?for(;;$e.=$e++)foreach($e::$e()as&$e);
Таку відповідь я дав у цьому питанні: Insanity Check Program
Ідея полягала в тому, щоб зробити код, який створював помилки.
Перша помилка, яку ми подумаємо, - це синтаксична помилка.
Синтаксичних помилок немає ...
Іншим було б те, що клас / функція не існує.
Це не так далеко біжить ...
Інше - це тайм-аут або переповнення пам'яті, але, знову ж таки, це не так далеко ...
Тестуйте код тут: 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, і сказала, що вони дадуть новій версії низький рейтинг, якщо ми не скасуємо виправлено помилку, оскільки вони не хотіли змінювати свій вихідний код.
Це нагадало мені про помилку, з якою я зіткнувся, коли дізнався С. На жаль, оригінальний варіант, здається, не працює з поточним GCC, але цей все-таки робить:
#define ARR_SIZE 1234
int main() {
int i = ARR_SIZE;
int arr[ARR_SIZE];
while(i >= 0) {
(--i)[arr] = 0;
}
i = *(int*)0;
}
Це, очевидно, segfaults, тому що ми відкидаємо нульовий покажчик, правда?
Неправильно - насправді це нескінченна петля, оскільки наша умова петлі відключається. Завдяки декрету префікса,
i
працює від 1023 до -1. Це означає, що присвоєння замінює не лише всі елементи вarr
, але й розташування пам'яті безпосередньо перед ним - що, можливо, є місцемi
зберігання. Досягнувши-1
,i
перезаписує себе,0
і таким чином умова циклу знову виконується ...
Це був оригінальний варіант, який я більше не можу відтворити:
Те саме працювало з
i
підняттям вгору від 0 і відхиленням від одного. Останні 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 повертає хибне. Зауважте, це не спрацювало, якби у вас був 0/0 == 0/0 , так як при цілому поділі 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 можуть бути будь-якими, якщо ви використовуєте квадратні дужки. Цей скрипт містить функцію, яку називають
:(
одним аргументом,"):"
але, оскільки вони не дотримуються звичайного правила іменування, вони оточені квадратними дужками. Повернене значення встановлюється значенням параметра. Додаткова двокрапка використовується для отримання всього на одній лінії. Оператор 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()));
}
}
І як це працює:
Ялинки, на вашу думку, Енум не дійсний, але його дійсний; тоді ви думаєте, що він буде друкувати стандартні атрибути об'єктів 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
буде виконана першою і завдяки цьому вона виходить перед основними () завантаженнями
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; пояснення про ціле число ab до 0x000d приховує новий рядок, щоб активувати коментар наступного рядка
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);
}