是否有一种方法可以警告或禁止文字字符串连接,例如:

const char *a = "foo" " bar";

我花了几个小时在一个大型静态数组中发现了一个错误

const char * a[] = {"foo" "bar"};

而不是

const char * a[] = {"foo", "bar"};

推荐答案

Clang有一个警告-Wstring-concatenation,明确地设计来捕捉这样的漏洞:

warning: suspicious concatenation of string literals in an array initialization; did you mean to separate the elements with a comma? [-Wstring-concatenation]
char const *a[]  = { "ok", "foo" "bar", "ok"};
                                 ^
                                ,

这对于您展示的玩具示例并不完全有效,因为您需要有几个初始值设定项,并且只在几个位置缺少逗号,即:

// no warning
char const *b[]  = {"foo" "bar"};
// no warning
char const *c[]  = {"ok", "foo" "bar"};
// no warning
char const *d[]  = {"foo" "bar", "ok"};

但是,如果数组中有大量的初始值设定项,并且只在几个位置输入错误,这似乎很理想.

这是一张demo美元.

GCC似乎没有类似的警告,但它应该加上request.

请注意,这仅适用于数组初始化.你的例子

const char *x = "foo" " bar";

不会被这个警告(或我所知道的任何其他警告)检测到.

还要注意,启用此警告可能会产生大量误报,但在try 捕获错误时可以谨慎使用它.

C++相关问答推荐

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

为什么已经设置的值在C中被重置为for循环条件中的新值?

为什么PLT表中没有push指令?

特定闪存扇区的内存别名

当execvp在C函数中失败时杀死子进程

Rust FFI--如何用给出返回引用的迭代器包装C风格的迭代器?

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

在Rust和C之间使用ffi时如何通过 struct 中的[U8;1]成员传递指针

在C++中父进程和子进程中的TAILQ队列同步问题

Linux分段故障(核心转储)

为什么我无法访问C语言中的文件

问题:C#Define上的初始值设定项元素不是常量

Linux Posix消息队列

Malloc和对齐

将size_t分配给off_t会产生符号转换错误

GCC认为这是一个VLA是对的吗?

与指针的原始C数组或C++向量<;向量<;双>>;

execve 不给出which命令的输出

子进程不会修改父进程中的统计信息

在 C/C++ 中原子按位与字节的最佳方法?