Skip to content

Conversation

ajbt200128
Copy link
Contributor

Hey! back again with some more support. This works for me on m1 macs. got the info from here: https://github.com/llvm/llvm-project/blob/368c02e3ec44e5418626f46abebcc22a69c7f66d/libunwind/src/Registers.hpp and /Library/Developer/CommandLineTools/SDKs/MacOSX14.4.sdk/usr/include/mach/arm/_structs.h

@ajbt200128
Copy link
Contributor Author

should close #326 if I understand this issue correctly

semgrep-ci bot pushed a commit to semgrep/semgrep that referenced this pull request Aug 20, 2025
This PR adds beautiful segfaults ❤️ . Whenever we segfault in OCaml code, we should now be provided with some backtraces, including function name, file # and potentially code snippets:

<details>
<summary>Backtrace</summary>

```
          ____
        />    フ
       |  _  _ |
      /` ミ_x ノ
     /        |
    /   ヽ    ノ
   |     | | |
/ ̄      | | |
| ( ̄ヽ_ヽ)_)_)
\二つ
Segfault cat says:
process 5514 received signal:
> "Segmentation fault"
faulting address: 0x01
Stack trace (most recent call last):
#14   Object "", at 0xffffffffffffffff, in 
#13   Source "src/env/__libc_start_main.c", line 95, in libc_start_main_stage2 [0x2f61b77]
#12   Source "runtime/main.c", line 37, in main [0x41f94f]
#11 | Source "runtime/startup_nat.c", line 146, in caml_startup
    | Source "runtime/startup_nat.c", line 139, in caml_startup_exn
      Source "runtime/startup_nat.c", line 134, in caml_main [0x2f5a16f]
#10 | Source "runtime/startup_nat.c", line 86, in caml_startup_common
      Source "runtime/startup_nat.c", line 127, in caml_startup_common [0x2f5a0d7]
