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

How to Find all non-Unicode Function Calls in Source Code

本文关键字:Unicode 函数调用 查找 源代码      更新时间:2023-10-16

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

但错误会悄悄潜入,我相信你们都能理解。我最近遇到了一个程序崩溃,在我的代码中的一个地方,我称函数为"isspace"而不是"iswspace"。

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

谢谢。

我在不久

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

我当时所做的是编写一个 C 解析器(当时我使用的是 C...)并检测所有函数调用(这在 C 语法中很容易:"("是一个函数调用,如果在一个块内。在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,等等,然后恢复值。

我现在从 cplusplus.com 编译了一个ANSI函数列表。请非常了解其局限性,特别是:

a) 这不包括以下形式的任何 WinAPI 函数"...A'.b) 它不包括任何使用 Microsoft 命名约定的 C 函数。c) 我可能犯了一些错误。

但是,我希望它将被证明是有用的,并且社区将帮助纠正我可能犯的任何遗漏或错误。

isalnum
isalpha
isblank 
iscntrl
isdigit
isgraph
islower
isprint
ispunct
isspace
isupper
isxdigit
tolower
toupper
to_string
fprintf
fscanf
printf
scanf
snprintf 
sprintf
sscanf
vfprintf
vfscanf 
vprintf
vscanf 
vsnprintf 
vsprintf
vsscanf 
fgetc
fgets
fputc
fputs
getc
getchar
gets
putc
putchar
puts
ungetc
strtod
strtof 
strtol
strtold 
strtoll 
strtoul
strtoull 
memcpy
memmove
memchr
strchr
strcspn
strpbrk
strrchr
strspn
strstr
strtok
memcmp
strcmp
strcoll
strncmp
strxfrm
strcat
strncat
memset
strlen
strftime
regex
cmatch
smatch
csub_match
ssub_match
isctype
toctrans
ctrans
ctype
ctrans_t
ctype_t
int_t
char
EOF