Por favor, explique por que e liste quais idiomas possuem o recurso (mis) implementado Até onde você sabe.
Poste o que você considera um recurso prejudicial, não o que você não gosta.
a = 1/0
- expressão básica, prejudicial. ;-)
Por favor, explique por que e liste quais idiomas possuem o recurso (mis) implementado Até onde você sabe.
Poste o que você considera um recurso prejudicial, não o que você não gosta.
a = 1/0
- expressão básica, prejudicial. ;-)
Respostas:
Informações: http://php.net/manual/en/security.globals.php
Esse é de longe o pior recurso a ser implementado por razões de legibilidade e segurança. Basicamente, todos os parâmetros GET recebidos são transformados em variáveis.
Por exemplo, com este URL: /index.php?value=foobar
Você pode fazer o seguinte:
<?php
echo $value; // return foobar
?>
Quando você está lendo código, é muito confuso saber de onde vem a variável.
Além disso, se o recurso for mal utilizado, pode levar a uma falha de segurança. Aqui está um exemplo de código do php.net que mostra como ele pode ser mal utilizado:
<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
$authorized = true;
}
// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
include "/highly/sensitive/data.php";
}
?>
Permitir Nulo por padrão, o erro de "trilhão" * dólar. Desculpe Tony Hoare. Quase todas as línguas disponíveis no planeta.
* Ajustei a expressão cunhada por Tony Hoare para refletir a perda real nos dias de hoje :-)
MACROS C e C ++. Se eu tiver que ver outro erro do compilador devido a alguém escolher um nome de função padrão para sua macro que estraga meu código, vou gritar. Vamos ver o último ofensor:
#define vector(int) new VARIANT[int];
Aaarg! O que você fez com o meu vetor STL !?
Descoberta por padrão nas instruções de opção C e C ++.
break
declaração, ou alguém adicionar um caso entre dois casos (ou reordená-los), sem perceber que houve um desentendimento entre eles. Não ver qualquer maneira que fallthrough é melhor do que o C # maneira de exigir qualquer uma ruptura ou Goto caso, etc
Conversões implícitas de tipo quando os tipos que estão sendo convertidos não têm relação óbvia. Por exemplo, convertendo um aleatório, não numérico string
em um int
, como no PHP.
explicit
, o que interrompe as conversões implícitas de tipo, mas ainda há problemas.
0
valor aleatório .
goto : apesar de aprovado em casos raros, costuma ser mal utilizado e leva a programas de leitura difícil.
NENHUM
Só porque um recurso é mal utilizado com frequência não o torna prejudicial.
IMHO todo o "é considerado prejudicial" é o Reductio ad Hitlerum de discussões de linguagem de programação.
A maioria, se não todos, dos recursos "prejudiciais" possui, ou teve originalmente, um caso de uso muito válido ou são simplesmente métodos de conveniência em primeiro lugar. Cabe aos desenvolvedores entender os prós e contras e o código em conformidade.
Se suas perguntas deveriam ser algo como "quais recursos de linguagem têm armadilhas comuns ou efeitos colaterais infelizes", minha resposta seria diferente.
[edit] Para ser claro: não quero dizer o uso continuado de métodos obsoletos. Se os desenvolvedores estão depreciando / removendo um recurso, você deve usar a substituição. Refiro-me ao conceito de que uma parte atual da linguagem é considerada prejudicial porque alguns não gostam do que ela encoraja ou do compromisso envolvido em usá-la que muitas pessoas discutem.
A autovivificação (ou outro recurso bind-variable-on- (assign | use)) é o recurso que eu achei que me deu mais erros.
PLEASE
em INTERCAL. Não use o suficiente, reclama. Use demais, reclama.
Embora algumas pessoas discordem do homem ou de várias coisas que ele diz, muito do JavaScript de Douglas Crockford : The Good Parts é basicamente essa pergunta aplicada a JS. Entre as queixas de Crockford:
Escopo global por padrão para tudo (o DC mostra como usar a função / objetos como namespaces e delimitadores de escopo para agrupar isso.)
Declarações como with
, cujo comportamento de falha é definir coisas no espaço de nomes global. (Gah! É como o lema do JS: se você falhar, falhe o máximo possível !)
Comportamento inesperado com o ==
operador, que basicamente exige que você sempre use o ===
operador.
Inserção de ponto e vírgula.
Na verdade, muitos JS devem ser considerados prejudiciais, talvez até toda a linguagem, mas as partes boas são tão boas que até compensam (pelo menos para mim).
Ok, não é realmente um recurso do idioma em si, mas ainda está intimamente relacionado.
De repente, seu aplicativo Flash / Flex para de funcionar e ninguém pode lhe dar a menor idéia do que aconteceu *. Nenhuma mensagem de erro, nenhum rastreamento de pilha, nada. De repente, a transição da tela não acontece (ou acontece de uma maneira completamente errada), ou os botões não reagem mais aos cliques ou as caixas de combinação estão vazias, em vez de serem preenchidas com algumas entradas.
Só esse "recurso" é responsável por vários relatórios de encolher de ombros e por um monte de cabelos grisalhos que eu estou recebendo. -.- Embora não seja desejável exibir uma mensagem enigmática no rosto do usuário, ele pode pelo menos ajudar o desenvolvedor a resolver o problema.
Mas o Flash Player deixa você esfaqueando no escuro, confiando na descrição do usuário (embora o problema possa realmente se originar de um local completamente diferente no código que não tem nada a ver com o que o usuário estava fazendo). Somente se você usar o Debug Player, você receberá a janela pop-up com uma mensagem de erro e um rastreamento de pilha.
No entanto, pode ser bastante interessante assistir a filmes incorporados em flash em determinados sites de notícias e receber mensagens repetidas sobre referências nulas do SWF player incorporado usado. : D
Em C / C ++: essas atribuições também são expressões COMBINADAS COM os operadores de atribuição = e comparação == muito semelhantes. Não é um recurso prejudicial por si só, mas é muito fácil introduzir bugs (às vezes sutis) digitando acidentalmente o operador.
int i = 10;
someCode();
if(i = 5)
{
/* We don't want this block to be executed, but it is */
moreCode();
}
Modificadores de acesso em Java com padrão de linguagem privada de pacote e padrão de convenção de programação privada.
Substituir variáveis indefinidas por uma string vazia em shell sem qualquer aviso: rm -rf $nosuchvar/*
.
${varname:-/dev/null}
pode ser uma solução alternativa ...
A capacidade de girar no sentido anti-horário no LOGO. Wtf, vamos apenas girar 360 - x
graus no sentido horário .
Em Java e em outra linguagem, você pode parar um encadeamento de outro arbitrariamente, sem dar tempo para o encadeamento em que você parou para terminar corretamente. Essa capacidade foi preterida, considerando a enorme quantidade de problemas que isso poderia trazer em quase todas as situações.
Variáveis Variáveis em PHP
Só porque você $can
não significa que você$$should
use strict
) e uma maneira fácil de ativá-lo novamente exatamente nos casos que você deseja ( no strict 'refs'
).
A With
declaração em Delphi vem à mente, embora haja casos em que é útil.
Matrizes no AWK a partir do índice 1 !
car
! : P
No Perl, o contexto escalar versus o contexto da lista pode ser complicado. Existem alguns pontos positivos que tornam certas operações convenientes, mas ocasionalmente você encontra algo terrível, como alterar completamente o significado de um operador (potencialmente a uma distância significativa do código).
sub foo { (1..5) }
my @list = foo(); # (1,2,3,4,5)
my $length = scalar @list; # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)
Isso não está certo.
(Resulta da tentativa de fazer algo que funciona como o operador de faixa regular, para que você possa dizer algo como um loop next if /start_regex/ .. /end_regex/
).
Sintaxe relativa de importação do Python 2.x. Suponha que eu tenha um pacote x.plugins
que adicione suporte para várias outras bibliotecas para x
. E suponha que eu tenha um sqlalchemy
módulo x.plugins
para adicionar suporte ao sqlalchemy x
. O que você acha que acontecerá se eu adicionar a seguinte linha ao sqlalchemy.py?
import sqlalchemy
A resposta é que o módulo tentará se importar. O que essa sintaxe faz é essencialmente impossível importar o pacote sqlalchemy global real. O Python 2.5 adicionou uma maneira de especificar que essa é uma importação relativa:
from . import sqlalchemy
... mas não é até Python 3 que a primeira sintaxe foi eliminada (embora possa ser desativada no Python 2.6+ com from __future__ import absolute_import
).
sun.misc.unsafe é o meu favorito de todos os tempos; a coleção de "precisávamos disso para implementar as coisas, mas realmente não acho que você deva usá-lo".
FORTRAN blocos comuns. Se você cometeu um erro simples, uma parte de um aplicativo pode prejudicar os globais de outra parte.
FORTRAN atribuiu a instrução goto / COBOL alter statement. Código auto-modificável. Perigo, aviso, monstros espaguetes voadores !!
Orientação a objetos (de todas as linguagens estaticamente tipadas). Aposto que esse recurso tem e continuará a custar muito mais do que indicadores nulos. A Orientação a Objetos é boa apenas em uma linguagem de transmissão dinâmica de mensagens . Portanto, ele também deve ser retirado de linguagens dinâmicas como Python (já que ele não usa passagem de mensagens, mas chamada de sub-rotina convencional).
Os desenvolvedores inexperientes dependem da ativação e, portanto, assumem que toda entrada do usuário seja escapada para uso em uma consulta SQL ou dependem da desativação e, portanto, sempre escapam da entrada.
Ao assumir que está ativado e, em seguida, executar o código em um sistema em que não está, ele abre buracos de injeção SQL largos.
Ao assumir que está desabilitado e não está, isso resultará no fato de as barras invertidas serem realmente armazenadas no banco de dados, causando seqüências feias / incorretas.
Também não há uma maneira extremamente simples de lidar com os dois casos - você precisa verificar se está ativado usando get_magic_quotes_gpc()
e depois aplicar stripslashes()
todos os valores nas $_*
matrizes - já que array_map
não é recursivo, você precisa de uma função personalizada para isso.
O recurso de linguagem que permite aos programadores escrever código não comentado ou sem comentários.
saindo um pouco aqui - funções nulas. uma função sempre faz alguma coisa; portanto, ela deve retornar o resultado ou alguma outra informação sobre seu sucesso ou fracasso.
POKE em BASIC ...
Eu teria que dizer coleta de lixo. Ele não elimina a necessidade de pensar em gerenciamento de memória, mas elimina a percepção da necessidade de pensar em gerenciamento de memória, que muitas vezes elimina o pensamento real, e então você obtém enormes recursos e não sabe por quê. Especialmente quando o comportamento dos GCs geracionais modernos pode ser descrito sem muita hipérbole como "um grande vazamento de memória por design" de qualquer maneira.
C e definitivamente C ++: aritmética de ponteiro. Permitir que as pessoas convertam números inteiros em endereços de memória está causando problemas.
E talvez até mesmo acesso bruto a ponteiros?
No C ++, você tem referências que tornam os ponteiros quase completamente desnecessários. Nos demais casos, indicadores inteligentes devem ser considerados obrigatórios.
Java também prova que você pode criar uma linguagem de programação que use ponteiros sem permitir que as pessoas acessem o próprio valor do ponteiro.
Além de null
... mas essa é uma história diferente.
for(int i=0;i<SIZE;++i) ++arr[i]
é mais lento que for(int*i=arr;i<arr+SIZE;++i)*i++
. Tudo o que o java conseguiu provar é que você precisa de ponteiro ou nunca olhou para ele sun.misc.Unsafe
? Se você não precisar de ponteiros, explique como escrever uma função de troca genérica usando Java. (por exemplo, int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). Sem mencionar todos os problemas em c / c ++ que você teria se tivesse que usar referências. Como você chamaria uma função virtual em uma estrutura opaca sem ponteiros?