programing

"이진수 비트 연산자와 함께 부호 있는 정수 피연산자 사용" - 부호 없는 쇼트 사용 시

shortcode 2022. 7. 12. 22:43
반응형

"이진수 비트 연산자와 함께 부호 있는 정수 피연산자 사용" - 부호 없는 쇼트 사용 시

다음 C 스니펫에서는 16비트시퀀스의 첫 번째 2비트가 설정되어 있는지 여부를 확인합니다.

bool is_pointer(unsigned short int sequence) {
  return (sequence >> 14) == 3;
}

CLION의 Clang-Tidy가 "2진수 비트 연산자와 함께 서명된 정수 연산자를 사용" 경고를 보내는데, 그 이유를 이해할 수 없습니다.unsigned short충분히 서명되지 않았나요?

이 경고 코드는 비트 연산자에 대한 피연산자 중 하나가 서명되었는지 여부확인합니다.그것은 아니다.sequence경고의 원인이 됩니다만,14, 그리고 당신은 문제를 완화할 수 있습니다.14a를 부가함으로써 서명되지 않은u끝까지.

(sequence >> 14u)

이 경고는 좋지 않습니다.Roland의 답변에서 설명한 바와 같이 CLion이 이를 수정하고 있습니다.

쨍그랑땡그랑 하는 수표가 있어요hicpp-signed-bitwise이 체크는 HIC++ 규격의 문구를 따릅니다.표준은 자유롭게 사용할 수 있으며 다음과 같이 기술되어 있습니다.

5.6.1. 부호 있는 오퍼랜드와 함께 비트 연산자를 사용하지 않는다.

비트 연산자와 함께 서명된 오퍼랜드를 사용하면 정의되지 않은 동작 또는 구현 정의된 동작이 발생할 수 있습니다.따라서 비트 연산자는 부호 없는 적분 유형의 오퍼랜드에서만 사용해야 합니다.

HIC++ 부호화 표준의 저자들은 C와 C++ 표준의 의도를 잘못 해석하여 피연산자의 값 대신 피연산자의 유형에 우발적으로 또는 의도적으로 초점을 맞췄다.

Check in Clang-tidy는 이 기준을 준수하기 위해 정확히 이 문구를 구현합니다.이 수표는 일반적으로 유용하게 쓰이려는 것이 아니라, HIC++ 기준의 한 가지 바보 같은 규칙에 따라야 하는 프로그램을 가진 가난한 사람들을 돕는 것이 유일한 목적이다.

중요한 점은 정의에 따라 접미사가 없는 정수 리터럴이 유형이라는 것이다.int그 타입은 부호 있는 타입으로 정의됩니다.이제 HIC++는 양의 정수 리터럴이 음수일 수 있으며 따라서 정의되지 않은 동작을 호출할 수 있다고 잘못 결론짓습니다.

비교를 위해 C11 규격에는 다음과 같이 기술되어 있습니다.

6.5.7 비트 단위 시프트 연산자

오른쪽 피연산자의 값이 음수이거나 승격된 왼쪽 피연산자의 폭 이상일 경우 동작은 정의되지 않습니다.

이 문구는 신중하게 선택되었으며 올바른 피연산자의 가치가 중요하며 그 유형이 아님을 강조한다.또, HIC++ 규격에서는 그 케이스를 잊어버린 것에 비해, 값이 너무 큰 케이스도 커버하고 있습니다.그렇기 때문에, 라고 하는 것은,1u << 1000u, HIC++에서는 OK입니다.1 << 3 않습니다

최선의 방법은 이 단일 체크를 명시적으로 비활성화하는 것입니다.를 언급하는 CLion의 버그리포트가 몇 개 있어 거기서 수정되고 있습니다.


업데이트 2019-12-16: 나는 Perforce에게 이 정확한 표현 뒤에 있는 동기가 무엇인지, 그리고 그 표현이 의도적인 것인지 물었다.고객의 의견은 다음과 같습니다.

HIC++ 표준 작성에 관여한 C++ 팀은 말씀하신 Stack Overflow 질문을 검토했습니다.

즉, 값 대신 HIC++ 규칙에서 객체 유형을 참조하는 것은 코드를 보다 쉽게 자동 체크할 수 있도록 의도적인 선택입니다.객체의 유형은 항상 알려져 있지만 값은 알려져 있지 않습니다.

  • HIC++ 규칙은 일반적으로 "결정 가능"을 목표로 합니다.형식에 대해 적용하면 연산자가 사용되는 위치 또는 서명된 유형이 서명되지 않은 상태로 변환되는 위치 등 항상 결정 가능한 검사가 가능합니다.
  • 그 근거는 명시적으로 「가능」한 정의되지 않은 동작을 참조하고 있기 때문에, 합리적인 실장은 다음을 제외할 수 있습니다.
    • 명확한 문제가 없는 한 상수,
    • 서명되지 않은 유형이 서명된 유형으로 승격됩니다.
  • 따라서 CLion이 프로모션을 수행하기 전에 검사를 일정하지 않은 유형으로 제한하는 것이 가장 좋습니다.

정수 승격이 경고를 유발한다고 생각합니다.int보다 작은 연산자는 서명된 산술식에 대해 정수로 확장됩니다., 의 코드는 '비밀번호'입니다.return ( (int)sequence >> 14)==3;경고등이 켜졌습니다.★★를 해 보세요.return ( (unsigned)sequence >> 14)==3; ★★★★★★★★★★★★★★★★★」return (sequence & 0xC000)==0xC000;.

언급URL : https://stackoverflow.com/questions/50399090/use-of-a-signed-integer-operand-with-a-binary-bitwise-operator-when-using-un

반응형