例如:
#include <stdio.h>
#define TS_SIZE 188
int main(void)
{
volatile int offset = 0;
volatile int len = 10;
for (int i=0; i < len; i++)
{
offset =+ TS_SIZE; /* This should be += */
}
printf("Offset: %d \n", offset);
return 0;
}
尝试了“-Wall
、 -Wextra
和 -pedantic
”,即使在 Godbolt 编译器资源管理器上使用最新的 GCC (10.x) 也不走运。笔记:
这只是一个小的人为示例代码。使用 Volatile 的原因很明显。
最佳答案
这实际上不是编译器的工作。编译器在那里检查您的代码是否是有效的 C,然后将您的源代码转换为目标系统的机器代码。
然而,多年来,编译器变得越来越友好,有时会针对常见错误、定义不明确的行为或其他潜在的运行时不当行为发出警告。这种友好性不应被误认为是编译器将捕获所有此类错误的某种保证。
虽然编译器倾向于警告 if(a = b)
, 带有最大警告的 gcc 甚至不会警告明显的东西,例如 int arr[2]; arr[2]=1;
(clang 和 icc 确实如此)。正如你所注意到的,不是为了 =+
, =!
等等。
对此的解决方案是拥有一个涵盖尽可能多的已知问题的软件质量系统。不仅仅是依靠编译器警告,而是迈出成为专业软件工程师的一步。这意味着编码风格指南、使用 C 的安全子集的编码标准、静态分析工具、代码“美化者”和同行代码审查。
静态分析器可以找到很多编译器没有寻找的错误,但也许不会找到这个特定的错误,除非您明确配置它来查找它。一个编码标准+代码美化器应该把代码转换成offset = +TS_SIZE;
但是,在此之后手动代码审查将很容易发现错误。
编辑:正如评论中所指出的,=+
在非常早期的前 K&R 版本中曾经是有效的 C。这里有一些历史课:What does =+ mean in C? ,尤其是 Jonathan Leffler 的精彩回答。
关于c - 如果我使用 "=+"而不是 "+="运算符,是否可以选择让 GCC 警告我?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66333160/