어떤 언어 기능이 유해한 것으로 간주됩니까? [닫은]


20

제발 이유를 설명 까지 아시다시피 언어는 (잘못) 기능 구현이있는 및 목록입니다.

싫어하는 것이 아니라 유해한 기능을 고려한 내용을 게시하십시오.



2
@sbi 당신은 또한 ... "XMLHttpRequest의 유해 고려"동일한 페이지에서 읽을 수 있습니다
HoLyVieR

1
그들 모두는 기본적인 표현을 제외하고 누군가 또는 다른 사람에 의해 유해한 것으로 간주됩니다.
David Thornley


3
@David Thornley : a = 1/0-기본 표현, 유해합니다. ;-)
Orbling

답변:


37

PHP에서 글로벌 등록

정보 : http://php.net/manual/en/security.globals.php

가독성 및 보안상의 이유로 구현할 수있는 최악의 기능입니다. 기본적으로 수신 된 모든 GET 매개 변수는 변수로 변환됩니다.

예를 들어이 URL : /index.php?value=foobar

다음을 수행 할 수 있습니다.

<?php
echo $value; // return foobar
?>

코드를 읽을 때 변수의 출처를 아는 것은 매우 혼란 스럽습니다.

또한이 기능을 잘못 사용하면 보안 허점으로 이어질 수 있습니다. 다음은 php.net에서 코드를 잘못 사용하는 방법을 보여주는 코드 예제입니다.

<?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";
}
?>

그건 정말 나쁘다. 나는 기본적으로는 전혀 이해하지 의해 그것을 유지하면서 희망을 이해할 수 있지만
TheLQ

14
PHP 4.2 이후 (2000 년까지) 등록 글로벌은 기본적으로 활성화되어 있지 않으며 PHP 5.3 (2009)에서는 더 이상 사용되지 않으며 PHP 6에서는 완전히 제거되지만 사람들 계속 되돌아갑니다. 10 년이 지난 후에도 "OMG 레지스터 글로벌"에

1
Pretty Hopeless PHP
Ming-Tang

@SHiNKiROU이 기능은 더 이상 사용되지 않으며 PHP 6에서 제거 될 것입니다.
HoLyVieR

1
절망적이지는 않지만 다른 언어보다 훨씬 뒤에 있기 때문에 누군가가 그것을 사용하는 유일한 이유는 최근까지 다른 언어보다 저렴한 웹 호스팅을 얻는 것이 훨씬 쉽기 때문입니다.
intuited

22

기본적으로 "조"* 달러의 실수 인 Null을 허용하십시오. 죄송합니다. Tony Hoare. 지구상에서 사용 가능한 거의 모든 언어.

토니 호 아어 설명

* 요즘 실제 손실을 반영하기 위해 Tony Hoare가 만든 표현을 조정했습니다.


이것은 기능이나 실수가 아니라 기능의 부족입니다. 널 입력 불가능한 참조 유형을 갖는 것은 언어에 살짝 빠질 수있는 것이 아닙니다. 많은 생각과 좋은 디자인이 필요하며 컴파일러와 싸우고 싶지 않은 방식으로 수행하기가 매우 어렵습니다. Spec #과 특이점은 얼마나 어려운지를 보여줍니다.
imgx64

@ imgx86, 아니요, 확실히 실수입니다. 널 입력 불가능 참조 유형은 널 (null) 실수에 대한 응답으로 추가되어 일반적으로 널을 허용하는 유형 시스템과의 호환성을 허용하는 기능입니다.
Matt Olenik

@Kyralessa : 아마도 HoLyVieR이 Populist 배지를 받길 원하십니까? :-) 동의합니다. 이와 같이 자신의 답변을 수락하는 것은 말이되지 않습니다.
Macneil

18

C 및 C ++ 매크로. 누군가가 내 코드를 망쳐 놓는 매크로의 표준 함수 이름을 선택하여 다른 컴파일러 오류가 발생하면 비명을 지 릅니다. 마지막으로 문제가되는 것을 보자 :

#define vector(int) new VARIANT[int];

아아 아르! 내 STL 벡터로 무엇을 했습니까!?


