在我的源代码中,我一直非常小心地使用Unicode,总是调用WinAPI函数的宽版本,在我的转换中非常小心等等,以支持我的程序的许多用户使用非英文副本Windows。
但错误蔓延,因为我相信你们都能理解。我最近遇到程序崩溃,在我的代码中只有一个地方,我调用了函数“isspace”而不是“iswspace”。
是否有一些工具允许我扫描所有ANSI函数调用的源代码,希望找到可能存在的更多错误?
谢谢。
答案 0 :(得分:1)
我在一段时间内正在使用的软件中遇到了问题。我发现问题是由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,等等。并在之后恢复该值。
答案 1 :(得分:0)
我现在已经从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