如何在源代码中查找所有非Unicode函数调用

nie*_*iro 6 c++ unicode winapi

在我的源代码中,我一直非常小心地使用Unicode,总是调用WinAPI函数的宽版本,在我的转换中非常小心等等,以支持我的程序的许多用户使用非英文版本的Windows.

但是错误渐渐蔓延,我相信你们都能理解.我最近遇到程序崩溃,在我的代码中只有一个地方,我调用了函数"isspace"而不是"iswspace".

是否有一些工具允许我扫描我的所有ANSI函数调用的源代码,希望找到可能存在的更多错误?

谢谢.

Ale*_*lke 1

我不久前正在开发的一个软件遇到了问题。我发现问题是由 strcpy()、strcat() 等各种字符串函数引起的,这些函数没有保护,如果源出于某种原因出现问题,则可能会覆盖目标缓冲区。

我当时所做的是编写一个 C 解析器(当时我使用的是 C...)并检测所有函数调用(这在 C 语法中很容易:“(”是一个函数调用,如果在一个块内。在 C++ 中您还必须检测类和结构本身,但这并不需要太多工作。)现在,您可以在软件不应该使用的任何函数上生成错误,从而破坏您的构建。

免费的 C++ 解析器“无处不在”,因此您可以使用其中之一并重用该代码。

现在,还有另一种方法,它使用预处理器:对于您不希望软件使用的任何函数,您可以创建一个#define,它在使用时会生成错误:

#define isspace function-error "please use iswspace() instead of isspace()"
Run Code Online (Sandbox Code Playgroud)

当然,这意味着您首先需要知道此类函数的列表,正如其他人提到的,您可以通过查看动态库链接表来找到。但结果是,如果不首先修复一些问题,您将无法编译软件。一个问题是,您必须在最后包含的头文件中执行此操作,否则您的库头文件可能会出现一些问题:

#include <boost/shared_ptr.hpp>
#include <non_unicode_function.h>
... your functions ...
Run Code Online (Sandbox Code Playgroud)

这可能比 C++ 解析器更简单,但也可能没那么有趣……但是,如果偶尔需要调用一个禁止的函数,您可以执行一个 #undef 并清楚地记录下来,等等,然后恢复之后的值。