C 除了-Wall和-Wextra之外,还有什么其他工具可以用来发现尽可能多的错误或警告?

C 除了-Wall和-Wextra之外,还有什么其他工具可以用来发现尽可能多的错误或警告?,c,compiler-warnings,C,Compiler Warnings,下面的代码完美地计算了一个数字的阶乘 #include <stdio.h> long int f_fact(int i); int main() { int a; long int factorial; printf("Please enter a number\n"); scanf("%d", &a); factorial = f_fact(a); printf("The factorial is %ld\n", fa

下面的代码完美地计算了一个数字的阶乘

#include <stdio.h>

long int f_fact(int i);

int main() {
    int a;
    long int factorial;

    printf("Please enter a number\n");
    scanf("%d", &a);

    factorial = f_fact(a);
    printf("The factorial is %ld\n", factorial);

    return 0;
}

long int f_fact(int i) {
    int j;
    long int factorial = 1;

    for (j = 2; j <= i; ++j) {
        factorial = factorial * j;
    }
    return (factorial);
}
#包括
长整数f_事实(整数i);
int main(){
INTA;
长整数阶乘;
printf(“请输入一个数字”);
scanf(“%d”和“&a”);
阶乘=f_事实(a);
printf(“阶乘是%ld\n”,阶乘);
返回0;
}
长整数f_事实(整数i){
int j;
长整数阶乘=1;

对于(j=2;j编译器无法检查逻辑错误。您可能是有意编写该指令的

哦,为了检查一些自动检测问题,GCC知道
-pedantic
,但是请阅读完整的文档。您可能想试试clang的功能

这是单元测试发挥作用的领域。从一本好书开始,尝试一些框架,然后测试您的逻辑

“我的问题是如何才能最好地发现代码中的这些小错误?”

不幸的是,无论是在GCC还是在Clang中,都没有检测逻辑问题的编译器选项

在可以插入相同类型对象的位置使用放错位置的对象是编译器无法检测到的,因为这是一个逻辑问题。编译器只能检测语法问题

如果没有内存被破坏,那么一些额外的代码分析器工具,如f.e.AddressSanitizer或Valgrind,甚至都找不到它

要防止这种错误,你唯一能做的就是在编码时要小心

避免过于频繁地复制和粘贴,而是通过单独编写代码部分来明确重点

对于提供的问题,请避免复制循环头或其部分,尤其是嵌套循环的内部


但要回答你的问题:

除了-Wall和-Wextra之外,还有什么其他工具可以用来发现尽可能多的错误或警告

例如,GCC有
-Wpedantic
/
-pedantic
-Wall
-Werror

您可以在此处找到它们和更多,并列出相应的解释:


对于Clang,您有f.e.
-Weverything
。您可以在此处找到诊断选项列表及其说明:


您已经知道并使用了
-Wall-Wextra
,可以使用
-Werror
完成,通过标记一些经典问题来检测潜在错误

虽然您可以添加更多的编译器选项来尝试检测其他问题,但很难检测逻辑错误。例如,如果设置了变量但未使用,则可以检测到简单的键入错误,但您的错误仍然会被忽略

其他预防措施包括编码样式和命名约定:非常严格的样式规则,特别是空格和缩进的一致使用,有助于提高代码的可读性,减少隐藏愚蠢错误的空间。命名约定也有帮助:在您的示例中,不应命名参数
i
,而应命名参数
n
i
是索引变量的默认名称,正如您自己所经历的,因此正确命名参数可以有效地防止此错误:

long int f_事实(int n){
长整数阶乘=1;

对于(int i=2;我认为这是不可能的。这是代码逻辑中的一个错误,我很确定编译器没有足够的智能来区分逻辑错误和逻辑正确的代码。我的意思是,如果你真的打算在那里增加
i
,不管是什么原因?编译器是否应该猜测你正在编写一个阶乘函数ion?我明白你的观点@ForceBru感谢你的快速回复!-)使用几种不同的编译器增加了警告相关的:使用clang,你可以发现更多的问题,但在你的情况下,它最多可以在测试时给你一个提示:。
#include <stdio.h>

long int f_fact(int i);

int main() {
    int a;
    long int factorial;

    printf("Please enter a number\n");
    scanf("%d", &a);

    factorial = f_fact(a);
    printf("The factorial is %ld\n", factorial);

    return 0;
}

long int f_fact(int i) {
    int j;
    long int factorial = 1;

    for (j = 2; j <= i; ++i) {
        factorial = factorial * j;
    }
    return (factorial);
}