c++ - 如何检测以错误大小传递的空 C 数组?

标签 c++ arrays unit-testing

我有一个二进制搜索函数,界面如下:

bool binarysearch(int* array, int size, int findnum) {
    doBinarySearch(array, 0, (size-1), findnum);
}  

doBinarySearch 的代码是:

bool doBinarySearch(int* array, int start, int end, int findnum) {  
    if (end <= start)
        return false;

   int mid = (start+end)/2;
   if (array[mid] == findnum) {
       return true;
   } else if (findnum < array[mid]) {
       return doBinarySearch(array, start, mid, findnum);
   } else {
       return doBinarySearch(array, mid+1, end, findnum);
   }
}

我写了一个单元测试来测试上面的功能。如果我从 main 调用带有空数组和错误大小的二进制搜索,代码段。如预期的故障。例如

int main() {  
    int *array;  
    binarysearch(array, 10, -1);    
}

但是,如果我编写一个单元测试类并具有执行上述操作的函数,则二分查找不会崩溃。任何想法,为什么不同的行为:

class TestBinarySearch {
    public:
        void testEmptyArray() {
            int *array;
            binarysearch(array, 10, -1);
        }
 };

 int main() {
     TestBinarySearch testObj;
     // below line does not cause seg fault. and -1 is found for some reason
     testObj.testEmptyArray(); 
 }

另一个问题 - 有什么方法可以检测段。如果有人调用错误大小的函数会出错?我看到了一些使用信号捕捉的例子,但是之后除了退出程序,还能做些什么吗?

最佳答案

两种写法都会调用未定义的行为。未定义的行为可以是任何。它坠毁在一个你应该感激的地方;它在另一个方面“成功”是不幸的,但很有可能。下次您重新启动计算机或运行该程序时,这种行为甚至可能会改变,谁知道呢。它是未定义的。

如果您使用的是 Linux,请在 valgrind 下运行这两个程序并查看其显示的内容。即使没有崩溃,它也可能报告错误。

关于c++ - 如何检测以错误大小传递的空 C 数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25394899/

相关文章:

ios - 按数组之一的顺序对两个数组进行排序 [Swift 3.0 - Xcode 8]

javascript - 为什么继续使迭代停止?

unit-testing - CRM 2016 FakeXrmEasy N :N relationships

unit-testing - symfony2 使用自定义验证器进行单元测试验证

C++。指针 vector 和使用 vector

c++ - 菜单程序,输入字符串

c++ - 如何访问 STL 字符串类中的成员变量?

C++11/Boost 随机库,在循环的指定点开始生成

c++ - 如何在类中声明一个 const size_t?

javascript - 使用服务方法单元测试 Node js Controller 的最佳方法是什么