#9    Object "/src/semgrep-pro/_build/default/OSS/src/main/Main.exe", at 0x2f5a69f, in caml_start_program
#8    Object "/src/semgrep-pro/_build/default/OSS/src/main/Main.exe", at 0x467227, in caml_program
#7    Source "OSS/src/main/Main.ml", line 91, in camlDune__exe__Main.entry [0x4798a7]
         88:  * core' and './dune' install section. We use the argv[0] trick below to decide
         89:  * whether the user wants the semgrep-core or osemgrep behavior. *)
         90: let () =
      >  91:   Cap.main (fun (caps : Cap.all_caps) ->
         92:       let argv = CapSys.argv caps#argv in
         93:       let argv0 =
         94:         (* remove the possible ".exe" extension for Windows and ".bc" *)
#6    Source "OSS/libs/commons/UCommon.ml", line 42, in camlUCommon.exn_to_real_unixexit_351 [0x22ce38b]
         40: (* now in prelude: exception UnixExit of int *)
         41: let exn_to_real_unixexit f =
      >  42:   try f () with
         43:   (* If it is a normal exit just info log it *)
         44:   | UnixExit (0, msg) ->
         45:       (* nosemgrep: no-logs-in-library *)
#5    Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x22c28af]
         50:  *)
         51: let protect ~finally work =
         52:   (* nosemgrep: no-fun-protect *)
      >  53:   try Fun.protect ~finally work with
         54:   | Fun.Finally_raised exn1 as exn ->
         55:       (* Just re-raise whatever exception was raised during a 'finally',
         56:        * drop 'Finally_raised'.
#4    Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x271037b]
#3    Source "OSS/libs/commons/UCommon.ml", line 63, in camlUCommon.pp_do_in_zero_box_432 [0x22ce643]
         61: let pp_do_in_zero_box f =
         62:   Format.open_box 0;
      >  63:   f ();
         64:   Format.close_box ()
         65: 
         66: (* nosemgrep: no-ref-declarations-at-top-scope *)
#2    Source "OSS/libs/commons/UCommon.ml", line 124, in camlUCommon.fun_1206 [0x22ceb43]
        121:         finalize
        122:           (fun () ->
        123:             pp_do_in_zero_box (fun () ->
      > 124:                 try f () with
        125:                 (* <---- here it is *)
        126:                 | Unix.Unix_error (e, fm, argm) ->
        127:                     pr2
#1    Source "OSS/src/core_cli/Core_CLI.ml", line 663, in camlCore_CLI.decide_if_eio_6164 [0x621ae7]
        660: (*****************************************************************************)
        661: 
        662: let run caps (config : Core_scan_config.t) : unit =
      > 663:   let res = Core_scan.scan caps config in
        664:   output_core_results
        665:     (caps :> < Cap.stdout ; Cap.stderr ; Cap.exit >)
        666:     res config
#0    Source "OSS/src/core_scan/Core_scan.ml", line 1047, in camlCore_scan.scan_5956 [0x927a74]
       1044:       Common.with_time (fun () -> applicable_rules_of_config config)
       1045:     in
       1046:     let a : unit -> unit = Obj.magic 0 in
      >1047:     a ();
       1048:     let res : Core_result.t = scan_exn caps config timed_rules in
       1049:     Ok
       1050:       (res
Segmentation fault
```
</details>

We also get backtraces on these signals:
```
            SIGABRT, // Abort signal from abort(3)
            SIGBUS,  // Bus error (bad memory access)
            SIGFPE,  // Floating point exception
            SIGILL,  // Illegal Instruction
            SIGIOT,  // IOT trap. A synonym for SIGABRT
            SIGQUIT, // Quit from keyboard
            SIGSEGV, // Invalid memory reference
            SIGSYS,  // Bad argument to routine (SVr4)
            SIGTRAP, // Trace/breakpoint trap
            SIGXCPU, // CPU time limit exceeded (4.2BSD)
            SIGXFSZ, // File size limit exceeded (4.2BSD)
#if defined(BACKWARD_SYSTEM_DARWIN)
            SIGEMT, // emulation instruction executed

```
and I have taken the liberty of adding SIGUSR1 a la https://github.com/surma/stacksignal.
## How
This PR wraps https://github.com/bombela/backward-cpp with a few modifications to get things working on linux in docker on m1 macs, and m1 macs themselves:

bombela/backward-cpp#354
bombela/backward-cpp#347

This library works by walking the stack after a segfault, and then reading dwarf symbols to get the info.

Dependencies:
This PR adds a few more libraries, backward cpp (mit), and then libunwind, libdw (elfutils), and libdwarf which are all lgplv2. I tried to ensure that they will be statically linked/bundled where necessary, so we should be all good.


Test plan:

Manually introduced an ocaml segfault (see above example).
Then ran this on one occurring in pcre:
<details>
<summary>Backtrace</summary>

```
> "Segmentation fault: 11"
Stack trace (most recent call last):
#10   Object "Main.exe", at 0x103150c2b, in camlCore_scan.scan_5956 + 123
#9    Object "Main.exe", at 0x1053e6883, in caml_start_program + 131
#8    Object "Main.exe", at 0x1029a1db3, in caml_program + 56027
#7    Object "Main.exe", at 0x1029b5627, in camlDune__exe__Main.entry + 111
#6    Object "Main.exe", at 0x104bedf4b, in camlUCommon.exn_to_real_unixexit_351 + 51
#5    Object "Main.exe", at 0x104be221f, in camlCommon.protect_307 + 39
#4    Object "Main.exe", at 0x10501fddb, in camlStdlib__Fun.protect_326 + 107
#3    Object "Main.exe", at 0x104bee203, in camlUCommon.pp_do_in_zero_box_432 + 51
#2    Object "Main.exe", at 0x104bee703, in camlUCommon.fun_1206 + 51
#1    Object "Main.exe", at 0x1029eab17, in camlPro_core_CLI.run_898 + 1687
#0    Object "Main.exe", at 0x103150c3c, in camlCore_scan.scan_5956 + 140
```
</details>
and a marshalling segfault out in the wild:
<details>
<summary>Backtrace</summary>

```
Stack trace (most recent call last):
#31   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#30   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#29   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#28   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#27   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#26   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#25   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#24   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#23   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#22   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#21   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#20   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#19   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#18   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#17   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#16   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#15   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#14   Source "src/pro_scan/Pro_scan.ml", line 606, in camlPro_scan.scan_exn_4292 [0x60bdb7]
#13   Source "src/core/opentelemetry.ml", line 1312, in camlOpentelemetry.with__2580 [0x23b2f52]
#12   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#11   Source "OSS/src/core_scan/Core_scan.ml", line 738, in camlCore_scan.fun_7477 [0xbe214b]
#10   Source "OSS/src/core_scan/Core_scan.ml", line 628, in camlCore_scan.parmap_map_5319 [0xbe4c67]
#9    Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#8    Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#7    Source "OSS/libs/parallelism/Parmap_.ml", line 169, in camlParmap_.parmap_479 [0x238ccbe]
#6    Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#5    Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#4    Source "src/parmap.ml", line 401, in camlParmap.mapper_1352 [0x2390ca3]
#3    Source "src/parmap.ml", line 115, in camlParmap.unmarshal_860 [0x238f495]
#2    Object "/usr/lib/python3.12/site-packages/semgrep/bin/semgrep-core-proprietary", at 0x30a695a, in caml_c_call
#1    Source "runtime/intern.c", line 993, in caml_input_value_from_block [0x308b6fb]
#0    Source "runtime/intern.c", line 762, in caml_parse_header [0x308a109]
```
</details>

synced from Pro a5dc2cd7fd0d8736642572760d2ff6a05adbed4e
yosefAlsuhaibani pushed a commit to semgrep/semgrep that referenced this pull request Aug 20, 2025
This PR adds beautiful segfaults ❤️ . Whenever we segfault in OCaml code, we should now be provided with some backtraces, including function name, file # and potentially code snippets:

<details>
<summary>Backtrace</summary>

```
          ____
        />    フ
       |  _  _ |
      /` ミ_x ノ
     /        |
    /   ヽ    ノ
   |     | | |
/ ̄      | | |
| ( ̄ヽ_ヽ)_)_)
\二つ
Segfault cat says:
process 5514 received signal:
> "Segmentation fault"
faulting address: 0x01
Stack trace (most recent call last):
#14   Object "", at 0xffffffffffffffff, in 
#13   Source "src/env/__libc_start_main.c", line 95, in libc_start_main_stage2 [0x2f61b77]
#12   Source "runtime/main.c", line 37, in main [0x41f94f]
#11 | Source "runtime/startup_nat.c", line 146, in caml_startup
    | Source "runtime/startup_nat.c", line 139, in caml_startup_exn
      Source "runtime/startup_nat.c", line 134, in caml_main [0x2f5a16f]
#10 | Source "runtime/startup_nat.c", line 86, in caml_startup_common
      Source "runtime/startup_nat.c", line 127, in caml_startup_common [0x2f5a0d7]
#9    Object "/src/semgrep-pro/_build/default/OSS/src/main/Main.exe", at 0x2f5a69f, in caml_start_program
#8    Object "/src/semgrep-pro/_build/default/OSS/src/main/Main.exe", at 0x467227, in caml_program
#7    Source "OSS/src/main/Main.ml", line 91, in camlDune__exe__Main.entry [0x4798a7]
         88:  * core' and './dune' install section. We use the argv[0] trick below to decide
         89:  * whether the user wants the semgrep-core or osemgrep behavior. *)
         90: let () =
      >  91:   Cap.main (fun (caps : Cap.all_caps) ->
         92:       let argv = CapSys.argv caps#argv in
         93:       let argv0 =
         94:         (* remove the possible ".exe" extension for Windows and ".bc" *)
#6    Source "OSS/libs/commons/UCommon.ml", line 42, in camlUCommon.exn_to_real_unixexit_351 [0x22ce38b]
         40: (* now in prelude: exception UnixExit of int *)
         41: let exn_to_real_unixexit f =
      >  42:   try f () with
         43:   (* If it is a normal exit just info log it *)
         44:   | UnixExit (0, msg) ->
         45:       (* nosemgrep: no-logs-in-library *)
#5    Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x22c28af]
         50:  *)
         51: let protect ~finally work =
         52:   (* nosemgrep: no-fun-protect *)
      >  53:   try Fun.protect ~finally work with
         54:   | Fun.Finally_raised exn1 as exn ->
         55:       (* Just re-raise whatever exception was raised during a 'finally',
         56:        * drop 'Finally_raised'.
#4    Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x271037b]
#3    Source "OSS/libs/commons/UCommon.ml", line 63, in camlUCommon.pp_do_in_zero_box_432 [0x22ce643]
         61: let pp_do_in_zero_box f =
         62:   Format.open_box 0;
      >  63:   f ();
         64:   Format.close_box ()
         65: 
         66: (* nosemgrep: no-ref-declarations-at-top-scope *)
#2    Source "OSS/libs/commons/UCommon.ml", line 124, in camlUCommon.fun_1206 [0x22ceb43]
        121:         finalize
        122:           (fun () ->
        123:             pp_do_in_zero_box (fun () ->
      > 124:                 try f () with
        125:                 (* <---- here it is *)
        126:                 | Unix.Unix_error (e, fm, argm) ->
        127:                     pr2
#1    Source "OSS/src/core_cli/Core_CLI.ml", line 663, in camlCore_CLI.decide_if_eio_6164 [0x621ae7]
        660: (*****************************************************************************)
        661: 
        662: let run caps (config : Core_scan_config.t) : unit =
      > 663:   let res = Core_scan.scan caps config in
        664:   output_core_results
        665:     (caps :> < Cap.stdout ; Cap.stderr ; Cap.exit >)
        666:     res config
#0    Source "OSS/src/core_scan/Core_scan.ml", line 1047, in camlCore_scan.scan_5956 [0x927a74]
       1044:       Common.with_time (fun () -> applicable_rules_of_config config)
       1045:     in
       1046:     let a : unit -> unit = Obj.magic 0 in
      >1047:     a ();
       1048:     let res : Core_result.t = scan_exn caps config timed_rules in
       1049:     Ok
       1050:       (res
Segmentation fault
```
</details>

We also get backtraces on these signals:
```
            SIGABRT, // Abort signal from abort(3)
            SIGBUS,  // Bus error (bad memory access)
            SIGFPE,  // Floating point exception
            SIGILL,  // Illegal Instruction
            SIGIOT,  // IOT trap. A synonym for SIGABRT
            SIGQUIT, // Quit from keyboard
            SIGSEGV, // Invalid memory reference
            SIGSYS,  // Bad argument to routine (SVr4)
            SIGTRAP, // Trace/breakpoint trap
            SIGXCPU, // CPU time limit exceeded (4.2BSD)
            SIGXFSZ, // File size limit exceeded (4.2BSD)
#if defined(BACKWARD_SYSTEM_DARWIN)
            SIGEMT, // emulation instruction executed

```
and I have taken the liberty of adding SIGUSR1 a la https://github.com/surma/stacksignal.
## How
This PR wraps https://github.com/bombela/backward-cpp with a few modifications to get things working on linux in docker on m1 macs, and m1 macs themselves:

bombela/backward-cpp#354
bombela/backward-cpp#347

This library works by walking the stack after a segfault, and then reading dwarf symbols to get the info.

Dependencies:
This PR adds a few more libraries, backward cpp (mit), and then libunwind, libdw (elfutils), and libdwarf which are all lgplv2. I tried to ensure that they will be statically linked/bundled where necessary, so we should be all good.


Test plan:

Manually introduced an ocaml segfault (see above example).
Then ran this on one occurring in pcre:
<details>
<summary>Backtrace</summary>

```
> "Segmentation fault: 11"
Stack trace (most recent call last):
#10   Object "Main.exe", at 0x103150c2b, in camlCore_scan.scan_5956 + 123
#9    Object "Main.exe", at 0x1053e6883, in caml_start_program + 131
#8    Object "Main.exe", at 0x1029a1db3, in caml_program + 56027
#7    Object "Main.exe", at 0x1029b5627, in camlDune__exe__Main.entry + 111
#6    Object "Main.exe", at 0x104bedf4b, in camlUCommon.exn_to_real_unixexit_351 + 51
#5    Object "Main.exe", at 0x104be221f, in camlCommon.protect_307 + 39
#4    Object "Main.exe", at 0x10501fddb, in camlStdlib__Fun.protect_326 + 107
#3    Object "Main.exe", at 0x104bee203, in camlUCommon.pp_do_in_zero_box_432 + 51
#2    Object "Main.exe", at 0x104bee703, in camlUCommon.fun_1206 + 51
#1    Object "Main.exe", at 0x1029eab17, in camlPro_core_CLI.run_898 + 1687
#0    Object "Main.exe", at 0x103150c3c, in camlCore_scan.scan_5956 + 140
```
</details>
and a marshalling segfault out in the wild:
<details>
<summary>Backtrace</summary>

```
Stack trace (most recent call last):
#31   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#30   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#29   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#28   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#27   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#26   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#25   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#24   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#23   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#22   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#21   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#20   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#19   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#18   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#17   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#16   Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#15   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#14   Source "src/pro_scan/Pro_scan.ml", line 606, in camlPro_scan.scan_exn_4292 [0x60bdb7]
#13   Source "src/core/opentelemetry.ml", line 1312, in camlOpentelemetry.with__2580 [0x23b2f52]
#12   Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#11   Source "OSS/src/core_scan/Core_scan.ml", line 738, in camlCore_scan.fun_7477 [0xbe214b]
#10   Source "OSS/src/core_scan/Core_scan.ml", line 628, in camlCore_scan.parmap_map_5319 [0xbe4c67]
#9    Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#8    Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#7    Source "OSS/libs/parallelism/Parmap_.ml", line 169, in camlParmap_.parmap_479 [0x238ccbe]
#6    Source "OSS/libs/commons/Common.ml", line 53, in camlCommon.protect_307 [0x240497b]
#5    Source "/root/.opam/5.3.0/.opam-switch/build/ocaml-compiler.5.3.0/stdlib/fun.ml", line 34, in camlStdlib__Fun.protect_326 [0x27bf47a]
#4    Source "src/parmap.ml", line 401, in camlParmap.mapper_1352 [0x2390ca3]
#3    Source "src/parmap.ml", line 115, in camlParmap.unmarshal_860 [0x238f495]
#2    Object "/usr/lib/python3.12/site-packages/semgrep/bin/semgrep-core-proprietary", at 0x30a695a, in caml_c_call
#1    Source "runtime/intern.c", line 993, in caml_input_value_from_block [0x308b6fb]
#0    Source "runtime/intern.c", line 762, in caml_parse_header [0x308a109]
```
</details>

synced from Pro a5dc2cd7fd0d8736642572760d2ff6a05adbed4e
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant