argc가 오버플로 될 수 있습니까?
나는 방황하고 있었고이 질문을 보았다 . 그런 다음 argc를 오버플로 할 수 있는지 궁금해하기 시작했습니다.
Standard는 argv[argc]
null 포인터 여야하지만 argc가 오버플로되면 false가됩니다.
(내가 쓴 작은 C 프로그램과 테스트 만 가지고하는 파이썬 스크립트를 MemoryError
.)
감사!
국제 표준의 근거 — 프로그래밍 언어 — C §5.1.2.2.1 프로그램 시작
광범위한 사전 관행 을 인식하기 위한 인수
argc
및 의 사양 . 또한 일반적인 관행을 기반으로 목록 끝에 대한 중복 검사를 제공하려면 null 포인터 여야합니다.argv
main
argv[argc]
표준에 따라
따라서 귀하의 견적에서 :
argv[argc]
널 포인터 여야합니다.
따라서 argc
위의 진술이 사실이 아니기 때문에 오버플로 할 수 없습니다.
실제로
실제로 프로그램에 전달되는 인수의 총 크기는 제한됩니다.
내 Linux / x64 시스템에서 :
$ getconf ARG_MAX 2097152
따라서 총 인수 크기는 약 2MB이며 argc
오버플로 할 수 없습니다. 이 제한은 전체 데이터 argv
와 환경 의 조합을 측정한다고 생각 합니다. 명령을 실행하려고 할 때이 제한을 초과하면이 ( exec()
가) 실패하고 E2BIG
. 에서 man 2 execve
:
E2BIG 환경 (envp) 및 인수의 총 바이트 수 목록 (argv)이 너무 큽니다.
내 시스템의 ~ 2MB 제한은 다른 시스템에 비해 상대적으로 관대하다고 생각합니다. 내 OS X 시스템이 최대 260KB로보고됩니다.
하지만 ARG_MAX
정말 크다면 어떨까요?
좋아요, 당신이 오래되고 이상한 시스템에 있다고 가정 해 봅시다. int
16 비트이고 ARG_MAX는 2 15를 훨씬 넘습니다 . 그렇지 않으면 상당히 합리적입니다. 이제 execve()
2 개 이상의 15 개 인수 를 사용하여 호출한다고 가정합니다 . 구현에는 두 가지 옵션이 있습니다.
argc
오버플로 를 허용 할 수 있습니다 . 기본적으로 데이터를 버리고 실행중인 프로그램이 예상치 못한 잘못된 방식으로 실행되도록하고 C 표준을 위반합니다. 무엇보다도 오류가 조용하기 때문에 모를 수도 있습니다.또는 단순히 반환 할 수
EOVERFLOW
에서execve()
단순히 많은 매개 변수를 사용하여 이미지를 실행할 수 있음을 알리는. 이제 POSIX / SUS 표준은이 오류 결과에 대해 언급하지 않지만, 이는 단순히 표준 작성자ARG_MAX
가INT_MAX
.
옵션 # 2는 유일한 합리적인 옵션입니다. 시스템이 어떻게 든 옵션 # 1을 선택 하면 고장난 것이므로 버그 보고서를 제출해야합니다.
또는 16 비트 시스템 용으로 컴파일 된 이전 프로그램을 실행하려고 할 수 있지만 일종의 에뮬레이터 또는 호환성 계층을 통해 실행하고 있습니다. 프로그램에 2 15 개 이상의 매개 변수를 전달하려고하면 에뮬레이터 또는 호환성 계층에서 오류 메시지가 표시 될 것으로 예상합니다 .
실제로는 할 수 없습니다. 대부분의 시스템은 argv
및 의 총 결합 크기에 상대적으로 낮은 제한을 둡니다 envp
. 수십에서 수백 KB까지의 제한은 드문 일이 아닙니다. 다양한 OS에 대한 제한에 대한 합리적으로 포괄적 인 목록 은 http://www.in-ulm.de/~mascheck/various/argmax/ 를 참조 하십시오 .
나는 이것을 시도했다 :
test.c :
⚡⚡⚡ more test.c
#include <stdio.h>
int main(int argc, char **argv)
{
printf("argc = %d\n", argc);
printf("Size of argc = %d\n", sizeof(argc));
return 0;
}
그런 다음 큰 zip 파일을 사용했습니다.
⚡⚡⚡ ls -h bigfile
-rw-r--r-- 1 ehwas ehwas 355M Jan 22 16:54 bigfile
그런 다음 파일을 테스트 프로그램의 매개 변수로 읽습니다.
⚡⚡⚡ ./test $(more bigfile)
결과:
5 minutes nothing happend, then everything froze
그런 다음 더 작은 파일을 시도했습니다.
⚡⚡⚡ ls -h notsobigfile
-rw-r--r-- 1 ehwas ehwas 6.7M Jan 22 17:04 notsobigfile
과:
⚡⚡⚡ ./test $(more notsobigfile)
bash: ./test: Argument list too long
As indicated by the standard, argv[argc] must be a valid value.
So if the run-time environment is in a situation such that it cannot guarantee that, it should not start the program.
참고URL : https://stackoverflow.com/questions/28075323/can-argc-overflow
'Nice programing' 카테고리의 다른 글
makefile에서 쉘 환경 변수를 얻는 방법은 무엇입니까? (0) | 2020.10.19 |
---|---|
Cassandra와 CouchDB의 차이점은 무엇입니까? (0) | 2020.10.19 |
Windows에서 큰 텍스트 파일을 읽는 방법은 무엇입니까? (0) | 2020.10.19 |
Authorize 속성의 MVC5 클레임 버전 (0) | 2020.10.19 |
std :: transform 및 유사하게 'for'루프 증분을 (void)로 캐스팅하는 이유는 무엇입니까? (0) | 2020.10.19 |