在运行时检查指针后面的数据以避免分段错误:(wchar_t*)vs.(char*))
我有一个类似于printf的函数,可以处理在运行时检查指针后面的数据以避免分段错误:(wchar_t*)vs.(char*)),c,string-formatting,variadic-functions,typechecking,C,String Formatting,Variadic Functions,Typechecking,我有一个类似于printf的函数,可以处理%s(char*)和%ls(wchar\t*)转换。如果我为正确的conv说明符传递了正确的参数,那么一切都正常 但如果我在函数需要wchar\u t*时将char*传递给函数,它可能会出现segfault(例如,空终止字节位于wchar\u t的第二个字节)。由于我是通过va_arg()访问此参数的,因此无法确定其类型 如果我认为这个代码> char 数组总是NUL终止,我可以检查字节之后的字节来正确处理NUL终止字符并停止内存访问。但这样我就无法处理
%s
(char*
)和%ls
(wchar\t*
)转换。如果我为正确的conv说明符传递了正确的参数,那么一切都正常
但如果我在函数需要wchar\u t*
时将char*
传递给函数,它可能会出现segfault(例如,空终止字节位于wchar\u t
的第二个字节)。由于我是通过va_arg()
访问此参数的,因此无法确定其类型
如果我认为这个代码> char 数组总是NUL终止,我可以检查字节之后的字节来正确处理NUL终止字符并停止内存访问。但这样我就无法处理
wchar\u t
这样的合法值:
0b XXXXXXXX XXXXXXXX 00000000 XXXXXXXX
我已经在使用\uuuu属性\uuuu
printfgnuc扩展。但我认为python程序可能通过使用此函数,因此编译时的格式/类型检查可能不够
在我的C函数中有没有一种在运行时执行这种检查的方法
(注意:“没有这样的方法”可能是答案,但我仍然在问,以便完全确定。)不,这是不可能的 在典型的C实现中,类型系统仅在编译时作为辅助工具存在。*在运行时,您所拥有的只是字节数据,甚至无法区分指针和数字(除了经过教育的猜测) 从技术上讲,如果原始参数不是
char*
,有符号char*
,无符号char*
或void*
,或此类类型的const
相关版本,则甚至不允许您检查内存。传递给va_arg
的类型始终必须是兼容类型。(一个原因是无法保证指向不同类型的指针具有相同的大小、布局和含义。)