Python扩展用于Upskirt:字符串末尾垃圾

2 投票
1 回答
3069 浏览
提问于 2025-04-16 16:40

我一直在尝试为Upskirt制作一个Python扩展。我觉得对于第一个C语言项目来说,这应该不会太难,因为有一些示例(比如Upskirt代码中的示例程序和Ruby扩展)。

这个扩展是可以工作的,它能把我输入的Markdown格式的内容转换过来,但有时候输出的结果在字符串的末尾会出现一些杂乱的东西。我不知道是什么原因导致的。

以下是一些输出结果:

python test.py 
<module 'pantyshot' from '/home/frank/Code/pantyshot/virtenv/lib/python2.7/site-packages/pantyshot.so'>
<built-in function render>

'<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>\n\x7f'
<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>

--------------------------------------------------------------------------------

'<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>\n\x7f'
<p>This <strong>is</strong> <em>a</em> <code>test</code>. <a href="http://example.com">Test</a>.</p>

--------------------------------------------------------------------------------

我的代码可以在我的Github仓库找到。我把它叫做pantyshot,因为我想到这个名字时正好听到upskirt。名字有点奇怪,我知道。

希望有人能帮帮我。

1 个回答

3

你在这个地方使用了一个叫做 strdup 的函数:

output_text = strdup(ob->data); /* ob is a "struct buf *" */

但是我觉得 ob->data 可能不是一个以零结尾的C字符串。你可以在这里找到相关内容 upskirt/buffer.c

/* bufnullterm • NUL-termination of the string array (making a C-string) */
void
bufnullterm(struct buf *buf) {
    if (!buf || !buf->unit) return;
    if (buf->size < buf->asize && buf->data[buf->size] == 0) return;
    if (bufgrow(buf, buf->size + 1))
        buf->data[buf->size] = 0; }

所以,你可能是在超出缓冲区的范围运行代码,碰巧在出错之前遇到了一个 '\0'。我觉得在把 ob->data 复制成C字符串之前,你应该先调用 bufnullterm(ob);或者你可以查看 ob->size,使用 mallocstrncpy 来复制它,并手动处理零结尾的问题(但要确保你分配的内存是 ob->size + 1 字节,以便存放复制的字符串)。

如果你想去掉换行符(也就是最后的 \n),那么你可能需要在某个地方手动去除空白字符。

撰写回答