2017-02-14 1 views
1

몇 마디의 문제 __builtin_mul_overflow clang5 확장을 인식하지 못합니다 : 그 소리 5.1과 더불어, MAC OSX 10.8.5에, 컴파일러는 __builtin_mul_overflow 특히, 'clang5'확장을 인식하지 않는 것 unknown builtin으로 나옵니다. 문제는이 조건부 #if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000을 통해 나를 강제로 밀어 붙이는 최신 sqlite3 (3.17)을 컴파일하려고 시도한 후에 발생했습니다. CLANG 테스트에 합격했지만 GCC 테스트는 실패합니다 (버전은 아래 참조).OSX 10.8.5 : GCC는

sqlite3.c을 수정하여 이러한 내장 함수를 사용하지 않고이 문제를 피할 수있었습니다 (단락 된 CLANG 및 GCC_VERSION에 대한 선처리 조건부 검사가 있음).

내 질문은입니다. 내 시스템에서 clang5 확장을 사용할 수 있다고 오인하고 있습니까? 아니면 무언가가 깨졌을 수 있습니까? sqlite3.c은 내 시스템이 GCC-또는 -CLANG 버전 확인에 성공했음을 알리고 컴파일러 (gcc)가 unknown builtin 오류로 실패 할 것이라고 생각합니다.

전체 세부 사항 :

$ clang --version 
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin12.6.0 
Thread model: posix 

$ gcc --version 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin12.6.0 
Thread model: posix 

다음 프로그램 :

은 (sqlite3를 빌려) 출력을 제공

 # define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) 
# define CLANG_VERSION (__clang_major__*1000000+__clang_minor__*1000+__clang_patchlevel__) 

    #include <stdio.h> 

    int main(void){ 
      printf("CLANG_VERSION: %d\n", CLANG_VERSION); 
      printf("GCC_VERSION: %d\n", GCC_VERSION); 
    } 
:

CLANG_VERSION: 5001000 
GCC_VERSION: 4002001 

및 sqlite3.c는에 결정 이 코드를 사용하여 __builtin_mul_overflow을 사용하십시오 (li ne 28856 등) :

#if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000 
    return __builtin_mul_overflow(*pA, iB, pA); 
#else 
    ... code without the builtin which succeeds if check is short-circuited ... 
#endif 
+0

는'sqlite3'가 CLANG_VERSION'으로 괜찮 컴파일 (sqlite3.c에 선을 28834-28889 교체) 당신은'수행 할 때 또한 무슨 일이 ... 4002001' # 만약 GCC_VERSION> = 4002001 || CLANG_VERSION> = 5001000'? –

+0

감사합니다. 이전 버전과 마찬가지로 실패합니다 (내 버전에서는 분명합니다). 내 clang 버전 문자열 인'Apple LLVM 버전 5.1 (clang-503.0.40) (LLVM 3.4svn 기반) '은 clang5 ** 및 clang5 확장 **이 아닌 다른 것을 의미합니까? – bliako

+0

확장 기능은 기본적으로 기능이 현재 언어로 (언어 확장 또는 표준 언어 기능으로) 'Clang'에 의해 지원되는지, 그렇지 않다면 '0', '예'인 경우 '1'을 나타내는 데 사용됩니다. 어떤'sqlite3'을 소스에서 컴파일하려고합니까? –

답변

0

이것은 분명히 버그입니다. 즉, 누구는 Clang의 애플 버전을 인식하지 않습니다 sqlite3.cCLANG_VERSION>=4000000 검사에 넣어 당신은 (5.1)가 내장 기능을 지원하지 않습니다 있습니다

__builtin_add_overflow(*pA, iB, pA); 
__builtin_sub_overflow(*pA, iB, pA); 
__builtin_mul_overflow(*pA, iB, pA); 

그것은 명확하지 않습니다, 그러나 컴파일러는 계속된다 그렇게 생각하면 오류가 발생합니다. 이 체크를 제거하고이 경우 각각 #else 다음에 남은 코드로 이동하거나 실제로 해당 기능을 지원하는 버전으로 CLANG_VERSION>=을 수정하십시오. 어떤 식 으로든 컴파일하는 동안 올바른 코드를 사용해야합니다. 8000000`,`GCC_VERSION :

Modified Code

+0

"(5.1) 내장 기능을 지원하지 않는 Clang의 Apple 버전을 인식하지 못합니다. 정말입니까? OSX 10.8.5의 clang 5.1은 실제로 이러한 확장 기능을 지원하지 않는 clang의 다른 버전 (이 사과 OS에서 발생하는 경우도 있음)을 의미합니까? – bliako

+0

예, macOS의 Clang/LLVM은 Linux의 Clang과 다릅니다. 그것은 Apple의 수정 된 버전이며, 구현되는 일부 기능은 Linux와 약간 뒤떨어 질 가능성이 있습니다. –

+0

sqlite3 포럼에 버그 리포트를 게시했으며 답변을 기다리고 있습니다. – bliako