2017-03-29 13 views
2

커널에서 정수 연산을 수행해야하는데 구체적으로 size_t 오브젝트를 약간의 델타만큼 증가시켜야하는데, 이는 매우 자주 발생합니다. 따라서 커널에서 가능한 정수 오버 플로우를 방지해야하는지 궁금하고, 그렇다면 커널이 매크로 또는 API를 제공합니까?커널에서 정수 오버플로가 가능합니까?

+2

'size_t'는 부호가 없으며 부호없는 오버플로는 잘 정의되어 있으므로 언어 ​​관점에서 볼 때 'size_t'는 그 자체로 나쁜 영향을 미치지 않습니다 *. 물론 그 결과는 돌아 다니기 때문에 코드의 논리가이를 처리 할 수 ​​있어야합니다. –

답변

1

size_t 오버플로가 아닙니다. 이는 잘 정의 된 "순환 어라운드 (wraparound)"의미론이있는 부호없는 유형입니다. size_t의 가장 큰 값을 증가 시키면 이 0이됩니다.

size_t의 특정 경우에 두 개의 크기를 더하는 것처럼 size_t의 간단한 연산에서 대개 결과 피연산자가 두 원본 피연산자 중 하나보다 큰지 여부 만 확인하면됩니다. (size3 = size1 + size2) < size1) 인 경우 랩을 사용합니다.

부호없는 유형이 "휠"주위를 지나는 시계 값으로 사용되는 경우 "시간 전"계산을 올바르게 수행하기위한 매크로가 있습니다. 예를 들어, 우리는 시간이 0xFFFFFFFE 인 것을 과거 w.r.t에서 몇 시간 단위로 취급하기를 원합니다. 0x00000003. 커널에서 "jiffies"시간을 사용하고 있다면, time_before 인라인 함수와 그 계열의 다른 함수를 사용할 수 있습니다. (long으로 표현되는 "클래식 jiffies"(내 용어)와 u64으로 표현 된 64 비트 jiffy가 있으며 time_beforetime_before64과 같은 별도의 기능이 있음을 유의하십시오.

그러나 오버플로 검사로 수학을 수행하기위한 일반적인 매크로가 있습니까? 커널 트리 (3.18.31)를 부담없이 섞어서 사용하면 그렇게 보이지 않습니다. include 하위 트리의 grep -i overflow에는 fs과 같은 코드 영역에서 이와 유사한 검색이 나타나지 않으므로 ad hoc 로컬로 코드화 된 오버플로 검사가 사용됩니다.정말 수치 스럽습니다. "이 두 가지를 합치면 문제가있는 것 같습니다"라는 공통점은 모두가 단지 addv(x_int, y_int, &overflow_flag) 또는 그와 비슷한 것을 사용할 수있는 해결책이 될 것이라고 생각할 것입니다.

1

커널에서 정수 오버플로가 가능합니까?

예. 그것은 중요하지 않습니다, 사용자 공간 또는 커널 - 그것은 단지 CPU가 작동하는 방법입니다. 다음 예 - 나는 당신이 귀하의 경우 이 허용 아니다 일어날 수 있다고 생각하면 커널

가능한 정수 오버 플로우에 대해 보호해야하는 경우

궁금하네요. 부호있는 정수의 경우 심지어는 undefined behavior이 될 수 있습니다.

커널이

아니, 커널에는 즉시 사용 가능한 기능은 정수 오버 플로우를 처리하기위한이 없습니다에 대한 매크로 나 API를 제공한다. 음, 오버플로 감지를 위해 GCC wrappers이 있습니다 ...하지만 사용하지 마십시오. 그렇지 않으면 Linus Torvalds가 올 것입니다. here :

어쨌든 실제로 필요할 때 정수 오버플로를 수동으로 감지하는 것은 매우 쉽습니다. 예를 들어 here을보십시오. 귀하의 경우, size_t은 부호가 없으므로 또는은 감싸는 값을 처리하지 말아야합니다. : details.