문자열 메모리 오버 플로우 리드 교체

메모리에서 오버 플로우는 JDK 문자열을 사용하는 방법을 찾아야한다

배경

    String 클래스의 API의 JDK는 방법의 사용 빈도가 높은 교체, 우리에게 제공했다. 그는 문자열의 내용을 대체 할 수 있기 때문에, 단지 대체 문자열 및 대체 문자열을 입력 문자열은 쉽게 당신이 매우 강력하고, 원하는 것을 얻을 수 있습니다. JDK은 그 얼마나 편리한 내부에서 볼 수있다 :

출처 :

    공용 문자열 (대상의 CharSequence, CharSequence를 교체) 교체 {
         복귀 는 Pattern.compile (target.toString () Pattern.LITERAL) .matcher (
              ) .replaceAll (Matcher.quoteReplacement (replacement.toString ())); 
    }

재생 사고

   음, 설명하는 다음 장면은 순전히 허구이며 구덩이 계단처럼 유사하더라도, 그것은해야합니다! 
오늘 당신은 제품 MM은 귀하의 웹 사이트에 "삐 일부 비우호적 인 의견의 사용을 필요로하는 기능을 구현 찾을 ~ "마스크를하지만, 판사 비우호적 인 기능은 더 복잡하다, NLP를 사용하기 때문에 사용되는 알고리즘 동료를 제공하기 위해 인터페이스 판단, 그 다음 일은 간단하다 : 
  우리가 자연 언어 처리 기준 대상으로하려면 string.replace (대상, 교체)로 문자열을 반환에 필요한 후 잘 교체로 "삐 ~". 난 당신이 곧 숙련 된 다음 코드를 노크 수 지직 것으로 판단 :

      // 내용을 판단 NLP 비우호적 인 인터페이스를 호출 
        목록 <문자열> waitForReplace = callRpcNLP (텍스트),
         IF (waitForReplace == null의 || waitForReplace.size () == 0 ) {
             반환 ; 
        } 
        // 하나 (와) 하나 컨버터 (고조파) 
        에 대한 (문자열 대상 : waitForReplace는) {
             IF (대상 == null이 ) {
                 계속 ; 
            } 
            text.replace (대상, "삐 ~" ); 
        }

 

좋은 외모뿐만 아니라, 내 코드는 정말 아름답고 건강한 서면 확인의 다양한 있습니다, 당신은 도움이되지만 이미 자신의 걸작에 푹 빠졌 수 없습니다, 그것은 그래서 아무 문제가 없다?

사실, 시간으로 실제 실행 메모리는 버스트! ! !

사례 분석

이유 중 하나

    그래서, 디버그에서, 우리는 방법을 대체 할 위치 무슨 일이 있었는지 결국, 그것은 발견 된 원격 RPC 인터페이스는 빈 문자열 ""반환하기 때문에 그 대체 기준 대상으로 빈 문자열을, 어떤 문자열과 일치하는 것보다 더 성공적인 일치 번. 우리는 다음 실험을 할 수있는 단순한 문자열 포인트를 사용 : 
문자열 텍스트 = "여보세요"를 , 
에서 System.out.println (text.replace를 ( "", "*"));
인쇄 :  ! E H 삐 삐 삐 오 리터 리터 삐 삐 !!!!!
    우리는 "~ 삑."대체 문자열은 여섯 등장 것을 알 수 있습니다 즉, 간단한 "안녕하세요"문자열은 repalce 실행 한 후, "입니다 텍스트의 인사"하지만 큰 절, "일치하는 장소는 6시에 교체 할 필요가 있으므로이 아닌 경우" 수천 개의 단어 논문이? 여기, 우리는 ""진실에서 매우 가까이왔다 여러 문자열 일치를 대체하는 방법을하게됩니다. 이는 이유 중 하나 버스트 메모리입니다.

두 번째 이유

   또 다른 이유에 관해서는, 당신은 문자를 달성하기 위해 API를 호출하여 내부가 실제로 정규 표현식 관련이 대체 달성 교체, 위에서 언급 한 문자열 일치, 우리는 쉽게 사실, 정규 표현식 생각할 수 아래라고해야 문자열 일치. 또 다른 이유를 들어 두 XXXXXXXXXX 이유, 당신은, 사실, API를 호출하여 내부가 실제로 정규 표현식 관련이 교체, 위에서 언급 한 문자열 일치, 우리는 쉽게 정규 표현식 생각할 수 달성 교체에 따라 말을 스트링 매칭 달성했다. 
     문자열 사실, 타겟의 매우 복잡한 동작 대체 (대상, 여분) 인 달성하는 정규 표현 매칭,이 양 식 칭한다 "모드"(패턴), 및 상기 매칭 과정에서 시간이 필요 문자는 문자열 아웃 모드를 일치합니다. 경기가 성공하면 "*"패턴이 다음 문자로 와서 경기의 다음 라운드를 계속했다, 다음 문자열을 마련, 그러나 우리는 정규 표현식 지원 도트를 사용하여이 "."모든 문자, 별표와 일치하는지 알고 프로세스가 재귀 적 일치가 필요하므로, 하나는 단순히이 완료되는 문자열 매칭 포인터를 이동할 수 없습니다, 문자의 수와 일치. 
개요

 

이 "사고"를 통해, 우리는하려면 string.replace 방법은 메모리 오버 플로우를 일으킬 알고있다. 대한 요약에서 우리는이 문제를 방지하는 방법 :

  • 참조 대상뿐만 아니라 NULL 체크 할 필요가에, 당신은 ""할 빈 문자열 검사 필요

  • 텍스트를 직접 입력 정합의 큰 조각을 방지하는 텍스트 조각에 의해 달성 될 수있다

추천

출처www.cnblogs.com/pingping-joe/p/11119854.html