当我运行Android程序时,我发现一个Native Exception,我相信这个异常来自一行可能导致算术溢出的代码。但问题是算术溢出在 C/C++ 中不会正常报告,至少当我用 g++ 和 Linux 操作系统测试它时是这样。
我认为编译 Android 时会报告溢出,因为一些额外的编译器函数。我的确切问题是如何使以下代码在运行时发布一些异常。
int main(){
size_t size = 0;
size--;
return 0;
}
最佳答案
size_t
是无符号类型。永远不会出现算术溢出。相反,无符号类型的所有计算结果都包含在值范围内,就好像通过重复地在最大值上加或减 1 一样。这意味着在 size--
之后,size
将保留值 SIZE_MAX
。
有符号整数溢出具有未定义的行为。您可能有兴趣捕捉它。 GCC 支持捕获与有符号整数溢出相关的未定义行为。给定以下程序,当 size = INT_MIN
递减时,会发生未定义的行为:
#include <stdio.h>
#include <limits.h>
volatile int size = INT_MIN;
int main(){
size--;
printf("%d\n", size);
return 0;
}
编译程序
% gcc foo.c -Wall -Wextra -Woverflow -fsanitize=undefined
并且没有发生错误。如果你运行它,你会看到
% ./a.out
foo.c:5:9: runtime error: signed integer overflow: -2147483648 - 1
cannot be represented in type 'int'
2147483647
也可以将其配置为在第一次出现问题时中止,但我认为它没有那么有用。
关于android - 如何在 C/C++ 中方便地发布算术溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45780522/