“什么是”呢;Clang Tidy:函数位于递归调用链“中?”?如何修复它?

“什么是”呢;Clang Tidy:函数位于递归调用链“中?”?如何修复它?,c,recursion,clion,clang-tidy,C,Recursion,Clion,Clang Tidy,我正在用C编写一个处理字符串的函数,它是递归的。基本上,它所做的是在一些字符和'\0'之间找到一个字符串。如果在找到'\0'之前,它点击了特定字符,它将递归地调用自己 当我用CLion写这篇文章时,我看到了来自叮当声Tidy的警告,这是我以前从未见过的。上面说 叮当声:函数“Function”位于递归调用链中 我想知道这是不是CLion 20.02的一个新功能(我最近更新了它)?此外,我如何修复它 这是我的密码 char *function(char *pos, <some argumen

我正在用C编写一个处理字符串的函数,它是递归的。基本上,它所做的是在一些字符和
'\0'
之间找到一个字符串。如果在找到
'\0'
之前,它点击了特定字符,它将递归地调用自己

当我用CLion写这篇文章时,我看到了来自叮当声Tidy的警告,这是我以前从未见过的。上面说

叮当声:函数“Function”位于递归调用链中

我想知道这是不是CLion 20.02的一个新功能(我最近更新了它)?此外,我如何修复它

这是我的密码

char *function(char *pos, <some arguments>) {
    char *temp = pos + 1;
    while (1) {
        if (*temp == '\0') {
            return temp;
        } else if (*temp == '<something>') {
            *temp = '\0';
            if (*(temp + 1) == '\0') {
                return function(temp + 1, <some arguments>);
            } else if (*(temp + 1) == '<something>') {
                if (*(temp + 2) == '\0') {
                    return function(temp + 2, <some arguments>);
                } else {
                    return function(temp + 1, <some arguments>);
                }
            } else {
                return function(temp, <some arguments>);
            }
        }
        temp++;
    }
}
char*函数(char*pos,){
字符*温度=位置+1;
而(1){
如果(*temp=='\0'){
返回温度;
}否则,如果(*温度=“”){
*温度='\0';
如果(*(温度+1)='\0'){
返回功能(温度+1,);
}否则(*(温度+1)=''){
如果(*(温度+2)='\0'){
返回功能(温度+2,);
}否则{
返回功能(温度+1,);
}
}否则{
返回函数(温度,);
}
}
temp++;
}
}
是。如果您有意编写递归函数,并且确信它不能在不允许递归的上下文中使用(例如,请参阅Clang Tidy文档中的引用),那么忽略该警告是合理的。因为“不允许”比技术问题更经常是一个政策问题,你应该考虑清楚地证明函数是递归的。你应该考虑不使用递归,这对于现实世界的代码通常是更好的。
这张支票不在。我很难找到Clang Tidy 11的文档,但不要将其列为新文档,因此它看起来像是在11中添加的。

这不是一个简单的警告,它基本上告诉您:“嘿,您正在使用递归,这可能是个问题,因为递归可能会导致堆栈溢出”。@Jabberwocky您似乎是对的。但我只是想确定一下。因为我以前从来没有见过这个问题。在这个问题上:虽然学习递归是一件好事,但是在现实世界中,C和C++中应该避免递归,因为它很容易导致堆栈溢出。所以要解决这个问题:如果你需要递归(例如,出于学习目的),请关闭此警告或将函数转换为非递归(使用经典循环)。因此,从理论上讲,这并不意味着我的递归中有错误,只是一种提醒@约翰尼斯,柠檬酸盐。用于检查的文档表明,它无条件地标记递归调用链,因为存在不应使用递归的上下文。识别调用链是否在这样的上下文中使用是不够上下文敏感的;事实上,在大多数情况下,Clang Tidy不可能知道这一点。递归不仅仅是为了“学习”。在特定示例中,可能不建议使用递归。但在现实世界中,使用递归有很多原因,比如对树中的所有节点执行操作或对文件系统中的文件进行迭代。