"이진수 비트 연산자와 함께 부호 있는 정수 피연산자 사용" - 부호 없는 쇼트 사용 시
다음 C 스니펫에서는 16비트시퀀스의 첫 번째 2비트가 설정되어 있는지 여부를 확인합니다.
bool is_pointer(unsigned short int sequence) {
return (sequence >> 14) == 3;
}
CLION의 Clang-Tidy가 "2진수 비트 연산자와 함께 서명된 정수 연산자를 사용" 경고를 보내는데, 그 이유를 이해할 수 없습니다.이unsigned short
충분히 서명되지 않았나요?
이 경고 코드는 비트 연산자에 대한 피연산자 중 하나가 서명되었는지 여부를 확인합니다.그것은 아니다.sequence
경고의 원인이 됩니다만,14
, 그리고 당신은 문제를 완화할 수 있습니다.14
a를 부가함으로써 서명되지 않은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
'programing' 카테고리의 다른 글
vue 구성 요소 내에서 사용하기 위해 javascript 파일을 가져오는 중 (0) | 2022.07.12 |
---|---|
VueJ - Vuex 상태가 업데이트될 때 구성 요소가 업데이트되지 않음 (0) | 2022.07.12 |
C에서 동적으로 할당된 메모리의 크기를 확인합니다. (0) | 2022.07.12 |
서블릿의 구조인스턴스화, 세션, 공유 변수 및 멀티스레딩 (0) | 2022.07.12 |
v-show에 표시된 후 입력에 초점을 맞춥니다. (0) | 2022.07.12 |