c++ - 为什么 fwrite 向我抛出访问冲突?

标签 c++ crash filesystems locking fwrite

我正在重新编译和调试 Yara,但由于某种原因,当 Yara 的 yr_rules_save 时会引发访问冲突。函数尝试执行 hdr 的 fwrite结构到文件中。

typedef struct _YR_STREAM
{
  void* user_data;

  YR_STREAM_READ_FUNC read;
  YR_STREAM_WRITE_FUNC write;

} YR_STREAM;

typedef size_t (*YR_STREAM_WRITE_FUNC)(
    const void* ptr,
    size_t size,
    size_t count,
    void* user_data);

YR_API int yr_rules_save(
    YR_RULES* rules,
    const char* filename)
{
  int result;

  YR_STREAM stream;
  FILE* fh = fopen(filename, "wb");

  if (fh == NULL)
    return ERROR_COULD_NOT_OPEN_FILE;

  stream.user_data = fh;
  stream.write = (YR_STREAM_WRITE_FUNC) fwrite; // As write method, uses fwrite

  result = yr_rules_save_stream(rules, &stream); // Here the error

  fclose(fh);
  return result;
}
事实上,如果我们进入 yr_rules_save_stream在显示的函数中,是抛出异常的行:
  [...]
  if (yr_stream_write(&hdr, sizeof(hdr), 1, stream) != 1)
    return ERROR_WRITING_FILE;
  [...]
有什么异常(exception):
Exception thrown at 0x00007FFED05072A6 (ntdll.dll) in ubi-yarac64.exe: 0xC0000005: Access violation writing location 0x00007FF653018A46.
有关行和调用堆栈等详细信息,请查看屏幕截图。
该文件未锁定(没有软件使用它),它不存在(即使我在 fopen 上放置了“w+b”)并且如果我手动检查 HxD,指向缓冲区的指针似乎存在。
有人知道这里发生了什么吗?
The error shown from Visual Studio

最佳答案

原因是,因为 YR_STREAM_WRITE_FUNC 包裹的 fwrite 函数接受一个指向 FILE 的指针输入,而在函数 yr_stream_write它传递一个指向 YR_STREAM 的指针结构而不是 YR_STREAM->user_data (FILE 之前由 yr_rules_save 保存的句柄)
the f. solution

关于c++ - 为什么 fwrite 向我抛出访问冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63507972/

相关文章:

c++ - 将编译器标志添加到 CMakeLists.txt

c++ - 迷宫功能在检测已删除的墙壁方面不起作用

debugging - 帮助 gdb 调试崩溃日志记录

linux - 在嵌入式 Linux 上安全写入紧凑型闪存

linux - 如何在与 unison 同步时排除 svn 元数据?

c++ - 即使未选中复选框,也可以使用 DateTimePicker 控件检索日期

c++ - 为什么要使用 "typename"关键字进行以下定义?

sql - 当我尝试执行简单查询时,Spark 3 失败

c++ - 加载带有 362 项目的解决方案后,Win XP 上的 VS2005 SP1 崩溃,没有任何错误、日志或跟踪

java - 如何检查文件是否存在?