Sua tarefa é simples. Escreva um programa que obviamente deva produzir um erro à primeira vista, quando compilado ou executado, mas que não produza ou produza algum outro erro não relacionado. Este é um concurso de popularidade, então seja criativo.
Sua tarefa é simples. Escreva um programa que obviamente deva produzir um erro à primeira vista, quando compilado ou executado, mas que não produza ou produza algum outro erro não relacionado. Este é um concurso de popularidade, então seja criativo.
Respostas:
Certifique-se de compilar o seguinte código no modo de conformidade padrão (por exemplo, para g ++, use o sinalizador -ansi):
int main()
{
// why doesn't the following line give a type mismatch error??/
return "success!";
}
Como funciona:
A ?? / é uma sequência trigraph que é traduzida em uma barra invertida que escapa à nova linha a seguir; portanto, a próxima linha ainda faz parte do comentário e, portanto, não gera um erro de sintaxe. Observe que, em C ++, a omissão do retorno
main
é bem definida e equivalente ao retorno 0, indicando uma execução bem-sucedida.
Sempre um fã deste.
x = x
Não NameError
. x é agora nil
.
Este é apenas um "recurso" do Ruby :-)
Aqui está um mais mundano que já me pegou antes:
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
Imprime "nada para ver aqui".
É elsif , não elseif . (e certamente não é difícil para o programador python rebelde (eu)!) Portanto, para o intérprete elseif parece uma chamada de método normal, e como não inserimos o bloco x <0, seguimos em frente para else e não crie uma exceção. Esse bug é incrivelmente óbvio em qualquer ambiente de destaque de sintaxe, felizmente (?) O código golf não é um ambiente assim.
Código bastante normal aqui ...
void main() = main--;
É Haskell, não C. Ele define uma função chamada "void" que recebe dois argumentos. O primeiro é nomeado "principal" e, se o segundo (sem nome) for uma tupla vazia, ele retornará a variável "principal". "-" inicia um comentário em Haskell, então o ";" é comentado.
var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');
Veja como funciona:
O primeiro
a
é realmente umа
(ou seja, Cryllic Unicode "a").
Quando eu estava fornecendo o código a seguir, me disseram muitas vezes "Deve ser um erro de digitação! Como isso pode funcionar?" .
console.log( 42..toString(2) );
A descrição abaixo foi copiada exatamente de um dos casos recentes .
Como você provavelmente sabe, em JavaScript tudo, exceto literais, é um objeto. Os números também são objetos. Então, teoricamente (e praticamente), você pode obter propriedades ou chamar métodos de qualquer não literal por meio de notação de ponto, como você
'string'.length
ou[1,2,3].pop()
. No caso de números, você pode fazer o mesmo, mas lembre-se de que, após um único ponto, o analisador procurará uma parte fracionária do número que espera um valor flutuante (como em123.45
). Se você usar um inteiro você deve "dizer" o analisador de que uma parte fracionária é vazio, definindo um ponto extra antes de abordar uma propriedade:123..method()
.
422
..
notação, mas inteiramente ignorante em relação à .toString(a freaking argument here?)
notação: P Oh bem, percebi isso por agora :)
..
é a parte confusa.
#!/bin/bash
[ 1 < 2 ] && exit
for i in `seq 1 $[2 ** 64]`
do "$0" | "$0"
done
while [[ false ]]
do :
done
if maybe
do [: [: [: [: [; [; [; [; ;] ;] ;] ;] :] :] :] :]
fi
Você pode esperar que o script não produza nenhum erro, pois ele sai após o primeiro comando. Não faz.
Você pode esperar as mensagens de erro típicas causadas por uma bomba de garfo em andamento devido ao for
loop. Não há garfo bomba.
Você pode esperar que o bash reclame sobre o maybe
comando ausente ou todo o grupo de erros de sintaxe dentro do if
bloco. Não vai.
A única mensagem de erro que o script pode produzir termina 2: No such file or directory
.
[
não é especial para o bash; portanto< 2
, executa, como sempre, o redirecionamento. A menos que haja um arquivo com nome2
no diretório atual, isso causará um erro.
Devido ao erro acima, o comando anterior
&&
terá um status de saída diferente de zero eexit
não será executado.
O
for
loop não é infinito. De fato, não há loop. Como o bash não pode calcular a 64ª potência de 2, o resultado da expressão aritmética é0
.
[[ false ]]
testa sefalse
é uma sequência nula. Não é, então essewhile
loop é infinito.
Por causa do exposto, a
if
instrução nunca é executada, portanto, nenhum erro é detectado.
use strict;
use warnings;
Syntax error!
exit 0;
Fonte e explicação: https://stackoverflow.com/questions/11695110
class Gotcha {
public static void main(String... args) {
try {
main();
} finally {
main();
}
}
}
Nenhuma pilha transborda aqui; seguir em frente.
À primeira vista, isso deve produzir um
StackOverflowError
, mas não! Na verdade, ele funciona para sempre (pelo menos para todos os efeitos práticos; tecnicamente, terminaria após um tempo muitas ordens de magnitude maiores que a idade do universo). Se você quiser saber como / por que isso funciona, consulte isso . Além disso, se você está se perguntando por que podemos chamarmain()
sem argumentos quando o método principal geralmente precisa de umString[]
argumento: é porque declaramos que é argumento variável aqui, o que é perfeitamente válido.
What? No error? Yep, this code does not have any bugs, why would it?
?
seguido por um espaço é o operador que chama uma função, mas somente se ela existir. O JavaScript não tem uma função chamadaWhat
, portanto, a função não é chamada e seus argumentos são simplesmente ignorados. As outras palavras no código são chamadas de função que na verdade não são chamadas, porque aWhat
função não existe. No final,?
é operador de existência, pois não é usado na função de chamada. Outros terminadores de frases, como.
ou!
não funcionariam, como.
é para métodos, e!
não é operador (que não pode ser usado após um identificador). Para ler como o CoffeeScript converteu isso em JavaScript, visite http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code%20does%20not%20have%20any%20bugs%2C % 20% por% 20it% 20% 3F .
O &
operador no VBScript é concatenação de strings, mas o que são os operadores &&
e &&&
? (Lembre-se de que o operador "e" no VBScript And
não é &&
.)
x = 10&987&&654&&&321
Esse fragmento de programa é VBScript legal. Por quê? E qual é o valor x
?
O lexer divide isso como
x = 10 & 987 & &654& & &321
. Um literal inteiro que começa com&
é, estranhamente, um literal octal. Um literal octal que termina com&
é, ainda mais bizarro, um inteiro longo. Portanto, o valor de x é a concatenação dos valores decimais desses quatro inteiros:10987428209
.
Não é grande coisa, mas me surpreendeu ao tentar colocar um link dentro de um comentário:
http://www.google.com
return 42;
http é uma etiqueta de código aqui, essas etiquetas são usadas nas instruções goto
//
comentários.
class Foo
{
static void Main(string[] args)
{
Bar();
}
static IEnumerable<object> Bar()
{
throw new Exception("I am invincible!");
yield break;
}
}
Como o
Bar
método faz ayield
, o método realmente não é executado quando chamado, ele retorna um enumerador que, quando iterado, s executa o método.
main=195;
Funciona em plataformas x86, onde 195 é o código de operação para ret. Faz nada,
main
porque main
foi colocado no segmento de dados, que não é executável. Surpreendentemente, const int main=195
vai não falhar (no x86) (mas irá produzir um estado de saída de lixo) porque .rodata
, por padrão é colocado no mesmo segmento .text
e por isso é executável. ( const char main[]="1\300\303";
Sairá com sucesso (ainda em x86)!)
Provavelmente óbvio demais.
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");
}
}
O que?
Lança um erro de sintaxe depois
\u000d
.\u000d
é o unicode para uma nova linha. Mesmo sendo comentado, o compilador Java trata o que se segue a isso como código, uma vez que não é mais comentado.
varargs
não são varargs;)
\u000d
, ele usaria uma referência ao valor indefinido 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';
}
Por quê?
NULL
é uma constante intergal, para que coincida com aint
sobrecarga estritamente melhor que oint*
um. Ainda assim, a maioria dos programadores seNULL
associou a ponteiros, portanto, pode ser esperada uma desreferência de ponteiro nulo.
NULL
como nullptr
, e as implementações que o fazem (ainda não sei, mas espero) irão fornecer a falha de segmentação esperada.
print """""quintuple-quoted strings!"""""
Perfeitamente válido, mas é difícil adivinhar o resultado. Os primeiros 3 "caracteres iniciam uma sequência multilinha e os próximos dois fazem parte da sequência. No final, os três primeiros terminam a sequência e os dois últimos são uma sequência vazia literal que é concatenada pelo analisador para a sequência multilinha. .
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...";
}
Como funciona:
Há infinito positivo e negativo em JS, e não há erro para dividir por zero.
NaN
/ Inf
exatamente como valores algébricos regulares com matemática bem definida neles). O hardware FP moderno pode ser configurado para operar nos dois sentidos. Agnóstico à linguagem; vergonha de não saber.
A mistura de trigramas e lambdas sem espaço pode ser bastante confusa e definitivamente parecer errada para as pessoas que não estão cientes dos trigramas:
int main()
{
return??-??(??)()??<return"??/x00FF";??>()??(0??);
}
Como funciona:
Algumas seqüências que consistem em 3 símbolos, começando com ??, são chamadas trigramas e serão substituídas por um pré-processador totalmente compatível. Pré-processada, a linha em questão tem a seguinte aparência: return ~ [] () {return "\ x00FF"; } () [0]; Como se pode ver, isso não passa de uma função lambda supérflua retornando uma string que consiste no caractere 0xFFth. O [0] apenas extrai esse caractere e ~ NÃO o nota, então 0 é retornado.
int main(){(([](){})());}
também pode olhar bom quando trigraphed ...
[](){}
é uma função lambda, assim como [](int a){return a+1;}
é uma. ([](){})()
chama essa função, retornando void
se não me engano. O todo (([](){})());
então se resume a (void);
, que é uma afirmação que não faz nada. main
então retorna zero, como deveria sem uma return
declaração.
Private Sub DivByZero()
Dim x() As String
x = Split(vbNullString, ",")
Debug.Print 1 / UBound(x)
End Sub
A divisão de uma cadeia de caracteres delimitada por vírgula vazia deve fornecer uma matriz vazia. Deve ser uma divisão óbvia por erro zero, certo?
Não. Surpreendentemente, quando qualquer seqüência de comprimento zero é dividida, o tempo de execução fornece uma matriz com um limite inferior de 0 e um limite superior de -1. O código acima produzirá -1.
5..toString();
5 .toString();
Dá: 5
Enquanto que:
5.toString();
Dá erro de sintaxe
Como funciona:
JavaScript tenta analisar ponto em um número como um literal de ponto flutuante
Primeiro post aqui, não tenho certeza se entendi ou não, mas aqui vai.
<html>
<head></head>
<body>
<?php $_POST['non-existant'] = $idontexisteither ?>
</body>
</html>
É um
.html
arquivo ...
.html
extensão e seu servidor da Web não está configurado para analisar .html
arquivos como PHP?
<?for(;;$e.=$e++)foreach($e::$e()as&$e);
Esta foi a resposta que dei nesta pergunta: Programa Insanity Check
A ideia era criar um código que produzisse erros.
O primeiro erro em que pensaremos é um erro de sintaxe.
Não há erros de sintaxe ...
Outro seria que a classe / função não existe.
Não corre tão longe ...
Outro seria um tempo limite ou um estouro de memória, mas, novamente, não chega tão longe ...
Teste o código aqui: http://writecodeonline.com/php/ (remova o <?
no início do teste).
foreach(e()as&$e);
é o núcleo desta solução. e()
é apenas para manter o verificador de sintaxe funcionando e &$e
depois disso as
é o que causa a falha.
Os usuários do Visual Basic 6 saberão que
If Blah Then Foo Bar
é legal, como é
If Blah Then
Foo Bar
End If
Mas e quanto
If Blah Then Foo Bar End If
? Acontece que isso é legal no VBScript, mas não no VB6. Por quê?
É um bug no analisador; a intenção era rejeitar isso. O código que detecta o
End If
deveria também verificar se era umaIf
instrução de várias linhas , e não o fez. Quando tentei corrigi-lo e enviei uma versão beta com essa correção, uma organização influente de notícias do setor descobriu que eles tinham essa linha de código em um de seus programas VBScript e disse que daria uma nova classificação baixa à nova versão, a menos que corrigido o bug, porque eles não queriam mudar seu código fonte.
Isso me lembrou um erro que eu encontrei quando aprendi C. Infelizmente, a variante original não parece funcionar com um GCC atual, mas este ainda funciona:
#define ARR_SIZE 1234
int main() {
int i = ARR_SIZE;
int arr[ARR_SIZE];
while(i >= 0) {
(--i)[arr] = 0;
}
i = *(int*)0;
}
Obviamente segfaults porque desreferenciamos um ponteiro nulo, certo?
Errado - na verdade, é um loop infinito, pois nossa condição de loop é desativada em um. Devido ao decremento do prefixo,
i
é executado de 1023 a -1. Isso significa que a atribuição substitui não apenas todos os elementosarr
, mas também o local da memória diretamente antes dele - que é o local ondei
está armazenado. Ao chegar-1
,i
sobrescreve-se0
e, assim, a condição do loop é atendida novamente ...
Esta foi a variante original I, que não posso mais reproduzir:
O mesmo ocorreu com o
i
aumento de 0 e a redução de um. O último GCC sempre armazenai
antesarr
na memória; isso deve ter sido diferente nas versões mais antigas (talvez dependendo da ordem da declaração). Foi um erro real que produzi em um dos meus primeiros programas de brinquedos que lidam com matrizes.
Além disso, isso é óbvio se você souber como os ponteiros funcionam em C, mas pode ser surpreendente se você não:
Você pode pensar que a atribuição a
(--i)[arr]
gera um erro, mas é válida e equivalente aarr[--i]
. Uma expressãoa[x]
é apenas açúcar sintático para o*(a + x)
qual calcula e desreferencia o ponteiro para o elemento indexado; a adição é, naturalmente, comutativa e, portanto, equivalente a*(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...");
}
}
Por que isso funciona:
Os campos unitizados têm valores padrão. Nesse caso, d é apenas 0 . 0/0 = NaN em divisão dupla, e NaN nunca é igual a si próprio, portanto o if retorna false. Observe que isso não funcionaria se você tivesse 0/0 == 0/0 , pois em seria a divisão de número inteiro 0/0 lançaria uma ArithmeticException .
struct comp {
comp operator compl () { return comp { }; }
operator comp () { return comp { }; }
compl comp () { return; comp { }; }
};
int main() {
comp com;
compl com;
}
Compila e executa sem nenhum aviso com g++ -pedantic-errors -std=c++11
.
compl
é uma ortografia alternativa padrão para~
, assim comonot
é uma alternativa para!
.compl
é usado aqui para substituir primeirooperator~
e depois definir um destruidor. Outro truque é queoperator comp
é uma função de conversão do tipocomp
para ele mesmo. Surpreendentemente, o padrão não proíbe tal função de conversão - mas diz que essa função nunca é usada.
function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")
'Output: :)
O que faz:
Nomes de funções, sub e variáveis no VBScript podem ser qualquer coisa se você usar colchetes. Esse script cria uma função chamada
:(
e um argumento,"):"
mas como eles não seguem a convenção de nomenclatura normal, eles são cercados por colchetes. O valor de retorno é definido como o valor do parâmetro. Um cólon adicional é usado para colocar tudo em uma linha. A instrução Msgbox obtém uma referência à função (mas não precisa dos colchetes) e a chama com um smiley:)
como parâmetro.
Na verdade, eu peguei por engano fazer exatamente isso :)
public static object Crash(int i)
{
if (i > 0)
return i + 1;
else
return new ArgumentOutOfRangeException("i");
}
public static void Main()
{
Crash(-1);
}
jogue , não volte .
enum derp
{
public static void main(String[] a)
{
System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
}
}
E como isso funciona:
Primeiro, você acha que o Enum não é válido, mas é válido; então você acha que ele imprimirá atributos padrão de objetos Point, mas Gotcha! devido a como o Snakeyaml serializa, você obtém um erro suave do StackOverFLow
E um outro:
enum derp
{
;public static void main(String[] a)
{
main(a);
}
static int x = 1;
static
{
System.exit(x);
}
}
você acha que um Stackoverflow ocorrerá devido à recursão óbvia, mas o programa abusa do fato de que quando você o executa, ele
static{} block
será executado primeiro e devido ao fato de ele sair antes do carregamento principal ()
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;
}
este se baseia no
/*Error*/
código comentado como ponto de fechamento do comentário aberto antes do ab = 0; a explicação sobre o número inteiro ab a 0x000d oculta a nova linha para ativar o comentário da próxima linha
enum{
, em vez de class{
salva um byte então
Strings e matrizes em c podem ser bastante confusas
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);
}