argc가 넘칠 수 있나요?
SO를 헤매다가 이 질문을 봤어요.그래서 argc를 넘칠 수 있을까라는 생각을 하게 되었습니다.
스탠다드에 의하면argv[argc]
null 포인터여야 하지만 argc 오버플로우일 경우 false가 됩니다.
(작은 C프로그램과 python 스크립트를 작성하여 테스트했는데,MemoryError
.)
감사합니다!
국제표준 - 프로그래밍 언어 - C © 5.1.2.1 프로그램 부팅의 근거
의 사양
argc
그리고.argv
의 논거로서main
는 광범위한 선행 사례를 인식하고 있습니다.argv[argc]
는, 리스트의 말미에 용장 체크를 실시하기 위해서도, 통상의 프랙티스에 근거해 늘 포인터로 할 필요가 있습니다.
기준에 따라
그럼, 당신의 견적에 따르면:
argv[argc]
null 포인터여야 합니다.
그러므로,argc
오버플로우 할 수 없습니다.그러면 위의 문장이 사실이 아니기 때문입니다.
실제로
실제로 프로그램에 전달되는 인수의 총 크기는 제한됩니다.
Linux/x64 시스템의 경우:
$getconf ARG_MAX2097152
따라서 인수 사이즈의 합계는 약 2MB입니다.argc
오버플로우 할 수 없습니다.이 한계는 총 데이터 조합을 측정하는 것입니다.argv
환경도 고려해야 합니다.명령어를 실행하려고 할 때 이 제한을 초과하면exec()
에 실패하다E2BIG
. 발신인:
E2BIG 환경 내 바이트 수(envp) 및 인수list(v)가 너무 큽니다.
최대 2메가바이트의 제한은 다른 시스템에 비해 비교적 관대하다고 생각합니다.OS X 시스템에서 보고되는 제한은 최대 260KB입니다.
하지만 만약ARG_MAX
정말 컸어요?
좋아요, 당신이 오래된/이상한 시스템을 사용한다고 가정해 봅시다.int
는 16비트, ARG_MAX는 2를 훨씬15 웃돌고 있습니다.그렇지 않으면 상당히 합리적입니다.이제 호출한다고 가정해 봅시다.execve()
3개 이상의 인수를 사용합니다15.구현에는 두 가지 옵션이 있습니다.
할 수 있다
argc
기본적으로 데이터를 폐기하고 실행 중인 프로그램이 예기치 않은 방식으로 실행되며 C 표준을 위반하는 것입니다.가장 나쁜 것은 오류가 침묵하기 때문에 알 수 없다는 것입니다.아니면 그냥 돌아올 수도 있고
EOVERFLOW
부터execve()
이렇게 많은 파라미터로는 이미지를 실행할 수 없다는 것을 알려드립니다.POSIX/SUS 규격에는 이 에러 결과에 대해서는 일절 기재되어 있지 않습니다.하지만, 이건 그냥 평범한 작가들이 전혀 예상하지 못했기 때문인 것 같아요.ARG_MAX
크다INT_MAX
.
옵션 #2만이 합리적인 옵션입니다.시스템에서 옵션 #1을 선택한 경우 해당 옵션은 고장났기 때문에 버그 보고서를 제출해야 합니다.
또는 16비트 시스템용으로 컴파일된 오래된 프로그램을 실행하려고 할 수도 있지만 에뮬레이터나 호환성 계층을 통해 실행할 수도 있습니다.프로그램에 3개 이상의15 파라미터를 전달하려고 하면 에뮬레이터 또는 호환성 계층에서 오류 메시지가 나타납니다.
제로 、 ,, 、 ,,, 없없없 없없 없없 。가 비교적 되어 있습니다.argv
★★★★★★★★★★★★★★★★★」envp
. 10 ~ 수백 KB의 제한은 드물지 않습니다.다양한 OS의 제한에 대한 합리적이고 포괄적인 목록은 http://www.in-ulm.de/ ~mascheck/mascheck/mascheck/mascheck/maschax/masmax/를 참조하십시오.
이거 해봤어요.
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
표준에서 나타내는 바와 같이 argv[argc]는 유효한 값이어야 합니다.
따라서 런타임 환경이 이를 보장할 수 없는 상황일 경우 프로그램을 시작하지 않아야 합니다.
언급URL : https://stackoverflow.com/questions/28075323/can-argc-overflow
'programing' 카테고리의 다른 글
"BEGIN_OBJECT가 필요하지만 1행 1열에 STRING이었습니다." (0) | 2022.08.09 |
---|---|
기존 웹 페이지 내에서 npm 없이 구성 요소 사용 (0) | 2022.08.09 |
Vue-router를 사용한 Firebase 인증 확인 (0) | 2022.08.09 |
unshift를 사용하여 어레이를 올바르게 업데이트하지 않음 (0) | 2022.08.09 |
Vuetify를 사용하여 v-stepper-header 번호 제거 (0) | 2022.08.09 |