【发布时间】:2018-01-28 13:17:32
【问题描述】:
我 90% 确定我在这里看到的奇怪结果是由我的代码触发的某种 UB,但是,我找不到它:
cdef char** to_cstring_array(strings):
cdef char** result = <char**>malloc(len(strings) * sizeof(char*))
cdef bytes item
nelements = len(strings)
i = 0
while i < nelements:
s = str(strings[i]).encode("utf-8")
item = s
result[i] = item
i += 1
return result
cpdef object pykubectl_get(object items, object options=None):
cdef size_t nargs = len(items);
cdef bytes message
cdef char** args = to_cstring_array(items);
# message = args[0]
# print("1 items encoded: {}".format(message))
json_opts = json.dumps(options or {}).encode("utf-8")
cdef char* opts = json_opts
print("items: {}".format(items))
message = args[0]
print("2 items encoded: {}".format(message))
cdef ResourceGet_return result = kubectl_get(
opts,
len(json_opts),
<const char**>args,
nargs
)
free(args)
if result.r0.n == 0:
message = result.r1.p
raise Exception("kubectl failed: '{}'".format(message.decode("utf-8")))
message = result.r0.p
return json.loads(message.decode("utf-8"))
如果我取消注释将第一个参数分配给message 的行,args 的内容会发生变化。我的猜测是编译器正在尝试优化这里的某些东西,它可能与内存分配的完成方式有关,但我看不出它有任何问题。我也知道,原则上,我不需要强制转换为const char**,但我收到了不强制转换的警告,所以我添加了它。如果我忽略警告并且不施放,它什么也不会改变。
我不会发布生成的 C 代码,因为它很大……但如果这不可避免,我会在别处发布。
【问题讨论】:
标签: python c cython undefined-behavior