문자열 내에 “쓰래기 값”
기술노트 96004
아키텍처:
All
컴포넌트:
general
업데이트:
2021-07-15 오후 10:17
소개
어떤 경우에는, printf 로 인쇄된 문자열이나 sprintf를 사용한 후에 설명되지 않은 쓰래기 값이 있습니다.
해결방법
sprintf/printf에 사용되는 형식 문자열을 철저히 확인합니다.
또한 strncat 사용 오류도 확인합니다(아래 예).
배경
설명되지 않은 문자에 대한 여러 가지 설명이 있습니다:
- %s에서 사용하는 문자열 중 일부는 null '\0' 문자로 종료되지 않습니다. strncpy가 이전에 사용된 경우일 수 있습니다(strncpy는 항상 null 문자로 대상 문자열을 종료하지는 않습니다).
- %s이(가) %d과(예: printf("%s", 2000)가 주소 0x7D0에 있는 모든 것을 인쇄하는 경우 null 문자가 누락될 수 있습니다.
- "sprintf"에 대한 인수 수가 형식 문자열과 일치하지 않습니다. 다음 예를 고려하십시오.
const char *formatstr = "Test1 %c Test2 %c\n";
printf(formatstr, 'A');
printf(또는 sprintf) 함수에 대한 인수 수가 형식 문자열(너무 적음)과 일치하지 않습니다. 형식 문자열은 동적 문자열이므로 컴파일러는 경고를 발생시키지 않습니다. 이 예에서는 메모리에 있는 내용에 따라 "Test1 A Test2 @"가 인쇄됩니다.
초기화되지 않은 랜덤 메모리를 확인하는 기술은 RAM에 패턴을 채우는 것입니다(예: '0xAA'). 가비지 문자가 '0xAA'로 변경되면 응용 프로그램 어딘가에 문자열 처리 오류가 있다는 것을 알 수 있습니다. 그렇지 않은 경우 문자가 다른 데이터 또는 코드 위치에서 올 수 있습니다.
또 다른 기법은 '\0'으로 대상 문자열을 완전히 초기화한 후 이를 사용하는 것이다. 이 작업은 테스트로 수행해야 합니다. 즉, 증상을 없앨 수 있지만 문제는 여전히 존재합니다.
모든 제품 이름은 해당 소유자의 상표 또는 등록 상표입니다.