gpt4 book ai didi

C:终止被调用的函数,该函数从 main 陷入无限循环

转载 作者:行者123 更新时间:2023-12-02 08:08:11 26 4
gpt4 key购买 nike

假设我在 c 文件中有以下主要内容

int f();
int main(){
//terminate f() if in infinite loop
return f();
}

然后是一个单独的 c 文件,它可能包含以下内容:
int f() {
for(;;) {}
return 0;
}

有什么方法可以检测到函数 f() 处于无限循环中并从主函数中终止它的执行?

编辑:
我需要这个功能,因为我正在编写一个测试平台,其中调用的函数可能有一个无限循环——这就是我最终要检查的内容。因此,无论如何我都无法修改 f() 。我也在Linux环境中。

最佳答案

不,there is no way to definitively determine if a function contains an infinite loop .

但是,我们可以做一些假设来检测潜在的无限循环并在程序中优雅地退出程序(例如,我们不必按 Ctrl+C)。这种方法在 JS 中使用的几个测试框架中很常见。基本上,我们为函数的完成设置了一些任意时间限制。如果函数没有在该时间限制内完成,我们假设它不会完成并抛出错误。

在 C/C++ 中,如果你在 Unix 系统上,你可以用 pthreads 来实现它。在 Windows 中,您将使用 windows.h .我只有 pthreads 的经验,所以我将展示一个简单的示例,说明如何使用 pthreads 使其工作。

#include <pthread.h>  // Load pthread
#include <signal.h> // If f() does not exit, we will need this library to send it a signal to kill itself.
#include <stdbool.h> // You could use an int or char.
#include <stddef.h> // Defines NULL
#include <unistd.h> // Defines sleep()

bool testComplete; // Has the test completed?

/**
* The function being tested.
*/
void f() {
while(true);
}

/**
* This method handles executing the test. This is the function pthread will
* use as its start routine. It takes no arguments and returns no results.
* The signature is required for pthread_create().
*/
void *runTest(void *ptr) {
testComplete = false;

f();

testComplete = true;
}

int main() {
pthread_t testThread;

pthread_create(&testThread, NULL, runTest, NULL); // Create and start the new thread. It will begin executing runTest() eventually.

sleep(5); // Give it 5 seconds to complete (this should be adjusted or could even be made dynamic).

if(testComplete) {
// Test completed successfully.
pthread_join(testThread, NULL);
} else {
// The test did not exit successfully within the time limit. Kill it and you'll probably what to provide some feedback here.
pthread_kill(testThread, SIGPIPE); // There are other signals, but this one cannot be ignored or caught.
}
}

要编译它,您需要执行 gcc your_filename.c -o output_filename -lpthread .

如果您希望程序在 Unix 和 Windows 系统上运行,您可能需要考虑制作一些统一的接口(interface)来访问线程,然后将特定于操作系统的接口(interface)适应您的接口(interface)。它会让事情变得更简单一些,尤其是在扩展这个库时。

关于C:终止被调用的函数,该函数从 main 陷入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49575648/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com