codememo

유형 안전이란 무엇이며 "유형 안전" 대안은 무엇입니까?

tipmemo 2023. 11. 4. 10:48
반응형

유형 안전이란 무엇이며 "유형 안전" 대안은 무엇입니까?

가능한 중복:
안전한 타입이란?
유형 안전이란 무엇입니까?

c++ 벡터에 대해 읽다가 다음과 같이 언급이 되었습니다.memcpy그리고.printfC의 함수는 안전한 타입이 아닙니다.기사내용: http://en.wikipedia.org/wiki/Vector_(C%2B%2B) .

질문:.간단한 영어로, 유형 안전이란 무엇이며 "유형 안전" 대안은 무엇입니까?

유형 안전성은 컴파일러가 올바른 유형을 사용하고 있는지 확인할 수 있음을 의미합니다.예를 들어, 만약 당신이printf, 실수로 프로그램이 다운될 수 있습니다.

printf("The meaning of life is %s", 42);

42는 문자열이 아닌 정수이기 때문입니다.

유형 안전성은 컴파일러가 사용자가 (호환되지 않는) 데이터 유형을 혼합하지 않는지 확인하는 데 도움이 된다는 것을 의미합니다.

예를 들어, 전화를 걸 때memcpy, 함수(및 컴파일러)는 메모리에서 두 개의 포인터만 보고 데이터 복사를 행복하게 시작합니다.즉, 다음과 같이 호환되지 않는 데이터 유형을 혼합할 수 있습니다.

SomeClass a;
AnotherClass b;
memcpy((void*)&a, (void*)&b, sizeof(b));

형식 안전성을 얻는 데는 여러 가지 접근법이 있습니다.템플릿을 사용하여 멤피() 주위에 래퍼를 만들어 두 포인터가 동일한 데이터 유형을 가리킬 수 있도록 하거나 다른 방법을 사용할 수 있습니다.

STL의 벡터를 이미 사용하고 있기 때문에 이미 어느 정도 유형의 안전 구현을 사용하고 있습니다.

유형 안전성은 컴파일러가 변수가 올바른 유형인지 확인하는 용도를 지배합니다.C는 데이터 유형의 안전성에 대해 매우 느슨합니다. 예를 들어, 이것은 실제로 ANSIC 표준에서 데이터 유형에 대해 유형 승격이 발생한다는 것입니다.char, 이 과제의 예는 이것을 설명할 것입니다.

char ch = 32; /* that is a space character accordingly to ASCII */
int n = ch + 3;

그 방법을 주목하세요.ch변수가 'promoted'을(를) 입력합니다.int. 그것은 합법적이지만 당신이 암시하는 것이라면 더 면밀한 조사가 필요합니다.

C# 컴파일러와 같은 컴파일러들은 이것이 일어나는 것을 허용하지 않을 것이고, 이것이 바로 C에서 캐스트의 연산자가 사용되는 이유입니다.

int n = (int)3.1415926535f;

까다롭게 말하자면, 그것은 파이 값이다, 일어나는 일은, 그것의 가치입니다.n3이 되겠습니다.

위의 내용은 형식 안전성을 설명하는 데 도움이 되며, 이에 대해 C는 매우 느슨합니다.

변수의 사용과 의미를 제한하기 위해 자바, C#와 같은 현대 언어의 유형 안전성이 더 엄격합니다.PHP는 느슨한 타이핑의 좋은 예로, 다음과 같은 작업을 수행할 수 있습니다.

$myvar = 34;
$myvar = $myvar + "foo";

$myvar정수, 부동 소수점 또는 문자열입니다.여기서의 유형 안전성은 버그를 초래할 수 있는 의도가 무엇인지에 대해 매우 명확하지 않습니다. 그리고 무슨 일이 일어나고 있는지 파악하려는 행복한 디버깅 세션을 수 있습니다.

도움이 되길 바랍니다.

당신이 위키피디아에 있었으니 말입니다.타입 세이프티.

유형 안전성은 대략적으로 말하면, 언어가 실수로 유형을 뒤섞는 것을 금지하는 것을 의미합니다.

memcpy일부의 기억을 쉽게 복사할 수 있기 때문에 유형 안전하지 않습니다.intchar결국 무의미한 데이터를 배열할 수 있습니다.printf당신이 제공할 수 있기 때문에 타입 세이프가 아닙니다.%i문자열이 있는 format specifier; 다시, 문자열은 다음과 같이 해석됩니다.int결국 쓰레기로 끝날 겁니다(어쩌면 VC++ 컴파일러는 포맷 문자열을 확인하기도 합니다.)

std::vector<T>지정된 유형의 값만 넣을 수 있기 때문에 유형 안전합니다.T(물론 명시적인 타입 캐스트를 할 수 있지만, 중요한 것은 타입 세이프가 아닌 것을 하는 것에 대해 명시적이어야 한다는 것입니다.)

"유형 안전성"은 컴파일러가 올바른 유형으로 올바른 작업을 수행하고 있는지 확인하는 것을 의미합니다(예: 바나나를 오렌지로 취급하려고 하거나 정수를 출력할 것으로 예상되는 함수에 문자열을 지정하면 컴파일러 오류가 발생함).

유형 안전(대부분)은 다음과 같은 경우 창 밖으로 바로 들어갑니다.void*그림으로 들어옵니다 - 그것은 어떤 것이든 가리킬 수 있는 포인터이고 (관련된 유형을 완전히 알지 못함), 언어는 완전히 프로그래머의 손에 맡겨집니다 (예를 들어, a).void*원래 유형으로 다시 캐스팅되는 것 외에는 대부분 좋은 것이 없습니다. 무엇이든 나타낼 수 있지만 무엇인지 알아야 사용할 수 있습니다.)

