ProgramingTip

C #의 암호

bestdevel 2020. 11. 2. 08:11
반응형

C #의 암호


나는 “CorruptedString”(솔루션)을 발견했습니다 . 다음은 책의 프로그램 코드입니다.

var s = "Hello";
string.Intern(s);
unsafe
{
  fixed (char* c = s)
    for (int i = 0; i < s.Length; i++)
      c[i] = 'a';
}
Console.WriteLine("Hello"); // Displays: "aaaaa"

이 프로그램에 "aaaaa"가 표시되는 이유는 무엇입니까? 이 프로그램을 다음과 같이 이해합니다.

  1. CLR에 인턴 풀 보유 "안녕하세요"(나는 화상 숭배로서 인턴 풀).
  2. string.Intern(s)CLR이 "Hello"문자열을 예약하기 때문에 아무 작업도하지 않습니다. 예약 된 "Hello"문자열의 주소 만 반환합니다 (객체 s는 동일한 주소를 가짐).
  3. 프로그램은 포인터를 통해 "Hello"문자열의 내용이 변경됩니다.
  4. ??? Hello 학원 인턴 풀에 없어야하며 오류 집합니다! 하지만 괜찮습니다. 프로그램이 확장으로 실행됩니다.

인턴 풀을 이해하면 높이 사전과 가변됩니다. 아니면 내가 뭔가를 놓친 까 요?


처음으로 "Hello"를 사용하면 응용 프로그램 전역 저장소에 포함됩니다. 당신이 실행하고있는 사실을 바탕으로 unsafe(이상 대한 모드 unsafe 여기에 ) 당신은 높은 수준의 값에 할당 된 위치에 있습니다 s.

for (int i = 0; i < s.Length; i++)
      c[i] = 'a';

당신은 메모리에있는 것을 편집하고 있습니다. 다음에 인턴 된 메모리 저장소에 액세스 할 때 방금 변경 한 데이터를 유지하면서 메모리의 동일한 주소를 사용합니다. 그것은 없이는 불가능할 것 unsafe입니다. string.Intern(s);여기서 역할을하지 않습니다. 주석 처리하면 동일하게 작동합니다.

그런 다음

Console.WriteLine("Hello"); // Displays: "aaaaa"

.NET주소가 있는지 확인 "Hello"하고 방금 업데이트 주소가 있는지 확인 합니다 "aaaaa". 'a'문자의 길이에 의해 결정된다 "Hello".


@Jaroslav Kadlec 대답이하고 완전하면서도코드 동작에 대한 정보를 더 추가 하고이 경우string.Intern(s);쓸모가없는지 추가하고 싶습니다.

인턴 풀 소개

.NET은 모든 고래 리터럴에 대해 인스턴스를 자동으로 실행합니다. 이는 애플리케이션의 모든 고유 노드에 대한 참조를 저장하는 특수 테이블을 사용하여 수행됩니다.

그러나 명시 적으로 선언 된 문자열 만 컴파일-step에서 인턴된다는 점에 유의하는 것이 중요합니다 .

다음 코드를 고려하십시오.

var first = "Hello"; //Will be interned
var second = "World"; //Will be interned
var third = first + second; //Will not be interned

어떤 상황에서는 물론 우리는 인턴에 실행 중 일부를 원하는 것으로 String.Intern확인 후 수행 할 수 있습니다 String.IsInterned.

그래서 OP의 스 니펫으로 돌아갑니다.

//...
var s = "Hello";
string.Intern(s);
//...

이 경우에는 string.Intern(s);이미 단계에서 인턴하므로 쓸모가 없습니다.

참고 URL : https://stackoverflow.com/questions/41219991/corrupted-string-in-c-sharp

반응형