programing

C가 프로그램을 컴파일하는 것과 실행하는 것에 차이가 있습니까?

bestprogram 2023. 9. 24. 13:02

C가 프로그램을 컴파일하는 것과 실행하는 것에 차이가 있습니까?

되지 않은 될 때 : C 하고의 시작 ()main), 컴파일구현이 이를 거부할 경우 적합합니까?프로그램을 컴파일/번역하는 것과 실행하는 것 사이에 C의 차이가 있습니까?

C의 통역사가 있는 것으로 알고 있습니다.이 차이에 대해서 C 표준으로 어떻게 처리합니까?

예제(초기화되지 않은 로컬 읽기)

int main() {
  int i;
  return i;
}

시 전이라도 (이라도) 이라도)main라고 함), 프로그램은 재미있는 것을 할 수 있습니다.하지만 우리가 그것을 실행해보지도 않았는데 재미있는 일이 일어날 수 있을까요?컴파일러 자체에 버퍼 오버플로가 발생할 수 있습니까?

C11 초안에서:

3.4.3 미정의 행위

휴대가 불가능하거나 잘못된 데이터의 프로그램 구성자를 사용할 때, 본 국제 표준이 요구 사항을 부과하지 않는 거동

참고 예측할 수 없는 결과로 상황을 완전히 무시하는 것부터 번역 또는 프로그램 실행 중에 환경의 특성을 나타내는 문서화된 방식으로 행동하는 것(진단 메시지가 발행되거나 발행되지 않는 것),(진단 메시지 발행과 함께) 번역 또는 실행을 종료합니다.

번역을 종료하는 것은 (비규범적) 노트에서 정의되지 않은 행동의 가능한 결과로 언급되므로 컴파일 시간 효과는 분명히 제외되지 않습니다.규범적인 부분은 확실히 그것을 허용합니다 - 그것은 무엇이든 허용합니다.따라서 컴파일러를 준수하면 컴파일 중에 정의되지 않은 동작을 감지하면 번역을 종료할 수 있습니다.

추가로 $4 준수 사항:

제약 조건 또는 런타임 제약 조건을 벗어나 나타나는 "할 것" 또는 "할 것" 요구 사항을 위반하면 동작이 정의되지 않습니다.미정의 행위는 이 국제 표준에서 "미정의 행위"라는 단어 또는 행위에 대한 명시적인 정의를 생략함으로써 달리 표시됩니다.이 세 가지는 강조점에 차이가 없습니다; 그들은 모두 '정의되지 않은 행동'을 묘사합니다.

"번역 시간"과 "실행 시간"의 적합성 설명에 있어서도 규범적 정의에 있어서도 구별이 이루어지지 않고 있습니다.정의되지 않은 행동의 서로 다른 "다양성" 사이에는 차이가 없습니다.

또한, 절대 실행되지 않을 코드가 정의되지 않은 행위를 호출할 수 있습니까?다음과 같은 응답이 있습니다.

[...] 평가 결과가 정의되지 않은 동작을 초래할 식이 일정한 식이 필요한 컨텍스트에 나타나면 포함된 프로그램이 엄격하게 일치하지 않습니다.또한, 주어진 프로그램의 모든 가능한 실행이 정의되지 않은 행동을 초래한다면, 주어진 프로그램은 엄격하게 준수되지 않습니다.

단순히 해당 프로그램의 일부 실행 가능성으로 인해 정의되지 않은 동작이 발생한다는 이유만으로 적합한 구현이 엄격하게 적합한 프로그램을 변환하지 못해서는 안 됩니다. [...]

이것은 컴파일러가 모든 경로가 정의되지 않은 동작으로 이어진다고 정적으로 판단할 수 없는 경우 변환에 실패할 수 없음을 의미합니다.

C11 표준 §3.7.1에는 미정의 행위라는 용어의 정의에 따라 다음과 같이 명시되어 있습니다.

미정의 행위: 휴대가 불가능하거나 잘못된 데이터의 프로그램 구성자를 사용할 때의 행위, 이 국제 표준이 요구 사항을 부과하지 않는 행위

2 참고 예측할 수 없는 결과로 상황을 완전히 무시하는 것부터 번역 또는 프로그램 실행 중에 환경의 특성을 나타내는 문서화된 방식으로 행동하는 것(진단 메시지의 발행 여부에 관계없이)까지 가능한 미정의 행동,(진단 메시지 발행과 함께) 번역 또는 실행을 종료합니다.

따라서 정의되지 않은 동작이 포함된 프로그램이 유효하더라도 정적으로 거부할 수 있다고 생각합니다.

컴파일 시 구현이 이를 거부할 경우 적합합니까?

그럴 수도 아닐 수도 있습니다.C 표준은 섹션 §3.4.3에서 이에 대해 다음과 같이 말합니다.

C11: 3.4.3 미정의 행위

  1. 휴대가 불가능하거나 잘못된 데이터의 프로그램 구성자를 사용할 때, 본 국제 표준이 요구 사항을 부과하지 않는 거동

  2. 참고 예측할 수 없는 결과로 상황을 완전히 무시하는 것부터 번역 또는 프로그램 실행 중에 환경의 특성을 나타내는 문서화된 방식으로 행동하는 것(진단 메시지가 발행되거나 발행되지 않는 것),(진단 메시지 발행과 함께) 번역 또는 실행을 종료합니다.

그렇다면 당신의 질문에 대한 답은: 컴파일러 자체에 버퍼 오버플로를 일으킬있습니까?

네, 가능합니다.

언급URL : https://stackoverflow.com/questions/34557398/does-c-make-a-difference-between-compiling-and-executing-a-program