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;
}
在下面的一小段 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;
}