c - 我的单元测试无法使错误的逻辑崩溃
问题描述
所以我正在为我的程序进行单元测试,但有一种情况我知道它应该崩溃但我似乎无法让它这样做,这是我的一个例子。
#include <stdio.h>
int main(void)
{
char buf[2] = { 0 };
int i = -1;
printf("%c", buf[i]);
return (0);
}
据我了解,它应该在某种熵中崩溃,但它似乎所做的只是从指针在内存中的位置读取。或者这种行为应该是正常的,无论我们运行什么样的测试,它都不会崩溃?
解决方案
这种行为应该是未定义的。这意味着它可能会崩溃,或者它可以打印垃圾,或者它不能打印任何内容,因为允许编译器假设未定义的行为不会发生并且不生成任何导致它的代码......或者它可能会杀死你(字面意思) 如果它找到了进入安全关键应用程序的生产代码的方式。
如果你真的想测试它,你需要依赖于你的编译器行为的知识和你特定平台的实现定义的技巧,例如,在支持 MMU 的 Linux 上,将 对齐buf
到内存页面的开头并标记前面的内存页面为mprotect(PROT_NONE)
- 然后您将SIGSEGV
在尝试访问它时得到。
推荐阅读
- node.js - 无论在寄存器中输入什么,使用 react-redux 和 jwt 都会出现“请输入所有字段错误”
- discord - Python discord bot 吐出回溯错误
- javascript - Javascript计算购物车总数
- ruby - 安装 travis-cli 时在 macOS 中找不到 libffi 的包配置
- api - 根据日期过滤 Bing 自定义搜索结果
- dynamic - 计算从 L 到 R 的所有数字,使得二进制表示中恰好有一个零。我对数字 dp 主题非常陌生
- c++ - 在c ++ float中使用小数点前后的值?
- reactjs - React Redux FireStore - FireStore 集合中的更改不会反映在我的屏幕上,除非我刷新
- mongodb - MongoDB 聚合 - 按多个键分组,每个级别的分组都有计数
- c# - 动态视图组件菜单的 LINQ 语句问题