programing

argv[n]가 쓰기 가능합니까?

subpage 2023. 9. 1. 21:00
반응형

argv[n]가 쓰기 가능합니까?

C115.1.2.2.1/2는 다음을 의미합니다.

변수 개 변argc그리고.argv▁the▁pointed끈▁to▁strings로 가리키는 줄.argv배열은 프로그램에 의해 수정 가능해야 하며, 프로그램 시작과 프로그램 종료 사이에 마지막 순서 값을 유지해야 합니다.

이것에 대한 제 해석은 다음과 같습니다.

int main(int argc, char **argv)
{
    if ( argv[0][0] )
        argv[0][0] = 'x';   // OK

    char *q;
    argv = &q;              // OK
}

그러나 다음과 같은 내용은 없습니다.

int main(int argc, char **argv)
{
    char buf[20];
    argv[0] = buf;
}

아이즈argv[0] = buf;허용되나요?

저는 (적어도) 두 가지 가능한 주장을 볼 수 있습니다.

  • 위의 인용구는 의도적으로 언급된 것입니다.argv그리고.argv[x][y]하지만 아닙니다.argv[x]할 수 없다는 이었습니다.
  • argv는 non-syslog 포인터입니다.const객체, 따라서 반대의 구체적인 표현이 없는 경우, 우리는 그것들이 수정 가능한 객체라고 가정해야 합니다.

와 같은 , 코드종류argv[1] = "123"; UB은 UB(원본사용원))argv).


""는 다음과 같습니다argc그리고.argv▁the▁pointed끈▁to▁strings로 가리키는 줄.argv배열은 프로그램에 의해 수정될 수 있어야 하며, 프로그램 시작과 프로그램 종료 사이에 마지막으로 저장된 값을 유지해야 합니다." C11dr & C17dr1 § 5.1.2.2.12

을 하시오.constC가 만들어진 지 여러 해 후에 C에 들어왔습니다.

의거와 매우 합니다.char *s = "abc";그래야 할 때 유효합니다.const char *s = "abc";const. 그렇지 것입니다. 그렇지 않았다면 너무 많은 기존 코드가 의 도입으로 깨졌을 것입니다.const.

가지로찬마설라도, 사▁if,.argv오늘은 고려되어야 합니다.char * const argv[] 아면다서있는이명른니가 있는 다른 .constconst에 시대에char *argv[]에서는 완히지지않다습니를 지정하지 않습니다.const -ness 니즈argv,argv[]또는argv[][].const-ness 요구는 사양에 따라 결정되어야 합니다.

내가 읽은 바로는, 스펙은 이슈에 대해 침묵하고 있지만, 다른 과제에 대해서는 깊이 들어가 있기 때문입니다.main()argv = 그리고.argv[i][j] = UB입니다.

정의되지 않은 행동은 이 국제 표준에서 "정의되지 않은 행동"이라는 단어 또는 행동의 명시적 정의의 생략으로 표시됩니다." § 42


[편집]:

main()는 C 에매특기능다니입별한우는에서 입니다.은 른다기서허것는은다용음허허않있에서 허용될 수도 있고 되지 않을 .main()C 명 을 특 대 합 니 에 변 수 개 제 공 한 ▁the 니 다int argc, char *argv[]그럴 필요가 없습니다.main(), 에서는 서명 C의 다 함 달 대 서 명 수 있 습 니 다 가 질 을 른 체 수 리와를 가질 수 .int main(void)그리고 잠재적으로 다른 사람들.main()재입국이 아닙니다.C 사양은 수정할 수 있는 항목을 자세히 설명합니다.argc,argv,argv[][]의문을 제기하는 것이 타당합니다.argv[]코드가 할 수 있다고 주장하는 규격에서 누락되었기 때문에 수정할 수 있습니다.

고때할려의 할 때.main()그리고 그것을 명시하는 것의 생략.argv[]보수적인 프로그래머는 이 회색을 UB로 취급하여 향후 C 사양을 명확히 할 때까지 처리할 수 있습니다.


한다면argv[i]플랫폼에서 하며, 주진플에수가며하능정, 확히범는의 입니다.i초해서안됩니를 초과해서는 안 .argc-1.

"로서argv[argc] 포인터가 함 null 포터되어함야할당", 인가를 합니다.argv[argc]이외의 것으로NULL위반으로 보입니다.

문자열은 수정할 수 있지만 코드는 원래 문자열의 길이를 초과하면 안 됩니다.

char *newstr = "abc";
if (strlen(newstr) <= strlen(argv[1])) 
  strcpy(argv[1], newstr);