네임 스페이스는 타입 정의와 템플릿을 즉시보다 친숙하게 만드는 것 중 하나입니다.
Shog9

4
동의하지만 현대 언어에서만 텍스트 매크로 기능을 대체 할 수 있기 때문입니다. 그들이 발명되었을 때, 컴파일러 기술은 매우 원시적이기 때문에 매크로는 좋은 일이었습니다.
dsimcha

이 매크로를 어디에서 찾았습니까?
rwong

@ dsimcha-나는 이것에 대해 모른다. Lisp 매크로는 오랫동안 사용되어 왔습니다.
Jason Baker

2
@Jason : 여전히 유용하고 멋진 Lisp 스타일의 "실제"AST 매크로를 두드리지 않습니다. 나는 텍스트 수준에서 순전히 작동하고 범위 개념이 없으며, 어리석게 유출되는 추상화와 난독 화 된 코드를 만들 수 있으며 더 현대적인 기능으로 완전히 쓸모 없게 될 수있는 C / C ++ 스타일 매크로 만 싫어합니다. , "실제"매크로입니다.
dsimcha

14

C 및 C ++ 스위치 문에서 기본적으로 오류가 발생했습니다.


18
이것은 내가 작성한 모든 코드에서 항상 유용한 기능입니다. 이것이 어떻게 잘못된 기능입니까?
greyfade

6
@greyfade : break진술 을 잊어 버릴 때까지 또는 누군가 두 사건 사이에 오류가 있음을 알지 못하고 두 사건 사이에 사건을 추가하거나 순서를 다시 지정할 때까지 도움 이됩니다. C # 방식으로 중단 또는 이동 사례를 요구하는 것보다 실패가 더 나은 방법은 없습니다.
Tim Goodman

9
더프의 장치는 당신의 면책에 비웃습니다!
Jesse C. Slicer

3
동의한다. 기본적으로 좋은 기능은 아닙니다.

11
아무도 읽지 않습니까? 그는 DEFAULT가 넘어 졌다고 말했다
Matt Olenik

13

유형 간 변환시 암시 적 유형 변환에 명확한 관계가 없습니다. 예를 들어, PHP와 같이 임의의 숫자 string가 아닌 임의의를로 변환합니다 int.


7
일단 머리를 숙이고 나면 이런 종류의 일이 문제가되지 않습니다. 사용자가 입력 한 값에 대해 중요한 영역에서 검사를 수행하지 않는 경우에만 실제로 문제가되지만 숫자가 될 것이지만 문자열로 나오는 경우 무한히 유용합니다. 예를 들어 DB의 필드는 문자열로 반환 될 가능성이 높으며 캐스팅에 대해 걱정하지 않아도됩니다.
Tarka

2
@ 슬로 쿤 : 더 좋은 예를 생각해 낼 수 있습니까? 문자열 유형을 사용하여 db에 정수 값을 저장하는 이유는 무엇입니까?
Steven Evers

@SnOrfus URL에 입력 된 숫자, 사용자 입력, 함수 및 비 정적 유형 언어에 일반적으로 사용되는 숫자 얻기.
TheLQ

인용 된 문자열의 값이 포인터로 정수로 변환 될 수 있기 때문에 C에서 문제가되며, 이는 올바르게 컴파일되지만 의미가없는 것처럼 보이는 구문을 만들 수 있습니다. C ++에서는 키워드를 사용하여 explicit암시 적 유형 변환을 중지 하는 변환 함수를 정의 할 수 있지만 여전히 문제가 있습니다.
David Thornley

@ TheLQ : 사용자 입력 인 경우 숫자인지 확인하기 위해 유효성을 검사해야합니다. @Slokun처럼 말했다. 파일에서 데이터를 읽는 경우 숫자 데이터가 예상되는 위치에있을 것으로 예상 할 수 있지만 디스크 손상의 경우 예외가 발생하는 것이 0특정 값에 임의의 값을 갖는 것보다 낫습니다 .
intuited

12

goto : 드물지만 괜찮지 만 잘못 사용되어 프로그램을 읽기가 어렵습니다.


그렇습니다 xkcd.com/292
TheLQ

