Belirli bir veri türünün (uint32, int, vb.) Taşmasını veya düşük akışını kontrol etmenin genel bir yolu var mı? 4294963846.C++'da taşma/taşma kontrolü var mı?
cevap
sonucu kontrol aritmetik aşırı/aşağı taşma kontrol etmek için: Ben yazdırdığınızda
uint32 a,b,c;
... //initialize a,b,c
if(b < c) {
a -= (c - b)
}
bir bazı tekrarlamadan sonra, bu gibi çok sayıda görüntüler:
Böyle bir şey yapıyorum orijinal değerlerle karşılaştırılmıştır. sizin spesifik bilgiler için
uint32 a,b;
//assign values
uint32 result = a + b;
if (result < a) {
//Overflow
}
kontrolü aşağıdaki gibidir
if (a > (c-b)) {
//Underflow
}
ben veri türü taklit bir sınıf vereceğini yapmak istiyorsa tahmin ve yavaş hangi olurdu (manuel olarak yapmak Ben ... bunun yerine bir typedef tanımlamak bir kullanarak rüzgar gerekebilir,
class MyInt
{
int val;
MyInt(const int&nval){ val = nval;} // cast from int
operator int(){return val;} // cast to int
// then just overload ALL the operators... putting your check in
};
//typedef int sint32;
typedef MyInt sint32;
bundan daha zor olabilir) hayal ediyorum
Belleğin sınırların dışına nasıl yazıldığını kontrol etmek için işaretçilerle benzer bir şey yaptım. çok yavaş ama belleğin bozuk olduğu yer bulamadı
Daha basit bir yaklaşım arıyordum ... Ama her durumda, bunun için teşekkürler .. – Legend
Bu [SafeInt] adlı bir sürümü var (http: //safeint.codeplex .com /) bu gece hakkında öğrendim. Muhtemelen performans kritik kodunda değil, çoğu zaman böyle bir şey kullanmak kötü bir fikir değildir. – HostileFork
Cert, tanımlanmamış bir davranış olan signed integer overflow ve unsigned wrapping için iyi bir referansa sahiptir ve bunlar tüm operatörleri kapsamaz ve kapsamaz.
void func(unsigned int ui_a, unsigned int ui_b) {
unsigned int udiff;
if (ui_a < ui_b){
/* Handle error */
} else {
udiff = ui_a - ui_b;
}
/* ... */
}
ve sonrası koşullarla
: Eğer gcc 5 isevoid func(unsigned int ui_a, unsigned int ui_b) {
unsigned int udiff = ui_a - ui_b;
if (udiff > ui_a) {
/* Handle error */
}
/* ... */
}
sen __builtin_sub_overflow
kullanabilirsiniz
belge şöyle önkoşulları kullanıyor çıkarmasında imzasız sarma için aşağıdaki kontrol kodu sağlar :
__builtin_sub_overflow(ui_a, ui_b, &udiff)
[Tam sayı taşması nasıl algılanır C/C++ içinde?] (http://stackoverflow.com/q/199333/995714) –