1 C17/18에 변경 사항 없음.그 버전은 많은 것을 명확히 하기 위한 것이었기 때문에, 이 규격은 적절하고 누락되지 않았습니다.argv배열 요소는 수정 가능해야 합니다."

argv어레이를 수정할 필요는 없지만 실제 구현에서는 가능할 수 있습니다.이것은 1998년 n849 회의에서 재확인된 의도적인 표현입니다.

https://www.open-std.org/jtc1/sc22/wg14/www/docs/n849.htm

PUBLIC REVIEW COMMENT #7

[...]

Comment 10.
Category: Request for information/clarification
Committee Draft subsection: 5.1.2.2.1
Title: argc/argv modifiability, part 2
Detailed description:

Is the array of pointers to char pointed to by argv modifiable?

Response Code: Q
    This is currently implictly unspecified and the committee 
    has chosen to leave it that way.

또한, 두 개의 별도 제안이 각각 문구를 변경하고 확대했습니다.둘 다 거절당했습니다.관심 있는 독자는 "argv"를 검색하여 찾을 수 있습니다.


트리비아: 커니헌과 리치의 예시 C 프로그래밍 언어의 두 번째 단("K&R2")은 이에 위배됩니다.117페이지에 있으며 관련 코드 행은 다음과 같습니다.

while (c = *++argv[0])

이 명령은 문자열의 문자를 통과하도록 인수 벡터 자체 내부의 포인터를 증가시킵니다.

argc 냥그입니다.int제한 없이 수정할 수 있습니다.

argv는 수정 가능한 수정수있입니다.char **은 는뜻입다니라는 뜻입니다.argv[i] = x유효합니다.하지만 그것은 아무 것도 말하지 않습니다.argv[i]그 자체를 수정할 수 있습니다. 그래서.argv[i][j] = c정의되지 않은 동작으로 이어집니다.

getoptC 표준 라이브러리의 함수는 argc와 argv를 수정하지만 실제 char 배열은 수정하지 않습니다.

정답은 argv가 배열이고 네, 그 내용은 수정 가능합니다.

키는 동일한 섹션의 앞부분에 있습니다.

argc의 값이 0보다 클 경우 array members argv[0] ~ argv[argc-1] include는 문자열에 대한 포인터를 포함해야 하며, 이는 프로그램 시작 전에 호스트 환경에 의해 구현 정의 값이 지정됩니다.

이로부터 argv가 특정 길이(argc)의 배열로 생각되는 것이 분명합니다.그러면 *argv는 포인터로 감쇠된 해당 배열에 대한 포인터입니다.

이 맥락에서 읽으십시오. 'argv는 수정 가능해야 합니다...그리고 그 내용을 유지'는 배열의 내용을 수정할 수 있도록 명확하게 의도합니다.

저는 특히 argc가 수정될 경우 발생할 수 있는 일에 대해 문구에 약간의 모호성이 남아 있다는 것을 인정합니다.


제 말은 제가 이 언어를 의미하는 것으로 읽었다는 것입니다.

[Argv [array]의 내용과 Argv 배열이 가리키는 문자열은 수정 가능해야 합니다...

따라서 배열의 포인터와 이들이 가리키는 문자열은 모두 읽기-쓰기 메모리에 있으며, 변경해도 손상되지 않으며 프로그램의 수명 동안 값을 보존합니다.저는 이 동작이 예외 없이 모든 주요 C/C++ 런타임 라이브러리 구현에서 발견될 것이라고 예상합니다.UB가 아닙니다.

모호함은 argc에 대한 언급입니다.argc(단순히 로컬 함수 매개변수로 보이는)의 값을 변경할 수 없는 어떤 목적이나 구현을 상상하기 어려운데, 왜 그것을 언급합니까?표준은 함수가 매개변수의 값을 변경할 수 있다고 분명히 명시하고 있는데, 왜 이 점에서 argc를 특별히 취급합니까?argv에 대한 이러한 우려를 촉발시킨 것은 argc에 대한 이 예상치 못한 언급이며, 그렇지 않으면 언급 없이 지나갈 것입니다.문장에서 argc를 삭제하면 모호함이 사라집니다.

라고 분명히 언급되어 있습니다.argv그리고.argv[x][x]수정할 수 있습니다. 만약에.argv수정 가능한 경우 배열의 다른 첫 번째 요소를 가리킬 수 있습니다.char 그므로러.argv[x]다른 문자열의 첫 번째 요소를 가리킬 수 있습니다.으로 궁적으로극▁ult.argv[x]또한 수정이 가능하며, 표준에서 명시적으로 언급할 필요가 없는 이유가 될 수 있습니다.

언급URL : https://stackoverflow.com/questions/25737434/is-argvn-writable

반응형