如何在源代码中查找所有非 Unicode 函数调用
How to Find all non-Unicode Function Calls in Source Code
在我的源代码中,我一直非常小心地使用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
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 如何在 c++ 中调用 unicode 函数 CreateProcessW 来启动 Windows 可执行文件
- 如何在源代码中查找所有非 Unicode 函数调用
- 我可以使用什么winapi C函数调用来将unicode转换为ascii,反之亦然