2014-08-28 4 views
3

우리는 다음과 같이 선언 된 함수가 있다고 가정 "정수 변환을 잘라내기를 초래했습니다. " 컴파일러는 변수 const ulong test = 5000를 선언하면 내가, 어쨌든 값암시 적 캐스트 C 언어에서 함수에 인수를 전달할 때

보다 큰 255을 통과하는 것이 나에게 경고하고, 컴파일러가 같은 가능한 문제에 대해 경고하지 않습니다 내가 그것을 myFunct(test)을 myFunct을 전달합니다.

누구든지이 동작을 설명 할 수 있습니까?

이 경고가 누락되면 내 코드의 성가신 버그가 발생하며 이러한 종류의 문제가 다른 곳에 나타날 수 있습니다.

MinGW 및 GHS 버전 5 (GreenHills)와 같은 다른 컴파일러를 사용해 보았지만 두 가지 모두보고 된 문제에 대해 경고하지 않았습니다.

이러한 문제를 방지 할 수있는 방법이 있는지 알려주실 수 있습니까?

+1

정적 C/C++ 코드 분석을위한 도구 (cppcheck, viva64 등)를 사용해보십시오. – Ilya

답변

4

컴파일러 경고에 대한 논리가 필요하지 않습니다. 컴파일러는 알기를 원하는 문제에 대한 유용한 경고를 생성하고 오 탐지로 시간 낭비를 피합니다. 이 두 가지 상충되는 목표를 만족시키는 임의의 경험적 방법이 컴파일러에서 구현 될 수 있습니다.

여기서 가장 그럴듯한 설명

myFunct(5000)에, 변환myFunct(test)에, 그것은 단지 함수 호출을보고 명확하지 않다 반면, 값을 유지하지 못할 것이 분명하다는 것이다. 후자에 대한 경고는 그 시점에서 test의 값을 알아야 할 것이고 컴파일러는 test의 값이 5000이라는 것을 결정하는 메커니즘을 가지고 있지 않을 수도 있습니다.

test의 값은이 특정 예에서 항상 5000이지만, 변수 값을 예측하는 메커니즘이 모든 경우에 잘 작동하지 않는다는 사실 (비 const 변수 예측하기 어려움) 컴파일러 작성자가 그러한 경고를 구현하려고 시도하는 것을 방해 할 수 있습니다.

정적 분석기은 컴파일러와 다른 목표를 가지고 있습니다. 그들은 적어도 쉬운 경우 변수의 값을 예측하려고 시도하고 일부는 예에서 myFunct(test)에 대해 경고하도록 구성 할 수 있습니다. 대부분의 정적 분석기는 문제가 있음을 확신 할 수 없다면 경고하지 않을 권리가 있으며, 확신 할 수있는 것이 무엇인지 알지 못합니다. 그러나 정적 분석기를 사용하는 것보다 컴파일러를 사용하는 것이 더 좋은 경고를 얻을 수 있습니다. 무슨 일이 myFunct(5000)에서 myFunct의 인수에 일어나는 것을

참고는 변환입니다. A 캐스트은 구문 구조입니다. "암시 적 캐스트"같은 것은 없습니다.

+0

귀하의 설명을 이해하고 유효하다고 판단합니다. 어쨌든이 시나리오에 대해 생각해 보았습니다. char mychar = mylong (여기서 mylong은 5000 임)이 있다고 가정합니다. 이 경우 컴파일러는 나에게 그것에 대해 경고합니다.위에서 언급 한 함수 호출의 경우에도 동일한 동작이 예상됩니다. 내가 잘못? 답장과 제안에 감사드립니다. –

+0

@SimoneBonetti 답안에 포함시키려는 문장을 생각 나게했지만, 변수의 실제 값을 해석 할 수 없으면 계산할 정적 정보 인'test' 유형 만 알면됩니다. 어쨌든 사용할 수 있기 때문에 컴파일러는 전형적으로'test'가'unsigned char'로 표현 가능한 값을 포함하는'ulong' 변수가 될 수 있기 때문에'myFunct (test)'에 대한 경고를 피합니다. –

관련 문제