【问题标题】:stack not 16 byte aligned error when mocking exit with mimick使用mimick模拟退出时堆栈不是16字节对齐错误
【发布时间】:2021-09-29 00:17:27
【问题描述】:

我正在使用Mimick 模拟退出函数,但我得到一个堆栈不是 16 字节对齐的错误。

这是一个简化的代码示例:

#include <stdlib.h>
#include <mimick.h>

mmk_mock_define(exit_mock, void, int);

int main(void) {
  mmk_mock("exit@self", exit_mock);

  exit(EXIT_FAILURE);

  mmk_reset(exit);
  return 0;
}

在 macOS 11 上使用以下内容编译: clang -I ./include -g -rpath ./lib/ -Wl,-segalign,1000 -L ./lib/ -l mimick -o test test.c 已经编译并安装到 ./lib./include 的位置。

运行:lldb ./test

lldb 给我:

(lldb) target create "test"
Current executable set to '/Users/camdennarzt/Developer/C/test/test' (x86_64).
(lldb) r
Process 94625 launched: '/Users/camdennarzt/Developer/C/test/test' (x86_64)
Process 94625 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
    frame #0: 0x00007fff20531c9e libdyld.dylib`stack_not_16_byte_aligned_error
libdyld.dylib`stack_not_16_byte_aligned_error:
->  0x7fff20531c9e <+0>: movdqa %xmm0, (%rsp)
    0x7fff20531ca3 <+5>: int3   
    0x7fff20531ca4 <+6>: nop    
    0x7fff20531ca5 <+7>: nop    
Target 0: (test) stopped.
(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
  * frame #0: 0x00007fff20531c9e libdyld.dylib`stack_not_16_byte_aligned_error
    frame #1: 0x00007ffeefbfefc8
    frame #2: 0x0000000100001941 test`mmk_mock_create_internal + 289
    frame #3: 0x0000000100003315 test`mmkuser_exit_mock_create(tgt="\x80&", opts=(sentinel_ = 0, noabort = 0)) at test.c:4:1
    frame #4: 0x00000001001ae010
    frame #5: 0x00007fff20532f3d libdyld.dylib`start + 1
    frame #6: 0x00007fff20532f3d libdyld.dylib`start + 1

因为我看到了this,所以我也尝试使用-fno-stack-check -mmacosx-version-min=10.14 进行编译,但没有帮助。我也尝试过安装自制的 clang,但这也无济于事。

我在这里做错了什么?或者我正在使用的库/编译器中是否存在错误?

【问题讨论】:

    标签: c macos mocking clang llvm


    【解决方案1】:

    我不知道 Criterion/Mimick,所以这可能/可能不会有所作为。

    如果params[i].argv 是模仿main()argv,那么.argv[argc] 因为NULL 缺失。

    argv[argc] 应为空指针。
    C17 规范。

    params[0].argc = 1; 
    params[0].argv = cr_malloc(sizeof(char*) * 2 /* not 1 */);
    params[0].argv[0] = cr_strdup("progname"); 
    params[0].argv[1] = NULL; /* add */
    

    同样,其他params[i]free_parse_args() 需要更新。

    【讨论】:

    • 很遗憾,这不是问题。
    猜你喜欢
    • 2017-09-07
    • 2013-03-05
    • 1970-01-01
    • 2023-03-30
    • 2019-04-10
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多