변수/printf의 널 바이트에 대한 POSIX awk의 입장은 무엇입니까?

변수/printf의 널 바이트에 대한 POSIX awk의 입장은 무엇입니까?

printfPOSIX에 따르면 awk 함수를 사용하여 널 바이트를 인쇄하는 것이 합법적입니까? 이것POSIX 표준awk어느 쪽이든 명시적으로 언급되지 않은 것 같습니다. 실제 구현은 다르게 동작합니다.

+$ gawk 'BEGIN { x = sprintf("\000"); print(length(x)); }'
1
+$ busybox awk 'BEGIN { x = sprintf("\000"); print(length(x)); }'
0
+$

그리고

+$ gawk 'BEGIN { printf("\000"); }' | xxd
00000000: 00                                       .
+$ busybox awk 'BEGIN { printf("\000"); }' | xxd
+$

표준에 명시되어 있나요? 그렇다면, x = sprintf("\000")Variable()과 printf()에 필요한 동작이 printf("\000")동일합니까?

답변1

관련 텍스트가 4개 이상 있습니다.POSIX.2018 사양awk:

아래에 인용된 모든 텍스트에서 강조(굵은 텍스트)는 제가 한 것입니다.

다음 소스 중 하나의 awk 프로그램에 대한 입력 파일은 다음과 같아야 합니다.텍스트문서

이는 입력에 NUL 문자가 포함되어 있으면(POSIX 텍스트 정의에 따라 텍스트가 아닌 경우) 동작이 지정되지 않음을 의미합니다.

\ddd : <백슬래시> 문자 뒤에 1, 2 또는 3개의 8진수 문자로 구성된 가장 긴 순서가 옵니다(01234567). 모든 숫자가 0(즉, NUL 문자 표현)인 경우 동작은 정의되지 않습니다..

이로 \000인해 정의되지 않은 동작이 발생합니다.

정규식 일치 관련:

그러나 모든 awk ERE 경기에서는패턴, 입력 레코드 또는 텍스트 문자열에 하나 이상의 NUL 문자를 사용하면 정의되지 않은 결과가 생성됩니다.

에 대한 printf/ sprintf:

7. c 변환 지정자의 경우: 인수에 숫자 값이 있으면 해당 값으로 인코딩된 문자가 출력되어야 합니다.값이 0인 경우또는 문자 세트의 문자 인코딩이 아닙니다.동작이 정의되지 않았습니다..

따라서 이는 NUL 문자를 가져오는 또 다른 방법이므로 정의되지 않은 동작이 발생합니다.

요약하면 awkPOSIX는 NUL 문자를 입력, 출력 또는 변수 저장 등 이식성 있게 사용할 수 없음을 알려줍니다.

gawk(적어도 1989년 2.10 이후, 이는 내가 찾을 수 있는 가장 초기 버전입니다.NUL 지원 문서화) 그리고@토마스디키mawk(부터버전 20140914)은 NUL을 처리할 수 있는 두 가지 구현입니다.

답변2

awkC 문자열은 일반적 으로 기본적으로 일종의 C 인터프리터인 nul 바이트를 포함할 수 없습니다 . Null 바이트를 인쇄할 수 있는 POSIX 유틸리티는 POSIX 표준에서 명시적으로 언급되어야 합니다. printf그러나 awk그것은 진실이 아니다.

다음 상황은 POSIX에 명시적으로 나열되어 있습니다.

echo 'x\0000y'
printf 'x\000y\n'
printf '%b\n' 'x\0000y'

세 가지 명령 모두 POSIX UNIX 브랜드가 있는 인증된 운영 체제에서 4자를 인쇄합니다.

귀하의 awk예에서는 지정되지 않은 동작을 사용합니다.

관련 정보