有没有GCC标志可以检测字符串字面量的连接?

5

我最近修复了一个类似于这样的错误

const char *arr[] = {
"string1", // Some comment
"string2",
"string3"  // Another comment
"string4",
"string5"
};

比如说,有人在 "string3" 后面忘记了加上一个 ,,导致 "string3" 和 "string4" 被拼接在一起。虽然这是合法的代码,但是否有 GCC 警告标志或其他工具可以扫描代码库以查找类似的错误呢?


我非常怀疑是否有这样的选项,因为它在各种地方都是有意使用的,会产生很多错误的结果。 - stefan
4
可能会有帮助的是明确声明数组大小。编译器或静态分析器可能会注意到你没有提供足够的元素。 - stefan
4
@stefan,实际上这样做行不通,最后一个元素将会被进行值初始化(用C++的术语来说)。 - user3920237
@remyabel 我知道,但仍然可能有静态分析器会在事物看起来不寻常时发出警告(典型用法是使用{}{0}或完整的元素列表)。当然,这永远不是错误。 - stefan
5
适当的单元测试应该能够检测出这个错误,可以直接测试数组,也可以通过测试使用该数组的某些东西来间接地测试。静态初始化数据并不意味着它不需要被单元测试覆盖。 - hyde
显示剩余7条评论
2个回答

1

一个基本的“工具”可以使用预处理器黑客,但这是一个非常丑陋的解决方案:

#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));
}

你说得对 - 真的很丑 ;) 我同意 hyde(上面) 的观点:“适当的单元测试应该能够检测到这个错误,可以直接测试数组,也可以通过测试使用数组的其他内容间接地进行测试。” - FoggyDay
我们遇到了一个类似的问题,即在函数调用func(format, "foo" "bar")中,原型为func(char *, ...),即具有可变参数,gcc无法检测到缺少的,,将两个字符串参数连接起来而没有任何警告,并且由于format字符串和参数不匹配,导致进程SIGSEGV。 - guru

0

GCC有这样一个警告:

-Wtraditional(仅限C和Objective-C)

警告一些在传统C和ISO C中行为不同的构造。还警告没有传统C等效项的ISO C构造,以及应该避免的有问题的构造。

.....

  • 检测到使用ISO字符串连接。

1
你在引用什么? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接