在我的源代码中,我一直非常小心地使用 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) 这不包括任何形式为“...A”的 WinAPI 函数。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