문자열 내에 “쓰래기 값”

기술노트 96004

아키텍처:

All

컴포넌트:

general

업데이트:

2021-07-15 오후 10:17

소개

어떤 경우에는, printf 로 인쇄된 문자열이나 sprintf를 사용한 후에 설명되지 않은 쓰래기 값이 있습니다.

해결방법

sprintf/printf에 사용되는 형식 문자열을 철저히 확인합니다.
또한 strncat 사용 오류도 확인합니다(아래 예).

배경

설명되지 않은 문자에 대한 여러 가지 설명이 있습니다:

  1. %s에서 사용하는 문자열 중 일부는 null '\0' 문자로 종료되지 않습니다. strncpy가 이전에 사용된 경우일 수 있습니다(strncpy는 항상 null 문자로 대상 문자열을 종료하지는 않습니다).
  2. %s이(가) %d과(예: printf("%s", 2000)가 주소 0x7D0에 있는 모든 것을 인쇄하는 경우 null 문자가 누락될 수 있습니다.
  3. "sprintf"에 대한 인수 수가 형식 문자열과 일치하지 않습니다. 다음 예를 고려하십시오.
    const char *formatstr = "Test1 %c Test2 %c\n";
    printf(formatstr, 'A');

printf(또는 sprintf) 함수에 대한 인수 수가 형식 문자열(너무 적음)과 일치하지 않습니다. 형식 문자열은 동적 문자열이므로 컴파일러는 경고를 발생시키지 않습니다. 이 예에서는 메모리에 있는 내용에 따라 "Test1 A Test2 @"가 인쇄됩니다.

초기화되지 않은 랜덤 메모리를 확인하는 기술은 RAM에 패턴을 채우는 것입니다(예: '0xAA'). 가비지 문자가 '0xAA'로 변경되면 응용 프로그램 어딘가에 문자열 처리 오류가 있다는 것을 알 수 있습니다. 그렇지 않은 경우 문자가 다른 데이터 또는 코드 위치에서 올 수 있습니다.

또 다른 기법은 '\0'으로 대상 문자열을 완전히 초기화한 후 이를 사용하는 것이다. 이 작업은 테스트로 수행해야 합니다. 즉, 증상을 없앨 수 있지만 문제는 여전히 존재합니다.

 

모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.