什么是“Clang-Tidy:函数是否在递归调用链”?怎么修?

lnlaulya  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(557)

我正在写一个用C语言处理字符串的函数,它是递归的。基本上,它所做的就是找到一些字符和'\0'之间的字符串。如果在找到'\0'之前,它遇到了特定的字符,它将递归地调用自己。
在CLion中编写时,我看到了来自Clang-Tidy的警告,这是我以前从未见过的。它说
Clang-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++;
    }
}
cld4siwp

cld4siwp1#

是的,recent Clang-Tidy diagnoses recursion。如果你有意编写一个递归函数,并且你确信它不能在不允许递归的上下文中使用(例如,参见Clang-Tidy文档中的参考文献),那么忽略这个警告是合理的。由于“disallowed”更多的时候是一个策略问题而不是技术问题,所以您应该考虑清楚地说明函数是递归的。你应该考虑 * 不 * 使用递归,这通常对真实世界的代码更好。
此检查不在Clang-Tidy 10中。我很难找到Clang-Tidy 11的文档,但是Clang-Tidy 12的发行说明并没有将其列为新的,所以它看起来像是在11中添加的。

相关问题