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

标签 c++ winapi unicode

在我的源代码中,我一直非常小心地自始至终使用 Unicode,始终调用广泛版本的 WinAPI 函数,在我的转换中非常小心,等等,以支持我的程序的许多用户使用非英语拷贝Windows。

但是错误会悄悄出现,我相信你们都能理解。我最近遇到了一次程序崩溃,在我的代码中只有一个地方,我调用函数“isspace”而不是“iswspace”。

是否有某种工具可以让我扫描我的源代码以查找所有 ANSI 函数调用,以期找到可能存在的更多错误?

谢谢。

最佳答案

我在一段时间前开发的软件中遇到了问题。我发现问题是由 strcpy()、strcat() 等各种没有保护的字符串函数引起的,如果源出于任何原因出现问题,它们可能会覆盖目标缓冲区。

我当时所做的是编写一个 C 解析器(那时我正在使用 C...)并检测所有函数调用(这在 C 语法中很容易:'(' 是一个函数调用,如果在一个 block 中. 在 C++ 中,你也必须检测类和结构,但这并没有太多工作。)现在你可以在你的软件不应该使用的任何函数上生成一个错误,这会破坏你的构建。

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

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

#define isspace function-error "please use iswspace() instead of isspace()"

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

#include <boost/shared_ptr.hpp>
#include <non_unicode_function.h>
... your functions ...

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

关于c++ - 如何在源代码中查找所有非 Unicode 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19732497/

相关文章:

winapi - 如何控制 ComboBox 中下拉列表框的宽度

c++ - 当窗口关闭时,我的析构函数会被调用吗?

regex - 为什么 Perl v5.22 没有找到所有的句子边界?

c++ - &= 必须始终被解释为运算符吗?

c++ - 如何在 3D 中对 QML 旋转变换进行动画处理和属性插值

c++ - 错误: expected ';' before defining object of class

c++ - 错误 : expected primary-expression before '{' token

unit-testing - 如何在 Windows 上安装 pgTAP?

android - 新的卢比符号的 unicode 不会显示在 Android 模拟器上

android - 某些 unicode 字符不会在某些设备上呈现