Plataforma cruzada ... Desea

8

Escriba un programa que produzca comportamientos diferentes en tantas plataformas diferentes como pueda. Cada plataforma diferente otorga un punto (incluida una plataforma inicial, lo que significa que no puede obtener menos de 1 *). Los mecanismos destinados a determinar la plataforma de destino / ejecución (por ejemplo, a través de declaraciones de compilación de plataforma o API como .NET's Environment.OSVersion.Platform) no deben usarse. La respuesta con la puntuación más alta gana (donde los votos a favor son los desempates).

Por ejemplo, considere el siguiente programa en el lenguaje de Blub: print (1+2). Si este programa se imprimiera 3en cada plataforma en la que se compila y se ejecuta, su puntaje sería 1. Sin embargo, si, por alguna razón, se imprimiera 4en PDP-11, su puntaje sería 2. Etc. Pero lo siguiente C fragmento, por ejemplo, es una entrada no válida: #ifdef WIN32 ... #endif.


Definiciones / detalles:

  • Plataforma distinta: la combinación de a) la arquitectura de hardware b) el sistema operativo y su número de versión PRINCIPAL (por ejemplo, 1.0.0 y 1.1.0 se consideran el mismo sistema operativo)

  • Comportamiento diferente: dos comportamientos son iguales si producen efectos secundarios similares (por ejemplo, crear el mismo archivo con el mismo contenido), o si los efectos secundarios son errores del mismo tipo. Por ejemplo, si un programa falla en dos plataformas distintas, pero el mensaje de seguridad es diferente en estas plataformas, todavía se considera el mismo comportamiento; mientras que un programa que produce un error de división cero en una plataforma y un error de desbordamiento de pila (¿ves lo que hice allí?;) en otra produce un comportamiento diferente.

  • Todos los comportamientos indefinidos se consideran equivalentes.

  • El programa debe invocarse de manera equivalente en todas las plataformas (sin embargo, esto significa que puede pasar los parámetros de la línea de comandos si así lo desea)


* Bueno, supongo que obtendrías cero si tu programa se ejecutara en plataformas cero. Pero um ... Sí, no importa.

Jwosty
fuente
3
¿Debe ejecutarse el programa en el mismo lenguaje de programación en todas las plataformas? por ejemplo, ¿qué sucede si escribo un programa que se imprime 1en Windows y 2en OSX, con el detalle de que lo ejecuto como un script Python en Windows y un programa C en OSX?
Lynn
1
@Mauris sí, el programa debe ejecutarse en el mismo idioma. Además, ahora que lo pienso, generalmente deben tomar los mismos parámetros de línea de comandos (si los hay), por lo que no puede proporcionar diferentes argumentos en diferentes plataformas. Gracias por los grandes rincones hasta ahora chicos :)
Jwosty
1
¿Los navegadores de diferencia cuentan como diferentes plataformas para JavaScript?
Downgoat
44
"comportamiento diferente" puede necesitar una definición más precisa. Por ejemplo, si un programa se bloquea en múltiples plataformas, pero con diferentes errores, ¿ese comportamiento es diferente?
Reto Koradi
1
@ mbomb007 Estoy seguro de que hay un millón de API documentadas para comportarse de manera diferente en diferentes plataformas (que es lo que espero que la mayoría de las soluciones aprovechen), por lo que las respuestas no deberían ser demasiado difíciles de verificar. En cuanto a los que son errores, bueno, quemaremos ese puente cuando lleguemos a él.
Jwosty

Respuestas:

7

C

Lo intentaré con un ejemplo de libro de texto:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char a[] = {1,2,3,4,5,6,7,8};
    if (sizeof(&a) > sizeof(int)) {
        printf("foo %d %d\n", *(int *)a, *(long *)a);
    } else {
        printf("bar %d %d\n", *(int *)a, *(long *)a);
    }
}

Impresiones de plataforma de 64 bits: foo

Impresiones de plataforma de 32 bits: barra

Little Endian Platforms: 67305985

Plataformas Big Endian: 16909060

Entonces hay al menos 4 combinaciones.

Además de eso, algunas plataformas muy antiguas se han intdefinido como 16 bits. Y alguna plataforma se ha longdefinido como 64 bits. Entonces el resultado será diferente también.

C ha sido bastante específico de la plataforma, si cavas lo suficientemente profundo. No es difícil encontrar miles de combinaciones (2 ^ 10 +).

algun usuario
fuente
3
¿No son estos cuatro debido a \nvs \n\ron * nix y windows?
Maltysen
Supongo que es cierto si desvío la salida a un archivo en Linux y lo leo en Windows. Pero no tengo un compilador de Windows C para confirmar eso de forma nativa.
algún usuario
2
printf("\n");se genera \r\nen Windows (la redirección de stdout a un archivo en Windows resultó en un archivo de 2 bytes).
es1024
3

Ensamblado x86 / x64 de 16/32/64 bits, 16 bytes, 4 combinaciones

Código de bytes:

31 C9 41 E2 0A 66 49 41 74 05 0F 00 C0 03 C1 C3

Desmontaje (16 bits):

    xor  cx, cx ;cx=0
    inc  cx     ;cx=1
    loop l1     ;fall through
    dec  cx     ;cx=FFFF
    inc  ecx    ;cx=0000
    je   l1     ;branch taken
    ;...
l1: ret

Desmontaje (32 bits):

    xor  ecx, ecx ;ecx=0
    inc  ecx      ;ecx=1
    loop l1       ;fall through
    dec  cx       ;ecx=0000FFFF
    inc  ecx      ;ecx=00010000
    je   l1       ;branch not taken
    sldt ax       ;detect VMware, VirtualPC, Parallels, etc.
    add  ecx, eax ;conditionally modify ecx
l1: ret

Desmontaje (64 bits):

    xor   ecx, ecx ;rcx=0 (implicit 64-bit zero-extension)
    loopq l1       ;rcx becomes FFFFFFFFFFFFFFFF, branch taken
    ...
l1: ret

Devuelve:
- CX = 0000 en modo de 16 bits;
- ECX = 10000 en modo no virtual de 32 bits;
- ECX = (aleatorio) en modo virtual de 32 bits;
- RCX = FFFFFFFFFFFFFFFF en modo de 64 bits.

Peter Ferrie
fuente