3
나는 goto의 신중한 사용을 허용함으로써 프로그램이 3 백만 줄의 코드로부터 저장되는 것과 반대되는 것을 보았다.
Dave

2
아, 쌍곡선 .. 유효한 문학적 기술.
Robert Harvey

11

없음

기능이 자주 오용 되더라도 유해하지는 않습니다.

IMHO 전체는 "유해한 것으로 간주된다"는 프로그래밍 언어 토론 의 Reductio ad Hitlerum 입니다.

전부는 아니지만 대부분의 "유해한"기능은 매우 유효한 사용 사례를 갖거나 원래 가지고 있거나 단순히 편리한 방법입니다. 이에 따라 장단점을 이해하는 것은 개발자의 몫입니다.

귀하의 질문이 "어떤 언어 기능에 일반적인 함정이나 불행한 부작용이 있는가"라는 문구를 따라야한다면 제 답변은 다를 것입니다.

[편집] 명확하게 : 나는 더 이상 사용되지 않는 방법을 계속 사용한다는 의미는 아닙니다. 개발자가 기능을 감가 상각 / 제거하는 경우 대체를 사용해야합니다. 나는 언어의 현재 부분이 해로운 것으로 간주된다는 개념을 언급하고 있는데, 그 이유는 일부 사람들이 권장하는 것을 좋아하지 않거나 많은 사람들이 논의하는 언어 사용과 관련된 상충 관계 때문입니다.


13
나는 반론의 좋은 예가 나의 대답이다. PHP 등록 전역은 단지 나빴습니다. 이것이 더 이상 사용되지 않으며 이전 버전의 PHP에서는 사용하지 않는 것이 좋습니다.
HoLyVieR

5
+1 틀린 손을 대면 모든 언어 구성이 해 롭습니다.
mouviciel

5
좋은 지적 ... 고 토스의 95 %가 나쁘더라도, 그 기능 자체는 다른 5 %에 ​​대해 가치가 있습니다
eds

1
이젝터 시트 버튼을 라디오 켜기 / 끄기 버튼 옆에 두는 것과 비슷하다고 생각합니다. 기능 자체는 나쁘지 않지만 실수로 사용하여 피해를 방지하지는 않습니다.
LennyProgrammers

1
나는 이것이 "총은 사람을 죽이지 말고 사람들은 죽인다"와 같은 프로그래밍이라고 생각합니다.
Orb

7

Autovivification (또는 다른 bind-variable-on- (assign | use) 기능)은 내가 가장 많은 버그를 발견 한 기능입니다.


+1-우리는 이터레이터 설탕에 동의하지 않을 수도 있지만 이것은 100 %에 동의 할 수있는 것입니다.
ChaosPandion

7

PLEASEINTERCAL에서 그것을 충분히 사용하지 않으면 불평합니다. 너무 많이 사용하면 불평합니다.


2
그 언어는 진지하게 사용되어서는 안됩니다. 그것은 매우 '독특한'프로그래밍 언어로 만들어 졌기 때문에 이해가되지 않는 것들로 가득합니다 (예 : 내 생각에 나오는 것).
ShdNx

4
나는 그것이 명백 할 것이라고 생각했지만, 그렇습니다, 나는 그것이 심각한 언어가 아니라는 것을 알고 있습니다.
Alan Pearce

2
죄송합니다. 여기 사람들이 너무 진지합니다.
Mark C

1
지난주 위키 백과에서이 언어를 발견했고 얼마나 인기가 있었는지 (그리고 여전히 O_O 임) 날아갔습니다.
Oliver Weiler

많은 "도전"언어가 있으며 코더는 체이스에 대한 사랑 때문에 일을하는 경향이 있기 때문에 항상 인기가 있습니다. 또한 의도적으로 둔하고 생각을 자극하며 힘들 기 때문에 인터뷰 질문에 매우 인기가 있습니다.
1

7