type unsafety는 printf와 같은 다양한 함수를 사용하게 됩니다. (컴파일러는 인수가 몇 개이고 유형이 무엇인지는 상관하지 않습니다. - 다시 말해서 형식 문자열이 인수와 유형과 일치하는지는 호출자에게 달려 있습니다.)

(배열 및 컨테이너의 경우) 멤파이의 안전한 대안은 다음과 같을 수 있습니다.std::copy인에<algorithm>- 모든 관련된 유형이 특정 요구사항을 충족한다면 memmove의 관점에서 구현될 수 있으며, 그렇지 않으면 과제를 수행합니다. 일부 클래스의 경우 공용 인터페이스를 우회하고 메모리에서 이동/복사만 하면 특정 불변량을 깰 수 있습니다(예:Memcpy)로 복사를 하면 사소한 복사 생성자가 있는 클래스는 잘못 동작할 것이라고 생각합니다.

CI/O 루틴의 안전한 대안은 iostreams입니다(그리고 형식 문자열의 이점을 원한다면,boost::format).

"유형 안전성"은 프로그램 내에서 오류가 전파되지 않도록 하기 위해 "유형 시스템"을 사용하는 것입니다.예를 들어, 유형 안전성이 없다면 바람직하지 않은 방법으로 부동 소수점 유형에 문자열 유형을 (조용히) 추가할 수 있습니다.

memcpy()printf()의 경우 함수가 인수를 처리하는 방식 때문에 유형 안전성이 부족합니다.예를 들어 memcpy(arg1, arg2, len)의 경우 arg1이 가리키는 바이트 수에 관계없이 메모리 주소 arg2에서 시작하는 len 바이트가 메모리 주소 arg1에 복사되어 프로그램의 다른 부분을 덮어쓸 수 있습니다.

안전한 대안 유형에 대해서는 시공자와 cout를 조사합니다.

실제로 C++ FAQ Lite 전체를 살펴보십시오.

이는 해당 유형에 대해 의미 없는 방식으로 유형을 사용하려고 하면 컴파일러가 경고를 생성하지 않는다는 것을 의미합니다.예를 들어, 다음은 정의되지 않은 동작이고 실제로는 포인터의 비트를 플로트의 비트로 복사할 것입니다. 만약 그렇다면sizeof(char*)>sizeof(float), 메모리 위치를 덮어쓰게 됩니다.f삶.

float f;
char *c = someString();
memcpy(&f, &c, sizeof(char*));

memcpy 함수의 특징은

void *memcpy (void* destination, const void* source, size_t num);

보시다시피 복사에 관련된 포인터에 대해서는 아무것도 가정하지 않습니다. 그저 포인터일 뿐입니다.예를 들어 다음과 같은 범위를 복사하려면ints에 이르기까지floats컴파일러는 그것에 대해 불평하지 않을 것입니다.

타입 세이프티(Type Safety)는 일종의 오류 코드가 컴파일(및 최근 실행)되는 것을 방지함으로써 개발자가 특정 오류를 피할 수 있도록 도와주는 도구입니다.소스코드의 의미적 측면을 분석하여 일반적으로 유형 간의 변환과 유형 간의 변환이 동시에 이루어지는지 확인합니다.

그게 무슨 의미죠?이는 프로그램이 유형 검사 단계를 통과할 경우 런타임에 특정 오류가 발생하지 않도록 확실히 할 수 있습니다.

물론 때로는 이 검사를 하지 않도록 강제해야 합니다. 그렇기 때문에 깁스를 사용하여 원하는 대로 작업을 수행할 수 있습니다.다른 예를 생각해 보세요malloc: 라고 규정되어 있습니다.

void* malloc (size_t size);

그래서 당신이 포인터를 할당하고 싶을 때.floats예를 들어 다음을 수행합니다.

float* ptr = (float*)malloc(sizeof(float*)*COUNT);

함수의 결과를 다음과 같이 캐스팅해야 합니다.float*그렇지 않으면 타이프 체크는 a의 할당을 찾을 것입니다.void*에 이르기까지float*그렇지만void*너무 일반적이어서 할당할 수 없습니다. TYPE CHECK FAIL!

그래서.memcpy안전하지 않습니다.아무것도 확인하지 않고 포인터에서 다른 포인터로 복사만 합니다.

유형 안전성은 컴파일 시 모든 변수가 전용 유형을 갖도록 강제하는 코딩 패러다임을 말합니다.int a = 4; double d = 100.0; struct ms {char s;} mystruct;변수의 유형은 '잃어버린' 경우가 없습니다.유형을 a에서 b로 변경하려면 명시적 또는 암묵적 변환을 정의해야 합니다.

printf변수 인수 목록에서 인수를 전달하므로 typesafe가 아닙니다.

float f = 1.f;
printf("This is a float: %f\nAnd this is a string: %s",f,f);

printf함수는 어떤 종류의 값을 받는지 알 수 없습니다.형식 문자열은 구현에서 확인하는 데 사용되지만 문자열이 잘못된 경우 컴파일 시 사용할 수 있는 유형 정보가 없기 때문에 구현에서 찾을 기회가 없습니다.위에printfprintf는 문자열을 두 번째 매개 변수로 예상하지만 부동 소수점 번호를 얻을 수 있습니다.

언급URL : https://stackoverflow.com/questions/2140369/what-is-type-safety-and-what-are-the-type-safe-alternatives

반응형