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'.lengthou[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 forloop. Não há garfo bomba.
Você pode esperar que o bash reclame sobre o maybecomando ausente ou todo o grupo de erros de sintaxe dentro do ifbloco. 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 nome2no diretório atual, isso causará um erro.
Devido ao erro acima, o comando anterior
&&terá um status de saída diferente de zero eexitnão será executado.
O
forloop 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 essewhileloop é infinito.
Por causa do exposto, a
ifinstruçã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 aWhatfunçã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 Andnã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
Barmé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,
mainporque mainfoi colocado no segmento de dados, que não é executável. Surpreendentemente, const int main=195vai não falhar (no x86) (mas irá produzir um estado de saída de lixo) porque .rodata, por padrão é colocado no mesmo segmento .texte 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.
varargsnã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 aintsobrecarga estritamente melhor que oint*um. Ainda assim, a maioria dos programadores seNULLassociou a ponteiros, portanto, pode ser esperada uma desreferência de ponteiro nulo.
NULLcomo 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/ Infexatamente 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 voidse não me engano. O todo (([](){})());então se resume a (void);, que é uma afirmação que não faz nada. mainentão retorna zero, como deveria sem uma returndeclaraçã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
.htmlarquivo ...
.htmlextensão e seu servidor da Web não está configurado para analisar .htmlarquivos 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 &$edepois 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 Ifdeveria também verificar se era umaIfinstruçã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 ondeiestá armazenado. Ao chegar-1,isobrescreve-se0e, 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
iaumento de 0 e a redução de um. O último GCC sempre armazenaiantesarrna 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 tipocomppara 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{} blockserá 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);
}