2

함수 콜백과 함께 작동하는 라이브러리를 작성하면서 동일한 호출 규칙과 동일한 시그니처가있는 유형에 함수 포인터를 자주 형변환 (및 호출)했습니다 다른 유형 (모든 데이터) 또는 void 포인터. 기본적으로 https://stackoverflow.com/a/14044244/3079266C 함수 포인터 유형 호환성

, 내가 그것을 이해로, 인수의 유형이 호환되는 경우, 즉 함수 포인터 타입도 호환 의미

최근, 나는이에 따라, 그 안전하지 않을 수 있다는 것을 발견 , 아무런 문제가 없어야합니다.

이제 3 가지 질문이 있습니다.

첫 번째 : 다른 유형의 포인터가 기술적으로 호환되지 않기 때문에 정의되지 않은 동작이 발생할 수 있습니다.

둘째로 : (어떤 아키텍처에서) 내가 그걸 가지고 도망 갈 수 있습니까? Windows x86 또는 x64 버전이 있습니까?

셋째 : 어디에서 벗어날 수 있습니까?

+0

@iharob 그러나 이러한 함수에 전달하는 함수 포인터는 반드시 'void'포인터를 가져와야합니다. 그렇지 않으면 정의되지 않은 동작이 발생합니다. 함수 내부에 포인터를 캐스팅하는 것은 괜찮지 만 인수는 지정된대로 지정해야합니다. –

+4

첫 번째 질문 : 예. 두 번째 질문 : 모든 곳. 세 번째 질문 : 아무데도 (당신이 SO 질문에 대답 할 때를 제외하고, 여기 사람들은 UB를 사랑하고 필요하다면 언급하지 않으면 당신을 찬성표를 던집니다.) –

+0

@barakmanos : 그렇습니다. 사용자에게 UB가 발생할 수 있다고 경고해야하지만 실제로는 그렇지 않습니까? 감사! =) – Mints97

답변

2
  1. 예,이 자체로 UB입니다
  2. 당신은 아마 최적화되지 않은 비 디버그 빌드에서 멀리 이걸로 얻을 수 있습니다. 옵티마이 저는 두 포인터에 별명을 지정할 수 있는지 여부를 알아 내기 위해 포인터 유형을 이용할 수 있습니다. 실제 유형에 대해 거짓말을하는 경우에는 논리가 실패 할 수 있습니다. 물론 디버그 빌드는 유형 불일치가있는 경우 철저히 검사 할 수 있습니다.
  3. Windows는 컴파일러가 아니므로 분명한 질문은 아닙니다. 일반적인 Windows 컴파일러는 빌드를 최적화하고 ICC는 특히 고급 최적화 기능을 제공합니다.