1

assert*-O으로 버려지지만 precondition*-Ounchecked이 설정되어 있지 않으면 유지된다는 설명을 찾을 수 있습니다.전체 모듈 최적화 모드에서 유지되는 어설 션은 무엇입니까?

그러나 릴리스 빌드의 새로운 기본값은 whole-module optimization-wmo입니다.

전체 모듈 최적화를 사용할 때 precondition* 어설 션이 유지됩니까?

+2

https://developer.apple.com/reference/swift/1541112-assert 및 https://developer.apple.com/reference/swift/1540960-에 조건이 점검 될 때 정확하게 전제 조건 목록. 전체 모듈 최적화가 차이를 만들지는 않겠지 만 실패한 조건을 추가하고 프로그램을 실행하여 손쉽게 테스트 할 수 있습니다. –

+0

AppCode에 대해서는 잘 모르겠지만 Xcode 빌드 설정에 "-O- 전체 모듈 최적화"가 있습니다. 그래서 이것들은 다른 옵션이고 assert/precondition의 문서는 여전히 정확하다고 가정합니다. –

+0

@MartinR 예, AppCode의 설정으로 인해 혼란 스러웠습니다. [FWIW] (https://youtrack.jetbrains.com/issue/OC-14836). – Raphael

답변

1

것은이 작은 프로그램 생각해

func f(_ i: Int) -> Int { 
    assert(i > 0, "needed positive number") 
    return i 
} 

print(f(0)) 

xcrun swiftc [opt]로 컴파일하고 결과를 실행하는 제공 :

  • -Onone : 어설 션 오류
  • -Onone -wmo : 어설 션 오류
  • -O : 출력 0
  • -O -wmo : 인쇄

0 비교 :

func f(_ i: Int) -> Int { 
    precondition(i > 0, "needed positive number") 
    return i 
} 

print(f(0)) 
  • -Onone : 전제 오류
  • -Onone -wmo : 전제 오류
  • -O : 잘못된 명령어 4
  • -O -wmo : 불법 수업 : 4

전체 모듈 최적화가 어설 션을 처리하는 방법에는 영향을 미치지 않습니다. 최적화 수준 만 중요합니다.


Apple Swift version 3.0.1 (swiftlang-800.0.58.6 clang-800.0.42.1) 
Target: x86_64-apple-macosx10.9 
+1

당신이 가진 마지막 두 결과를 설명하는'precondition' 문서의 관련 비트는 "* 놀이터 및 - 일부 빌드 [...] : 조건이 false로 평가되면 프로그램 실행을 디버그 가능 상태로 중지합니다 ** **. * "및"* -O -O builds [...] : 조건이 false로 평가되면 ** 프로그램 실행을 중지합니다. *** ". -O 빌드의 Xcode에서 두 번째 예제를 실행하면 모든 종류의 오류 메시지를 인쇄하는 대신 EXC_BAD_INSTRUCTION 만 제공된다는 것을 알 수 있습니다. Swift가 -O 빌드에서 제공하는 유일한 약속은 실패한 전제 조건으로 인해 프로그램이 중단된다는 것입니다. – Hamish

+1

'-Ounchecked' ('-wmo')의 결과를 주목할 가치가 있습니다. - 전체 모듈 최적화가이 경우에도 결과에 영향을 미치지 않는 것 같습니다. – Hamish

+0

@Hamish True - 동작이이 사양을 충족합니다. 나는 그들이 수표를 지키고 메시지를 최적화하는 것 같아? 나는이 경우에 메시지를 선호하기 때문에 그렇지 않으면'단언 할 때'전제 조건으로 사용하는 것이 매우 제한적이다. – Raphael

관련 문제