यहाँ एक C फ़ंक्शन है जो एक int
और को जोड़ता है , यदि अतिप्रवाह होगा तो विफल होगा:
int safe_add(int *value, int delta) {
if (*value >= 0) {
if (delta > INT_MAX - *value) {
return -1;
}
} else {
if (delta < INT_MIN - *value) {
return -1;
}
}
*value += delta;
return 0;
}
दुर्भाग्य से यह जीसीसी या क्लैंग द्वारा अच्छी तरह से अनुकूलित नहीं है :
safe_add(int*, int):
movl (%rdi), %eax
testl %eax, %eax
js .L2
movl $2147483647, %edx
subl %eax, %edx
cmpl %esi, %edx
jl .L6
.L4:
addl %esi, %eax
movl %eax, (%rdi)
xorl %eax, %eax
ret
.L2:
movl $-2147483648, %edx
subl %eax, %edx
cmpl %esi, %edx
jle .L4
.L6:
movl $-1, %eax
ret
इस संस्करण के साथ __builtin_add_overflow()
int safe_add(int *value, int delta) {
int result;
if (__builtin_add_overflow(*value, delta, &result)) {
return -1;
} else {
*value = result;
return 0;
}
}
बेहतर अनुकूलित किया गया है :
safe_add(int*, int):
xorl %eax, %eax
addl (%rdi), %esi
seto %al
jo .L5
movl %esi, (%rdi)
ret
.L5:
movl $-1, %eax
ret
लेकिन मैं उत्सुक हूँ अगर वहाँ एक तरीका है कि जीसीसी या क्लैंग द्वारा प्रतिमान मिल जाएगा कि निर्माण का उपयोग किए बिना है।