You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ImageMagick C API的FileToBlob()读取stdin时内存错误求助

问题:ImageMagick C API读取标准输入为Blob时触发内存错误

问题背景

我需要使用ImageMagick C API读取文件,由于要读取标准输入(stdin)两次,因此计划先将标准输入内容读取为Blob。

初始代码片段

size_t blob_length = 0;
ExceptionInfo blob_exception;
printf("about to read blob\n");
void *blob = FileToBlob(filename, 99999999, &blob_length, &blob_exception);
printf("read blob: %ld\n", blob_length);

错误现象

当filename为普通文件名时程序运行正常,但将其设为特殊值"-"(表示读取标准输入)时,触发如下错误:

about to read blob
realloc(): invalid next size
Aborted (core dumped)

GDB栈跟踪信息

#0  0x00007ffff60a14dc in ?? () from /usr/lib/libc.so.6
#1  0x00007ffff6051998 in raise () from /usr/lib/libc.so.6
#2  0x00007ffff603b53d in abort () from /usr/lib/libc.so.6
#3  0x00007ffff609567e in ?? () from /usr/lib/libc.so.6
#4  0x00007ffff60ab26c in ?? () from /usr/lib/libc.so.6
#5  0x00007ffff60af00c in ?? () from /usr/lib/libc.so.6
#6  0x00007ffff60afd12 in realloc () from /usr/lib/libc.so.6
#7  0x00007ffff7916924 in ResizeMagickMemory () from /usr/lib/libMagickCore-7.Q16HDRI.so.10
#8  0x00007ffff7845d4c in FileToBlob () from /usr/lib/libMagickCore-7.Q16HDRI.so.10
#9  0x0000555555556fa5 in scan_image (filename=filename@entry=0x7fffffffe259 "-")
    at zbarimg/zbarimg.c:187
#10 0x0000555555556840 in main (argc=2, argv=0x7fffffffde28) at zbarimg/zbarimg.c:480

环境与困惑

使用的是ImageMagick 7.1.0-47 Q16-HDRI版本。查看在线源码时发现,源码中只调用了ResizeQuantumMemory而非ResizeMagickMemory,对此感到困惑。我推测错误出在自己的代码中(本人是C语言新手),但不确定具体问题所在。

简化后的测试代码

为了重现问题,我简化了程序,仅保留必要代码:

//gcc -I/usr/include/ImageMagick-7 -fopenmp -DMAGICKCORE_HDRI_ENABLE=1 -DMAGICKCORE_QUANTUM_DEPTH=16 -lMagickWand-7.Q16HDRI -lMagickCore-7.Q16HDRI magick.c
#include <MagickWand/MagickWand.h>

static int scan_image(const char *filename)
{
    size_t blob_length = 0;
    ExceptionInfo blob_exception;
    printf("about to read blob\n"); 
    void *blob = FileToBlob(filename, 99999999, &blob_length, &blob_exception);
    printf("read blob: %ld\n", blob_length); 
}

int main(int argc, const char *argv[])
{
    scan_image("-");
    return 0;
}

Valgrind检测输出

==947372== Memcheck, a memory error detector
==947372== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
==947372== Using Valgrind-3.19.0 and LibVEX; rerun with -h for copyright info
==947372== Command: ./a.out
==947372== 
about to read blob
==947372== Syscall param read(buf) points to unaddressable byte(s)
==947372==    at 0x4E1EDF1: read (read.c:26)
==947372==    by 0x4A17D72: UnknownInlinedFun (unistd.h:38)
==947372==    by 0x4A17D72: FileToBlob (blob.c:1473)
==947372==    by 0x1091B3: scan_image (in /home/zachary/a.out)
==947372==    by 0x109207: main (in /home/zachary/a.out)
==947372==  Address 0x7a338b1 is 0 bytes after a block of size 81,921 alloc'd
==947372==    at 0x4846CC3: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==947372==    by 0x4AE8923: ResizeMagickMemory (memory.c:1407)
==947372==    by 0x4A17D4B: FileToBlob (blob.c:1485)
==947372==    by 0x1091B3: scan_image (in /home/zachary/a.out)
==947372==    by 0x109207: main (in /home/zachary/a.out)
==947372== 
--947372-- VALGRIND INTERNAL ERROR: Valgrind received a signal 7 (SIGBUS) - exiting
--947372-- si_code=128;  Faulting address: 0x0;  sp: 0x1002ca9e40

valgrind: the 'impossible' happened:
   Killed by fatal signal

host stacktrace:
==947372==    at 0x5804D09B: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==947372==    by 0x580056B2: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==947372==    by 0x5809B33D: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==947372==    by 0x580E40C0: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)

sched status:
  running_tid=1

Thread 1: status = VgTs_Runnable (lwpid 947372)
==947372==    at 0x4846CC3: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==947372==    by 0x4AE8923: ResizeMagickMemory (memory.c:1407)
==947372==    by 0x4A17D4B: FileToBlob (blob.c:1485)
==947372==    by 0x1091B3: scan_image (in /home/zachary/a.out)
==947372==    by 0x109207: main (in /home/zachary/a.out)
client stack range: [0x1FFEFFA000 0x1FFF000FFF] client SP: 0x1FFEFFFC30
valgrind stack range: [0x1002BAA000 0x1002CA9FFF] top usage: 17872 of 1048576

内容的提问来源于stack exchange,提问作者Zachary Vance

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 06:48:25