Tu tarea es simple. Escriba un programa que obviamente debería producir un error a primera vista cuando se compila o ejecuta, pero no lo hace o produce algún otro error no relacionado. Este es un concurso de popularidad, así que sé creativo.
Tu tarea es simple. Escriba un programa que obviamente debería producir un error a primera vista cuando se compila o ejecuta, pero no lo hace o produce algún otro error no relacionado. Este es un concurso de popularidad, así que sé creativo.
Respuestas:
Asegúrese de compilar el siguiente código en el modo de conformidad estándar (por ejemplo, para g ++ use el indicador -ansi):
int main()
{
// why doesn't the following line give a type mismatch error??/
return "success!";
}
Cómo funciona:
El ?? / es una secuencia trigráfica que se traduce en una barra diagonal inversa que escapa a la siguiente línea nueva, por lo que la siguiente línea sigue siendo parte del comentario y, por lo tanto, no generará un error de sintaxis. Tenga en cuenta que en C ++, omitir el retorno
main
está bien definido y es equivalente a devolver 0, lo que indica una ejecución exitosa.
Siempre fanático de este.
x = x
No se NameError
. x es ahora nil
.
Esto es solo una "característica" de Ruby :-)
Aquí hay uno más mundano que me tiene 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 que ver aquí".
Es elsif , no elseif . (¡y ciertamente no es elif - ay del programador de Python (yo)!) Así que para el intérprete elseif parece una llamada de método normal, y como no ingresamos el bloque x <0, vamos directamente a otra cosa y No plantees una excepción. Este error es increíblemente obvio en cualquier entorno de resaltado de sintaxis, afortunadamente (?) El código golf no es tal entorno.
Código bastante normal aquí ...
void main() = main--;
Es Haskell, no C. Define una función llamada "vacío" que toma dos argumentos. El primero se llama "main" y si el segundo (sin nombre) es una tupla vacía, devuelve la variable "main". "-" comienza un comentario en Haskell, por lo que el ";" está comentado
var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');
Así es como funciona:
El primero
a
es en realidad unа
(es decir, Cryllic Unicode "a").
Cuando estaba proporcionando el siguiente código, muchas veces me dijeron "¡Debe ser un error tipográfico! ¿Cómo puede funcionar?" .
console.log( 42..toString(2) );
La descripción a continuación se copió exactamente de uno de los casos recientes .
Como probablemente sepa, en JavaScript todo, excepto los literales, es un objeto. Los números también son objetos. Entonces, teóricamente (y prácticamente), puede obtener propiedades o métodos de llamada de cualquier no literal a través de la notación de puntos, como lo hace
'string'.length
o[1,2,3].pop()
. En el caso de los números, puede hacer lo mismo, pero debe tener en cuenta que después de un solo punto, el analizador buscará una parte fraccionaria del número que espera un valor flotante (como en123.45
). Si utiliza un número entero que debe "decir" al analizador que una parte fraccionaria está vacía, el establecimiento de un punto extra antes de abordar una propiedad:123..method()
.
422
..
notación, pero completamente desorientado con respecto a la .toString(a freaking argument here?)
notación: P Oh, bueno, ya lo descubrí :)
..
Es la 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
Puede esperar que el script no produzca ningún error, ya que sale después del primer comando. No lo hace.
Puede esperar los típicos mensajes de error causados por una bomba tenedor en curso debido al for
bucle. No hay bomba tenedor.
Puede esperar que bash se queje del maybe
comando faltante o de todo el error de sintaxis dentro del if
bloque. No lo hará.
El único mensaje de error que puede producir el script termina en 2: No such file or directory
.
[
no es especial para bash, por lo que< 2
realiza, como de costumbre, la redirección. A menos que haya un archivo con nombre2
en el directorio actual, esto causará un error.
Debido a ese error anterior, el comando anterior
&&
tendrá un estado de salida distinto de cero yexit
no se ejecutará.
El
for
bucle no es infinito. De hecho, no hay bucle en absoluto. Como bash no puede calcular la potencia número 64 de 2, el resultado de la expresión aritmética es0
.
[[ false ]]
prueba sifalse
es una cadena nula. No lo es, así que estewhile
ciclo es infinito.
Debido a lo anterior, la
if
declaración nunca se ejecuta, por lo que no se detectan errores.
use strict;
use warnings;
Syntax error!
exit 0;
Fuente y explicación: https://stackoverflow.com/questions/11695110
class Gotcha {
public static void main(String... args) {
try {
main();
} finally {
main();
}
}
}
Ninguna pila se desborda aquí; superar.
A primera vista, esto debería producir un
StackOverflowError
, ¡pero no lo hace! En realidad, solo funciona para siempre (al menos para todos los fines prácticos; técnicamente terminaría después de un tiempo muchos órdenes de magnitud más largos que la edad del universo). Si quieres saber cómo / por qué funciona esto, mira esto . Además, si se pregunta por qué podemos llamarmain()
sin argumentos cuando el método principal generalmente necesitaría unString[]
argumento: es porque aquí lo hemos declarado como argumento variable, lo cual es perfectamente válido.
What? No error? Yep, this code does not have any bugs, why would it?
?
seguido de un espacio es un operador que llama a una función, pero solo si existe. JavaScript no tiene una función llamadaWhat
, por lo tanto, la función no se llama y sus argumentos simplemente se ignoran. Las otras palabras en el código son llamadas a funciones que en realidad no se llaman, porque laWhat
función no existe. Al final,?
es operador de existencia, ya que no se utiliza en la función de llamada. Otros enders de oración, tales como.
o!
no funcionarían, como.
es para los métodos, y!
no son operadores (que no pueden usarse después de un identificador). Para leer cómo CoffeeScript convirtió esto a JavaScript, visite http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20this%20code%20does%20not%20have%20any%20bugs%2C % 20why% 20it% 20would% 3F .
El &
operador en VBScript es la concatenación de cadenas, pero ¿qué demonios son los operadores &&
y &&&
? (Recuerde que el operador "y" en VBScript es And
, no &&
).
x = 10&987&&654&&&321
Ese fragmento de programa es VBScript legal. ¿Por qué? ¿Y cuál es el valor de x
?
El lexer rompe esto como
x = 10 & 987 & &654& & &321
. Un literal entero que comienza con&
es, curiosamente, un literal octal. Un literal octal que termina con&
es, aún más extrañamente, un entero largo. Por lo que el valor de x es la concatenación de los valores decimales de las cuatro enteros:10987428209
.
No es gran cosa, pero me ha sorprendido al intentar poner un enlace dentro de un comentario:
http://www.google.com
return 42;
http es una etiqueta de código aquí, tales etiquetas se usan en las instrucciones de ir a
//
comentarios.
class Foo
{
static void Main(string[] args)
{
Bar();
}
static IEnumerable<object> Bar()
{
throw new Exception("I am invincible!");
yield break;
}
}
Debido a que el
Bar
método hace ayield
, el método no se ejecuta realmente cuando se lo llama, devuelve un enumerador que, cuando se itera, s ejecuta el método.
main=195;
Funciona en plataformas x86, donde 195 es el código de operación para ret. No hace nada,
main
porque main
se ha colocado en el segmento de datos, que no es ejecutable. Sorprendentemente, const int main=195
se no chocar (x86) (pero producirá un estado de salida de basura), porque .rodata
por defecto se pone en el mismo segmento que .text
, por lo que es ejecutable. (¡ const char main[]="1\300\303";
saldrá con éxito! (todavía en x86))
Probablemente demasiado obvio.
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");
}
}
¿Qué?
Lanza un error de sintaxis después
\u000d
.\u000d
es el unicode para una nueva línea. Aunque está comentado, el compilador de Java trata lo que está después de esto como código, ya que ya no está comentado.
varargs
no son varargs;)
\u000d
, usaría una referencia al 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
es una constante intergal, por lo que coincide con laint
sobrecarga estrictamente mejor que laint*
. Aún así, la mayoría de los programadores se hanNULL
asociado con punteros, por lo que se puede esperar una desreferencia de puntero nulo.
NULL
como nullptr
, y las implementaciones que lo hacen (ninguna que yo sepa, pero espero) darán el error de segmentación esperado.
print """""quintuple-quoted strings!"""""
Perfectamente válido, pero la salida es difícil de adivinar. Los primeros 3 "caracteres comienzan una cadena multilínea y los siguientes dos son parte de la cadena. Al final, los tres primeros terminan la cadena y los dos últimos son un literal de cadena vacío que el analizador concatena con la cadena multilínea. .
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...";
}
Cómo funciona:
Hay infinito positivo y negativo en JS, y no hay error al dividir por cero.
NaN
/ Inf
al igual que los valores argebraicos regulares con matemáticas bien definidas en ellos). El hardware FP moderno se puede configurar para operar en ambos sentidos. Agnóstico del lenguaje; Es una pena no saberlo.
Mezclar trigráficos y lambdas sin espacio puede ser bastante confuso y definitivamente parece erróneo para las personas que no son conscientes de los trigrafos:
int main()
{
return??-??(??)()??<return"??/x00FF";??>()??(0??);
}
Cómo funciona:
Algunas secuencias que constan de 3 símbolos, que comienzan con ??, se denominan trigrafos y serán sustituidas por un preprocesador totalmente compatible. Preprocesada, la línea en cuestión tiene el siguiente aspecto: return ~ [] () {return "\ x00FF"; } () [0]; Como se puede ver, esto no es más que una función lambda superflua que devuelve una cadena que consta del carácter 0xFF. El [0] simplemente extrae ese carácter y ~ NO lo anota, por lo que se devuelve 0.
int main(){(([](){})());}
también podría verse bien cuando se activa ...
[](){}
es una función lambda, al igual [](int a){return a+1;}
que una. ([](){})()
llama a esa función, regresando void
si no me equivoco. Todo (([](){})());
se reduce a (void);
, que es una declaración que no hace nada. main
entonces solo devuelve cero, como debería sin una return
declaración.
Private Sub DivByZero()
Dim x() As String
x = Split(vbNullString, ",")
Debug.Print 1 / UBound(x)
End Sub
Dividir una cadena delimitada por comas vacía debería dar una matriz vacía. Debería ser una división obvia por cero error, ¿verdad?
No. Sorprendentemente, cuando se divide cualquier cadena de longitud cero, el tiempo de ejecución le proporciona una matriz con un límite inferior de 0 y un límite superior de -1. El código anterior generará -1.
5..toString();
5 .toString();
Da: 5
Mientras:
5.toString();
Da SyntaxError
Cómo funciona:
JavaScript intenta analizar el punto en un número como un literal de coma flotante
Primera publicación aquí, no estoy seguro de haber recibido esto o no, pero aquí va.
<html>
<head></head>
<body>
<?php $_POST['non-existant'] = $idontexisteither ?>
</body>
</html>
Es un
.html
archivo ...
.html
extensión y su servidor web no está configurado para analizar .html
archivos como PHP?
<?for(;;$e.=$e++)foreach($e::$e()as&$e);
Esta fue la respuesta que di en esta pregunta: Programa de verificación de locura
La idea era hacer un código que produjera errores.
El primer error que pensaremos es un error de sintaxis.
No hay errores de sintaxis ...
Otro sería que la clase / función no existe.
No corre tan lejos ...
Otro sería un tiempo de espera o un desbordamiento de memoria, pero, de nuevo, no llega tan lejos ...
Pruebe el código aquí: http://writecodeonline.com/php/ (elimine <?
al principio para probar).
foreach(e()as&$e);
Es el núcleo de esta solución. e()
es solo para mantener funcionando el verificador de sintaxis y &$e
después de as
eso es lo que causa la falla.
Los usuarios de Visual Basic 6 sabrán que
If Blah Then Foo Bar
es legal, como es
If Blah Then
Foo Bar
End If
Pero que pasa
If Blah Then Foo Bar End If
? Resulta que es legal en VBScript pero no en VB6. ¿Por qué?
Es un error en el analizador; la intención era rechazar esto. Se
End If
suponía que el código que detecta el también verifica si era unaIf
declaración de varias líneas , y no lo hizo. Cuando traté de arreglarlo y envié una versión beta con la solución, cierta organización influyente de noticias de la industria descubrió que tenían esta línea de código en uno de sus programas VBScript y dijeron que le darían una baja calificación a la nueva versión a menos que nosotros no solucionó el error, porque no querían cambiar su código fuente.
Esto me recordó un error que encontré cuando aprendí C. Lamentablemente, la variante original no parece funcionar con un GCC actual, pero este todavía lo hace:
#define ARR_SIZE 1234
int main() {
int i = ARR_SIZE;
int arr[ARR_SIZE];
while(i >= 0) {
(--i)[arr] = 0;
}
i = *(int*)0;
}
Obviamente, esto falla porque desreferenciamos un puntero nulo, ¿verdad?
Incorrecto: en realidad, es un bucle infinito ya que nuestra condición de bucle está desactivada por uno. Debido a la disminución del prefijo,
i
va de 1023 a -1. Esto significa que la asignación sobrescribe no solo todos los elementosarr
, sino también la ubicación de la memoria directamente anterior, que es el lugar dondei
se almacena. Al alcanzar-1
, sei
sobrescribe con0
y, por lo tanto, la condición de bucle se cumple nuevamente ...
Esta fue la variante original I que ya no puedo reproducir:
Lo mismo funcionó con
i
ir hacia arriba desde 0 y estar fuera por uno. El último GCC siempre se almacenai
antesarr
en la memoria; Esto debe haber sido diferente en versiones anteriores (tal vez dependiendo del orden de la declaración). Fue un error real que produje en uno de mis primeros programas de juguetes que trataban con matrices.
Además, esto es obvio si sabes cómo funcionan los punteros en C, pero puede ser sorprendente si no lo haces:
Puede pensar que la asignación a
(--i)[arr]
arroja un error, pero es válida y equivalente aarr[--i]
. Una expresióna[x]
es simplemente azúcar sintáctica para la*(a + x)
cual calcula y desreferencia el puntero al elemento indexado; la adición es, por supuesto, conmutativa y, por lo tanto, 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 qué esto funciona:
Los campos unificados tienen valores predeterminados. En este caso, d es solo 0 . 0/0 = NaN en doble división, y NaN nunca es igual a sí mismo, por lo que el if devuelve falso. Tenga en cuenta que esto no funcionaría si tuviera 0/0 == 0/0 , ya que at sería una división entera 0/0 arrojaría una ArithmeticException .
struct comp {
comp operator compl () { return comp { }; }
operator comp () { return comp { }; }
compl comp () { return; comp { }; }
};
int main() {
comp com;
compl com;
}
Compila y ejecuta sin ninguna advertencia con g++ -pedantic-errors -std=c++11
.
compl
es una ortografía alternativa estándar para~
, al igual quenot
es una alternativa para!
.compl
se usa aquí para anular primerooperator~
y luego definir un destructor. Otro truco es queoperator comp
es una función de conversión del tipocomp
a sí mismo. Sorprendentemente, el estándar no prohíbe dicha función de conversión, pero sí dice que dicha función nunca se usa.
function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")
'Output: :)
Que hace:
Los nombres de funciones, sub y variables en VBScript pueden ser cualquier cosa si usa corchetes. Este script realiza una función llamada
:(
y un argumento,"):"
pero debido a que no siguen la convención de nomenclatura normal, están entre corchetes. El valor de retorno se establece en el valor del parámetro. Se utiliza un colon adicional para obtener todo en una línea. La instrucción Msgbox obtiene una referencia a la función (pero no necesita los corchetes) y la llama con una carita sonriente:)
como parámetro.
En realidad me di cuenta de que estaba haciendo eso por error :)
public static object Crash(int i)
{
if (i > 0)
return i + 1;
else
return new ArgumentOutOfRangeException("i");
}
public static void Main()
{
Crash(-1);
}
tirar , no volver .
enum derp
{
public static void main(String[] a)
{
System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
}
}
Y cómo funciona ese:
Los primeros crees que el Enum no es válido pero es válido; entonces crees que imprimirá un atributo estándar de objetos Point pero ¡Gotcha! debido a cómo Snakeyaml serializa, obtienes un error StackOverFLow suave
Y otro:
enum derp
{
;public static void main(String[] a)
{
main(a);
}
static int x = 1;
static
{
System.exit(x);
}
}
cree que sucederá un Stackoverflow debido a la recurrencia obvia, pero el programa abusa del hecho de que cuando lo ejecuta,
static{} block
se ejecutará primero y debido a que sale antes de que cargue 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;
}
este se basa en ese
/*Error*/
código comentado como punto de cierre para el comentario abierto antes de ab = 0; la explicación sobre el entero ab a 0x000d oculta la nueva línea para activar el comentario de la siguiente línea
enum{
lugar de class{
Las cadenas y las matrices en c pueden 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);
}