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

亨利

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

#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);
}

但是,这个其他代码没有。唯一的区别是使用 thisfor (j = 2; j <= i; ++i)而不是 this for (j = 2; j <= i; ++j)

#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);
}

我的问题是如何才能最好地发现代码中的这些小错误?现在,我已经-Wall-Wextra激活,但即使有这些我越来越:Errors: 0Warnings: 0这使得它有点难以发现的问题。有什么建议可以更好地解决错误吗?谢谢!

知乎

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

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

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

long int f_fact(int n) {
    long int factorial = 1;

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

除了-Wall -Wextra(和-Weverything用于 clang)之外,这里还有一些我用于我的项目的额外标志

  • 避免潜在签名char类型的问题-funsigned_char -Wchar-subscripts
  • printf使用可变格式字符串防止-Wformat-nonliteral
  • 制作字符串文字const-Wwrite-strings

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Clang的-Wall和-Wextra中包含哪些警告?

将 Boost 序列化与 -Wall -Wextra 一起使用时的警告

除了.id和.arn之外,还有哪些其他地形资源属性?

除了使用 try & 除了遍历具有 str 和 float 值而没有错误的列表之外,还有其他方法吗?

除了后端和 API 之外,Google App Engine 是否可以用于其他流程?

除了NTFS之外,还有其他更好的选择可以在Ubuntu和Windows 7之间共享HD吗?

除了dict,list,set和tuple之外,是否还有其他内置容器?

除了SELinux和AppArmor之外,还有其他LSM(Linux安全模块)吗?

除了全局,系统和本地之外,git配置设置还有其他地方吗?

除了 Meltdown 和 Spectre 之外,是否还有其他处理器漏洞?

除了MVP和MVC之外,还有其他模式吗?

除了在 dynamo db 中进行扫描和查询之外,还有其他操作吗?

除了smplayer和umplayer以外,mplayer还有哪些其他方面?

除了 <button> 之外,还有哪些 <tag> 可以用来触发 AJAX?

-Wall和-Weverything有什么区别?

除了在 C++ 中使用 if wall 而不是其他東西,還有其他選擇嗎?

除了 " 和 '?

带有-Wall和-Werror的警告不被视为错误

除了 $GOROOT 和 $GOPATH 之外,还有哪些来源用于包“roots”?

除了 tsc 之外,还有其他 TypeScript 工具吗?

除了IndexFields和BatchFields之外,还获得KofaxValues

除了使用触摸和回声之外,还有没有其他更好的方法可以在bash中创建文件?

除了使用BeautifulSoup和Scrapy之外,还有其他方法无法刮掉不可刮擦的网站吗?

除了使用Spring的setter和@JsonProperty反序列化之外,还有其他方法吗?

导入Dart库时使用“显示”是否除了意图和编译器速度之外还有其他好处?

除了移情和拼音之外,还有其他支持Google Talk的IM客户端吗?

除了与 SQL Server 2000 和 2005 兼容之外,使用 datetime2 是否还有其他问题

在Informatica Powercenter中进行表达式转换中的语句时,除了Decode和IIF之外,是否还有其他功能可以实现大小写?

除了 Pandas 和 dask 之外,还有哪些更快的读取大数据集和应用行明智操作的方法?