如果一个函数被使用,编译器会发出警告

5

我有许多使用 strcmpstrcpyC代码,这导致了各种问题。我想将其迁移到使用strncmpstrncpy,但现在无法更新所有代码。我想在使用这些函数的任何地方添加编译器警告。

以下语句强制执行替换#define strcmp(x,y) strncmp16(x,y,64),但问题仍然存在于代码中。

是否有一种方法可以添加#warning,以便代码仍然可以编译,但会发出不使用已确定大小的函数的警告。

它是一个庞大的代码库,必须在四个不同的编译器(GCC、IAR、GHS和VC)中编译。这是我们自己的C库,主要用于嵌入式系统。

编辑:我不想找到所有出现的内容。有成千上万的工具可以用来查找和替换它们。我希望有一个警告,这样下次有人查看代码时,他们会评估并修复代码。

编辑: Strncmp和strncpy有很多问题,我非常清楚这一点。我正在做出知情决策。这些函数在我们自己的C库中,而不仅仅是编译器的默认函数库。


2
你为什么不使用编辑器的查找和替换功能(如果有的话)? - haccks
1
这是一个庞大的代码库。所有更改必须单独评估。我想分阶段在一个月或两个月内进行更改,而不是一次性全部实施。 - Gerhard
1
@gerhard,仍然可以使用您的编辑器(或grep)找到它们的使用位置,并逐个查看它们。搜索文件比编译文件并让编译器告诉您它们的使用位置更容易(也更有效率)! - Shahbaz
1
使用预处理器进行查找/替换是一次性完成的。Shahbaz建议采用更安全的替代方案。同时,不要考虑使用strncpy,因为这只会将一组问题转换为另一组更微妙(且危险)的问题。 - user694733
2个回答

4

虽然你可以使用 #define 强制产生错误,但是在 C99 标准中(可能在 C11 中也没有)没有机制可以强制产生警告。

如果你正在使用 gcc,可以使用以下命令:

__attribute_deprecated__

标记原型为已弃用,例如:

int strcmp(const char *, const char *) __attribute_deprecated__;

5
我见过 __attribute__((deprecated))__attribute__((deprecated("message"))) 这两种写法。后者可以加入一条提示信息,但你是否知道双括号的无信息版本和单括号版本之间的区别? - pseyfert

2

对于Visual Studio:

在函数原型前加上__declspec(deprecated)前缀,如MSDN所示。

您需要将警告级别提高到3+。

例如:

#pragma deprecated(strcpy, strcmp)

这条语句将导致每次调用两个函数时忽略C4995警告。 这些特定的函数已经发出了C4996警告,但您可以通过一个编译指示符来关闭该警告: #pragma warning(disable: 4996)


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