off_t 크기를 올바르게 찾는 방법

샬리 니 살 로미보다 파티

내 모듈에 코드 조각이 있고 ICC 컴파일러로 컴파일합니다.

/**
 * Static (compile-time) assertion.
 * Basically, use COND to dimension an array.  If COND is false/zero the
 * array size will be -1 and we'll get a compilation error.
 */

    #define STATIC_ASSERT(COND) \
       do { \
          (void) sizeof(char [1 - 2*!(COND)]); \
       } while (0)
     #define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + \
                         (((off_t) 1 << 31) << 31)) 
       STATIC_ASSERT(LARGE_OFF_T % 2147483629 == 721 &&
                     LARGE_OFF_T % 2147483647 == 1);

위의 주장이 실패하고 배열 크기는 0보다 커야합니다.

누구든지이 주장이 언제 실패하고 어떻게 고칠 수 있는지 이해하도록 도울 수 있습니까? _DFILE_OFFSET_BITS = 64로 컴파일을 시도했지만 헛된 것입니다.

에릭 포스트 피쉴

코드 off_t는 부호 비트를 포함하여 폭이 64 비트 이상 인지 확인하려고 시도합니다 .

이어 STATIC_ASSERT,이 경우 COND, 참 1 - 2*!(COND)으로서 평가하여 1-2*!1= 1-2*0= 1, 상기 배열 크기가 미세하다 1이다. 경우 COND거짓, 그것으로 평가 1-2*!0= 1-2*1= -1진단을 발행 할 수있는 컴파일러가한다. 따라서 거짓 STATIC_ASSERT이면 컴파일러 메시지를 생성하는 역할을 COND합니다.

LARGE_OFF_Toff_t유형 에서 일부 산술을 수행하려고합니다 . off_t너비가 64 비트 이상 이면 (off_t) 1 << 31) << 312 62로 평가됩니다 . 그런 다음 전체 표현식은 2 62 − 1 + 2 62 = 2 63 −1로 평가됩니다. 이 숫자는 나머지 721 모듈로 2147483629 및 1 모듈로 2147483647이므로 테스트를 통과하고 컴파일러에서 진단을 실행하지 않습니다.

경우 off_t이고, 32 비트 폭과 부호, 말 (off_t) 1 << 31) << 31(1) + 0 = 2 - 평가하여 0, 전체 표현식 평가하여 0 내지 32 -1 (부호 산술 랩 사람)와, 나머지 모듈 (37)의 2,147,483,629을 갖고, 실패 있도록 테스트 및 컴파일러가 진단을 생성합니다.

off_t서명 된 경우 테스트를 신뢰할 수 없습니다 . 만약 off_t서명 된 32 비트 폭의 동작은 (off_t) 1 << 31C 표준에 의해 정의되지 않는다. 부호가 있고 너비가 63 비트 미만이면의 동작 ((off_t) 1 << 31) << 31이 정의되지 않고 부호가 있고 너비가 64 비트 미만이면 최종 추가가 정의되지 않습니다.

테스트가 실패하면 off_t최소 64 비트 너비의 정수 유형이 되도록 빌드 조건을 조정하여 수정해야합니다 . 이 작업을 수행하는 방법을 말하는 질문에 정보가 충분하지 않습니다.

코드 off_t에 서명 된 유형이 될 것으로 예상 되는 표시가 있습니다. 서명되지 않은 것으로 알려진 경우 간단히 테스트하여 64 비트 이상인지 확인할 수 있습니다 18446744073709551615u <= (off_t) -1. 그리고 코드가 생성하려고 시도하는 값인 2 63-1 은 부호없는 정수가 아닌 64 비트 부호있는 정수의 최대 값입니다. 위와 같이 off_t부호가 있고 너비가 64 비트 미만인 경우 작업에 정의되지 않은 동작 이 있기 때문에 이는 불행한 일 입니다. 9223372036854775807 == (off_t) 9223372036854775807서명 된 정수 유형으로 변환하는 동안 오버플로가 C 표준에 의해 정의되지 않는 것이 아니라 적어도 구현에 의해 정의되기 때문에 더 나은 접근 방식은 test 입니다. 하나는 또한 64 <= sizeof(off_t) * CHAR_BIT. ( CHAR_BIT에 정의되어 <limits.h>있습니다.)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

off_t 크기 찾기

분류에서Dev

글꼴 크기를 올바르게 정의하는 방법

분류에서Dev

