我有类似printf
的功能,可以处理%s
(char *
)和%ls
(wchar_t *
)次转化。如果我为正确的转义符说明符传递正确的参数,那么一切正常。
但是如果我在char *
期间将wchar_t *
传递给我的函数,它可能会发生段错误(例如,空终止字节位于wchar_t
的第二个字节) 。由于我通过va_arg()
访问此参数,因此无法确定类型。
如果我认为这个char
数组总是以NUL终止,我可以逐字节检查以正确处理NUL终止字符并在其后停止内存访问。但后来我无法像这样处理wchar_t
合法值:
0b XXXXXXXX XXXXXXXX 00000000 XXXXXXXX
我已经在使用__attribute__
printf GNU C扩展。但是我的这个函数可能被python程序通过ctypes
使用,所以编译时的格式/类型检查可能还不够。
有没有办法在运行时在我的C函数中执行这样的检查?
( NB :“没有这种方式”可能是答案,但我仍然要求完全确定。)
答案 0 :(得分:2)
不,这是不可能的。
在典型的C实现中,类型系统仅在编译时作为辅助存在。*在运行时,您所拥有的只是数据字节,并且甚至无法从数字中指出指针(除了受过教育的猜测。)
从技术上讲,如果原始参数不是va_arg(ap, const char*)
,char*
,signed char*
或{{},则您甚至不允许unsigned char*
然后检查记忆1}},或这种类型的void*
相关版本。传递给const
的类型始终需要是兼容类型。 (一个原因是没有保证指向不同类型的指针具有相同的大小,布局和含义。)
(*在C ++中,故事还有更多内容,因为表示类型的数据与多态对象相关联,以使va_arg
和dynamic_cast
正常工作,并与所有异常对象相关联使typeid
块正常工作。但这些都不与catch
兼容。)