Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时检查指针后面的数据以避免分段错误:(wchar_t*)vs.(char*))_C_String Formatting_Variadic Functions_Typechecking - Fatal编程技术网

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

在运行时检查指针后面的数据以避免分段错误:(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终止字符并停止内存访问。但这样我就无法处理

我有一个类似于printf的函数,可以处理
%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
的类型始终必须是兼容类型。(一个原因是无法保证指向不同类型的指针具有相同的大小、布局和含义。)


+(C++)还有一点,因为表示数据的类型被存储到多态对象,使<代码>动态DistaCase和<代码> Type ID >代码>工作,并与所有异常对象相关联,使<代码> catch >代码>块工作正常,但没有一个与<>代码> VAYARG 兼容。

如果要通过python使用它,您是否考虑过用python为其编写包装器?在运行时,您不能,但在编译时,可以编写验证参数的编译器扩展。但这在C中不是问题,你可以让用户崩溃。我也不相信在C中这是可能的(你实际上需要传递运行时类型信息,而C不支持)。“在运行时检查指针类型”-这有什么用?C是静态类型的@Olaf也许“在内存地址检查数据类型/结构”会更准确。