programing

이 오류는 무엇을 의미합니까? 'somefile.c:200: error: 1032바이트의 프레임 크기가 1024바이트보다 큽니다.'

jooyons 2023. 11. 6. 21:48
반응형

이 오류는 무엇을 의미합니까? 'somefile.c:200: error: 1032바이트의 프레임 크기가 1024바이트보다 큽니다.'

만드는 동안 다음과 같은 오류가 발생합니다.

cc1: warnings being treated as errors
somefile.c:200: error: the frame size of 1032 bytes is larger than 1024 bytes

선 번호는 다음과 같은 기호가 있는 c 함수의 닫힘 괄호를 가리킵니다.

void trace(SomeEnum1 p1, SomeEnum2 p2, char* format, ...) {
    char strBuffer[1024];
    ...

기능은 버퍼에 몇 가지를 인쇄합니다.

이런 유형의 오류가 일반적으로 무엇을 의미하는지 아는 사람?

이 루틴에는 스택 할당된 큰 버퍼가 있는 것 같습니다. 이로 인해 해당 함수의 스택 프레임이 1024바이트를 초과할 가능성이 있습니다. 이는 구축 중인 아키텍처에 대한 컴파일러 강제 제한으로 보입니다.가능한 해결책으로는 컴파일러 플래그를 전달하여 경고를 완화하거나 스택 크기의 상한을 확장하거나 버퍼를 동적으로 할당하는 것이 있습니다.

다음은 이 경고와 관련된 GCC 문서입니다.

STACK_CHECK_MAX_FRAME_SIZE

스택 프레임의 최대 크기(바이트)입니다.GNU CC는 적어도 이렇게 많은 바이트의 스택을 사용할 수 있도록 비리프 함수에서 프로브 명령을 생성합니다.스택 프레임이 이 크기보다 크면 스택 검사를 신뢰할 수 없으며 GNU CC에서 경고를 표시합니다.기본값은 GNU CC가 대부분의 시스템에서 하나의 명령어만 생성하도록 선택됩니다.일반적으로 이 매크로의 기본값을 변경해서는 안 됩니다.

출처: http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_17.html#SEC214

-Wframe-larger-than

경고는 다음과 같이 생성됩니다.-Wframe-larger-than.man gccGCC 7은 다음과 같이 말합니다.

함수 프레임의 크기가 len바이트보다 클 경우 경고합니다.스택 프레임 크기를 결정하기 위해 수행된 계산은 근사적이며 보수적이지 않습니다.경고를 받지 않더라도 실제 요구사항은 렌보다 다소 많을 수 있습니다.또한 "alloca", 가변 길이 배열 또는 관련 컨스트럭트를 통해 할당된 공간은 경고 여부를 결정할 때 컴파일러에 의해 포함되지 않습니다.

최소 예제

본전의

int main(void) {
    char s[1024];
    return 0;
}

그리고:

$ gcc -std=c99 -O0 -Wframe-larger-than=1 main.c
main.c: In function ‘main’:
main.c:4:1: warning: the frame size of 1040 bytes is larger than 1 bytes [-Wframe-larger-than=]
 }
 ^
$ gcc -std=c99 -O0 -Wframe-larger-than=2048 main.c
# No warning.

존재하는 이유

운영 체제는 스택 크기를 제한해야 합니다. 그렇지 않으면 힙 /에 도달할 때까지 스택 크기가 커집니다.mmap모든 것이 예상치 못하게 깨질 겁니다

리눅스는 프로그램이 최대 스택 크기를 초과하여 증가하려고 하면 신호를 보냅니다.

-Wframe-larger-than=는 (스택에 배치된) 함수 로컬 변수를 작게 유지하여 스택의 오버플로를 방지하는 방법입니다.

그러나 재귀 함수를 호출할 때 문제가 발생할 가능성이 높고, 모두 재귀 횟수로 귀결되기 때문에 컴파일 시간이 보장되지는 않습니다.

해결책은 메모리를 다음과 같이 할당하는 것입니다.malloc큰 배열을 로컬 변수로 사용하는 대신.이것은 결국 사용하게 됩니다.mmap기억.

스택과 스택 사이의 키 차이malloc메모리는 스택이 연속적이어야 한다는 것이고, 이것은 단순하게 메모리 패킹 효율성을 높이는 반면,malloc복잡한 휴리스틱이 필요합니다.참고 항목:

언급URL : https://stackoverflow.com/questions/2450845/what-does-this-error-mean-somefile-c200-error-the-frame-size-of-1032-bytes

반응형