2013-05-23 3 views
1

누구나 Xcode/Objective C에서 이러한 결과를 설명 할 수 있습니까? 확실히 -2 이제까지 내가 바로 업을 같은 오답을 본 적이보다 큰 31목표 C 정수 비교 오류

(lldb) p dayOfMonth 
(int) $37 = -2 
(lldb) p (dayOfMonth > 31) 
(bool) $38 = true 
(lldb) p (dayOfMonth > (int)31) 
(bool) $39 = true 
(lldb) p (dayOfMonth > (float)31) 
(bool) $40 = false 

을 테스트해야하며 잘못 해석 될 수있는 방법 상상할 수없는 일은 없다. 디버거와 마찬가지로 dayOfMonth도 int입니다.

편집 추가 : 여기에 (일부 관련이없는 라인 컷으로) 실패 코드입니다 :

NSRange monthdays = [self.calendar rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:self.displayedDate]; 
    int dayOfMonth = i+1-shift; // negative days are at end of prev month; days higher than length of month are in next 
    if (dayOfMonth < 1) cellView.dayLabel = prevMonthDays.length + dayOfMonth; 
    if (dayOfMonth > monthdays.length) cellView.dayLabel = dayOfMonth - monthdays.length; 

두 번째 if 사실 평가 DAYOFMONTH가 부의 경우.

+0

몇 가지 이상한 진 것. – Undo

+0

어떤 이유로 인해 사물이 부호없는 유형으로 변환되고 있습니다. 나는 왜 문서를 빨리 ​​스캔하는지 보지 못한다. 나는 그것이 버그라고 생각하고있다. 나는 여기에서도 같은 결과를 얻었지만 GDB에서는 정상적으로 작동합니다. 대신 사용할 수 있습니까? –

+0

그것은 디버거에만있는 것이 아닙니다. 컴파일 된 코드에서 같은 오류가 발생합니다. –

답변

2

는 확정 - 그것은 lldb의 IR 인터프리터의 버그입니다.

+  self.expect("expression (int)-2", 
+   startstr = "(int) $4 = -2") 
+ 
+  self.expect("expression $4 > (int)31", 
+   startstr = "(bool) $5 = false") 

그래서이 일이 당신을 위해 작업을 계속한다 : 새로운 테스트 케이스가 정확히 문제가 있음을 http://lists.cs.uiuc.edu/pipermail/lldb-commits/Week-of-Mon-20130520/008569.html

참고 :

다음은 그것을 수정 패치에 대한 링크입니다!

는 지금까지 코드가 간다, 당신은 버그가 않습니다. 조건 :

if (dayOfMonth > monthdays.length) 

원하는대로하지 않습니다. dayOfMonth은 서명되어 있고 monthdays.length은 서명이 없습니다. 이는 dayOfMonth이 부호없는 유형으로 승격되어 비교가 잘못되었음을 의미합니다. 당신은 일을 정리하기 위해 거기에 깁스를해야합니다 : 아마

if (dayOfMonth > (NSInteger)monthdays.length) 
+0

정말 고마워! 고마워! –

+0

문제를 편집 한 대답이 없으므로 프로그램의 문제도 설명 할 수 있습니다. –

+0

가. 분명히 C는 서명 된 int를 암묵적으로 "승격"하여 서명하지 못하도록하는 * 잘못된 것입니다. C가 숫자 중 하나를 변경하기로 결정했기 때문에이 표현은 오직 사실 만 테스트합니다. 하지만 괜찮아. 답변 해주셔서 감사합니다! –