在运行时检查指针后面的数据以避免段错误:(wchar_t *)vs.(char *)

时间:2017-06-18 18:27:39

标签: c string-formatting variadic-functions typechecking

我有类似printf的功能,可以处理%schar *)和%lswchar_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 :“没有这种方式”可能是答案,但我仍然要求完全确定。)

1 个答案:

答案 0 :(得分:2)

不,这是不可能的。

在典型的C实现中,类型系统仅在编译时作为辅助存在。*在运行时,您所拥有的只是数据字节,并且甚至无法从数字中指出指针(除了受过教育的猜测。)

从技术上讲,如果原始参数不是va_arg(ap, const char*)char*signed char*或{{},则您甚至不允许unsigned char*然后检查记忆1}},或这种类型的void*相关版本。传递给const的类型始终需要是兼容类型。 (一个原因是没有保证指向不同类型的指针具有相同的大小,布局和含义。)

(*在C ++中,故事还有更多内容,因为表示类型的数据与多态对象相关联,以使va_argdynamic_cast正常工作,并与所有异常对象相关联使typeid块正常工作。但这些都不与catch兼容。)