我最近修复了一个类似于这样的错误
const char *arr[] = {
"string1", // Some comment
"string2",
"string3" // Another comment
"string4",
"string5"
};
比如说,有人在 "string3" 后面忘记了加上一个 ,
,导致 "string3" 和 "string4" 被拼接在一起。虽然这是合法的代码,但是否有 GCC 警告标志或其他工具可以扫描代码库以查找类似的错误呢?
我最近修复了一个类似于这样的错误
const char *arr[] = {
"string1", // Some comment
"string2",
"string3" // Another comment
"string4",
"string5"
};
比如说,有人在 "string3" 后面忘记了加上一个 ,
,导致 "string3" 和 "string4" 被拼接在一起。虽然这是合法的代码,但是否有 GCC 警告标志或其他工具可以扫描代码库以查找类似的错误呢?
一个基本的“工具”可以使用预处理器黑客,但这是一个非常丑陋的解决方案:
#include <stdlib.h>
#include <stdio.h>
int start = __LINE__;
const char *arr[] = {
"string1", //some comment
"string2",
"string3" //another comment
"string4",
"string5"
};int end = __LINE__;
int main(int argc, char **argv){
printf("arr length: %zu\n", sizeof(arr) / sizeof(arr[0]));
printf("_assumed_ arr length: %d\n", (end - start - 2));
}
func(format, "foo" "bar")
中,原型为func(char *, ...)
,即具有可变参数,gcc无法检测到缺少的,
,将两个字符串参数连接起来而没有任何警告,并且由于format
字符串和参数不匹配,导致进程SIGSEGV。 - guruGCC有这样一个警告:
-Wtraditional(仅限C和Objective-C)
警告一些在传统C和ISO C中行为不同的构造。还警告没有传统C等效项的ISO C构造,以及应该避免的有问题的构造。
.....
- 检测到使用ISO字符串连接。
{}
、{0}
或完整的元素列表)。当然,这永远不是错误。 - stefan