매직 넘버(프로그래밍)
Magic number (programming)컴퓨터 프로그래밍에서 매직넘버라는 용어는 여러 가지 의미를 갖는다.다음 중 하나를 가리킵니다.
- 의미를 설명할 수 없는 고유한 값 또는 (가능하면) 명명된 상수로 대체될 수 있는 여러 가지 발생
- 파일 형식 또는 프로토콜을 식별하는 데 사용되는 상수 숫자 또는 텍스트 값입니다. 파일에 대해서는 파일 서명 목록을 참조하십시오.
- 다른 의미와 혼동하기 어려운 고유한 값(Global Unique Identifier 등)
이름 없는 숫자 상수
매직 넘버 또는 매직 상수라는 용어는 소스 코드에서 직접 숫자를 사용하는 안티 패턴을 의미합니다.이것은 1960년대의 [1]COBOL, FORTRAN 및 PL/1 매뉴얼에서 유래한 가장 오래된 프로그래밍 규칙 중 하나로 언급되어 왔다.코드 내에서 이름 없는 매직 넘버를 사용하면 개발자가 그 [2]번호를 선택할 때 그 의도를 알 수 없게 되고 미묘한 오류가 발생할 가능성이 높아집니다(예를 들어 3.14152658979323846의 모든 숫자가 맞습니까? 3.14159와 같습니까?).또한 [3]향후 프로그램의 적용과 확장이 더욱 어려워집니다.모든 유의한 매직 숫자를 명명된 상수(설명 변수라고도 함)로 바꾸면 프로그램을 더 쉽게 읽고, 이해하고,[4] 유지할 수 있습니다.
프로그램의 컨텍스트에서 의미 있는 이름을 선택하면 원래 작성자가 아닌 유지관리자([5]또는 일정 시간이 경과한 후 원본 작성자라도)가 더 쉽게 이해할 수 있는 코드가 될 수 있습니다.비정보적으로 명명된 상수의 예는 다음과 같습니다.int SIXTEEN = 16
,하는 동안에int NUMBER_OF_BITS = 16
보다 알기 쉽게 설명하겠습니다.
위에서 설명한 매직 '숫자'와 관련된 문제는 숫자 유형에만 국한되지 않으며 명명된 상수를 선언하는 것이 더 유연하고 [1]소통할 수 있는 다른 데이터 유형에도 이 용어가 적용됩니다.따라서 선언은const string testUserName = "John"
여러 번 발생하는 '표준값'보다 낫다."John"
테스트 스위트룸에서요
예를 들어, 표준 카드 팩을 나타내는 배열 내의 값을 랜덤하게 셔플해야 하는 경우, 이 의사 코드는 Fisher-Yates 셔플 알고리즘을 사용하여 작업을 수행합니다.
i의 경우 1 ~52 j := i + 랜덤Int(53 - i) - 1 a.swapEntries(i, j)
어디에a
어레이 오브젝트, 즉,randomInt(x)
는 1 ~ x 사이의 임의의 정수를 선택합니다.swapEntries(i, j)
배열의 ith 엔트리와 jth 엔트리를 스왑합니다.위의 예에서는52
마법의 숫자입니다.다음을 작성하는 것이 더 나은 프로그래밍 스타일로 간주됩니다.
constant int deck Size : = i의 경우 1부터 deck Size j : = i + randomInt(deck Size + 1 - i) - 1 a.swap Entries(i, j)
이는 다음과 같은 몇 가지 이유로 권장됩니다.
- 그것은 읽고 이해하는 것이 더 쉽다.첫 번째 예를 읽는 프로그래머는 여기서 숫자 52가 무엇을 의미하는지 궁금해 할 것이다. 왜 52개죠?프로그래머는 코드를 주의 깊게 읽은 후에 그 의미를 추론할 수 있지만,[5] 그것은 명백하지 않다.매직 넘버는 같은 번호가 코드의 한 섹션에서 다른 목적으로 사용되는 경우 특히 혼란스러워집니다.
- 중복되지 않기 때문에 숫자 값을 변경하는 것이 더 쉽습니다.매직 넘버의 값을 변경하면 오류가 발생하기 쉬운데,[5] 이는 프로그램 내의 다른 장소에서 동일한 값이 여러 번 사용되기 때문입니다.또한 의미론적으로 서로 다른 두 변수 또는 숫자의 값이 동일한 경우 실수로 두 변수 또는 숫자가 [5]함께 편집될 수 있습니다.78장의 카드를 가진 Tarot 덱을 셔플하는 첫 번째 예를 수정하기 위해 프로그래머는 프로그램 내의 52개의 모든 인스턴스를 78장으로 순진하게 대체할 수 있습니다.이로 인해 두 가지 문제가 발생합니다.첫 번째 예에서는 두 번째 줄의 값 53을 놓치고 알고리즘이 미묘하게 실패하게 됩니다.둘째, 문자 "52"는 갑판 크기를 가리키든, 그레고리력으로 한 해의 주 수, 또는 더 은연중에 버그를 발생시키는 숫자의 일부와 같은 완전히 다른 것을 가리키든 상관없이 어디에서나 대체될 수 있습니다.반면, 값 변경은
deckSize
두 번째 예의 변수는 단순한 한 줄 변경입니다. - 문서화를 [5]장려하고 촉진합니다.명명된 변수가 선언된 단일 위치는 값이 무엇을 의미하는지, 값이 지정된 이유를 문서화하는 데 적합합니다.너무 많은 장소에서 같은 값을 가지면 코멘트가 중복되거나(그리고 일부 업데이트는 있지만 일부는 누락되었을 때 발생하는 문제), 저자가 가치를 설명하는 것이 당연하고 독자가 설명을 찾을 수 있는 장소가 없습니다.
- "매직 번호" 변수 선언은 일반적으로 함수 또는 파일의 맨 위에 함께 배치되어 검토 및 변경을 [5]용이하게 합니다.
- 오타를 탐지하는 데 도움이 됩니다.(리터럴 대신) 변수를 사용하면 컴파일러의 체크가 이용됩니다.실수로 "52"가 아닌 "62"를 입력하면 감지되지 않습니다. 반면 "52"를 입력하면
dekSize
"가 아니라 ".deckSize
이 경우 컴파일러는 다음과 같이 경고합니다.dekSize
미신고입니다. - 일부 IDE에서 입력을 줄일 수 있습니다.IDE가 코드 완성을 지원하는 경우 변수 이름의 대부분을 처음 몇 글자부터 입력합니다.
- 파라미터화가 용이해집니다.예를 들어, 위의 예를 임의의 수의 카드를 섞는 절차로 일반화하려면 , 다음의 순서를 실시하면 충분합니다.
deckSize
첫 번째 예는 몇 가지 변경이 필요한 반면, 이 절차의 매개변수로 변환됩니다.
i의 함수 셔플(int deckSize)을 1에서 deckSize j : = i + random으로 설정합니다.Int(deck Size + 1 - i) - 1 a.swap Entries(i, j)
단점은 다음과 같습니다.
- 이름 있는 상수가 사용 부근에서 정의되지 않으면 코드의 로컬성, 즉 이해성이 저하됩니다.52를 먼 곳에 배치한다는 것은 (예를 들어 루프의 실행 시간을 추정하기 위해) "for" 루프의 동작을 완전히 이해하기 위해서는 정의를 추적하여 예상되는 수치인지 확인해야 한다는 것을 의미합니다.이는 상수가 코드의 일부에서만 사용되는 경우 선언을 재배치함으로써 쉽게 피할 수 있습니다.한편, 이름이 붙은 상수가 다른 부분에서 사용되고 있는 경우, 리모트 로케이션은, 같은 값이 코드의 다른 장소에서도 나타나고 있는 것을, 판독자에게 보여 주는 단서가 됩니다.이것 역시 조사할 가치가 있을 수 있습니다.
- 그것은 코드를 더 상세하게 만들 수 있다.상수 선언에 행이 추가됩니다.상수의 이름이 값의 이름보다 길 경우, 특히 한 줄에 여러 개의 상수가 나타나는 경우, 코드의 논리문을 여러 줄에 걸쳐 분할해야 할 수 있습니다.상수에 대해 혼동을 일으킬 가능성이 있거나 다른 카드 게임에 대한 셔플링 루틴의 재사용과 같이 상수를 변경해야 할 가능성이 있을 때 장황함의 증가는 정당화될 수 있다.그것은 표현력의 증가와 동등하게 정당화될 수 있다.
- 식을 처리하는 데 시간이 걸릴 수 있습니다.
deckSize + 1
대부분의 최신 컴파일러와 인터프리터는 다음과 같은 사실을 알아차리지만 실행 시 값은 "53"보다 높습니다.deckSize
는 상수로 선언되어 컴파일된 코드에서 값 53을 미리 예측하고 있습니다.이것이 옵션이 아닌 경우에도 루프 최적화는 루프 전에 실행되도록 추가를 이동합니다.따라서 보통 코드에서 매직넘버를 사용하는 것에 비해 속도위반(또는 무시할 수 있는)은 없습니다.특히 디버깅 비용과 설명되지 않는 코드를 이해하기 위해 필요한 시간은 적은 계산 비용으로 억제해야 합니다.
허가된 용도
어떤 맥락에서, 이름 없는 숫자 상수의 사용은 일반적으로 받아들여진다(그리고 거의 틀림없이 "마법이 아니다").이러한 수용은 주관적이고 종종 개별 코딩 습관에 따라 달라지지만, 다음은 일반적인 예입니다.
- 예를 들어 for 루프의 초기값 또는 증분값으로0 및 1을 사용합니다.
for (int i = 0; i < max; i += 1)
- 짝수인지 홀수인지를 확인하기 위해 2를 사용한다.
isEven = (x % 2 == 0)
,어디에%
모듈로 연산자입니다. - 예를 들어 다음과 같은 식에서 단순한 산술 상수의 사용
circumference = 2 * Math.PI * radius
또는 2차 방정식의 판별식을 다음과 같이 계산하기 위한 것입니다.[1]d = b^2 − 4*a*c
- 미터법 값(예를 들어 그램과 킬로그램 사이)을 변환하거나 백분율과 밀당 값을 계산하기 위해 10의 거듭제곱 사용
- 다음과 같은 식의 지수
(f(x) ** 2 + f(y) ** 2) ** 0.5
f2 + 2 {{2}}}의
상수 1과 0은 부울 유형이 없는 프로그래밍 언어(예: 이전 버전의 C)에서 부울 값 True와 False를 나타내기 위해 사용되는 경우가 있습니다.대부분의 현대 프로그래밍 언어는boolean
또는bool
primitive type이므로 0과 1의 사용은 부적절합니다.0은 프로그램상의 성공(-1이 실패를 의미할 때)과 실패(1이 성공을 의미할 때)를 의미하기 때문에 더 혼란스러울 수 있습니다.
C 및 C++에서는 늘 포인터를 나타내기 위해0 이 사용되는 경우가 있습니다.부울값과 마찬가지로 C 표준 라이브러리는 매크로 정의를 포함합니다.NULL
사용을 권장하고 있습니다.다른 언어에서는 특정 기능을 제공합니다.null
또는nil
이 경우 다른 대안을 사용할 수 없습니다.입력된 포인터 상수nullptr
는 C++11에서 도입되었습니다.
포맷 인디케이터
원점
포맷 인디케이터는 초기 버전7 Unix 소스 [citation needed]코드에서 처음 사용되었습니다.
Unix 는, 메모리 보호 기능이 없는 최초의 DEC PDP-11/20 중 하나로 이식되었습니다.따라서 Unix의 초기 버전은 재배치 가능한 메모리 참조 [6]모델을 사용했습니다.Sixth Edition 이전의 Unix 버전은 실행 파일을 메모리에 읽어 들여 프로그램의 첫 번째 메모리 부족 주소인 상대 주소 0으로 점프했습니다.Unix의 페이지 버전이 개발되면서 실행 가능한 이미지 컴포넌트를 설명하는 헤더가 생성되었습니다.또한 헤더의 첫 번째 단어로 분기 명령을 삽입하여 헤더를 건너뛰고 프로그램을 기동한다.이렇게 하면 이전 재배치 가능한 메모리 참조(일반) 모드 또는 페이징 모드에서 프로그램을 실행할 수 있습니다.더 많은 실행 가능한 형식이 개발됨에 따라 분기 [7]오프셋을 증가시킴으로써 새로운 상수가 추가되었습니다.
Unix 프로그램로더의 Sixth Edition 소스 코드에서 exec() 함수는 파일시스템에서 실행 가능(바이너리) 이미지를 읽습니다.파일의 첫 번째 8바이트는 프로그램(텍스트) 및 초기화(글로벌) 데이터 영역의 크기를 포함하는 헤더였습니다.또한 헤더의 첫 번째 16비트 워드를 2개의 상수와 비교하여 실행 가능 이미지가 재배치 가능한 메모리 참조(통상), 새롭게 구현된 페이지 읽기 전용 실행 가능 이미지 또는 분리된 명령 [8]및 데이터 페이지 이미지를 포함하는지 여부를 판정한다.헤더 상수의 듀얼 역할에 대해서는 언급되지 않았지만, 상수의 상위 바이트는 실제로는 PDP-11 브랜치명령어(옥탈 000407 또는 16진수 0107)의 연산 코드였습니다.프로그램 카운터에 7을 더하면 이 상수가 실행되면 Unix exec() 서비스가 실행 이미지 8바이트 헤더 위에 분기하여 프로그램을 시작할 수 있습니다.
Unix의 6번째 에디션과 7번째 에디션에서는 페이징 코드가 사용되었기 때문에 헤더 상수의 이중 역할은 숨겨져 있었습니다.즉, exec() 서비스는 실행 파일 헤더(메타) 데이터를 커널 공간 버퍼에 읽어들이지만 실행 가능 이미지를 사용자 공간에 읽어들이기 때문에 상수의 분기 기능을 사용하지 않습니다.매직 넘버 작성은 Unix 링커와 로더에 실장되어 있으며 매직 넘버 브랜칭은 Six 에디션과 7 Edition에 부속된 스탠드아론 진단 프로그램 스위트에서도 사용되고 있을 가능성이 있습니다.따라서 헤더 상수는 착각을 일으켰고 마법의 기준을 충족시켰다.
버전 7 Unix에서는 헤더 상수는 직접 테스트되지 않고 ux_mag라는[9] 라벨이 붙은 변수에 할당되어 매직넘버라고 불립니다아마도 매직넘버라는 용어는 그 고유성 때문에 실행 가능한 형식 유형을 의미하게 되었고, 그 후 파일 시스템 유형으로 확장되었다가 다시 모든 파일 유형으로 확장되었습니다.
파일 내
매직 넘버는 많은 운영체제의 프로그램에서 공통적으로 사용됩니다.매직 넘버는 강력한 유형의 데이터를 구현하며 프로그램 런타임에 데이터 유형을 읽는 제어 프로그램에 대한 인밴드 시그널링의 한 형태입니다.많은 파일에는 포함된 데이터를 식별하는 상수가 있습니다.파일에서 이러한 상수를 탐지하는 것은 여러 파일 형식을 단순하고 효과적으로 구분할 수 있으며 추가 런타임 정보를 생성할 수 있습니다.
- 예
- 컴파일된 Java 클래스 파일(바이트 코드) 및 Mach-O 이진 파일은 16진수로 시작합니다.
CAFEBABE
. Pack200으로 압축하면 바이트가 로 변경됩니다.CAFED00D
. - GIF 이미지 파일에는 "GIF89a"의 ASCII 코드가 있습니다.
47
49
46
38
39
61
) 또는 "GIF87a" (47
49
46
38
37
61
) - JPEG 이미지 파일의 선두는 다음과 같습니다.
FF
D8
으로 끝나다FF
D9
JPEG/JFIF 파일에는 "JFIF"의 ASCII 코드가 포함되어 있습니다(4A
46
49
46
)를 늘 종단 문자열로 지정합니다.JPEG/Exif 파일에는 "Exif"의 ASCII 코드가 포함되어 있습니다).45
78
69
66
)는, 늘 종단 문자열로서도 사용됩니다.그 후에, 파일에 관한 메타데이터가 표시됩니다. - PNG 이미지 파일은 파일을 PNG 파일로 식별하고 일반적인 파일 전송 문제를 검출할 수 있는8 바이트의 시그니처로 시작합니다.
\211
P
N
G
\r
\n
\032
\n
(89
50
4E
47
0D
0A
1A
0A
이 시그니처에는,[10] 바이너리 모드가 아닌 ASCII 전송 모드로 FTP 를 사용해 파일을 전송 하는 등, 보증되지 않는 자동 줄바꿈을 검출할 수 있도록, 다양한 줄바꿈 문자가 포함되어 있습니다. - 표준 MIDI 오디오 파일에는 "MTHD"(MIDI 트랙 헤더,
4D
54
68
64
더 많은 메타데이터가 표시됩니다. - Unix 또는 Linux 스크립트는 "shebang"으로 시작하는 경우가 있습니다.
#!
,23
21
인터프리터가 스크립트가 호출된 인터프리터와 다를 가능성이 있는 경우) 뒤에 인터프리터 경로가 표시됩니다. - ELF 실행 파일의 선두는 다음과 같습니다.
7F
E
L
F
- PostScript 파일 및 프로그램은 "%!" (으)로 시작합니다.
25
21
). - PDF 파일은 "%PDF"로 시작합니다(16진수).
25
50
44
46
). - Microsoft Windows의 DOS MZ 실행 파일 및 EXE 스터브PE(Portable Executive File) 파일은 MZ(MZ)로 시작합니다.
4D
5A
파일 형식 설계자 Mark Zikowski의 이니셜.이 정의에 의해 일반적인 "ZM"이 허용됩니다.5A
4D
PE 이외의 [11]EXE인 DOSZMXP의 경우도 마찬가지입니다. - Berkeley Fast File System 슈퍼블록 포맷은 다음 중 하나로 식별됩니다.
19
54
01
19
또는01
19
54
버전에 따라 다르며 둘 다 작가인 마샬 커크 맥커식(Marshall Kirk McKusick)의 생일을 나타냅니다. - 거의 모든 IA-32에서 부팅 가능한 스토리지 디바이스의 마스터 부트 레코드IBM PC 호환기의 코드는 다음과 같습니다.
55
AA
마지막 2바이트입니다. - Game Boy 및 Game Boy Advance 핸드헬드 비디오 게임 시스템의 실행 파일은 각각 헤더의 고정 위치에 48바이트 또는 156바이트의 매직 번호를 가지고 있습니다.이 매직 넘버는 닌텐도 로고의 비트맵을 인코딩합니다.
- Amiga classic 68000 머신에서 실행되는 Amiga 소프트웨어 실행 파일 Hunk 파일은 모두 "Magic Cookie"라는 별명을 가진 16진수 $000003f3로 시작되었습니다.
- Amiga에서 시스템의 유일한 절대 주소는 16진수 $00000004(메모리 위치 4)이며, 여기에는 Amiga의 커널이라고 불리는 exec.library에 대한 포인터인 SysBase라는 시작 위치가 포함됩니다.
- PowerPC 실행 파일용 Mac OS 및 BeOS에서 사용되는 PEF 파일에는 "Joy!"의 ASCII 코드가 포함되어 있습니다.
4A
6F
79
21
를 프리픽스로서 사용합니다. - TIFF 파일은 다음 중 하나로 시작합니다.
II
또는MM
이어 42가 2바이트 정수로 지정됩니다(작은 endian 바이트 순서 또는 큰 endian 바이트 순서입니다.II
little endian byte ordering을 사용하는 인텔용이므로 매직넘버는49
49
2A
00
.MM
빅 엔디언 바이트 순서를 사용하는 모토로라를 위한 매직넘버는4D
4D
00
2A
. - UTF-16으로 인코딩된 Unicode 텍스트파일은 엔디안을 검출하기 위해 바이트 순서 마크(Byte Order Mark)로 시작하는 경우가 많습니다.
FE
FF
빅 엔디언과FF
FE
작은 엔디안을 위해서)Microsoft Windows 에서는, UTF-8 텍스트 파일은, 같은 문자의 UTF-8 인코딩으로 시작되는 경우가 많습니다.EF
BB
BF
. - LLVM 비트코드 파일은 다음과 같이 시작합니다.
BC
(0x42, 0x43) - WAD 파일은 다음 문자로 시작합니다.
IWAD
또는PWAD
(Doom의 경우),WAD2
(Make의 경우) 및WAD3
(하프라이프용). - Microsoft Compound File Binary Format(대부분 Microsoft Office 문서의 오래된 형식 중 하나) 파일은 다음과 같이 시작합니다.
D0
CF
11
E0
이는 "DOCFILE0"이라는 단어를 시각적으로 연상시킵니다. - ZIP 파일의 헤더는 「PK」( )로 시작합니다).
50
4B
DOS 압축 유틸리티 PKZ의 저자 Phil Katz의 이니셜.아이피 - 7z 파일의 헤더는 "7z"로 시작합니다(완전 매직 번호:
37
7A
BC
AF
27
1C
).
- 검출
Unix 유틸리티 프로그램file
파일에서 매직넘버를 읽고 해석할 수 있으며, 정보를 해석하는 데 사용되는 파일을 매직이라고 합니다.Windows 유틸리티 TrID도 같은 목적을 가지고 있습니다.
프로토콜의 경우
- 예
- AIM/ICQ에서 사용되는 OSCAR 프로토콜은 요구 앞에
2A
. - VNC에서 사용되는 RFB 프로토콜에서는 클라이언트는 "RFB"를 전송함으로써 서버와의 대화를 시작합니다.
52
46
42
('리모트 프레임 버퍼'의 경우) 뒤에 클라이언트의 프로토콜 버전 번호를 입력합니다. - Microsoft Windows에서 사용되는 SMB 프로토콜에서는 각 SMB 요청 또는 서버 응답은 '으로 시작합니다.
FF
53
4D
42
', 또는"\xFFSMB"
SMB 요청 시작 시. - Microsoft Windows에서 사용되는 MSRPC 프로토콜에서 각 TCP 기반 요청은 다음과 같이 시작됩니다.
05
(Microsoft DCE/RPC 버전5를 나타냄) 요구의 선두에 이어서00
또는01
를 참조해 주세요.UDP 기반의 MSRPC 요구에서는 첫 번째 바이트는 항상04
. - COM 및 DCOM 마샬링인터페이스에서는 OBJREF라고 불리며 항상 바이트시퀀스 'MEOW'로 시작합니다.
4D
45
4F
57
디버깅 확장(DCOM 채널 후킹에 사용)은 바이트 시퀀스 "MARB" ()로 프리픽스 됩니다.4D
41
52
42
). - 암호화되지 않은 BitTorrent Tracker 요청은 값을 포함하는 단일 바이트로 시작합니다.
19
바이트 위치 1에서 "BitTorrent protocol" 문구가 이어지는 헤더 길이를 나타냅니다. - eDonkey2000/eMule 트래픽은 클라이언트버전을 나타내는1 바이트로 시작합니다.현재의
E3
eDonkey 클라이언트를 나타냅니다.C5
eMule을 나타냅니다.D4
압축된 eMule을 나타냅니다. - 첫 번째
04
Bitcoin 블록체인에 있는 블록의 바이트는 네트워크 식별자 역할을 하는 매직 번호를 포함합니다.값은 상수입니다.0xD9B4BEF9
메인 네트워크를 나타내고 있습니다.0xDAB5BFFA
테스트넷을 나타냅니다. - SSL 트랜잭션은 항상 "client hello" 메시지로 시작합니다.모든 SSL 패킷의 프리픽스에 사용되는 레코드 캡슐화 방식은 2바이트 및3바이트 헤더 형식으로 구성됩니다.일반적으로 SSL 버전2 클라이언트의 hello 메시지에는
80
클라이언트 hello에 대한 SSLv3 서버 응답은16
(다만, 이것은 다를 수 있습니다). - DHCP 패킷은 "매직 쿠키" 값 '을 사용합니다.
0x63
0x82
0x53
0x63
패킷의 옵션섹션의 선두에 있습니다.이 값은 모든 DHCP 패킷유형에 포함됩니다. - HTTP/2 접속이 선두로 열립니다.'
0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a
' 또는 'PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n
". 이 서문은 2.0이 아닌 이전 버전의 HTTP를 지원하는 서버 및 중개자에 의한 프레임 처리를 회피하도록 설계되어 있습니다.
인터페이스 내
매직 넘버는 DOS, Windows 및 NetWare를 포함한 많은 운영체제 전반의 API 함수 및 인터페이스에서 공통적으로 사용됩니다.
- 예
- IBM PC 호환 BIOS는 매직 값을 사용합니다.
0000
그리고.1234
시스템 재부팅 시 메모리를 카운트업할지 여부를 판단하여 콜드 부트 또는 웜부트를 수행합니다.이러한 값은 [12]부트 요구를 대행 수신하는EMM386 메모리 매니저에서도 사용됩니다.BIOS에서도 매직밸류 사용55 AA
디스크 [13]부팅 가능 여부를 확인합니다. - MS-DOS 디스크 캐시 SMARTDRV(코드네임 "Bambi")는 API [12]함수에서 매직 값인 BABE와 EBAB를 사용합니다.
- 영국의 구 European Development Center에서 개발된 DR DOS, Novell DOS 및 OpenDOS 드라이버의 대부분은 (에뮬레이트된) 표준 DOS 기능 위에 있는 추가 기능을 호출하거나 제공할 때 매직 토큰으로 0EDCHE 값을 사용합니다.[12]
기타 용도
- 예
데이터 유형 제한
다음은 데이터 스토리지 [15]유형의 제한 목록입니다.
십진수 | 16진수 | 묘사 |
---|---|---|
18,446,744,073,709,551,615 | FFFFFFFFFFFFFFFFFFF | 부호64 없는 최대 64비트 값(2 - 1) |
9,223,372,036,854,775,807 | 7FFFFFFFFFFFFFFFFFF | 서명된 최대 64비트 값63(2 - 1) |
4,294,967,295 | FFFFFFFFF | 부호32 없는 최대 32비트 값(2 - 1) |
2,147,483,647 | 7FFFFFF | 서명된 최대 32비트 값31(2 - 1) |
65,535 | 오프 | 부호16 없는 최대 16비트 값(2 - 1) |
32,767 | 7FF | 서명된 최대 16비트 값15(2 - 1) |
255 | FF | 부호 없는 최대 8비트 값8(2 - 1) |
127 | 7층 | 서명된 최대 8비트 값7(2 - 1) |
−128 | 80 | 최소 서명된 8비트 값 |
−32,768 | 8000 | 서명된 최소 16비트 값 |
−2,147,483,648 | 8000 0000 | 서명된 최소 32비트 값 |
−9,223,372,036,854,775,808 | 8000 0000 0000 0000 | 최소 서명된 64비트 값 |
GUID
GUID(Global Unique Identifier)는 기억에 남도록 작성 또는 변경할 수 있지만, 이는 거의 고유 [16][17]식별자로서의 강도를 떨어뜨리기 때문에 매우 권장되지 않습니다.GUID 및 UUID를 생성하는 사양은 매우 복잡하기 때문에 올바르게 구현되면 사실상 고유하게 됩니다.이것들은 평판이 좋은 소프트웨어 [citation needed]툴에 의해서만 생성되어야 합니다.
Microsoft Office 제품의 Microsoft Windows 제품 ID 번호는 다음과 같이 끝나는 경우가 있습니다.0000-0000-0000000FF1CE
('OFFICE' 등)90160000-008C-0000-0000-0000000FF1CE
}, "Office 16 Click-to-Run Extensibility Component"의 제품 ID.
Java는 다음 문자로 시작하는 여러 GUID를 사용합니다.CAFEEFAC
를 클릭합니다.[18]
GPT 파티션 스키마의 GUID 파티션 테이블에서 BIOS 부팅 파티션은 특수한 GUID를 사용합니다.21686148-6449-6E6F-744E-656564454649
}은(는) GUID 정의를 따르지 않습니다.[19] 대신 문자열 "에 ASCII 코드를 사용하여 형성됩니다.Hah!IdontNeedEFI
" 부분적으로는 작은 엔디안 [20]순서로 되어 있습니다.
디버깅 값
매직 디버깅 값은 할당 또는 할당 해제 중에 메모리에 기록되는 특정 값입니다.따라서 나중에 파손 여부를 확인할 수 있으며 초기화되지 않은 메모리에서 가져온 값이 사용되는 시기를 확인할 수 있습니다.메모리는 보통 16진수로 표시되므로 기억하기 쉬운 반복값 또는 16진수 값이 일반적입니다.바이트 어드레싱이 없는 프로세서를 포인터로 사용하려고 할 때(짝수 주소에 있어야 함) 장애가 발생하도록 숫자적으로 홀수 값을 선호할 수 있습니다.가능한 주소(프로그램 코드, 정적 데이터, 힙 데이터 또는 스택)에서 벗어난 값을 선택해야 합니다.마찬가지로, 그들은 주어진 아키텍처에 대한 명령 집합에서 유효한 코드가 되지 않도록 선택될 수 있다.
32비트 정수가 이 특정 값을 취할 가능성은 매우 낮기 때문에 디버거 또는 메모리 덤프에서 이러한 숫자가 나타나는 것은 버퍼 오버플로나 초기화되지 않은 변수 등의 오류를 나타낼 수 있습니다.
유명하고 일반적인 예는 다음과 같습니다.
코드 | 묘사 |
---|---|
00008123 | MS Visual C++에서 사용됩니다.삭제된 포인터는 이 값으로 설정되어 있기 때문에 나중에 사용할 때 예외를 발생시킵니다.이는 제로 주소의 알기 쉬운 에일리어스입니다.보안 개발 라이프 사이클(/[21]sdl) 옵션을 사용하여 활성화됩니다. |
..FACADE | '패케이드', 다수의 RTOS에서 사용 |
1BADB002 | "1개의 잘못된 부팅", 멀티부팅 헤더 매직[22] 번호 |
8BADF00D | "Atate bad food"(Atate bad food), 감시 시간 초과가 [23]발생하여 Apple iOS 응용 프로그램이 종료되었음을 나타냅니다. |
A5A5A5A5 | 교체 비트 패턴(10100101)이 오실로스코프 및 논리 분석기에서 쉽게 인식할 수 있는 패턴을 만들기 때문에 임베디드 개발에 사용됩니다. |
A5 | FreeB에서 사용SD의 PHK malloc(3)는 /etc/malloc.conf가 "-J"에 링크되어 새로 할당된 모든 메모리를 초기화할 때 디버깅합니다.이 값은 NULL 포인터 또는 ASCII NUL 문자가 아니기 때문입니다. |
ABABABAB | Microsoft의 debug HeapAlloc()에서 할당된 힙 메모리 [24]뒤에 "no man's land" 가드 바이트를 표시하기 위해 사용됩니다. |
ABADBABE | "Boot Zero Block" 매직 넘버로 사용되는 "A bad babe" |
ABBABABE | 드라이버 병렬 라인 메모리 힙에서 사용되는 "ABBA babe"입니다. |
ABADCAFE | "A bad cafe", 할당되지 않은 모든 메모리 초기화(Mungwall, Amiga)에 사용OS) |
B16B00B5 | "Big Boobs" (이전에는 Microsoft Hyper-V 하이퍼바이저에서 Linux 게스트가 "게스트 ID"[25]의 상위 절반으로 사용해야 했습니다) |
BAADF00D | "Bad food", Microsoft의 디버깅 HeapAlloc()에서 초기화되지 않은 할당 힙 메모리를[24] 표시하기 위해 사용됩니다. |
BAAAAAAD | "Baaaaaad", Apple iOS 로그가 크래시[23] 보고서가 아닌 전체 시스템의 스택샷임을 나타냅니다. |
BAD22222 | "Bad too repeatly"(너무 반복적으로 잘못됨), Apple iOS VoIP 응용 프로그램이 너무[23] 자주 재개되어 종료되었음을 나타냅니다. |
BADBADBADBAD | "Bad bad bad bad bad bad bad", Burroughs 대용량 시스템 메모리 "미초기화" (48비트 워드) |
BADC0FFEE0DDF00D | "Bad coffee odd food", IBM RS/6000 64비트 시스템에서 초기화되지 않은 CPU 레지스터를 나타내는 데 사용됩니다. |
BADDCAFE | Sun Microsystems의 Solaris에서 "Bad cafe"가 초기화되지 않은 커널 메모리(KMEM_UNINITIALIZED_PATTN)로 표시됨 |
BBADBEEF | WebKit에서 사용되는[clarification needed] "불량 쇠고기" |
BEBEBEBE | AddressSanitizer가 할당되었지만 초기화되지[26] 않은 메모리를 채우기 위해 사용합니다. |
BEEFCACE | "쇠고기 케이크", Microsoft에서 사용.리소스 파일의 매직 넘버로서의 NET |
C00010FF | "Cool off" (냉각완료), Apple iOS 앱이 열 이벤트에[23] 대한 응답으로 운영체제에 의해 중지되었음을 나타냅니다. |
CAFEBABE | "Cafe babe", Java에서 클래스 파일에 사용 |
CAFED00D | "Cafe dude" (Java에서 팩200 압축에 사용) |
CAFEFEED | "카페 피드", Sun Microsystems의 Solaris 디버깅 커널에서 kmemfree() 메모리를 마크하기 위해 사용됩니다. |
CCCCCCCC | Microsoft의 C++ 디버깅 런타임 라이브러리와 많은 DOS 환경에서 초기화되지 않은 스택메모리를 표시하기 위해 사용됩니다. CC 는 x86 프로세서의 INT 3 디버깅브레이크 포인트 인터럽트의 opcode와 유사합니다.[27] |
CDCDCDCD | Microsoft의 C/C++ debug malloc() 함수에 의해 초기화되지 않은 힙 메모리를 마킹하기 위해 사용됩니다.보통 HeapAlloc()[24]에서 반환됩니다. |
0D15EA5E | Nintendo GameCube 및 Wii 콘솔에서 일반 부팅을 나타내기 위한 깃발로 사용되는 "Zero Disease" |
DDDDDDDD | MicroQuill의 SmartHeap과 Microsoft의 C/C++ debug free() 함수에 의해 해방된 힙[24] 메모리를 마킹하기 위해 사용됩니다. |
DEAD10CC | "Dead lock" - Apple iOS 응용 프로그램이 백그라운드에서[23] 실행되는 동안 시스템 리소스를 유지했기 때문에 종료되었음을 나타냅니다. |
DEADBABE | "Dead babe" (실리콘 그래픽스의 IRIX 아레나 파일 시작 부분에 사용) |
DEADBEEF | RS/6000과 같은 IBM 시스템에 사용되는 것으로 유명한 "Dead beef"는 기존 Mac OS 운영 체제, OPENSTEP Enterprise 및 Commodore Amiga에도 사용됩니다.Sun Microsystems의 Solaris에서는 빈 커널 메모리(KMEM_FREE_PATTN)를 마킹합니다. |
DEADCAFE | "Dead cafe", Microsoft에서 사용.DLL 오류 번호로서의 NET |
DEADC0DE | 데드 코드(Dead code), OpenWRT 펌웨어의 마커로 사용되며, 정적 펌웨어의 마지막에 작성 예정인 jffs2 파일 시스템의 시작을 나타냅니다. |
DEADFA11 | "Dead fail"(데드 실패), 사용자가 Apple[23] iOS 애플리케이션을 강제로 종료했음을 나타냅니다. |
DEADF00D | "죽은 음식", 할당되었지만 초기화되지[28] 않은 기억을 표시하기 위해 Commodore Amiga의 Mungwall에서 사용 |
DEFEC8ED | "Defeuted", OpenSolaris 코어 덤프에 사용 |
DEADDEAD | "Dead Dead"는 사용자가 의도적으로 Microsoft Windows에서 커널 디버거 [29]또는 키보드에서 크래시 덤프를 시작했음을 나타냅니다. |
D00D2BAD | Safari에서 사용하는 "Dude, Too Bad"는 MacOS Big [30]Sur에서 크래시됩니다. |
EBEBEBEB | MicroQuill의 SmartHeap에서 |
FADEDEAD | Fade dead(페이드 데드), 모든 AppleScript 스크립트를 식별하기 위해 마지막에 표시됩니다. |
FDFDFDFD | Microsoft의 C/C++ debug malloc() 함수에 의해 할당된 힙 [24]메모리의 전후에 "no man's land" 가드 바이트 및 Microsoft에 의해 구현된 일부 debug Secure C-Runtime 함수(strncat_s 등)에 마킹됩니다. |
FEE1DEAD | Linux reboot() syscall에서 사용되는 "Feel dead" |
FEEDFACE | Apple Inc. Mac OSX 플랫폼의 PowerPC Mach-O 바이너리에서 볼 수 있는 "Feed face"입니다.Sun Microsystems의 Solaris에서는 빨간색 존(KMEM_REDZONE_PATTN)을 표시합니다. VLC 플레이어와 RTP/RTCP 프로토콜의 일부 IP 카메라에 의해 사용되는 VLC 플레이어는 시스템의 엔디안성 순서로 4바이트를 전송합니다.일부 IP 카메라에서는 플레이어가 이 매직 번호를 전송하고 스트림을 수신하지 않으면 스트림을 시작하지 않습니다. |
FEEEFEEE | "Fee fee" 마이크로소프트의 디버깅 HeapFree()에서 해방된 힙 메모리를 마크하기 위해 사용됩니다.인근의 일부 내부 부기 값에서도 상위 단어가 FEE로 설정될 수 있습니다.[24] |
이들 대부분은 32비트 길이로 대부분의 32비트 아키텍처 컴퓨터의 워드 크기입니다.
Microsoft 테크놀로지에 이러한 가치가 널리 보급된 것은 우연이 아닙니다.이러한 가치는 Microsoft Press의 Steve Mcuire의 저서 Writing Solid Code(솔리드 코드 작성)에서 자세히 설명하고 있습니다.그는 이러한 가치에 대한 다음과 같은 다양한 기준을 제시한다.
- 이러한 알고리즘은 유용하지 않습니다.즉, 이 알고리즘에서 동작하는 대부분의 알고리즘은 비정상적인 동작을 할 것으로 예상됩니다.0과 같은 숫자는 이 기준에 맞지 않습니다.
- 프로그래머는 디버거에서 잘못된 값으로 쉽게 인식해야 합니다.
- 바이트 정렬이 없는 컴퓨터에서는 홀수여야 합니다.따라서 바이트 정렬을 주소로 참조하면 예외가 발생합니다.
- 코드로 실행되면 예외 또는 디버거가 중단될 수 있습니다.
이러한 용어 중 일부는 기본적으로 비어 있는 메모리 영역을 표시하기 위해 자주 사용되었기 때문에 "사용자의 프로그램은 DEADBEEF"[citation needed]와 같이 "없음, 중단됨, 메모리에서 플러시됨"을 의미하는 문구에 사용되게 되었습니다.
「 」를 참조해 주세요.
- 매직 스트링
- 파일 형식 magic 매직 번호
- 파일 서명 목록
- 4CC
- 하드 코딩
- 매직(프로그래밍)
- NaN(번호가 아님)
- 열거형
- Hexspeak, 또 다른 마법의 가치를 위해
- 암호 알고리즘의 마법 상수에 대한 내 비밀은 아무것도 없다.
- 시간 포맷 및 저장 버그(마직으로 인해 발생할 수 있는 문제)
- Sentinel 값(일명 플래그 값, 트립 값, 로그 값, 신호 값, 더미 데이터)
- Canary 값, 버퍼 오버플로우를 검출하기 위한 특수값
- XYZZ(마법어)
- 상수 0x5F3759를 사용한 고속 역제곱근DF
레퍼런스
- ^ a b c Martin, Robert C. (2009). "Chapter 17: Smells and Heuristics - G25 Replace Magic Numbers with Named Constants". Clean Code - A handbook of agile software craftsmanship. Boston: Prentice Hall. p. 300. ISBN 978-0-13-235088-4.
- ^ Martin, Robert C. (2009). "Chapter 17: Smells and Heuristics - G16 Obscured Intent". Clean Code - A handbook of agile software craftsmanship. Boston: Prentice Hall. p. 295. ISBN 978-0-13-235088-4.
- ^ Maguire, James (2008-12-09). "Bjarne Stroustrup on Educating Software Developers". Datamation.com. Archived from the original on 2018-06-23.
- ^ Vogel, Jeff (2007-05-29). "Six ways to write more comprehensible code". IBM Developer.
- ^ a b c d e f Paul, Matthias R. (2002-04-09). "[fd-dev] CuteMouse 2.0 alpha 1". freedos-dev. Archived from the original on 2022-04-07. Retrieved 2022-08-04.
- ^ "Odd Comments and Strange Doings in Unix". Bell Labs. 2002-06-22. Archived from the original on 2006-11-04.
- ^ 데니스 M과의 개인적인 의사소통.리치.
- ^ "The Unix Tree V6/usr/sys/ken/sys1.c". The Unix Heritage Society. Archived from the original on 2008-10-20.
- ^ "The Unix Tree V7/usr/sys/sys/sys1.c". The Unix Heritage Society. Archived from the original on 2008-10-20.
- ^ "PNG (Portable Network Graphics) Specification Version 1.0: 12.11. PNG file signature". MIT. 1996-10-01.
- ^ Chen, Raymond (2008-03-24). "What's the difference between the COM and EXE extensions?". The Old New Thing. Archived from the original on 2019-02-18.
- ^ a b c Paul, Matthias R. (2002-04-03). "[fd-dev] Ctrl+Alt+Del". freedos-dev. Archived from the original on 2017-09-09. Retrieved 2017-09-09. (NB. IBM PC 호환 BIOS(0000h, 1234h), EMM386(1234h)와 같은 DOS 메모리 관리자 및 SMARTDRV(EBABh, BABh) 및 NWCACHE(0EDCH, EBABH, 675h)와 같은 디스크 캐시에서 사용되는 여러 매직 값을 설명합니다.
- ^ "The BIOS/MBR Boot Process". NeoSmart Knowledgebase. 2015-01-25. Retrieved 2019-02-03.
- ^ "TI E2E Community: Does anyone know if the following configurations can be done with MCP CLI Tool?". Texas Instruments. 2011-08-27.
- ^ Poley, Josh (2009-09-30). "Magic Numbers: Integers". MSDN.
- ^ Newcomer, Joseph M. (2001-10-13). "Message Management: Guaranteeing uniqueness". Developer Fusion. Retrieved 2007-11-16.
- ^ Osterman, Larry (2005-07-21). "UUIDs are only unique if you generate them..." Larry Osterman's WebLog - Confessions of an Old Fogey. MSDN. Retrieved 2007-11-16.
- ^ "Specifying Family JRE Versions for Java Applets". Oracle. Retrieved 2010-06-18.
- ^ "GNU GRUB Installation, Section 3.4: BIOS installation". Gnu.org. Retrieved 2014-06-26.
- ^ Heddings, Lowell (2014-11-03). "Magic Numbers: The Secret Codes that Programmers Hide in Your PC". How-To Geek. Retrieved 2017-10-03.
- ^ Cavit, Doug (2012-04-24). "Guarding against re-use of stale object references". Microsoft Secure. Retrieved 2018-07-26.
- ^ Boleyn, Erich Stefan (1995-04-04). "Comments on the "MultiBoot Standard" proposal". Uruk.org.
- ^ a b c d e f "Technical Note TN2151: Understanding and Analyzing Application Crash Reports". Apple Developer Documentation. 2009-01-29.
- ^ a b c d e f Birkett, Andrew. "Win32 Debug CRT Heap Internals". Nobugs.org.
- ^ McNamara, Paul (2012-07-19). "Microsoft code contains the phrase 'big boobs' ... Yes, really". Network World.
- ^ "AddressSanitizer - FAQ". Retrieved 2022-05-18.
- ^ ""INTEL 80386 PROGRAMMER'S REFERENCE MANUAL"". MIT.
- ^ Scheppner, Carolyn. "Amiga Mail Vol.2 Guide". Cataclysm.cx. Archived from the original on 2011-07-18. Retrieved 2010-08-20.
- ^ "Bug Check 0xDEADDEAD MANUALLY_INITIATED_CRASH1". Microsoft Documentation.
- ^ "Safari Version 14.0.1 Unexpectedly Quits".
- ^ "strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l". Microsoft Documentation. Retrieved 2019-01-16.