cert-err34-c 的禁用警告标志是什么?

What is the disabling warning flag for cert-err34-c?

在下面的一小段 C 代码中:

#include <stdio.h>

int main() {
    int i1, i2;
    float f1, f2;
    scanf("%d %d\n%f %f[^\n]%*c", &i1, &i2, &f1, &f2);
    printf("%d %d\n", i1, i2);
    printf("%f %f\n", f1, f2);
    return 0;
}

如何禁用这个cert-err34-c warning:

Clang-Tidy: 'scanf' used to convert a string to an integer value, but function will not report conversion errors; consider using 'strtol' instead

我试着看这个: Concise way to disable specific warning instances in Clang

然后做了类似的事情:

#include <stdio.h>

int main() {
    int i1, i2;
    float f1, f2;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "cert-err34-c"
    scanf("%d %d\n%f %f[^\n]%*c", &i1, &i2, &f1, &f2);
#pragma clang diagnostic pop
    printf("%d %d\n", i1, i2);
    printf("%f %f\n", f1, f2);
    return 0;
}

但现在我得到:

Pragma diagnostic expected option name (e.g. "-Wundef")

我找不到相关的 -Wxxxx 标志在哪里,知道吗?


那里也已经回答了:

您所做的并没有禁用 Clang Tidy 警告
Clang Tidy 的工作方式略有不同

你需要使用像

这样的东西
badcode;  // NOLINT

// NOLINTNEXTLINE
badcode;

badcode; // NOLINT (cert-err-34-c)

禁用Clang-Tidy警告

编辑:- 你所做的实际上禁用了编译器 Clang 的警告,而不是 Clang-Tidy Linter

Edit2:- 在 NOLINT 参数后添加 Space 使其工作

与其尝试禁用这些警告,不如尝试编写更好的代码? scanf() 格式似乎已损坏。

您只想读取 2 行并用 strtol()strtod():

解析它们
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>

int main() {
    char buf[128];
    char *p1, *p2;
    long i1, i2;
    double f1, f2;

    if (!fgets(buf, sizeof buf, stdin)) {
        printf("no input\n");
        return 1;
    }
    errno = 0;
    i1 = strtol(buf, &p1, 10);
    i2 = strtol(p1, &p2, 10);
    if (p1 == buf || p2 == p1) {
        printf("input error\n");
        return 1;
    }
    if (errno != 0) {
        perror("conversion error");
        return 1;
    }
    if (!fgets(buf, sizeof buf, stdin)) {
        printf("missing input\n");
        return 1;
    }
    errno = 0;
    f1 = strtod(buf, &p1);
    f2 = strtod(p1, &p2);
    if (p1 == buf || p2 == p1) {
        printf("input error\n");
        return 1;
    }
    if (errno != 0) {
        perror("conversion error");
        return 1;
    }
    printf("%ld %ld\n", i1, i2);
    printf("%f %f\n", f1, f2);
    return 0;
}