일부 사람들은 그가 말하는 사람이나 다양한 말에 동의하지 않지만 많은 Douglas Crockford의 JavaScript : The Good Parts 는 기본적으로 JS에 적용되는 질문입니다. Crockford의 불만 중 :

  • 기본적으로 모든 범위에 대한 전역 범위 (DC는 함수 / 객체를 네임 스페이스 및 범위 구분자로 사용하여이를 묶는 방법을 보여줍니다.)

  • with글로벌 네임 스페이스에서 사물을 정의하는 데 실패한 동작 과 같은 명령문 (Gah! JS 모토는 실패하면 가능한 한 열심히 실패하는 것과 같습니다 !)

  • ==연산자의 예기치 않은 동작으로 , 기본적으로 항상 ===연산자를 사용해야합니다 .

  • 세미콜론 삽입

실제로 많은 JS가 해로운 것으로 간주되어야 할 것입니다. 심지어 전체 언어 일 수도 있지만, 좋은 부분은 너무나 대담하여 그것을 보완합니다 (적어도 나를 위해).


6

Flash Player에서 기본 동작으로 "자동 실패"

실제로 언어 자체의 기능은 아니지만 여전히 밀접한 관련이 있습니다.

갑자기 Flash / Flex 응용 프로그램이 작동을 멈추고 아무도 f *가 발생했는지에 대한 힌트를 줄 수 없습니다. 오류 메시지 없음, 스택 추적 없음, 아무것도 없음. 갑자기 화면 전환이 발생하지 않거나 완전히 잘못된 방식으로 발생하거나 버튼이 더 이상 클릭에 반응하지 않거나 콤보 상자가 일부 항목으로 채워지는 대신 비어 있습니다.

그 "기능"만으로도 몇 가지 어깨를 으 reports 보고서 와 내가 얻은 많은 흰머리가 있습니다. -.- 사용자의 얼굴에 암호 메시지를 표시하는 것은 바람직하지 않지만 개발자가 문제를 해결하는 데 도움이 될 수 있습니다.

그러나 Flash Player는 사용자의 설명에 의존하여 어둠 속에서 찌르는 것을 남겨 둡니다 (문제는 실제로 사용자의 작업과 관련이없는 코드의 완전히 다른 위치에서 발생할 수 있음). 디버그 플레이어를 사용하는 경우에만 실제로 오류 메시지와 스택 추적이 포함 된 팝업 창이 나타납니다.

그러나 특정 뉴스 사이트에서 플래시 임베디드 영화를보고 사용 된 임베디드 플레이어 SWF에서 Null 참조에 대한 메시지를 반복해서받는 것이 매우 흥미로울 수 있습니다. :디


iPhone 앱은 때때로 이상한 타이밍에 경고없이 충돌합니다
Ming-Tang

3
무엇이든 조용히 실패하는 것은 꽤 비참합니다.

6

C / C ++에서 :이 할당은 또한 매우 유사한 할당 = 및 비교 == 연산자와 결합 된 표현식입니다. 그 자체로는 유해한 기능은 아니지만 실수로 작업자를 잘못 공격하여 버그를 쉽게 도입 할 수 있습니다 (때로는 미묘한).

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

... 정수 또는 포인터가 유효한 조건이라는 사실과 결합되었습니다.
barjak

5

패키지 개인 언어 기본값 및 개인 프로그래밍 규칙 기본값으로 Java의 수정 자에 액세스하십시오.


5

