clang 没有检测到 switch fallthroughs
clang not detecting switch fallthroughs
我想让 clang 捕捉到我无意中的 'switch' 语句失误。这个 shell 脚本证明了我的失败;我在脚本本身之后显示输出。我做错了什么?
#!/bin/sh
cat <<EOD > 1.c
#include <stdio.h>
int main(void)
{
int etwas=5;
switch(etwas)
{
case 5:
{
printf("It's 5.\n");
}
case 6:
{
printf("It's 6.\n");
}
default:
{
printf("It's something else\n");
break;
}
}
return 0;
}
EOD
rm -f 1
clang --version
echo === demonstrating that unrecognized warning names are not allowed ===
clang -Wnonsense-warning -Werror -Wall 1.c -o 1
echo === The real compile follows. ===
clang -Wimplicit-fallthrough 1.c -o 1
echo === The execution follows. ===
./1
输出:
FreeBSD clang version 4.0.0 (tags/RELEASE_400/final 297347) (based on LLVM 4.0.0)
Target: x86_64-unknown-freebsd11.1
Thread model: posix
InstalledDir: /usr/bin
=== demonstrating that unrecognized warning names are not allowed ===
error: unknown warning option '-Wnonsense-warning'
[-Werror,-Wunknown-warning-option]
=== The real compile follows. ===
=== The execution follows. ===
It's 5.
It's 6.
It's something else
显然,-Wimplicit-fallthrough
应该只在 C++11 模式下生效(而不是在 C 模式或 C++03 下),这是一个有意的设计决定。
邮件列表讨论中表达的基本原理似乎是这样的:
- 他们不希望它在 C 中默认启用,因为它会惹恼 C 编码器,并且(在 C2x 之前)没有 agreed-on 指示代码中故意漏掉的方法;
- 他们确实希望在指定
-Wextra
时在 C++11 中启用它,因此他们希望 -Wextra
暗示 -Wimplicit-fallthrough
。但是他们的前端不支持 -Wextra
根据我们是否处于 C++11 模式暗示不同的选项;
- 实现 (1) 和 (2) 的最简单方法就是在 C 中完全禁用它
我想让 clang 捕捉到我无意中的 'switch' 语句失误。这个 shell 脚本证明了我的失败;我在脚本本身之后显示输出。我做错了什么?
#!/bin/sh
cat <<EOD > 1.c
#include <stdio.h>
int main(void)
{
int etwas=5;
switch(etwas)
{
case 5:
{
printf("It's 5.\n");
}
case 6:
{
printf("It's 6.\n");
}
default:
{
printf("It's something else\n");
break;
}
}
return 0;
}
EOD
rm -f 1
clang --version
echo === demonstrating that unrecognized warning names are not allowed ===
clang -Wnonsense-warning -Werror -Wall 1.c -o 1
echo === The real compile follows. ===
clang -Wimplicit-fallthrough 1.c -o 1
echo === The execution follows. ===
./1
输出:
FreeBSD clang version 4.0.0 (tags/RELEASE_400/final 297347) (based on LLVM 4.0.0)
Target: x86_64-unknown-freebsd11.1
Thread model: posix
InstalledDir: /usr/bin
=== demonstrating that unrecognized warning names are not allowed ===
error: unknown warning option '-Wnonsense-warning'
[-Werror,-Wunknown-warning-option]
=== The real compile follows. ===
=== The execution follows. ===
It's 5.
It's 6.
It's something else
显然,-Wimplicit-fallthrough
应该只在 C++11 模式下生效(而不是在 C 模式或 C++03 下),这是一个有意的设计决定。
邮件列表讨论中表达的基本原理似乎是这样的:
- 他们不希望它在 C 中默认启用,因为它会惹恼 C 编码器,并且(在 C2x 之前)没有 agreed-on 指示代码中故意漏掉的方法;
- 他们确实希望在指定
-Wextra
时在 C++11 中启用它,因此他们希望-Wextra
暗示-Wimplicit-fallthrough
。但是他们的前端不支持-Wextra
根据我们是否处于 C++11 模式暗示不同的选项; - 实现 (1) 和 (2) 的最简单方法就是在 C 中完全禁用它