android - 如何在 C/C++ 中方便地发布算术溢出异常

标签 android c++ c android-source

当我运行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/

相关文章:

c++ - std::map 似乎找到了不存在的元素

c - C 中的维吉尼亚密码,如何仅在字母字符上移动关键字

android - 如何避免对 APK Assets 文件夹资源项目文件进行逆向工程?

android - 使用卫星与 Android 手机进行双向通信

c++ - 在哪里可以下载 c 的标准数学库的静态库/头文件?

C - 文件 IO 读写错误

c - 单线程模式下并行合并非常慢

没有(或最少)全局广播的 Android 小部件交互

android - 如何检测抽屉导航已通过边缘滑动(而不是主页图标)打开?

c++ - 内存分配责任