어떤 경고없이 쉘에서 빈 문자열로 정의되지 않은 변수를 교체 : rm -rf $nosuchvar/*.


아아 +1
LOL-

@와 같은 ${varname:-/dev/null}것을 해결하는 것이 해결 방법이 될 수 있습니다 ...
duros

잘 사용하기 전에 항상 변수의 존재와 내용을 방어 적으로 점검 할 필요성을 보여줍니다.
Orbling

4

로고에서 시계 반대 방향으로 돌리는 기능. Wtf, 시계 방향으로 돌리십시오 360 - x.


LOGO를 사용한 지 오래되었습니다. 이것이 왜 해로운가요?
메이슨 휠러

5
로고는 실제 물리적 거북 로봇을 제어하는 ​​데 사용할 수 있습니다. 때로는 거북이가 특정 방향으로 돌리거나 두 번 이상 돌리기 를 원할 때가 있습니다 . 예를 들어 춤을 추도록 프로그래밍하고있을 수 있습니다.
Daniel Cassidy

@Mason, 농담 이었어요.
jjnguy

3
예, 특히 LOGO For Clocks에서.
intuited

1
나는 로고를 좋아하고 ( programmers.stackexchange.com/questions/21028/… 참조 ) 특히 젊은이들에게 훌륭한 교수 언어입니다. 내가 11이라고 말하고 처음으로 로고를 사용했을 때 대부분의 수업은 많은 기하학을 알지 못했지만 90 도는 1/4 회전이며 왼쪽에서 왼쪽으로 알려졌다. 따라서 부정적인 기능이 아닙니다. 나누기 연산자 대신에 역수를 곱하지 않는 이유와 같습니다. 네, 농담 인 것 같습니다.
1

4

다른 스레드에서 스레드 중지

Java 및 다른 언어에서는 중지 한 스레드에 대한 시간을 제공하지 않고 다른 스레드에서 스레드를 임의로 중지 할 수 있습니다. 거의 모든 상황에서 발생할 수있는 엄청난 양의 문제를 고려하면 이 기능은 더 이상 사용되지 않습니다 .


이것이 해로울 있다고 생각하지만 매우 유용한 경우가 있습니다 (예 : 단일 스테핑 및 중단 점을 지원하는 디버거).
Jerry Coffin

1
@Jerry Debugging은 완전히 다른 것입니다. 프로세스를 멈추지 않고 일시 중지합니다.
HoLyVieR

오히려 반대로 스레드를 중지합니다. 분명히, 당신은 스레드를 멈추는 것이 아니라 스레드 를 죽이는 것에 대해 이야기 하고 있습니다. 그것은 정당화하기가 조금 더 어렵다 ...
Jerry Coffin

그래도 이것이 반드시 언어 기능이라고 생각하지는 않습니다. 더 표준적인 라이브러리입니다.
Jason Baker

4

PHP의 변수 변수

당신 $can이 당신을 의미하지 않기 때문에$$should


1
평소와 같이 Perl ...에는 (잠재적으로 위험한) 기능이 있으며,이를 끄는 가장 use strict쉬운 방법 ( )과 원하는 경우에 다시 켜는 쉬운 방법이 있습니다 ( no strict 'refs').

1
동적 변수 이름을 사용하는 것을 찾지 못했습니다. 그리고 내가 한 유일한 시간, 코드를 읽을 수없는 몇 개월 후 코드를 읽을 수없고 WTF 순간을 만들었습니다.
TheLQ

음, 응용 프로그램에는 다른 사람들의 독창적 인 패키지 변수 또는 기호 테이블 (일명 다른 것으로 가정)과의 메타 프로그래밍이 포함됩니다.

1
@ 조 변수 변수가 솔루션을 더 명확하게 만드는 한 가지 예 를 보여달라고 도전합니다 .
켄달 홉킨스

1
주석은 농담 으로 의도되었지만 죄송합니다.하지만 명확하지는 않지만 변수 변수가 솔루션을 더 명확하게 만드는 가장 좋은 예는 여기에 있습니다 . 나는 그것이 오히려 나쁜 예라는 것을 인정할 것이다.
Joe D

3

With유용한 경우가 있지만 델파이 의 진술이 떠 오릅니다.


좋은 사례가 나는 나사로 델파이에서 뭔가를 포팅 할 때 내 TControl의 자손은 제어 크기를 참조하는 "캔버스가 할 함께 ... 폭, 높이"에 들어있는이 잘못 컴파일 된 코드에지도 그래서 나사로 TCanvas와는 폭과 델파이 자신이 있었다
Maksee


2

Perl에서 스칼라 컨텍스트와 목록 컨텍스트 는 까다로울 수 있습니다. 특정 작업을 편리하게 수행 할 수있는 좋은 점이 있지만 때로는 연산자의 의미를 완전히 변경하는 것 (잠재적으로 코드에서 멀리 떨어져 있음) 과 같은 끔찍한 일이 발생할 수 있습니다.

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)

그건 옳지 않아

(정규 범위 연산자와 같은 역할을하는 무언가를 만들려고하면 루프와 같은 것을 말할 수 있습니다 next if /start_regex/ .. /end_regex/).


너무 혼란스러운 남자 . Perl을 배우는 것에 관한 최악의 일은 그 주위에 내 머리를 갖기 위해 노력하고있었습니다.
glenatron

나는 항상 여러 가지 방법으로 함수를 반환 할 수있는 것이 편리한 것이라고 생각했습니다.
Orb

2

Python 2.x의 상대적 가져 오기 구문. 에 x.plugins대한 다양한 다른 라이브러리에 대한 지원을 추가 하는 패키지 가 있다고 가정 합니다 x. 그리고 sqlalchemy모듈에 x.pluginssqlalchemy 지원을 추가 할 수 있다고 가정 합니다 x. sqlalchemy.py에 다음 줄을 추가하면 어떻게 될까요?

import sqlalchemy

답은 모듈이 스스로 가져 오기를 시도한다는 것입니다. 이 구문은 실제 글로벌 sqlalchemy 패키지를 가져 오는 것을 불가능하게합니다. Python 2.5는 이것이 상대적 가져 오기임을 지정하는 방법을 추가했습니다.

from . import sqlalchemy

...하지만 첫 번째 구문이 실제로 제거 된 것은 Python 3 이전이 아닙니다 (Python 2.6 이상에서는 비활성화 할 수는 있지만 from __future__ import absolute_import).


1

sun.misc.unsafe 는 내가 가장 좋아하는 것입니다. "우리는 이것을 구현하기 위해 이것이 필요했지만 실제로는 그것을 사용해야한다고 생각하지 않습니다."


7
모든 좋은 언어 표준 라이브러리에 안전하지 않은 패키지 있어야합니다. 이 패키지를 가져 오면 낮은 수준의 이식 불가능한 작업을 수행하려는 의도가 명확하게 나타납니다. 대안은 다음과 같습니다. 1- 언어 자체의 안전하지 않은 기능 (예 : C ++) 및 2- 저수준 작업 (예 : Python 및 Ruby)에 C와 같은 다른 언어를 사용해야합니다. 안전하지 않은 패키지 접근 방식이 훨씬 나아 보입니다.
imgx64

1

FORTRAN 공통 블록. 간단한 실수를 한 경우 응용 프로그램의 한 부분이 다른 부분의 전역을 방해 할 수 있습니다.

FORTRAN에 지정된 goto 문 / COBOL alter 문 자체 수정 코드. 위험, 경고, 비행 스파게티 몬스터 !!


FORTRAN에 ALTER 문이 없습니다. FORTRAN에는 GOTO가 지정된 ASSIGN 문이 있습니다. COBOL은 비슷한 목적을 가진 ALTER 문을 가지고있었습니다.
John R. Strohm

@ 존-감사합니다. 할당 / 변경에 대한 기억은 희미합니다.
Stephen C

1

객체 지향 (정적으로 형식화 된 모든 언어에서) 이 기능은 널 포인터보다 훨씬 많은 비용이 들며 앞으로도 계속 될 것 입니다. 객체 방향은 동적 메시지 전달 에서만 유효합니다. 언어 합니다. 따라서 파이썬과 같은 동적 언어에서도 삭제해야합니다 (메시지 전달을 사용하지 않고 기존의 서브 루틴 호출이기 때문에).


파이썬은 스몰 토크의 메시지 전달 관용구를 (모든 의도와 목적으로) 지원합니다. 그것은 단지 그런 식으로 명명되지 않았습니다. 두 번째로, 그러한 널리 퍼져있는 언어 기능을 해로운 것으로 부르는 것은 적어도 논쟁의 여지가 있다고 생각합니다.
Jason Baker

객체 지향은 여전히 ​​코드 재사용 및 코드 / 데이터 캡슐화를 향상시킵니다. 기능의 정적 / 동적 사용에 관계없이
Orb

@Orbling : 무엇에 비해? 제 생각에 기능적 프로그래밍 언어는 코드 재사용이 높으며 Haskell의 모듈 시스템은 코드 / 데이터 캡슐화에 매우 좋습니다.
LennyProgrammers

@ Lenny222 표준 명령형 프로그래밍과 비교됩니다. 나도 기능적인 접근 방식을 선호한다. Haskell은 내가 선호하는 언어이다.
Orbling

@ 제이슨 베이커 : 확실히 논쟁의 여지가 있지만, 매우 널리 퍼져있는 것이 정확하게 해 롭습니다! OP는 내 의견을 물었고 나는 그것을 주었다. 벼랑의 많은 Lemmings 점프가 행동을 제정신으로 만들지 않기 때문에. 이 경우 수학적으로 OOP가 작동하지 않는다는 것이 입증되었으며 올바른 패러다임이 잘 받아 들여졌습니다. 범주 이론은 추상화를 표현하는 방법입니다 (실제로는 추상화 이론 임)
Yttrill

1

magic_quotesPHP에서 .

경험이없는 개발자는이를 사용 가능하게하여 SQL 조회에 사용하기 위해 모든 사용자 입력을 이탈한다고 가정하거나 사용 불가능하게하여 항상 입력을 이탈합니다.

코드가 활성화되었다고 가정하고 그렇지 않은 시스템에서 코드를 실행하면 넓은 SQL 주입 구멍이 벌어집니다.

비활성화되어 있고 그렇지 않다고 가정하면 실제로 백 슬래시가 DB에 저장되어 못생긴 / 잘못된 문자열이 발생합니다.

두 경우 모두를 처리하는 매우 간단한 방법은 없습니다. 사용 여부를 확인한 get_magic_quotes_gpc()다음 배열의 stripslashes()모든 값에 적용 해야합니다. 재귀 적이 지 않으므로 사용자 정의 함수가 필요합니다.$_*array_map


또는 매개 변수화 된 쿼리를 사용할 수도 있습니다.
Pieter B

그럼에도 불구하고 마법 따옴표가 활성화되어 있고 예상하지 않으면 백 슬래시가 나타납니다.
ThiefMaster

-3

프로그래머가 주석이 없거나 의미가없는 주석 코드를 작성할 수있는 언어 기능입니다.


1
그리고 이것을 고치는 방법?
마니에로

1
@bigown : 주석 또는 다이 기능을 구현하여 : D.
tia

3
이것을 Literate Programming이라고합니다. en.wikipedia.org/wiki/Literate_programming
Barry Brown

2
이것은 기능이 아니지만 사용자 프런트 엔드에서 매우 유명한 버그이며 대부분의 사람들은 라틴어 이름 인 Homo Sapiens로 알고 있습니다.
Joe D

-3

무효 기능-여기 사지에 약간 외출. 함수는 항상 무언가를 수행하므로 결과 또는 성공 또는 실패에 관한 다른 정보를 반환해야합니다.


3
파스칼에는 함수 (리턴 값)뿐만 아니라 프로 시저 (리턴 값 없음)가있었습니다.
Jon Onstott

함수는 항상 무언가를합니다 (보통 자리 표시 자 함수는 누구입니까?) .
1

-4

베이직 포크 ...


7
POKE는 대단했습니다.
Shog9

2
초기에는 찌르기가 기본적으로 특정 일을 달성 할 수있는 유일한 합리적인 방법이었습니다. 애플의 음악] [생각 나게한다 ...
Bill

2
내가 올바르게 기억한다면 Commodore 64에서 POKE 없이는 많은 것을 할 수 없었습니다.
MetalMikester

1
PEEK를 모두 잊지 마십시오.
1

-5

가비지 콜렉션을 말해야합니다. 메모리 관리에 대해 생각할 필요가 없지만 메모리 관리에 대한 생각이 필요하지 않습니다. 메모리 관리에 대한 생각이 너무 자주 없어져서 엄청난 자원이 낭비되고 그 이유를 모릅니다. 특히 현대 세대 GC의 동작이 너무 과장되지 않고 "설계 상 하나의 큰 메모리 누수"로 설명 될 수있을 때.


2
어떤 컬렉션에서 어딘가에 참고 문헌이 있다면 다른 문제가 있습니다.
Chinmay Kanchi

2
gc'ed 언어가 약한 참조가 이유 :)입니다
Chinmay Kanchi

4
GC는 확실히 강점과 약점을 모두 가지고 있지만, 나는 Mason이 이것보다 잘못보다 훨씬 더 옳다고 말해야 할 것입니다. 사실, 나는 GC를 사용하는 사람들이 메모리 관리 에 많은 시간을 소비하는 것을 보았습니다. 왜냐하면 그들은 실제로 계획을 세우는 대신에 물건을 해킹하려고 시도했기 때문입니다. GC는 또한 일반적으로 결정 론적 파괴를 방지하므로 메모리 이외의 모든 리소스를 관리하는 추가 작업이 필요합니다.
Jerry Coffin

3
@ChaosPandion : 현대 멀티 태스킹 머신에서 페이징이 시스템 성능을 손상시키지 않도록 메모리를 최대한 빨리 해제해야한다고 생각한다면 정말 바보입니까? 어떤 GC도 그 결과를 달성 할 수 없었으며, 실제로 가장 현대적이고 다양한 것으로 여겨지는 세대 별 가비지 수집기는 정반대입니다. 최고의 성능을 위해서는 출시해야합니다. 가능한 한 늦게 메모리 . 다른 프로그램의 속도를 늦출 때가 아니라 어떤 직업에도 적합한 도구라고 생각하지 않습니다. 내가 바보 야?
메이슨 휠러

2
@Barry : 프로그램 내에서 결정적입니다. 5KB의 메모리 블록을 다 사용한 후 곧 5KB를 다시 요청하면 어떻게됩니까? 가비지 수집 시스템에서는 GC가 중간에 실행되지 않는 한 완벽하게 양호한 블록이 사용되지 않더라도 새로운 5KB 블록을 요청해야합니다.이 경우 이전 블록을 재활용 할 수 있습니다. malloc과 무료를 사용하면 항상 이전 블록을 재활용 할 수 있습니다. 이것을 몇 십만 곱하면 실제 문제가됩니다.
메이슨 휠러

-5

C, 그리고 확실히 C ++ : 포인터 산술. 사람들이 정수를 메모리 주소로 변환하도록 허용하는 것은 문제를 요구합니다.

그리고 아마도 포인터에 대한 원시 액세스조차 가능합니까?

C ++에는 포인터를 거의 불필요하게 만드는 참조가 있습니다. 나머지 경우 스마트 포인터는 필수로 간주해야합니다.

자바는 또한 당신이 할 수 있음을 증명합니다 사람들이 포인터 값 자체에 액세스하지 않고도 포인터를 사용하는 프로그래밍 언어를 만들 합니다.

그 외에도 null...하지만 다른 이야기입니다.


5
때때로 제대로 사용하기 어려운 포인터는 수많은 효율적인 메모리 작업을 위해 매우 필요합니다.
Bill

1
참된. 그러나 사람들이 정수를 메모리 참조로 정기적으로 변환하거나 숫자를 메모리 주소에 추가하는 것은 요즘 제 생각에 해 롭습니다. C ++에는 완벽하게 좋은 대안으로 참조가 있으며 포인터가 필요할 때 스마트 포인터 / 자동 포인터가 있습니다.
Asgeir S. Nilsen

4
이 답변은 포인터를 숨기도록 구성된 소프트웨어 스택에서 작업하는 경우 에만 유효합니다. 에서 모든 다른 경우,이 대답은 잘못된 것입니다.
Paul Nathan

3
일부 프로그래밍 언어에는 포인터를 사용할 수 있어야하므로 다른 프로그래밍 언어에 대한 모든 운영 체제 및 가상 머신을 작성할 수 있습니다.

2
-1. ptr 산술이 필요한 이유가 있습니다. 점을 반복하는 것이 인덱싱보다 빠릅니다. for(int i=0;i<SIZE;++i) ++arr[i]보다 느립니다 for(int*i=arr;i<arr+SIZE;++i)*i++. 입증 된 모든 Java는 포인터가 필요하거나 보지 않았다는 것입니다 sun.misc.Unsafe. 포인터가 필요하지 않은 경우 Java를 사용하여 일반 스왑 함수를 작성하는 방법을 설명하십시오. (예 : int a = 1, b = 2; swap (a, b); assert (a == 2 && b == 1);). 참조를 사용해야한다면 c / c ++의 모든 문제는 말할 것도 없습니다. 포인터가없는 불투명 구조체에서 가상 함수를 어떻게 호출합니까?
KitsuneYMG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.