방문한 링크를 올바르게 적용하는 방법

분류에서Dev

이미지 크기를 올바르게 조정 / 다시 압축하는 방법

분류에서Dev

Android에서 ScrollView의 크기를 올바르게 조정하는 방법

분류에서Dev

axios 기본 헤더를 올바르게 설정하는 방법

분류에서Dev

선택기를 올바르게 사용하는 방법

분류에서Dev

여러보기를 올바르게 정렬하는 방법

분류에서Dev

메서드를 올바르게 숨기는 방법

분류에서Dev

% 기호를 올바르게 사용하는 방법

분류에서Dev

FOSUserBundle 처리기를 올바르게 확장하는 방법

분류에서Dev

ctags 일치를 올바르게 주문하는 방법을 찾고

분류에서Dev

이 자바 스크립트를 올바르게 통합하는 방법

분류에서Dev

T-SQL 쿼리 FOR XML 출력, XML 쿼리를 사양에 맞게 올바르게 포맷하는 방법

분류에서Dev

forEach 또는 splice를 올바르게 사용하는 방법

분류에서Dev

비동기식을 올바르게 관리하는 방법

분류에서Dev

향후 기능을 올바르게 사용하는 방법

분류에서Dev

TypeScript에서 약속을 올바르게 기다리는 방법

분류에서Dev

인쇄 기능을 올바르게 사용하는 방법

분류에서Dev

var 유형을 올바르게 초기화하는 방법

분류에서Dev

Jquery Blur 기능을 올바르게 사용하는 방법

분류에서Dev

Apache2를 올바르게 설정하는 방법

분류에서Dev

InetSocketAddress를 올바르게 채우는 방법

분류에서Dev

jquery append를 올바르게 사용하는 방법

분류에서Dev

$ in 및 $ elemMatch를 MongoDB (PyMongo)와 올바르게 결합하는 방법

분류에서Dev

Vue.js를 올바르게 가져 오는 방법

분류에서Dev

Angular 8에서 setValue를 올바르게 사용하는 방법

분류에서Dev

SQL 쿼리를 올바르게 만드는 방법

분류에서Dev

Firestore를 올바르게 사용하는 방법

Related 관련 기사

  1. 1

    off_t 크기 찾기

  2. 2

    글꼴 크기를 올바르게 정의하는 방법

  3. 3

    방문한 링크를 올바르게 적용하는 방법

  4. 4

    이미지 크기를 올바르게 조정 / 다시 압축하는 방법

  5. 5

    Android에서 ScrollView의 크기를 올바르게 조정하는 방법

  6. 6

    axios 기본 헤더를 올바르게 설정하는 방법

  7. 7

    선택기를 올바르게 사용하는 방법

  8. 8

    여러보기를 올바르게 정렬하는 방법

  9. 9

    메서드를 올바르게 숨기는 방법

  10. 10

    % 기호를 올바르게 사용하는 방법

  11. 11

    FOSUserBundle 처리기를 올바르게 확장하는 방법

  12. 12

    ctags 일치를 올바르게 주문하는 방법을 찾고

  13. 13

    이 자바 스크립트를 올바르게 통합하는 방법

  14. 14

    T-SQL 쿼리 FOR XML 출력, XML 쿼리를 사양에 맞게 올바르게 포맷하는 방법

  15. 15

    forEach 또는 splice를 올바르게 사용하는 방법

  16. 16

    비동기식을 올바르게 관리하는 방법

  17. 17

    향후 기능을 올바르게 사용하는 방법

  18. 18

    TypeScript에서 약속을 올바르게 기다리는 방법

  19. 19

    인쇄 기능을 올바르게 사용하는 방법

  20. 20

    var 유형을 올바르게 초기화하는 방법

  21. 21

    Jquery Blur 기능을 올바르게 사용하는 방법

  22. 22

    Apache2를 올바르게 설정하는 방법

  23. 23

    InetSocketAddress를 올바르게 채우는 방법

  24. 24

    jquery append를 올바르게 사용하는 방법

  25. 25

    $ in 및 $ elemMatch를 MongoDB (PyMongo)와 올바르게 결합하는 방법

  26. 26

    Vue.js를 올바르게 가져 오는 방법

  27. 27

    Angular 8에서 setValue를 올바르게 사용하는 방법

  28. 28

    SQL 쿼리를 올바르게 만드는 방법

  29. 29

    Firestore를 올바르게 사용하는 방법

뜨겁다태그

보관